From 66f67bdc1aee5f5ec29b19a584b9dac801070623 Mon Sep 17 00:00:00 2001 From: Josh Dover Date: Thu, 7 May 2020 10:10:56 -0600 Subject: [PATCH 001/102] Redirect to full path when calling navigateToApp to a legacy app (#65112) --- .../application/application_service.tsx | 9 ++- .../application_service.test.tsx | 72 ++++++++++++++++--- 2 files changed, 70 insertions(+), 11 deletions(-) diff --git a/src/core/public/application/application_service.tsx b/src/core/public/application/application_service.tsx index 8442f1ecc6411..fd496da26283c 100644 --- a/src/core/public/application/application_service.tsx +++ b/src/core/public/application/application_service.tsx @@ -114,7 +114,9 @@ export class ApplicationService { context, http: { basePath }, injectedMetadata, - redirectTo = (path: string) => (window.location.href = path), + redirectTo = (path: string) => { + window.location.assign(path); + }, history, }: SetupDeps): InternalApplicationSetup { const basename = basePath.get(); @@ -210,7 +212,10 @@ export class ApplicationService { } const appBasePath = basePath.prepend(appRoute); - const mount: LegacyAppMounter = () => redirectTo(appBasePath); + const mount: LegacyAppMounter = ({ history: appHistory }) => { + redirectTo(appHistory.createHref(appHistory.location)); + window.location.reload(); + }; const { updater$, ...appProps } = app; this.apps.set(app.id, { diff --git a/src/core/public/application/integration_tests/application_service.test.tsx b/src/core/public/application/integration_tests/application_service.test.tsx index 60c36d3e330e0..e399fbc726977 100644 --- a/src/core/public/application/integration_tests/application_service.test.tsx +++ b/src/core/public/application/integration_tests/application_service.test.tsx @@ -18,8 +18,10 @@ */ import { take } from 'rxjs/operators'; -import { createRenderer } from './utils'; +import { act } from 'react-dom/test-utils'; import { createMemoryHistory, MemoryHistory } from 'history'; + +import { createRenderer } from './utils'; import { ApplicationService } from '../application_service'; import { httpServiceMock } from '../../http/http_service.mock'; import { contextServiceMock } from '../../context/context_service.mock'; @@ -27,6 +29,9 @@ import { injectedMetadataServiceMock } from '../../injected_metadata/injected_me import { MockLifecycle } from '../test_types'; import { overlayServiceMock } from '../../overlays/overlay_service.mock'; import { AppMountParameters } from '../types'; +import { ScopedHistory } from '../scoped_history'; + +const flushPromises = () => new Promise(resolve => setImmediate(resolve)); describe('ApplicationService', () => { let setupDeps: MockLifecycle<'setup'>; @@ -83,7 +88,10 @@ describe('ApplicationService', () => { expect(await currentAppId$.pipe(take(1)).toPromise()).toEqual('app1'); - resolveMount!(); + await act(async () => { + resolveMount!(); + await flushPromises(); + }); expect(await currentAppId$.pipe(take(1)).toPromise()).toEqual('app1'); }); @@ -109,7 +117,7 @@ describe('ApplicationService', () => { const { navigateToApp, currentAppId$ } = await service.start(startDeps); - await navigateToApp('app1'); + await act(() => navigateToApp('app1')); expect(await currentAppId$.pipe(take(1)).toPromise()).toEqual('app1'); @@ -120,6 +128,46 @@ describe('ApplicationService', () => { }); }); + it('redirects to full path when navigating to legacy app', async () => { + const redirectTo = jest.fn(); + const reloadSpy = jest.spyOn(window.location, 'reload').mockImplementation(() => {}); + + // In the real application, we use a BrowserHistory instance configured with `basename`. However, in tests we must + // use MemoryHistory which does not support `basename`. In order to emulate this behavior, we will wrap this + // instance with a ScopedHistory configured with a basepath. + history.push(setupDeps.http.basePath.get()); // ScopedHistory constructor will fail if underlying history is not currently at basePath. + const { register, registerLegacyApp } = service.setup({ + ...setupDeps, + redirectTo, + history: new ScopedHistory(history, setupDeps.http.basePath.get()), + }); + + register(Symbol(), { + id: 'app1', + title: 'App1', + mount: ({ onAppLeave }: AppMountParameters) => { + onAppLeave(actions => actions.default()); + return () => undefined; + }, + }); + registerLegacyApp({ + id: 'myLegacyTestApp', + appUrl: '/app/myLegacyTestApp', + title: 'My Legacy Test App', + }); + + const { navigateToApp, getComponent } = await service.start(startDeps); + + update = createRenderer(getComponent()); + + await navigate('/test/app/app1'); + await act(() => navigateToApp('myLegacyTestApp', { path: '#/some-path' })); + + expect(redirectTo).toHaveBeenCalledWith('/test/app/myLegacyTestApp#/some-path'); + expect(reloadSpy).toHaveBeenCalled(); + reloadSpy.mockRestore(); + }); + describe('leaving an application that registered an app leave handler', () => { it('navigates to the new app if action is default', async () => { startDeps.overlays.openConfirm.mockResolvedValue(true); @@ -146,8 +194,10 @@ describe('ApplicationService', () => { update = createRenderer(getComponent()); - await navigate('/app/app1'); - await navigateToApp('app2'); + await act(async () => { + await navigate('/app/app1'); + await navigateToApp('app2'); + }); expect(startDeps.overlays.openConfirm).not.toHaveBeenCalled(); expect(history.entries.length).toEqual(3); @@ -179,8 +229,10 @@ describe('ApplicationService', () => { update = createRenderer(getComponent()); - await navigate('/app/app1'); - await navigateToApp('app2'); + await act(async () => { + await navigate('/app/app1'); + await navigateToApp('app2'); + }); expect(startDeps.overlays.openConfirm).toHaveBeenCalledTimes(1); expect(startDeps.overlays.openConfirm).toHaveBeenCalledWith( @@ -216,8 +268,10 @@ describe('ApplicationService', () => { update = createRenderer(getComponent()); - await navigate('/app/app1'); - await navigateToApp('app2'); + await act(async () => { + await navigate('/app/app1'); + await navigateToApp('app2'); + }); expect(startDeps.overlays.openConfirm).toHaveBeenCalledTimes(1); expect(startDeps.overlays.openConfirm).toHaveBeenCalledWith( From 5629dd6eded732b8c301ec7d652f38bf385f674f Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Thu, 7 May 2020 12:17:25 -0400 Subject: [PATCH 002/102] [Ingest pipelines] Component integration tests (#65316) --- .../helpers/http_requests.ts | 77 +++++++ .../client_integration/helpers/index.ts | 21 ++ .../helpers/pipeline_form.helpers.ts | 59 +++++ .../helpers/pipelines_clone.helpers.ts | 47 ++++ .../helpers/pipelines_create.helpers.ts | 34 +++ .../helpers/pipelines_edit.helpers.ts | 47 ++++ .../helpers/pipelines_list.helpers.ts | 105 +++++++++ .../helpers/setup_environment.tsx | 62 ++++++ .../ingest_pipelines_clone.test.tsx | 76 +++++++ .../ingest_pipelines_create.test.tsx | 208 ++++++++++++++++++ .../ingest_pipelines_edit.test.tsx | 89 ++++++++ .../ingest_pipelines_list.test.ts | 186 ++++++++++++++++ .../pipeline_form/pipeline_form.tsx | 1 + .../pipeline_form/pipeline_form_fields.tsx | 11 +- .../pipeline_request_flyout.tsx | 4 +- .../pipeline_test_flyout.tsx | 4 +- .../pipelines_create/pipelines_create.tsx | 5 +- .../pipelines_edit/pipelines_edit.tsx | 5 +- .../pipelines_list/details_flyout.tsx | 3 +- .../sections/pipelines_list/empty_list.tsx | 3 +- .../sections/pipelines_list/main.tsx | 10 +- .../sections/pipelines_list/table.tsx | 7 +- 22 files changed, 1047 insertions(+), 17 deletions(-) create mode 100644 x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/http_requests.ts create mode 100644 x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/index.ts create mode 100644 x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipeline_form.helpers.ts create mode 100644 x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_clone.helpers.ts create mode 100644 x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_create.helpers.ts create mode 100644 x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_edit.helpers.ts create mode 100644 x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_list.helpers.ts create mode 100644 x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/setup_environment.tsx create mode 100644 x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_clone.test.tsx create mode 100644 x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_create.test.tsx create mode 100644 x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_edit.test.tsx create mode 100644 x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_list.test.ts diff --git a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/http_requests.ts b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/http_requests.ts new file mode 100644 index 0000000000000..3a2ee7ef8b008 --- /dev/null +++ b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/http_requests.ts @@ -0,0 +1,77 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import sinon, { SinonFakeServer } from 'sinon'; + +import { API_BASE_PATH } from '../../../common/constants'; + +// Register helpers to mock HTTP Requests +const registerHttpRequestMockHelpers = (server: SinonFakeServer) => { + const setLoadPipelinesResponse = (response?: any[], error?: any) => { + const status = error ? error.status || 400 : 200; + const body = error ? error.body : response; + + server.respondWith('GET', API_BASE_PATH, [ + status, + { 'Content-Type': 'application/json' }, + JSON.stringify(body), + ]); + }; + + const setLoadPipelineResponse = (response?: {}, error?: any) => { + const status = error ? error.status || 400 : 200; + const body = error ? error.body : response; + + server.respondWith('GET', `${API_BASE_PATH}/:name`, [ + status, + { 'Content-Type': 'application/json' }, + JSON.stringify(body), + ]); + }; + + const setDeletePipelineResponse = (response?: object) => { + server.respondWith('DELETE', `${API_BASE_PATH}/:name`, [ + 200, + { 'Content-Type': 'application/json' }, + JSON.stringify(response), + ]); + }; + + const setCreatePipelineResponse = (response?: object, error?: any) => { + const status = error ? error.status || 400 : 200; + const body = error ? JSON.stringify(error.body) : JSON.stringify(response); + + server.respondWith('POST', API_BASE_PATH, [ + status, + { 'Content-Type': 'application/json' }, + body, + ]); + }; + + return { + setLoadPipelinesResponse, + setLoadPipelineResponse, + setDeletePipelineResponse, + setCreatePipelineResponse, + }; +}; + +export const init = () => { + const server = sinon.fakeServer.create(); + server.respondImmediately = true; + + // Define default response for unhandled requests. + // We make requests to APIs which don't impact the component under test, e.g. UI metric telemetry, + // and we can mock them all with a 200 instead of mocking each one individually. + server.respondWith([200, {}, 'DefaultMockedResponse']); + + const httpRequestsMockHelpers = registerHttpRequestMockHelpers(server); + + return { + server, + httpRequestsMockHelpers, + }; +}; diff --git a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/index.ts b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/index.ts new file mode 100644 index 0000000000000..6216119c5d1d1 --- /dev/null +++ b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/index.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { setup as pipelinesListSetup } from './pipelines_list.helpers'; +import { setup as pipelinesCreateSetup } from './pipelines_create.helpers'; +import { setup as pipelinesCloneSetup } from './pipelines_clone.helpers'; +import { setup as pipelinesEditSetup } from './pipelines_edit.helpers'; + +export { nextTick, getRandomString, findTestSubject } from '../../../../../test_utils'; + +export { setupEnvironment } from './setup_environment'; + +export const pageHelpers = { + pipelinesList: { setup: pipelinesListSetup }, + pipelinesCreate: { setup: pipelinesCreateSetup }, + pipelinesClone: { setup: pipelinesCloneSetup }, + pipelinesEdit: { setup: pipelinesEditSetup }, +}; diff --git a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipeline_form.helpers.ts b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipeline_form.helpers.ts new file mode 100644 index 0000000000000..d56e92a2419c4 --- /dev/null +++ b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipeline_form.helpers.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; + * you may not use this file except in compliance with the Elastic License. + */ +import { TestBed } from '../../../../../test_utils'; + +export const getFormActions = (testBed: TestBed) => { + const { find, form } = testBed; + + // User actions + const clickSubmitButton = () => { + find('submitButton').simulate('click'); + }; + + const clickTestPipelineButton = () => { + find('testPipelineButton').simulate('click'); + }; + + const clickShowRequestLink = () => { + find('showRequestLink').simulate('click'); + }; + + const toggleVersionSwitch = () => { + form.toggleEuiSwitch('versionToggle'); + }; + + const toggleOnFailureSwitch = () => { + form.toggleEuiSwitch('onFailureToggle'); + }; + + return { + clickSubmitButton, + clickShowRequestLink, + toggleVersionSwitch, + toggleOnFailureSwitch, + clickTestPipelineButton, + }; +}; + +export type PipelineFormTestSubjects = + | 'submitButton' + | 'pageTitle' + | 'savePipelineError' + | 'pipelineForm' + | 'versionToggle' + | 'versionField' + | 'nameField.input' + | 'descriptionField.input' + | 'processorsField' + | 'onFailureToggle' + | 'onFailureEditor' + | 'testPipelineButton' + | 'showRequestLink' + | 'requestFlyout' + | 'requestFlyout.title' + | 'testPipelineFlyout' + | 'testPipelineFlyout.title' + | 'documentationLink'; diff --git a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_clone.helpers.ts b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_clone.helpers.ts new file mode 100644 index 0000000000000..2791ffc32c858 --- /dev/null +++ b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_clone.helpers.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { registerTestBed, TestBedConfig, TestBed } from '../../../../../test_utils'; +import { BASE_PATH } from '../../../common/constants'; +import { PipelinesClone } from '../../../public/application/sections/pipelines_clone'; // eslint-disable-line @kbn/eslint/no-restricted-paths +import { getFormActions, PipelineFormTestSubjects } from './pipeline_form.helpers'; +import { WithAppDependencies } from './setup_environment'; + +export type PipelinesCloneTestBed = TestBed & { + actions: ReturnType; +}; + +export const PIPELINE_TO_CLONE = { + name: 'my_pipeline', + description: 'pipeline description', + processors: [ + { + set: { + field: 'foo', + value: 'new', + }, + }, + ], +}; + +const testBedConfig: TestBedConfig = { + memoryRouter: { + initialEntries: [`${BASE_PATH}create/${PIPELINE_TO_CLONE.name}`], + componentRoutePath: `${BASE_PATH}create/:name`, + }, + doMountAsync: true, +}; + +const initTestBed = registerTestBed(WithAppDependencies(PipelinesClone), testBedConfig); + +export const setup = async (): Promise => { + const testBed = await initTestBed(); + + return { + ...testBed, + actions: getFormActions(testBed), + }; +}; diff --git a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_create.helpers.ts b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_create.helpers.ts new file mode 100644 index 0000000000000..54a62a8357e52 --- /dev/null +++ b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_create.helpers.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { registerTestBed, TestBedConfig, TestBed } from '../../../../../test_utils'; +import { BASE_PATH } from '../../../common/constants'; +import { PipelinesCreate } from '../../../public/application/sections/pipelines_create'; // eslint-disable-line @kbn/eslint/no-restricted-paths +import { getFormActions, PipelineFormTestSubjects } from './pipeline_form.helpers'; +import { WithAppDependencies } from './setup_environment'; + +export type PipelinesCreateTestBed = TestBed & { + actions: ReturnType; +}; + +const testBedConfig: TestBedConfig = { + memoryRouter: { + initialEntries: [`${BASE_PATH}/create`], + componentRoutePath: `${BASE_PATH}/create`, + }, + doMountAsync: true, +}; + +const initTestBed = registerTestBed(WithAppDependencies(PipelinesCreate), testBedConfig); + +export const setup = async (): Promise => { + const testBed = await initTestBed(); + + return { + ...testBed, + actions: getFormActions(testBed), + }; +}; diff --git a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_edit.helpers.ts b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_edit.helpers.ts new file mode 100644 index 0000000000000..12320f034a819 --- /dev/null +++ b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_edit.helpers.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { registerTestBed, TestBedConfig, TestBed } from '../../../../../test_utils'; +import { BASE_PATH } from '../../../common/constants'; +import { PipelinesEdit } from '../../../public/application/sections/pipelines_edit'; // eslint-disable-line @kbn/eslint/no-restricted-paths +import { getFormActions, PipelineFormTestSubjects } from './pipeline_form.helpers'; +import { WithAppDependencies } from './setup_environment'; + +export type PipelinesEditTestBed = TestBed & { + actions: ReturnType; +}; + +export const PIPELINE_TO_EDIT = { + name: 'my_pipeline', + description: 'pipeline description', + processors: [ + { + set: { + field: 'foo', + value: 'new', + }, + }, + ], +}; + +const testBedConfig: TestBedConfig = { + memoryRouter: { + initialEntries: [`${BASE_PATH}edit/${PIPELINE_TO_EDIT.name}`], + componentRoutePath: `${BASE_PATH}edit/:name`, + }, + doMountAsync: true, +}; + +const initTestBed = registerTestBed(WithAppDependencies(PipelinesEdit), testBedConfig); + +export const setup = async (): Promise => { + const testBed = await initTestBed(); + + return { + ...testBed, + actions: getFormActions(testBed), + }; +}; diff --git a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_list.helpers.ts b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_list.helpers.ts new file mode 100644 index 0000000000000..0f9745981c18b --- /dev/null +++ b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/pipelines_list.helpers.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { act } from 'react-dom/test-utils'; + +import { BASE_PATH } from '../../../common/constants'; +import { + registerTestBed, + TestBed, + TestBedConfig, + findTestSubject, + nextTick, +} from '../../../../../test_utils'; +import { PipelinesList } from '../../../public/application/sections/pipelines_list'; +import { WithAppDependencies } from './setup_environment'; + +const testBedConfig: TestBedConfig = { + memoryRouter: { + initialEntries: [BASE_PATH], + componentRoutePath: BASE_PATH, + }, + doMountAsync: true, +}; + +const initTestBed = registerTestBed(WithAppDependencies(PipelinesList), testBedConfig); + +export type PipelineListTestBed = TestBed & { + actions: ReturnType; +}; + +const createActions = (testBed: TestBed) => { + const { find } = testBed; + + /** + * User Actions + */ + const clickReloadButton = () => { + find('reloadButton').simulate('click'); + }; + + const clickPipelineAt = async (index: number) => { + const { component, table, router } = testBed; + const { rows } = table.getMetaData('pipelinesTable'); + const pipelineLink = findTestSubject(rows[index].reactWrapper, 'pipelineDetailsLink'); + + await act(async () => { + const { href } = pipelineLink.props(); + router.navigateTo(href!); + await nextTick(); + component.update(); + }); + }; + + const clickActionMenu = (pipelineName: string) => { + const { component } = testBed; + + // When a table has > 2 actions, EUI displays an overflow menu with an id "-actions" + component.find(`div[id="${pipelineName}-actions"] button`).simulate('click'); + }; + + const clickPipelineAction = (pipelineName: string, action: 'edit' | 'clone' | 'delete') => { + const actions = ['edit', 'clone', 'delete']; + const { component } = testBed; + + clickActionMenu(pipelineName); + + component + .find('.euiContextMenuItem') + .at(actions.indexOf(action)) + .simulate('click'); + }; + + return { + clickReloadButton, + clickPipelineAt, + clickPipelineAction, + clickActionMenu, + }; +}; + +export const setup = async (): Promise => { + const testBed = await initTestBed(); + + return { + ...testBed, + actions: createActions(testBed), + }; +}; + +export type PipelineListTestSubjects = + | 'appTitle' + | 'documentationLink' + | 'createPipelineButton' + | 'pipelinesTable' + | 'pipelineDetails' + | 'pipelineDetails.title' + | 'deletePipelinesConfirmation' + | 'emptyList' + | 'emptyList.title' + | 'sectionLoading' + | 'pipelineLoadError' + | 'reloadButton'; diff --git a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/setup_environment.tsx b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/setup_environment.tsx new file mode 100644 index 0000000000000..3243d665832f2 --- /dev/null +++ b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/helpers/setup_environment.tsx @@ -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; + * you may not use this file except in compliance with the Elastic License. + */ +/* eslint-disable @kbn/eslint/no-restricted-paths */ +import React from 'react'; + +import { KibanaContextProvider } from '../../../../../../src/plugins/kibana_react/public'; +import { + notificationServiceMock, + fatalErrorsServiceMock, + docLinksServiceMock, + injectedMetadataServiceMock, +} from '../../../../../../src/core/public/mocks'; + +import { usageCollectionPluginMock } from '../../../../../../src/plugins/usage_collection/public/mocks'; + +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { HttpService } from '../../../../../../src/core/public/http'; + +import { + breadcrumbService, + documentationService, + uiMetricService, + apiService, +} from '../../../public/application/services'; + +import { init as initHttpRequests } from './http_requests'; + +const httpServiceSetupMock = new HttpService().setup({ + injectedMetadata: injectedMetadataServiceMock.createSetupContract(), + fatalErrors: fatalErrorsServiceMock.createSetupContract(), +}); + +const appServices = { + breadcrumbs: breadcrumbService, + metric: uiMetricService, + documentation: documentationService, + api: apiService, + notifications: notificationServiceMock.createSetupContract(), +}; + +export const setupEnvironment = () => { + uiMetricService.setup(usageCollectionPluginMock.createSetupContract()); + apiService.setup(httpServiceSetupMock, uiMetricService); + documentationService.setup(docLinksServiceMock.createStartContract()); + breadcrumbService.setup(() => {}); + + const { server, httpRequestsMockHelpers } = initHttpRequests(); + + return { + server, + httpRequestsMockHelpers, + }; +}; + +export const WithAppDependencies = (Comp: any) => (props: any) => ( + + + +); diff --git a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_clone.test.tsx b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_clone.test.tsx new file mode 100644 index 0000000000000..2901367892213 --- /dev/null +++ b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_clone.test.tsx @@ -0,0 +1,76 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React from 'react'; +import { act } from 'react-dom/test-utils'; + +import { setupEnvironment, pageHelpers } from './helpers'; +import { PIPELINE_TO_CLONE, PipelinesCloneTestBed } from './helpers/pipelines_clone.helpers'; + +const { setup } = pageHelpers.pipelinesClone; + +jest.mock('@elastic/eui', () => ({ + ...jest.requireActual('@elastic/eui'), + // Mocking EuiCodeEditor, which uses React Ace under the hood + EuiCodeEditor: (props: any) => ( + { + props.onChange(syntheticEvent.jsonString); + }} + /> + ), +})); + +describe('', () => { + let testBed: PipelinesCloneTestBed; + + const { server, httpRequestsMockHelpers } = setupEnvironment(); + + afterAll(() => { + server.restore(); + }); + + beforeEach(async () => { + httpRequestsMockHelpers.setLoadPipelineResponse(PIPELINE_TO_CLONE); + + await act(async () => { + testBed = await setup(); + await testBed.waitFor('pipelineForm'); + }); + }); + + test('should render the correct page header', () => { + const { exists, find } = testBed; + + // Verify page title + expect(exists('pageTitle')).toBe(true); + expect(find('pageTitle').text()).toEqual('Create pipeline'); + + // Verify documentation link + expect(exists('documentationLink')).toBe(true); + expect(find('documentationLink').text()).toBe('Create pipeline docs'); + }); + + describe('form submission', () => { + it('should send the correct payload', async () => { + const { actions, waitFor } = testBed; + + await act(async () => { + actions.clickSubmitButton(); + await waitFor('pipelineForm', 0); + }); + + const latestRequest = server.requests[server.requests.length - 1]; + + const expected = { + ...PIPELINE_TO_CLONE, + name: `${PIPELINE_TO_CLONE.name}-copy`, + }; + + expect(JSON.parse(latestRequest.requestBody)).toEqual(expected); + }); + }); +}); diff --git a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_create.test.tsx b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_create.test.tsx new file mode 100644 index 0000000000000..e0be8d2937729 --- /dev/null +++ b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_create.test.tsx @@ -0,0 +1,208 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React from 'react'; +import { act } from 'react-dom/test-utils'; + +import { setupEnvironment, pageHelpers, nextTick } from './helpers'; +import { PipelinesCreateTestBed } from './helpers/pipelines_create.helpers'; + +const { setup } = pageHelpers.pipelinesCreate; + +jest.mock('@elastic/eui', () => ({ + ...jest.requireActual('@elastic/eui'), + // Mocking EuiCodeEditor, which uses React Ace under the hood + EuiCodeEditor: (props: any) => ( + { + props.onChange(syntheticEvent.jsonString); + }} + /> + ), +})); + +describe('', () => { + let testBed: PipelinesCreateTestBed; + + const { server, httpRequestsMockHelpers } = setupEnvironment(); + + afterAll(() => { + server.restore(); + }); + + describe('on component mount', () => { + beforeEach(async () => { + await act(async () => { + testBed = await setup(); + await testBed.waitFor('pipelineForm'); + }); + }); + + test('should render the correct page header', () => { + const { exists, find } = testBed; + + // Verify page title + expect(exists('pageTitle')).toBe(true); + expect(find('pageTitle').text()).toEqual('Create pipeline'); + + // Verify documentation link + expect(exists('documentationLink')).toBe(true); + expect(find('documentationLink').text()).toBe('Create pipeline docs'); + }); + + test('should toggle the version field', async () => { + const { actions, component, exists } = testBed; + + // Version field should be hidden by default + expect(exists('versionField')).toBe(false); + + await act(async () => { + actions.toggleVersionSwitch(); + await nextTick(); + component.update(); + }); + + expect(exists('versionField')).toBe(true); + }); + + test('should toggle the on-failure processors editor', async () => { + const { actions, component, exists } = testBed; + + // On-failure editor should be hidden by default + expect(exists('onFailureEditor')).toBe(false); + + await act(async () => { + actions.toggleOnFailureSwitch(); + await nextTick(); + component.update(); + }); + + expect(exists('onFailureEditor')).toBe(true); + }); + + test('should show the request flyout', async () => { + const { actions, component, find, exists } = testBed; + + await act(async () => { + actions.clickShowRequestLink(); + await nextTick(); + component.update(); + }); + + // Verify request flyout opens + expect(exists('requestFlyout')).toBe(true); + expect(find('requestFlyout.title').text()).toBe('Request'); + }); + + describe('form validation', () => { + test('should prevent form submission if required fields are missing', async () => { + const { form, actions, component, find } = testBed; + + await act(async () => { + actions.clickSubmitButton(); + await nextTick(); + component.update(); + }); + + expect(form.getErrorsMessages()).toEqual([ + 'Name is required.', + 'A description is required.', + ]); + expect(find('submitButton').props().disabled).toEqual(true); + + // Add required fields and verify button is enabled again + form.setInputValue('nameField.input', 'my_pipeline'); + form.setInputValue('descriptionField.input', 'pipeline description'); + + await act(async () => { + await nextTick(); + component.update(); + }); + + expect(find('submitButton').props().disabled).toEqual(false); + }); + }); + + describe('form submission', () => { + beforeEach(async () => { + await act(async () => { + testBed = await setup(); + + const { waitFor, form } = testBed; + + await waitFor('pipelineForm'); + + form.setInputValue('nameField.input', 'my_pipeline'); + form.setInputValue('descriptionField.input', 'pipeline description'); + }); + }); + + test('should send the correct payload', async () => { + const { actions, waitFor } = testBed; + + await act(async () => { + actions.clickSubmitButton(); + await waitFor('pipelineForm', 0); + }); + + const latestRequest = server.requests[server.requests.length - 1]; + + const expected = { + name: 'my_pipeline', + description: 'pipeline description', + processors: [], + }; + + expect(JSON.parse(latestRequest.requestBody)).toEqual(expected); + }); + + test('should surface API errors from the request', async () => { + const { actions, find, exists, waitFor } = testBed; + + const error = { + status: 409, + error: 'Conflict', + message: `There is already a pipeline with name 'my_pipeline'.`, + }; + + httpRequestsMockHelpers.setCreatePipelineResponse(undefined, { body: error }); + + await act(async () => { + actions.clickSubmitButton(); + await waitFor('savePipelineError'); + }); + + expect(exists('savePipelineError')).toBe(true); + expect(find('savePipelineError').text()).toContain(error.message); + }); + }); + + describe('test pipeline', () => { + beforeEach(async () => { + await act(async () => { + testBed = await setup(); + + const { waitFor } = testBed; + + await waitFor('pipelineForm'); + }); + }); + + test('should open the test pipeline flyout', async () => { + const { actions, exists, find, waitFor } = testBed; + + await act(async () => { + actions.clickTestPipelineButton(); + await waitFor('testPipelineFlyout'); + }); + + // Verify test pipeline flyout opens + expect(exists('testPipelineFlyout')).toBe(true); + expect(find('testPipelineFlyout.title').text()).toBe('Test pipeline'); + }); + }); + }); +}); diff --git a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_edit.test.tsx b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_edit.test.tsx new file mode 100644 index 0000000000000..477eec83f876d --- /dev/null +++ b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_edit.test.tsx @@ -0,0 +1,89 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React from 'react'; +import { act } from 'react-dom/test-utils'; + +import { setupEnvironment, pageHelpers } from './helpers'; +import { PIPELINE_TO_EDIT, PipelinesEditTestBed } from './helpers/pipelines_edit.helpers'; + +const { setup } = pageHelpers.pipelinesEdit; + +jest.mock('@elastic/eui', () => ({ + ...jest.requireActual('@elastic/eui'), + // Mocking EuiCodeEditor, which uses React Ace under the hood + EuiCodeEditor: (props: any) => ( + { + props.onChange(syntheticEvent.jsonString); + }} + /> + ), +})); + +describe('', () => { + let testBed: PipelinesEditTestBed; + + const { server, httpRequestsMockHelpers } = setupEnvironment(); + + afterAll(() => { + server.restore(); + }); + + beforeEach(async () => { + httpRequestsMockHelpers.setLoadPipelineResponse(PIPELINE_TO_EDIT); + + await act(async () => { + testBed = await setup(); + await testBed.waitFor('pipelineForm'); + }); + }); + + test('should render the correct page header', () => { + const { exists, find } = testBed; + + // Verify page title + expect(exists('pageTitle')).toBe(true); + expect(find('pageTitle').text()).toEqual(`Edit pipeline '${PIPELINE_TO_EDIT.name}'`); + + // Verify documentation link + expect(exists('documentationLink')).toBe(true); + expect(find('documentationLink').text()).toBe('Edit pipeline docs'); + }); + + it('should disable the name field', () => { + const { find } = testBed; + + const nameInput = find('nameField.input'); + expect(nameInput.props().disabled).toEqual(true); + }); + + describe('form submission', () => { + it('should send the correct payload with changed values', async () => { + const UPDATED_DESCRIPTION = 'updated pipeline description'; + const { actions, form, waitFor } = testBed; + + // Make change to description field + form.setInputValue('descriptionField.input', UPDATED_DESCRIPTION); + + await act(async () => { + actions.clickSubmitButton(); + await waitFor('pipelineForm', 0); + }); + + const latestRequest = server.requests[server.requests.length - 1]; + + const { name, ...pipelineDefinition } = PIPELINE_TO_EDIT; + + const expected = { + ...pipelineDefinition, + description: UPDATED_DESCRIPTION, + }; + + expect(JSON.parse(latestRequest.requestBody)).toEqual(expected); + }); + }); +}); diff --git a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_list.test.ts b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_list.test.ts new file mode 100644 index 0000000000000..3e0b78d4f2e9d --- /dev/null +++ b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_list.test.ts @@ -0,0 +1,186 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { act } from 'react-dom/test-utils'; + +import { API_BASE_PATH } from '../../common/constants'; + +import { setupEnvironment, pageHelpers, nextTick } from './helpers'; +import { PipelineListTestBed } from './helpers/pipelines_list.helpers'; + +const { setup } = pageHelpers.pipelinesList; + +jest.mock('ui/i18n', () => { + const I18nContext = ({ children }: any) => children; + return { I18nContext }; +}); + +describe('', () => { + const { server, httpRequestsMockHelpers } = setupEnvironment(); + let testBed: PipelineListTestBed; + + afterAll(() => { + server.restore(); + }); + + describe('With pipelines', () => { + const pipeline1 = { + name: 'test_pipeline1', + description: 'test_pipeline1 description', + processors: [], + }; + + const pipeline2 = { + name: 'test_pipeline2', + description: 'test_pipeline2 description', + processors: [], + }; + + const pipelines = [pipeline1, pipeline2]; + + httpRequestsMockHelpers.setLoadPipelinesResponse(pipelines); + + beforeEach(async () => { + testBed = await setup(); + + await act(async () => { + const { waitFor } = testBed; + + await waitFor('pipelinesTable'); + }); + }); + + test('should render the list view', async () => { + const { exists, find, table } = testBed; + + // Verify app title + expect(exists('appTitle')).toBe(true); + expect(find('appTitle').text()).toEqual('Ingest Node Pipelines'); + + // Verify documentation link + expect(exists('documentationLink')).toBe(true); + expect(find('documentationLink').text()).toBe('Ingest Node Pipelines docs'); + + // Verify create button exists + expect(exists('createPipelineButton')).toBe(true); + + // Verify table content + const { tableCellsValues } = table.getMetaData('pipelinesTable'); + tableCellsValues.forEach((row, i) => { + const pipeline = pipelines[i]; + + expect(row).toEqual(['', pipeline.name, '']); + }); + }); + + test('should reload the pipeline data', async () => { + const { component, actions } = testBed; + const totalRequests = server.requests.length; + + await act(async () => { + actions.clickReloadButton(); + await nextTick(100); + component.update(); + }); + + expect(server.requests.length).toBe(totalRequests + 1); + expect(server.requests[server.requests.length - 1].url).toBe(API_BASE_PATH); + }); + + test('should show the details of a pipeline', async () => { + const { find, exists, actions } = testBed; + + await actions.clickPipelineAt(0); + + expect(exists('pipelinesTable')).toBe(true); + expect(exists('pipelineDetails')).toBe(true); + expect(find('pipelineDetails.title').text()).toBe(pipeline1.name); + }); + + test('should delete a pipeline', async () => { + const { actions, component } = testBed; + const { name: pipelineName } = pipeline1; + + httpRequestsMockHelpers.setDeletePipelineResponse({ + itemsDeleted: [pipelineName], + errors: [], + }); + + actions.clickPipelineAction(pipelineName, 'delete'); + + // We need to read the document "body" as the modal is added there and not inside + // the component DOM tree. + const modal = document.body.querySelector('[data-test-subj="deletePipelinesConfirmation"]'); + const confirmButton: HTMLButtonElement | null = modal!.querySelector( + '[data-test-subj="confirmModalConfirmButton"]' + ); + + expect(modal).not.toBe(null); + expect(modal!.textContent).toContain('Delete pipeline'); + + await act(async () => { + confirmButton!.click(); + await nextTick(); + component.update(); + }); + + const latestRequest = server.requests[server.requests.length - 1]; + + expect(latestRequest.method).toBe('DELETE'); + expect(latestRequest.url).toBe(`${API_BASE_PATH}/${pipelineName}`); + expect(latestRequest.status).toEqual(200); + }); + }); + + describe('No pipelines', () => { + beforeEach(async () => { + httpRequestsMockHelpers.setLoadPipelinesResponse([]); + + testBed = await setup(); + + await act(async () => { + const { waitFor } = testBed; + + await waitFor('emptyList'); + }); + }); + + test('should display an empty prompt', async () => { + const { exists, find } = testBed; + + expect(exists('sectionLoading')).toBe(false); + expect(exists('emptyList')).toBe(true); + expect(find('emptyList.title').text()).toEqual('Start by creating a pipeline'); + }); + }); + + describe('Error handling', () => { + beforeEach(async () => { + const error = { + status: 500, + error: 'Internal server error', + message: 'Internal server error', + }; + + httpRequestsMockHelpers.setLoadPipelinesResponse(undefined, { body: error }); + + testBed = await setup(); + + await act(async () => { + const { waitFor } = testBed; + + await waitFor('pipelineLoadError'); + }); + }); + + test('should render an error message if error fetching pipelines', async () => { + const { exists, find } = testBed; + + expect(exists('pipelineLoadError')).toBe(true); + expect(find('pipelineLoadError').text()).toContain('Unable to load pipelines.'); + }); + }); +}); diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_form.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_form.tsx index 9082196a48b39..55523bfa7d116 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_form.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_form.tsx @@ -126,6 +126,7 @@ export const PipelineForm: React.FunctionComponent = ({ setIsRequestVisible(prevIsRequestVisible => !prevIsRequestVisible)} > {isRequestVisible ? ( diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_form_fields.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_form_fields.tsx index b90683426887f..8144228b1e9d5 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_form_fields.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_form_fields.tsx @@ -140,7 +140,12 @@ export const PipelineFormFields: React.FunctionComponent = ({ - + = ({ path="processors" component={JsonEditorField} componentProps={{ - ['data-test-subj']: 'processorsField', euiCodeEditorProps: { + ['data-test-subj']: 'processorsField', height: '300px', 'aria-label': i18n.translate('xpack.ingestPipelines.form.processorsFieldAriaLabel', { defaultMessage: 'Processors JSON editor', @@ -211,8 +216,8 @@ export const PipelineFormFields: React.FunctionComponent = ({ path="on_failure" component={JsonEditorField} componentProps={{ - ['data-test-subj']: 'onFailureEditor', euiCodeEditorProps: { + ['data-test-subj']: 'onFailureEditor', height: '300px', 'aria-label': i18n.translate('xpack.ingestPipelines.form.onFailureFieldAriaLabel', { defaultMessage: 'Failure processors JSON editor', diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_request_flyout/pipeline_request_flyout.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_request_flyout/pipeline_request_flyout.tsx index 7cfe887d68d52..2ab7e84b3bb2b 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_request_flyout/pipeline_request_flyout.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/pipeline_request_flyout/pipeline_request_flyout.tsx @@ -40,10 +40,10 @@ export const PipelineRequestFlyout: React.FunctionComponent = ({ uuid.current++; return ( - + -

+

{name ? ( + -

+

{pipeline.name ? ( - -

+ +

- -

+ +

= ({ - +

{pipeline.name}

diff --git a/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_list/empty_list.tsx b/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_list/empty_list.tsx index 318a9219b2010..f6fe2f0cf65fa 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_list/empty_list.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_list/empty_list.tsx @@ -18,8 +18,9 @@ export const EmptyList: FunctionComponent = () => { +

{i18n.translate('xpack.ingestPipelines.list.table.emptyPromptTitle', { defaultMessage: 'Start by creating a pipeline', })} diff --git a/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_list/main.tsx b/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_list/main.tsx index 23d105c807c8b..948290b169134 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_list/main.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_list/main.tsx @@ -80,11 +80,15 @@ export const PipelinesList: React.FunctionComponent = ({ history.push(BASE_PATH); }; + if (data && data.length === 0) { + return ; + } + let content: React.ReactNode; if (isLoading) { content = ( - + = ({ pipelines={data} /> ); - } else { - return ; } const renderFlyout = (): React.ReactNode => { @@ -148,6 +150,7 @@ export const PipelinesList: React.FunctionComponent = ({ href={services.documentation.getIngestNodeUrl()} target="_blank" iconType="help" + data-test-subj="documentationLink" > = ({ = ({ const tableProps: EuiInMemoryTableProps = { itemId: 'name', isSelectable: true, + 'data-test-subj': 'pipelinesTable', sorting: { sort: { field: 'name', direction: 'asc' } }, selection: { onSelectionChange: setSelection, @@ -91,7 +92,11 @@ export const PipelineTable: FunctionComponent = ({ defaultMessage: 'Name', }), sortable: true, - render: (name: string) => {name}, + render: (name: string) => ( + + {name} + + ), }, { name: ( From a79ab6db3569096d5eb1b53fd85d497c1ad73e53 Mon Sep 17 00:00:00 2001 From: Gidi Meir Morris Date: Thu, 7 May 2020 17:44:45 +0100 Subject: [PATCH 003/102] [Alerting] adds lazy loading of alerting UI components (#65060) This PR adds code splitting into the Alerting Trigger UI by lazy loading the React Components needed for this plugin. This include two key changes: 1. The plugin lazy loads its routes so that they don't get loaded at setup time. 2. This changes the way in which plugins can register their ActionType Components so they have to specify a lazy loaded component rather than a regular React component - this allows us to avoid loading all these components at setup time and defer this to when the Flyout/Triggers UI is loaded. --- .../public/lib/connectors/jira/flyout.tsx | 3 + .../siem/public/lib/connectors/jira/index.tsx | 4 +- .../lib/connectors/servicenow/flyout.tsx | 3 + .../lib/connectors/servicenow/index.tsx | 5 +- .../siem/public/lib/connectors/types.ts | 3 +- .../siem/public/lib/connectors/utils.ts | 12 +- x-pack/plugins/triggers_actions_ui/README.md | 14 +- .../public/application/app.tsx | 39 +- .../components/builtin_action_types/email.tsx | 609 ------------------ .../{ => email}/email.test.tsx | 87 +-- .../builtin_action_types/email/email.tsx | 150 +++++ .../email/email_connector.test.tsx | 47 ++ .../email/email_connector.tsx | 209 ++++++ .../email/email_params.test.tsx | 37 ++ .../email/email_params.tsx | 267 ++++++++ .../builtin_action_types/email/index.ts | 7 + .../builtin_action_types/es_index.test.tsx | 240 ------- .../es_index/es_index.test.tsx | 88 +++ .../es_index/es_index.tsx | 51 ++ .../es_index/es_index_connector.test.tsx | 126 ++++ .../es_index_connector.tsx} | 129 +--- .../es_index/es_index_params.test.tsx | 33 + .../es_index/es_index_params.tsx | 81 +++ .../builtin_action_types/es_index/index.ts | 7 + .../components/builtin_action_types/index.ts | 12 +- .../builtin_action_types/pagerduty.test.tsx | 200 ------ .../builtin_action_types/pagerduty/index.ts | 7 + .../{ => pagerduty}/pagerduty.svg | 0 .../pagerduty/pagerduty.test.tsx | 99 +++ .../pagerduty/pagerduty.tsx | 96 +++ .../pagerduty/pagerduty_connectors.test.tsx | 54 ++ .../pagerduty/pagerduty_connectors.tsx | 89 +++ .../pagerduty/pagerduty_params.test.tsx | 48 ++ .../pagerduty_params.tsx} | 184 +----- .../builtin_action_types/server_log.test.tsx | 134 ---- .../builtin_action_types/server_log/index.ts | 7 + .../server_log/server_log.test.tsx | 68 ++ .../server_log/server_log.tsx | 51 ++ .../server_log/server_log_params.test.tsx | 58 ++ .../server_log_params.tsx} | 51 +- .../builtin_action_types/slack.test.tsx | 166 ----- .../components/builtin_action_types/slack.tsx | 188 ------ .../builtin_action_types/slack/index.ts | 7 + .../builtin_action_types/slack/slack.test.tsx | 88 +++ .../builtin_action_types/slack/slack.tsx | 66 ++ .../slack/slack_connectors.test.tsx | 49 ++ .../slack/slack_connectors.tsx | 65 ++ .../slack/slack_params.test.tsx | 31 + .../slack/slack_params.tsx | 77 +++ .../builtin_action_types/webhook.test.tsx | 179 ----- .../builtin_action_types/webhook/index.ts | 7 + .../webhook/webhook.test.tsx | 104 +++ .../builtin_action_types/webhook/webhook.tsx | 99 +++ .../webhook/webhook_connectors.test.tsx | 48 ++ .../webhook_connectors.tsx} | 156 +---- .../webhook/webhook_params.test.tsx | 32 + .../webhook/webhook_params.tsx | 68 ++ .../public/application/home.tsx | 3 + .../action_connector_form.tsx | 31 +- .../action_connector_form/action_form.tsx | 29 +- .../components/alert_details_route.tsx | 6 +- .../public/application/type_registry.test.ts | 6 +- .../triggers_actions_ui/public/types.ts | 19 +- 63 files changed, 2577 insertions(+), 2356 deletions(-) delete mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email.tsx rename x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/{ => email}/email.test.tsx (62%) create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email/email.tsx create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email/email_connector.test.tsx create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email/email_connector.tsx create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email/email_params.test.tsx create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email/email_params.tsx create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email/index.ts delete mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index.test.tsx create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index/es_index.test.tsx create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index/es_index.tsx create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index/es_index_connector.test.tsx rename x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/{es_index.tsx => es_index/es_index_connector.tsx} (66%) create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index/es_index_params.test.tsx create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index/es_index_params.tsx create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index/index.ts delete mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty.test.tsx create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty/index.ts rename x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/{ => pagerduty}/pagerduty.svg (100%) create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty/pagerduty.test.tsx create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty/pagerduty.tsx create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty/pagerduty_connectors.test.tsx create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty/pagerduty_connectors.tsx create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty/pagerduty_params.test.tsx rename x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/{pagerduty.tsx => pagerduty/pagerduty_params.tsx} (67%) delete mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/server_log.test.tsx create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/server_log/index.ts create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/server_log/server_log.test.tsx create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/server_log/server_log.tsx create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/server_log/server_log_params.test.tsx rename x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/{server_log.tsx => server_log/server_log_params.tsx} (67%) delete mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack.test.tsx delete mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack.tsx create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack/index.ts create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack/slack.test.tsx create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack/slack.tsx create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack/slack_connectors.test.tsx create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack/slack_connectors.tsx create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack/slack_params.test.tsx create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack/slack_params.tsx delete mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook.test.tsx create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook/index.ts create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook/webhook.test.tsx create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook/webhook.tsx create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook/webhook_connectors.test.tsx rename x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/{webhook.tsx => webhook/webhook_connectors.tsx} (71%) create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook/webhook_params.test.tsx create mode 100644 x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook/webhook_params.tsx diff --git a/x-pack/plugins/siem/public/lib/connectors/jira/flyout.tsx b/x-pack/plugins/siem/public/lib/connectors/jira/flyout.tsx index 9c3d1c90e67d7..337ca2e3c918e 100644 --- a/x-pack/plugins/siem/public/lib/connectors/jira/flyout.tsx +++ b/x-pack/plugins/siem/public/lib/connectors/jira/flyout.tsx @@ -109,3 +109,6 @@ export const JiraConnectorFlyout = withConnectorFlyout({ configKeys: ['projectKey'], connectorActionTypeId: '.jira', }); + +// eslint-disable-next-line import/no-default-export +export { JiraConnectorFlyout as default }; diff --git a/x-pack/plugins/siem/public/lib/connectors/jira/index.tsx b/x-pack/plugins/siem/public/lib/connectors/jira/index.tsx index ada9608e37c98..049ccb7cf17b7 100644 --- a/x-pack/plugins/siem/public/lib/connectors/jira/index.tsx +++ b/x-pack/plugins/siem/public/lib/connectors/jira/index.tsx @@ -4,6 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ +import { lazy } from 'react'; import { ValidationResult, // eslint-disable-next-line @kbn/eslint/no-restricted-paths @@ -13,7 +14,6 @@ import { connector } from './config'; import { createActionType } from '../utils'; import logo from './logo.svg'; import { JiraActionConnector } from './types'; -import { JiraConnectorFlyout } from './flyout'; import * as i18n from './translations'; interface Errors { @@ -50,5 +50,5 @@ export const getActionType = createActionType({ selectMessage: i18n.JIRA_DESC, actionTypeTitle: connector.name, validateConnector, - actionConnectorFields: JiraConnectorFlyout, + actionConnectorFields: lazy(() => import('./flyout')), }); diff --git a/x-pack/plugins/siem/public/lib/connectors/servicenow/flyout.tsx b/x-pack/plugins/siem/public/lib/connectors/servicenow/flyout.tsx index 5d5d08dacf90c..2783e988a6405 100644 --- a/x-pack/plugins/siem/public/lib/connectors/servicenow/flyout.tsx +++ b/x-pack/plugins/siem/public/lib/connectors/servicenow/flyout.tsx @@ -82,3 +82,6 @@ export const ServiceNowConnectorFlyout = withConnectorFlyout import('./flyout')), }); diff --git a/x-pack/plugins/siem/public/lib/connectors/types.ts b/x-pack/plugins/siem/public/lib/connectors/types.ts index ffb013c347e59..3d3692c9806e4 100644 --- a/x-pack/plugins/siem/public/lib/connectors/types.ts +++ b/x-pack/plugins/siem/public/lib/connectors/types.ts @@ -8,6 +8,7 @@ /* eslint-disable @kbn/eslint/no-restricted-paths */ import { ActionType } from '../../../../triggers_actions_ui/public'; +import { IErrorObject } from '../../../../triggers_actions_ui/public/types'; import { ExternalIncidentServiceConfiguration } from '../../../../actions/server/builtin_action_types/case/types'; import { ActionType as ThirdPartySupportedActions, CaseField } from '../../../../case/common/api'; @@ -42,7 +43,7 @@ export interface ActionConnectorValidationErrors { export type Optional = Omit & Partial; export interface ConnectorFlyoutFormProps { - errors: { [key: string]: string[] }; + errors: IErrorObject; action: T; onChangeSecret: (key: string, value: string) => void; onBlurSecret: (key: string) => void; diff --git a/x-pack/plugins/siem/public/lib/connectors/utils.ts b/x-pack/plugins/siem/public/lib/connectors/utils.ts index 169b4758876e8..cc1608a05e2ce 100644 --- a/x-pack/plugins/siem/public/lib/connectors/utils.ts +++ b/x-pack/plugins/siem/public/lib/connectors/utils.ts @@ -7,7 +7,6 @@ import { ActionTypeModel, ValidationResult, - ActionParamsProps, // eslint-disable-next-line @kbn/eslint/no-restricted-paths } from '../../../../triggers_actions_ui/public/types'; @@ -31,7 +30,7 @@ export const createActionType = ({ validateConnector, validateParams = connectorParamsValidator, actionConnectorFields, - actionParamsFields = ConnectorParamsFields, + actionParamsFields = null, }: Optional) => (): ActionTypeModel => { return { id, @@ -59,15 +58,6 @@ export const createActionType = ({ }; }; -const ConnectorParamsFields: React.FunctionComponent> = ({ - actionParams, - editAction, - index, - errors, -}) => { - return null; -}; - const connectorParamsValidator = (actionParams: ActionConnectorParams): ValidationResult => { return { errors: {} }; }; diff --git a/x-pack/plugins/triggers_actions_ui/README.md b/x-pack/plugins/triggers_actions_ui/README.md index ece1791c66e11..c5f02863ba8a1 100644 --- a/x-pack/plugins/triggers_actions_ui/README.md +++ b/x-pack/plugins/triggers_actions_ui/README.md @@ -985,8 +985,8 @@ Each action type should be defined as an `ActionTypeModel` object with the follo |selectMessage|Short description of action type responsibility, that will be displayed on the select card in UI.| |validateConnector|Validation function for action connector.| |validateParams|Validation function for action params.| -|actionConnectorFields|React functional component for building UI of current action type connector.| -|actionParamsFields|React functional component for building UI of current action type params. Displayed as a part of Create Alert flyout.| +|actionConnectorFields|A lazy loaded React component for building UI of current action type connector.| +|actionParamsFields|A lazy loaded React component for building UI of current action type params. Displayed as a part of Create Alert flyout.| ## Register action type model @@ -1082,8 +1082,8 @@ export function getActionType(): ActionTypeModel { } return validationResult; }, - actionConnectorFields: ExampleConnectorFields, - actionParamsFields: ExampleParamsFields, + actionConnectorFields: lazy(() => import('./example_connector_fields')), + actionParamsFields: lazy(() => import('./example_params_fields')), }; } ``` @@ -1130,6 +1130,9 @@ const ExampleConnectorFields: React.FunctionComponent ); }; + +// Export as default in order to support lazy loading +export {ExampleConnectorFields as default}; ``` 3. Define action type params fields using the property of `ActionTypeModel` `actionParamsFields`: @@ -1175,6 +1178,9 @@ const ExampleParamsFields: React.FunctionComponent ); }; + +// Export as default in order to support lazy loading +export {ExampleParamsFields as default}; ``` 4. Extend registration code with the new action type register in the file `x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/index.ts` diff --git a/x-pack/plugins/triggers_actions_ui/public/application/app.tsx b/x-pack/plugins/triggers_actions_ui/public/application/app.tsx index 0593940a0d105..63860e062c8da 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/app.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/app.tsx @@ -3,8 +3,8 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import React from 'react'; -import { Switch, Route, Redirect, HashRouter } from 'react-router-dom'; +import React, { lazy, Suspense } from 'react'; +import { Switch, Route, Redirect, HashRouter, RouteComponentProps } from 'react-router-dom'; import { ChromeStart, DocLinksStart, @@ -15,17 +15,21 @@ import { ChromeBreadcrumb, CoreStart, } from 'kibana/public'; +import { EuiLoadingSpinner, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import { BASE_PATH, Section, routeToAlertDetails } from './constants'; -import { TriggersActionsUIHome } from './home'; import { AppContextProvider, useAppDependencies } from './app_context'; import { hasShowAlertsCapability } from './lib/capabilities'; import { ActionTypeModel, AlertTypeModel } from '../types'; import { TypeRegistry } from './type_registry'; -import { AlertDetailsRouteWithApi as AlertDetailsRoute } from './sections/alert_details/components/alert_details_route'; import { ChartsPluginStart } from '../../../../../src/plugins/charts/public'; import { DataPublicPluginStart } from '../../../../../src/plugins/data/public'; import { PluginStartContract as AlertingStart } from '../../../alerting/public'; +const TriggersActionsUIHome = lazy(async () => import('./home')); +const AlertDetailsRoute = lazy(() => + import('./sections/alert_details/components/alert_details_route') +); + export interface AppDeps { dataPlugin: DataPublicPluginStart; charts: ChartsPluginStart; @@ -62,9 +66,32 @@ export const AppWithoutRouter = ({ sectionsRegex }: { sectionsRegex: string }) = const DEFAULT_SECTION: Section = canShowAlerts ? 'alerts' : 'connectors'; return ( - - {canShowAlerts && } + + {canShowAlerts && ( + + )} ); }; + +function suspendedRouteComponent( + RouteComponent: React.ComponentType> +) { + return (props: RouteComponentProps) => ( + + + + + + } + > + + + ); +} diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email.tsx deleted file mode 100644 index dff697297f3e4..0000000000000 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email.tsx +++ /dev/null @@ -1,609 +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; - * you may not use this file except in compliance with the Elastic License. - */ -import React, { Fragment, useState, useEffect } from 'react'; -import { FormattedMessage } from '@kbn/i18n/react'; -import { - EuiFieldText, - EuiFlexItem, - EuiFlexGroup, - EuiFieldNumber, - EuiFieldPassword, - EuiComboBox, - EuiTextArea, - EuiButtonEmpty, - EuiSwitch, - EuiFormRow, -} from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; -import { - ActionTypeModel, - ActionConnectorFieldsProps, - ValidationResult, - ActionParamsProps, -} from '../../../types'; -import { EmailActionParams, EmailActionConnector } from './types'; -import { AddMessageVariables } from '../add_message_variables'; - -export function getActionType(): ActionTypeModel { - const mailformat = /^[^@\s]+@[^@\s]+$/; - return { - id: '.email', - iconClass: 'email', - selectMessage: i18n.translate( - 'xpack.triggersActionsUI.components.builtinActionTypes.emailAction.selectMessageText', - { - defaultMessage: 'Send email from your server.', - } - ), - actionTypeTitle: i18n.translate( - 'xpack.triggersActionsUI.components.builtinActionTypes.emailAction.actionTypeTitle', - { - defaultMessage: 'Send to email', - } - ), - validateConnector: (action: EmailActionConnector): ValidationResult => { - const validationResult = { errors: {} }; - const errors = { - from: new Array(), - port: new Array(), - host: new Array(), - user: new Array(), - password: new Array(), - }; - validationResult.errors = errors; - if (!action.config.from) { - errors.from.push( - i18n.translate( - 'xpack.triggersActionsUI.components.builtinActionTypes.error.requiredFromText', - { - defaultMessage: 'Sender is required.', - } - ) - ); - } - if (action.config.from && !action.config.from.trim().match(mailformat)) { - errors.from.push( - i18n.translate( - 'xpack.triggersActionsUI.components.builtinActionTypes.error.formatFromText', - { - defaultMessage: 'Sender is not a valid email address.', - } - ) - ); - } - if (!action.config.port) { - errors.port.push( - i18n.translate( - 'xpack.triggersActionsUI.components.builtinActionTypes.error.requiredPortText', - { - defaultMessage: 'Port is required.', - } - ) - ); - } - if (!action.config.host) { - errors.host.push( - i18n.translate( - 'xpack.triggersActionsUI.components.builtinActionTypes.error.requiredHostText', - { - defaultMessage: 'Host is required.', - } - ) - ); - } - if (action.secrets.user && !action.secrets.password) { - errors.password.push( - i18n.translate( - 'xpack.triggersActionsUI.components.builtinActionTypes.error.requiredPasswordText', - { - defaultMessage: 'Password is required when username is used.', - } - ) - ); - } - if (!action.secrets.user && action.secrets.password) { - errors.user.push( - i18n.translate( - 'xpack.triggersActionsUI.components.builtinActionTypes.error.requiredUserText', - { - defaultMessage: 'Username is required when password is used.', - } - ) - ); - } - return validationResult; - }, - validateParams: (actionParams: EmailActionParams): ValidationResult => { - const validationResult = { errors: {} }; - const errors = { - to: new Array(), - cc: new Array(), - bcc: new Array(), - message: new Array(), - subject: new Array(), - }; - validationResult.errors = errors; - if ( - (!(actionParams.to instanceof Array) || actionParams.to.length === 0) && - (!(actionParams.cc instanceof Array) || actionParams.cc.length === 0) && - (!(actionParams.bcc instanceof Array) || actionParams.bcc.length === 0) - ) { - const errorText = i18n.translate( - 'xpack.triggersActionsUI.components.builtinActionTypes.error.requiredEntryText', - { - defaultMessage: 'No To, Cc, or Bcc entry. At least one entry is required.', - } - ); - errors.to.push(errorText); - errors.cc.push(errorText); - errors.bcc.push(errorText); - } - if (!actionParams.message?.length) { - errors.message.push( - i18n.translate( - 'xpack.triggersActionsUI.components.builtinActionTypes.error.requiredMessageText', - { - defaultMessage: 'Message is required.', - } - ) - ); - } - if (!actionParams.subject?.length) { - errors.subject.push( - i18n.translate( - 'xpack.triggersActionsUI.components.builtinActionTypes.error.requiredSubjectText', - { - defaultMessage: 'Subject is required.', - } - ) - ); - } - return validationResult; - }, - actionConnectorFields: EmailActionConnectorFields, - actionParamsFields: EmailParamsFields, - }; -} - -const EmailActionConnectorFields: React.FunctionComponent> = ({ action, editActionConfig, editActionSecrets, errors }) => { - const { from, host, port, secure } = action.config; - const { user, password } = action.secrets; - - return ( - - - - 0 && from !== undefined} - label={i18n.translate( - 'xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.fromTextFieldLabel', - { - defaultMessage: 'Sender', - } - )} - > - 0 && from !== undefined} - name="from" - value={from || ''} - data-test-subj="emailFromInput" - onChange={e => { - editActionConfig('from', e.target.value); - }} - onBlur={() => { - if (!from) { - editActionConfig('from', ''); - } - }} - /> - - - - - - 0 && host !== undefined} - label={i18n.translate( - 'xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.hostTextFieldLabel', - { - defaultMessage: 'Host', - } - )} - > - 0 && host !== undefined} - name="host" - value={host || ''} - data-test-subj="emailHostInput" - onChange={e => { - editActionConfig('host', e.target.value); - }} - onBlur={() => { - if (!host) { - editActionConfig('host', ''); - } - }} - /> - - - - - - 0 && port !== undefined} - label={i18n.translate( - 'xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.portTextFieldLabel', - { - defaultMessage: 'Port', - } - )} - > - 0 && port !== undefined} - fullWidth - name="port" - value={port || ''} - data-test-subj="emailPortInput" - onChange={e => { - editActionConfig('port', parseInt(e.target.value, 10)); - }} - onBlur={() => { - if (!port) { - editActionConfig('port', 0); - } - }} - /> - - - - - - { - editActionConfig('secure', e.target.checked); - }} - /> - - - - - - - - - 0} - label={i18n.translate( - 'xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.userTextFieldLabel', - { - defaultMessage: 'Username', - } - )} - > - 0} - name="user" - value={user || ''} - data-test-subj="emailUserInput" - onChange={e => { - editActionSecrets('user', nullableString(e.target.value)); - }} - /> - - - - 0} - label={i18n.translate( - 'xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.passwordFieldLabel', - { - defaultMessage: 'Password', - } - )} - > - 0} - name="password" - value={password || ''} - data-test-subj="emailPasswordInput" - onChange={e => { - editActionSecrets('password', nullableString(e.target.value)); - }} - /> - - - - - ); -}; - -const EmailParamsFields: React.FunctionComponent> = ({ - actionParams, - editAction, - index, - errors, - messageVariables, - defaultMessage, -}) => { - const { to, cc, bcc, subject, message } = actionParams; - const toOptions = to ? to.map((label: string) => ({ label })) : []; - const ccOptions = cc ? cc.map((label: string) => ({ label })) : []; - const bccOptions = bcc ? bcc.map((label: string) => ({ label })) : []; - const [addCC, setAddCC] = useState(false); - const [addBCC, setAddBCC] = useState(false); - - useEffect(() => { - if (!message && defaultMessage && defaultMessage.length > 0) { - editAction('message', defaultMessage, index); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - const onSelectMessageVariable = (paramsProperty: string, variable: string) => { - editAction( - paramsProperty, - ((actionParams as any)[paramsProperty] ?? '').concat(` {{${variable}}}`), - index - ); - }; - - return ( - - 0 && to !== undefined} - label={i18n.translate( - 'xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.recipientTextFieldLabel', - { - defaultMessage: 'To', - } - )} - labelAppend={ - - - {!addCC ? ( - setAddCC(true)}> - - - ) : null} - {!addBCC ? ( - setAddBCC(true)}> - - - ) : null} - - - } - > - 0 && to !== undefined} - fullWidth - data-test-subj="toEmailAddressInput" - selectedOptions={toOptions} - onCreateOption={(searchValue: string) => { - const newOptions = [...toOptions, { label: searchValue }]; - editAction( - 'to', - newOptions.map(newOption => newOption.label), - index - ); - }} - onChange={(selectedOptions: Array<{ label: string }>) => { - editAction( - 'to', - selectedOptions.map(selectedOption => selectedOption.label), - index - ); - }} - onBlur={() => { - if (!to) { - editAction('to', [], index); - } - }} - /> - - {addCC ? ( - 0 && cc !== undefined} - label={i18n.translate( - 'xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.recipientCopyTextFieldLabel', - { - defaultMessage: 'Cc', - } - )} - > - 0 && cc !== undefined} - fullWidth - data-test-subj="ccEmailAddressInput" - selectedOptions={ccOptions} - onCreateOption={(searchValue: string) => { - const newOptions = [...ccOptions, { label: searchValue }]; - editAction( - 'cc', - newOptions.map(newOption => newOption.label), - index - ); - }} - onChange={(selectedOptions: Array<{ label: string }>) => { - editAction( - 'cc', - selectedOptions.map(selectedOption => selectedOption.label), - index - ); - }} - onBlur={() => { - if (!cc) { - editAction('cc', [], index); - } - }} - /> - - ) : null} - {addBCC ? ( - 0 && bcc !== undefined} - label={i18n.translate( - 'xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.recipientBccTextFieldLabel', - { - defaultMessage: 'Bcc', - } - )} - > - 0 && bcc !== undefined} - fullWidth - data-test-subj="bccEmailAddressInput" - selectedOptions={bccOptions} - onCreateOption={(searchValue: string) => { - const newOptions = [...bccOptions, { label: searchValue }]; - editAction( - 'bcc', - newOptions.map(newOption => newOption.label), - index - ); - }} - onChange={(selectedOptions: Array<{ label: string }>) => { - editAction( - 'bcc', - selectedOptions.map(selectedOption => selectedOption.label), - index - ); - }} - onBlur={() => { - if (!bcc) { - editAction('bcc', [], index); - } - }} - /> - - ) : null} - 0 && subject !== undefined} - label={i18n.translate( - 'xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.subjectTextFieldLabel', - { - defaultMessage: 'Subject', - } - )} - labelAppend={ - - onSelectMessageVariable('subject', variable) - } - paramsProperty="subject" - /> - } - > - 0 && subject !== undefined} - name="subject" - data-test-subj="emailSubjectInput" - value={subject || ''} - onChange={e => { - editAction('subject', e.target.value, index); - }} - onBlur={() => { - if (!subject) { - editAction('subject', '', index); - } - }} - /> - - 0 && message !== undefined} - label={i18n.translate( - 'xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.messageTextAreaFieldLabel', - { - defaultMessage: 'Message', - } - )} - labelAppend={ - - onSelectMessageVariable('message', variable) - } - paramsProperty="message" - /> - } - > - 0 && message !== undefined} - value={message || ''} - name="message" - data-test-subj="emailMessageInput" - onChange={e => { - editAction('message', e.target.value, index); - }} - onBlur={() => { - if (!message) { - editAction('message', '', index); - } - }} - /> - - - ); -}; - -// if the string == null or is empty, return null, else return string -function nullableString(str: string | null | undefined) { - if (str == null || str.trim() === '') return null; - return str; -} diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email/email.test.tsx similarity index 62% rename from x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email.test.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email/email.test.tsx index af9e34071fd09..e823e848f52c2 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email/email.test.tsx @@ -3,12 +3,10 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import React, { FunctionComponent } from 'react'; -import { mountWithIntl } from 'test_utils/enzyme_helpers'; -import { TypeRegistry } from '../../type_registry'; -import { registerBuiltInActionTypes } from './index'; -import { ActionTypeModel, ActionParamsProps } from '../../../types'; -import { EmailActionParams, EmailActionConnector } from './types'; +import { TypeRegistry } from '../../../type_registry'; +import { registerBuiltInActionTypes } from '../index'; +import { ActionTypeModel } from '../../../../types'; +import { EmailActionConnector } from '../types'; const ACTION_TYPE_ID = '.email'; let actionTypeModel: ActionTypeModel; @@ -206,80 +204,3 @@ describe('action params validation', () => { }); }); }); - -describe('EmailActionConnectorFields renders', () => { - test('all connector fields is rendered', () => { - expect(actionTypeModel.actionConnectorFields).not.toBeNull(); - if (!actionTypeModel.actionConnectorFields) { - return; - } - const ConnectorFields = actionTypeModel.actionConnectorFields; - const actionConnector = { - secrets: { - user: 'user', - password: 'pass', - }, - id: 'test', - actionTypeId: '.email', - name: 'email', - config: { - from: 'test@test.com', - }, - } as EmailActionConnector; - const wrapper = mountWithIntl( - {}} - editActionSecrets={() => {}} - /> - ); - expect(wrapper.find('[data-test-subj="emailFromInput"]').length > 0).toBeTruthy(); - expect( - wrapper - .find('[data-test-subj="emailFromInput"]') - .first() - .prop('value') - ).toBe('test@test.com'); - expect(wrapper.find('[data-test-subj="emailHostInput"]').length > 0).toBeTruthy(); - expect(wrapper.find('[data-test-subj="emailPortInput"]').length > 0).toBeTruthy(); - expect(wrapper.find('[data-test-subj="emailUserInput"]').length > 0).toBeTruthy(); - expect(wrapper.find('[data-test-subj="emailPasswordInput"]').length > 0).toBeTruthy(); - }); -}); - -describe('EmailParamsFields renders', () => { - test('all params fields is rendered', () => { - expect(actionTypeModel.actionParamsFields).not.toBeNull(); - if (!actionTypeModel.actionParamsFields) { - return; - } - const ParamsFields = actionTypeModel.actionParamsFields as FunctionComponent< - ActionParamsProps - >; - const actionParams = { - cc: [], - bcc: [], - to: ['test@test.com'], - subject: 'test', - message: 'test message', - }; - const wrapper = mountWithIntl( - {}} - index={0} - /> - ); - expect(wrapper.find('[data-test-subj="toEmailAddressInput"]').length > 0).toBeTruthy(); - expect( - wrapper - .find('[data-test-subj="toEmailAddressInput"]') - .first() - .prop('selectedOptions') - ).toStrictEqual([{ label: 'test@test.com' }]); - expect(wrapper.find('[data-test-subj="emailSubjectInput"]').length > 0).toBeTruthy(); - expect(wrapper.find('[data-test-subj="emailMessageInput"]').length > 0).toBeTruthy(); - }); -}); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email/email.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email/email.tsx new file mode 100644 index 0000000000000..abb102c04b054 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email/email.tsx @@ -0,0 +1,150 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { lazy } from 'react'; +import { i18n } from '@kbn/i18n'; +import { ActionTypeModel, ValidationResult } from '../../../../types'; +import { EmailActionParams, EmailActionConnector } from '../types'; + +export function getActionType(): ActionTypeModel { + const mailformat = /^[^@\s]+@[^@\s]+$/; + return { + id: '.email', + iconClass: 'email', + selectMessage: i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.emailAction.selectMessageText', + { + defaultMessage: 'Send email from your server.', + } + ), + actionTypeTitle: i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.emailAction.actionTypeTitle', + { + defaultMessage: 'Send to email', + } + ), + validateConnector: (action: EmailActionConnector): ValidationResult => { + const validationResult = { errors: {} }; + const errors = { + from: new Array(), + port: new Array(), + host: new Array(), + user: new Array(), + password: new Array(), + }; + validationResult.errors = errors; + if (!action.config.from) { + errors.from.push( + i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.error.requiredFromText', + { + defaultMessage: 'Sender is required.', + } + ) + ); + } + if (action.config.from && !action.config.from.trim().match(mailformat)) { + errors.from.push( + i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.error.formatFromText', + { + defaultMessage: 'Sender is not a valid email address.', + } + ) + ); + } + if (!action.config.port) { + errors.port.push( + i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.error.requiredPortText', + { + defaultMessage: 'Port is required.', + } + ) + ); + } + if (!action.config.host) { + errors.host.push( + i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.error.requiredHostText', + { + defaultMessage: 'Host is required.', + } + ) + ); + } + if (action.secrets.user && !action.secrets.password) { + errors.password.push( + i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.error.requiredPasswordText', + { + defaultMessage: 'Password is required when username is used.', + } + ) + ); + } + if (!action.secrets.user && action.secrets.password) { + errors.user.push( + i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.error.requiredUserText', + { + defaultMessage: 'Username is required when password is used.', + } + ) + ); + } + return validationResult; + }, + validateParams: (actionParams: EmailActionParams): ValidationResult => { + const validationResult = { errors: {} }; + const errors = { + to: new Array(), + cc: new Array(), + bcc: new Array(), + message: new Array(), + subject: new Array(), + }; + validationResult.errors = errors; + if ( + (!(actionParams.to instanceof Array) || actionParams.to.length === 0) && + (!(actionParams.cc instanceof Array) || actionParams.cc.length === 0) && + (!(actionParams.bcc instanceof Array) || actionParams.bcc.length === 0) + ) { + const errorText = i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.error.requiredEntryText', + { + defaultMessage: 'No To, Cc, or Bcc entry. At least one entry is required.', + } + ); + errors.to.push(errorText); + errors.cc.push(errorText); + errors.bcc.push(errorText); + } + if (!actionParams.message?.length) { + errors.message.push( + i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.error.requiredMessageText', + { + defaultMessage: 'Message is required.', + } + ) + ); + } + if (!actionParams.subject?.length) { + errors.subject.push( + i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.error.requiredSubjectText', + { + defaultMessage: 'Subject is required.', + } + ) + ); + } + return validationResult; + }, + actionConnectorFields: lazy(() => import('./email_connector')), + actionParamsFields: lazy(() => import('./email_params')), + }; +} diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email/email_connector.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email/email_connector.test.tsx new file mode 100644 index 0000000000000..67514e815bc49 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email/email_connector.test.tsx @@ -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; + * you may not use this file except in compliance with the Elastic License. + */ +import React from 'react'; +import { mountWithIntl } from 'test_utils/enzyme_helpers'; +import { EmailActionConnector } from '../types'; +import EmailActionConnectorFields from './email_connector'; +import { DocLinksStart } from 'kibana/public'; + +describe('EmailActionConnectorFields renders', () => { + test('all connector fields is rendered', () => { + const actionConnector = { + secrets: { + user: 'user', + password: 'pass', + }, + id: 'test', + actionTypeId: '.email', + name: 'email', + config: { + from: 'test@test.com', + }, + } as EmailActionConnector; + const wrapper = mountWithIntl( + {}} + editActionSecrets={() => {}} + docLinks={{ ELASTIC_WEBSITE_URL: '', DOC_LINK_VERSION: '' } as DocLinksStart} + /> + ); + expect(wrapper.find('[data-test-subj="emailFromInput"]').length > 0).toBeTruthy(); + expect( + wrapper + .find('[data-test-subj="emailFromInput"]') + .first() + .prop('value') + ).toBe('test@test.com'); + expect(wrapper.find('[data-test-subj="emailHostInput"]').length > 0).toBeTruthy(); + expect(wrapper.find('[data-test-subj="emailPortInput"]').length > 0).toBeTruthy(); + expect(wrapper.find('[data-test-subj="emailUserInput"]').length > 0).toBeTruthy(); + expect(wrapper.find('[data-test-subj="emailPasswordInput"]').length > 0).toBeTruthy(); + }); +}); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email/email_connector.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email/email_connector.tsx new file mode 100644 index 0000000000000..4ef4c8a4d8617 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email/email_connector.tsx @@ -0,0 +1,209 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React, { Fragment } from 'react'; +import { + EuiFieldText, + EuiFlexItem, + EuiFlexGroup, + EuiFieldNumber, + EuiFieldPassword, + EuiSwitch, + EuiFormRow, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { ActionConnectorFieldsProps } from '../../../../types'; +import { EmailActionConnector } from '../types'; + +export const EmailActionConnectorFields: React.FunctionComponent> = ({ action, editActionConfig, editActionSecrets, errors }) => { + const { from, host, port, secure } = action.config; + const { user, password } = action.secrets; + + return ( + + + + 0 && from !== undefined} + label={i18n.translate( + 'xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.fromTextFieldLabel', + { + defaultMessage: 'Sender', + } + )} + > + 0 && from !== undefined} + name="from" + value={from || ''} + data-test-subj="emailFromInput" + onChange={e => { + editActionConfig('from', e.target.value); + }} + onBlur={() => { + if (!from) { + editActionConfig('from', ''); + } + }} + /> + + + + + + 0 && host !== undefined} + label={i18n.translate( + 'xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.hostTextFieldLabel', + { + defaultMessage: 'Host', + } + )} + > + 0 && host !== undefined} + name="host" + value={host || ''} + data-test-subj="emailHostInput" + onChange={e => { + editActionConfig('host', e.target.value); + }} + onBlur={() => { + if (!host) { + editActionConfig('host', ''); + } + }} + /> + + + + + + 0 && port !== undefined} + label={i18n.translate( + 'xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.portTextFieldLabel', + { + defaultMessage: 'Port', + } + )} + > + 0 && port !== undefined} + fullWidth + name="port" + value={port || ''} + data-test-subj="emailPortInput" + onChange={e => { + editActionConfig('port', parseInt(e.target.value, 10)); + }} + onBlur={() => { + if (!port) { + editActionConfig('port', 0); + } + }} + /> + + + + + + { + editActionConfig('secure', e.target.checked); + }} + /> + + + + + + + + + 0} + label={i18n.translate( + 'xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.userTextFieldLabel', + { + defaultMessage: 'Username', + } + )} + > + 0} + name="user" + value={user || ''} + data-test-subj="emailUserInput" + onChange={e => { + editActionSecrets('user', nullableString(e.target.value)); + }} + /> + + + + 0} + label={i18n.translate( + 'xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.passwordFieldLabel', + { + defaultMessage: 'Password', + } + )} + > + 0} + name="password" + value={password || ''} + data-test-subj="emailPasswordInput" + onChange={e => { + editActionSecrets('password', nullableString(e.target.value)); + }} + /> + + + + + ); +}; + +// if the string == null or is empty, return null, else return string +function nullableString(str: string | null | undefined) { + if (str == null || str.trim() === '') return null; + return str; +} + +// eslint-disable-next-line import/no-default-export +export { EmailActionConnectorFields as default }; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email/email_params.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email/email_params.test.tsx new file mode 100644 index 0000000000000..a2b5ccf988afb --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email/email_params.test.tsx @@ -0,0 +1,37 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React from 'react'; +import { mountWithIntl } from 'test_utils/enzyme_helpers'; +import EmailParamsFields from './email_params'; + +describe('EmailParamsFields renders', () => { + test('all params fields is rendered', () => { + const actionParams = { + cc: [], + bcc: [], + to: ['test@test.com'], + subject: 'test', + message: 'test message', + }; + const wrapper = mountWithIntl( + {}} + index={0} + /> + ); + expect(wrapper.find('[data-test-subj="toEmailAddressInput"]').length > 0).toBeTruthy(); + expect( + wrapper + .find('[data-test-subj="toEmailAddressInput"]') + .first() + .prop('selectedOptions') + ).toStrictEqual([{ label: 'test@test.com' }]); + expect(wrapper.find('[data-test-subj="emailSubjectInput"]').length > 0).toBeTruthy(); + expect(wrapper.find('[data-test-subj="emailMessageInput"]').length > 0).toBeTruthy(); + }); +}); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email/email_params.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email/email_params.tsx new file mode 100644 index 0000000000000..13e791f1069e3 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email/email_params.tsx @@ -0,0 +1,267 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React, { Fragment, useState, useEffect } from 'react'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { EuiFieldText, EuiComboBox, EuiTextArea, EuiButtonEmpty, EuiFormRow } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { ActionParamsProps } from '../../../../types'; +import { EmailActionParams } from '../types'; +import { AddMessageVariables } from '../../add_message_variables'; + +export const EmailParamsFields = ({ + actionParams, + editAction, + index, + errors, + messageVariables, + defaultMessage, +}: ActionParamsProps) => { + const { to, cc, bcc, subject, message } = actionParams; + const toOptions = to ? to.map((label: string) => ({ label })) : []; + const ccOptions = cc ? cc.map((label: string) => ({ label })) : []; + const bccOptions = bcc ? bcc.map((label: string) => ({ label })) : []; + const [addCC, setAddCC] = useState(false); + const [addBCC, setAddBCC] = useState(false); + + useEffect(() => { + if (!message && defaultMessage && defaultMessage.length > 0) { + editAction('message', defaultMessage, index); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const onSelectMessageVariable = (paramsProperty: string, variable: string) => { + editAction( + paramsProperty, + ((actionParams as any)[paramsProperty] ?? '').concat(` {{${variable}}}`), + index + ); + }; + + return ( + + 0 && to !== undefined} + label={i18n.translate( + 'xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.recipientTextFieldLabel', + { + defaultMessage: 'To', + } + )} + labelAppend={ + + + {!addCC ? ( + setAddCC(true)}> + + + ) : null} + {!addBCC ? ( + setAddBCC(true)}> + + + ) : null} + + + } + > + 0 && to !== undefined} + fullWidth + data-test-subj="toEmailAddressInput" + selectedOptions={toOptions} + onCreateOption={(searchValue: string) => { + const newOptions = [...toOptions, { label: searchValue }]; + editAction( + 'to', + newOptions.map(newOption => newOption.label), + index + ); + }} + onChange={(selectedOptions: Array<{ label: string }>) => { + editAction( + 'to', + selectedOptions.map(selectedOption => selectedOption.label), + index + ); + }} + onBlur={() => { + if (!to) { + editAction('to', [], index); + } + }} + /> + + {addCC ? ( + 0 && cc !== undefined} + label={i18n.translate( + 'xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.recipientCopyTextFieldLabel', + { + defaultMessage: 'Cc', + } + )} + > + 0 && cc !== undefined} + fullWidth + data-test-subj="ccEmailAddressInput" + selectedOptions={ccOptions} + onCreateOption={(searchValue: string) => { + const newOptions = [...ccOptions, { label: searchValue }]; + editAction( + 'cc', + newOptions.map(newOption => newOption.label), + index + ); + }} + onChange={(selectedOptions: Array<{ label: string }>) => { + editAction( + 'cc', + selectedOptions.map(selectedOption => selectedOption.label), + index + ); + }} + onBlur={() => { + if (!cc) { + editAction('cc', [], index); + } + }} + /> + + ) : null} + {addBCC ? ( + 0 && bcc !== undefined} + label={i18n.translate( + 'xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.recipientBccTextFieldLabel', + { + defaultMessage: 'Bcc', + } + )} + > + 0 && bcc !== undefined} + fullWidth + data-test-subj="bccEmailAddressInput" + selectedOptions={bccOptions} + onCreateOption={(searchValue: string) => { + const newOptions = [...bccOptions, { label: searchValue }]; + editAction( + 'bcc', + newOptions.map(newOption => newOption.label), + index + ); + }} + onChange={(selectedOptions: Array<{ label: string }>) => { + editAction( + 'bcc', + selectedOptions.map(selectedOption => selectedOption.label), + index + ); + }} + onBlur={() => { + if (!bcc) { + editAction('bcc', [], index); + } + }} + /> + + ) : null} + 0 && subject !== undefined} + label={i18n.translate( + 'xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.subjectTextFieldLabel', + { + defaultMessage: 'Subject', + } + )} + labelAppend={ + + onSelectMessageVariable('subject', variable) + } + paramsProperty="subject" + /> + } + > + 0 && subject !== undefined} + name="subject" + data-test-subj="emailSubjectInput" + value={subject || ''} + onChange={e => { + editAction('subject', e.target.value, index); + }} + onBlur={() => { + if (!subject) { + editAction('subject', '', index); + } + }} + /> + + 0 && message !== undefined} + label={i18n.translate( + 'xpack.triggersActionsUI.sections.builtinActionTypes.emailAction.messageTextAreaFieldLabel', + { + defaultMessage: 'Message', + } + )} + labelAppend={ + + onSelectMessageVariable('message', variable) + } + paramsProperty="message" + /> + } + > + 0 && message !== undefined} + value={message || ''} + name="message" + data-test-subj="emailMessageInput" + onChange={e => { + editAction('message', e.target.value, index); + }} + onBlur={() => { + if (!message) { + editAction('message', '', index); + } + }} + /> + + + ); +}; + +// eslint-disable-next-line import/no-default-export +export { EmailParamsFields as default }; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email/index.ts b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email/index.ts new file mode 100644 index 0000000000000..e0dd24a44aa8f --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/email/index.ts @@ -0,0 +1,7 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { getActionType as getEmailActionType } from './email'; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index.test.tsx deleted file mode 100644 index 04dc7b484ed48..0000000000000 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index.test.tsx +++ /dev/null @@ -1,240 +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; - * you may not use this file except in compliance with the Elastic License. - */ -import React, { FunctionComponent } from 'react'; -import { mountWithIntl, nextTick } from 'test_utils/enzyme_helpers'; -import { act } from 'react-dom/test-utils'; -import { TypeRegistry } from '../../type_registry'; -import { registerBuiltInActionTypes } from './index'; -import { ActionTypeModel, ActionParamsProps } from '../../../types'; -import { IndexActionParams, EsIndexActionConnector } from './types'; -import { coreMock } from '../../../../../../../src/core/public/mocks'; -jest.mock('../../../common/index_controls', () => ({ - firstFieldOption: jest.fn(), - getFields: jest.fn(), - getIndexOptions: jest.fn(), - getIndexPatterns: jest.fn(), -})); - -const ACTION_TYPE_ID = '.index'; -let actionTypeModel: ActionTypeModel; -let deps: any; - -beforeAll(async () => { - const actionTypeRegistry = new TypeRegistry(); - registerBuiltInActionTypes({ actionTypeRegistry }); - const getResult = actionTypeRegistry.get(ACTION_TYPE_ID); - if (getResult !== null) { - actionTypeModel = getResult; - } - const mocks = coreMock.createSetup(); - const [ - { - application: { capabilities }, - }, - ] = await mocks.getStartServices(); - deps = { - toastNotifications: mocks.notifications.toasts, - http: mocks.http, - capabilities: { - ...capabilities, - actions: { - delete: true, - save: true, - show: true, - }, - }, - actionTypeRegistry: actionTypeRegistry as any, - docLinks: { ELASTIC_WEBSITE_URL: '', DOC_LINK_VERSION: '' }, - }; -}); - -describe('actionTypeRegistry.get() works', () => { - test('action type .index is registered', () => { - expect(actionTypeModel.id).toEqual(ACTION_TYPE_ID); - expect(actionTypeModel.iconClass).toEqual('indexOpen'); - }); -}); - -describe('index connector validation', () => { - test('connector validation succeeds when connector config is valid', () => { - const actionConnector = { - secrets: {}, - id: 'test', - actionTypeId: '.index', - name: 'es_index', - config: { - index: 'test_es_index', - refresh: false, - executionTimeField: '1', - }, - } as EsIndexActionConnector; - - expect(actionTypeModel.validateConnector(actionConnector)).toEqual({ - errors: { - index: [], - }, - }); - }); -}); - -describe('index connector validation with minimal config', () => { - test('connector validation succeeds when connector config is valid', () => { - const actionConnector = { - secrets: {}, - id: 'test', - actionTypeId: '.index', - name: 'es_index', - config: { - index: 'test_es_index', - }, - } as EsIndexActionConnector; - - expect(actionTypeModel.validateConnector(actionConnector)).toEqual({ - errors: { - index: [], - }, - }); - }); -}); - -describe('action params validation', () => { - test('action params validation succeeds when action params is valid', () => { - const actionParams = { - documents: ['test'], - }; - - expect(actionTypeModel.validateParams(actionParams)).toEqual({ - errors: {}, - }); - - const emptyActionParams = {}; - - expect(actionTypeModel.validateParams(emptyActionParams)).toEqual({ - errors: {}, - }); - }); -}); - -describe('IndexActionConnectorFields renders', () => { - test('all connector fields is rendered', async () => { - expect(actionTypeModel.actionConnectorFields).not.toBeNull(); - if (!actionTypeModel.actionConnectorFields) { - return; - } - - const { getIndexPatterns } = jest.requireMock('../../../common/index_controls'); - getIndexPatterns.mockResolvedValueOnce([ - { - id: 'indexPattern1', - attributes: { - title: 'indexPattern1', - }, - }, - { - id: 'indexPattern2', - attributes: { - title: 'indexPattern2', - }, - }, - ]); - const { getFields } = jest.requireMock('../../../common/index_controls'); - getFields.mockResolvedValueOnce([ - { - type: 'date', - name: 'test1', - }, - { - type: 'text', - name: 'test2', - }, - ]); - const ConnectorFields = actionTypeModel.actionConnectorFields; - const actionConnector = { - secrets: {}, - id: 'test', - actionTypeId: '.index', - name: 'es_index', - config: { - index: 'test', - refresh: false, - executionTimeField: 'test1', - }, - } as EsIndexActionConnector; - const wrapper = mountWithIntl( - {}} - editActionSecrets={() => {}} - http={deps!.http} - /> - ); - - await act(async () => { - await nextTick(); - wrapper.update(); - }); - - expect(wrapper.find('[data-test-subj="connectorIndexesComboBox"]').length > 0).toBeTruthy(); - expect(wrapper.find('[data-test-subj="indexRefreshCheckbox"]').length > 0).toBeTruthy(); - - const indexSearchBoxValue = wrapper.find('[data-test-subj="comboBoxSearchInput"]'); - expect(indexSearchBoxValue.first().props().value).toEqual(''); - - const indexComboBox = wrapper.find('#indexConnectorSelectSearchBox'); - indexComboBox.first().simulate('click'); - const event = { target: { value: 'indexPattern1' } }; - indexComboBox - .find('input') - .first() - .simulate('change', event); - - const indexSearchBoxValueBeforeEnterData = wrapper.find( - '[data-test-subj="comboBoxSearchInput"]' - ); - expect(indexSearchBoxValueBeforeEnterData.first().props().value).toEqual('indexPattern1'); - - const indexComboBoxClear = wrapper.find('[data-test-subj="comboBoxClearButton"]'); - indexComboBoxClear.first().simulate('click'); - - const indexSearchBoxValueAfterEnterData = wrapper.find( - '[data-test-subj="comboBoxSearchInput"]' - ); - expect(indexSearchBoxValueAfterEnterData.first().props().value).toEqual('indexPattern1'); - }); -}); - -describe('IndexParamsFields renders', () => { - test('all params fields is rendered', () => { - expect(actionTypeModel.actionParamsFields).not.toBeNull(); - if (!actionTypeModel.actionParamsFields) { - return; - } - const ParamsFields = actionTypeModel.actionParamsFields as FunctionComponent< - ActionParamsProps - >; - const actionParams = { - documents: [{ test: 123 }], - }; - const wrapper = mountWithIntl( - {}} - index={0} - /> - ); - expect( - wrapper - .find('[data-test-subj="actionIndexDoc"]') - .first() - .prop('value') - ).toBe(`{ - "test": 123 -}`); - expect(wrapper.find('[data-test-subj="documentsAddVariableButton"]').length > 0).toBeTruthy(); - }); -}); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index/es_index.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index/es_index.test.tsx new file mode 100644 index 0000000000000..417a9e09086a2 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index/es_index.test.tsx @@ -0,0 +1,88 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { TypeRegistry } from '../../../type_registry'; +import { registerBuiltInActionTypes } from '../index'; +import { ActionTypeModel } from '../../../../types'; +import { EsIndexActionConnector } from '../types'; + +const ACTION_TYPE_ID = '.index'; +let actionTypeModel: ActionTypeModel; + +beforeAll(() => { + const actionTypeRegistry = new TypeRegistry(); + registerBuiltInActionTypes({ actionTypeRegistry }); + const getResult = actionTypeRegistry.get(ACTION_TYPE_ID); + if (getResult !== null) { + actionTypeModel = getResult; + } +}); + +describe('actionTypeRegistry.get() works', () => { + test('action type .index is registered', () => { + expect(actionTypeModel.id).toEqual(ACTION_TYPE_ID); + expect(actionTypeModel.iconClass).toEqual('indexOpen'); + }); +}); + +describe('index connector validation', () => { + test('connector validation succeeds when connector config is valid', () => { + const actionConnector = { + secrets: {}, + id: 'test', + actionTypeId: '.index', + name: 'es_index', + config: { + index: 'test_es_index', + refresh: false, + executionTimeField: '1', + }, + } as EsIndexActionConnector; + + expect(actionTypeModel.validateConnector(actionConnector)).toEqual({ + errors: { + index: [], + }, + }); + }); +}); + +describe('index connector validation with minimal config', () => { + test('connector validation succeeds when connector config is valid', () => { + const actionConnector = { + secrets: {}, + id: 'test', + actionTypeId: '.index', + name: 'es_index', + config: { + index: 'test_es_index', + }, + } as EsIndexActionConnector; + + expect(actionTypeModel.validateConnector(actionConnector)).toEqual({ + errors: { + index: [], + }, + }); + }); +}); + +describe('action params validation', () => { + test('action params validation succeeds when action params is valid', () => { + const actionParams = { + documents: ['test'], + }; + + expect(actionTypeModel.validateParams(actionParams)).toEqual({ + errors: {}, + }); + + const emptyActionParams = {}; + + expect(actionTypeModel.validateParams(emptyActionParams)).toEqual({ + errors: {}, + }); + }); +}); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index/es_index.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index/es_index.tsx new file mode 100644 index 0000000000000..3ee663a5fc8a0 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index/es_index.tsx @@ -0,0 +1,51 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { lazy } from 'react'; +import { i18n } from '@kbn/i18n'; +import { ActionTypeModel, ValidationResult } from '../../../../types'; +import { EsIndexActionConnector, IndexActionParams } from '../types'; + +export function getActionType(): ActionTypeModel { + return { + id: '.index', + iconClass: 'indexOpen', + selectMessage: i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.indexAction.selectMessageText', + { + defaultMessage: 'Index data into Elasticsearch.', + } + ), + actionTypeTitle: i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.indexAction.actionTypeTitle', + { + defaultMessage: 'Index data', + } + ), + validateConnector: (action: EsIndexActionConnector): ValidationResult => { + const validationResult = { errors: {} }; + const errors = { + index: new Array(), + }; + validationResult.errors = errors; + if (!action.config.index) { + errors.index.push( + i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.indexAction.error.requiredIndexText', + { + defaultMessage: 'Index is required.', + } + ) + ); + } + return validationResult; + }, + actionConnectorFields: lazy(() => import('./es_index_connector')), + actionParamsFields: lazy(() => import('./es_index_params')), + validateParams: (): ValidationResult => { + return { errors: {} }; + }, + }; +} diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index/es_index_connector.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index/es_index_connector.test.tsx new file mode 100644 index 0000000000000..b0f21afeaa96c --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index/es_index_connector.test.tsx @@ -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; + * you may not use this file except in compliance with the Elastic License. + */ +import React from 'react'; +import { mountWithIntl, nextTick } from 'test_utils/enzyme_helpers'; +import { act } from 'react-dom/test-utils'; +import { EsIndexActionConnector } from '../types'; +import { coreMock } from '../../../../../../../../src/core/public/mocks'; +import IndexActionConnectorFields from './es_index_connector'; +import { TypeRegistry } from '../../../type_registry'; +import { DocLinksStart } from 'kibana/public'; + +jest.mock('../../../../common/index_controls', () => ({ + firstFieldOption: jest.fn(), + getFields: jest.fn(), + getIndexOptions: jest.fn(), + getIndexPatterns: jest.fn(), +})); + +describe('IndexActionConnectorFields renders', () => { + test('all connector fields is rendered', async () => { + const mocks = coreMock.createSetup(); + const [ + { + application: { capabilities }, + }, + ] = await mocks.getStartServices(); + const deps = { + toastNotifications: mocks.notifications.toasts, + http: mocks.http, + capabilities: { + ...capabilities, + actions: { + delete: true, + save: true, + show: true, + }, + }, + actionTypeRegistry: {} as TypeRegistry, + docLinks: { ELASTIC_WEBSITE_URL: '', DOC_LINK_VERSION: '' } as DocLinksStart, + }; + + const { getIndexPatterns } = jest.requireMock('../../../../common/index_controls'); + getIndexPatterns.mockResolvedValueOnce([ + { + id: 'indexPattern1', + attributes: { + title: 'indexPattern1', + }, + }, + { + id: 'indexPattern2', + attributes: { + title: 'indexPattern2', + }, + }, + ]); + const { getFields } = jest.requireMock('../../../../common/index_controls'); + getFields.mockResolvedValueOnce([ + { + type: 'date', + name: 'test1', + }, + { + type: 'text', + name: 'test2', + }, + ]); + + const actionConnector = { + secrets: {}, + id: 'test', + actionTypeId: '.index', + name: 'es_index', + config: { + index: 'test', + refresh: false, + executionTimeField: 'test1', + }, + } as EsIndexActionConnector; + const wrapper = mountWithIntl( + {}} + editActionSecrets={() => {}} + http={deps!.http} + docLinks={deps!.docLinks} + /> + ); + + await act(async () => { + await nextTick(); + wrapper.update(); + }); + + expect(wrapper.find('[data-test-subj="connectorIndexesComboBox"]').length > 0).toBeTruthy(); + expect(wrapper.find('[data-test-subj="indexRefreshCheckbox"]').length > 0).toBeTruthy(); + + const indexSearchBoxValue = wrapper.find('[data-test-subj="comboBoxSearchInput"]'); + expect(indexSearchBoxValue.first().props().value).toEqual(''); + + const indexComboBox = wrapper.find('#indexConnectorSelectSearchBox'); + indexComboBox.first().simulate('click'); + const event = { target: { value: 'indexPattern1' } }; + indexComboBox + .find('input') + .first() + .simulate('change', event); + + const indexSearchBoxValueBeforeEnterData = wrapper.find( + '[data-test-subj="comboBoxSearchInput"]' + ); + expect(indexSearchBoxValueBeforeEnterData.first().props().value).toEqual('indexPattern1'); + + const indexComboBoxClear = wrapper.find('[data-test-subj="comboBoxClearButton"]'); + indexComboBoxClear.first().simulate('click'); + + const indexSearchBoxValueAfterEnterData = wrapper.find( + '[data-test-subj="comboBoxSearchInput"]' + ); + expect(indexSearchBoxValueAfterEnterData.first().props().value).toEqual('indexPattern1'); + }); +}); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index/es_index_connector.tsx similarity index 66% rename from x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index/es_index_connector.tsx index 861d6ad7284c2..9cd3a18545345 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index/es_index_connector.tsx @@ -3,12 +3,11 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import React, { Fragment, useState, useEffect } from 'react'; +import React, { useState, useEffect } from 'react'; import { EuiFormRow, EuiSwitch, EuiSpacer, - EuiCodeEditor, EuiComboBox, EuiComboBoxOptionOption, EuiSelect, @@ -17,64 +16,15 @@ import { } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; -import { useXJsonMode } from '../../../../../../../src/plugins/es_ui_shared/static/ace_x_json/hooks'; -import { - ActionTypeModel, - ActionConnectorFieldsProps, - ValidationResult, - ActionParamsProps, -} from '../../../types'; -import { IndexActionParams, EsIndexActionConnector } from './types'; -import { getTimeFieldOptions } from '../../../common/lib/get_time_options'; +import { ActionConnectorFieldsProps } from '../../../../types'; +import { EsIndexActionConnector } from '.././types'; +import { getTimeFieldOptions } from '../../../../common/lib/get_time_options'; import { firstFieldOption, getFields, getIndexOptions, getIndexPatterns, -} from '../../../common/index_controls'; -import { AddMessageVariables } from '../add_message_variables'; - -export function getActionType(): ActionTypeModel { - return { - id: '.index', - iconClass: 'indexOpen', - selectMessage: i18n.translate( - 'xpack.triggersActionsUI.components.builtinActionTypes.indexAction.selectMessageText', - { - defaultMessage: 'Index data into Elasticsearch.', - } - ), - actionTypeTitle: i18n.translate( - 'xpack.triggersActionsUI.components.builtinActionTypes.indexAction.actionTypeTitle', - { - defaultMessage: 'Index data', - } - ), - validateConnector: (action: EsIndexActionConnector): ValidationResult => { - const validationResult = { errors: {} }; - const errors = { - index: new Array(), - }; - validationResult.errors = errors; - if (!action.config.index) { - errors.index.push( - i18n.translate( - 'xpack.triggersActionsUI.components.builtinActionTypes.indexAction.error.requiredIndexText', - { - defaultMessage: 'Index is required.', - } - ) - ); - } - return validationResult; - }, - actionConnectorFields: IndexActionConnectorFields, - actionParamsFields: IndexParamsFields, - validateParams: (): ValidationResult => { - return { errors: {} }; - }, - }; -} +} from '../../../../common/index_controls'; const IndexActionConnectorFields: React.FunctionComponent> = ({ - actionParams, - index, - editAction, - messageVariables, -}) => { - const { documents } = actionParams; - const { xJsonMode, convertToJson, setXJson, xJson } = useXJsonMode( - documents && documents.length > 0 ? documents[0] : null - ); - const onSelectMessageVariable = (variable: string) => { - const value = (xJson ?? '').concat(` {{${variable}}}`); - setXJson(value); - // Keep the documents in sync with the editor content - onDocumentsChange(convertToJson(value)); - }; - - function onDocumentsChange(updatedDocuments: string) { - try { - const documentsJSON = JSON.parse(updatedDocuments); - editAction('documents', [documentsJSON], index); - // eslint-disable-next-line no-empty - } catch (e) {} - } - return ( - - onSelectMessageVariable(variable)} - paramsProperty="documents" - /> - } - > - { - setXJson(xjson); - // Keep the documents in sync with the editor content - onDocumentsChange(convertToJson(xjson)); - }} - /> - - - ); -}; - // if the string == null or is empty, return null, else return string function nullableString(str: string | null | undefined) { if (str == null || str.trim() === '') return null; return str; } + +// eslint-disable-next-line import/no-default-export +export { IndexActionConnectorFields as default }; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index/es_index_params.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index/es_index_params.test.tsx new file mode 100644 index 0000000000000..5f05a56a228e2 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index/es_index_params.test.tsx @@ -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; + * you may not use this file except in compliance with the Elastic License. + */ +import React from 'react'; +import { mountWithIntl } from 'test_utils/enzyme_helpers'; +import ParamsFields from './es_index_params'; + +describe('IndexParamsFields renders', () => { + test('all params fields is rendered', () => { + const actionParams = { + documents: [{ test: 123 }], + }; + const wrapper = mountWithIntl( + {}} + index={0} + /> + ); + expect( + wrapper + .find('[data-test-subj="actionIndexDoc"]') + .first() + .prop('value') + ).toBe(`{ + "test": 123 +}`); + expect(wrapper.find('[data-test-subj="documentsAddVariableButton"]').length > 0).toBeTruthy(); + }); +}); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index/es_index_params.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index/es_index_params.tsx new file mode 100644 index 0000000000000..0b095cdc26984 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index/es_index_params.tsx @@ -0,0 +1,81 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React, { Fragment } from 'react'; +import { EuiFormRow, EuiCodeEditor } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { useXJsonMode } from '../../../../../../../../src/plugins/es_ui_shared/static/ace_x_json/hooks'; +import { ActionParamsProps } from '../../../../types'; +import { IndexActionParams } from '.././types'; +import { AddMessageVariables } from '../../add_message_variables'; + +export const IndexParamsFields = ({ + actionParams, + index, + editAction, + messageVariables, +}: ActionParamsProps) => { + const { documents } = actionParams; + const { xJsonMode, convertToJson, setXJson, xJson } = useXJsonMode( + documents && documents.length > 0 ? documents[0] : null + ); + const onSelectMessageVariable = (variable: string) => { + const value = (xJson ?? '').concat(` {{${variable}}}`); + setXJson(value); + // Keep the documents in sync with the editor content + onDocumentsChange(convertToJson(value)); + }; + + function onDocumentsChange(updatedDocuments: string) { + try { + const documentsJSON = JSON.parse(updatedDocuments); + editAction('documents', [documentsJSON], index); + // eslint-disable-next-line no-empty + } catch (e) {} + } + return ( + + onSelectMessageVariable(variable)} + paramsProperty="documents" + /> + } + > + { + setXJson(xjson); + // Keep the documents in sync with the editor content + onDocumentsChange(convertToJson(xjson)); + }} + /> + + + ); +}; + +// eslint-disable-next-line import/no-default-export +export { IndexParamsFields as default }; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index/index.ts b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index/index.ts new file mode 100644 index 0000000000000..6a2ebd9c4bc71 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/es_index/index.ts @@ -0,0 +1,7 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { getActionType as getIndexActionType } from './es_index'; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/index.ts b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/index.ts index 6ffd9b2c9ffde..8f49fa46dd54e 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/index.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/index.ts @@ -4,12 +4,12 @@ * you may not use this file except in compliance with the Elastic License. */ -import { getActionType as getServerLogActionType } from './server_log'; -import { getActionType as getSlackActionType } from './slack'; -import { getActionType as getEmailActionType } from './email'; -import { getActionType as getIndexActionType } from './es_index'; -import { getActionType as getPagerDutyActionType } from './pagerduty'; -import { getActionType as getWebhookActionType } from './webhook'; +import { getServerLogActionType } from './server_log'; +import { getSlackActionType } from './slack'; +import { getEmailActionType } from './email'; +import { getIndexActionType } from './es_index'; +import { getPagerDutyActionType } from './pagerduty'; +import { getWebhookActionType } from './webhook'; import { TypeRegistry } from '../../type_registry'; import { ActionTypeModel } from '../../../types'; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty.test.tsx deleted file mode 100644 index f628457dc5162..0000000000000 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty.test.tsx +++ /dev/null @@ -1,200 +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; - * you may not use this file except in compliance with the Elastic License. - */ -import React, { FunctionComponent } from 'react'; -import { mountWithIntl, nextTick } from 'test_utils/enzyme_helpers'; -import { act } from 'react-dom/test-utils'; -import { TypeRegistry } from '../../type_registry'; -import { registerBuiltInActionTypes } from './index'; -import { ActionTypeModel, ActionParamsProps } from '../../../types'; -import { - PagerDutyActionParams, - EventActionOptions, - SeverityActionOptions, - PagerDutyActionConnector, -} from './types'; - -const ACTION_TYPE_ID = '.pagerduty'; -let actionTypeModel: ActionTypeModel; -let deps: any; - -beforeAll(async () => { - const actionTypeRegistry = new TypeRegistry(); - registerBuiltInActionTypes({ actionTypeRegistry }); - const getResult = actionTypeRegistry.get(ACTION_TYPE_ID); - if (getResult !== null) { - actionTypeModel = getResult; - } - deps = { - docLinks: { ELASTIC_WEBSITE_URL: '', DOC_LINK_VERSION: '' }, - }; -}); - -describe('actionTypeRegistry.get() works', () => { - test('action type static data is as expected', () => { - expect(actionTypeModel.id).toEqual(ACTION_TYPE_ID); - expect(actionTypeModel.iconClass).toEqual('test-file-stub'); - }); -}); - -describe('pagerduty connector validation', () => { - test('connector validation succeeds when connector config is valid', () => { - const actionConnector = { - secrets: { - routingKey: 'test', - }, - id: 'test', - actionTypeId: '.pagerduty', - name: 'pagerduty', - config: { - apiUrl: 'http:\\test', - }, - } as PagerDutyActionConnector; - - expect(actionTypeModel.validateConnector(actionConnector)).toEqual({ - errors: { - routingKey: [], - }, - }); - - delete actionConnector.config.apiUrl; - actionConnector.secrets.routingKey = 'test1'; - expect(actionTypeModel.validateConnector(actionConnector)).toEqual({ - errors: { - routingKey: [], - }, - }); - }); - - test('connector validation fails when connector config is not valid', () => { - const actionConnector = { - secrets: {}, - id: 'test', - actionTypeId: '.pagerduty', - name: 'pagerduty', - config: { - apiUrl: 'http:\\test', - }, - } as PagerDutyActionConnector; - - expect(actionTypeModel.validateConnector(actionConnector)).toEqual({ - errors: { - routingKey: ['A routing key is required.'], - }, - }); - }); -}); - -describe('pagerduty action params validation', () => { - test('action params validation succeeds when action params is valid', () => { - const actionParams = { - eventAction: 'trigger', - dedupKey: 'test', - summary: '2323', - source: 'source', - severity: 'critical', - timestamp: new Date().toISOString(), - component: 'test', - group: 'group', - class: 'test class', - }; - - expect(actionTypeModel.validateParams(actionParams)).toEqual({ - errors: { - summary: [], - timestamp: [], - }, - }); - }); -}); - -describe('PagerDutyActionConnectorFields renders', () => { - test('all connector fields is rendered', async () => { - expect(actionTypeModel.actionConnectorFields).not.toBeNull(); - if (!actionTypeModel.actionConnectorFields) { - return; - } - const ConnectorFields = actionTypeModel.actionConnectorFields; - const actionConnector = { - secrets: { - routingKey: 'test', - }, - id: 'test', - actionTypeId: '.pagerduty', - name: 'pagerduty', - config: { - apiUrl: 'http:\\test', - }, - } as PagerDutyActionConnector; - const wrapper = mountWithIntl( - {}} - editActionSecrets={() => {}} - docLinks={deps!.docLinks} - /> - ); - - await act(async () => { - await nextTick(); - wrapper.update(); - }); - expect(wrapper.find('[data-test-subj="pagerdutyApiUrlInput"]').length > 0).toBeTruthy(); - expect( - wrapper - .find('[data-test-subj="pagerdutyApiUrlInput"]') - .first() - .prop('value') - ).toBe('http:\\test'); - expect(wrapper.find('[data-test-subj="pagerdutyRoutingKeyInput"]').length > 0).toBeTruthy(); - }); -}); - -describe('PagerDutyParamsFields renders', () => { - test('all params fields is rendered', () => { - expect(actionTypeModel.actionParamsFields).not.toBeNull(); - if (!actionTypeModel.actionParamsFields) { - return; - } - const ParamsFields = actionTypeModel.actionParamsFields as FunctionComponent< - ActionParamsProps - >; - const actionParams = { - eventAction: EventActionOptions.TRIGGER, - dedupKey: 'test', - summary: '2323', - source: 'source', - severity: SeverityActionOptions.CRITICAL, - timestamp: new Date().toISOString(), - component: 'test', - group: 'group', - class: 'test class', - }; - const wrapper = mountWithIntl( - {}} - index={0} - /> - ); - expect(wrapper.find('[data-test-subj="severitySelect"]').length > 0).toBeTruthy(); - expect( - wrapper - .find('[data-test-subj="severitySelect"]') - .first() - .prop('value') - ).toStrictEqual('critical'); - expect(wrapper.find('[data-test-subj="eventActionSelect"]').length > 0).toBeTruthy(); - expect(wrapper.find('[data-test-subj="dedupKeyInput"]').length > 0).toBeTruthy(); - expect(wrapper.find('[data-test-subj="timestampInput"]').length > 0).toBeTruthy(); - expect(wrapper.find('[data-test-subj="componentInput"]').length > 0).toBeTruthy(); - expect(wrapper.find('[data-test-subj="groupInput"]').length > 0).toBeTruthy(); - expect(wrapper.find('[data-test-subj="sourceInput"]').length > 0).toBeTruthy(); - expect(wrapper.find('[data-test-subj="pagerdutySummaryInput"]').length > 0).toBeTruthy(); - expect(wrapper.find('[data-test-subj="dedupKeyAddVariableButton"]').length > 0).toBeTruthy(); - }); -}); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty/index.ts b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty/index.ts new file mode 100644 index 0000000000000..9128ec81391ab --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty/index.ts @@ -0,0 +1,7 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { getActionType as getPagerDutyActionType } from './pagerduty'; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty.svg b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty/pagerduty.svg similarity index 100% rename from x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty.svg rename to x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty/pagerduty.svg diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty/pagerduty.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty/pagerduty.test.tsx new file mode 100644 index 0000000000000..ba7eb598c120d --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty/pagerduty.test.tsx @@ -0,0 +1,99 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { TypeRegistry } from '../../../type_registry'; +import { registerBuiltInActionTypes } from '.././index'; +import { ActionTypeModel } from '../../../../types'; +import { PagerDutyActionConnector } from '.././types'; + +const ACTION_TYPE_ID = '.pagerduty'; +let actionTypeModel: ActionTypeModel; + +beforeAll(() => { + const actionTypeRegistry = new TypeRegistry(); + registerBuiltInActionTypes({ actionTypeRegistry }); + const getResult = actionTypeRegistry.get(ACTION_TYPE_ID); + if (getResult !== null) { + actionTypeModel = getResult; + } +}); + +describe('actionTypeRegistry.get() works', () => { + test('action type static data is as expected', () => { + expect(actionTypeModel.id).toEqual(ACTION_TYPE_ID); + expect(actionTypeModel.iconClass).toEqual('test-file-stub'); + }); +}); + +describe('pagerduty connector validation', () => { + test('connector validation succeeds when connector config is valid', () => { + const actionConnector = { + secrets: { + routingKey: 'test', + }, + id: 'test', + actionTypeId: '.pagerduty', + name: 'pagerduty', + config: { + apiUrl: 'http:\\test', + }, + } as PagerDutyActionConnector; + + expect(actionTypeModel.validateConnector(actionConnector)).toEqual({ + errors: { + routingKey: [], + }, + }); + + delete actionConnector.config.apiUrl; + actionConnector.secrets.routingKey = 'test1'; + expect(actionTypeModel.validateConnector(actionConnector)).toEqual({ + errors: { + routingKey: [], + }, + }); + }); + + test('connector validation fails when connector config is not valid', () => { + const actionConnector = { + secrets: {}, + id: 'test', + actionTypeId: '.pagerduty', + name: 'pagerduty', + config: { + apiUrl: 'http:\\test', + }, + } as PagerDutyActionConnector; + + expect(actionTypeModel.validateConnector(actionConnector)).toEqual({ + errors: { + routingKey: ['A routing key is required.'], + }, + }); + }); +}); + +describe('pagerduty action params validation', () => { + test('action params validation succeeds when action params is valid', () => { + const actionParams = { + eventAction: 'trigger', + dedupKey: 'test', + summary: '2323', + source: 'source', + severity: 'critical', + timestamp: new Date().toISOString(), + component: 'test', + group: 'group', + class: 'test class', + }; + + expect(actionTypeModel.validateParams(actionParams)).toEqual({ + errors: { + summary: [], + timestamp: [], + }, + }); + }); +}); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty/pagerduty.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty/pagerduty.tsx new file mode 100644 index 0000000000000..5e29fca397180 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty/pagerduty.tsx @@ -0,0 +1,96 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { lazy } from 'react'; +import { i18n } from '@kbn/i18n'; +import moment from 'moment'; +import { ActionTypeModel, ValidationResult } from '../../../../types'; +import { PagerDutyActionParams, PagerDutyActionConnector } from '.././types'; +import pagerDutySvg from './pagerduty.svg'; +import { hasMustacheTokens } from '../../../lib/has_mustache_tokens'; + +export function getActionType(): ActionTypeModel { + return { + id: '.pagerduty', + iconClass: pagerDutySvg, + selectMessage: i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.pagerDutyAction.selectMessageText', + { + defaultMessage: 'Send an event in PagerDuty.', + } + ), + actionTypeTitle: i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.pagerDutyAction.actionTypeTitle', + { + defaultMessage: 'Send to PagerDuty', + } + ), + validateConnector: (action: PagerDutyActionConnector): ValidationResult => { + const validationResult = { errors: {} }; + const errors = { + routingKey: new Array(), + }; + validationResult.errors = errors; + if (!action.secrets.routingKey) { + errors.routingKey.push( + i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.pagerDutyAction.error.requiredRoutingKeyText', + { + defaultMessage: 'A routing key is required.', + } + ) + ); + } + return validationResult; + }, + validateParams: (actionParams: PagerDutyActionParams): ValidationResult => { + const validationResult = { errors: {} }; + const errors = { + summary: new Array(), + timestamp: new Array(), + }; + validationResult.errors = errors; + if (!actionParams.summary?.length) { + errors.summary.push( + i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.pagerDutyAction.error.requiredSummaryText', + { + defaultMessage: 'Summary is required.', + } + ) + ); + } + if (actionParams.timestamp && !hasMustacheTokens(actionParams.timestamp)) { + if (isNaN(Date.parse(actionParams.timestamp))) { + const { nowShortFormat, nowLongFormat } = getValidTimestampExamples(); + errors.timestamp.push( + i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.pagerDutyAction.error.invalidTimestamp', + { + defaultMessage: + 'Timestamp must be a valid date, such as {nowShortFormat} or {nowLongFormat}.', + values: { + nowShortFormat, + nowLongFormat, + }, + } + ) + ); + } + } + return validationResult; + }, + actionConnectorFields: lazy(() => import('./pagerduty_connectors')), + actionParamsFields: lazy(() => import('./pagerduty_params')), + }; +} + +function getValidTimestampExamples() { + const now = moment(); + return { + nowShortFormat: now.format('YYYY-MM-DD'), + nowLongFormat: now.format('YYYY-MM-DD h:mm:ss'), + }; +} diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty/pagerduty_connectors.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty/pagerduty_connectors.test.tsx new file mode 100644 index 0000000000000..3f3fba1599bd2 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty/pagerduty_connectors.test.tsx @@ -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; + * you may not use this file except in compliance with the Elastic License. + */ +import React from 'react'; +import { mountWithIntl, nextTick } from 'test_utils/enzyme_helpers'; +import { act } from 'react-dom/test-utils'; +import { PagerDutyActionConnector } from '.././types'; +import PagerDutyActionConnectorFields from './pagerduty_connectors'; +import { DocLinksStart } from 'kibana/public'; + +describe('PagerDutyActionConnectorFields renders', () => { + test('all connector fields is rendered', async () => { + const actionConnector = { + secrets: { + routingKey: 'test', + }, + id: 'test', + actionTypeId: '.pagerduty', + name: 'pagerduty', + config: { + apiUrl: 'http:\\test', + }, + } as PagerDutyActionConnector; + const deps = { + docLinks: { ELASTIC_WEBSITE_URL: '', DOC_LINK_VERSION: '' } as DocLinksStart, + }; + + const wrapper = mountWithIntl( + {}} + editActionSecrets={() => {}} + docLinks={deps!.docLinks} + /> + ); + + await act(async () => { + await nextTick(); + wrapper.update(); + }); + + expect(wrapper.find('[data-test-subj="pagerdutyApiUrlInput"]').length > 0).toBeTruthy(); + expect( + wrapper + .find('[data-test-subj="pagerdutyApiUrlInput"]') + .first() + .prop('value') + ).toBe('http:\\test'); + expect(wrapper.find('[data-test-subj="pagerdutyRoutingKeyInput"]').length > 0).toBeTruthy(); + }); +}); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty/pagerduty_connectors.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty/pagerduty_connectors.tsx new file mode 100644 index 0000000000000..48da3f1778b48 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty/pagerduty_connectors.tsx @@ -0,0 +1,89 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React, { Fragment } from 'react'; +import { EuiFieldText, EuiFormRow, EuiLink } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { ActionConnectorFieldsProps } from '../../../../types'; +import { PagerDutyActionConnector } from '.././types'; + +const PagerDutyActionConnectorFields: React.FunctionComponent> = ({ errors, action, editActionConfig, editActionSecrets, docLinks }) => { + const { apiUrl } = action.config; + const { routingKey } = action.secrets; + return ( + + + ) => { + editActionConfig('apiUrl', e.target.value); + }} + onBlur={() => { + if (!apiUrl) { + editActionConfig('apiUrl', ''); + } + }} + /> + + + + + } + error={errors.routingKey} + isInvalid={errors.routingKey.length > 0 && routingKey !== undefined} + label={i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.pagerDutyAction.routingKeyTextFieldLabel', + { + defaultMessage: 'Integration key', + } + )} + > + 0 && routingKey !== undefined} + name="routingKey" + value={routingKey || ''} + data-test-subj="pagerdutyRoutingKeyInput" + onChange={(e: React.ChangeEvent) => { + editActionSecrets('routingKey', e.target.value); + }} + onBlur={() => { + if (!routingKey) { + editActionSecrets('routingKey', ''); + } + }} + /> + + + ); +}; + +// eslint-disable-next-line import/no-default-export +export { PagerDutyActionConnectorFields as default }; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty/pagerduty_params.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty/pagerduty_params.test.tsx new file mode 100644 index 0000000000000..d1b32f545c335 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty/pagerduty_params.test.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; + * you may not use this file except in compliance with the Elastic License. + */ +import React from 'react'; +import { mountWithIntl } from 'test_utils/enzyme_helpers'; +import { EventActionOptions, SeverityActionOptions } from '.././types'; +import PagerDutyParamsFields from './pagerduty_params'; + +describe('PagerDutyParamsFields renders', () => { + test('all params fields is rendered', () => { + const actionParams = { + eventAction: EventActionOptions.TRIGGER, + dedupKey: 'test', + summary: '2323', + source: 'source', + severity: SeverityActionOptions.CRITICAL, + timestamp: new Date().toISOString(), + component: 'test', + group: 'group', + class: 'test class', + }; + const wrapper = mountWithIntl( + {}} + index={0} + /> + ); + expect(wrapper.find('[data-test-subj="severitySelect"]').length > 0).toBeTruthy(); + expect( + wrapper + .find('[data-test-subj="severitySelect"]') + .first() + .prop('value') + ).toStrictEqual('critical'); + expect(wrapper.find('[data-test-subj="eventActionSelect"]').length > 0).toBeTruthy(); + expect(wrapper.find('[data-test-subj="dedupKeyInput"]').length > 0).toBeTruthy(); + expect(wrapper.find('[data-test-subj="timestampInput"]').length > 0).toBeTruthy(); + expect(wrapper.find('[data-test-subj="componentInput"]').length > 0).toBeTruthy(); + expect(wrapper.find('[data-test-subj="groupInput"]').length > 0).toBeTruthy(); + expect(wrapper.find('[data-test-subj="sourceInput"]').length > 0).toBeTruthy(); + expect(wrapper.find('[data-test-subj="pagerdutySummaryInput"]').length > 0).toBeTruthy(); + expect(wrapper.find('[data-test-subj="dedupKeyAddVariableButton"]').length > 0).toBeTruthy(); + }); +}); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty/pagerduty_params.tsx similarity index 67% rename from x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty/pagerduty_params.tsx index 5ad1f2fffecce..590eba5dad936 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/pagerduty/pagerduty_params.tsx @@ -4,178 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ import React, { Fragment } from 'react'; -import { - EuiFieldText, - EuiFlexGroup, - EuiFlexItem, - EuiFormRow, - EuiSelect, - EuiLink, -} from '@elastic/eui'; +import { EuiFieldText, EuiFlexGroup, EuiFlexItem, EuiFormRow, EuiSelect } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { FormattedMessage } from '@kbn/i18n/react'; -import moment from 'moment'; -import { - ActionTypeModel, - ActionConnectorFieldsProps, - ValidationResult, - ActionParamsProps, -} from '../../../types'; -import { PagerDutyActionParams, PagerDutyActionConnector } from './types'; -import pagerDutySvg from './pagerduty.svg'; -import { AddMessageVariables } from '../add_message_variables'; -import { hasMustacheTokens } from '../../lib/has_mustache_tokens'; - -export function getActionType(): ActionTypeModel { - return { - id: '.pagerduty', - iconClass: pagerDutySvg, - selectMessage: i18n.translate( - 'xpack.triggersActionsUI.components.builtinActionTypes.pagerDutyAction.selectMessageText', - { - defaultMessage: 'Send an event in PagerDuty.', - } - ), - actionTypeTitle: i18n.translate( - 'xpack.triggersActionsUI.components.builtinActionTypes.pagerDutyAction.actionTypeTitle', - { - defaultMessage: 'Send to PagerDuty', - } - ), - validateConnector: (action: PagerDutyActionConnector): ValidationResult => { - const validationResult = { errors: {} }; - const errors = { - routingKey: new Array(), - }; - validationResult.errors = errors; - if (!action.secrets.routingKey) { - errors.routingKey.push( - i18n.translate( - 'xpack.triggersActionsUI.components.builtinActionTypes.pagerDutyAction.error.requiredRoutingKeyText', - { - defaultMessage: 'A routing key is required.', - } - ) - ); - } - return validationResult; - }, - validateParams: (actionParams: PagerDutyActionParams): ValidationResult => { - const validationResult = { errors: {} }; - const errors = { - summary: new Array(), - timestamp: new Array(), - }; - validationResult.errors = errors; - if (!actionParams.summary?.length) { - errors.summary.push( - i18n.translate( - 'xpack.triggersActionsUI.components.builtinActionTypes.pagerDutyAction.error.requiredSummaryText', - { - defaultMessage: 'Summary is required.', - } - ) - ); - } - if (actionParams.timestamp && !hasMustacheTokens(actionParams.timestamp)) { - if (isNaN(Date.parse(actionParams.timestamp))) { - const { nowShortFormat, nowLongFormat } = getValidTimestampExamples(); - errors.timestamp.push( - i18n.translate( - 'xpack.triggersActionsUI.components.builtinActionTypes.pagerDutyAction.error.invalidTimestamp', - { - defaultMessage: - 'Timestamp must be a valid date, such as {nowShortFormat} or {nowLongFormat}.', - values: { - nowShortFormat, - nowLongFormat, - }, - } - ) - ); - } - } - return validationResult; - }, - actionConnectorFields: PagerDutyActionConnectorFields, - actionParamsFields: PagerDutyParamsFields, - }; -} - -const PagerDutyActionConnectorFields: React.FunctionComponent> = ({ errors, action, editActionConfig, editActionSecrets, docLinks }) => { - const { apiUrl } = action.config; - const { routingKey } = action.secrets; - return ( - - - ) => { - editActionConfig('apiUrl', e.target.value); - }} - onBlur={() => { - if (!apiUrl) { - editActionConfig('apiUrl', ''); - } - }} - /> - - - - - } - error={errors.routingKey} - isInvalid={errors.routingKey.length > 0 && routingKey !== undefined} - label={i18n.translate( - 'xpack.triggersActionsUI.components.builtinActionTypes.pagerDutyAction.routingKeyTextFieldLabel', - { - defaultMessage: 'Integration key', - } - )} - > - 0 && routingKey !== undefined} - name="routingKey" - value={routingKey || ''} - data-test-subj="pagerdutyRoutingKeyInput" - onChange={(e: React.ChangeEvent) => { - editActionSecrets('routingKey', e.target.value); - }} - onBlur={() => { - if (!routingKey) { - editActionSecrets('routingKey', ''); - } - }} - /> - - - ); -}; +import { ActionParamsProps } from '../../../../types'; +import { PagerDutyActionParams } from '.././types'; +import { AddMessageVariables } from '../../add_message_variables'; const PagerDutyParamsFields: React.FunctionComponent> = ({ actionParams, @@ -561,10 +394,5 @@ const PagerDutyParamsFields: React.FunctionComponent { - const actionTypeRegistry = new TypeRegistry(); - registerBuiltInActionTypes({ actionTypeRegistry }); - const getResult = actionTypeRegistry.get(ACTION_TYPE_ID); - if (getResult !== null) { - actionTypeModel = getResult; - } -}); - -describe('actionTypeRegistry.get() works', () => { - test('action type static data is as expected', () => { - expect(actionTypeModel.id).toEqual(ACTION_TYPE_ID); - expect(actionTypeModel.iconClass).toEqual('logsApp'); - }); -}); - -describe('server-log connector validation', () => { - test('connector validation succeeds when connector config is valid', () => { - const actionConnector = { - secrets: {}, - id: 'test', - actionTypeId: '.server-log', - name: 'server-log', - config: {}, - } as ActionConnector; - - expect(actionTypeModel.validateConnector(actionConnector)).toEqual({ - errors: {}, - }); - }); -}); - -describe('action params validation', () => { - test('action params validation succeeds when action params is valid', () => { - const actionParams = { - message: 'test message', - level: 'trace', - }; - - expect(actionTypeModel.validateParams(actionParams)).toEqual({ - errors: { message: [] }, - }); - }); -}); - -describe('ServerLogParamsFields renders', () => { - test('all params fields is rendered', () => { - expect(actionTypeModel.actionParamsFields).not.toBeNull(); - if (!actionTypeModel.actionParamsFields) { - return; - } - const ParamsFields = actionTypeModel.actionParamsFields as FunctionComponent< - ActionParamsProps - >; - const actionParams = { - level: ServerLogLevelOptions.TRACE, - message: 'test', - }; - const wrapper = mountWithIntl( - {}} - index={0} - defaultMessage={'test default message'} - /> - ); - expect(wrapper.find('[data-test-subj="loggingLevelSelect"]').length > 0).toBeTruthy(); - expect( - wrapper - .find('[data-test-subj="loggingLevelSelect"]') - .first() - .prop('value') - ).toStrictEqual('trace'); - expect(wrapper.find('[data-test-subj="loggingMessageInput"]').length > 0).toBeTruthy(); - }); - - test('level param field is rendered with default value if not selected', () => { - expect(actionTypeModel.actionParamsFields).not.toBeNull(); - if (!actionTypeModel.actionParamsFields) { - return; - } - const ParamsFields = actionTypeModel.actionParamsFields as FunctionComponent< - ActionParamsProps - >; - const actionParams = { - message: 'test message', - level: ServerLogLevelOptions.INFO, - }; - const wrapper = mountWithIntl( - {}} - index={0} - /> - ); - expect(wrapper.find('[data-test-subj="loggingLevelSelect"]').length > 0).toBeTruthy(); - expect( - wrapper - .find('[data-test-subj="loggingLevelSelect"]') - .first() - .prop('value') - ).toStrictEqual('info'); - expect(wrapper.find('[data-test-subj="loggingMessageInput"]').length > 0).toBeTruthy(); - }); - - test('params validation fails when message is not valid', () => { - const actionParams = { - message: '', - }; - - expect(actionTypeModel.validateParams(actionParams)).toEqual({ - errors: { - message: ['Message is required.'], - }, - }); - }); -}); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/server_log/index.ts b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/server_log/index.ts new file mode 100644 index 0000000000000..f85c7460d2ece --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/server_log/index.ts @@ -0,0 +1,7 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { getActionType as getServerLogActionType } from './server_log'; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/server_log/server_log.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/server_log/server_log.test.tsx new file mode 100644 index 0000000000000..3bb5ea68a3040 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/server_log/server_log.test.tsx @@ -0,0 +1,68 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { TypeRegistry } from '../../../type_registry'; +import { registerBuiltInActionTypes } from '.././index'; +import { ActionTypeModel, ActionConnector } from '../../../../types'; + +const ACTION_TYPE_ID = '.server-log'; +let actionTypeModel: ActionTypeModel; + +beforeAll(() => { + const actionTypeRegistry = new TypeRegistry(); + registerBuiltInActionTypes({ actionTypeRegistry }); + const getResult = actionTypeRegistry.get(ACTION_TYPE_ID); + if (getResult !== null) { + actionTypeModel = getResult; + } +}); + +describe('actionTypeRegistry.get() works', () => { + test('action type static data is as expected', () => { + expect(actionTypeModel.id).toEqual(ACTION_TYPE_ID); + expect(actionTypeModel.iconClass).toEqual('logsApp'); + }); +}); + +describe('server-log connector validation', () => { + test('connector validation succeeds when connector config is valid', () => { + const actionConnector = { + secrets: {}, + id: 'test', + actionTypeId: '.server-log', + name: 'server-log', + config: {}, + } as ActionConnector; + + expect(actionTypeModel.validateConnector(actionConnector)).toEqual({ + errors: {}, + }); + }); +}); + +describe('action params validation', () => { + test('action params validation succeeds when action params is valid', () => { + const actionParams = { + message: 'test message', + level: 'trace', + }; + + expect(actionTypeModel.validateParams(actionParams)).toEqual({ + errors: { message: [] }, + }); + }); + + test('params validation fails when message is not valid', () => { + const actionParams = { + message: '', + }; + + expect(actionTypeModel.validateParams(actionParams)).toEqual({ + errors: { + message: ['Message is required.'], + }, + }); + }); +}); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/server_log/server_log.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/server_log/server_log.tsx new file mode 100644 index 0000000000000..390ccf6a494e9 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/server_log/server_log.tsx @@ -0,0 +1,51 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { lazy } from 'react'; +import { i18n } from '@kbn/i18n'; +import { ActionTypeModel, ValidationResult } from '../../../../types'; +import { ServerLogActionParams } from '../types'; + +export function getActionType(): ActionTypeModel { + return { + id: '.server-log', + iconClass: 'logsApp', + selectMessage: i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.serverLogAction.selectMessageText', + { + defaultMessage: 'Add a message to a Kibana log.', + } + ), + actionTypeTitle: i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.serverLogAction.actionTypeTitle', + { + defaultMessage: 'Send to Server log', + } + ), + validateConnector: (): ValidationResult => { + return { errors: {} }; + }, + validateParams: (actionParams: ServerLogActionParams): ValidationResult => { + const validationResult = { errors: {} }; + const errors = { + message: new Array(), + }; + validationResult.errors = errors; + if (!actionParams.message?.length) { + errors.message.push( + i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.error.requiredServerLogMessageText', + { + defaultMessage: 'Message is required.', + } + ) + ); + } + return validationResult; + }, + actionConnectorFields: null, + actionParamsFields: lazy(() => import('./server_log_params')), + }; +} diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/server_log/server_log_params.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/server_log/server_log_params.test.tsx new file mode 100644 index 0000000000000..d2e1d1e4500bc --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/server_log/server_log_params.test.tsx @@ -0,0 +1,58 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React from 'react'; +import { mountWithIntl } from 'test_utils/enzyme_helpers'; +import { ServerLogLevelOptions } from '.././types'; +import ServerLogParamsFields from './server_log_params'; + +describe('ServerLogParamsFields renders', () => { + test('all params fields is rendered', () => { + const actionParams = { + level: ServerLogLevelOptions.TRACE, + message: 'test', + }; + const wrapper = mountWithIntl( + {}} + index={0} + defaultMessage={'test default message'} + /> + ); + expect(wrapper.find('[data-test-subj="loggingLevelSelect"]').length > 0).toBeTruthy(); + expect( + wrapper + .find('[data-test-subj="loggingLevelSelect"]') + .first() + .prop('value') + ).toStrictEqual('trace'); + expect(wrapper.find('[data-test-subj="loggingMessageInput"]').length > 0).toBeTruthy(); + }); + + test('level param field is rendered with default value if not selected', () => { + const actionParams = { + message: 'test message', + level: ServerLogLevelOptions.INFO, + }; + const wrapper = mountWithIntl( + {}} + index={0} + /> + ); + expect(wrapper.find('[data-test-subj="loggingLevelSelect"]').length > 0).toBeTruthy(); + expect( + wrapper + .find('[data-test-subj="loggingLevelSelect"]') + .first() + .prop('value') + ).toStrictEqual('info'); + expect(wrapper.find('[data-test-subj="loggingMessageInput"]').length > 0).toBeTruthy(); + }); +}); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/server_log.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/server_log/server_log_params.tsx similarity index 67% rename from x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/server_log.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/server_log/server_log_params.tsx index a4c83ce76f04e..64d39e238be76 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/server_log.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/server_log/server_log_params.tsx @@ -6,51 +6,9 @@ import React, { Fragment, useEffect } from 'react'; import { i18n } from '@kbn/i18n'; import { EuiSelect, EuiTextArea, EuiFormRow } from '@elastic/eui'; -import { ActionTypeModel, ValidationResult, ActionParamsProps } from '../../../types'; -import { ServerLogActionParams } from './types'; -import { AddMessageVariables } from '../add_message_variables'; - -export function getActionType(): ActionTypeModel { - return { - id: '.server-log', - iconClass: 'logsApp', - selectMessage: i18n.translate( - 'xpack.triggersActionsUI.components.builtinActionTypes.serverLogAction.selectMessageText', - { - defaultMessage: 'Add a message to a Kibana log.', - } - ), - actionTypeTitle: i18n.translate( - 'xpack.triggersActionsUI.components.builtinActionTypes.serverLogAction.actionTypeTitle', - { - defaultMessage: 'Send to Server log', - } - ), - validateConnector: (): ValidationResult => { - return { errors: {} }; - }, - validateParams: (actionParams: ServerLogActionParams): ValidationResult => { - const validationResult = { errors: {} }; - const errors = { - message: new Array(), - }; - validationResult.errors = errors; - if (!actionParams.message?.length) { - errors.message.push( - i18n.translate( - 'xpack.triggersActionsUI.components.builtinActionTypes.error.requiredServerLogMessageText', - { - defaultMessage: 'Message is required.', - } - ) - ); - } - return validationResult; - }, - actionConnectorFields: null, - actionParamsFields: ServerLogParamsFields, - }; -} +import { ActionParamsProps } from '../../../../types'; +import { ServerLogActionParams } from '.././types'; +import { AddMessageVariables } from '../../add_message_variables'; export const ServerLogParamsFields: React.FunctionComponent ); }; + +// eslint-disable-next-line import/no-default-export +export { ServerLogParamsFields as default }; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack.test.tsx deleted file mode 100644 index a2865b27bc06c..0000000000000 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack.test.tsx +++ /dev/null @@ -1,166 +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; - * you may not use this file except in compliance with the Elastic License. - */ -import React, { FunctionComponent } from 'react'; -import { mountWithIntl, nextTick } from 'test_utils/enzyme_helpers'; -import { act } from 'react-dom/test-utils'; -import { TypeRegistry } from '../../type_registry'; -import { registerBuiltInActionTypes } from './index'; -import { ActionTypeModel, ActionParamsProps } from '../../../types'; -import { SlackActionParams, SlackActionConnector } from './types'; - -const ACTION_TYPE_ID = '.slack'; -let actionTypeModel: ActionTypeModel; - -let deps: any; - -beforeAll(async () => { - const actionTypeRegistry = new TypeRegistry(); - registerBuiltInActionTypes({ actionTypeRegistry }); - const getResult = actionTypeRegistry.get(ACTION_TYPE_ID); - if (getResult !== null) { - actionTypeModel = getResult; - } - deps = { - docLinks: { ELASTIC_WEBSITE_URL: '', DOC_LINK_VERSION: '' }, - }; -}); - -describe('actionTypeRegistry.get() works', () => { - test('action type static data is as expected', () => { - expect(actionTypeModel.id).toEqual(ACTION_TYPE_ID); - expect(actionTypeModel.iconClass).toEqual('logoSlack'); - }); -}); - -describe('slack connector validation', () => { - test('connector validation succeeds when connector config is valid', () => { - const actionConnector = { - secrets: { - webhookUrl: 'http:\\test', - }, - id: 'test', - actionTypeId: '.email', - name: 'email', - config: {}, - } as SlackActionConnector; - - expect(actionTypeModel.validateConnector(actionConnector)).toEqual({ - errors: { - webhookUrl: [], - }, - }); - }); - - test('connector validation fails when connector config is not valid', () => { - const actionConnector = { - secrets: {}, - id: 'test', - actionTypeId: '.email', - name: 'email', - config: {}, - } as SlackActionConnector; - - expect(actionTypeModel.validateConnector(actionConnector)).toEqual({ - errors: { - webhookUrl: ['Webhook URL is required.'], - }, - }); - }); -}); - -describe('slack action params validation', () => { - test('if action params validation succeeds when action params is valid', () => { - const actionParams = { - message: 'message {test}', - }; - - expect(actionTypeModel.validateParams(actionParams)).toEqual({ - errors: { message: [] }, - }); - }); -}); - -describe('SlackActionFields renders', () => { - test('all connector fields is rendered', async () => { - expect(actionTypeModel.actionConnectorFields).not.toBeNull(); - if (!actionTypeModel.actionConnectorFields) { - return; - } - const ConnectorFields = actionTypeModel.actionConnectorFields; - const actionConnector = { - secrets: { - webhookUrl: 'http:\\test', - }, - id: 'test', - actionTypeId: '.email', - name: 'email', - config: {}, - } as SlackActionConnector; - const wrapper = mountWithIntl( - {}} - editActionSecrets={() => {}} - docLinks={deps!.docLinks} - /> - ); - - await act(async () => { - await nextTick(); - wrapper.update(); - }); - expect(wrapper.find('[data-test-subj="slackWebhookUrlInput"]').length > 0).toBeTruthy(); - expect( - wrapper - .find('[data-test-subj="slackWebhookUrlInput"]') - .first() - .prop('value') - ).toBe('http:\\test'); - }); -}); - -describe('SlackParamsFields renders', () => { - test('all params fields is rendered', () => { - expect(actionTypeModel.actionParamsFields).not.toBeNull(); - if (!actionTypeModel.actionParamsFields) { - return; - } - const ParamsFields = actionTypeModel.actionParamsFields as FunctionComponent< - ActionParamsProps - >; - const actionParams = { - message: 'test message', - }; - const wrapper = mountWithIntl( - {}} - index={0} - /> - ); - expect(wrapper.find('[data-test-subj="slackMessageTextArea"]').length > 0).toBeTruthy(); - expect( - wrapper - .find('[data-test-subj="slackMessageTextArea"]') - .first() - .prop('value') - ).toStrictEqual('test message'); - }); - - test('params validation fails when message is not valid', () => { - const actionParams = { - message: '', - }; - - expect(actionTypeModel.validateParams(actionParams)).toEqual({ - errors: { - message: ['Message is required.'], - }, - }); - }); -}); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack.tsx deleted file mode 100644 index 03f7a2f492d54..0000000000000 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack.tsx +++ /dev/null @@ -1,188 +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; - * you may not use this file except in compliance with the Elastic License. - */ -import React, { Fragment, useEffect } from 'react'; -import { EuiFieldText, EuiTextArea, EuiFormRow, EuiLink } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; -import { FormattedMessage } from '@kbn/i18n/react'; -import { - ActionTypeModel, - ActionConnectorFieldsProps, - ValidationResult, - ActionParamsProps, -} from '../../../types'; -import { SlackActionParams, SlackActionConnector } from './types'; -import { AddMessageVariables } from '../add_message_variables'; - -export function getActionType(): ActionTypeModel { - return { - id: '.slack', - iconClass: 'logoSlack', - selectMessage: i18n.translate( - 'xpack.triggersActionsUI.components.builtinActionTypes.slackAction.selectMessageText', - { - defaultMessage: 'Send a message to a Slack channel or user.', - } - ), - actionTypeTitle: i18n.translate( - 'xpack.triggersActionsUI.components.builtinActionTypes.slackAction.actionTypeTitle', - { - defaultMessage: 'Send to Slack', - } - ), - validateConnector: (action: SlackActionConnector): ValidationResult => { - const validationResult = { errors: {} }; - const errors = { - webhookUrl: new Array(), - }; - validationResult.errors = errors; - if (!action.secrets.webhookUrl) { - errors.webhookUrl.push( - i18n.translate( - 'xpack.triggersActionsUI.components.builtinActionTypes.slackAction.error.requiredWebhookUrlText', - { - defaultMessage: 'Webhook URL is required.', - } - ) - ); - } - return validationResult; - }, - validateParams: (actionParams: SlackActionParams): ValidationResult => { - const validationResult = { errors: {} }; - const errors = { - message: new Array(), - }; - validationResult.errors = errors; - if (!actionParams.message?.length) { - errors.message.push( - i18n.translate( - 'xpack.triggersActionsUI.components.builtinActionTypes.error.requiredSlackMessageText', - { - defaultMessage: 'Message is required.', - } - ) - ); - } - return validationResult; - }, - actionConnectorFields: SlackActionFields, - actionParamsFields: SlackParamsFields, - }; -} - -const SlackActionFields: React.FunctionComponent> = ({ action, editActionSecrets, errors, docLinks }) => { - const { webhookUrl } = action.secrets; - - return ( - - - - - } - error={errors.webhookUrl} - isInvalid={errors.webhookUrl.length > 0 && webhookUrl !== undefined} - label={i18n.translate( - 'xpack.triggersActionsUI.components.builtinActionTypes.slackAction.webhookUrlTextFieldLabel', - { - defaultMessage: 'Webhook URL', - } - )} - > - 0 && webhookUrl !== undefined} - name="webhookUrl" - placeholder="Example: https://hooks.slack.com/services" - value={webhookUrl || ''} - data-test-subj="slackWebhookUrlInput" - onChange={e => { - editActionSecrets('webhookUrl', e.target.value); - }} - onBlur={() => { - if (!webhookUrl) { - editActionSecrets('webhookUrl', ''); - } - }} - /> - - - ); -}; - -const SlackParamsFields: React.FunctionComponent> = ({ - actionParams, - editAction, - index, - errors, - messageVariables, - defaultMessage, -}) => { - const { message } = actionParams; - useEffect(() => { - if (!message && defaultMessage && defaultMessage.length > 0) { - editAction('message', defaultMessage, index); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, []); - - const onSelectMessageVariable = (paramsProperty: string, variable: string) => { - editAction(paramsProperty, (message ?? '').concat(` {{${variable}}}`), index); - }; - - return ( - - 0 && message !== undefined} - label={i18n.translate( - 'xpack.triggersActionsUI.components.builtinActionTypes.slackAction.messageTextAreaFieldLabel', - { - defaultMessage: 'Message', - } - )} - labelAppend={ - - onSelectMessageVariable('message', variable) - } - paramsProperty="message" - /> - } - > - 0 && message !== undefined} - name="message" - value={message || ''} - data-test-subj="slackMessageTextArea" - onChange={e => { - editAction('message', e.target.value, index); - }} - onBlur={() => { - if (!message) { - editAction('message', '', index); - } - }} - /> - - - ); -}; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack/index.ts b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack/index.ts new file mode 100644 index 0000000000000..64ab6670754c9 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack/index.ts @@ -0,0 +1,7 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { getActionType as getSlackActionType } from './slack'; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack/slack.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack/slack.test.tsx new file mode 100644 index 0000000000000..78f4161cac827 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack/slack.test.tsx @@ -0,0 +1,88 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { TypeRegistry } from '../../../type_registry'; +import { registerBuiltInActionTypes } from '.././index'; +import { ActionTypeModel } from '../../../../types'; +import { SlackActionConnector } from '../types'; + +const ACTION_TYPE_ID = '.slack'; +let actionTypeModel: ActionTypeModel; + +beforeAll(async () => { + const actionTypeRegistry = new TypeRegistry(); + registerBuiltInActionTypes({ actionTypeRegistry }); + const getResult = actionTypeRegistry.get(ACTION_TYPE_ID); + if (getResult !== null) { + actionTypeModel = getResult; + } +}); + +describe('actionTypeRegistry.get() works', () => { + test('action type static data is as expected', () => { + expect(actionTypeModel.id).toEqual(ACTION_TYPE_ID); + expect(actionTypeModel.iconClass).toEqual('logoSlack'); + }); +}); + +describe('slack connector validation', () => { + test('connector validation succeeds when connector config is valid', () => { + const actionConnector = { + secrets: { + webhookUrl: 'http:\\test', + }, + id: 'test', + actionTypeId: '.email', + name: 'email', + config: {}, + } as SlackActionConnector; + + expect(actionTypeModel.validateConnector(actionConnector)).toEqual({ + errors: { + webhookUrl: [], + }, + }); + }); + + test('connector validation fails when connector config is not valid', () => { + const actionConnector = { + secrets: {}, + id: 'test', + actionTypeId: '.email', + name: 'email', + config: {}, + } as SlackActionConnector; + + expect(actionTypeModel.validateConnector(actionConnector)).toEqual({ + errors: { + webhookUrl: ['Webhook URL is required.'], + }, + }); + }); +}); + +describe('slack action params validation', () => { + test('if action params validation succeeds when action params is valid', () => { + const actionParams = { + message: 'message {test}', + }; + + expect(actionTypeModel.validateParams(actionParams)).toEqual({ + errors: { message: [] }, + }); + }); + + test('params validation fails when message is not valid', () => { + const actionParams = { + message: '', + }; + + expect(actionTypeModel.validateParams(actionParams)).toEqual({ + errors: { + message: ['Message is required.'], + }, + }); + }); +}); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack/slack.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack/slack.tsx new file mode 100644 index 0000000000000..5d39cdb5ac387 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack/slack.tsx @@ -0,0 +1,66 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { lazy } from 'react'; +import { i18n } from '@kbn/i18n'; +import { ActionTypeModel, ValidationResult } from '../../../../types'; +import { SlackActionParams, SlackActionConnector } from '../types'; + +export function getActionType(): ActionTypeModel { + return { + id: '.slack', + iconClass: 'logoSlack', + selectMessage: i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.slackAction.selectMessageText', + { + defaultMessage: 'Send a message to a Slack channel or user.', + } + ), + actionTypeTitle: i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.slackAction.actionTypeTitle', + { + defaultMessage: 'Send to Slack', + } + ), + validateConnector: (action: SlackActionConnector): ValidationResult => { + const validationResult = { errors: {} }; + const errors = { + webhookUrl: new Array(), + }; + validationResult.errors = errors; + if (!action.secrets.webhookUrl) { + errors.webhookUrl.push( + i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.slackAction.error.requiredWebhookUrlText', + { + defaultMessage: 'Webhook URL is required.', + } + ) + ); + } + return validationResult; + }, + validateParams: (actionParams: SlackActionParams): ValidationResult => { + const validationResult = { errors: {} }; + const errors = { + message: new Array(), + }; + validationResult.errors = errors; + if (!actionParams.message?.length) { + errors.message.push( + i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.error.requiredSlackMessageText', + { + defaultMessage: 'Message is required.', + } + ) + ); + } + return validationResult; + }, + actionConnectorFields: lazy(() => import('./slack_connectors')), + actionParamsFields: lazy(() => import('./slack_params')), + }; +} diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack/slack_connectors.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack/slack_connectors.test.tsx new file mode 100644 index 0000000000000..7d7f6fc086928 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack/slack_connectors.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; + * you may not use this file except in compliance with the Elastic License. + */ +import React from 'react'; +import { mountWithIntl, nextTick } from 'test_utils/enzyme_helpers'; +import { act } from '@testing-library/react'; +import { SlackActionConnector } from '../types'; +import SlackActionFields from './slack_connectors'; +import { DocLinksStart } from 'kibana/public'; + +describe('SlackActionFields renders', () => { + test('all connector fields is rendered', async () => { + const actionConnector = { + secrets: { + webhookUrl: 'http:\\test', + }, + id: 'test', + actionTypeId: '.email', + name: 'email', + config: {}, + } as SlackActionConnector; + const deps = { + docLinks: { ELASTIC_WEBSITE_URL: '', DOC_LINK_VERSION: '' } as DocLinksStart, + }; + const wrapper = mountWithIntl( + {}} + editActionSecrets={() => {}} + docLinks={deps!.docLinks} + /> + ); + + await act(async () => { + await nextTick(); + wrapper.update(); + }); + expect(wrapper.find('[data-test-subj="slackWebhookUrlInput"]').length > 0).toBeTruthy(); + expect( + wrapper + .find('[data-test-subj="slackWebhookUrlInput"]') + .first() + .prop('value') + ).toBe('http:\\test'); + }); +}); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack/slack_connectors.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack/slack_connectors.tsx new file mode 100644 index 0000000000000..ad3e76ad8ae6c --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack/slack_connectors.tsx @@ -0,0 +1,65 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React, { Fragment } from 'react'; +import { EuiFieldText, EuiFormRow, EuiLink } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n/react'; +import { ActionConnectorFieldsProps } from '../../../../types'; +import { SlackActionConnector } from '../types'; + +const SlackActionFields: React.FunctionComponent> = ({ action, editActionSecrets, errors, docLinks }) => { + const { webhookUrl } = action.secrets; + + return ( + + + + + } + error={errors.webhookUrl} + isInvalid={errors.webhookUrl.length > 0 && webhookUrl !== undefined} + label={i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.slackAction.webhookUrlTextFieldLabel', + { + defaultMessage: 'Webhook URL', + } + )} + > + 0 && webhookUrl !== undefined} + name="webhookUrl" + placeholder="Example: https://hooks.slack.com/services" + value={webhookUrl || ''} + data-test-subj="slackWebhookUrlInput" + onChange={e => { + editActionSecrets('webhookUrl', e.target.value); + }} + onBlur={() => { + if (!webhookUrl) { + editActionSecrets('webhookUrl', ''); + } + }} + /> + + + ); +}; + +// eslint-disable-next-line import/no-default-export +export { SlackActionFields as default }; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack/slack_params.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack/slack_params.test.tsx new file mode 100644 index 0000000000000..4183aeb48dec7 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack/slack_params.test.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; + * you may not use this file except in compliance with the Elastic License. + */ +import React from 'react'; +import { mountWithIntl } from 'test_utils/enzyme_helpers'; +import SlackParamsFields from './slack_params'; + +describe('SlackParamsFields renders', () => { + test('all params fields is rendered', () => { + const actionParams = { + message: 'test message', + }; + const wrapper = mountWithIntl( + {}} + index={0} + /> + ); + expect(wrapper.find('[data-test-subj="slackMessageTextArea"]').length > 0).toBeTruthy(); + expect( + wrapper + .find('[data-test-subj="slackMessageTextArea"]') + .first() + .prop('value') + ).toStrictEqual('test message'); + }); +}); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack/slack_params.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack/slack_params.tsx new file mode 100644 index 0000000000000..42fefdd41ef67 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/slack/slack_params.tsx @@ -0,0 +1,77 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React, { Fragment, useEffect } from 'react'; +import { EuiTextArea, EuiFormRow } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { ActionParamsProps } from '../../../../types'; +import { SlackActionParams } from '../types'; +import { AddMessageVariables } from '../../add_message_variables'; + +const SlackParamsFields: React.FunctionComponent> = ({ + actionParams, + editAction, + index, + errors, + messageVariables, + defaultMessage, +}) => { + const { message } = actionParams; + useEffect(() => { + if (!message && defaultMessage && defaultMessage.length > 0) { + editAction('message', defaultMessage, index); + } + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const onSelectMessageVariable = (paramsProperty: string, variable: string) => { + editAction(paramsProperty, (message ?? '').concat(` {{${variable}}}`), index); + }; + + return ( + + 0 && message !== undefined} + label={i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.slackAction.messageTextAreaFieldLabel', + { + defaultMessage: 'Message', + } + )} + labelAppend={ + + onSelectMessageVariable('message', variable) + } + paramsProperty="message" + /> + } + > + 0 && message !== undefined} + name="message" + value={message || ''} + data-test-subj="slackMessageTextArea" + onChange={e => { + editAction('message', e.target.value, index); + }} + onBlur={() => { + if (!message) { + editAction('message', '', index); + } + }} + /> + + + ); +}; + +// eslint-disable-next-line import/no-default-export +export { SlackParamsFields as default }; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook.test.tsx deleted file mode 100644 index 7d0082708075f..0000000000000 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook.test.tsx +++ /dev/null @@ -1,179 +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; - * you may not use this file except in compliance with the Elastic License. - */ -import React, { FunctionComponent } from 'react'; -import { mountWithIntl } from 'test_utils/enzyme_helpers'; -import { TypeRegistry } from '../../type_registry'; -import { registerBuiltInActionTypes } from './index'; -import { ActionTypeModel, ActionParamsProps } from '../../../types'; -import { WebhookActionParams, WebhookActionConnector } from './types'; - -const ACTION_TYPE_ID = '.webhook'; -let actionTypeModel: ActionTypeModel; - -beforeAll(() => { - const actionTypeRegistry = new TypeRegistry(); - registerBuiltInActionTypes({ actionTypeRegistry }); - const getResult = actionTypeRegistry.get(ACTION_TYPE_ID); - if (getResult !== null) { - actionTypeModel = getResult; - } -}); - -describe('actionTypeRegistry.get() works', () => { - test('action type static data is as expected', () => { - expect(actionTypeModel.id).toEqual(ACTION_TYPE_ID); - expect(actionTypeModel.iconClass).toEqual('logoWebhook'); - }); -}); - -describe('webhook connector validation', () => { - test('connector validation succeeds when connector config is valid', () => { - const actionConnector = { - secrets: { - user: 'user', - password: 'pass', - }, - id: 'test', - actionTypeId: '.webhook', - name: 'webhook', - isPreconfigured: false, - config: { - method: 'PUT', - url: 'http:\\test', - headers: { 'content-type': 'text' }, - }, - } as WebhookActionConnector; - - expect(actionTypeModel.validateConnector(actionConnector)).toEqual({ - errors: { - url: [], - method: [], - user: [], - password: [], - }, - }); - }); - - test('connector validation fails when connector config is not valid', () => { - const actionConnector = { - secrets: { - user: 'user', - }, - id: 'test', - actionTypeId: '.webhook', - name: 'webhook', - config: { - method: 'PUT', - }, - } as WebhookActionConnector; - - expect(actionTypeModel.validateConnector(actionConnector)).toEqual({ - errors: { - url: ['URL is required.'], - method: [], - user: [], - password: ['Password is required.'], - }, - }); - }); -}); - -describe('webhook action params validation', () => { - test('action params validation succeeds when action params is valid', () => { - const actionParams = { - body: 'message {test}', - }; - - expect(actionTypeModel.validateParams(actionParams)).toEqual({ - errors: { body: [] }, - }); - }); -}); - -describe('WebhookActionConnectorFields renders', () => { - test('all connector fields is rendered', () => { - expect(actionTypeModel.actionConnectorFields).not.toBeNull(); - if (!actionTypeModel.actionConnectorFields) { - return; - } - const ConnectorFields = actionTypeModel.actionConnectorFields; - const actionConnector = { - secrets: { - user: 'user', - password: 'pass', - }, - id: 'test', - actionTypeId: '.webhook', - isPreconfigured: false, - name: 'webhook', - config: { - method: 'PUT', - url: 'http:\\test', - headers: { 'content-type': 'text' }, - }, - } as WebhookActionConnector; - const wrapper = mountWithIntl( - {}} - editActionSecrets={() => {}} - /> - ); - expect(wrapper.find('[data-test-subj="webhookViewHeadersSwitch"]').length > 0).toBeTruthy(); - wrapper - .find('[data-test-subj="webhookViewHeadersSwitch"]') - .first() - .simulate('click'); - expect(wrapper.find('[data-test-subj="webhookMethodSelect"]').length > 0).toBeTruthy(); - expect(wrapper.find('[data-test-subj="webhookUrlText"]').length > 0).toBeTruthy(); - expect(wrapper.find('[data-test-subj="webhookUserInput"]').length > 0).toBeTruthy(); - expect(wrapper.find('[data-test-subj="webhookPasswordInput"]').length > 0).toBeTruthy(); - }); -}); - -describe('WebhookParamsFields renders', () => { - test('all params fields is rendered', () => { - expect(actionTypeModel.actionParamsFields).not.toBeNull(); - if (!actionTypeModel.actionParamsFields) { - return; - } - const ParamsFields = actionTypeModel.actionParamsFields as FunctionComponent< - ActionParamsProps - >; - const actionParams = { - body: 'test message', - }; - const wrapper = mountWithIntl( - {}} - index={0} - /> - ); - expect(wrapper.find('[data-test-subj="webhookBodyEditor"]').length > 0).toBeTruthy(); - expect( - wrapper - .find('[data-test-subj="webhookBodyEditor"]') - .first() - .prop('value') - ).toStrictEqual('test message'); - expect(wrapper.find('[data-test-subj="bodyAddVariableButton"]').length > 0).toBeTruthy(); - }); - - test('params validation fails when body is not valid', () => { - const actionParams = { - body: '', - }; - - expect(actionTypeModel.validateParams(actionParams)).toEqual({ - errors: { - body: ['Body is required.'], - }, - }); - }); -}); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook/index.ts b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook/index.ts new file mode 100644 index 0000000000000..c43cab26b072e --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook/index.ts @@ -0,0 +1,7 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +export { getActionType as getWebhookActionType } from './webhook'; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook/webhook.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook/webhook.test.tsx new file mode 100644 index 0000000000000..3413465d70d93 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook/webhook.test.tsx @@ -0,0 +1,104 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { TypeRegistry } from '../../../type_registry'; +import { registerBuiltInActionTypes } from '.././index'; +import { ActionTypeModel } from '../../../../types'; +import { WebhookActionConnector } from '../types'; + +const ACTION_TYPE_ID = '.webhook'; +let actionTypeModel: ActionTypeModel; + +beforeAll(() => { + const actionTypeRegistry = new TypeRegistry(); + registerBuiltInActionTypes({ actionTypeRegistry }); + const getResult = actionTypeRegistry.get(ACTION_TYPE_ID); + if (getResult !== null) { + actionTypeModel = getResult; + } +}); + +describe('actionTypeRegistry.get() works', () => { + test('action type static data is as expected', () => { + expect(actionTypeModel.id).toEqual(ACTION_TYPE_ID); + expect(actionTypeModel.iconClass).toEqual('logoWebhook'); + }); +}); + +describe('webhook connector validation', () => { + test('connector validation succeeds when connector config is valid', () => { + const actionConnector = { + secrets: { + user: 'user', + password: 'pass', + }, + id: 'test', + actionTypeId: '.webhook', + name: 'webhook', + isPreconfigured: false, + config: { + method: 'PUT', + url: 'http:\\test', + headers: { 'content-type': 'text' }, + }, + } as WebhookActionConnector; + + expect(actionTypeModel.validateConnector(actionConnector)).toEqual({ + errors: { + url: [], + method: [], + user: [], + password: [], + }, + }); + }); + + test('connector validation fails when connector config is not valid', () => { + const actionConnector = { + secrets: { + user: 'user', + }, + id: 'test', + actionTypeId: '.webhook', + name: 'webhook', + config: { + method: 'PUT', + }, + } as WebhookActionConnector; + + expect(actionTypeModel.validateConnector(actionConnector)).toEqual({ + errors: { + url: ['URL is required.'], + method: [], + user: [], + password: ['Password is required.'], + }, + }); + }); +}); + +describe('webhook action params validation', () => { + test('action params validation succeeds when action params is valid', () => { + const actionParams = { + body: 'message {test}', + }; + + expect(actionTypeModel.validateParams(actionParams)).toEqual({ + errors: { body: [] }, + }); + }); + + test('params validation fails when body is not valid', () => { + const actionParams = { + body: '', + }; + + expect(actionTypeModel.validateParams(actionParams)).toEqual({ + errors: { + body: ['Body is required.'], + }, + }); + }); +}); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook/webhook.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook/webhook.tsx new file mode 100644 index 0000000000000..9f33e4491233a --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook/webhook.tsx @@ -0,0 +1,99 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { lazy } from 'react'; +import { i18n } from '@kbn/i18n'; +import { ActionTypeModel, ValidationResult } from '../../../../types'; +import { WebhookActionParams, WebhookActionConnector } from '../types'; + +export function getActionType(): ActionTypeModel { + return { + id: '.webhook', + iconClass: 'logoWebhook', + selectMessage: i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.webhookAction.selectMessageText', + { + defaultMessage: 'Send a request to a web service.', + } + ), + actionTypeTitle: i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.webhookAction.actionTypeTitle', + { + defaultMessage: 'Webhook data', + } + ), + validateConnector: (action: WebhookActionConnector): ValidationResult => { + const validationResult = { errors: {} }; + const errors = { + url: new Array(), + method: new Array(), + user: new Array(), + password: new Array(), + }; + validationResult.errors = errors; + if (!action.config.url) { + errors.url.push( + i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.webhookAction.error.requiredUrlText', + { + defaultMessage: 'URL is required.', + } + ) + ); + } + if (!action.config.method) { + errors.method.push( + i18n.translate( + 'xpack.triggersActionsUI.sections.addAction.webhookAction.error.requiredMethodText', + { + defaultMessage: 'Method is required.', + } + ) + ); + } + if (!action.secrets.user && action.secrets.password) { + errors.user.push( + i18n.translate( + 'xpack.triggersActionsUI.sections.addAction.webhookAction.error.requiredHostText', + { + defaultMessage: 'Username is required.', + } + ) + ); + } + if (!action.secrets.password && action.secrets.user) { + errors.password.push( + i18n.translate( + 'xpack.triggersActionsUI.sections.addAction.webhookAction.error.requiredPasswordText', + { + defaultMessage: 'Password is required.', + } + ) + ); + } + return validationResult; + }, + validateParams: (actionParams: WebhookActionParams): ValidationResult => { + const validationResult = { errors: {} }; + const errors = { + body: new Array(), + }; + validationResult.errors = errors; + if (!actionParams.body?.length) { + errors.body.push( + i18n.translate( + 'xpack.triggersActionsUI.components.builtinActionTypes.error.requiredWebhookBodyText', + { + defaultMessage: 'Body is required.', + } + ) + ); + } + return validationResult; + }, + actionConnectorFields: lazy(() => import('./webhook_connectors')), + actionParamsFields: lazy(() => import('./webhook_params')), + }; +} diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook/webhook_connectors.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook/webhook_connectors.test.tsx new file mode 100644 index 0000000000000..842ec51785355 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook/webhook_connectors.test.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; + * you may not use this file except in compliance with the Elastic License. + */ +import React from 'react'; +import { mountWithIntl } from 'test_utils/enzyme_helpers'; +import { WebhookActionConnector } from '../types'; +import WebhookActionConnectorFields from './webhook_connectors'; +import { DocLinksStart } from 'kibana/public'; + +describe('WebhookActionConnectorFields renders', () => { + test('all connector fields is rendered', () => { + const actionConnector = { + secrets: { + user: 'user', + password: 'pass', + }, + id: 'test', + actionTypeId: '.webhook', + isPreconfigured: false, + name: 'webhook', + config: { + method: 'PUT', + url: 'http:\\test', + headers: { 'content-type': 'text' }, + }, + } as WebhookActionConnector; + const wrapper = mountWithIntl( + {}} + editActionSecrets={() => {}} + docLinks={{ ELASTIC_WEBSITE_URL: '', DOC_LINK_VERSION: '' } as DocLinksStart} + /> + ); + expect(wrapper.find('[data-test-subj="webhookViewHeadersSwitch"]').length > 0).toBeTruthy(); + wrapper + .find('[data-test-subj="webhookViewHeadersSwitch"]') + .first() + .simulate('click'); + expect(wrapper.find('[data-test-subj="webhookMethodSelect"]').length > 0).toBeTruthy(); + expect(wrapper.find('[data-test-subj="webhookUrlText"]').length > 0).toBeTruthy(); + expect(wrapper.find('[data-test-subj="webhookUserInput"]').length > 0).toBeTruthy(); + expect(wrapper.find('[data-test-subj="webhookPasswordInput"]').length > 0).toBeTruthy(); + }); +}); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook/webhook_connectors.tsx similarity index 71% rename from x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook.tsx rename to x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook/webhook_connectors.tsx index daa5a6caeabe9..e163463602d9f 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook/webhook_connectors.tsx @@ -19,112 +19,15 @@ import { EuiDescriptionListDescription, EuiDescriptionListTitle, EuiTitle, - EuiCodeEditor, EuiSwitch, EuiButtonEmpty, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { - ActionTypeModel, - ActionConnectorFieldsProps, - ValidationResult, - ActionParamsProps, -} from '../../../types'; -import { WebhookActionParams, WebhookActionConnector } from './types'; -import { AddMessageVariables } from '../add_message_variables'; +import { ActionConnectorFieldsProps } from '../../../../types'; +import { WebhookActionConnector } from '../types'; const HTTP_VERBS = ['post', 'put']; -export function getActionType(): ActionTypeModel { - return { - id: '.webhook', - iconClass: 'logoWebhook', - selectMessage: i18n.translate( - 'xpack.triggersActionsUI.components.builtinActionTypes.webhookAction.selectMessageText', - { - defaultMessage: 'Send a request to a web service.', - } - ), - actionTypeTitle: i18n.translate( - 'xpack.triggersActionsUI.components.builtinActionTypes.webhookAction.actionTypeTitle', - { - defaultMessage: 'Webhook data', - } - ), - validateConnector: (action: WebhookActionConnector): ValidationResult => { - const validationResult = { errors: {} }; - const errors = { - url: new Array(), - method: new Array(), - user: new Array(), - password: new Array(), - }; - validationResult.errors = errors; - if (!action.config.url) { - errors.url.push( - i18n.translate( - 'xpack.triggersActionsUI.components.builtinActionTypes.webhookAction.error.requiredUrlText', - { - defaultMessage: 'URL is required.', - } - ) - ); - } - if (!action.config.method) { - errors.method.push( - i18n.translate( - 'xpack.triggersActionsUI.sections.addAction.webhookAction.error.requiredMethodText', - { - defaultMessage: 'Method is required.', - } - ) - ); - } - if (!action.secrets.user && action.secrets.password) { - errors.user.push( - i18n.translate( - 'xpack.triggersActionsUI.sections.addAction.webhookAction.error.requiredHostText', - { - defaultMessage: 'Username is required.', - } - ) - ); - } - if (!action.secrets.password && action.secrets.user) { - errors.password.push( - i18n.translate( - 'xpack.triggersActionsUI.sections.addAction.webhookAction.error.requiredPasswordText', - { - defaultMessage: 'Password is required.', - } - ) - ); - } - return validationResult; - }, - validateParams: (actionParams: WebhookActionParams): ValidationResult => { - const validationResult = { errors: {} }; - const errors = { - body: new Array(), - }; - validationResult.errors = errors; - if (!actionParams.body?.length) { - errors.body.push( - i18n.translate( - 'xpack.triggersActionsUI.components.builtinActionTypes.error.requiredWebhookBodyText', - { - defaultMessage: 'Body is required.', - } - ) - ); - } - return validationResult; - }, - actionConnectorFields: WebhookActionConnectorFields, - actionParamsFields: WebhookParamsFields, - }; -} - const WebhookActionConnectorFields: React.FunctionComponent> = ({ action, editActionConfig, editActionSecrets, errors }) => { @@ -457,56 +360,5 @@ const WebhookActionConnectorFields: React.FunctionComponent> = ({ - actionParams, - editAction, - index, - messageVariables, - errors, -}) => { - const { body } = actionParams; - const onSelectMessageVariable = (paramsProperty: string, variable: string) => { - editAction(paramsProperty, (body ?? '').concat(` {{${variable}}}`), index); - }; - return ( - - 0 && body !== undefined} - fullWidth - error={errors.body} - labelAppend={ - onSelectMessageVariable('body', variable)} - paramsProperty="body" - /> - } - > - { - editAction('body', json, index); - }} - /> - - - ); -}; +// eslint-disable-next-line import/no-default-export +export { WebhookActionConnectorFields as default }; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook/webhook_params.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook/webhook_params.test.tsx new file mode 100644 index 0000000000000..5ca27a53083f9 --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook/webhook_params.test.tsx @@ -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; + * you may not use this file except in compliance with the Elastic License. + */ +import React from 'react'; +import { mountWithIntl } from 'test_utils/enzyme_helpers'; +import WebhookParamsFields from './webhook_params'; + +describe('WebhookParamsFields renders', () => { + test('all params fields is rendered', () => { + const actionParams = { + body: 'test message', + }; + const wrapper = mountWithIntl( + {}} + index={0} + /> + ); + expect(wrapper.find('[data-test-subj="webhookBodyEditor"]').length > 0).toBeTruthy(); + expect( + wrapper + .find('[data-test-subj="webhookBodyEditor"]') + .first() + .prop('value') + ).toStrictEqual('test message'); + expect(wrapper.find('[data-test-subj="bodyAddVariableButton"]').length > 0).toBeTruthy(); + }); +}); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook/webhook_params.tsx b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook/webhook_params.tsx new file mode 100644 index 0000000000000..9e802b96e16be --- /dev/null +++ b/x-pack/plugins/triggers_actions_ui/public/application/components/builtin_action_types/webhook/webhook_params.tsx @@ -0,0 +1,68 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import React, { Fragment } from 'react'; +import { EuiFormRow, EuiCodeEditor } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { ActionParamsProps } from '../../../../types'; +import { WebhookActionParams } from '../types'; +import { AddMessageVariables } from '../../add_message_variables'; + +const WebhookParamsFields: React.FunctionComponent> = ({ + actionParams, + editAction, + index, + messageVariables, + errors, +}) => { + const { body } = actionParams; + const onSelectMessageVariable = (paramsProperty: string, variable: string) => { + editAction(paramsProperty, (body ?? '').concat(` {{${variable}}}`), index); + }; + return ( + + 0 && body !== undefined} + fullWidth + error={errors.body} + labelAppend={ + onSelectMessageVariable('body', variable)} + paramsProperty="body" + /> + } + > + { + editAction('body', json, index); + }} + /> + + + ); +}; + +// eslint-disable-next-line import/no-default-export +export { WebhookParamsFields as default }; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/home.tsx b/x-pack/plugins/triggers_actions_ui/public/application/home.tsx index 4d0a9980f2231..b5f3b63c58a93 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/home.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/home.tsx @@ -167,3 +167,6 @@ export const TriggersActionsUIHome: React.FunctionComponent ); }; + +// eslint-disable-next-line import/no-default-export +export { TriggersActionsUIHome as default }; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_connector_form.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_connector_form.tsx index 6bb8a8f4e4c10..06ddce39567a4 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_connector_form.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_connector_form.tsx @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import React, { Fragment } from 'react'; +import React, { Fragment, Suspense } from 'react'; import { EuiForm, EuiCallOut, @@ -12,6 +12,9 @@ import { EuiSpacer, EuiFieldText, EuiFormRow, + EuiLoadingSpinner, + EuiFlexGroup, + EuiFlexItem, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; @@ -151,14 +154,24 @@ export const ActionConnectorForm = ({ {FieldsComponent !== null ? ( - + + + + + + } + > + + ) : null} ); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_form.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_form.tsx index 6935dda358d9c..ae179f56f0c83 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_form.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/action_connector_form/action_form.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import React, { Fragment, useState, useEffect } from 'react'; +import React, { Fragment, Suspense, useState, useEffect } from 'react'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { @@ -27,6 +27,7 @@ import { EuiCallOut, EuiHorizontalRule, EuiText, + EuiLoadingSpinner, } from '@elastic/eui'; import { HttpSetup, ToastsApi, ApplicationStart, DocLinksStart } from 'kibana/public'; import { loadActionTypes, loadAllActions as loadConnectors } from '../../lib/action_connector_api'; @@ -282,14 +283,24 @@ export const ActionForm = ({ {ParamsFieldsComponent ? ( - + + + + + + } + > + + ) : null} ) : ( diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details_route.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details_route.tsx index 9198607df7863..0caa880c4df00 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details_route.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details_route.tsx @@ -118,6 +118,6 @@ export async function getAlertData( } } -export const AlertDetailsRouteWithApi = withActionOperations( - withBulkAlertOperations(AlertDetailsRoute) -); +const AlertDetailsRouteWithApi = withActionOperations(withBulkAlertOperations(AlertDetailsRoute)); +// eslint-disable-next-line import/no-default-export +export { AlertDetailsRouteWithApi as default }; diff --git a/x-pack/plugins/triggers_actions_ui/public/application/type_registry.test.ts b/x-pack/plugins/triggers_actions_ui/public/application/type_registry.test.ts index 93e61cf5b4f43..62173a6196b98 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/type_registry.test.ts +++ b/x-pack/plugins/triggers_actions_ui/public/application/type_registry.test.ts @@ -23,7 +23,11 @@ const getTestAlertType = (id?: string, name?: string, iconClass?: string) => { }; }; -const getTestActionType = (id?: string, iconClass?: string, selectedMessage?: string) => { +const getTestActionType = ( + id?: string, + iconClass?: string, + selectedMessage?: string +): ActionTypeModel => { return { id: id || 'my-action-type', iconClass: iconClass || 'test', diff --git a/x-pack/plugins/triggers_actions_ui/public/types.ts b/x-pack/plugins/triggers_actions_ui/public/types.ts index 6f33bcb8b226d..cc511434267cc 100644 --- a/x-pack/plugins/triggers_actions_ui/public/types.ts +++ b/x-pack/plugins/triggers_actions_ui/public/types.ts @@ -4,6 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ import { HttpSetup, DocLinksStart } from 'kibana/public'; +import { ComponentType } from 'react'; import { ActionGroup } from '../../alerting/common'; import { ActionType } from '../../actions/common'; import { TypeRegistry } from './application/type_registry'; @@ -19,14 +20,16 @@ export { ActionType }; export type ActionTypeIndex = Record; export type AlertTypeIndex = Record; -export type ActionTypeRegistryContract = PublicMethodsOf>; +export type ActionTypeRegistryContract = PublicMethodsOf< + TypeRegistry> +>; export type AlertTypeRegistryContract = PublicMethodsOf>; export interface ActionConnectorFieldsProps { action: TActionConnector; editActionConfig: (property: string, value: any) => void; editActionSecrets: (property: string, value: any) => void; - errors: { [key: string]: string[] }; + errors: IErrorObject; docLinks: DocLinksStart; http?: HttpSetup; } @@ -35,7 +38,7 @@ export interface ActionParamsProps { actionParams: TParams; index: number; editAction: (property: string, value: any, index: number) => void; - errors: { [key: string]: string[] }; + errors: IErrorObject; messageVariables?: string[]; defaultMessage?: string; } @@ -45,15 +48,19 @@ export interface Pagination { size: number; } -export interface ActionTypeModel { +export interface ActionTypeModel { id: string; iconClass: string; selectMessage: string; actionTypeTitle?: string; validateConnector: (connector: any) => ValidationResult; validateParams: (actionParams: any) => ValidationResult; - actionConnectorFields: React.FunctionComponent | null; - actionParamsFields: any; + actionConnectorFields: React.LazyExoticComponent< + ComponentType> + > | null; + actionParamsFields: React.LazyExoticComponent< + ComponentType> + > | null; } export interface ValidationResult { From 398b6600458e7d8d2b7cd1657f920fd2980cc83f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20Haro?= Date: Thu, 7 May 2020 17:53:27 +0100 Subject: [PATCH 004/102] [Fix] Monitoring failing to start (#65516) --- .../monitoring/server/kibana_monitoring/bulk_uploader.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/monitoring/server/kibana_monitoring/bulk_uploader.js b/x-pack/plugins/monitoring/server/kibana_monitoring/bulk_uploader.js index b90a9aa7d139a..0722a80dc2c11 100644 --- a/x-pack/plugins/monitoring/server/kibana_monitoring/bulk_uploader.js +++ b/x-pack/plugins/monitoring/server/kibana_monitoring/bulk_uploader.js @@ -140,7 +140,7 @@ export class BulkUploader { async _fetchAndUpload(usageCollection) { const collectorsReady = await usageCollection.areAllCollectorsReady(); const hasUsageCollectors = usageCollection.some(usageCollection.isUsageCollector); - if (!collectorsReady) { + if (!collectorsReady || typeof this.kibanaStatusGetter !== 'function') { this._log.debug('Skipping bulk uploading because not all collectors are ready'); if (hasUsageCollectors) { this._lastFetchUsageTime = null; @@ -151,7 +151,7 @@ export class BulkUploader { const data = await usageCollection.bulkFetch(this._cluster.callAsInternalUser); const payload = this.toBulkUploadFormat(compact(data), usageCollection); - if (payload) { + if (payload && payload.length > 0) { try { this._log.debug(`Uploading bulk stats payload to the local cluster`); const result = await this._onPayload(payload); @@ -244,7 +244,7 @@ export class BulkUploader { */ toBulkUploadFormat(rawData, usageCollection) { if (rawData.length === 0) { - return; + return []; } // convert the raw data to a nested object by taking each payload through From e029e35a5be12ad206093f0ba0d2ef2d858cf38e Mon Sep 17 00:00:00 2001 From: Lee Drengenberg Date: Thu, 7 May 2020 17:14:26 +0000 Subject: [PATCH 005/102] remove navigate from createIndexPattern and pass insertTimstamp to browser.get() (#65507) --- test/functional/apps/discover/_discover_histogram.js | 2 +- test/functional/apps/getting_started/_shakespeare.js | 1 + test/functional/page_objects/common_page.ts | 4 ++-- test/functional/page_objects/settings_page.ts | 1 - x-pack/test/functional/apps/graph/graph.ts | 1 + .../test/functional/apps/security/doc_level_security_roles.js | 1 + 6 files changed, 6 insertions(+), 4 deletions(-) diff --git a/test/functional/apps/discover/_discover_histogram.js b/test/functional/apps/discover/_discover_histogram.js index 20e69ef8345c6..0f63510dce431 100644 --- a/test/functional/apps/discover/_discover_histogram.js +++ b/test/functional/apps/discover/_discover_histogram.js @@ -35,7 +35,7 @@ export default function({ getService, getPageObjects }) { describe('discover histogram', function describeIndexTests() { before(async function() { log.debug('load kibana index with default index pattern'); - await PageObjects.common.navigateToApp('home'); + await PageObjects.common.navigateToApp('settings'); await security.testUser.setRoles([ 'kibana_admin', 'test_logstash_reader', diff --git a/test/functional/apps/getting_started/_shakespeare.js b/test/functional/apps/getting_started/_shakespeare.js index 3a3d6b93e166b..b0a572d9a54f9 100644 --- a/test/functional/apps/getting_started/_shakespeare.js +++ b/test/functional/apps/getting_started/_shakespeare.js @@ -58,6 +58,7 @@ export default function({ getService, getPageObjects }) { }); it('should create shakespeare index pattern', async function() { + await PageObjects.common.navigateToApp('settings'); log.debug('Create shakespeare index pattern'); await PageObjects.settings.createIndexPattern('shakespeare', null); const patternName = await PageObjects.settings.getIndexPageHeading(); diff --git a/test/functional/page_objects/common_page.ts b/test/functional/page_objects/common_page.ts index 93debdcc37f0a..4a7570049ded7 100644 --- a/test/functional/page_objects/common_page.ts +++ b/test/functional/page_objects/common_page.ts @@ -111,7 +111,7 @@ export function CommonPageProvider({ getService, getPageObjects }: FtrProviderCo await browser.get(appUrl); } else { log.debug(`navigateToUrl ${appUrl}`); - await browser.get(appUrl); + await browser.get(appUrl, insertTimestamp); // accept alert if it pops up const alert = await browser.getAlert(); await alert?.accept(); @@ -242,7 +242,7 @@ export function CommonPageProvider({ getService, getPageObjects }: FtrProviderCo let lastUrl = await retry.try(async () => { // since we're using hash URLs, always reload first to force re-render log.debug('navigate to: ' + appUrl); - await browser.get(appUrl); + await browser.get(appUrl, insertTimestamp); // accept alert if it pops up const alert = await browser.getAlert(); await alert?.accept(); diff --git a/test/functional/page_objects/settings_page.ts b/test/functional/page_objects/settings_page.ts index b7a6e10efd7dc..8175361ffc842 100644 --- a/test/functional/page_objects/settings_page.ts +++ b/test/functional/page_objects/settings_page.ts @@ -324,7 +324,6 @@ export function SettingsPageProvider({ getService, getPageObjects }: FtrProvider isStandardIndexPattern = true ) { await retry.try(async () => { - await this.navigateTo(); await PageObjects.header.waitUntilLoadingHasFinished(); await this.clickKibanaIndexPatterns(); await PageObjects.header.waitUntilLoadingHasFinished(); diff --git a/x-pack/test/functional/apps/graph/graph.ts b/x-pack/test/functional/apps/graph/graph.ts index fcf7298c5577a..d8214dc5ffefd 100644 --- a/x-pack/test/functional/apps/graph/graph.ts +++ b/x-pack/test/functional/apps/graph/graph.ts @@ -19,6 +19,7 @@ export default function({ getService, getPageObjects }: FtrProviderContext) { log.debug('load graph/secrepo data'); await esArchiver.loadIfNeeded('graph/secrepo'); await esArchiver.load('empty_kibana'); + await PageObjects.common.navigateToApp('settings'); log.debug('create secrepo index pattern'); await PageObjects.settings.createIndexPattern('secrepo', '@timestamp'); log.debug('navigateTo graph'); diff --git a/x-pack/test/functional/apps/security/doc_level_security_roles.js b/x-pack/test/functional/apps/security/doc_level_security_roles.js index 480fa6599e036..47a882a33eed8 100644 --- a/x-pack/test/functional/apps/security/doc_level_security_roles.js +++ b/x-pack/test/functional/apps/security/doc_level_security_roles.js @@ -21,6 +21,7 @@ export default function({ getService, getPageObjects }) { await esArchiver.loadIfNeeded('security/dlstest'); await browser.setWindowSize(1600, 1000); + await PageObjects.common.navigateToApp('settings'); await PageObjects.settings.createIndexPattern('dlstest', null); await PageObjects.settings.navigateTo(); From fe26a79608b54e98e5e14dea323a17e4d1fdbf2f Mon Sep 17 00:00:00 2001 From: Frank Hassanabad Date: Thu, 7 May 2020 11:18:27 -0600 Subject: [PATCH 006/102] [SIEM][Detection Engine] Moves functional tests from legacyEs to Es and improves types (#65709) Moves functional tests from "legacyEs" to "Es" and improves types - [x] [Unit or functional tests](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#cross-browser-compatibility) were updated or added to match the most common scenarios --- .../tests/add_prepackaged_rules.ts | 2 +- .../security_and_spaces/tests/create_rules.ts | 2 +- .../tests/create_rules_bulk.ts | 2 +- .../security_and_spaces/tests/delete_rules.ts | 2 +- .../tests/delete_rules_bulk.ts | 2 +- .../security_and_spaces/tests/export_rules.ts | 2 +- .../security_and_spaces/tests/find_rules.ts | 2 +- .../tests/find_statuses.ts | 2 +- .../tests/get_prepackaged_rules_status.ts | 2 +- .../security_and_spaces/tests/import_rules.ts | 2 +- .../security_and_spaces/tests/patch_rules.ts | 2 +- .../tests/patch_rules_bulk.ts | 2 +- .../security_and_spaces/tests/read_rules.ts | 2 +- .../security_and_spaces/tests/update_rules.ts | 2 +- .../tests/update_rules_bulk.ts | 2 +- .../security_and_spaces/tests/utils.ts | 25 +++++++++++++------ 16 files changed, 32 insertions(+), 23 deletions(-) diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/add_prepackaged_rules.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/add_prepackaged_rules.ts index e787a3594dfe6..602b9929485e0 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/add_prepackaged_rules.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/add_prepackaged_rules.ts @@ -13,7 +13,7 @@ import { createSignalsIndex, deleteAllAlerts, deleteSignalsIndex } from './utils // eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext): void => { const supertest = getService('supertest'); - const es = getService('legacyEs'); + const es = getService('es'); describe('add_prepackaged_rules', () => { describe('validation errors', () => { diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_rules.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_rules.ts index 46645a9b5a944..43630d81e64ea 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_rules.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_rules.ts @@ -25,7 +25,7 @@ import { // eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); - const es = getService('legacyEs'); + const es = getService('es'); describe('create_rules', () => { describe('validation errors', () => { diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_rules_bulk.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_rules_bulk.ts index 117300be417d5..7d406777e23f0 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_rules_bulk.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/create_rules_bulk.ts @@ -23,7 +23,7 @@ import { // eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext): void => { const supertest = getService('supertest'); - const es = getService('legacyEs'); + const es = getService('es'); describe('create_rules_bulk', () => { describe('validation errors', () => { diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/delete_rules.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/delete_rules.ts index fb701681419d8..4902060f2c6ee 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/delete_rules.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/delete_rules.ts @@ -23,7 +23,7 @@ import { // eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext): void => { const supertest = getService('supertest'); - const es = getService('legacyEs'); + const es = getService('es'); describe('delete_rules', () => { describe('deleting rules', () => { diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/delete_rules_bulk.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/delete_rules_bulk.ts index ac58ba4c77e4e..8ddb5f0656019 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/delete_rules_bulk.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/delete_rules_bulk.ts @@ -23,7 +23,7 @@ import { // eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext): void => { const supertest = getService('supertest'); - const es = getService('legacyEs'); + const es = getService('es'); describe('delete_rules_bulk', () => { describe('deleting rules bulk using DELETE', () => { diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/export_rules.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/export_rules.ts index 51bdb9e45dc0c..ed1f92457e782 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/export_rules.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/export_rules.ts @@ -21,7 +21,7 @@ import { // eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext): void => { const supertest = getService('supertest'); - const es = getService('legacyEs'); + const es = getService('es'); describe('export_rules', () => { describe('exporting rules', () => { diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/find_rules.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/find_rules.ts index feb4ecd125f7e..c0356f877377a 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/find_rules.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/find_rules.ts @@ -22,7 +22,7 @@ import { // eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext): void => { const supertest = getService('supertest'); - const es = getService('legacyEs'); + const es = getService('es'); describe('find_rules', () => { beforeEach(async () => { diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/find_statuses.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/find_statuses.ts index 44847d5c8146c..b4c9632320271 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/find_statuses.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/find_statuses.ts @@ -19,7 +19,7 @@ import { // eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext): void => { const supertest = getService('supertest'); - const es = getService('legacyEs'); + const es = getService('es'); describe('find_statuses', () => { beforeEach(async () => { diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/get_prepackaged_rules_status.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/get_prepackaged_rules_status.ts index e2dce77c1d70a..a366c04330e9b 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/get_prepackaged_rules_status.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/get_prepackaged_rules_status.ts @@ -16,7 +16,7 @@ import { createSignalsIndex, deleteAllAlerts, deleteSignalsIndex, getSimpleRule // eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext): void => { const supertest = getService('supertest'); - const es = getService('legacyEs'); + const es = getService('es'); describe('get_prepackaged_rules_status', () => { describe('getting prepackaged rules status', () => { diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/import_rules.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/import_rules.ts index 868dafedc6849..ac0f51abe1c10 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/import_rules.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/import_rules.ts @@ -22,7 +22,7 @@ import { // eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext): void => { const supertest = getService('supertest'); - const es = getService('legacyEs'); + const es = getService('es'); describe('import_rules', () => { describe('importing rules without an index', () => { diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/patch_rules.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/patch_rules.ts index c3ecf79e58955..295bd456eeebf 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/patch_rules.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/patch_rules.ts @@ -22,7 +22,7 @@ import { // eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); - const es = getService('legacyEs'); + const es = getService('es'); describe('patch_rules', () => { describe('patch rules', () => { diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/patch_rules_bulk.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/patch_rules_bulk.ts index 8515d1cf404ea..14c9ca76f6aac 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/patch_rules_bulk.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/patch_rules_bulk.ts @@ -22,7 +22,7 @@ import { // eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); - const es = getService('legacyEs'); + const es = getService('es'); describe('patch_rules_bulk', () => { describe('patch rules bulk', () => { diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/read_rules.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/read_rules.ts index 4d7449dae2dbd..1ae6871348bbb 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/read_rules.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/read_rules.ts @@ -23,7 +23,7 @@ import { // eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); - const es = getService('legacyEs'); + const es = getService('es'); describe('read_rules', () => { describe('reading rules', () => { diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/update_rules.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/update_rules.ts index 4b81b7d4304b2..42501c005d994 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/update_rules.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/update_rules.ts @@ -22,7 +22,7 @@ import { // eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); - const es = getService('legacyEs'); + const es = getService('es'); describe('update_rules', () => { describe('update rules', () => { diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/update_rules_bulk.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/update_rules_bulk.ts index 760e17ae1752e..b7f998d4043f7 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/update_rules_bulk.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/update_rules_bulk.ts @@ -22,7 +22,7 @@ import { // eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertest'); - const es = getService('legacyEs'); + const es = getService('es'); describe('update_rules_bulk', () => { describe('update rules bulk', () => { diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/utils.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/utils.ts index e508cf1aaa2e0..5eabecf96f3e6 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/utils.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/tests/utils.ts @@ -4,6 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ +import { Client } from '@elastic/elasticsearch'; +import { SuperTest } from 'supertest'; +import supertestAsPromised from 'supertest-as-promised'; import { OutputRuleAlertRest } from '../../../../plugins/siem/server/lib/detection_engine/types'; import { DETECTION_ENGINE_INDEX_URL } from '../../../../plugins/siem/common/constants'; @@ -187,12 +190,13 @@ export const getSimpleMlRuleOutput = (ruleId = 'rule-1'): Partial => { +export const deleteAllAlerts = async (es: Client): Promise => { await es.deleteByQuery({ index: '.kibana', q: 'type:alert', - waitForCompletion: true, - refresh: 'wait_for', + wait_for_completion: true, + refresh: true, + body: {}, }); }; @@ -200,12 +204,13 @@ export const deleteAllAlerts = async (es: any): Promise => { * Remove all rules statuses from the .kibana index * @param es The ElasticSearch handle */ -export const deleteAllRulesStatuses = async (es: any): Promise => { +export const deleteAllRulesStatuses = async (es: Client): Promise => { await es.deleteByQuery({ index: '.kibana', q: 'type:siem-detection-engine-rule-status', - waitForCompletion: true, - refresh: 'wait_for', + wait_for_completion: true, + refresh: true, + body: {}, }); }; @@ -213,7 +218,9 @@ export const deleteAllRulesStatuses = async (es: any): Promise => { * Creates the signals index for use inside of beforeEach blocks of tests * @param supertest The supertest client library */ -export const createSignalsIndex = async (supertest: any): Promise => { +export const createSignalsIndex = async ( + supertest: SuperTest +): Promise => { await supertest .post(DETECTION_ENGINE_INDEX_URL) .set('kbn-xsrf', 'true') @@ -225,7 +232,9 @@ export const createSignalsIndex = async (supertest: any): Promise => { * Deletes the signals index for use inside of afterEach blocks of tests * @param supertest The supertest client library */ -export const deleteSignalsIndex = async (supertest: any): Promise => { +export const deleteSignalsIndex = async ( + supertest: SuperTest +): Promise => { await supertest .delete(DETECTION_ENGINE_INDEX_URL) .set('kbn-xsrf', 'true') From 7d0ac59bc9824f817ad35d6083e07a4601dd48d3 Mon Sep 17 00:00:00 2001 From: Aaron Caldwell Date: Thu, 7 May 2020 11:22:00 -0600 Subject: [PATCH 007/102] Migrate Region Maps to NP (#64272) --- .i18nrc.json | 2 +- src/legacy/core_plugins/region_map/index.ts | 49 ---------------- src/plugins/maps_legacy/config.ts | 26 +-------- src/plugins/maps_legacy/public/index.ts | 1 + src/plugins/region_map/config.ts | 46 +++++++++++++++ src/plugins/region_map/kibana.json | 14 +++++ .../region_map/package.json | 0 .../__snapshots__/region_map_fn.test.js.snap | 0 .../public/__tests__/aftercolorchange.png | Bin .../public/__tests__/afterdatachange.png | Bin .../__tests__/afterdatachangeandresize.png | Bin .../public/__tests__/afterresize.png | Bin .../public/__tests__/changestartup.png | Bin .../region_map/public/__tests__/initial.png | Bin .../__tests__/region_map_visualization.js | 22 +++---- .../region_map/public/__tests__/toiso3.png | Bin .../region_map/public/__tests__/world.json | 0 .../region_map/public/choropleth_layer.js | 8 +-- .../public/components/region_map_options.tsx | 14 +---- .../region_map/public/index.ts | 7 ++- .../region_map/public/kibana_services.ts | 30 ++++++++++ .../region_map/public/plugin.ts | 54 +++++++++++++----- .../region_map/public/region_map_fn.js | 0 .../region_map/public/region_map_fn.test.js | 4 +- .../region_map/public/region_map_type.js | 6 +- .../public/region_map_visualization.js | 13 ++--- .../region_map/public/tooltip_formatter.js | 0 .../region_map/public/util.ts | 4 +- .../region_map/server/index.ts} | 25 ++++---- .../test_suites/run_pipeline/basic.ts | 9 ++- 30 files changed, 185 insertions(+), 149 deletions(-) delete mode 100644 src/legacy/core_plugins/region_map/index.ts create mode 100644 src/plugins/region_map/config.ts create mode 100644 src/plugins/region_map/kibana.json rename src/{legacy/core_plugins => plugins}/region_map/package.json (100%) rename src/{legacy/core_plugins => plugins}/region_map/public/__snapshots__/region_map_fn.test.js.snap (100%) rename src/{legacy/core_plugins => plugins}/region_map/public/__tests__/aftercolorchange.png (100%) rename src/{legacy/core_plugins => plugins}/region_map/public/__tests__/afterdatachange.png (100%) rename src/{legacy/core_plugins => plugins}/region_map/public/__tests__/afterdatachangeandresize.png (100%) rename src/{legacy/core_plugins => plugins}/region_map/public/__tests__/afterresize.png (100%) rename src/{legacy/core_plugins => plugins}/region_map/public/__tests__/changestartup.png (100%) rename src/{legacy/core_plugins => plugins}/region_map/public/__tests__/initial.png (100%) rename src/{legacy/core_plugins => plugins}/region_map/public/__tests__/region_map_visualization.js (92%) rename src/{legacy/core_plugins => plugins}/region_map/public/__tests__/toiso3.png (100%) rename src/{legacy/core_plugins => plugins}/region_map/public/__tests__/world.json (100%) rename src/{legacy/core_plugins => plugins}/region_map/public/choropleth_layer.js (98%) rename src/{legacy/core_plugins => plugins}/region_map/public/components/region_map_options.tsx (95%) rename src/{legacy/core_plugins => plugins}/region_map/public/index.ts (86%) create mode 100644 src/plugins/region_map/public/kibana_services.ts rename src/{legacy/core_plugins => plugins}/region_map/public/plugin.ts (56%) rename src/{legacy/core_plugins => plugins}/region_map/public/region_map_fn.js (100%) rename src/{legacy/core_plugins => plugins}/region_map/public/region_map_fn.test.js (92%) rename src/{legacy/core_plugins => plugins}/region_map/public/region_map_type.js (95%) rename src/{legacy/core_plugins => plugins}/region_map/public/region_map_visualization.js (93%) rename src/{legacy/core_plugins => plugins}/region_map/public/tooltip_formatter.js (100%) rename src/{legacy/core_plugins => plugins}/region_map/public/util.ts (86%) rename src/{legacy/core_plugins/region_map/public/legacy.ts => plugins/region_map/server/index.ts} (57%) diff --git a/.i18nrc.json b/.i18nrc.json index 3b2e628f7226f..034b9da799d3e 100644 --- a/.i18nrc.json +++ b/.i18nrc.json @@ -34,7 +34,7 @@ "kibana_utils": "src/plugins/kibana_utils", "navigation": "src/plugins/navigation", "newsfeed": "src/plugins/newsfeed", - "regionMap": "src/legacy/core_plugins/region_map", + "regionMap": "src/plugins/region_map", "savedObjects": "src/plugins/saved_objects", "savedObjectsManagement": "src/plugins/saved_objects_management", "server": "src/legacy/server", diff --git a/src/legacy/core_plugins/region_map/index.ts b/src/legacy/core_plugins/region_map/index.ts deleted file mode 100644 index 8c059314786bc..0000000000000 --- a/src/legacy/core_plugins/region_map/index.ts +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { resolve } from 'path'; -import { Legacy } from 'kibana'; - -import { LegacyPluginApi, LegacyPluginInitializer } from '../../../../src/legacy/types'; - -const regionMapPluginInitializer: LegacyPluginInitializer = ({ Plugin }: LegacyPluginApi) => - new Plugin({ - id: 'region_map', - require: ['kibana', 'elasticsearch'], - publicDir: resolve(__dirname, 'public'), - uiExports: { - hacks: [resolve(__dirname, 'public/legacy')], - injectDefaultVars(server) { - const { regionmap } = server.config().get('map'); - - return { - regionmap, - }; - }, - }, - init: (server: Legacy.Server) => ({}), - config(Joi: any) { - return Joi.object({ - enabled: Joi.boolean().default(true), - }).default(); - }, - } as Legacy.PluginSpecOptions); - -// eslint-disable-next-line import/no-default-export -export default regionMapPluginInitializer; diff --git a/src/plugins/maps_legacy/config.ts b/src/plugins/maps_legacy/config.ts index 13a0ad6b393a3..67e46d2270583 100644 --- a/src/plugins/maps_legacy/config.ts +++ b/src/plugins/maps_legacy/config.ts @@ -19,31 +19,7 @@ import { schema, TypeOf } from '@kbn/config-schema'; import { configSchema as tilemapSchema } from '../tile_map/config'; - -// TODO: Pull this portion from region_map -export const regionmapSchema = schema.object({ - includeElasticMapsService: schema.boolean({ defaultValue: true }), - layers: schema.arrayOf( - schema.object({ - url: schema.string(), - format: schema.object({ - type: schema.string({ defaultValue: 'geojson' }), - }), - meta: schema.object({ - feature_collection_path: schema.string({ defaultValue: 'data' }), - }), - attribution: schema.string(), - name: schema.string(), - fields: schema.arrayOf( - schema.object({ - name: schema.string(), - description: schema.string(), - }) - ), - }), - { defaultValue: [] } - ), -}); +import { configSchema as regionmapSchema } from '../region_map/config'; export const configSchema = schema.object({ includeElasticMapsService: schema.boolean({ defaultValue: true }), diff --git a/src/plugins/maps_legacy/public/index.ts b/src/plugins/maps_legacy/public/index.ts index 3fe377fbdc41f..a7f5427909334 100644 --- a/src/plugins/maps_legacy/public/index.ts +++ b/src/plugins/maps_legacy/public/index.ts @@ -45,6 +45,7 @@ import { import { mapTooltipProvider } from './tooltip_provider'; export interface MapsLegacyConfigType { + regionmap: any; emsTileLayerId: string; includeElasticMapsService: boolean; proxyElasticMapsServiceInMaps: boolean; diff --git a/src/plugins/region_map/config.ts b/src/plugins/region_map/config.ts new file mode 100644 index 0000000000000..a721a76ca0a82 --- /dev/null +++ b/src/plugins/region_map/config.ts @@ -0,0 +1,46 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { schema, TypeOf } from '@kbn/config-schema'; + +export const configSchema = schema.object({ + includeElasticMapsService: schema.boolean({ defaultValue: true }), + layers: schema.arrayOf( + schema.object({ + url: schema.string(), + format: schema.object({ + type: schema.string({ defaultValue: 'geojson' }), + }), + meta: schema.object({ + feature_collection_path: schema.string({ defaultValue: 'data' }), + }), + attribution: schema.string(), + name: schema.string(), + fields: schema.arrayOf( + schema.object({ + name: schema.string(), + description: schema.string(), + }) + ), + }), + { defaultValue: [] } + ), +}); + +export type ConfigSchema = TypeOf; diff --git a/src/plugins/region_map/kibana.json b/src/plugins/region_map/kibana.json new file mode 100644 index 0000000000000..3a6f64e92bcba --- /dev/null +++ b/src/plugins/region_map/kibana.json @@ -0,0 +1,14 @@ +{ + "id": "regionMap", + "version": "8.0.0", + "kibanaVersion": "kibana", + "configPath": ["map", "regionmap"], + "ui": true, + "server": true, + "requiredPlugins": [ + "visualizations", + "expressions", + "mapsLegacy", + "data" + ] +} diff --git a/src/legacy/core_plugins/region_map/package.json b/src/plugins/region_map/package.json similarity index 100% rename from src/legacy/core_plugins/region_map/package.json rename to src/plugins/region_map/package.json diff --git a/src/legacy/core_plugins/region_map/public/__snapshots__/region_map_fn.test.js.snap b/src/plugins/region_map/public/__snapshots__/region_map_fn.test.js.snap similarity index 100% rename from src/legacy/core_plugins/region_map/public/__snapshots__/region_map_fn.test.js.snap rename to src/plugins/region_map/public/__snapshots__/region_map_fn.test.js.snap diff --git a/src/legacy/core_plugins/region_map/public/__tests__/aftercolorchange.png b/src/plugins/region_map/public/__tests__/aftercolorchange.png similarity index 100% rename from src/legacy/core_plugins/region_map/public/__tests__/aftercolorchange.png rename to src/plugins/region_map/public/__tests__/aftercolorchange.png diff --git a/src/legacy/core_plugins/region_map/public/__tests__/afterdatachange.png b/src/plugins/region_map/public/__tests__/afterdatachange.png similarity index 100% rename from src/legacy/core_plugins/region_map/public/__tests__/afterdatachange.png rename to src/plugins/region_map/public/__tests__/afterdatachange.png diff --git a/src/legacy/core_plugins/region_map/public/__tests__/afterdatachangeandresize.png b/src/plugins/region_map/public/__tests__/afterdatachangeandresize.png similarity index 100% rename from src/legacy/core_plugins/region_map/public/__tests__/afterdatachangeandresize.png rename to src/plugins/region_map/public/__tests__/afterdatachangeandresize.png diff --git a/src/legacy/core_plugins/region_map/public/__tests__/afterresize.png b/src/plugins/region_map/public/__tests__/afterresize.png similarity index 100% rename from src/legacy/core_plugins/region_map/public/__tests__/afterresize.png rename to src/plugins/region_map/public/__tests__/afterresize.png diff --git a/src/legacy/core_plugins/region_map/public/__tests__/changestartup.png b/src/plugins/region_map/public/__tests__/changestartup.png similarity index 100% rename from src/legacy/core_plugins/region_map/public/__tests__/changestartup.png rename to src/plugins/region_map/public/__tests__/changestartup.png diff --git a/src/legacy/core_plugins/region_map/public/__tests__/initial.png b/src/plugins/region_map/public/__tests__/initial.png similarity index 100% rename from src/legacy/core_plugins/region_map/public/__tests__/initial.png rename to src/plugins/region_map/public/__tests__/initial.png diff --git a/src/legacy/core_plugins/region_map/public/__tests__/region_map_visualization.js b/src/plugins/region_map/public/__tests__/region_map_visualization.js similarity index 92% rename from src/legacy/core_plugins/region_map/public/__tests__/region_map_visualization.js rename to src/plugins/region_map/public/__tests__/region_map_visualization.js index 7271f39debb39..cefef98fae814 100644 --- a/src/legacy/core_plugins/region_map/public/__tests__/region_map_visualization.js +++ b/src/plugins/region_map/public/__tests__/region_map_visualization.js @@ -25,17 +25,17 @@ import ChoroplethLayer from '../choropleth_layer'; import { ImageComparator } from 'test_utils/image_comparator'; import worldJson from './world.json'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths -import EMS_CATALOGUE from '../../../../../plugins/maps_legacy/public/__tests__/map/ems_mocks/sample_manifest.json'; +import EMS_CATALOGUE from '../../../maps_legacy/public/__tests__/map/ems_mocks/sample_manifest.json'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths -import EMS_FILES from '../../../../../plugins/maps_legacy/public/__tests__/map/ems_mocks/sample_files.json'; +import EMS_FILES from '../../../maps_legacy/public/__tests__/map/ems_mocks/sample_files.json'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths -import EMS_TILES from '../../../../../plugins/maps_legacy/public/__tests__/map/ems_mocks/sample_tiles.json'; +import EMS_TILES from '../../../maps_legacy/public/__tests__/map/ems_mocks/sample_tiles.json'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths -import EMS_STYLE_ROAD_MAP_BRIGHT from '../../../../../plugins/maps_legacy/public/__tests__/map/ems_mocks/sample_style_bright'; +import EMS_STYLE_ROAD_MAP_BRIGHT from '../../../maps_legacy/public/__tests__/map/ems_mocks/sample_style_bright'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths -import EMS_STYLE_ROAD_MAP_DESATURATED from '../../../../../plugins/maps_legacy/public/__tests__/map/ems_mocks/sample_style_desaturated'; +import EMS_STYLE_ROAD_MAP_DESATURATED from '../../../maps_legacy/public/__tests__/map/ems_mocks/sample_style_desaturated'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths -import EMS_STYLE_DARK_MAP from '../../../../../plugins/maps_legacy/public/__tests__/map/ems_mocks/sample_style_dark'; +import EMS_STYLE_DARK_MAP from '../../../maps_legacy/public/__tests__/map/ems_mocks/sample_style_dark'; import initialPng from './initial.png'; import toiso3Png from './toiso3.png'; @@ -48,14 +48,14 @@ import changestartupPng from './changestartup.png'; import { createRegionMapVisualization } from '../region_map_visualization'; import { createRegionMapTypeDefinition } from '../region_map_type'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { ExprVis } from '../../../../../plugins/visualizations/public/expressions/vis'; +import { ExprVis } from '../../../visualizations/public/expressions/vis'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { BaseVisType } from '../../../../../plugins/visualizations/public/vis_types/base_vis_type'; +import { BaseVisType } from '../../../visualizations/public/vis_types/base_vis_type'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { setInjectedVarFunc } from '../../../../../plugins/maps_legacy/public/kibana_services'; +import { setInjectedVarFunc } from '../../../maps_legacy/public/kibana_services'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { ServiceSettings } from '../../../../../plugins/maps_legacy/public/map/service_settings'; -import { getBaseMapsVis } from '../../../../../plugins/maps_legacy/public'; +import { ServiceSettings } from '../../../maps_legacy/public/map/service_settings'; +import { getBaseMapsVis } from '../../../maps_legacy/public'; const THRESHOLD = 0.45; const PIXEL_DIFF = 96; diff --git a/src/legacy/core_plugins/region_map/public/__tests__/toiso3.png b/src/plugins/region_map/public/__tests__/toiso3.png similarity index 100% rename from src/legacy/core_plugins/region_map/public/__tests__/toiso3.png rename to src/plugins/region_map/public/__tests__/toiso3.png diff --git a/src/legacy/core_plugins/region_map/public/__tests__/world.json b/src/plugins/region_map/public/__tests__/world.json similarity index 100% rename from src/legacy/core_plugins/region_map/public/__tests__/world.json rename to src/plugins/region_map/public/__tests__/world.json diff --git a/src/legacy/core_plugins/region_map/public/choropleth_layer.js b/src/plugins/region_map/public/choropleth_layer.js similarity index 98% rename from src/legacy/core_plugins/region_map/public/choropleth_layer.js rename to src/plugins/region_map/public/choropleth_layer.js index f8c48958a1b9b..ddaf2db257fba 100644 --- a/src/legacy/core_plugins/region_map/public/choropleth_layer.js +++ b/src/plugins/region_map/public/choropleth_layer.js @@ -22,9 +22,9 @@ import _ from 'lodash'; import d3 from 'd3'; import { i18n } from '@kbn/i18n'; import * as topojson from 'topojson-client'; -import { toastNotifications } from 'ui/notify'; -import { colorUtil, KibanaMapLayer } from '../../../../plugins/maps_legacy/public'; -import { truncatedColorMaps } from '../../../../plugins/charts/public'; +import { getNotifications } from './kibana_services'; +import { colorUtil, KibanaMapLayer } from '../../maps_legacy/public'; +import { truncatedColorMaps } from '../../charts/public'; const EMPTY_STYLE = { weight: 1, @@ -182,7 +182,7 @@ CORS configuration of the server permits requests from the Kibana application on ); } - toastNotifications.addDanger({ + getNotifications().toasts.addDanger({ title: i18n.translate( 'regionMap.choroplethLayer.downloadingVectorDataErrorMessageTitle', { diff --git a/src/legacy/core_plugins/region_map/public/components/region_map_options.tsx b/src/plugins/region_map/public/components/region_map_options.tsx similarity index 95% rename from src/legacy/core_plugins/region_map/public/components/region_map_options.tsx rename to src/plugins/region_map/public/components/region_map_options.tsx index 5604067433f13..9a6987b981539 100644 --- a/src/legacy/core_plugins/region_map/public/components/region_map_options.tsx +++ b/src/plugins/region_map/public/components/region_map_options.tsx @@ -22,17 +22,9 @@ import { EuiIcon, EuiLink, EuiPanel, EuiSpacer, EuiText, EuiTitle } from '@elast import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { VisOptionsProps } from 'src/plugins/vis_default_editor/public'; -import { - FileLayerField, - VectorLayer, - IServiceSettings, -} from '../../../../../plugins/maps_legacy/public'; -import { - NumberInputOption, - SelectOption, - SwitchOption, -} from '../../../../../plugins/charts/public'; -import { RegionMapVisParams, WmsOptions } from '../../../../../plugins/maps_legacy/public'; +import { FileLayerField, VectorLayer, IServiceSettings } from '../../../maps_legacy/public'; +import { NumberInputOption, SelectOption, SwitchOption } from '../../../charts/public'; +import { RegionMapVisParams, WmsOptions } from '../../../maps_legacy/public'; const mapLayerForOption = ({ layerId, name }: VectorLayer) => ({ text: name, diff --git a/src/legacy/core_plugins/region_map/public/index.ts b/src/plugins/region_map/public/index.ts similarity index 86% rename from src/legacy/core_plugins/region_map/public/index.ts rename to src/plugins/region_map/public/index.ts index a29f5aa247026..3f920ad16683a 100644 --- a/src/legacy/core_plugins/region_map/public/index.ts +++ b/src/plugins/region_map/public/index.ts @@ -17,9 +17,14 @@ * under the License. */ -import { PluginInitializerContext } from '../../../../core/public'; +import { PluginInitializerContext } from 'kibana/public'; import { RegionMapPlugin as Plugin } from './plugin'; +export interface RegionMapsConfigType { + includeElasticMapsService: boolean; + layers: any[]; +} + export function plugin(initializerContext: PluginInitializerContext) { return new Plugin(initializerContext); } diff --git a/src/plugins/region_map/public/kibana_services.ts b/src/plugins/region_map/public/kibana_services.ts new file mode 100644 index 0000000000000..1ef58c69c5bef --- /dev/null +++ b/src/plugins/region_map/public/kibana_services.ts @@ -0,0 +1,30 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +import { NotificationsStart } from 'kibana/public'; +import { createGetterSetter } from '../../kibana_utils/public'; +import { DataPublicPluginStart } from '../../data/public'; + +export const [getFormatService, setFormatService] = createGetterSetter< + DataPublicPluginStart['fieldFormats'] +>('data.fieldFormats'); + +export const [getNotifications, setNotifications] = createGetterSetter( + 'Notifications' +); diff --git a/src/legacy/core_plugins/region_map/public/plugin.ts b/src/plugins/region_map/public/plugin.ts similarity index 56% rename from src/legacy/core_plugins/region_map/public/plugin.ts rename to src/plugins/region_map/public/plugin.ts index 08a73517dc13b..09a13fbe9774e 100644 --- a/src/legacy/core_plugins/region_map/public/plugin.ts +++ b/src/plugins/region_map/public/plugin.ts @@ -22,18 +22,19 @@ import { Plugin, PluginInitializerContext, IUiSettingsClient, -} from '../../../../core/public'; -import { Plugin as ExpressionsPublicPlugin } from '../../../../plugins/expressions/public'; -import { VisualizationsSetup } from '../../../../plugins/visualizations/public'; + NotificationsStart, +} from 'kibana/public'; +import { Plugin as ExpressionsPublicPlugin } from '../../expressions/public'; +import { VisualizationsSetup } from '../../visualizations/public'; // @ts-ignore import { createRegionMapFn } from './region_map_fn'; // @ts-ignore import { createRegionMapTypeDefinition } from './region_map_type'; -import { - getBaseMapsVis, - IServiceSettings, - MapsLegacyPluginSetup, -} from '../../../../plugins/maps_legacy/public'; +import { getBaseMapsVis, IServiceSettings, MapsLegacyPluginSetup } from '../../maps_legacy/public'; +import { setFormatService, setNotifications } from './kibana_services'; +import { DataPublicPluginStart } from '../../data/public'; +import { RegionMapsConfigType } from './index'; +import { ConfigSchema } from '../../maps_legacy/config'; /** @private */ interface RegionMapVisualizationDependencies { @@ -50,27 +51,46 @@ export interface RegionMapPluginSetupDependencies { mapsLegacy: MapsLegacyPluginSetup; } +/** @internal */ +export interface RegionMapPluginStartDependencies { + data: DataPublicPluginStart; + notifications: NotificationsStart; +} + /** @internal */ export interface RegionMapsConfig { includeElasticMapsService: boolean; layers: any[]; } +export interface RegionMapPluginSetup { + config: any; +} +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface RegionMapPluginStart {} + /** @internal */ -export class RegionMapPlugin implements Plugin, void> { - initializerContext: PluginInitializerContext; +export class RegionMapPlugin implements Plugin { + readonly _initializerContext: PluginInitializerContext; constructor(initializerContext: PluginInitializerContext) { - this.initializerContext = initializerContext; + this._initializerContext = initializerContext; } public async setup( core: CoreSetup, { expressions, visualizations, mapsLegacy }: RegionMapPluginSetupDependencies ) { + const config = { + ...this._initializerContext.config.get(), + // The maps legacy plugin updates the regionmap config directly in service_settings, + // future work on how configurations across the different plugins are organized would + // ideally constrain regionmap config updates to occur only from this plugin + ...mapsLegacy.config.regionmap, + }; const visualizationDependencies: Readonly = { uiSettings: core.uiSettings, - regionmapsConfig: core.injectedMetadata.getInjectedVar('regionmap') as RegionMapsConfig, + regionmapsConfig: config as RegionMapsConfig, serviceSettings: mapsLegacy.serviceSettings, BaseMapsVisualization: getBaseMapsVis(core, mapsLegacy.serviceSettings), }; @@ -80,9 +100,15 @@ export class RegionMapPlugin implements Plugin, void> { visualizations.createBaseVisualization( createRegionMapTypeDefinition(visualizationDependencies) ); + + return { + config, + }; } - public start(core: CoreStart) { - // nothing to do here yet + // @ts-ignore + public start(core: CoreStart, { data }: RegionMapPluginStartDependencies) { + setFormatService(data.fieldFormats); + setNotifications(core.notifications); } } diff --git a/src/legacy/core_plugins/region_map/public/region_map_fn.js b/src/plugins/region_map/public/region_map_fn.js similarity index 100% rename from src/legacy/core_plugins/region_map/public/region_map_fn.js rename to src/plugins/region_map/public/region_map_fn.js diff --git a/src/legacy/core_plugins/region_map/public/region_map_fn.test.js b/src/plugins/region_map/public/region_map_fn.test.js similarity index 92% rename from src/legacy/core_plugins/region_map/public/region_map_fn.test.js rename to src/plugins/region_map/public/region_map_fn.test.js index 07b4e33b85e27..684cc5e897df4 100644 --- a/src/legacy/core_plugins/region_map/public/region_map_fn.test.js +++ b/src/plugins/region_map/public/region_map_fn.test.js @@ -18,11 +18,9 @@ */ // eslint-disable-next-line -import { functionWrapper } from '../../../../plugins/expressions/common/expression_functions/specs/tests/utils'; +import { functionWrapper } from '../../expressions/common/expression_functions/specs/tests/utils'; import { createRegionMapFn } from './region_map_fn'; -jest.mock('ui/new_platform'); - describe('interpreter/functions#regionmap', () => { const fn = functionWrapper(createRegionMapFn()); const context = { diff --git a/src/legacy/core_plugins/region_map/public/region_map_type.js b/src/plugins/region_map/public/region_map_type.js similarity index 95% rename from src/legacy/core_plugins/region_map/public/region_map_type.js rename to src/plugins/region_map/public/region_map_type.js index b7ed14ed3706e..d29360a9589ab 100644 --- a/src/legacy/core_plugins/region_map/public/region_map_type.js +++ b/src/plugins/region_map/public/region_map_type.js @@ -21,9 +21,9 @@ import { i18n } from '@kbn/i18n'; import { mapToLayerWithId } from './util'; import { createRegionMapVisualization } from './region_map_visualization'; import { RegionMapOptions } from './components/region_map_options'; -import { truncatedColorSchemas } from '../../../../plugins/charts/public'; -import { Schemas } from '../../../../plugins/vis_default_editor/public'; -import { ORIGIN } from '../../../../plugins/maps_legacy/public'; +import { truncatedColorSchemas } from '../../charts/public'; +import { Schemas } from '../../vis_default_editor/public'; +import { ORIGIN } from '../../maps_legacy/public'; export function createRegionMapTypeDefinition(dependencies) { const { uiSettings, regionmapsConfig, serviceSettings } = dependencies; diff --git a/src/legacy/core_plugins/region_map/public/region_map_visualization.js b/src/plugins/region_map/public/region_map_visualization.js similarity index 93% rename from src/legacy/core_plugins/region_map/public/region_map_visualization.js rename to src/plugins/region_map/public/region_map_visualization.js index 5dbc1ecad277f..ed6a3ed2c10c8 100644 --- a/src/legacy/core_plugins/region_map/public/region_map_visualization.js +++ b/src/plugins/region_map/public/region_map_visualization.js @@ -19,11 +19,10 @@ import { i18n } from '@kbn/i18n'; import ChoroplethLayer from './choropleth_layer'; -import { getFormat } from 'ui/visualize/loader/pipeline_helpers/utilities'; -import { toastNotifications } from 'ui/notify'; -import { truncatedColorMaps } from '../../../../plugins/charts/public'; +import { getFormatService, getNotifications } from './kibana_services'; +import { truncatedColorMaps } from '../../charts/public'; import { tooltipFormatter } from './tooltip_formatter'; -import { mapTooltipProvider } from '../../../../plugins/maps_legacy/public'; +import { mapTooltipProvider } from '../../maps_legacy/public'; export function createRegionMapVisualization({ serviceSettings, @@ -75,7 +74,7 @@ export function createRegionMapVisualization({ results ); - const metricFieldFormatter = getFormat(this._params.metric.format); + const metricFieldFormatter = getFormatService().deserialize(this._params.metric.format); this._choroplethLayer.setMetrics(results, metricFieldFormatter, valueColumn.name); if (termColumn && valueColumn) { @@ -108,7 +107,7 @@ export function createRegionMapVisualization({ this._params.showAllShapes ); - const metricFieldFormatter = getFormat(this._params.metric.format); + const metricFieldFormatter = getFormatService().deserialize(this._params.metric.format); this._choroplethLayer.setJoinField(visParams.selectedJoinField.name); this._choroplethLayer.setColorRamp(truncatedColorMaps[visParams.colorSchema].value); @@ -177,7 +176,7 @@ export function createRegionMapVisualization({ const shouldShowWarning = this._params.isDisplayWarning && uiSettings.get('visualization:regionmap:showWarnings'); if (event.mismatches.length > 0 && shouldShowWarning) { - toastNotifications.addWarning({ + getNotifications().toasts.addWarning({ title: i18n.translate('regionMap.visualization.unableToShowMismatchesWarningTitle', { defaultMessage: 'Unable to show {mismatchesLength} {oneMismatch, plural, one {result} other {results}} on map', diff --git a/src/legacy/core_plugins/region_map/public/tooltip_formatter.js b/src/plugins/region_map/public/tooltip_formatter.js similarity index 100% rename from src/legacy/core_plugins/region_map/public/tooltip_formatter.js rename to src/plugins/region_map/public/tooltip_formatter.js diff --git a/src/legacy/core_plugins/region_map/public/util.ts b/src/plugins/region_map/public/util.ts similarity index 86% rename from src/legacy/core_plugins/region_map/public/util.ts rename to src/plugins/region_map/public/util.ts index b4e0dcd5f3510..0160a32e81522 100644 --- a/src/legacy/core_plugins/region_map/public/util.ts +++ b/src/plugins/region_map/public/util.ts @@ -17,8 +17,8 @@ * under the License. */ -import { FileLayer, VectorLayer } from '../../../../plugins/maps_legacy/public'; -import { ORIGIN } from '../../../../plugins/maps_legacy/public'; +import { FileLayer, VectorLayer } from '../../maps_legacy/public'; +import { ORIGIN } from '../../maps_legacy/public'; export const mapToLayerWithId = (prefix: string, layer: FileLayer): VectorLayer => ({ ...layer, diff --git a/src/legacy/core_plugins/region_map/public/legacy.ts b/src/plugins/region_map/server/index.ts similarity index 57% rename from src/legacy/core_plugins/region_map/public/legacy.ts rename to src/plugins/region_map/server/index.ts index 4bbd839331e56..e2c544d2d0ba6 100644 --- a/src/legacy/core_plugins/region_map/public/legacy.ts +++ b/src/plugins/region_map/server/index.ts @@ -17,19 +17,18 @@ * under the License. */ -import { PluginInitializerContext } from 'kibana/public'; -import { npSetup, npStart } from 'ui/new_platform'; +import { PluginConfigDescriptor } from 'kibana/server'; +import { configSchema, ConfigSchema } from '../config'; -import { RegionMapPluginSetupDependencies } from './plugin'; -import { plugin } from '.'; - -const plugins: Readonly = { - expressions: npSetup.plugins.expressions, - visualizations: npSetup.plugins.visualizations, - mapsLegacy: npSetup.plugins.mapsLegacy, +export const config: PluginConfigDescriptor = { + exposeToBrowser: { + includeElasticMapsService: true, + layers: true, + }, + schema: configSchema, }; -const pluginInstance = plugin({} as PluginInitializerContext); - -export const setup = pluginInstance.setup(npSetup.core, plugins); -export const start = pluginInstance.start(npStart.core); +export const plugin = () => ({ + setup() {}, + start() {}, +}); diff --git a/test/interpreter_functional/test_suites/run_pipeline/basic.ts b/test/interpreter_functional/test_suites/run_pipeline/basic.ts index 51ad789143c54..a2172dd2da1ba 100644 --- a/test/interpreter_functional/test_suites/run_pipeline/basic.ts +++ b/test/interpreter_functional/test_suites/run_pipeline/basic.ts @@ -113,11 +113,10 @@ export default function({ await expectExpression('partial_test_2', metricExpr, context).toMatchSnapshot() ).toMatchScreenshot(); - // TODO: should be uncommented when the region map is migrated to the new platform - // const regionMapExpr = `regionmap visConfig='{"metric":{"accessor":1,"format":{"id":"number"}},"bucket":{"accessor":0}}'`; - // await ( - // await expectExpression('partial_test_3', regionMapExpr, context).toMatchSnapshot() - // ).toMatchScreenshot(); + const regionMapExpr = `regionmap visConfig='{"metric":{"accessor":1,"format":{"id":"number"}},"bucket":{"accessor":0}}'`; + await ( + await expectExpression('partial_test_3', regionMapExpr, context).toMatchSnapshot() + ).toMatchScreenshot(); }); }); }); From d988ebee97eb3cfa7f2bc493bf49caf012b27557 Mon Sep 17 00:00:00 2001 From: Spencer Date: Thu, 7 May 2020 10:37:07 -0700 Subject: [PATCH 008/102] Collect more build metrics (#65408) --- .../src/ci_stats_reporter/README.md | 10 ++++- .../ci_stats_reporter/ci_stats_reporter.ts | 19 +++++---- packages/kbn-optimizer/src/cli.ts | 30 +++++++++----- .../src/report_optimizer_stats.ts | 17 ++++++-- packages/kbn-pm/dist/index.js | 19 +++++---- .../tasks/build_kibana_platform_plugins.js | 3 +- src/dev/build/tasks/create_archives_task.js | 40 +++++++++++++++++-- 7 files changed, 98 insertions(+), 40 deletions(-) diff --git a/packages/kbn-dev-utils/src/ci_stats_reporter/README.md b/packages/kbn-dev-utils/src/ci_stats_reporter/README.md index 6133f9871699f..c7b98224c4e57 100644 --- a/packages/kbn-dev-utils/src/ci_stats_reporter/README.md +++ b/packages/kbn-dev-utils/src/ci_stats_reporter/README.md @@ -8,7 +8,7 @@ This class integrates with the `ciStats.trackBuild {}` Jenkins Pipeline function To create an instance of the reporter, import the class and call `CiStatsReporter.fromEnv(log)` (passing it a tooling log). -#### `CiStatsReporter#metric(name: string, subName: string, value: number)` +#### `CiStatsReporter#metrics(metrics: Array<{ group: string, id: string, value: number }>)` Use this method to record metrics in the Kibana CI Stats service. @@ -19,5 +19,11 @@ import { CiStatsReporter, ToolingLog } from '@kbn/dev-utils'; const log = new ToolingLog(...); const reporter = CiStatsReporter.fromEnv(log) -reporter.metric('Build speed', specificBuildName, timeToRunBuild) +reporter.metrics([ + { + group: 'Build size', + id: specificBuildName, + value: sizeOfBuild + } +]) ``` \ No newline at end of file diff --git a/packages/kbn-dev-utils/src/ci_stats_reporter/ci_stats_reporter.ts b/packages/kbn-dev-utils/src/ci_stats_reporter/ci_stats_reporter.ts index 5fe1844a85563..4e91289610432 100644 --- a/packages/kbn-dev-utils/src/ci_stats_reporter/ci_stats_reporter.ts +++ b/packages/kbn-dev-utils/src/ci_stats_reporter/ci_stats_reporter.ts @@ -84,13 +84,16 @@ export class CiStatsReporter { return !!this.config; } - async metric(name: string, subName: string, value: number) { + async metrics(metrics: Array<{ group: string; id: string; value: number }>) { if (!this.config) { return; } let attempt = 0; const maxAttempts = 5; + const bodySummary = metrics + .map(({ group, id, value }) => `[${group}/${id}=${value}]`) + .join(' '); while (true) { attempt += 1; @@ -98,18 +101,14 @@ export class CiStatsReporter { try { await Axios.request({ method: 'POST', - url: '/metric', + url: '/v1/metrics', baseURL: this.config.apiUrl, - params: { - buildId: this.config.buildId, - }, headers: { Authorization: `token ${this.config.apiToken}`, }, data: { - name, - subName, - value, + buildId: this.config.buildId, + metrics, }, }); @@ -125,14 +124,14 @@ export class CiStatsReporter { this.log.warning( `error recording metric [status=${error.response.status}] [resp=${inspect( error.response.data - )}] [${name}/${subName}=${value}]` + )}] ${bodySummary}` ); return; } if (attempt === maxAttempts) { this.log.warning( - `failed to reach kibana-ci-stats service too many times, unable to record metric [${name}/${subName}=${value}]` + `failed to reach kibana-ci-stats service too many times, unable to record metric ${bodySummary}` ); return; } diff --git a/packages/kbn-optimizer/src/cli.ts b/packages/kbn-optimizer/src/cli.ts index e46075eff63a7..a2fbe969e34d8 100644 --- a/packages/kbn-optimizer/src/cli.ts +++ b/packages/kbn-optimizer/src/cli.ts @@ -21,7 +21,7 @@ import 'source-map-support/register'; import Path from 'path'; -import { run, REPO_ROOT, createFlagError, createFailError, CiStatsReporter } from '@kbn/dev-utils'; +import { run, REPO_ROOT, createFlagError, CiStatsReporter } from '@kbn/dev-utils'; import { logOptimizerState } from './log_optimizer_state'; import { OptimizerConfig } from './optimizer'; @@ -82,9 +82,9 @@ run( throw createFlagError('expected --scan-dir to be a string'); } - const reportStatsName = flags['report-stats']; - if (reportStatsName !== undefined && typeof reportStatsName !== 'string') { - throw createFlagError('expected --report-stats to be a string'); + const reportStats = flags['report-stats'] ?? false; + if (typeof reportStats !== 'boolean') { + throw createFlagError('expected --report-stats to have no value'); } const config = OptimizerConfig.create({ @@ -103,22 +103,32 @@ run( let update$ = runOptimizer(config); - if (reportStatsName) { + if (reportStats) { const reporter = CiStatsReporter.fromEnv(log); if (!reporter.isEnabled()) { - throw createFailError('Unable to initialize CiStatsReporter from env'); + log.warning('Unable to initialize CiStatsReporter from env'); } - update$ = update$.pipe(reportOptimizerStats(reporter, reportStatsName)); + update$ = update$.pipe(reportOptimizerStats(reporter, config)); } await update$.pipe(logOptimizerState(log, config)).toPromise(); }, { flags: { - boolean: ['core', 'watch', 'oss', 'examples', 'dist', 'cache', 'profile', 'inspect-workers'], - string: ['workers', 'scan-dir', 'report-stats'], + boolean: [ + 'core', + 'watch', + 'oss', + 'examples', + 'dist', + 'cache', + 'profile', + 'inspect-workers', + 'report-stats', + ], + string: ['workers', 'scan-dir'], default: { core: true, examples: true, @@ -136,7 +146,7 @@ run( --dist create bundles that are suitable for inclusion in the Kibana distributable --scan-dir add a directory to the list of directories scanned for plugins (specify as many times as necessary) --no-inspect-workers when inspecting the parent process, don't inspect the workers - --report-stats=[name] attempt to report stats about this execution of the build to the kibana-ci-stats service using this name + --report-stats attempt to report stats about this execution of the build to the kibana-ci-stats service using this name `, }, } diff --git a/packages/kbn-optimizer/src/report_optimizer_stats.ts b/packages/kbn-optimizer/src/report_optimizer_stats.ts index 375978b9b7944..06161fb2567b9 100644 --- a/packages/kbn-optimizer/src/report_optimizer_stats.ts +++ b/packages/kbn-optimizer/src/report_optimizer_stats.ts @@ -21,10 +21,10 @@ import { materialize, mergeMap, dematerialize } from 'rxjs/operators'; import { CiStatsReporter } from '@kbn/dev-utils'; import { OptimizerUpdate$ } from './run_optimizer'; -import { OptimizerState } from './optimizer'; +import { OptimizerState, OptimizerConfig } from './optimizer'; import { pipeClosure } from './common'; -export function reportOptimizerStats(reporter: CiStatsReporter, name: string) { +export function reportOptimizerStats(reporter: CiStatsReporter, config: OptimizerConfig) { return pipeClosure((update$: OptimizerUpdate$) => { let lastState: OptimizerState | undefined; return update$.pipe( @@ -35,7 +35,18 @@ export function reportOptimizerStats(reporter: CiStatsReporter, name: string) { } if (n.kind === 'C' && lastState) { - await reporter.metric('@kbn/optimizer build time', name, lastState.durSec); + await reporter.metrics( + config.bundles.map(bundle => { + // make the cache read from the cache file since it was likely updated by the worker + bundle.cache.refresh(); + + return { + group: `@kbn/optimizer bundle module count`, + id: bundle.id, + value: bundle.cache.getModuleCount() || 0, + }; + }) + ); } return n; diff --git a/packages/kbn-pm/dist/index.js b/packages/kbn-pm/dist/index.js index 28cf36dedba3f..1b70cced4a5c9 100644 --- a/packages/kbn-pm/dist/index.js +++ b/packages/kbn-pm/dist/index.js @@ -43933,30 +43933,29 @@ class CiStatsReporter { isEnabled() { return !!this.config; } - async metric(name, subName, value) { + async metrics(metrics) { var _a, _b, _c, _d; if (!this.config) { return; } let attempt = 0; const maxAttempts = 5; + const bodySummary = metrics + .map(({ group, id, value }) => `[${group}/${id}=${value}]`) + .join(' '); while (true) { attempt += 1; try { await axios_1.default.request({ method: 'POST', - url: '/metric', + url: '/v1/metrics', baseURL: this.config.apiUrl, - params: { - buildId: this.config.buildId, - }, headers: { Authorization: `token ${this.config.apiToken}`, }, data: { - name, - subName, - value, + buildId: this.config.buildId, + metrics, }, }); return; @@ -43968,11 +43967,11 @@ class CiStatsReporter { } if (((_b = error) === null || _b === void 0 ? void 0 : _b.response) && error.response.status !== 502) { // error response from service was received so warn the user and move on - this.log.warning(`error recording metric [status=${error.response.status}] [resp=${util_1.inspect(error.response.data)}] [${name}/${subName}=${value}]`); + this.log.warning(`error recording metric [status=${error.response.status}] [resp=${util_1.inspect(error.response.data)}] ${bodySummary}`); return; } if (attempt === maxAttempts) { - this.log.warning(`failed to reach kibana-ci-stats service too many times, unable to record metric [${name}/${subName}=${value}]`); + this.log.warning(`failed to reach kibana-ci-stats service too many times, unable to record metric ${bodySummary}`); return; } // we failed to reach the backend and we have remaining attempts, lets retry after a short delay diff --git a/src/dev/build/tasks/build_kibana_platform_plugins.js b/src/dev/build/tasks/build_kibana_platform_plugins.js index 28d6b49f9e89a..153a3120f896f 100644 --- a/src/dev/build/tasks/build_kibana_platform_plugins.js +++ b/src/dev/build/tasks/build_kibana_platform_plugins.js @@ -39,11 +39,10 @@ export const BuildKibanaPlatformPluginsTask = { }); const reporter = CiStatsReporter.fromEnv(log); - const reportStatsName = build.isOss() ? 'oss distributable' : 'default distributable'; await runOptimizer(optimizerConfig) .pipe( - reportOptimizerStats(reporter, reportStatsName), + reportOptimizerStats(reporter, optimizerConfig), logOptimizerState(log, optimizerConfig) ) .toPromise(); diff --git a/src/dev/build/tasks/create_archives_task.js b/src/dev/build/tasks/create_archives_task.js index 06be1bd0bd14f..541b9551dbc9b 100644 --- a/src/dev/build/tasks/create_archives_task.js +++ b/src/dev/build/tasks/create_archives_task.js @@ -17,13 +17,22 @@ * under the License. */ -import path from 'path'; +import Path from 'path'; +import Fs from 'fs'; +import { promisify } from 'util'; + +import { CiStatsReporter } from '@kbn/dev-utils'; + import { mkdirp, compress } from '../lib'; +const asyncStat = promisify(Fs.stat); + export const CreateArchivesTask = { description: 'Creating the archives for each platform', async run(config, log, build) { + const archives = []; + // archive one at a time, parallel causes OOM sometimes for (const platform of config.getTargetPlatforms()) { const source = build.resolvePathForPlatform(platform, '.'); @@ -31,10 +40,15 @@ export const CreateArchivesTask = { log.info('archiving', source, 'to', destination); - await mkdirp(path.dirname(destination)); + await mkdirp(Path.dirname(destination)); - switch (path.extname(destination)) { + switch (Path.extname(destination)) { case '.zip': + archives.push({ + format: 'zip', + path: destination, + }); + await compress( 'zip', { @@ -51,6 +65,11 @@ export const CreateArchivesTask = { break; case '.gz': + archives.push({ + format: 'tar', + path: destination, + }); + await compress( 'tar', { @@ -71,5 +90,20 @@ export const CreateArchivesTask = { throw new Error(`Unexpected extension for archive destination: ${destination}`); } } + + const reporter = CiStatsReporter.fromEnv(log); + if (reporter.isEnabled()) { + await reporter.metrics( + await Promise.all( + archives.map(async ({ format, path }) => { + return { + group: `${build.isOss() ? 'oss ' : ''}distributable size`, + id: format, + value: (await asyncStat(path)).size, + }; + }) + ) + ); + } }, }; From 46fc73a2133c78a7663b14040c7ac3facbd75f94 Mon Sep 17 00:00:00 2001 From: Dima Arnautov Date: Thu, 7 May 2020 19:43:53 +0200 Subject: [PATCH 009/102] [ML] add missing single quotes for index ids in modules custom urls (#65707) --- .../ml/docker_high_count_process_events_ecs.json | 2 +- .../ml/docker_rare_process_activity_ecs.json | 2 +- .../ml/hosts_high_count_process_events_ecs.json | 2 +- .../ml/hosts_rare_process_activity_ecs.json | 2 +- .../modules/sample_data_ecommerce/ml/high_sum_total_sales.json | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/auditbeat_process_docker_ecs/ml/docker_high_count_process_events_ecs.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/auditbeat_process_docker_ecs/ml/docker_high_count_process_events_ecs.json index d8c970e179416..c792b981df30a 100644 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/auditbeat_process_docker_ecs/ml/docker_high_count_process_events_ecs.json +++ b/x-pack/plugins/ml/server/models/data_recognizer/modules/auditbeat_process_docker_ecs/ml/docker_high_count_process_events_ecs.json @@ -30,7 +30,7 @@ { "url_name": "Process rate", "time_range": "1h", - "url_value": "kibana#/dashboard/ml_auditbeat_docker_process_event_rate_ecs?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(filters:!(('$state':(store:appState),meta:(alias:!n,disabled:!f,index:INDEX_PATTERN_ID,key:event.module,negate:!f,params:(query:auditd),type:phrase,value:auditd),query:(match:(event.module:(query:auditd,type:phrase)))),('$state':(store:appState),meta:(alias:!n,disabled:!f,index:INDEX_PATTERN_ID,key:container.runtime,negate:!f,params:(query:docker),type:phrase,value:docker),query:(match:(container.runtime:(query:docker,type:phrase)))),('$state':(store:appState),exists:(field:auditd.data.syscall),meta:(alias:!n,disabled:!f,index:INDEX_PATTERN_ID,key:auditd.data.syscall,negate:!f,type:exists,value:exists))),query:(language:kuery,query:\u0027container.name:\u0022$container.name$\u0022\u0027))" + "url_value": "kibana#/dashboard/ml_auditbeat_docker_process_event_rate_ecs?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(filters:!(('$state':(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:event.module,negate:!f,params:(query:auditd),type:phrase,value:auditd),query:(match:(event.module:(query:auditd,type:phrase)))),('$state':(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:container.runtime,negate:!f,params:(query:docker),type:phrase,value:docker),query:(match:(container.runtime:(query:docker,type:phrase)))),('$state':(store:appState),exists:(field:auditd.data.syscall),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:auditd.data.syscall,negate:!f,type:exists,value:exists))),query:(language:kuery,query:\u0027container.name:\u0022$container.name$\u0022\u0027))" }, { "url_name": "Raw data", diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/auditbeat_process_docker_ecs/ml/docker_rare_process_activity_ecs.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/auditbeat_process_docker_ecs/ml/docker_rare_process_activity_ecs.json index 76e3c8026c631..b3f02ae5a6bf8 100644 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/auditbeat_process_docker_ecs/ml/docker_rare_process_activity_ecs.json +++ b/x-pack/plugins/ml/server/models/data_recognizer/modules/auditbeat_process_docker_ecs/ml/docker_rare_process_activity_ecs.json @@ -30,7 +30,7 @@ { "url_name": "Process explorer", "time_range": "1h", - "url_value": "kibana#/dashboard/ml_auditbeat_docker_process_explorer_ecs?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(filters:!(('$state':(store:appState),meta:(alias:!n,disabled:!f,index:INDEX_PATTERN_ID,key:event.module,negate:!f,params:(query:auditd),type:phrase,value:auditd),query:(match:(event.module:(query:auditd,type:phrase)))),('$state':(store:appState),meta:(alias:!n,disabled:!f,index:INDEX_PATTERN_ID,key:container.runtime,negate:!f,params:(query:docker),type:phrase,value:docker),query:(match:(container.runtime:(query:docker,type:phrase)))),('$state':(store:appState),exists:(field:auditd.data.syscall),meta:(alias:!n,disabled:!f,index:INDEX_PATTERN_ID,key:auditd.data.syscall,negate:!f,type:exists,value:exists))),query:(language:kuery,query:\u0027container.name:\u0022$container.name$\u0022\u0027))" + "url_value": "kibana#/dashboard/ml_auditbeat_docker_process_explorer_ecs?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(filters:!(('$state':(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:event.module,negate:!f,params:(query:auditd),type:phrase,value:auditd),query:(match:(event.module:(query:auditd,type:phrase)))),('$state':(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:container.runtime,negate:!f,params:(query:docker),type:phrase,value:docker),query:(match:(container.runtime:(query:docker,type:phrase)))),('$state':(store:appState),exists:(field:auditd.data.syscall),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:auditd.data.syscall,negate:!f,type:exists,value:exists))),query:(language:kuery,query:\u0027container.name:\u0022$container.name$\u0022\u0027))" }, { "url_name": "Raw data", diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/auditbeat_process_hosts_ecs/ml/hosts_high_count_process_events_ecs.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/auditbeat_process_hosts_ecs/ml/hosts_high_count_process_events_ecs.json index 487bee5311878..0e9336507b465 100644 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/auditbeat_process_hosts_ecs/ml/hosts_high_count_process_events_ecs.json +++ b/x-pack/plugins/ml/server/models/data_recognizer/modules/auditbeat_process_hosts_ecs/ml/hosts_high_count_process_events_ecs.json @@ -29,7 +29,7 @@ { "url_name": "Process rate", "time_range": "1h", - "url_value": "kibana#/dashboard/ml_auditbeat_hosts_process_event_rate_ecs?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(filters:!(('$state':(store:appState),meta:(alias:!n,disabled:!f,index:INDEX_PATTERN_ID,key:event.module,negate:!f,params:(query:auditd),type:phrase,value:auditd),query:(match:(event.module:(query:auditd,type:phrase)))),('$state':(store:appState),exists:(field:container.runtime),meta:(alias:!n,disabled:!f,index:INDEX_PATTERN_ID,key:container.runtime,negate:!t,type:exists,value:exists)),('$state':(store:appState),exists:(field:auditd.data.syscall),meta:(alias:!n,disabled:!f,index:INDEX_PATTERN_ID,key:auditd.data.syscall,negate:!f,type:exists,value:exists))),query:(language:kuery,query:\u0027host.name:\u0022$host.name$\u0022\u0027))" + "url_value": "kibana#/dashboard/ml_auditbeat_hosts_process_event_rate_ecs?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(filters:!(('$state':(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:event.module,negate:!f,params:(query:auditd),type:phrase,value:auditd),query:(match:(event.module:(query:auditd,type:phrase)))),('$state':(store:appState),exists:(field:container.runtime),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:container.runtime,negate:!t,type:exists,value:exists)),('$state':(store:appState),exists:(field:auditd.data.syscall),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:auditd.data.syscall,negate:!f,type:exists,value:exists))),query:(language:kuery,query:\u0027host.name:\u0022$host.name$\u0022\u0027))" }, { "url_name": "Raw data", diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/auditbeat_process_hosts_ecs/ml/hosts_rare_process_activity_ecs.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/auditbeat_process_hosts_ecs/ml/hosts_rare_process_activity_ecs.json index 9ba6859bfa166..4dd1409b71c79 100644 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/auditbeat_process_hosts_ecs/ml/hosts_rare_process_activity_ecs.json +++ b/x-pack/plugins/ml/server/models/data_recognizer/modules/auditbeat_process_hosts_ecs/ml/hosts_rare_process_activity_ecs.json @@ -30,7 +30,7 @@ { "url_name": "Process explorer", "time_range": "1h", - "url_value": "kibana#/dashboard/ml_auditbeat_hosts_process_explorer_ecs?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(filters:!(('$state':(store:appState),meta:(alias:!n,disabled:!f,index:INDEX_PATTERN_ID,key:event.module,negate:!f,params:(query:auditd),type:phrase,value:auditd),query:(match:(event.module:(query:auditd,type:phrase)))),('$state':(store:appState),exists:(field:container.runtime),meta:(alias:!n,disabled:!f,index:INDEX_PATTERN_ID,key:container.runtime,negate:!t,type:exists,value:exists)),('$state':(store:appState),exists:(field:auditd.data.syscall),meta:(alias:!n,disabled:!f,index:INDEX_PATTERN_ID,key:auditd.data.syscall,negate:!f,type:exists,value:exists))),query:(language:kuery,query:\u0027host.name:\u0022$host.name$\u0022\u0027))" + "url_value": "kibana#/dashboard/ml_auditbeat_hosts_process_explorer_ecs?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(filters:!(('$state':(store:appState),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:event.module,negate:!f,params:(query:auditd),type:phrase,value:auditd),query:(match:(event.module:(query:auditd,type:phrase)))),('$state':(store:appState),exists:(field:container.runtime),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:container.runtime,negate:!t,type:exists,value:exists)),('$state':(store:appState),exists:(field:auditd.data.syscall),meta:(alias:!n,disabled:!f,index:\u0027INDEX_PATTERN_ID\u0027,key:auditd.data.syscall,negate:!f,type:exists,value:exists))),query:(language:kuery,query:\u0027host.name:\u0022$host.name$\u0022\u0027))" }, { "url_name": "Raw data", diff --git a/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_ecommerce/ml/high_sum_total_sales.json b/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_ecommerce/ml/high_sum_total_sales.json index e0230e2a06373..c3d401085f7ae 100644 --- a/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_ecommerce/ml/high_sum_total_sales.json +++ b/x-pack/plugins/ml/server/models/data_recognizer/modules/sample_data_ecommerce/ml/high_sum_total_sales.json @@ -27,7 +27,7 @@ "custom_urls": [ { "url_name": "Raw data", - "url_value": "kibana#/discover?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(index:ff959d40-b880-11e8-a6d9-e546fe2bba5f,query:(language:kuery,query:\u0027customer_full_name.keyword:\u0022$customer_full_name.keyword$\u0022\u0027),sort:!('@timestamp',desc))" + "url_value": "kibana#/discover?_g=(time:(from:\u0027$earliest$\u0027,mode:absolute,to:\u0027$latest$\u0027))&_a=(index:\u0027ff959d40-b880-11e8-a6d9-e546fe2bba5f\u0027,query:(language:kuery,query:\u0027customer_full_name.keyword:\u0022$customer_full_name.keyword$\u0022\u0027),sort:!('@timestamp',desc))" }, { "url_name": "Data dashboard", From 962d4a0127090321503685cf49982360dbd3cb51 Mon Sep 17 00:00:00 2001 From: James Gowdy Date: Thu, 7 May 2020 19:15:50 +0100 Subject: [PATCH 010/102] [ML] Disabling calendar all job switch (#65635) * [ML] Disabling calendar all job switch * updating snapshot Co-authored-by: Elastic Machine --- .../edit/calendar_form/__snapshots__/calendar_form.test.js.snap | 1 + .../settings/calendars/edit/calendar_form/calendar_form.js | 1 + 2 files changed, 2 insertions(+) diff --git a/x-pack/plugins/ml/public/application/settings/calendars/edit/calendar_form/__snapshots__/calendar_form.test.js.snap b/x-pack/plugins/ml/public/application/settings/calendars/edit/calendar_form/__snapshots__/calendar_form.test.js.snap index e5026778fec1c..df2e119f511e1 100644 --- a/x-pack/plugins/ml/public/application/settings/calendars/edit/calendar_form/__snapshots__/calendar_form.test.js.snap +++ b/x-pack/plugins/ml/public/application/settings/calendars/edit/calendar_form/__snapshots__/calendar_form.test.js.snap @@ -88,6 +88,7 @@ exports[`CalendarForm Renders calendar form 1`] = ` size="xl" /> {isGlobalCalendar === false && ( From 2903e2fc76511084da0fe811584750d2c7f97528 Mon Sep 17 00:00:00 2001 From: Rashmi Kulkarni Date: Thu, 7 May 2020 11:16:06 -0700 Subject: [PATCH 011/102] draft search profiler accessibility tests (#62357) * draft search profiler accessibility tests * added the search profiler test , data test subjects * unskipped the test * added another test to open-close the shard details dropdown Co-authored-by: Elastic Machine --- .../shard_details/shard_details.tsx | 1 + .../shard_details/shard_details_tree_node.tsx | 1 + .../components/searchprofiler_tabs.tsx | 2 + .../containers/profile_query_editor.tsx | 7 +- .../accessibility/apps/search_profiler.ts | 93 +++++++++++++++++++ x-pack/test/accessibility/config.ts | 2 + 6 files changed, 105 insertions(+), 1 deletion(-) create mode 100644 x-pack/test/accessibility/apps/search_profiler.ts diff --git a/x-pack/plugins/searchprofiler/public/application/components/profile_tree/shard_details/shard_details.tsx b/x-pack/plugins/searchprofiler/public/application/components/profile_tree/shard_details/shard_details.tsx index ac2a2997515d5..6579d18556cc0 100644 --- a/x-pack/plugins/searchprofiler/public/application/components/profile_tree/shard_details/shard_details.tsx +++ b/x-pack/plugins/searchprofiler/public/application/components/profile_tree/shard_details/shard_details.tsx @@ -44,6 +44,7 @@ export const ShardDetails = ({ index, shard, operations }: Props) => { setShardVisibility(!shardVisibility)} + data-test-subj="openCloseShardDetails" > [{shard.id[0]}][ {shard.id[2]}] diff --git a/x-pack/plugins/searchprofiler/public/application/components/profile_tree/shard_details/shard_details_tree_node.tsx b/x-pack/plugins/searchprofiler/public/application/components/profile_tree/shard_details/shard_details_tree_node.tsx index 1d8f915d3d47d..d89046090a961 100644 --- a/x-pack/plugins/searchprofiler/public/application/components/profile_tree/shard_details/shard_details_tree_node.tsx +++ b/x-pack/plugins/searchprofiler/public/application/components/profile_tree/shard_details/shard_details_tree_node.tsx @@ -94,6 +94,7 @@ export const ShardDetailsTreeNode = ({ operation, index, shard }: Props) => { highlight({ indexName: index.name, operation, shard })} > {i18n.translate('xpack.searchProfiler.profileTree.body.viewDetailsLabel', { diff --git a/x-pack/plugins/searchprofiler/public/application/components/searchprofiler_tabs.tsx b/x-pack/plugins/searchprofiler/public/application/components/searchprofiler_tabs.tsx index 19224e7099fd6..7e6dad7df5528 100644 --- a/x-pack/plugins/searchprofiler/public/application/components/searchprofiler_tabs.tsx +++ b/x-pack/plugins/searchprofiler/public/application/components/searchprofiler_tabs.tsx @@ -24,6 +24,7 @@ export const SearchProfilerTabs = ({ activeTab, activateTab, has }: Props) => { return ( activateTab('searches')} @@ -33,6 +34,7 @@ export const SearchProfilerTabs = ({ activeTab, activateTab, has }: Props) => { })} activateTab('aggregations')} diff --git a/x-pack/plugins/searchprofiler/public/application/containers/profile_query_editor.tsx b/x-pack/plugins/searchprofiler/public/application/containers/profile_query_editor.tsx index 5348c55ad5213..f6377d2b4f906 100644 --- a/x-pack/plugins/searchprofiler/public/application/containers/profile_query_editor.tsx +++ b/x-pack/plugins/searchprofiler/public/application/containers/profile_query_editor.tsx @@ -120,7 +120,12 @@ export const ProfileQueryEditor = memo(() => { - handleProfileClick()}> + handleProfileClick()} + > {i18n.translate('xpack.searchProfiler.formProfileButtonLabel', { defaultMessage: 'Profile', diff --git a/x-pack/test/accessibility/apps/search_profiler.ts b/x-pack/test/accessibility/apps/search_profiler.ts new file mode 100644 index 0000000000000..0caf21643f32a --- /dev/null +++ b/x-pack/test/accessibility/apps/search_profiler.ts @@ -0,0 +1,93 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../ftr_provider_context'; + +export default function({ getService, getPageObjects }: FtrProviderContext) { + const PageObjects = getPageObjects(['common', 'security']); + const testSubjects = getService('testSubjects'); + const aceEditor = getService('aceEditor'); + const a11y = getService('a11y'); + const flyout = getService('flyout'); + + describe('Accessibility Search Profiler Editor', () => { + before(async () => { + await PageObjects.common.navigateToApp('searchProfiler'); + await a11y.testAppSnapshot(); + expect(await testSubjects.exists('searchProfilerEditor')).to.be(true); + }); + + it('input the JSON in the aceeditor', async () => { + const input = { + query: { + bool: { + should: [ + { + match: { + name: 'fred', + }, + }, + { + terms: { + name: ['sue', 'sally'], + }, + }, + ], + }, + }, + aggs: { + stats: { + stats: { + field: 'price', + }, + }, + }, + }; + + await aceEditor.setValue('searchProfilerEditor', JSON.stringify(input)); + await a11y.testAppSnapshot(); + }); + + it('click on the profile button', async () => { + await testSubjects.click('profileButton'); + await a11y.testAppSnapshot(); + }); + + it('click on the dropdown link', async () => { + const viewShardDetailslink = await testSubjects.findAll('viewShardDetails'); + await viewShardDetailslink[0].click(); + await a11y.testAppSnapshot(); + }); + + it('click on the open-close shard details link', async () => { + const openShardDetailslink = await testSubjects.findAll('openCloseShardDetails'); + await openShardDetailslink[0].click(); + await a11y.testAppSnapshot(); + }); + + it('close the fly out', async () => { + await flyout.ensureAllClosed(); + await a11y.testAppSnapshot(); + }); + + it('click on the Aggregation Profile link', async () => { + await testSubjects.click('aggregationProfileTab'); + await a11y.testAppSnapshot(); + }); + + it('click on the view details link', async () => { + const viewShardDetailslink = await testSubjects.findAll('viewShardDetails'); + await viewShardDetailslink[0].click(); + await a11y.testAppSnapshot(); + }); + + it('close the fly out', async () => { + await flyout.ensureAllClosed(); + await a11y.testAppSnapshot(); + }); + }); +} diff --git a/x-pack/test/accessibility/config.ts b/x-pack/test/accessibility/config.ts index 7bf6079cc6487..ddeb52dce3b59 100644 --- a/x-pack/test/accessibility/config.ts +++ b/x-pack/test/accessibility/config.ts @@ -13,10 +13,12 @@ export default async function({ readConfigFile }: FtrConfigProviderContext) { return { ...functionalConfig.getAll(), + testFiles: [ require.resolve('./apps/login_page'), require.resolve('./apps/home'), require.resolve('./apps/grok_debugger'), + require.resolve('./apps/search_profiler'), ], pageObjects, services, From df0f0c341f5d885b0a87f90e32aa7c13c67cbd30 Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Thu, 7 May 2020 11:49:27 -0700 Subject: [PATCH 012/102] [Metrics UI] Fix isAbove to only display when threshold set (#65540) --- .../alerting/metric_threshold/components/expression_chart.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/infra/public/alerting/metric_threshold/components/expression_chart.tsx b/x-pack/plugins/infra/public/alerting/metric_threshold/components/expression_chart.tsx index a600d59865ccc..82e751627a05b 100644 --- a/x-pack/plugins/infra/public/alerting/metric_threshold/components/expression_chart.tsx +++ b/x-pack/plugins/infra/public/alerting/metric_threshold/components/expression_chart.tsx @@ -224,7 +224,7 @@ export const ExpressionChart: React.FC = ({ /> ) : null} - {isAbove ? ( + {isAbove && first(expression.threshold) != null ? ( Date: Thu, 7 May 2020 12:07:44 -0700 Subject: [PATCH 013/102] remove immediate functions from esqueue worker cycles (#65375) Co-authored-by: Elastic Machine --- .../reporting/server/lib/create_worker.ts | 43 ++++++------------- .../reporting/server/lib/enqueue_job.ts | 3 +- 2 files changed, 14 insertions(+), 32 deletions(-) diff --git a/x-pack/legacy/plugins/reporting/server/lib/create_worker.ts b/x-pack/legacy/plugins/reporting/server/lib/create_worker.ts index 16b8fbdb30fdd..ad0f05c02a1f4 100644 --- a/x-pack/legacy/plugins/reporting/server/lib/create_worker.ts +++ b/x-pack/legacy/plugins/reporting/server/lib/create_worker.ts @@ -11,18 +11,13 @@ import { ESQueueInstance, ESQueueWorkerExecuteFn, ExportTypeDefinition, - ImmediateExecuteFn, - JobDocPayload, JobSource, Logger, - RequestFacade, } from '../../types'; // @ts-ignore untyped dependency import { events as esqueueEvents } from './esqueue'; export function createWorkerFactory(reporting: ReportingCore, logger: Logger) { - type JobDocPayloadType = JobDocPayload; - const config = reporting.getConfig(); const queueConfig = config.get('queue'); const kibanaName = config.kbnConfig.get('server', 'name'); @@ -31,48 +26,36 @@ export function createWorkerFactory(reporting: ReportingCore, log // Once more document types are added, this will need to be passed in return async function createWorker(queue: ESQueueInstance) { // export type / execute job map - const jobExecutors: Map< - string, - ImmediateExecuteFn | ESQueueWorkerExecuteFn - > = new Map(); + const jobExecutors: Map> = new Map(); for (const exportType of reporting.getExportTypesRegistry().getAll() as Array< - ExportTypeDefinition< - JobParamsType, - unknown, - unknown, - ImmediateExecuteFn | ESQueueWorkerExecuteFn - > + ExportTypeDefinition> >) { const jobExecutor = await exportType.executeJobFactory(reporting, logger); // FIXME: does not "need" to be async jobExecutors.set(exportType.jobType, jobExecutor); } - const workerFn = (jobSource: JobSource, ...workerRestArgs: any[]) => { + const workerFn = ( + jobSource: JobSource, + jobParams: ScheduledTaskParamsType, + cancellationToken: CancellationToken + ) => { const { _id: jobId, _source: { jobtype: jobType }, } = jobSource; + if (!jobId) { + throw new Error(`Claimed job is missing an ID!: ${JSON.stringify(jobSource)}`); + } + const jobTypeExecutor = jobExecutors.get(jobType); - // pass the work to the jobExecutor if (!jobTypeExecutor) { throw new Error(`Unable to find a job executor for the claimed job: [${jobId}]`); } - if (jobId) { - const jobExecutorWorker = jobTypeExecutor as ESQueueWorkerExecuteFn; - return jobExecutorWorker( - jobId, - ...(workerRestArgs as [JobDocPayloadType, CancellationToken]) - ); - } else { - const jobExecutorImmediate = jobExecutors.get(jobType) as ImmediateExecuteFn; - return jobExecutorImmediate( - null, - ...(workerRestArgs as [JobDocPayload, RequestFacade]) - ); - } + // pass the work to the jobExecutor + return jobTypeExecutor(jobId, jobParams, cancellationToken); }; const workerOptions = { diff --git a/x-pack/legacy/plugins/reporting/server/lib/enqueue_job.ts b/x-pack/legacy/plugins/reporting/server/lib/enqueue_job.ts index 3e87337dc4355..8f33d9b73566c 100644 --- a/x-pack/legacy/plugins/reporting/server/lib/enqueue_job.ts +++ b/x-pack/legacy/plugins/reporting/server/lib/enqueue_job.ts @@ -9,7 +9,6 @@ import { ConditionalHeaders, EnqueueJobFn, ESQueueCreateJobFn, - ImmediateCreateJobFn, Job, Logger, RequestFacade, @@ -40,7 +39,7 @@ export function enqueueJobFactory(reporting: ReportingCore, parentLogger: Logger headers: ConditionalHeaders['headers'], request: RequestFacade ): Promise { - type CreateJobFn = ESQueueCreateJobFn | ImmediateCreateJobFn; + type CreateJobFn = ESQueueCreateJobFn; const esqueue = await reporting.getEsqueue(); const exportType = reporting.getExportTypesRegistry().getById(exportTypeId); From 39427f5ed3362bd4eee4a3414c3a84160aa317a8 Mon Sep 17 00:00:00 2001 From: Patrick Mueller Date: Thu, 7 May 2020 15:12:01 -0400 Subject: [PATCH 014/102] [Alerting] changes preconfigured actions config from array to object (#65397) resolves https://github.com/elastic/kibana/issues/63171 Previously, preconfigured actions were specified as an array of action properties. This ended up being problematic when using the kibana keystore for secrets, as you'd have to reference specific actions via index. This changes preconfigured actions to be specified as an object, where the property key is the id, and the body is the remainder of the action properties. As access to preconfigured actions has leaked across the code base, it's probably time to consider changing the internal representation from an array to a Map, to provide easier access by action id. For a future PR. --- .../user/alerting/action-types/email.asciidoc | 22 +++---- .../user/alerting/action-types/index.asciidoc | 14 ++--- .../alerting/action-types/pagerduty.asciidoc | 14 ++--- .../alerting/action-types/server-log.asciidoc | 6 +- .../user/alerting/action-types/slack.asciidoc | 10 ++-- .../alerting/action-types/webhook.asciidoc | 22 +++---- .../pre-configured-connectors.asciidoc | 8 +-- x-pack/plugins/actions/README.md | 2 +- x-pack/plugins/actions/server/config.test.ts | 53 ++++++++++++++--- x-pack/plugins/actions/server/config.ts | 39 +++++++++---- x-pack/plugins/actions/server/plugin.test.ts | 57 +++++++++---------- x-pack/plugins/actions/server/plugin.ts | 14 +++-- .../alerting_api_integration/common/config.ts | 16 ++---- x-pack/test/functional_with_es_ssl/config.ts | 10 ++-- 14 files changed, 166 insertions(+), 121 deletions(-) diff --git a/docs/user/alerting/action-types/email.asciidoc b/docs/user/alerting/action-types/email.asciidoc index 689d870d9cadc..81b4e210961f6 100644 --- a/docs/user/alerting/action-types/email.asciidoc +++ b/docs/user/alerting/action-types/email.asciidoc @@ -24,17 +24,17 @@ Password:: password for 'login' type authentication. [source,text] -- - id: 'my-email' - name: preconfigured-email-action-type - actionTypeId: .email - config: - from: testsender@test.com <1.1> - host: validhostname <1.2> - port: 8080 <1.3> - secure: false <1.4> - secrets: - user: testuser <2.1> - password: passwordkeystorevalue <2.2> + my-email: + name: preconfigured-email-action-type + actionTypeId: .email + config: + from: testsender@test.com <1.1> + host: validhostname <1.2> + port: 8080 <1.3> + secure: false <1.4> + secrets: + user: testuser <2.1> + password: passwordkeystorevalue <2.2> -- `config` defines the action type specific to the configuration and contains the following properties: diff --git a/docs/user/alerting/action-types/index.asciidoc b/docs/user/alerting/action-types/index.asciidoc index 4f5254e3311d8..c71412210c535 100644 --- a/docs/user/alerting/action-types/index.asciidoc +++ b/docs/user/alerting/action-types/index.asciidoc @@ -21,13 +21,13 @@ Execution time field:: This field will be automatically set to the time the ale [source,text] -- - id: 'my-index' - name: action-type-index - actionTypeId: .index - config: - index: .kibana <1> - refresh: true <2> - executionTimeField: somedate <3> + my-index: + name: action-type-index + actionTypeId: .index + config: + index: .kibana <1> + refresh: true <2> + executionTimeField: somedate <3> -- `config` defines the action type specific to the configuration and contains the following properties: diff --git a/docs/user/alerting/action-types/pagerduty.asciidoc b/docs/user/alerting/action-types/pagerduty.asciidoc index 957c035b028f6..cd51ec2e3301e 100644 --- a/docs/user/alerting/action-types/pagerduty.asciidoc +++ b/docs/user/alerting/action-types/pagerduty.asciidoc @@ -141,13 +141,13 @@ Integration Key:: A 32 character PagerDuty Integration Key for an integration [source,text] -- - id: 'my-pagerduty' - name: preconfigured-pagerduty-action-type - actionTypeId: .pagerduty - config: - apiUrl: https://test.host <1.1> - secrets: - routingKey: testroutingkey <2.1> + my-pagerduty: + name: preconfigured-pagerduty-action-type + actionTypeId: .pagerduty + config: + apiUrl: https://test.host <1.1> + secrets: + routingKey: testroutingkey <2.1> -- `config` defines the action type specific to the configuration and contains the following properties: diff --git a/docs/user/alerting/action-types/server-log.asciidoc b/docs/user/alerting/action-types/server-log.asciidoc index f08dbe5542f0f..eadca229bc19c 100644 --- a/docs/user/alerting/action-types/server-log.asciidoc +++ b/docs/user/alerting/action-types/server-log.asciidoc @@ -18,9 +18,9 @@ Name:: The name of the connector. The name is used to identify a connector [source,text] -- - id: 'my-server-log' - name: test - actionTypeId: .server-log + my-server-log: + name: test + actionTypeId: .server-log -- [float] diff --git a/docs/user/alerting/action-types/slack.asciidoc b/docs/user/alerting/action-types/slack.asciidoc index 195093536bc04..afa616ba77b3a 100644 --- a/docs/user/alerting/action-types/slack.asciidoc +++ b/docs/user/alerting/action-types/slack.asciidoc @@ -19,11 +19,11 @@ Webhook URL:: The URL of the incoming webhook. See https://api.slack.com/messa [source,text] -- - id: 'my-slack' - name: preconfigured-slack-action-type - actionTypeId: .slack - config: - webhookUrl: 'https://hooks.slack.com/services/abcd/efgh/ijklmnopqrstuvwxyz' <1> + my-slack: + name: preconfigured-slack-action-type + actionTypeId: .slack + config: + webhookUrl: 'https://hooks.slack.com/services/abcd/efgh/ijklmnopqrstuvwxyz' <1> -- `config` defines the action type specific to the configuration and contains the following properties: diff --git a/docs/user/alerting/action-types/webhook.asciidoc b/docs/user/alerting/action-types/webhook.asciidoc index f4c108426642d..27609652288b5 100644 --- a/docs/user/alerting/action-types/webhook.asciidoc +++ b/docs/user/alerting/action-types/webhook.asciidoc @@ -23,17 +23,17 @@ Password:: An optional password. If set, HTTP basic authentication is used. Cur [source,text] -- - id: 'my-webhook' - name: preconfigured-webhook-action-type - actionTypeId: .webhook - config: - url: https://test.host <1.1> - method: POST <1.2> - headers: <1.3> - testheader: testvalue - secrets: - user: testuser <2.1> - password: passwordkeystorevalue <2.2> + my-webhook: + name: preconfigured-webhook-action-type + actionTypeId: .webhook + config: + url: https://test.host <1.1> + method: POST <1.2> + headers: <1.3> + testheader: testvalue + secrets: + user: testuser <2.1> + password: passwordkeystorevalue <2.2> -- `config` defines the action type specific to the configuration and contains the following properties: diff --git a/docs/user/alerting/pre-configured-connectors.asciidoc b/docs/user/alerting/pre-configured-connectors.asciidoc index 5ff4ea15df561..d5c20d1853d42 100644 --- a/docs/user/alerting/pre-configured-connectors.asciidoc +++ b/docs/user/alerting/pre-configured-connectors.asciidoc @@ -25,12 +25,12 @@ The following example shows a valid configuration of two out-of-the box connecto ```js xpack.actions.preconfigured: - - id: 'my-slack1' <1> + my-slack1: <1> actionTypeId: .slack <2> name: 'Slack #xyz' <3> config: <4> webhookUrl: 'https://hooks.slack.com/services/abcd/efgh/ijklmnopqrstuvwxyz' - - id: 'webhook-service' + webhook-service: actionTypeId: .webhook name: 'Email service' config: @@ -44,7 +44,7 @@ The following example shows a valid configuration of two out-of-the box connecto password: changeme ``` -<1> `id` is the action connector identifier. +<1> the key is the action connector identifier, eg `my-slack1` in this example. <2> `actionTypeId` is the action type identifier. <3> `name` is the name of the preconfigured connector. <4> `config` is the action type specific to the configuration. @@ -69,7 +69,7 @@ The following example shows a valid configuration of preconfigured action type w ```js xpack.actions.enabledActionTypes: ['.slack', '.email', '.index'] <1> xpack.actions.preconfigured: <2> - - id: 'my-server-log' + my-server-log: actionTypeId: .server-log name: 'Server log #xyz' ``` diff --git a/x-pack/plugins/actions/README.md b/x-pack/plugins/actions/README.md index 4c8cc3aa503e6..54624b94e0de3 100644 --- a/x-pack/plugins/actions/README.md +++ b/x-pack/plugins/actions/README.md @@ -98,7 +98,7 @@ Built-In-Actions are configured using the _xpack.actions_ namespoace under _kiba | _xpack.actions._**enabled** | Feature toggle which enabled Actions in Kibana. | boolean | | _xpack.actions._**whitelistedHosts** | Which _hostnames_ are whitelisted for the Built-In-Action? This list should contain hostnames of every external service you wish to interact with using Webhooks, Email or any other built in Action. Note that you may use the string "\*" in place of a specific hostname to enable Kibana to target any URL, but keep in mind the potential use of such a feature to execute [SSRF](https://www.owasp.org/index.php/Server_Side_Request_Forgery) attacks from your server. | Array | | _xpack.actions._**enabledActionTypes** | A list of _actionTypes_ id's that are enabled. A "\*" may be used as an element to indicate all registered actionTypes should be enabled. The actionTypes registered for Kibana are `.server-log`, `.slack`, `.email`, `.index`, `.pagerduty`, `.webhook`. Default: `["*"]` | Array | -| _xpack.actions._**preconfigured** | A list of preconfigured actions. Default: `[]` | Array | +| _xpack.actions._**preconfigured** | A object of action id / preconfigured actions. Default: `{}` | Array | #### Whitelisting Built-in Action Types diff --git a/x-pack/plugins/actions/server/config.test.ts b/x-pack/plugins/actions/server/config.test.ts index 161a6c31d4e59..e86f2d7832828 100644 --- a/x-pack/plugins/actions/server/config.test.ts +++ b/x-pack/plugins/actions/server/config.test.ts @@ -14,7 +14,7 @@ describe('config validation', () => { "enabledActionTypes": Array [ "*", ], - "preconfigured": Array [], + "preconfigured": Object {}, "whitelistedHosts": Array [ "*", ], @@ -24,16 +24,15 @@ describe('config validation', () => { test('action with preconfigured actions', () => { const config: Record = { - preconfigured: [ - { - id: 'my-slack1', + preconfigured: { + mySlack1: { actionTypeId: '.slack', name: 'Slack #xyz', config: { webhookUrl: 'https://hooks.slack.com/services/abcd/efgh/ijklmnopqrstuvwxyz', }, }, - ], + }, }; expect(configSchema.validate(config)).toMatchInlineSnapshot(` Object { @@ -41,21 +40,57 @@ describe('config validation', () => { "enabledActionTypes": Array [ "*", ], - "preconfigured": Array [ - Object { + "preconfigured": Object { + "mySlack1": Object { "actionTypeId": ".slack", "config": Object { "webhookUrl": "https://hooks.slack.com/services/abcd/efgh/ijklmnopqrstuvwxyz", }, - "id": "my-slack1", "name": "Slack #xyz", "secrets": Object {}, }, - ], + }, "whitelistedHosts": Array [ "*", ], } `); }); + + test('validates preconfigured action ids', () => { + expect(() => + configSchema.validate(preConfiguredActionConfig('')) + ).toThrowErrorMatchingInlineSnapshot( + `"[preconfigured]: invalid preconfigured action id \\"\\""` + ); + + expect(() => + configSchema.validate(preConfiguredActionConfig('constructor')) + ).toThrowErrorMatchingInlineSnapshot( + `"[preconfigured]: invalid preconfigured action id \\"constructor\\""` + ); + + expect(() => + configSchema.validate(preConfiguredActionConfig('__proto__')) + ).toThrowErrorMatchingInlineSnapshot( + `"[preconfigured]: invalid preconfigured action id \\"__proto__\\""` + ); + }); }); + +// object creator that ensures we can create a property named __proto__ on an +// object, via JSON.parse() +function preConfiguredActionConfig(id: string) { + return JSON.parse(`{ + "preconfigured": { + ${JSON.stringify(id)}: { + "actionTypeId": ".server-log", + "name": "server log 1" + }, + "serverLog": { + "actionTypeId": ".server-log", + "name": "server log 2" + } + } + }`); +} diff --git a/x-pack/plugins/actions/server/config.ts b/x-pack/plugins/actions/server/config.ts index 1f04efd1941b4..b2f3fa2680a9c 100644 --- a/x-pack/plugins/actions/server/config.ts +++ b/x-pack/plugins/actions/server/config.ts @@ -7,6 +7,13 @@ import { schema, TypeOf } from '@kbn/config-schema'; import { WhitelistedHosts, EnabledActionTypes } from './actions_config'; +const preconfiguredActionSchema = schema.object({ + name: schema.string({ minLength: 1 }), + actionTypeId: schema.string({ minLength: 1 }), + config: schema.recordOf(schema.string(), schema.any(), { defaultValue: {} }), + secrets: schema.recordOf(schema.string(), schema.any(), { defaultValue: {} }), +}); + export const configSchema = schema.object({ enabled: schema.boolean({ defaultValue: true }), whitelistedHosts: schema.arrayOf( @@ -21,18 +28,26 @@ export const configSchema = schema.object({ defaultValue: [WhitelistedHosts.Any], } ), - preconfigured: schema.arrayOf( - schema.object({ - id: schema.string({ minLength: 1 }), - name: schema.string(), - actionTypeId: schema.string({ minLength: 1 }), - config: schema.recordOf(schema.string(), schema.any(), { defaultValue: {} }), - secrets: schema.recordOf(schema.string(), schema.any(), { defaultValue: {} }), - }), - { - defaultValue: [], - } - ), + preconfigured: schema.recordOf(schema.string(), preconfiguredActionSchema, { + defaultValue: {}, + validate: validatePreconfigured, + }), }); export type ActionsConfig = TypeOf; + +const invalidActionIds = new Set(['', '__proto__', 'constructor']); + +function validatePreconfigured(preconfigured: Record): string | undefined { + // check for ids that should not be used + for (const id of Object.keys(preconfigured)) { + if (invalidActionIds.has(id)) { + return `invalid preconfigured action id "${id}"`; + } + } + + // in case __proto__ was used as a preconfigured action id ... + if (Object.getPrototypeOf(preconfigured) !== Object.getPrototypeOf({})) { + return `invalid preconfigured action id "__proto__"`; + } +} diff --git a/x-pack/plugins/actions/server/plugin.test.ts b/x-pack/plugins/actions/server/plugin.test.ts index 2b334953063d1..8673d992ada98 100644 --- a/x-pack/plugins/actions/server/plugin.test.ts +++ b/x-pack/plugins/actions/server/plugin.test.ts @@ -12,6 +12,7 @@ import { taskManagerMock } from '../../task_manager/server/mocks'; import { eventLogMock } from '../../event_log/server/mocks'; import { UsageCollectionSetup } from 'src/plugins/usage_collection/server'; import { ActionType } from './types'; +import { ActionsConfig } from './config'; import { ActionsPlugin, ActionsPluginsSetup, @@ -31,33 +32,11 @@ describe('Actions Plugin', () => { let pluginsSetup: jest.Mocked; beforeEach(() => { - context = coreMock.createPluginInitializerContext({ - preconfigured: [ - { - id: 'my-slack1', - actionTypeId: '.slack', - name: 'Slack #xyz', - description: 'Send a message to the #xyz channel', - config: { - webhookUrl: 'https://hooks.slack.com/services/abcd/efgh/ijklmnopqrstuvwxyz', - }, - }, - { - id: 'custom-system-abc-connector', - actionTypeId: 'system-abc-action-type', - description: 'Send a notification to system ABC', - name: 'System ABC', - config: { - xyzConfig1: 'value1', - xyzConfig2: 'value2', - listOfThings: ['a', 'b', 'c', 'd'], - }, - secrets: { - xyzSecret1: 'credential1', - xyzSecret2: 'credential2', - }, - }, - ], + context = coreMock.createPluginInitializerContext({ + enabled: true, + enabledActionTypes: ['*'], + whitelistedHosts: ['*'], + preconfigured: {}, }); plugin = new ActionsPlugin(context); coreSetup = coreMock.createSetup(); @@ -192,6 +171,7 @@ describe('Actions Plugin', () => { }); }); }); + describe('start()', () => { let plugin: ActionsPlugin; let coreSetup: ReturnType; @@ -200,8 +180,18 @@ describe('Actions Plugin', () => { let pluginsStart: jest.Mocked; beforeEach(() => { - const context = coreMock.createPluginInitializerContext({ - preconfigured: [], + const context = coreMock.createPluginInitializerContext({ + enabled: true, + enabledActionTypes: ['*'], + whitelistedHosts: ['*'], + preconfigured: { + preconfiguredServerLog: { + actionTypeId: '.server-log', + name: 'preconfigured-server-log', + config: {}, + secrets: {}, + }, + }, }); plugin = new ActionsPlugin(context); coreSetup = coreMock.createSetup(); @@ -220,6 +210,15 @@ describe('Actions Plugin', () => { }); describe('getActionsClientWithRequest()', () => { + it('should handle preconfigured actions', async () => { + // coreMock.createSetup doesn't support Plugin generics + // eslint-disable-next-line @typescript-eslint/no-explicit-any + await plugin.setup(coreSetup as any, pluginsSetup); + const pluginStart = plugin.start(coreStart, pluginsStart); + + expect(pluginStart.isActionExecutable('preconfiguredServerLog', '.server-log')).toBe(true); + }); + it('should not throw error when ESO plugin not using a generated key', async () => { // coreMock.createSetup doesn't support Plugin generics // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/x-pack/plugins/actions/server/plugin.ts b/x-pack/plugins/actions/server/plugin.ts index f14df794bbf47..bc7440c8bee4d 100644 --- a/x-pack/plugins/actions/server/plugin.ts +++ b/x-pack/plugins/actions/server/plugin.ts @@ -150,12 +150,14 @@ export class ActionsPlugin implements Plugin, Plugi const actionsConfig = (await this.config) as ActionsConfig; const actionsConfigUtils = getActionsConfigurationUtilities(actionsConfig); - this.preconfiguredActions.push( - ...actionsConfig.preconfigured.map( - preconfiguredAction => - ({ ...preconfiguredAction, isPreconfigured: true } as PreConfiguredAction) - ) - ); + for (const preconfiguredId of Object.keys(actionsConfig.preconfigured)) { + this.preconfiguredActions.push({ + ...actionsConfig.preconfigured[preconfiguredId], + id: preconfiguredId, + isPreconfigured: true, + }); + } + const actionTypeRegistry = new ActionTypeRegistry({ taskRunnerFactory, taskManager: plugins.taskManager, diff --git a/x-pack/test/alerting_api_integration/common/config.ts b/x-pack/test/alerting_api_integration/common/config.ts index d6b5b40d99d99..5fa87446e0f43 100644 --- a/x-pack/test/alerting_api_integration/common/config.ts +++ b/x-pack/test/alerting_api_integration/common/config.ts @@ -83,17 +83,15 @@ export function createTestConfig(name: string, options: CreateTestConfigOptions) ])}`, `--xpack.actions.enabledActionTypes=${JSON.stringify(enabledActionTypes)}`, '--xpack.eventLog.logEntries=true', - `--xpack.actions.preconfigured=${JSON.stringify([ - { - id: 'my-slack1', + `--xpack.actions.preconfigured=${JSON.stringify({ + 'my-slack1': { actionTypeId: '.slack', name: 'Slack#xyz', config: { webhookUrl: 'https://hooks.slack.com/services/abcd/efgh/ijklmnopqrstuvwxyz', }, }, - { - id: 'custom-system-abc-connector', + 'custom-system-abc-connector': { actionTypeId: 'system-abc-action-type', name: 'SystemABC', config: { @@ -106,8 +104,7 @@ export function createTestConfig(name: string, options: CreateTestConfigOptions) xyzSecret2: 'credential2', }, }, - { - id: 'preconfigured-es-index-action', + 'preconfigured-es-index-action': { actionTypeId: '.index', name: 'preconfigured_es_index_action', config: { @@ -116,8 +113,7 @@ export function createTestConfig(name: string, options: CreateTestConfigOptions) executionTimeField: 'timestamp', }, }, - { - id: 'preconfigured.test.index-record', + 'preconfigured.test.index-record': { actionTypeId: 'test.index-record', name: 'Test:_Preconfigured_Index_Record', config: { @@ -127,7 +123,7 @@ export function createTestConfig(name: string, options: CreateTestConfigOptions) encrypted: 'this-is-also-ignored-and-also-required', }, }, - ])}`, + })}`, ...disabledPlugins.map(key => `--xpack.${key}.enabled=false`), ...plugins.map( pluginDir => diff --git a/x-pack/test/functional_with_es_ssl/config.ts b/x-pack/test/functional_with_es_ssl/config.ts index ef2270fb97745..50de76d67e06b 100644 --- a/x-pack/test/functional_with_es_ssl/config.ts +++ b/x-pack/test/functional_with_es_ssl/config.ts @@ -66,21 +66,19 @@ export default async function({ readConfigFile }: FtrConfigProviderContext) { `--elasticsearch.ssl.certificateAuthorities=${CA_CERT_PATH}`, `--plugin-path=${join(__dirname, 'fixtures', 'plugins', 'alerts')}`, `--xpack.actions.enabledActionTypes=${JSON.stringify(enabledActionTypes)}`, - `--xpack.actions.preconfigured=${JSON.stringify([ - { - id: 'my-slack1', + `--xpack.actions.preconfigured=${JSON.stringify({ + 'my-slack1': { actionTypeId: '.slack', name: 'Slack#xyztest', config: { webhookUrl: 'https://hooks.slack.com/services/abcd/efgh/ijklmnopqrstuvwxyz', }, }, - { - id: 'my-server-log', + 'my-server-log': { actionTypeId: '.server-log', name: 'Serverlog#xyz', }, - ])}`, + })}`, ], }, }; From 64c09318fe18e24166a54b914ac8dfc2d38c2fc1 Mon Sep 17 00:00:00 2001 From: Gidi Meir Morris Date: Thu, 7 May 2020 20:52:11 +0100 Subject: [PATCH 015/102] [Event log] Fix flaky test (#65658) fixes flaky test in Event Log --- .../event_log/public_api_integration.ts | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/x-pack/test/plugin_api_integration/test_suites/event_log/public_api_integration.ts b/x-pack/test/plugin_api_integration/test_suites/event_log/public_api_integration.ts index f5cc1cc166ee8..9b1e357a7c9d4 100644 --- a/x-pack/test/plugin_api_integration/test_suites/event_log/public_api_integration.ts +++ b/x-pack/test/plugin_api_integration/test_suites/event_log/public_api_integration.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { merge, omit, times, chunk, isEmpty } from 'lodash'; +import { merge, omit, chunk, isEmpty } from 'lodash'; import uuid from 'uuid'; import expect from '@kbn/expect/expect.js'; import moment from 'moment'; @@ -19,9 +19,7 @@ export default function({ getService }: FtrProviderContext) { const log = getService('log'); const retry = getService('retry'); - // FLAKY: https://github.com/elastic/kibana/issues/64723 - // FLAKY: https://github.com/elastic/kibana/issues/64812 - describe.skip('Event Log public API', () => { + describe('Event Log public API', () => { it('should allow querying for events by Saved Object', async () => { const id = uuid.v4(); @@ -45,11 +43,7 @@ export default function({ getService }: FtrProviderContext) { it('should support pagination for events', async () => { const id = uuid.v4(); - const [firstExpectedEvent, ...expectedEvents] = times(6, () => fakeEvent(id)); - - // run one first to create the SO and avoid clashes - await logTestEvent(id, firstExpectedEvent); - await Promise.all(expectedEvents.map(event => logTestEvent(id, event))); + const expectedEvents = await logFakeEvents(id, 6); await retry.try(async () => { const { @@ -59,10 +53,7 @@ export default function({ getService }: FtrProviderContext) { expect(foundEvents.length).to.be(6); }); - const [expectedFirstPage, expectedSecondPage] = chunk( - [firstExpectedEvent, ...expectedEvents], - 3 - ); + const [expectedFirstPage, expectedSecondPage] = chunk(expectedEvents, 3); const { body: { data: firstPage }, From 9f11d21df530ded0496548b26f8bf6376926271c Mon Sep 17 00:00:00 2001 From: Poff Poffenberger Date: Thu, 7 May 2020 14:54:00 -0500 Subject: [PATCH 016/102] [Canvas] Fix nav link behavior in Canvas (#65590) * wip * Storing last page for canvas in session storage * Fix bad path * Fix bad merge * Cleanup and adding some types * Fixing types * PR feedback and storage refactor Co-authored-by: Corey Robertson --- x-pack/plugins/canvas/common/lib/constants.ts | 2 +- x-pack/plugins/canvas/public/application.tsx | 8 +++-- .../canvas/public/components/app/index.js | 6 ++-- x-pack/plugins/canvas/public/lib/clipboard.ts | 17 ++------- .../plugins/canvas/public/lib/get_window.ts | 12 +++++-- x-pack/plugins/canvas/public/lib/storage.ts | 35 +++++++++++++++++++ x-pack/plugins/canvas/public/plugin.tsx | 23 +++++++++++- .../plugins/canvas/public/services/index.ts | 32 +++++++++++++---- .../canvas/public/services/nav_link.ts | 31 ++++++++++++++++ 9 files changed, 136 insertions(+), 30 deletions(-) create mode 100644 x-pack/plugins/canvas/public/lib/storage.ts create mode 100644 x-pack/plugins/canvas/public/services/nav_link.ts diff --git a/x-pack/plugins/canvas/common/lib/constants.ts b/x-pack/plugins/canvas/common/lib/constants.ts index a37dc3fd6a7b3..f2155d9202939 100644 --- a/x-pack/plugins/canvas/common/lib/constants.ts +++ b/x-pack/plugins/canvas/common/lib/constants.ts @@ -18,7 +18,7 @@ export const API_ROUTE_WORKPAD_STRUCTURES = `${API_ROUTE}/workpad-structures`; export const API_ROUTE_CUSTOM_ELEMENT = `${API_ROUTE}/custom-element`; export const LOCALSTORAGE_PREFIX = `kibana.canvas`; export const LOCALSTORAGE_CLIPBOARD = `${LOCALSTORAGE_PREFIX}.clipboard`; -export const LOCALSTORAGE_LASTPAGE = 'canvas:lastpage'; +export const SESSIONSTORAGE_LASTPATH = 'lastPath:canvas'; export const FETCH_TIMEOUT = 30000; // 30 seconds export const CANVAS_USAGE_TYPE = 'canvas'; export const DEFAULT_WORKPAD_CSS = '.canvasPage {\n\n}'; diff --git a/x-pack/plugins/canvas/public/application.tsx b/x-pack/plugins/canvas/public/application.tsx index 284023e74d137..9c2aa821be2d5 100644 --- a/x-pack/plugins/canvas/public/application.tsx +++ b/x-pack/plugins/canvas/public/application.tsx @@ -10,8 +10,9 @@ import ReactDOM from 'react-dom'; import { I18nProvider } from '@kbn/i18n/react'; import { i18n } from '@kbn/i18n'; import { Provider } from 'react-redux'; +import { BehaviorSubject } from 'rxjs'; -import { AppMountParameters, CoreStart, CoreSetup } from 'kibana/public'; +import { AppMountParameters, CoreStart, CoreSetup, AppUpdater } from 'kibana/public'; import { CanvasStartDeps, CanvasSetupDeps } from './plugin'; // @ts-ignore Untyped local @@ -88,9 +89,10 @@ export const initializeCanvas = async ( coreStart: CoreStart, setupPlugins: CanvasSetupDeps, startPlugins: CanvasStartDeps, - registries: SetupRegistries + registries: SetupRegistries, + appUpdater: BehaviorSubject ) => { - startServices(coreSetup, coreStart, setupPlugins, startPlugins); + startServices(coreSetup, coreStart, setupPlugins, startPlugins, appUpdater); // Create Store const canvasStore = await createStore(coreSetup, setupPlugins); diff --git a/x-pack/plugins/canvas/public/components/app/index.js b/x-pack/plugins/canvas/public/components/app/index.js index de0d4c190eae6..750132dadb97d 100644 --- a/x-pack/plugins/canvas/public/components/app/index.js +++ b/x-pack/plugins/canvas/public/components/app/index.js @@ -8,6 +8,7 @@ import { connect } from 'react-redux'; import { compose, withProps } from 'recompose'; import { getAppReady, getBasePath } from '../../state/selectors/app'; import { appReady, appError } from '../../state/actions/app'; +import { withKibana } from '../../../../../../src/plugins/kibana_react/public'; import { App as Component } from './app'; @@ -44,7 +45,8 @@ const mergeProps = (stateProps, dispatchProps, ownProps) => { export const App = compose( connect(mapStateToProps, mapDispatchToProps, mergeProps), - withProps(() => ({ - onRouteChange: () => undefined, + withKibana, + withProps(props => ({ + onRouteChange: props.kibana.services.canvas.navLink.updatePath, })) )(Component); diff --git a/x-pack/plugins/canvas/public/lib/clipboard.ts b/x-pack/plugins/canvas/public/lib/clipboard.ts index 11755807aa533..cb940fd064a47 100644 --- a/x-pack/plugins/canvas/public/lib/clipboard.ts +++ b/x-pack/plugins/canvas/public/lib/clipboard.ts @@ -4,22 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ -import { Storage } from '../../../../../src/plugins/kibana_utils/public'; import { LOCALSTORAGE_CLIPBOARD } from '../../common/lib/constants'; -import { getWindow } from './get_window'; - -let storage: Storage; - -const getStorage = (): Storage => { - if (!storage) { - storage = new Storage(getWindow().localStorage); - } - - return storage; -}; +import { getLocalStorage } from './storage'; export const setClipboardData = (data: any) => { - getStorage().set(LOCALSTORAGE_CLIPBOARD, JSON.stringify(data)); + getLocalStorage().set(LOCALSTORAGE_CLIPBOARD, JSON.stringify(data)); }; -export const getClipboardData = () => getStorage().get(LOCALSTORAGE_CLIPBOARD); +export const getClipboardData = () => getLocalStorage().get(LOCALSTORAGE_CLIPBOARD); diff --git a/x-pack/plugins/canvas/public/lib/get_window.ts b/x-pack/plugins/canvas/public/lib/get_window.ts index 42c632f4a514f..c8fb035d4d33f 100644 --- a/x-pack/plugins/canvas/public/lib/get_window.ts +++ b/x-pack/plugins/canvas/public/lib/get_window.ts @@ -5,10 +5,18 @@ */ // return window if it exists, otherwise just return an object literal -const windowObj = { location: null, localStorage: {} as Window['localStorage'] }; +const windowObj = { + location: null, + localStorage: {} as Window['localStorage'], + sessionStorage: {} as Window['sessionStorage'], +}; export const getWindow = (): | Window - | { location: Location | null; localStorage: Window['localStorage'] } => { + | { + location: Location | null; + localStorage: Window['localStorage']; + sessionStorage: Window['sessionStorage']; + } => { return typeof window === 'undefined' ? windowObj : window; }; diff --git a/x-pack/plugins/canvas/public/lib/storage.ts b/x-pack/plugins/canvas/public/lib/storage.ts new file mode 100644 index 0000000000000..47c8cc741eaf3 --- /dev/null +++ b/x-pack/plugins/canvas/public/lib/storage.ts @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { Storage } from '../../../../../src/plugins/kibana_utils/public'; +import { getWindow } from './get_window'; + +export enum StorageType { + Local = 'localStorage', + Session = 'sessionStorage', +} + +const storages: { + [x in StorageType]: Storage | null; +} = { + [StorageType.Local]: null, + [StorageType.Session]: null, +}; + +const getStorage = (type: StorageType): Storage => { + const storage = storages[type] || new Storage(getWindow()[type]); + storages[type] = storage; + + return storage; +}; + +export const getLocalStorage = (): Storage => { + return getStorage(StorageType.Local); +}; + +export const getSessionStorage = (): Storage => { + return getStorage(StorageType.Session); +}; diff --git a/x-pack/plugins/canvas/public/plugin.tsx b/x-pack/plugins/canvas/public/plugin.tsx index ba57d1475bc4f..c2192818e528b 100644 --- a/x-pack/plugins/canvas/public/plugin.tsx +++ b/x-pack/plugins/canvas/public/plugin.tsx @@ -4,15 +4,19 @@ * you may not use this file except in compliance with the Elastic License. */ +import { BehaviorSubject } from 'rxjs'; import { CoreSetup, CoreStart, Plugin, AppMountParameters, + AppUpdater, DEFAULT_APP_CATEGORIES, } from '../../../../src/core/public'; import { HomePublicPluginSetup } from '../../../../src/plugins/home/public'; import { initLoadingIndicator } from './lib/loading_indicator'; +import { getSessionStorage } from './lib/storage'; +import { SESSIONSTORAGE_LASTPATH } from '../common/lib/constants'; import { featureCatalogueEntry } from './feature_catalogue_entry'; import { ExpressionsSetup, ExpressionsStart } from '../../../../src/plugins/expressions/public'; import { DataPublicPluginSetup } from '../../../../src/plugins/data/public'; @@ -60,6 +64,7 @@ export type CanvasStart = void; /** @internal */ export class CanvasPlugin implements Plugin { + private appUpdater = new BehaviorSubject(() => ({})); // TODO: Do we want to completely move canvas_plugin_src into it's own plugin? private srcPlugin = new CanvasSrcPlugin(); @@ -68,12 +73,21 @@ export class CanvasPlugin this.srcPlugin.setup(core, { canvas: canvasApi }); + // Set the nav link to the last saved url if we have one in storage + const lastUrl = getSessionStorage().get(SESSIONSTORAGE_LASTPATH); + if (lastUrl) { + this.appUpdater.next(() => ({ + defaultPath: `#${lastUrl}`, + })); + } + core.application.register({ category: DEFAULT_APP_CATEGORIES.kibana, id: 'canvas', title: 'Canvas', euiIconType: 'canvasApp', order: 3000, + updater$: this.appUpdater, mount: async (params: AppMountParameters) => { // Load application bundle const { renderApp, initializeCanvas, teardownCanvas } = await import('./application'); @@ -81,7 +95,14 @@ export class CanvasPlugin // Get start services const [coreStart, depsStart] = await core.getStartServices(); - const canvasStore = await initializeCanvas(core, coreStart, plugins, depsStart, registries); + const canvasStore = await initializeCanvas( + core, + coreStart, + plugins, + depsStart, + registries, + this.appUpdater + ); const unmount = renderApp(coreStart, depsStart, params, canvasStore); diff --git a/x-pack/plugins/canvas/public/services/index.ts b/x-pack/plugins/canvas/public/services/index.ts index abc46beaa3e64..42176f953c331 100644 --- a/x-pack/plugins/canvas/public/services/index.ts +++ b/x-pack/plugins/canvas/public/services/index.ts @@ -4,16 +4,19 @@ * you may not use this file except in compliance with the Elastic License. */ -import { CoreSetup, CoreStart } from '../../../../../src/core/public'; +import { BehaviorSubject } from 'rxjs'; +import { CoreSetup, CoreStart, AppUpdater } from '../../../../../src/core/public'; import { CanvasSetupDeps, CanvasStartDeps } from '../plugin'; import { notifyServiceFactory } from './notify'; import { platformServiceFactory } from './platform'; +import { navLinkServiceFactory } from './nav_link'; export type CanvasServiceFactory = ( coreSetup: CoreSetup, coreStart: CoreStart, canvasSetupPlugins: CanvasSetupDeps, - canvasStartPlugins: CanvasStartDeps + canvasStartPlugins: CanvasStartDeps, + appUpdater: BehaviorSubject ) => Service; class CanvasServiceProvider { @@ -28,9 +31,16 @@ class CanvasServiceProvider { coreSetup: CoreSetup, coreStart: CoreStart, canvasSetupPlugins: CanvasSetupDeps, - canvasStartPlugins: CanvasStartDeps + canvasStartPlugins: CanvasStartDeps, + appUpdater: BehaviorSubject ) { - this.service = this.factory(coreSetup, coreStart, canvasSetupPlugins, canvasStartPlugins); + this.service = this.factory( + coreSetup, + coreStart, + canvasSetupPlugins, + canvasStartPlugins, + appUpdater + ); } getService(): Service { @@ -51,20 +61,24 @@ export type ServiceFromProvider

= P extends CanvasServiceProvider ? export const services = { notify: new CanvasServiceProvider(notifyServiceFactory), platform: new CanvasServiceProvider(platformServiceFactory), + navLink: new CanvasServiceProvider(navLinkServiceFactory), }; export interface CanvasServices { notify: ServiceFromProvider; + platform: ServiceFromProvider; + navLink: ServiceFromProvider; } export const startServices = ( coreSetup: CoreSetup, coreStart: CoreStart, canvasSetupPlugins: CanvasSetupDeps, - canvasStartPlugins: CanvasStartDeps + canvasStartPlugins: CanvasStartDeps, + appUpdater: BehaviorSubject ) => { Object.entries(services).forEach(([key, provider]) => - provider.start(coreSetup, coreStart, canvasSetupPlugins, canvasStartPlugins) + provider.start(coreSetup, coreStart, canvasSetupPlugins, canvasStartPlugins, appUpdater) ); }; @@ -72,4 +86,8 @@ export const stopServices = () => { Object.entries(services).forEach(([key, provider]) => provider.stop()); }; -export const { notify: notifyService, platform: platformService } = services; +export const { + notify: notifyService, + platform: platformService, + navLink: navLinkService, +} = services; diff --git a/x-pack/plugins/canvas/public/services/nav_link.ts b/x-pack/plugins/canvas/public/services/nav_link.ts new file mode 100644 index 0000000000000..5061498458006 --- /dev/null +++ b/x-pack/plugins/canvas/public/services/nav_link.ts @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { CanvasServiceFactory } from '.'; +import { SESSIONSTORAGE_LASTPATH } from '../../common/lib/constants'; +import { getSessionStorage } from '../lib/storage'; + +interface NavLinkService { + updatePath: (path: string) => void; +} + +export const navLinkServiceFactory: CanvasServiceFactory = ( + coreSetup, + coreStart, + setupPlugins, + startPlugins, + appUpdater +) => { + return { + updatePath: (path: string) => { + appUpdater.next(() => ({ + defaultPath: `#${path}`, + })); + + getSessionStorage().set(SESSIONSTORAGE_LASTPATH, path); + }, + }; +}; From 8cf6730dfe016cf9fcc2c3f25f7a6f4ff03d63a6 Mon Sep 17 00:00:00 2001 From: Wylie Conlon Date: Thu, 7 May 2020 16:02:08 -0400 Subject: [PATCH 017/102] [Lens] Type safe migrations (#65576) * [Lens] Type safe migrations * Commit API changes * Remove optional chaining for required properties Co-authored-by: Elastic Machine --- x-pack/plugins/lens/server/migrations.ts | 101 ++++++++++++++++------- 1 file changed, 73 insertions(+), 28 deletions(-) diff --git a/x-pack/plugins/lens/server/migrations.ts b/x-pack/plugins/lens/server/migrations.ts index a15e2b3692d02..eba7865028645 100644 --- a/x-pack/plugins/lens/server/migrations.ts +++ b/x-pack/plugins/lens/server/migrations.ts @@ -6,7 +6,35 @@ import { cloneDeep } from 'lodash'; import { fromExpression, toExpression, Ast, ExpressionFunctionAST } from '@kbn/interpreter/common'; -import { SavedObjectMigrationFn } from 'src/core/server'; +import { SavedObjectMigrationMap, SavedObjectMigrationFn } from 'src/core/server'; + +interface LensDocShape { + id?: string; + type?: string; + visualizationType: string | null; + title: string; + expression: string | null; + state: { + datasourceMetaData: { + filterableIndexPatterns: Array<{ id: string; title: string }>; + }; + datasourceStates: { + // This is hardcoded as our only datasource + indexpattern: { + layers: Record< + string, + { + columnOrder: string[]; + columns: Record; + } + >; + }; + }; + visualization: VisualizationState; + query: unknown; + filters: unknown[]; + }; +} interface XYLayerPre77 { layerId: string; @@ -15,13 +43,23 @@ interface XYLayerPre77 { accessors: string[]; } +interface XYStatePre77 { + layers: XYLayerPre77[]; +} + +interface XYStatePost77 { + layers: Array>; +} + /** * Removes the `lens_auto_date` subexpression from a stored expression * string. For example: aggConfigs={lens_auto_date aggConfigs="JSON string"} */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -const removeLensAutoDate: SavedObjectMigrationFn = (doc, context) => { - const expression: string = doc.attributes?.expression; +const removeLensAutoDate: SavedObjectMigrationFn = (doc, context) => { + const expression = doc.attributes.expression; + if (!expression) { + return doc; + } try { const ast = fromExpression(expression); const newChain: ExpressionFunctionAST[] = ast.chain.map(topNode => { @@ -74,9 +112,11 @@ const removeLensAutoDate: SavedObjectMigrationFn = (doc, context) => { /** * Adds missing timeField arguments to esaggs in the Lens expression */ -// eslint-disable-next-line @typescript-eslint/no-explicit-any -const addTimeFieldToEsaggs: SavedObjectMigrationFn = (doc, context) => { - const expression: string = doc.attributes?.expression; +const addTimeFieldToEsaggs: SavedObjectMigrationFn = (doc, context) => { + const expression = doc.attributes.expression; + if (!expression) { + return doc; + } try { const ast = fromExpression(expression); @@ -133,27 +173,32 @@ const addTimeFieldToEsaggs: SavedObjectMigrationFn = (doc, context) => } }; -// eslint-disable-next-line @typescript-eslint/no-explicit-any -export const migrations: Record> = { - '7.7.0': doc => { - const newDoc = cloneDeep(doc); - if (newDoc.attributes?.visualizationType === 'lnsXY') { - const datasourceState = newDoc.attributes.state?.datasourceStates?.indexpattern; - const datasourceLayers = datasourceState?.layers ?? {}; - const xyState = newDoc.attributes.state?.visualization; - newDoc.attributes.state.visualization.layers = xyState.layers.map((layer: XYLayerPre77) => { - const layerId = layer.layerId; - const datasource = datasourceLayers[layerId]; - return { - ...layer, - xAccessor: datasource?.columns[layer.xAccessor] ? layer.xAccessor : undefined, - splitAccessor: datasource?.columns[layer.splitAccessor] ? layer.splitAccessor : undefined, - accessors: layer.accessors.filter(accessor => !!datasource?.columns[accessor]), - }; - }) as typeof xyState.layers; - } - return newDoc; - }, +const removeInvalidAccessors: SavedObjectMigrationFn< + LensDocShape, + LensDocShape +> = doc => { + const newDoc = cloneDeep(doc); + if (newDoc.attributes.visualizationType === 'lnsXY') { + const datasourceLayers = newDoc.attributes.state.datasourceStates.indexpattern.layers || {}; + const xyState = newDoc.attributes.state.visualization; + (newDoc.attributes as LensDocShape< + XYStatePost77 + >).state.visualization.layers = xyState.layers.map((layer: XYLayerPre77) => { + const layerId = layer.layerId; + const datasource = datasourceLayers[layerId]; + return { + ...layer, + xAccessor: datasource?.columns[layer.xAccessor] ? layer.xAccessor : undefined, + splitAccessor: datasource?.columns[layer.splitAccessor] ? layer.splitAccessor : undefined, + accessors: layer.accessors.filter(accessor => !!datasource?.columns[accessor]), + }; + }); + } + return newDoc; +}; + +export const migrations: SavedObjectMigrationMap = { + '7.7.0': removeInvalidAccessors, // The order of these migrations matter, since the timefield migration relies on the aggConfigs // sitting directly on the esaggs as an argument and not a nested function (which lens_auto_date was). '7.8.0': (doc, context) => addTimeFieldToEsaggs(removeLensAutoDate(doc, context), context), From 3369f2093a3c9d6ba1c796946707b385de81d15e Mon Sep 17 00:00:00 2001 From: John Dorlus Date: Thu, 7 May 2020 16:10:02 -0400 Subject: [PATCH 018/102] Removed skip to enable test. (#65575) --- .../apis/management/index_management/indices.js | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/x-pack/test/api_integration/apis/management/index_management/indices.js b/x-pack/test/api_integration/apis/management/index_management/indices.js index 0412192808700..ac50a20b02e3b 100644 --- a/x-pack/test/api_integration/apis/management/index_management/indices.js +++ b/x-pack/test/api_integration/apis/management/index_management/indices.js @@ -34,8 +34,7 @@ export default function({ getService }) { clearCache, } = registerHelpers({ supertest }); - // FLAKY: https://github.com/elastic/kibana/issues/64473 - describe.skip('indices', () => { + describe('indices', () => { after(() => Promise.all([cleanUpEsResources()])); describe('clear cache', () => { From 5f0d96d953dd7734ca1ed313e19d7f103691ff36 Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Thu, 7 May 2020 23:51:39 +0300 Subject: [PATCH 019/102] [Data plugin] cleanup - remove unused getRoutes / routes from indexPattern object (#65683) * [Data plugin] cleanup - remove unused getRoutes / routes from indexPattern object * Update index.ts --- ...plugin-plugins-data-public.indexpattern.md | 1 - ...plugins-data-public.indexpattern.routes.md | 17 ------- ...lugin-plugins-data-public.indexpatterns.md | 1 - src/plugins/data/public/index.ts | 3 -- .../data/public/index_patterns/index.ts | 1 - .../index_patterns/index_pattern.ts | 6 +-- .../data/public/index_patterns/utils.ts | 10 ---- src/plugins/data/public/public.api.md | 50 ++++++++----------- src/test_utils/public/stub_index_pattern.js | 1 - 9 files changed, 21 insertions(+), 69 deletions(-) delete mode 100644 docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern.routes.md diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern.md index 21a155ba977c9..60cbfd30e667d 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern.md @@ -28,7 +28,6 @@ export declare class IndexPattern implements IIndexPattern | [formatHit](./kibana-plugin-plugins-data-public.indexpattern.formathit.md) | | any | | | [id](./kibana-plugin-plugins-data-public.indexpattern.id.md) | | string | | | [metaFields](./kibana-plugin-plugins-data-public.indexpattern.metafields.md) | | string[] | | -| [routes](./kibana-plugin-plugins-data-public.indexpattern.routes.md) | | {
edit: string;
addField: string;
indexedFields: string;
scriptedFields: string;
sourceFilters: string;
} | | | [timeFieldName](./kibana-plugin-plugins-data-public.indexpattern.timefieldname.md) | | string | undefined | | | [title](./kibana-plugin-plugins-data-public.indexpattern.title.md) | | string | | | [type](./kibana-plugin-plugins-data-public.indexpattern.type.md) | | string | | diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern.routes.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern.routes.md deleted file mode 100644 index 81e7abd4f9609..0000000000000 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpattern.routes.md +++ /dev/null @@ -1,17 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-data-public](./kibana-plugin-plugins-data-public.md) > [IndexPattern](./kibana-plugin-plugins-data-public.indexpattern.md) > [routes](./kibana-plugin-plugins-data-public.indexpattern.routes.md) - -## IndexPattern.routes property - -Signature: - -```typescript -get routes(): { - edit: string; - addField: string; - indexedFields: string; - scriptedFields: string; - sourceFilters: string; - }; -``` diff --git a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatterns.md b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatterns.md index fa97666a61b93..39c8b0a700c8a 100644 --- a/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatterns.md +++ b/docs/development/plugins/data/public/kibana-plugin-plugins-data-public.indexpatterns.md @@ -18,7 +18,6 @@ indexPatterns: { validate: typeof validateIndexPattern; getFromSavedObject: typeof getFromSavedObject; flattenHitWrapper: typeof flattenHitWrapper; - getRoutes: typeof getRoutes; formatHitProvider: typeof formatHitProvider; } ``` diff --git a/src/plugins/data/public/index.ts b/src/plugins/data/public/index.ts index d4433f3825fea..69dd97a881797 100644 --- a/src/plugins/data/public/index.ts +++ b/src/plugins/data/public/index.ts @@ -230,7 +230,6 @@ import { validateIndexPattern, getFromSavedObject, flattenHitWrapper, - getRoutes, formatHitProvider, } from './index_patterns'; @@ -246,8 +245,6 @@ export const indexPatterns = { validate: validateIndexPattern, getFromSavedObject, flattenHitWrapper, - // TODO: exported only in stub_index_pattern test. Move into data plugin and remove export. - getRoutes, formatHitProvider, }; diff --git a/src/plugins/data/public/index_patterns/index.ts b/src/plugins/data/public/index_patterns/index.ts index e05db0e4d4cec..58c2cae1de0f3 100644 --- a/src/plugins/data/public/index_patterns/index.ts +++ b/src/plugins/data/public/index_patterns/index.ts @@ -26,7 +26,6 @@ export { getFromSavedObject, isDefault, } from './lib'; -export { getRoutes } from './utils'; export { flattenHitWrapper, formatHitProvider } from './index_patterns'; export { getIndexPatternFieldListCreator, Field, IIndexPatternFieldList } from './fields'; diff --git a/src/plugins/data/public/index_patterns/index_patterns/index_pattern.ts b/src/plugins/data/public/index_patterns/index_patterns/index_pattern.ts index f39be78433710..98ec4495cef29 100644 --- a/src/plugins/data/public/index_patterns/index_patterns/index_pattern.ts +++ b/src/plugins/data/public/index_patterns/index_patterns/index_pattern.ts @@ -30,7 +30,7 @@ import { import { ES_FIELD_TYPES, KBN_FIELD_TYPES, IIndexPattern, IFieldType } from '../../../common'; -import { findByTitle, getRoutes } from '../utils'; +import { findByTitle } from '../utils'; import { IndexPatternMissingIndices } from '../lib'; import { Field, IIndexPatternFieldList, getIndexPatternFieldListCreator } from '../fields'; import { createFieldsFetcher } from './_fields_fetcher'; @@ -190,10 +190,6 @@ export class IndexPattern implements IIndexPattern { return this.indexFields(forceFieldRefresh); } - public get routes() { - return getRoutes(); - } - getComputedFields() { const scriptFields: any = {}; if (!this.fields) { diff --git a/src/plugins/data/public/index_patterns/utils.ts b/src/plugins/data/public/index_patterns/utils.ts index 0ecc87f3080fd..c3f9af62f8c0e 100644 --- a/src/plugins/data/public/index_patterns/utils.ts +++ b/src/plugins/data/public/index_patterns/utils.ts @@ -48,13 +48,3 @@ export async function findByTitle( (obj: SimpleSavedObject) => obj.get('title').toLowerCase() === title.toLowerCase() ); } - -export function getRoutes() { - return { - edit: '/management/kibana/index_patterns/{{id}}', - addField: '/management/kibana/index_patterns/{{id}}/create-field', - indexedFields: '/management/kibana/index_patterns/{{id}}?_a=(tab:indexedFields)', - scriptedFields: '/management/kibana/index_patterns/{{id}}?_a=(tab:scriptedFields)', - sourceFilters: '/management/kibana/index_patterns/{{id}}?_a=(tab:sourceFilters)', - }; -} diff --git a/src/plugins/data/public/public.api.md b/src/plugins/data/public/public.api.md index cb1e1d2bd0efe..ee56ad60441f4 100644 --- a/src/plugins/data/public/public.api.md +++ b/src/plugins/data/public/public.api.md @@ -912,14 +912,6 @@ export class IndexPattern implements IIndexPattern { // (undocumented) removeScriptedField(field: IFieldType): Promise; // (undocumented) - get routes(): { - edit: string; - addField: string; - indexedFields: string; - scriptedFields: string; - sourceFilters: string; - }; - // (undocumented) save(saveAttempts?: number): Promise; // (undocumented) timeFieldName: string | undefined; @@ -1021,7 +1013,6 @@ export const indexPatterns: { validate: typeof validateIndexPattern; getFromSavedObject: typeof getFromSavedObject; flattenHitWrapper: typeof flattenHitWrapper; - getRoutes: typeof getRoutes; formatHitProvider: typeof formatHitProvider; }; @@ -1812,27 +1803,26 @@ export type TSearchStrategyProvider = (context: ISearc // src/plugins/data/public/index.ts:179:26 - (ae-forgotten-export) The symbol "UrlFormat" needs to be exported by the entry point index.d.ts // src/plugins/data/public/index.ts:179:26 - (ae-forgotten-export) The symbol "StringFormat" needs to be exported by the entry point index.d.ts // src/plugins/data/public/index.ts:179:26 - (ae-forgotten-export) The symbol "TruncateFormat" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:238:27 - (ae-forgotten-export) The symbol "isFilterable" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:238:27 - (ae-forgotten-export) The symbol "isNestedField" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:238:27 - (ae-forgotten-export) The symbol "validateIndexPattern" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:238:27 - (ae-forgotten-export) The symbol "getFromSavedObject" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:238:27 - (ae-forgotten-export) The symbol "flattenHitWrapper" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:238:27 - (ae-forgotten-export) The symbol "getRoutes" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:238:27 - (ae-forgotten-export) The symbol "formatHitProvider" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:377:20 - (ae-forgotten-export) The symbol "getRequestInspectorStats" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:377:20 - (ae-forgotten-export) The symbol "getResponseInspectorStats" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:377:20 - (ae-forgotten-export) The symbol "tabifyAggResponse" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:377:20 - (ae-forgotten-export) The symbol "tabifyGetColumns" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:379:1 - (ae-forgotten-export) The symbol "CidrMask" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:380:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:389:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:390:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:391:1 - (ae-forgotten-export) The symbol "isDateHistogramBucketAggConfig" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:395:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:396:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:399:1 - (ae-forgotten-export) The symbol "parseInterval" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:400:1 - (ae-forgotten-export) The symbol "propFilter" needs to be exported by the entry point index.d.ts -// src/plugins/data/public/index.ts:403:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:237:27 - (ae-forgotten-export) The symbol "isFilterable" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:237:27 - (ae-forgotten-export) The symbol "isNestedField" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:237:27 - (ae-forgotten-export) The symbol "validateIndexPattern" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:237:27 - (ae-forgotten-export) The symbol "getFromSavedObject" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:237:27 - (ae-forgotten-export) The symbol "flattenHitWrapper" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:237:27 - (ae-forgotten-export) The symbol "formatHitProvider" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:374:20 - (ae-forgotten-export) The symbol "getRequestInspectorStats" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:374:20 - (ae-forgotten-export) The symbol "getResponseInspectorStats" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:374:20 - (ae-forgotten-export) The symbol "tabifyAggResponse" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:374:20 - (ae-forgotten-export) The symbol "tabifyGetColumns" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:376:1 - (ae-forgotten-export) The symbol "CidrMask" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:377:1 - (ae-forgotten-export) The symbol "dateHistogramInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:386:1 - (ae-forgotten-export) The symbol "InvalidEsCalendarIntervalError" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:387:1 - (ae-forgotten-export) The symbol "InvalidEsIntervalFormatError" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:388:1 - (ae-forgotten-export) The symbol "isDateHistogramBucketAggConfig" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:392:1 - (ae-forgotten-export) The symbol "isValidEsInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:393:1 - (ae-forgotten-export) The symbol "isValidInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:396:1 - (ae-forgotten-export) The symbol "parseInterval" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:397:1 - (ae-forgotten-export) The symbol "propFilter" needs to be exported by the entry point index.d.ts +// src/plugins/data/public/index.ts:400:1 - (ae-forgotten-export) The symbol "toAbsoluteDates" needs to be exported by the entry point index.d.ts // src/plugins/data/public/query/state_sync/connect_to_query_state.ts:33:33 - (ae-forgotten-export) The symbol "FilterStateStore" needs to be exported by the entry point index.d.ts // src/plugins/data/public/query/state_sync/connect_to_query_state.ts:37:1 - (ae-forgotten-export) The symbol "QueryStateChange" needs to be exported by the entry point index.d.ts // src/plugins/data/public/types.ts:52:5 - (ae-forgotten-export) The symbol "createFiltersFromValueClickAction" needs to be exported by the entry point index.d.ts diff --git a/src/test_utils/public/stub_index_pattern.js b/src/test_utils/public/stub_index_pattern.js index 98ada2471e1ec..29fb4c20f692e 100644 --- a/src/test_utils/public/stub_index_pattern.js +++ b/src/test_utils/public/stub_index_pattern.js @@ -65,7 +65,6 @@ export default function StubIndexPattern(pattern, getConfig, timeField, fields, this.getSourceFiltering = sinon.stub(); this.metaFields = ['_id', '_type', '_source']; this.fieldFormatMap = {}; - this.routes = indexPatterns.getRoutes(); this.getComputedFields = IndexPattern.prototype.getComputedFields.bind(this); this.flattenHit = indexPatterns.flattenHitWrapper(this, this.metaFields); From 034f2590f14148a69c05a52efb3329a05f2a4a0f Mon Sep 17 00:00:00 2001 From: Melissa Alvarez Date: Thu, 7 May 2020 16:54:41 -0400 Subject: [PATCH 020/102] [ML] DFA: ensure at least one field is included in analysis before job can be created (#65320) * ensure at least one field besides depVar included in analysis * show requiredFieldsError above excluded fields * update jest test * update fieldSelection explainResponse type --- .../data_frame_analytics/common/analytics.ts | 2 +- .../create_analytics_form.test.tsx | 2 +- .../create_analytics_form.tsx | 61 ++++++++++++++++--- .../create_analytics_form/job_type.tsx | 1 + .../use_create_analytics_form/reducer.ts | 4 ++ .../hooks/use_create_analytics_form/state.ts | 2 + 6 files changed, 61 insertions(+), 11 deletions(-) diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/common/analytics.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/common/analytics.ts index fb3b2b3519947..7501fe3d82fc6 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/common/analytics.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/common/analytics.ts @@ -91,7 +91,7 @@ export interface FieldSelectionItem { } export interface DfAnalyticsExplainResponse { - field_selection: FieldSelectionItem[]; + field_selection?: FieldSelectionItem[]; memory_estimation: { expected_memory_without_disk: string; expected_memory_with_disk: string; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/create_analytics_form.test.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/create_analytics_form.test.tsx index 92de5ad7be21e..85cd70912b41f 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/create_analytics_form.test.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/create_analytics_form.test.tsx @@ -53,7 +53,7 @@ describe('Data Frame Analytics: ', () => { ); const euiFormRows = wrapper.find('EuiFormRow'); - expect(euiFormRows.length).toBe(9); + expect(euiFormRows.length).toBe(10); const row1 = euiFormRows.at(0); expect(row1.find('label').text()).toBe('Job type'); diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/create_analytics_form.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/create_analytics_form.tsx index 199100d8b5ab0..11052b171845d 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/create_analytics_form.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/components/create_analytics_form/create_analytics_form.tsx @@ -48,6 +48,13 @@ import { } from '../../../../common/analytics'; import { shouldAddAsDepVarOption, OMIT_FIELDS } from './form_options_validation'; +const requiredFieldsErrorText = i18n.translate( + 'xpack.ml.dataframe.analytics.create.requiredFieldsErrorMessage', + { + defaultMessage: 'At least one field must be included in the analysis.', + } +); + export const CreateAnalyticsForm: FC = ({ actions, state }) => { const { services: { docLinks }, @@ -96,6 +103,7 @@ export const CreateAnalyticsForm: FC = ({ actions, sta numTopFeatureImportanceValuesValid, previousJobType, previousSourceIndex, + requiredFieldsError, sourceIndex, sourceIndexNameEmpty, sourceIndexNameValid, @@ -158,6 +166,8 @@ export const CreateAnalyticsForm: FC = ({ actions, sta }; const debouncedGetExplainData = debounce(async () => { + const jobTypeOrIndexChanged = + previousSourceIndex !== sourceIndex || previousJobType !== jobType; const shouldUpdateModelMemoryLimit = !firstUpdate.current || !modelMemoryLimit; const shouldUpdateEstimatedMml = !firstUpdate.current || !modelMemoryLimit || estimatedModelMemoryLimit === ''; @@ -167,7 +177,7 @@ export const CreateAnalyticsForm: FC = ({ actions, sta } // Reset if sourceIndex or jobType changes (jobType requires dependent_variable to be set - // which won't be the case if switching from outlier detection) - if (previousSourceIndex !== sourceIndex || previousJobType !== jobType) { + if (jobTypeOrIndexChanged) { setFormState({ loadingFieldOptions: true, }); @@ -186,8 +196,21 @@ export const CreateAnalyticsForm: FC = ({ actions, sta setEstimatedModelMemoryLimit(expectedMemoryWithoutDisk); } + const fieldSelection: FieldSelectionItem[] | undefined = resp.field_selection; + + let hasRequiredFields = false; + if (fieldSelection) { + for (let i = 0; i < fieldSelection.length; i++) { + const field = fieldSelection[i]; + if (field.is_included === true && field.is_required === false) { + hasRequiredFields = true; + break; + } + } + } + // If sourceIndex has changed load analysis field options again - if (previousSourceIndex !== sourceIndex || previousJobType !== jobType) { + if (jobTypeOrIndexChanged) { const analyzedFieldsOptions: EuiComboBoxOptionOption[] = []; if (resp.field_selection) { @@ -204,21 +227,24 @@ export const CreateAnalyticsForm: FC = ({ actions, sta loadingFieldOptions: false, fieldOptionsFetchFail: false, maxDistinctValuesError: undefined, + requiredFieldsError: !hasRequiredFields ? requiredFieldsErrorText : undefined, }); } else { setFormState({ ...(shouldUpdateModelMemoryLimit ? { modelMemoryLimit: expectedMemoryWithoutDisk } : {}), + requiredFieldsError: !hasRequiredFields ? requiredFieldsErrorText : undefined, }); } } catch (e) { let errorMessage; if ( jobType === ANALYSIS_CONFIG_TYPE.CLASSIFICATION && - e.message !== undefined && - e.message.includes('status_exception') && - e.message.includes('must have at most') + e.body && + e.body.message !== undefined && + e.body.message.includes('status_exception') && + e.body.message.includes('must have at most') ) { - errorMessage = e.message; + errorMessage = e.body.message; } const fallbackModelMemoryLimit = jobType !== undefined @@ -321,6 +347,7 @@ export const CreateAnalyticsForm: FC = ({ actions, sta excludesOptions: [], previousSourceIndex: sourceIndex, sourceIndex: selectedOptions[0].label || '', + requiredFieldsError: undefined, }); }; @@ -368,6 +395,9 @@ export const CreateAnalyticsForm: FC = ({ actions, sta forceInput.current.dispatchEvent(evt); }, []); + const noSupportetdAnalysisFields = + excludesOptions.length === 0 && fieldOptionsFetchFail === false && !sourceIndexNameEmpty; + return ( @@ -715,18 +745,31 @@ export const CreateAnalyticsForm: FC = ({ actions, sta )} + + + = ({ type, setFormState }) => { previousJobType: type, jobType: value, excludes: [], + requiredFieldsError: undefined, }); }} data-test-subj="mlAnalyticsCreateJobFlyoutJobTypeSelect" diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/reducer.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/reducer.ts index d55eb14a20e29..1cab42d8ee12d 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/reducer.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/reducer.ts @@ -124,6 +124,7 @@ export const validateAdvancedEditor = (state: State): State => { createIndexPattern, excludes, maxDistinctValuesError, + requiredFieldsError, } = state.form; const { jobConfig } = state; @@ -330,6 +331,7 @@ export const validateAdvancedEditor = (state: State): State => { state.isValid = maxDistinctValuesError === undefined && + requiredFieldsError === undefined && excludesValid && trainingPercentValid && state.form.modelMemoryLimitUnitValid && @@ -397,6 +399,7 @@ const validateForm = (state: State): State => { maxDistinctValuesError, modelMemoryLimit, numTopFeatureImportanceValuesValid, + requiredFieldsError, } = state.form; const { estimatedModelMemoryLimit } = state; @@ -412,6 +415,7 @@ const validateForm = (state: State): State => { state.isValid = maxDistinctValuesError === undefined && + requiredFieldsError === undefined && !jobTypeEmpty && !mmlValidationResult && !jobIdEmpty && diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.ts index 70840a442f6f6..8ca985a537b6e 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_management/hooks/use_create_analytics_form/state.ts @@ -76,6 +76,7 @@ export interface State { numTopFeatureImportanceValuesValid: boolean; previousJobType: null | AnalyticsJobType; previousSourceIndex: EsIndexName | undefined; + requiredFieldsError: string | undefined; sourceIndex: EsIndexName; sourceIndexNameEmpty: boolean; sourceIndexNameValid: boolean; @@ -133,6 +134,7 @@ export const getInitialState = (): State => ({ numTopFeatureImportanceValuesValid: true, previousJobType: null, previousSourceIndex: undefined, + requiredFieldsError: undefined, sourceIndex: '', sourceIndexNameEmpty: true, sourceIndexNameValid: false, From d7f847e91d7ee4ca5b4142cfd8341f892afd30a2 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Fri, 8 May 2020 00:45:57 +0100 Subject: [PATCH 021/102] fix(NA): noParse regex for windows on kbn optimizer (#65755) --- packages/kbn-optimizer/src/worker/webpack.config.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/kbn-optimizer/src/worker/webpack.config.ts b/packages/kbn-optimizer/src/worker/webpack.config.ts index 95e826e7620aa..49bcc6e7e704c 100644 --- a/packages/kbn-optimizer/src/worker/webpack.config.ts +++ b/packages/kbn-optimizer/src/worker/webpack.config.ts @@ -137,9 +137,9 @@ export function getWebpackConfig(bundle: Bundle, worker: WorkerConfig) { // or which have require() statements that should be ignored because the file is // already bundled with all its necessary depedencies noParse: [ - /[\///]node_modules[\///]elasticsearch-browser[\///]/, - /[\///]node_modules[\///]lodash[\///]index\.js$/, - /[\///]node_modules[\///]vega-lib[\///]build[\///]vega\.js$/, + /[\/\\]node_modules[\/\\]elasticsearch-browser[\/\\]/, + /[\/\\]node_modules[\/\\]lodash[\/\\]index\.js$/, + /[\/\\]node_modules[\/\\]vega-lib[\/\\]build[\/\\]vega\.js$/, ], rules: [ From 6bf0890186bf78b02cd74de962d90619ca27c56b Mon Sep 17 00:00:00 2001 From: Tim Sullivan Date: Thu, 7 May 2020 16:53:28 -0700 Subject: [PATCH 022/102] [Reporting] APM integration for baseline performance measurements (#59967) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * apm stuff * fix cluster_client * fix snapshot * tracker utility for generate_pdf * call apm.startSpan instead of txn.startSpan * Fix async call to end transaction * fix typescript * remove captuureErrors * restore accidental removal * add startTrace lib * fix import * fix imports * ts fix * fix generate_png to not format base64 to buffer and back to base64 * 💅 * revert change to cluster client * fix unused translation Co-authored-by: Elastic Machine --- .../screenshots/get_element_position_data.ts | 7 +- .../lib/screenshots/get_number_of_items.ts | 5 +- .../common/lib/screenshots/get_screenshots.ts | 28 ++----- .../common/lib/screenshots/get_time_range.ts | 5 +- .../common/lib/screenshots/inject_css.ts | 5 +- .../common/lib/screenshots/observable.ts | 23 ++++- .../common/lib/screenshots/open_url.ts | 10 +-- .../common/lib/screenshots/types.ts | 2 +- .../common/lib/screenshots/wait_for_render.ts | 6 +- .../screenshots/wait_for_visualizations.ts | 5 +- .../png/server/execute_job/index.test.ts | 8 +- .../png/server/execute_job/index.ts | 17 +++- .../png/server/lib/generate_png.ts | 14 +++- .../printable_pdf/server/execute_job/index.ts | 30 +++++-- .../printable_pdf/server/lib/generate_pdf.ts | 37 ++++++++- .../printable_pdf/server/lib/tracker.ts | 83 +++++++++++++++++++ .../plugins/reporting/server/lib/index.ts | 3 +- .../plugins/reporting/server/lib/trace.ts | 14 ++++ .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - 20 files changed, 243 insertions(+), 61 deletions(-) create mode 100644 x-pack/legacy/plugins/reporting/export_types/printable_pdf/server/lib/tracker.ts create mode 100644 x-pack/legacy/plugins/reporting/server/lib/trace.ts diff --git a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/get_element_position_data.ts b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/get_element_position_data.ts index 2f93765165e50..3999393600e48 100644 --- a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/get_element_position_data.ts +++ b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/get_element_position_data.ts @@ -6,16 +6,17 @@ import { i18n } from '@kbn/i18n'; import { HeadlessChromiumDriver as HeadlessBrowser } from '../../../../server/browsers'; +import { LevelLogger as Logger, startTrace } from '../../../../server/lib'; import { LayoutInstance } from '../../layouts/layout'; -import { AttributesMap, ElementsPositionAndAttribute } from './types'; -import { Logger } from '../../../../types'; import { CONTEXT_ELEMENTATTRIBUTES } from './constants'; +import { AttributesMap, ElementsPositionAndAttribute } from './types'; export const getElementPositionAndAttributes = async ( browser: HeadlessBrowser, layout: LayoutInstance, logger: Logger ): Promise => { + const endTrace = startTrace('get_element_position_data', 'read'); const { screenshot: screenshotSelector } = layout.selectors; // data-shared-items-container let elementsPositionAndAttributes: ElementsPositionAndAttribute[] | null; try { @@ -69,5 +70,7 @@ export const getElementPositionAndAttributes = async ( elementsPositionAndAttributes = null; } + endTrace(); + return elementsPositionAndAttributes; }; diff --git a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/get_number_of_items.ts b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/get_number_of_items.ts index 57d025890d3e2..d0c1a2a3ce672 100644 --- a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/get_number_of_items.ts +++ b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/get_number_of_items.ts @@ -6,7 +6,7 @@ import { i18n } from '@kbn/i18n'; import { HeadlessChromiumDriver as HeadlessBrowser } from '../../../../server/browsers'; -import { LevelLogger } from '../../../../server/lib'; +import { LevelLogger, startTrace } from '../../../../server/lib'; import { CaptureConfig } from '../../../../server/types'; import { LayoutInstance } from '../../layouts/layout'; import { CONTEXT_GETNUMBEROFITEMS, CONTEXT_READMETADATA } from './constants'; @@ -17,6 +17,7 @@ export const getNumberOfItems = async ( layout: LayoutInstance, logger: LevelLogger ): Promise => { + const endTrace = startTrace('get_number_of_items', 'read'); const { renderComplete: renderCompleteSelector, itemsCountAttribute } = layout.selectors; let itemsCount: number; @@ -70,5 +71,7 @@ export const getNumberOfItems = async ( itemsCount = 1; } + endTrace(); + return itemsCount; }; diff --git a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/get_screenshots.ts b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/get_screenshots.ts index d50ac64743f07..bc9e17854b27d 100644 --- a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/get_screenshots.ts +++ b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/get_screenshots.ts @@ -6,26 +6,9 @@ import { i18n } from '@kbn/i18n'; import { HeadlessChromiumDriver as HeadlessBrowser } from '../../../../server/browsers'; -import { LevelLogger } from '../../../../server/lib'; +import { LevelLogger, startTrace } from '../../../../server/lib'; import { Screenshot, ElementsPositionAndAttribute } from './types'; -const getAsyncDurationLogger = (logger: LevelLogger) => { - return async (description: string, promise: Promise) => { - const start = Date.now(); - const result = await promise; - logger.debug( - i18n.translate('xpack.reporting.screencapture.asyncTook', { - defaultMessage: '{description} took {took}ms', - values: { - description, - took: Date.now() - start, - }, - }) - ); - return result; - }; -}; - export const getScreenshots = async ( browser: HeadlessBrowser, elementsPositionAndAttributes: ElementsPositionAndAttribute[], @@ -37,21 +20,20 @@ export const getScreenshots = async ( }) ); - const asyncDurationLogger = getAsyncDurationLogger(logger); const screenshots: Screenshot[] = []; for (let i = 0; i < elementsPositionAndAttributes.length; i++) { + const endTrace = startTrace('get_screenshots', 'read'); const item = elementsPositionAndAttributes[i]; - const base64EncodedData = await asyncDurationLogger( - `screenshot #${i + 1}`, - browser.screenshot(item.position) - ); + const base64EncodedData = await browser.screenshot(item.position); screenshots.push({ base64EncodedData, title: item.attributes.title, description: item.attributes.description, }); + + endTrace(); } logger.info( diff --git a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/get_time_range.ts b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/get_time_range.ts index c1c43ed452594..bcd4cf9000df4 100644 --- a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/get_time_range.ts +++ b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/get_time_range.ts @@ -5,7 +5,7 @@ */ import { HeadlessChromiumDriver as HeadlessBrowser } from '../../../../server/browsers'; -import { LevelLogger } from '../../../../server/lib'; +import { LevelLogger, startTrace } from '../../../../server/lib'; import { LayoutInstance } from '../../layouts/layout'; import { CONTEXT_GETTIMERANGE } from './constants'; import { TimeRange } from './types'; @@ -15,6 +15,7 @@ export const getTimeRange = async ( layout: LayoutInstance, logger: LevelLogger ): Promise => { + const endTrace = startTrace('get_time_range', 'read'); logger.debug('getting timeRange'); const timeRange: TimeRange | null = await browser.evaluate( @@ -45,5 +46,7 @@ export const getTimeRange = async ( logger.debug('no timeRange'); } + endTrace(); + return timeRange; }; diff --git a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/inject_css.ts b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/inject_css.ts index cb2673e85186b..40bb84870b16d 100644 --- a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/inject_css.ts +++ b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/inject_css.ts @@ -7,8 +7,8 @@ import { i18n } from '@kbn/i18n'; import fs from 'fs'; import { promisify } from 'util'; -import { LevelLogger } from '../../../../server/lib'; import { HeadlessChromiumDriver as HeadlessBrowser } from '../../../../server/browsers'; +import { LevelLogger, startTrace } from '../../../../server/lib'; import { Layout } from '../../layouts/layout'; import { CONTEXT_INJECTCSS } from './constants'; @@ -19,6 +19,7 @@ export const injectCustomCss = async ( layout: Layout, logger: LevelLogger ): Promise => { + const endTrace = startTrace('inject_css', 'correction'); logger.debug( i18n.translate('xpack.reporting.screencapture.injectingCss', { defaultMessage: 'injecting custom css', @@ -49,4 +50,6 @@ export const injectCustomCss = async ( }) ); } + + endTrace(); }; diff --git a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/observable.ts b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/observable.ts index eb96753f0ce18..282490a28d591 100644 --- a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/observable.ts +++ b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/observable.ts @@ -4,8 +4,18 @@ * you may not use this file except in compliance with the Elastic License. */ +import apm from 'elastic-apm-node'; import * as Rx from 'rxjs'; -import { catchError, concatMap, first, mergeMap, take, takeUntil, toArray } from 'rxjs/operators'; +import { + catchError, + concatMap, + first, + mergeMap, + take, + takeUntil, + tap, + toArray, +} from 'rxjs/operators'; import { CaptureConfig } from '../../../../server/types'; import { DEFAULT_PAGELOAD_SELECTOR } from '../../constants'; import { HeadlessChromiumDriverFactory } from '../../../../types'; @@ -41,6 +51,9 @@ export function screenshotsObservableFactory( layout, browserTimezone, }: ScreenshotObservableOpts): Rx.Observable { + const apmTrans = apm.startTransaction(`reporting screenshot pipeline`, 'reporting'); + + const apmCreatePage = apmTrans?.startSpan('create_page', 'wait'); const create$ = browserDriverFactory.createPage( { viewport: layout.getBrowserViewport(), browserTimezone }, logger @@ -48,6 +61,7 @@ export function screenshotsObservableFactory( return create$.pipe( mergeMap(({ driver, exit$ }) => { + if (apmCreatePage) apmCreatePage.end(); return Rx.from(urls).pipe( concatMap((url, index) => { const setup$: Rx.Observable = Rx.of(1).pipe( @@ -81,10 +95,12 @@ export function screenshotsObservableFactory( // allows for them to be displayed properly in many cases await injectCustomCss(driver, layout, logger); + const apmPositionElements = apmTrans?.startSpan('position_elements', 'correction'); if (layout.positionElements) { // position panel elements for print layout await layout.positionElements(driver, logger); } + if (apmPositionElements) apmPositionElements.end(); await waitForRenderComplete(captureConfig, driver, layout, logger); }), @@ -125,7 +141,10 @@ export function screenshotsObservableFactory( toArray() ); }), - first() + first(), + tap(() => { + if (apmTrans) apmTrans.end(); + }) ); }; } diff --git a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/open_url.ts b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/open_url.ts index 92a58aded5f66..a0708b7dba36b 100644 --- a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/open_url.ts +++ b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/open_url.ts @@ -6,7 +6,7 @@ import { i18n } from '@kbn/i18n'; import { HeadlessChromiumDriver as HeadlessBrowser } from '../../../../server/browsers'; -import { LevelLogger } from '../../../../server/lib'; +import { LevelLogger, startTrace } from '../../../../server/lib'; import { CaptureConfig } from '../../../../server/types'; import { ConditionalHeaders } from '../../../../types'; @@ -18,6 +18,7 @@ export const openUrl = async ( conditionalHeaders: ConditionalHeaders, logger: LevelLogger ): Promise => { + const endTrace = startTrace('open_url', 'wait'); try { await browser.open( url, @@ -32,11 +33,10 @@ export const openUrl = async ( throw new Error( i18n.translate('xpack.reporting.screencapture.couldntLoadKibana', { defaultMessage: `An error occurred when trying to open the Kibana URL. You may need to increase '{configKey}'. {error}`, - values: { - configKey: 'xpack.reporting.capture.timeouts.openUrl', - error: err, - }, + values: { configKey: 'xpack.reporting.capture.timeouts.openUrl', error: err }, }) ); } + + endTrace(); }; diff --git a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/types.ts b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/types.ts index e113a5d228cd7..13ddf5eb74fcf 100644 --- a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/types.ts +++ b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/types.ts @@ -30,7 +30,7 @@ export interface ElementsPositionAndAttribute { } export interface Screenshot { - base64EncodedData: Buffer; + base64EncodedData: string; title: string; description: string; } diff --git a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/wait_for_render.ts b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/wait_for_render.ts index 069896c8d9e90..fe92fbc9077e6 100644 --- a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/wait_for_render.ts +++ b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/wait_for_render.ts @@ -6,7 +6,7 @@ import { i18n } from '@kbn/i18n'; import { HeadlessChromiumDriver as HeadlessBrowser } from '../../../../server/browsers'; -import { LevelLogger } from '../../../../server/lib'; +import { LevelLogger, startTrace } from '../../../../server/lib'; import { CaptureConfig } from '../../../../server/types'; import { LayoutInstance } from '../../layouts/layout'; import { CONTEXT_WAITFORRENDER } from './constants'; @@ -17,6 +17,8 @@ export const waitForRenderComplete = async ( layout: LayoutInstance, logger: LevelLogger ) => { + const endTrace = startTrace('wait_for_render', 'wait'); + logger.debug( i18n.translate('xpack.reporting.screencapture.waitingForRenderComplete', { defaultMessage: 'waiting for rendering to complete', @@ -76,5 +78,7 @@ export const waitForRenderComplete = async ( defaultMessage: 'rendering is complete', }) ); + + endTrace(); }); }; diff --git a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/wait_for_visualizations.ts b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/wait_for_visualizations.ts index 7960e1552e559..d456c4089ecee 100644 --- a/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/wait_for_visualizations.ts +++ b/x-pack/legacy/plugins/reporting/export_types/common/lib/screenshots/wait_for_visualizations.ts @@ -6,7 +6,7 @@ import { i18n } from '@kbn/i18n'; import { HeadlessChromiumDriver as HeadlessBrowser } from '../../../../server/browsers'; -import { LevelLogger } from '../../../../server/lib'; +import { LevelLogger, startTrace } from '../../../../server/lib'; import { CaptureConfig } from '../../../../server/types'; import { LayoutInstance } from '../../layouts/layout'; import { CONTEXT_WAITFORELEMENTSTOBEINDOM } from './constants'; @@ -29,6 +29,7 @@ export const waitForVisualizations = async ( layout: LayoutInstance, logger: LevelLogger ): Promise => { + const endTrace = startTrace('wait_for_visualizations', 'wait'); const { renderComplete: renderCompleteSelector } = layout.selectors; logger.debug( @@ -63,4 +64,6 @@ export const waitForVisualizations = async ( }) ); } + + endTrace(); }; diff --git a/x-pack/legacy/plugins/reporting/export_types/png/server/execute_job/index.test.ts b/x-pack/legacy/plugins/reporting/export_types/png/server/execute_job/index.test.ts index 9d3deda5d98be..fd879f0987232 100644 --- a/x-pack/legacy/plugins/reporting/export_types/png/server/execute_job/index.test.ts +++ b/x-pack/legacy/plugins/reporting/export_types/png/server/execute_job/index.test.ts @@ -126,7 +126,7 @@ test(`returns content_type of application/png`, async () => { const encryptedHeaders = await encryptHeaders({}); const generatePngObservable = (await generatePngObservableFactory(mockReporting)) as jest.Mock; - generatePngObservable.mockReturnValue(Rx.of(Buffer.from(''))); + generatePngObservable.mockReturnValue(Rx.of('foo')); const { content_type: contentType } = await executeJob( 'pngJobId', @@ -137,10 +137,10 @@ test(`returns content_type of application/png`, async () => { }); test(`returns content of generatePng getBuffer base64 encoded`, async () => { - const testContent = 'test content'; + const testContent = 'raw string from get_screenhots'; const generatePngObservable = (await generatePngObservableFactory(mockReporting)) as jest.Mock; - generatePngObservable.mockReturnValue(Rx.of({ buffer: Buffer.from(testContent) })); + generatePngObservable.mockReturnValue(Rx.of({ base64: testContent })); const executeJob = await executeJobFactory(mockReporting, getMockLogger()); const encryptedHeaders = await encryptHeaders({}); @@ -150,5 +150,5 @@ test(`returns content of generatePng getBuffer base64 encoded`, async () => { cancellationToken ); - expect(content).toEqual(Buffer.from(testContent).toString('base64')); + expect(content).toEqual(testContent); }); diff --git a/x-pack/legacy/plugins/reporting/export_types/png/server/execute_job/index.ts b/x-pack/legacy/plugins/reporting/export_types/png/server/execute_job/index.ts index 0ffd42d0b52f9..88c2d8a9fe4bb 100644 --- a/x-pack/legacy/plugins/reporting/export_types/png/server/execute_job/index.ts +++ b/x-pack/legacy/plugins/reporting/export_types/png/server/execute_job/index.ts @@ -4,6 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ +import apm from 'elastic-apm-node'; import * as Rx from 'rxjs'; import { catchError, map, mergeMap, takeUntil } from 'rxjs/operators'; import { PNG_JOB_TYPE } from '../../../../common/constants'; @@ -29,6 +30,10 @@ export const executeJobFactory: QueuedPngExecutorFactory = async function execut const logger = parentLogger.clone([PNG_JOB_TYPE, 'execute']); return async function executeJob(jobId: string, job: JobDocPayloadPNG, cancellationToken: any) { + const apmTrans = apm.startTransaction('reporting execute_job png', 'reporting'); + const apmGetAssets = apmTrans?.startSpan('get_assets', 'setup'); + let apmGeneratePng: { end: () => void } | null | undefined; + const generatePngObservable = await generatePngObservableFactory(reporting); const jobLogger = logger.clone([jobId]); const process$: Rx.Observable = Rx.of(1).pipe( @@ -38,6 +43,9 @@ export const executeJobFactory: QueuedPngExecutorFactory = async function execut mergeMap(conditionalHeaders => { const urls = getFullUrls({ config, job }); const hashUrl = urls[0]; + if (apmGetAssets) apmGetAssets.end(); + + apmGeneratePng = apmTrans?.startSpan('generate_png_pipeline', 'execute'); return generatePngObservable( jobLogger, hashUrl, @@ -46,11 +54,14 @@ export const executeJobFactory: QueuedPngExecutorFactory = async function execut job.layout ); }), - map(({ buffer, warnings }) => { + map(({ base64, warnings }) => { + if (apmGeneratePng) apmGeneratePng.end(); + return { content_type: 'image/png', - content: buffer.toString('base64'), - size: buffer.byteLength, + content: base64, + size: (base64 && base64.length) || 0, + warnings, }; }), diff --git a/x-pack/legacy/plugins/reporting/export_types/png/server/lib/generate_png.ts b/x-pack/legacy/plugins/reporting/export_types/png/server/lib/generate_png.ts index c03ea170f76ee..c79aa28187052 100644 --- a/x-pack/legacy/plugins/reporting/export_types/png/server/lib/generate_png.ts +++ b/x-pack/legacy/plugins/reporting/export_types/png/server/lib/generate_png.ts @@ -4,6 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ +import apm from 'elastic-apm-node'; import * as Rx from 'rxjs'; import { map } from 'rxjs/operators'; import { ReportingCore } from '../../../../server'; @@ -22,12 +23,16 @@ export async function generatePngObservableFactory(reporting: ReportingCore) { browserTimezone: string, conditionalHeaders: ConditionalHeaders, layoutParams: LayoutParams - ): Rx.Observable<{ buffer: Buffer; warnings: string[] }> { + ): Rx.Observable<{ base64: string | null; warnings: string[] }> { + const apmTrans = apm.startTransaction('reporting generate_png', 'reporting'); + const apmLayout = apmTrans?.startSpan('create_layout', 'setup'); if (!layoutParams || !layoutParams.dimensions) { throw new Error(`LayoutParams.Dimensions is undefined.`); } - const layout = new PreserveLayout(layoutParams.dimensions); + if (apmLayout) apmLayout.end(); + + const apmScreenshots = apmTrans?.startSpan('screenshots_pipeline', 'setup'); const screenshots$ = getScreenshots({ logger, urls: [url], @@ -36,8 +41,11 @@ export async function generatePngObservableFactory(reporting: ReportingCore) { browserTimezone, }).pipe( map((results: ScreenshotResults[]) => { + if (apmScreenshots) apmScreenshots.end(); + if (apmTrans) apmTrans.end(); + return { - buffer: results[0].screenshots[0].base64EncodedData, + base64: results[0].screenshots[0].base64EncodedData, warnings: results.reduce((found, current) => { if (current.error) { found.push(current.error.message); diff --git a/x-pack/legacy/plugins/reporting/export_types/printable_pdf/server/execute_job/index.ts b/x-pack/legacy/plugins/reporting/export_types/printable_pdf/server/execute_job/index.ts index 3d69042b6c7ab..5aad66c53a998 100644 --- a/x-pack/legacy/plugins/reporting/export_types/printable_pdf/server/execute_job/index.ts +++ b/x-pack/legacy/plugins/reporting/export_types/printable_pdf/server/execute_job/index.ts @@ -4,6 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ +import apm from 'elastic-apm-node'; import * as Rx from 'rxjs'; import { catchError, map, mergeMap, takeUntil } from 'rxjs/operators'; import { PDF_JOB_TYPE } from '../../../../common/constants'; @@ -31,6 +32,10 @@ export const executeJobFactory: QueuedPdfExecutorFactory = async function execut const logger = parentLogger.clone([PDF_JOB_TYPE, 'execute']); return async function executeJob(jobId: string, job: JobDocPayloadPDF, cancellationToken: any) { + const apmTrans = apm.startTransaction('reporting execute_job pdf', 'reporting'); + const apmGetAssets = apmTrans?.startSpan('get_assets', 'setup'); + let apmGeneratePdf: { end: () => void } | null | undefined; + const generatePdfObservable = await generatePdfObservableFactory(reporting); const jobLogger = logger.clone([jobId]); @@ -43,6 +48,9 @@ export const executeJobFactory: QueuedPdfExecutorFactory = async function execut const urls = getFullUrls({ config, job }); const { browserTimezone, layout, title } = job; + if (apmGetAssets) apmGetAssets.end(); + + apmGeneratePdf = apmTrans?.startSpan('generate_pdf_pipeline', 'execute'); return generatePdfObservable( jobLogger, title, @@ -53,12 +61,20 @@ export const executeJobFactory: QueuedPdfExecutorFactory = async function execut logo ); }), - map(({ buffer, warnings }) => ({ - content_type: 'application/pdf', - content: buffer.toString('base64'), - size: buffer.byteLength, - warnings, - })), + map(({ buffer, warnings }) => { + if (apmGeneratePdf) apmGeneratePdf.end(); + + const apmEncode = apmTrans?.startSpan('encode_pdf', 'output'); + const content = buffer?.toString('base64') || null; + if (apmEncode) apmEncode.end(); + + return { + content_type: 'application/pdf', + content, + size: buffer?.byteLength || 0, + warnings, + }; + }), catchError(err => { jobLogger.error(err); return Rx.throwError(err); @@ -66,6 +82,8 @@ export const executeJobFactory: QueuedPdfExecutorFactory = async function execut ); const stop$ = Rx.fromEventPattern(cancellationToken.on); + + if (apmTrans) apmTrans.end(); return process$.pipe(takeUntil(stop$)).toPromise(); }; }; diff --git a/x-pack/legacy/plugins/reporting/export_types/printable_pdf/server/lib/generate_pdf.ts b/x-pack/legacy/plugins/reporting/export_types/printable_pdf/server/lib/generate_pdf.ts index c882ef682f952..238accba8b1dc 100644 --- a/x-pack/legacy/plugins/reporting/export_types/printable_pdf/server/lib/generate_pdf.ts +++ b/x-pack/legacy/plugins/reporting/export_types/printable_pdf/server/lib/generate_pdf.ts @@ -13,6 +13,7 @@ import { ConditionalHeaders } from '../../../../types'; import { createLayout } from '../../../common/layouts'; import { LayoutInstance, LayoutParams } from '../../../common/layouts/layout'; import { ScreenshotResults } from '../../../common/lib/screenshots/types'; +import { getTracker } from './tracker'; // @ts-ignore untyped module import { pdf } from './pdf'; @@ -39,8 +40,14 @@ export async function generatePdfObservableFactory(reporting: ReportingCore) { conditionalHeaders: ConditionalHeaders, layoutParams: LayoutParams, logo?: string - ): Rx.Observable<{ buffer: Buffer; warnings: string[] }> { + ): Rx.Observable<{ buffer: Buffer | null; warnings: string[] }> { + const tracker = getTracker(); + tracker.startLayout(); + const layout = createLayout(captureConfig, layoutParams) as LayoutInstance; + tracker.endLayout(); + + tracker.startScreenshots(); const screenshots$ = getScreenshots({ logger, urls, @@ -49,16 +56,22 @@ export async function generatePdfObservableFactory(reporting: ReportingCore) { browserTimezone, }).pipe( mergeMap(async (results: ScreenshotResults[]) => { - const pdfOutput = pdf.create(layout, logo); + tracker.endScreenshots(); + tracker.startSetup(); + const pdfOutput = pdf.create(layout, logo); if (title) { const timeRange = getTimeRange(results); title += timeRange ? ` - ${timeRange.duration}` : ''; pdfOutput.setTitle(title); } + tracker.endSetup(); results.forEach(r => { r.screenshots.forEach(screenshot => { + logger.debug(`Adding image to PDF. Image base64 size: ${screenshot.base64EncodedData?.length || 0}`); // prettier-ignore + tracker.startAddImage(); + tracker.endAddImage(); pdfOutput.addImage(screenshot.base64EncodedData, { title: screenshot.title, description: screenshot.description, @@ -66,10 +79,26 @@ export async function generatePdfObservableFactory(reporting: ReportingCore) { }); }); - pdfOutput.generate(); + let buffer: Buffer | null = null; + try { + tracker.startCompile(); + logger.debug(`Compiling PDF...`); + pdfOutput.generate(); + tracker.endCompile(); + + tracker.startGetBuffer(); + logger.debug(`Generating PDF Buffer...`); + buffer = await pdfOutput.getBuffer(); + logger.debug(`PDF buffer byte length: ${buffer?.byteLength || 0}`); + tracker.endGetBuffer(); + } catch (err) { + logger.error(`Could not generate the PDF buffer! ${err}`); + } + + tracker.end(); return { - buffer: await pdfOutput.getBuffer(), + buffer, warnings: results.reduce((found, current) => { if (current.error) { found.push(current.error.message); diff --git a/x-pack/legacy/plugins/reporting/export_types/printable_pdf/server/lib/tracker.ts b/x-pack/legacy/plugins/reporting/export_types/printable_pdf/server/lib/tracker.ts new file mode 100644 index 0000000000000..b6fad243db7b1 --- /dev/null +++ b/x-pack/legacy/plugins/reporting/export_types/printable_pdf/server/lib/tracker.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import apm from 'elastic-apm-node'; + +interface PdfTracker { + startLayout: () => void; + endLayout: () => void; + startScreenshots: () => void; + endScreenshots: () => void; + startSetup: () => void; + endSetup: () => void; + startAddImage: () => void; + endAddImage: () => void; + startCompile: () => void; + endCompile: () => void; + startGetBuffer: () => void; + endGetBuffer: () => void; + end: () => void; +} + +const SPANTYPE_SETUP = 'setup'; +const SPANTYPE_OUTPUT = 'output'; + +interface ApmSpan { + end: () => void; +} + +export function getTracker(): PdfTracker { + const apmTrans = apm.startTransaction('reporting generate_pdf', 'reporting'); + + let apmLayout: ApmSpan | null = null; + let apmScreenshots: ApmSpan | null = null; + let apmSetup: ApmSpan | null = null; + let apmAddImage: ApmSpan | null = null; + let apmCompilePdf: ApmSpan | null = null; + let apmGetBuffer: ApmSpan | null = null; + + return { + startLayout() { + apmLayout = apmTrans?.startSpan('create_layout', SPANTYPE_SETUP) || null; + }, + endLayout() { + if (apmLayout) apmLayout.end(); + }, + startScreenshots() { + apmScreenshots = apmTrans?.startSpan('screenshots_pipeline', SPANTYPE_SETUP) || null; + }, + endScreenshots() { + if (apmScreenshots) apmScreenshots.end(); + }, + startSetup() { + apmSetup = apmTrans?.startSpan('setup_pdf', SPANTYPE_SETUP) || null; + }, + endSetup() { + if (apmSetup) apmSetup.end(); + }, + startAddImage() { + apmAddImage = apmTrans?.startSpan('add_pdf_image', SPANTYPE_OUTPUT) || null; + }, + endAddImage() { + if (apmAddImage) apmAddImage.end(); + }, + startCompile() { + apmCompilePdf = apmTrans?.startSpan('compile_pdf', SPANTYPE_OUTPUT) || null; + }, + endCompile() { + if (apmCompilePdf) apmCompilePdf.end(); + }, + startGetBuffer() { + apmGetBuffer = apmTrans?.startSpan('get_buffer', SPANTYPE_OUTPUT) || null; + }, + endGetBuffer() { + if (apmGetBuffer) apmGetBuffer.end(); + }, + end() { + if (apmTrans) apmTrans.end(); + }, + }; +} diff --git a/x-pack/legacy/plugins/reporting/server/lib/index.ts b/x-pack/legacy/plugins/reporting/server/lib/index.ts index f5ccbe493a91f..2a8fa45b6fcef 100644 --- a/x-pack/legacy/plugins/reporting/server/lib/index.ts +++ b/x-pack/legacy/plugins/reporting/server/lib/index.ts @@ -4,10 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ +export { LevelLogger } from './level_logger'; export { checkLicenseFactory } from './check_license'; export { createQueueFactory } from './create_queue'; export { cryptoFactory } from './crypto'; export { enqueueJobFactory } from './enqueue_job'; export { getExportTypesRegistry } from './export_types_registry'; -export { LevelLogger } from './level_logger'; export { runValidations } from './validate'; +export { startTrace } from './trace'; diff --git a/x-pack/legacy/plugins/reporting/server/lib/trace.ts b/x-pack/legacy/plugins/reporting/server/lib/trace.ts new file mode 100644 index 0000000000000..2d79d17715d0b --- /dev/null +++ b/x-pack/legacy/plugins/reporting/server/lib/trace.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import apm from 'elastic-apm-node'; + +export function startTrace(name: string, category: string) { + const span = apm.startSpan(name, category); + return () => { + if (span) span.end(); + }; +} diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 0d050f7bf9842..e96f027445194 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -12200,7 +12200,6 @@ "xpack.reporting.publicNotifier.successfullyCreatedReportNotificationTitle": "{reportObjectType}「{reportObjectTitle}」のレポートが作成されました", "xpack.reporting.registerFeature.reportingDescription": "ディスカバリ、可視化、ダッシュボードから生成されたレポートを管理します。", "xpack.reporting.registerFeature.reportingTitle": "レポート", - "xpack.reporting.screencapture.asyncTook": "{description} にかかった時間は {took}ms でした", "xpack.reporting.screencapture.couldntFinishRendering": "{count} 件のビジュアライゼーションのレンダリングが完了するのを待つ間にエラーが発生しました。「{configKey}」を増やす必要があるかもしれません。 {error}", "xpack.reporting.screencapture.couldntLoadKibana": "Kibana URL を開こうとするときにエラーが発生しました。「{configKey}」を増やす必要があるかもしれません。 {error}", "xpack.reporting.screencapture.injectCss": "Kibana CSS をレポート用に更新しようとしたときにエラーが発生しました。{error}", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 21113d55b4641..1d73c4757c8e9 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -12207,7 +12207,6 @@ "xpack.reporting.publicNotifier.successfullyCreatedReportNotificationTitle": "已为 {reportObjectType}“{reportObjectTitle}”创建报告", "xpack.reporting.registerFeature.reportingDescription": "管理您从 Discover、Visualize 和 Dashboard 生成的报告。", "xpack.reporting.registerFeature.reportingTitle": "报告", - "xpack.reporting.screencapture.asyncTook": "{description} 花费了 {took}ms", "xpack.reporting.screencapture.couldntFinishRendering": "尝试等候 {count} 个可视化完成渲染时发生错误。您可能需要增加“{configKey}”。{error}", "xpack.reporting.screencapture.couldntLoadKibana": "尝试打开 Kibana URL 时发生了错误。您可能需要增加“{configKey}”。{error}", "xpack.reporting.screencapture.injectCss": "尝试为 Reporting 更新 Kibana CSS 时发生错误。{error}", From 37aad5c56a11020b14d85ba491c22926b56082c8 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Thu, 7 May 2020 18:32:07 -0600 Subject: [PATCH 023/102] [Maps] remove SLA percentage metric (#65718) * [Maps] remove SLA percentage metric * remove unused import Co-authored-by: Elastic Machine --- .../observability/create_layer_descriptor.ts | 20 ------------------- .../observability/metric_select.tsx | 7 ------- 2 files changed, 27 deletions(-) diff --git a/x-pack/plugins/maps/public/layers/solution_layers/observability/create_layer_descriptor.ts b/x-pack/plugins/maps/public/layers/solution_layers/observability/create_layer_descriptor.ts index a59122d7d6309..e2833d5abd0c2 100644 --- a/x-pack/plugins/maps/public/layers/solution_layers/observability/create_layer_descriptor.ts +++ b/x-pack/plugins/maps/public/layers/solution_layers/observability/create_layer_descriptor.ts @@ -9,7 +9,6 @@ import { i18n } from '@kbn/i18n'; import { AggDescriptor, ColorDynamicOptions, - LabelDynamicOptions, LayerDescriptor, SizeDynamicOptions, StylePropertyField, @@ -80,10 +79,6 @@ function createLayerLabel( metricName = i18n.translate('xpack.maps.observability.durationMetricName', { defaultMessage: 'Duration', }); - } else if (metric === OBSERVABILITY_METRIC_TYPE.SLA_PERCENTAGE) { - metricName = i18n.translate('xpack.maps.observability.slaPercentageMetricName', { - defaultMessage: '% Duration of SLA', - }); } else if (metric === OBSERVABILITY_METRIC_TYPE.COUNT) { metricName = i18n.translate('xpack.maps.observability.countMetricName', { defaultMessage: 'Total', @@ -103,11 +98,6 @@ function createAggDescriptor(metric: OBSERVABILITY_METRIC_TYPE): AggDescriptor { type: AGG_TYPE.AVG, field: 'transaction.duration.us', }; - } else if (metric === OBSERVABILITY_METRIC_TYPE.SLA_PERCENTAGE) { - return { - type: AGG_TYPE.AVG, - field: 'duration_sla_pct', - }; } else if (metric === OBSERVABILITY_METRIC_TYPE.UNIQUE_COUNT) { return { type: AGG_TYPE.UNIQUE_COUNT, @@ -251,16 +241,6 @@ export function createLayerDescriptor({ }, }; - if (metric === OBSERVABILITY_METRIC_TYPE.SLA_PERCENTAGE) { - styleProperties[VECTOR_STYLES.LABEL_TEXT] = { - type: STYLE_TYPE.DYNAMIC, - options: { - ...(defaultDynamicProperties[VECTOR_STYLES.LABEL_TEXT]!.options as LabelDynamicOptions), - field: metricStyleField, - }, - }; - } - return VectorLayer.createDescriptor({ label, query: apmSourceQuery, diff --git a/x-pack/plugins/maps/public/layers/solution_layers/observability/metric_select.tsx b/x-pack/plugins/maps/public/layers/solution_layers/observability/metric_select.tsx index 8750034f74696..4a40b257cb517 100644 --- a/x-pack/plugins/maps/public/layers/solution_layers/observability/metric_select.tsx +++ b/x-pack/plugins/maps/public/layers/solution_layers/observability/metric_select.tsx @@ -11,7 +11,6 @@ import { OBSERVABILITY_LAYER_TYPE } from './layer_select'; export enum OBSERVABILITY_METRIC_TYPE { TRANSACTION_DURATION = 'TRANSACTION_DURATION', - SLA_PERCENTAGE = 'SLA_PERCENTAGE', COUNT = 'COUNT', UNIQUE_COUNT = 'UNIQUE_COUNT', } @@ -23,12 +22,6 @@ const APM_RUM_PERFORMANCE_METRIC_OPTIONS = [ defaultMessage: 'Transaction duraction', }), }, - { - value: OBSERVABILITY_METRIC_TYPE.SLA_PERCENTAGE, - text: i18n.translate('xpack.maps.observability.slaPercentageLabel', { - defaultMessage: 'SLA percentage', - }), - }, ]; const APM_RUM_TRAFFIC_METRIC_OPTIONS = [ From 8ba44eb5ede575b7931f89b4c2a3aa1f41f376e6 Mon Sep 17 00:00:00 2001 From: Sandra Gonzales Date: Thu, 7 May 2020 20:45:07 -0400 Subject: [PATCH 024/102] change api endpoint and throw error (#65790) --- .../epm/kibana/index_pattern/install.ts | 22 +++++-------------- 1 file changed, 5 insertions(+), 17 deletions(-) diff --git a/x-pack/plugins/ingest_manager/server/services/epm/kibana/index_pattern/install.ts b/x-pack/plugins/ingest_manager/server/services/epm/kibana/index_pattern/install.ts index f6db5dfe353ea..6cdcb8782f38e 100644 --- a/x-pack/plugins/ingest_manager/server/services/epm/kibana/index_pattern/install.ts +++ b/x-pack/plugins/ingest_manager/server/services/epm/kibana/index_pattern/install.ts @@ -372,12 +372,11 @@ export const ensureDefaultIndices = async (callCluster: CallESAsCurrentUser) => Promise.all( Object.keys(IndexPatternType).map(async indexPattern => { const defaultIndexPatternName = indexPattern + INDEX_PATTERN_PLACEHOLDER_SUFFIX; - const indexExists = await doesIndexExist(defaultIndexPatternName, callCluster); + const indexExists = await callCluster('indices.exists', { index: defaultIndexPatternName }); if (!indexExists) { try { - await callCluster('transport.request', { - method: 'PUT', - path: `/${defaultIndexPatternName}`, + await callCluster('indices.create', { + index: defaultIndexPatternName, body: { mappings: { properties: { @@ -387,20 +386,9 @@ export const ensureDefaultIndices = async (callCluster: CallESAsCurrentUser) => }, }); } catch (putErr) { - throw new Error(`${defaultIndexPatternName} could not be created`); + // throw new Error(`${defaultIndexPatternName} could not be created`); + throw new Error(putErr); } } }) ); - -export const doesIndexExist = async (indexName: string, callCluster: CallESAsCurrentUser) => { - try { - await callCluster('transport.request', { - method: 'HEAD', - path: indexName, - }); - return true; - } catch (err) { - return false; - } -}; From 23e7cc788bf5b245ac5ae252d82b10181d155b71 Mon Sep 17 00:00:00 2001 From: Brandon Morelli Date: Thu, 7 May 2020 17:54:14 -0700 Subject: [PATCH 025/102] [apm] Update machine learning flyout and service maps docs (#65517) --- docs/apm/images/apm-service-map-anomaly.png | Bin 0 -> 488462 bytes docs/apm/images/green-service.png | Bin 0 -> 4464 bytes docs/apm/images/red-service.png | Bin 0 -> 5368 bytes docs/apm/images/service-maps.png | Bin 494889 -> 722545 bytes docs/apm/images/yellow-service.png | Bin 0 -> 4425 bytes docs/apm/machine-learning.asciidoc | 19 +++++++++---- docs/apm/service-maps.asciidoc | 24 +++++++++++++++- .../MachineLearningFlyout/view.tsx | 26 +++++++++++++----- .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - 10 files changed, 56 insertions(+), 15 deletions(-) create mode 100644 docs/apm/images/apm-service-map-anomaly.png create mode 100644 docs/apm/images/green-service.png create mode 100644 docs/apm/images/red-service.png create mode 100644 docs/apm/images/yellow-service.png diff --git a/docs/apm/images/apm-service-map-anomaly.png b/docs/apm/images/apm-service-map-anomaly.png new file mode 100644 index 0000000000000000000000000000000000000000..b661e8f09d1a1253b22a15d81ac43f02623a6729 GIT binary patch literal 488462 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

UZ^ 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

+I-*Kl9HZ1d; z(r#bs4(&6J87@jJd{ok!nN=0@5Hmzt2;F90pqEGJ8~LxpGBjdKa-))BST&=L+~|E1 z^O$l_wRNU4zTekF-YKG`fFkPKtSQuN+y#JoLw#sstb0^HvVC2#%t2%gdO1Bv*~^VH zJAYfo-L|_Zh!{;^mye<}O#09XTDQkH`T6Xw4o44A%AU(Te<30VfeW>59)AdDmj`KT zN_-I)7u)$zX}l!6*f*})_ge4iz#9GZfFGWREBXry30JUZb(cxt*h$1Lca(MAFLU$J9Ek3-DBe@w z0J2P7?+ZDI@ae{N6}-Fg`qICENuw@wfal0_+^9V;{rJbVi;}8w&cYL3;oGwoy5pg? zh{99ZTc^8Wqz+$o(>B?ShqL3g3w3}D0&F^x#GK34n1#{JwR7ssOLzPg@Zq2!qf6c}c!o0{{o&o-Jqi$BsjqvH$sq zP}5SpeeNKwZ>8ZRJP|r=WYFXcqZu)FI-7R;1}!dd_l#1wvw?H+JRZ4~%n;dB>#!Ob z5dQgr(&}$N9W6!d&3(jKWI#>46e<*zsQ}1vyf$0gxu`PSwAV2p=u(z31Gs!mcy>nX=}s0JBNSYp zo66vr0lY%~Ypm+;>Sbi|V{WsvIFtx+LDhZfjbE`<69w;wK@d2PBSajez)kBZ{7&DS zZ&IZ%#ywI8^kK>P{bo=hK{M`f>7JPrVjlJts+k5OVv~=|h9yf5d?&l3ArG)-=jg^% zQ!WC$!sY<-a6M6r*TUXMb2L4yQyF!sZkNL6al5@d+p7=p53SV@F9gK*VKz{mWVeb^ z18YLl@+ZS^J4y0_wGp2{)2qf?uYx4lK@++CkoT4=UkLAdzphxl`YS<)Q-Sdp>yq%) zx$*MAceid^2U}A&qGHvR>*r~`OS!WWO%7d;ljrO|9m0e<`wuFg>Snrm>PXdY+zu=` zm_a|at&$``KVkss&tfUURI_UYbg@B|sBjSZ8uQLh#!SA?;Kza9anB0fmbJLYnCDk9 zlXvK~>m4(IPVj{W+W`XcCTwVKWO4f!jDz*>@X6L!A?Zp?&vYuS@5@~nByD*Q-9@}d zG*nLvm66>h^t3KR8(Ww4MA1g3*cC7=Ncd>Ed@V|w$LX@XmJZO&(i$aE9M8|_eMVx{ z=JG75`cn4y8}A}e&94%_)In$6<6mn#Z+>ySG}FOpoOc=Df;b-1o8+(gB-=90c}Dv< zpYy}((wfc>iBFQUp@cB!X9!gVv#58|{p_B==69EU0+N^dE!ZdIm8K;Wa;c5!fw^i&RpTftR zyo#KS(M5ZGenNpGYm^;O4KH%@&OQwA@2|{=o~Fe=u%1@k0COc))~;0T58D4?fAPcD z7OzS5=g)x^Y(fpZZ=bTiu`9>Ms+?%pP9UEL|?y_F$0os@EFxb{pns5BuK)c+*a#FWg+op2{F^^t9jIqGpMoo zzs(-UmV>$QhT<1)vQWw{F2Kc`o)J;JP>c9*$Hfh=e3OWhCg<(NLknxQfRS96QZkum zbt&TB6K*4!9t3rlhnULbI5*d?%wG2!wiE{n_MY2VctkQ~0R)vwZ+mtuU7*U4s|}z! z6pOr$PVUBw!D_1JC)|b$$1J$4j65V7TiCD)S8rxA-k^5wLXF8*{#w^_W>lg7eph0Rx00~bpYL&Rm9i|9;5DvY|$2Z5)UF02b zg`8nzGL*$c(el~-5HBx7^Ucb$K+1*y>TA`C((>E9#*LV#5eL)cUiMU&Wom_&vGFMi zX`ZLdR)&;L<-5tz+YX7K_H_Hb%?|zHuQqtXdvS%1l?A=LcGt|ywxsYxO#J>(Mt@ zYi&b~>;;w<0Ra^(@?Vt65N?IZV*Qq!~Zq4_ng^(bh&d zR@fWM0kuRtqR&%hUpgtcw9?rEv4H>h`u?%Y+UsSqZ8{-E}dVU%&{$SyKpMy=j2+RfFf2squ0gF;SeAiAz z@P-)E`CO~lh*Eu9%Z2>G<%6#C?=j+ijFaP@rVOo%@@`IuHT%481k4MI>>)f2CIl`T zs-B;hZOioK?*1gkR>jeMsxs6hr2Cp=+!G^{I_>^pb|iomYX&!QDMFK)(7p_@YyHpY zpC>K%jlFOKRyk#L>T%1v(d1=Stq*JC;%5BooXnRC>1J9gRKP%QM$`BONYHUhc*^8V z80fmme>hvTqz<*RQ6Yl_NDAfR_eHK+tOii&KwJ$#3$U1wa;@GTu;m)AV9V}TKda;p zl@cR2`KFxBA(pPQ`f9d^K!&qfhyHl649{4YcnOvBOwYYpc6okZzOukUmJE)QSj+D~ zdjQJ*M5topAZ3Q!&jbeO8UC-$rEEsib$NI^l}Cl*0bopKHaOo*ev8X{9dfu104ir^SHtW)Wq3%@>5RvjrA-iEVKA4F zX((<)fHC?KUJmAympL4?1@-B^_BxuwHXWG#VqUtU73XEqb%Vbx0C54;!MW2)zb{mT6+sRkvUOX@ListCmq>Tu}pb!Jd|m#G%ROaD>5qY%p- zRe2O3UaKzNofIhE{Cq%981~kdIJUT8kf3c&!xo&U!MuIaVfz@<`ssdzKJTxS5Ir1? z;HlS2A)8@yVu$rYx{pFO_>?MN^Rs-_=wrz^6=MPttH7;(u!*2Rm5VG)YeaWE2zTQ% zDL>D8hb<%i-CD%{ypS$a1gRfT2PlEcjRI9_d2WlVZ3|%Ervxo-J`^aBg53XV>QkpZ zGYAO$h6DY+*ivFTU)IFdz$&L~j`JEd6sNvwWEH-HHmX0PZ{@BJ92q-vz;E{MpVl%` z5btxHWebQzmlprVFm1wZ*_UerkQ89Z8I@3aoaQv9C8!RgYYD$#&Pif={T4Ak4x8C8qZ;oj%sa`gH|A-8a*v?(Q`^>X!t)yV~ea=U!o z*JMuTZ~CYs?A41HZbAajN}Ekast6s%NC55tWj|@g=nRgTYxE9LxhG2jO%WBWQL#`g zOixa-^s&fOlo=-U;3Hh1l}C?KEqEhR$@$PPgKOt8}Mhq zI^}$eVVw=vLxU>-+9cJ}&ZB5l2*K3|l z7blip@9X7r>X?lg?l;fT*p2(M33S~gPe=qzvH5IvHp7*ucDzo7OA8&On!b6A{X#1| z5{R$d&dJRlJ|*Rk`3|ZWlHpw%x_{-r@Ko15#CR~V)Y7CP&>Pez3yNMk z9;v9na(lzD5SlK*RqEc0K6mGTOpLX zJ_td~eoRwp6Rvnx?{25JuxhK=jni3&fs8qXTgT-DiPH&si`8-Wve)!RdDWo*nb9ss zhRe<~dO(y-hdCQrk?;6N4eQly%*4cgQ)p_+^-Xm!e!SGWZzsijzm_ghgD1&yH29{E zsL}~MnK&M_OpBSfKrFLR?niV%EI+bDRs-UU{2{o+=yOEq?E5o9Ys&Y5o&;_W0-t60 zu`SX(p+{-QwWAh$h(rB|?~MTtJqqd*>d&da@cm#LpMVr}K9c+W_gbtd7$Tu>Y>9c> zMA!k_{7LLa6;Qd$M{=TJ%Ut+0NT(6dsX+GlO>*t8IFE}x_IZB!P$J%0o|f-->k)HH zb1b3H%C~Bn++*LRIj84xn$>vGQg1Y33%%hlV4n(p?r`kw!7sF*B52}^n;tBpFwwME z5W)j8NrfaUDAQwgkvXA<8NbOz$2_TsW-pm{UKeH9&NT!zUdI(mRq##s7EK>X-#}~@ z;=}|P-uByu(C)?DL=8LaB<7Y)_1t0_<8FiCo>Eb$$~{epN6STxU4;f0l&u4(nDKda z!CxvDHJ7XlN9#_AH5@Ovta=uTnua`=A@K$8vg79VBwv!L-hPZY^?GKvNlTDij1qHt zL-iGZxcJ#LxUjV5Q=Q}1NBG+h8WdMEV0dA5I#aM<*Nb3CDUOV7y+^Z<Ku)<@0QyzTa<<|m&HalhrMiP>IK&3%g8TN&4?Kb z#+uk8nE_V%sC<|9GC?ngrSCU5=YXWdbgKw7pC%H6Z5EIDQT1D#v4BFUSHe zu-D3GWmZusr%ed*baJ0VZ{DR0%t2b5z8RkducKXTN7(LJ9xpckF~xv&{WsN8ox-g~ zj}zr)lQ7vmMV{Kd>j}MBM7B`0 zbe19z2S4Cej00UXPE^auHW6pvE-<=#I;jKz5ziIMnlLPYt;C=W&ky!*>kzr)EbKF{ ziwm3Uar*YlSxuU7;eAQ+Lg>lY@gg%KpTH-*kBn6s6i@V7q~ngP1~5ZbPhIAH&GPA; zlKWq|G99AKH95o&PQJJbkT@zbW}yz(J+tBuzQXVQ8OPKGfzdSw=_^Kpy4746yyiLA zZQgxtTJ_rZ3ikEz{t#?i9K*h$zFuUw5OY+0O6y!66Q`0V9L21=>Lj9rja#mK$UN=x zY(k*I=VHBH#oOKFP9fE z@nP=zMn8jX9hgc^mfEPkn{MEO_NV2<=QUMPl z#QoWjUI@=v?vskA=Pt#8Ej#*TZp>0yAc7eenfXu8TC$x6jEy*qT106ESrI$Kf}Idc z8iCKk%|PiJ#^jIzU~+@E9|HCKLU5{bE}#)K0=}`>5M}Nif0S=2489*0&vm1VmzIJi z4MrF3)u5o8ymy!cZt>&WhR<9k{NhTsNLmgTih0ayDon0Z|Ehu=lcBWnkc#}iZtm7+ zTSRc#i7;z(wuH2C59Wa2=cI!L4EOw^qO7y|+fZ-BGOH2a(yM`PxAvAM>$o4vC~0T= zR;!gfV5{#`gt9huyWU1oPGTYq`Xc<;wM}ubd0B~Rj(9j!!@K)ldb#a3OlMsF2ff_OL z@j`DY{XxLF-h$*$a}R`^+GTlEy2V6EE*hOcrm;U7EHBWy>H6+?uH+eu zP%AJBcj$mxcIlEMFJW7u z!*pamG^9Lye15$mLYd5`C_>jejCCegpUuS0HuaI= zf@^`_uG`pxU2lLEHCeY!w~@G=*kl5MoeN&XCa0$a)QuMt9>>7uyMTW6EXc5mwDGp7 zYEq|-hY_$UE}M+|`S5pd`UWv4t%=Hu44BF}2U{*K*aJ z@OIKB_Veum^z09{c3>cr|Ta;yJ4|F-^&H}E>Rg8 zhH3;{Z`jEA1+!*DXsY`Ju>qpN+3|`k-~my=jM&Dd24s;d;m&kB^~TEh1B6iUcQyY; z_vyZ+75*;af+WQ89x~)xGB1uXSW@GhY##3b@3gpG-8T433`$_7dc!8N3p|LHwg^GV z!UA?#ApqrWf*=A6~0l`h{-;X8DN4H zN^%Q(#oJs)(`U z*6nC*T_nt)6F3mSESbz}g5b@{Um87Zy#2Lq9!{+h=o2FsSW0w|se^OAMm#{ozel!u zR1DQp=puJfmbw+bS;4G3YYI?FJ8)T$4frl3 z@Y9Y=p0bk+NBt*I^gHt&2q&@s74>e?w)NN)Uw=+#I$4besWO5*q75CR!-T>C?}jM5 z@qkL3cpkl9|HlqMJe&%(>Xs)8y|mkKR5Vj=Q@KKJ&V~u9Du+DQDSqB#Ow<6`OTgBW zF{-FB-y%*oTdb^#DD{Ljy*VtBmK;3q?#(KMN@uy^JH|u2c4FUu%uOrNu46hU+ zoU6Pu=7e~$>6emb8iZD}38m)u(T+b%`!d(BO1_NDALkx3;6a!I-uQVaH_!zv;nN3A zp>b8)LQJ#W5P^$6S*C8Ck|eT*GyLYF9}{)y>QWMu+ct!yoo8FqVI>X6o`~Zr`sPo2 zwYM1KT#oy9_||tmT<^Sh+l087U54@&G^$w3_B@I*(%`dPhKe$b+fjZ_yb3 z0C%=ztuGl{aI1fQI@>|A4ls;86GO;-woo(kr|o(j+fyHaza*M344k-d} zZ9#NX<;Zpb)Gxlh^aC;W?joyc#GPN9?94=#!if$#DIEVuh4bY@7L%kbbuImwIPm*8 zEbJ5QGfYzM*RwMhQ>ah{V4WyTq2TZ~99>NZf7n@KQ0ed$YRGsQxU@NxugbMN*D9X7@c!K8y^mo{ z%btsF4e)$O(aR+b^>gdUTWNf%0b1x1-Trt=13kw}zXZB-$>isAX3SVvH^@$B?GB?g z4ysvLT@R;ly{}&Ko{I}Pu$K@)Xtr%EV^%6Lha=a#sT)%qo=w#PTLa>&WDfcmMTIvrVJuh zj`%qj%UtHK$ptT`nq!L<(&mpZ3kMNmo0p$b_+3UKCDYy+{XfRu0;?M##Z{~KKmJv+OCp~Yfowx*Qxxf%=vZx&^^hi@EHNRRuf|ac=X!0W%4n^x+1*ne z@ANvPX-G81mEOnps>ElI6lpiBwUN0hl3aDcDU!;v!ExrELg!?#;oNBlSbpEn~$38_;)vIY@XRB^Y5T!`r)rGR3TQ@*w9H+R1E&wkSPu`|23 z&Tch7a`h(f^oHNeR;9?XyWyp?udJm|4-fa>_(a>Re!x7@w*0Qbz4G;OC-!9tKNyv{6#=>7V=|xILc4(DFT+5 zC9NvNAu3u9$E^lo(!6DY*Y>}fx$uA$()Y%B{JWjuxA}r!xJLjXct@2P{pJbq8O}M5 zcTSt0kB9JF$Z&&N|0nMf%R#w|Q=6ja(0M=}JQUD>01JAfLleg)V1h0W4Cesr8sX+mIIgDWGw$h!@(5l2v=tev64+nSs#Cj{SHm)JG$p?w+-W_lzP`& zdmC`CeW>~KoY~f`!;K2}b$P_|gr-i6-26pG$wV-fVblP?p*GrZlOImG5TvYi5WCTc zoouZ3CJZ~wI}<9rCA1BHjt>A#WRjAeroud>;VLqPVKd{z-jJ-Omf5X`o-`gm5);+m>QG;#afQneDO@f30*R{ zYu>ak>1h};VOt!7-cskR9~X$l-Ho&*TeX^`&lAA3qQ|2%4eExqtNy4vny-n~UEfmA zie7$$+YvV{CkZw%zBasl);S8xU#xP_>QqwZZbvj1{d#R4<6>Zthp@KkxWz(#{dpo0 zTgV#~T0G$bz4JTY=?Cc@c-MOtoldJwbA&795w6>(NkZR$j?%-L5nufoaI;5;TCry} z=h=3=-8!z&Fb`<}3?h9e(~q@9`9m8OoeSa6VCyscMo4%4dBFPQZGE9P+5%c9V3o_% zuZ}WMYOPq>tM>T(sV_g}{C>g)952_b&gGE&ahaim_mKPYN2{{&_vQ?mXi#;D0)vT~ z6uy(eh-d4D6l0S1Fwk9LJJQGJG4pvf_G>?CaT6UxzR^_;XM$|(M~1D6dZ0i=QHm5Qo$RDzfFy8H#cJ|Y9?t%tuI}bYA&ea$qp)IT^&wVjWfyz$y3GA8G zt~VduJwYAiw3xf=bbOFyJVs}c31hi&d;kznh!tjWk4<7rqoSgQCu|tfGJ2wEt@e8u z`6c+AY*9IP^NJeNtsLg^%vyXNrDmnXV-#!G>yBJJ_{gJ7dB6#Y za8;b4+PRA0#U5Jy)jVUU`|h6xW_ZZv2g(%cbMu!25j1uAzV}w5VI9OSzCx`WEB(fB zfH*lOCmX+O<-)7ET= zf*tZHm&1>o=&m!Pb5bJpvd|MkoadW&zx5`v9e<9Q&tx+l&pW5Mw}H|@yqjrbOKX=P@OQ0!OpG$}gr= z;OGgdt&>xHZqJbh!dQyiH6IJTg1HAkzgzXzK1$}I_qG;&vDiCqa;xqmpE>p zLh9Ny9^c`xi+Z3&zyB+Ht8I1s~g#D{Z;96+k>!J=z0z&zOv9awSrxe?d_yn_rqqXpk z=yd!*U1lM=!v0q+&WILdECj!n0Xo?J=Q5;(~_N~}qat~gtJ9iz4i=VAB0DUJ7gisB1O|Sf zE2dAUlu!=!)!`@&?N__}`Z)OTF*C3Z*mvdwit5u>ySlr-ei8}!+UHDrm>5l;{Y3}0 zK(o%H&Hd;tM3G@-hAC?>lC z<64fG75%1L2`#@|j1cMKRCD8 z*ip7?XDH&52}55|h-|+#)*BW?4M;Q3skJpm7n6Luq?&|K=0S92!=~ysSk|)nqM4F7 z^NyktDJzX@o4!oNGY+J0pYJ&E1(epOM!xxk4H6D8%*mJDzm$|FK5 zqWAeA6S2~#e8-Vfb@t}!Wf&LYDdQ-S^GE?0i1r?2N5UDi9vA7&);)#iPn zNY8&CnAGp7_5$Q#SZAGw*<70*FFQ9JWLlNmZZP*LO@}j7FA#F?yI(7~otJpr-+07- z{8Z{@=h0|%M1+uj-widWJN1oI4}8Cqek#8R>7mlQBKVkOJp3U$b1+?Wa9>wQA#<9U zzY3R8Rh;Z$vTD*RW#{Uf+PrMLEe%tDZpVDkPIKxc<(k_g;~L61dqxwy_3Czu$3h#= z4BM@46hB4O+}vlc7FW$}mT-LQ5ZT3#Q%Q86$?Rq8RHz>6vkx~+h5@ZL45l6A0A(PrFN?5{| z@M?TRm`8s0l>Mom`P-7G{iI2swL*Tfb7ry^6igBT27`T*2?WfU&3iI`HctO(eti)^ zpRT&gs>%b%mV@^+ySds%F`->pV<6ww6FA*#X$|IJ?S^{2DXz=KdDZcjh5RUYcy9%{ zA%�w81MKN;twU#>MtofV4F4&0CYG>7o94%lnz(pN|2(?HAQVU3qaEoY~4nx>We& zVEwgsQ{Bxy%_h1(pJ{C!%S(Tu!@1+5PABkQD^A`S_oqQmqM7*5{46+1#BPg&#^Z}G zU5LQ0CFRS?en!2rJ-3Uf#vA)^EOP(ix6A?lB*d;Z_FI)Z<&H;6QO2swzQm4a9=7YR zF3%0_S6;a#bOP1w%hDYGY6a#V@l3_8K((%VVZlofn&p}!Q&eNO_y7c-z!j@1 zEX+osb%-pjF}SUdIqOLm;U!8+PlVfPat|5%&bPabfggG!2W$!UW^ww&=_s>=*^{h? znCPf>vNj>E^@kTwaZ7rAPz%5U*u$)OOU!aOijKyn{A|p-&4r7L9v~NyA>E8RDGB>c z6n4R%v1YozaLnDf-^6myR(ZcTItotuEWS^B_x(>g;jy=?HZ^Iba-)}fgUSUKe7HNF zpoysICi;M%sj!&XZ4KQd@w!90sW|pRs3>;onDVbnPC{TWS7?=nXp7*}3C;_wE6u0b zM}lv~CaYhhupbD#5G8hep46ghT<5TryE*o#%Ne@ZWvHsieH19a(M`*6Fe+Tkv)c!C zu{$pny*zPjbSnN7qwPEvLpr^A)IlP@5of5ab7!AybR@WKXJ@K1!~f7)t-tABrL~gH zi_6`*N7q}6M>!6A$+=oF0-K=WEl7)BPd+8<@KegdnCZidVK6aq3L6ogRs!4tpf?Hy zl$ZV##lJja0ZA2m=0_&3|B5Gm2a#uhM_?>Pl(T}sqD~s+Zp(%#tOQICEzrt?U^B8u zRQF10$62tThG$-J1%3FDnDr)i=mR4col4Y?uTXT7{8G;;b8F|eilsHK zm@c=WZLT9@YE%Z;P$G*}u+E*O;?#Th3Nuct#&=$iKbGc{^W&rxD$=TT*vfwsPVT+4 zfng!0jY)dTXU;B_!juqAr@qnCXp#aiAC<5D^?_NhxEs-|s^+IINfwDuSqRx*#15zA zCfV=h8kU=xE?9FRC75?kVanRuTaQhGs8d}1a2PcUFW!Azum>$bM?qyIykNu*jcHyv zpYy!A^VY}Pz>*_ey38*5n=~#PTp0rcI}?*#+U9jk=XX0zd&sr=SLr6*jV?|@8MrCw z!8-yJEZY=)?N@6l!%-i{O2JIR(UDq3sY-E7p#V-rX3BtSHAb@V-5ym7%A*4S43HNW zf7}pI!f$ayMoAVO9PXjY%rqTJ8(cOq@V>H7jA z=(GD{>7pF?-0!8iSC-vmsz53SSND8$eC9{dkxh={(W>n*y7F+U5Ak}!67ULBvyxrs zlpmcg#H2K3+V0q8Cw{JA`S2rcukqH8>Y6vMQUTShfNLdj-n2;f>V9xUwsuo|;6!u- z12JiJ0qUm8W5DIW1ShOu+T+*zQ)?oNfF|Jo0V@A9PJvUGL9^X%*gkdlG)z*p5Ybn8 z;+Et+sS!R6R6QE8g5vz}TVPSK8Xk`qf@n5@sVRLLD&JmDyarv#aTc#qMtLLd2hr!K z$Mo@Q=QE8hS;*fgrHy=`D<@?B=srq#Tmqa2&^SeJNC5j#PXFRX#`ZQ{_Xk}i5fPTn z(RAAJ1SBGoA3A>G!e`LSUgaTXoInstcs$5u8OqGa%(dgTY@dQ?^2pN!Fn+@BLZi`B zz%<{TP<_)(9T%RhT9z5v_FA?paVo>c$DK@}ir4cTqmMrtM0q1khPf})tZ_zXFJTWk zXP4)1<#u`<1$I<5g$kG)=E$&KWk<;55T;18EgwqsW$-tczNse*#7!-VoUP^y(YDzZemc+O z>UpT0j7qkM!^9%qLRPHXB7$RH^acHjTcy|_;6b4sgkj|%`E-3Qs6W8|)jgcl-9=%E z=LuzEAyW<(uDgzIFj-zy;I*fL@ze^_@xl6Y)To6@_kQS$L+Bgl z?b$p-L0wCC%Eci-g{$#W9}})S_u=DBeeNRt&c4Gh7C_H_!K3>R|IM=eQ5+I{b^>oZ z<6Ej#d*zi08f6ryS67_AU$q3O0d<{& zj|xT3X}rLM)oK8?mdD?Sy=SF0KzdJ-FJpg4(Xv>AAsNOBDEhli~NU z9Sfd>m7I~@e0cwUgeDL2rRGyb7Z*=V*}i|a2EzC6-RaVjUsq_AX^(oxwKLx=pEN45 zFH%V*HZO}cNv56(Txr+|oVV&50pQ`bkk!mLh%zdPFuLWR{65PSnqCt>PeKsc z9bH1v`sF|ehL)=jrJBbA`=C9-4X`e(wje9PeoQ3d{O3chfcNE^XX~Q<-^OSJ&gfNv z;G@e#iSgEwVE8_hV>)HAK@YprVH~b8i-7%dV3)GCs|VK67+WY{@3`3YNin`-h_f?N za*xPm`PE2swCc#A#aQC~;|qXU+HNAtZn#ZOP;A%fA>NcNMU~bmf$$sdnfJ%NW2`$P z?0c7lZGvnD7RU}3JEgPmi%e$`PM*jq*pBt*!eMasQW&IX;pP9eazPh(zo*MwgZCB> zpn`F*c+6C)O?CTf?|P3Vs^RFz@a-#LEH&03I5;@N>C&Z7D|O1c>9}=5X0t6)v?3D{ zgz(~ev#X78=`}0ESAVF#1(*uun_VtAobZRSt|95Q)sV$82tjg7^!s?@ydM!MtXZ|( z!N`^dLRcVOcV8P+F!Aq#oDV@W1KBTk;6F})2YhTF`_vmIlK*Sne<6FpNg9wjUyj1l z%v)$K=^EA5A8`RJqDY~ys(5d-i~x{N74>l`C@6sXLfQH-V`Dn#e0=VvR@I%6pD!8Z z0m7C@b_m@UO-jmc_Sm*cA0p=XvY(ZYrcVJF7S7?YB@wqB>|!nX4L#M>ZR2{!4)ER;lkoE=}K`#~@a{*#eNa8g_@Tjq&ZGPXfL> z_{8a>!fFi;N8g7S(q&di0-l)Q^NOR_h6J+zE*bB?mOKgP&be?Ba~6AHu5m``X*zfB zX2TR$-7bthudcsusotEJn6ZdOjDkd`dn?!}H2r_`=RCO4i4d5HR4K(qAxcuDLP*WaGqFZ_t^o7dxjY^B@?8Zf19Sz3E*-r9Cqx zbxl-q&PAZxW{?jj#`)NucD|@)nHS{Xc~TnDq`G1ueSSDvxx-_;lu2LC?XpnE)~PUr5`7RfDZT zg0BRrpJ_{~l-ctY%oqE?YbniXWLRM$A4Cw@mhz3`@OraNW8Tpm74YNOfgZ$(U(`Sd z<%j*ZEw&AX3^ln$byo;g-uo~|v{~I>T!q}!3u=}G&HCqh!<9szor4qw2~>3ITsq#- z%qezji{zp)(J)77v~(q{Dgx2mjRYL2$aDAjeb8UxY)y zsv0QGW)P(rET3T;FJ zn53~D^H0NnF7o#^EDCOq?A8`I{&|a_CY+7<-}X&VtLKVJkZsGT0HPH_r&a7j!J8?(p~i>`-?%?HP$cv}(wTf|}a9&%$*^ zTa`)WLD$b;(4%*tk5a#Q5m(9_FSi!F0|fYFguCiK+fSIx@8!TR1i|3cf_Df&uKz9I z|9kCA3Kp!7j4S{923b|${?kN(unu?*DB{lmcye>eA*;DrlhxrTvs$^WVl3G-h4{O7 zX+Hu#j1<@q!#iQ7DviZ*a$d+%%cyRo0-kcq_SvBF53^KL^>#dpB`V{LERaw|dAWF* zj(T?1Y&Vi_^Ejffxbc6&pYY-AdIVd2ckhFw$F7R^OsnEtZ8GY`ik|2GbAKq4JTxLsIxHDBl1PIbSS-RNMDRAc6^FHS0 zW`F&vfMTg!)RV<#%3-B6_xgl8@=D3;yHt*J5yMCw)UbO2ez5*{Y8ZEc{c;`@6C-7? zma@0A!q=-Of!2hg4~~~de`g@kqZDR~mbvjRwTeXqym;e)%MvhFx+YM4e^YJ&n9?-0 zds_iNr2cE@rydnF4f5c&mu~AS6)JE>JUfB_myl(ZfL`4XP>O!Ld#D{;Mw=u<^Aqih z6C8jS6iQLzMMyin*<|r>KE0uz%Iz3-wK>&j+<0jh<^P@7D!&le69?`d`ifgkLMyt5 zN>pw{cP8-B^odL-y}MJ@>vEd%T!x&Pg4jSVF}+C|a%ES;7{7NRUU({&@{P60uVLPq zLH~%L2m2Ev=3WB%ultB|338%CWJe20dT=n6QFf9?&<^Svr@}>-^pw~w&VW#EL829q z!960%t7OcqK|84p5*9!$pCJ5Dxum8fYqg!An?eqC#XD&`1`L_2`+TkZ6567Js}bXz z+5)aMOZblt8h6j9%p=|=uod+8%{Bo0|3W{aUe%|1P=4pNB34KQoq$HsqR6A$yxd$0 z=?q?{zhRs9No{SECKVouKau`meBAUD{OGB^2a}VtW~Nl^vcfi$msHyArmS+-`dXNK zHuiIK?{VQ7ztAEo8K(RB=IE=7P3!Lpd|Fb?_C-=3BDWZJj6S_lzmm-UM~=1FoF>15%6d08KwavVa@BzDLR=FlyoCSOGGVwLg=mZ? zXeuj)#UM^V1@pTJ_s&=zEo^HziaDM#Sf?WLwq3K*nZ7ru$qPnF%?0;XEYxx=jRC!uQ$K? z8IP|;U%jG_IVO(s9B%q)-gtqz@t$5Jzm)^Zt7p953zXjyfT?zRQ=1{50jP^hykx6c zrJ=AeEthc(OyPP=;X*9$HUU>cUkXtG)-5MTY@`5taKOH6gq=LrFtL}NFKDWwH={7= zC|h64w7c63C*LNiDyC%Le&@njt;FeG!F+X`zrVx%V==8J7A{(g(?X(1cg`^V2T%XP z|5Lf8!Rbr07hC^tn$Kq#@$S+X1f>LkqVV7wGQ1oK|2MD>Cr4VZB)kKZ^9a)&(DQj^ zLVC>!W!ss3;dfDSILAX7s!k?uo|GVTi8jvs9dR>J$NZ4vqH^amtILU=TCJXx%pQfl z)0Pq!>-z;rk4Y0N)4to|u}x(jN;NuCQk^)>&|f*u!=;65(u zq5DMOnek((l-2moT^bWdL1qPaSQ<{H2A42W&5u^&%AqNckqDM=AKtT$){P|8zOUD; z`EajSy*&KzsOqpc@!otARl2JDW)oC;s=!d$WatfZUi!Z~52AP~xE0Er70Lf|y}z&R z;EdPY^LIIa=j>!20aLC1hy$Gg{;<^VMnw^;)!36?A5Wu+7v`cp6*UomV7Cz|DulEn z0vwNfCpjTOK#8y#ez(4<3Z$XE*OvSSP)Ll_i5lWp8a7=#C3A*5djI_Mbq7xh^IMC| zzrXtZH*jGIhrv{}4v_ro$NB;iL)Bl)J0LC2`x*&y%R*&qj2We+%pGY`z`~E!&}Uoh z6^;~05NBj$a$k&`di(o}t2J4%^r}|_x2>N#q+J<5g{?Cd%oP@t&%_JXI$Z~7Q$lU4>V`U&mf5Px8_<9Xx z2&EUkA2L}8Ln=Hx&lvqqjQ3o6N0P*JOU!{oVzlgg6ZHDMnw*+QKy+bRQzqk=?!VI1 z&*@1Qm+qYqiL0vi+G=F~c00i4vkJoZ{F{{U+u!^A=Y=1fu)KAa;Nx$;CEzX6eczd& zc0EOb2y^DWsU-Vi@Y5^`t6wSLgAfWN$~XG*MM1tMvO3?G_Z?4l0yILvG6wt`v8#)? zE~mktL=i@Urk7i3*w$DEtWsH^Ia}t|bv6f&gdo*+W)z{wuARxg~%6evsOy-Y9vwqn6>3QFiWlA^` z$MF}50(AL$c^nj5W`6N3=B_0Y=k$O83UKNI2J`jZ%TZW~(`-@M*De{0L(>Ab(YHJ8 zDyGrQB$R4&h;FYD-{YGW*UjR}-)8Sd5Lf^GPLO6;miT&--L5x*G_1xH(zcx9s`VL! zdH$?89UohqQZ?A7By9+`Ym1y_OB!|ghaDGV`=vfrR(6fQ-H{CvKAOd>{Qq3wFS6VV zr|=x9sp|b{9E~I5eQE8wiQIs4)mbpJU=6U5e{|d<&$(caRlHg!Qi*C^swTV6U`@cYCAvNJf4+1XK_4bB@Q{EUy!?_^t$l`MqC z7YUgUs27~6lP?~1r^|aB2%DHXGWSfvn>vqBD~BF6y-QEx3Apv40XqF2n*J(xoZLSxaRHuEWetDmJgnMkV@iDVJ|sT zVuUNShmPh(d%D*zSkiMKBEUfWj^e*~z*Uup8AbDN_4MaOHVMLAln+VCU@FynPn_TC zsvT}?+UqZU!ACt)LWpM-OM6%IM$}$9vz)3=5o9`s8_5x6w5Df7;wHz$yo{z#USC8A zSJ5gLf!V&c(;4!_LBw1WxPZo_+YbeVBBF+-khw1k}TnOVb-hPoklSH2gNl{k&9C1FAhmAgJNZ7K+vv~Ol z&bSgPq+wAVj6`J)u*mRTP&_UntB$f_^PI-_D44L*&DT=))P%Kcs%wS`zkcG9jG?Iu z@5%CreZ2pXx7>B5JijIzLGFLu#sA_K{(TGZJ!~L@-^COICm4(L_l<-;gQpEbgWL(gFJQ^;zUCa* zW*IrdtHY}W(^rdOj7a6iQ9{s1vqA>dFqX7MQNf$a`Pzoi%y%i$AW5-bCPvAUj)%TE zpWt-5zJ12*lg@(wulNE|UUYbpx>xDD>_5`^k6!?nV-Ih5;@-PBz!zi+{}%dZbMPV! zhgCijaN}f9w!t3amEjH!VVe??R(AHKHF$5o)4WM(DEljLadT>)z~K=JMRi?WWG(a- z->#}iOHJI^SR!?oVdQhAU{s}ok+BtZ^?ejl3OkWEk zBi|u?hM-30L4^yF*NW+-xgz&)o~%D|a}%K7l_Fqct9V|NJtXaU|039%?hw?Be3I`H~M%(M$cI@?Y!gAFv%~W^uh#Ufl{xEiJ`Y9L1S0dUoM@ z?zncE7r&kV4BAWj%)L?j&fNKRZUJ9l>0#|&OiBu)=cl_rGNH3sE2jbTZyur_%-P(r zF=$-FA zYNV%N!cn)#?7n{z|*Ar-gN0GK%(2~ zSs4T`DBBlzopf>h8NdsA=$Lot=n9{F$;#RBqy)U_PI6B(E!S`Kn-) z_nztceOA!js;0uW@<2i?^)Zwpp2{E&3~&5NlSu9HsxtLBuFsu}bfdWy#@L^I_c7=p zb-M2Z^3E&y;^iOsi(5Uf+s$NQr$IX?!CWeIUo+J znBZ{#Eqh;7QCOQ6##ptNnl=sJUcB@(QhX4&S~^Ej9W`&j2O2b*dbqiT*Y_Nb4YvAY z<_%!^8Ubs|I68xeu+E+$s7MDrBGUa-!>Wf*B|X(G?ARBlI{DNS+K4xh$`0m->?m{! zpwV9^5Rr5{-IFQaL)J*iH*Wz7Dqld`H3l}okosZ8LA77Q6#TCoJbBT7e|{eP z%~%~o#q+omD5Neno*o762yZ#A$NGLluy5vnNE^bg`W5EHsASy3SR zyf3QFdG9wYL<>jLRUVJ&@Zf!TRp)?s{k~e_5~1jtRFtvWT%toTTj;y_5mQwhT10G; z@Xp-RcrDB6j}Iy%bZ^Ol8&b8=74P)j+yQH5NdB3${p5P3IaSN?P-vACR!ogqxo(rx1t%V1! z5aP8hP4&Kos1ZMQ$bv#}pG4_gw-ddcEt}5` z`{w?a?M7sv?mejE-UC}D9H^m}viM91EqdOVc?P!FmJ;dl!GZAWyr+SLL%2+Xb1*su zupcue6iq!&-UUD};1$knmVmEWL!PowWko!xsg9??zXvpdwl*swtgPe*=Jx_h^w~;e zh@IffQ|#{r1iEUhl%DFSPa!i;;6H7~V|_1p=$nvs*ix7vxEUWtV*lqWZB)T4=OSzJ z6Fi8G-+{gUNn@khZ@HqR8Q0^#FlKWptcLU34h3u7C9AfZZ?rRD*y5+f9}D+=g5TaX zDMuz}8LiUN1I>Hu5u-aFho_I@yT6vD~WR17Pm{VsIyh)z*1r)i5;mIPfg;ei-nz zM5)8ZYVsQ}IkMWnbltDIT4<^+f4zhu)-!u_xIOo@+ZgZss#&hLTt;n*lbP&I0CX6U zQC_#k`J;Oi$)XX8l?A#_DXOutIE=VjZJobFF|sP&f96V0?XXd#jFF#xMyCr}U=(5T z1Se*YnbMAXQ3sT7n zbTuV!>pg?-+xU_ft<7ypX|0y7HZ0Fc1A&goGB9P1srdS{(H#5~lF^uTSssnvOe4JY5d03%%C_%G}ex)+-Z-=PA zc^Rl6A{ij;h7;X;KoYwP@OusT#>(+Ygl96FH*UA1hbmP zX`pWFR7!W=!}BxNgF(MdT|tF#@1~it{!wTG@To=wMDS9)dOXQ zzztn;`Rrt6NM^~?pjo4Q5m>_uZ2=sYnFO=ZX}$M(vW<;=7QqBTZO`Wu+CPAwT_uQn z2D#X8!g@KYr7e4GZbbo z?$6=Q&Q{2e-187p&E+Cy3{m%l@52|azfA>)B1;YVFjs`{7;hEJ$~aSLFf?MJvQOkF zx}sopq*glpsy4j0$pF59qmVB@ah`$|HT~psZ2Ss;4#`!;Kl#?pM>}Bjc;Lo(NEqp9 zJKE`UChF-&bD4Sg)~A^8(tS>k)C`|1Ay$RHHBe-;-x2F5jY{a;kW5NP5zrQ(sPOAp z*S*HT!kY0)Ke%EVv;8y}B1~ezEs?m_1%Iwk@OYq004LZ99>hzMQD|HZ$OEvhf=3Szz=fdZdTr}oCf#+IJ zy(Cgu4F(56`8=m<@0L>j>$%qoT*qX*(7^@%1QqQ%}CS@d5FeUfqgtDD&O>YAv?%<4G{DjQopbMPZRUa9i& zL@9hI{)g$w1WOqij72?tv+lQ^4w#*c&s(c(+(gicc&;x_T4QBf>U#tqskE%+O7o`# z9UfY@wu>w+qW0qy84@qhNjc$qBqnM+iHTKOJUBfPwYE+`#Os`o$@IZb@c?I3uBafa-s6&Nd{mZny#|&@$&lUvzSYR zg-X=fDYF!U{3z>4@JKrkZl$;h&oGHJTNR6OX5xo7FSlkvIygVt79L7)-)TJMjExI0 z$YXa`7GOf+r>;ojn(It;35~@teHSgwfw8a!(Q?I%E|?2E4wMYQaWSgsmjP}qQIgm? z-K)O?lK=QD23TMsMbC_dUd12!;kPe+hjidIm?puoG>}LPX;8ORR}-I$W48d5mC(=> zZTHf{2LLtnt-t?~hlhu6u)oaRuO;a|qqOf028Y(l8uJ`D&W2jnzJ2?P(%U>~;=%RB zu|hKi6r2C*Jx(_*jpEo2hqifqElzQ#adrWQ$TdiUW?SYv|#^kM?2^}mXC*7-_6L#__%wnEEcHn zl`beCsEs^=AERBiN0D0fILBQdhSK%)Mn$l(2)+3Ecyx8#(8<1?UL%!Rmn<}mEn)|H z0w0QAZU7QV|}#0b=6d2Xo2r| z)T(kH2!`hW%RWTTNc)=&;5lr3)^)ArU;unVt z%NrCIY`ERK{j??YTEChR(wI zgoLESB-%}K1E7}|rx>V_ht4=o+j(oHXznWDW8Ce1qtiD-vcD){@uhaE{Mg3Y8mlqk z=(CWiQjx09BY`V4)A0-=7#%GIMR~KTVX}8#VLjTmGb_8=N=P#51S1e;p ztk!OEey7&NWjKa?vzNrnn`$Qe`||T{w=8omdqVqckqslI1Jpb`qJDN3bvq)7(BK^j zk~)XIww4gy;E@r&r~J;ynf%-+1?%_2Rv(g8oA2^HyG8|)kA<=fyz`CRpyNf6ua;7_&oks1`2oYq`1^L}sApMOU7NRJeBA(P$u34B*m;=dS=_)a_Ki>>673^Oas zM;tEgyN*LS5hybZ6sR6SjcUxwp68(YnRf)@d+Q1zs<0Wp_=ui?^y3rKNm(}|ZQip- zK5Y{*mD;9xnspSC)yvLKFU=e3tC1lE14L0_s%37ii9m&FLC} zh?waWs=Y>zFo*f%#g$5arSLgxlTgvQJSURp!$kxLQs`TjLfoih%1i zn3%7Yl#Gnci0}HI%vjY{)cJWSphYZSeEj3xW^* zH}Cwscx;V)EIzpC87Ol#ykXwSS&MW~$64=-<;VV%Q^*0@cAQ$YFbKfoH4;Ohq3NpI zDP+ypY6{X)Vue=0UYXeIm?Pf;>7j!E>D zZMn#aqWH0K_~K9NG{B7PyHIJcOQUcGaRS@pqr_nW&wL*FLp0GLGfL4svPB2PJ((E%qQ4Lyw`Z%9t<&zof z8*>g#0|NyE18gvp-D+PZ6AM3+gfsh4^dU(gEkoV6+(GSfdUE_*hmwW{ zS|+dUIMdqCs3v)7fm`pXs_V;>W}qTDH&4pY)+eZB6cvN;`s>{R^k3cMCDsfewURj7 ztxHizI#}vhoXVqq_96%U^=r>j2{O7!m!;lQSp|hRWHZRl`*U0CBVA)#wTf9dVT_Ge zh((PjmEw48CY*(JC*rmnGbpLY;V4Zi;jRmRHQu@sH&PzZ`IP93{LH{L%r-wt5wa!X zS*w>&JWlmHU3iT(V;#$K3gtb$$}_o)Niihn=YI!YG-=bQd~Ho~OCGk5z05Zr;`M3{ z1B4Rj&{t+~e<=fF;qu)Hq)u<=gBlTqGD|}L#*WxF*M~O(UI<9W8>K(-?ylJK&DNVg z@=LBVAv*hp#55R2;k5gy)k}q5ll{LAn;IfGgO!2T6iWYfG=HV(e!Wl>1-yW}iF`cE ztUXJ+4-r-O-rc*FKOGHq))#J&E05f(Gc$2`qJTh9EMlTW6!(jEbHj3oi4h>Ot>I6pEGf04iDtz_0@tSWA3lHop>5>xn}P!E$J7< zMz=Q)$sJ-5;^TM@gkrQDuKNG*Z9pv(GAs2{fonb<@-nVEyv3hmh9k*bZN{5Ji0X+S@lS+uZ88ztp44n2zcC8kO3%$Ugo zfrlbXWpwKEH@3JE*MFUVOyJ%Te)0q-XK!X1X^+A~FtRbW^|N3AQ>)72) zgAo#i4ZBLC?HweIL30hz+?^-*OF2I;*rir0OrH3G zp>Rc>Qhw?uIn0ICO5403X9u3vL~zsCeVJj!eJyOxmNlA|R{KDa!kV6*Ubz9bH$9s+ zo;mHj5)?NPRV!-uaq(=Bb1h#U?Y=+V(DeeqZWEobpDm|9GP*nK{Qy$K9DuIvxO5L| zZx>A3WIrb^FWpC&81YoEbh#lxjiLuc|5SIPuMHZ9J6rae0%G#4KOr8!+S97MWQd98 z(5$fMJ2Y~X$7v}2!WHV3yZtJ5dUw3aupzOm)Vi46fZVVCFfyyHJ69Ybbb#G=v(hxd z>*m^tl$%BlX0a!YPUMilZqcEn7M^tZA&e&Az0ljg1~TNKXv7mCyx2uU)za0+&UK#d zbXaj2fVg?iw=6s8L2z33Pa9w*hLGryOb4&)_mOz31ZJtL~7!tPZKi0?x+( zuI$0)rU^~eWA&=NH(;D!cNfkD^B`7KXI`O~{` zajMm~9$gb6^Rp@!4;#;#(Ig#h@rQ;Vec?kfHgwa+>e)nM-P+>%xM2{nW+?i4>PNnr zhV=%UEfGDX^p@Y*)$l1M9$uc=QZ;vceWic% z$hI$s=X7_bg5YsswHCJ95e%2fY(l4^;bRx`40OK51j_E`KOIpW%jYPa#7z`{!zjGf zioknx{5W24ytHX`2IqSL^~TZ6fOY#uSL0W6QpuLZPuW;%^hScnim$@~kQBpB};?RKNA)f5DbkVR@ zEJQb)G@fljbN80ogTDbb6_-}5tw$2y4{9i6_*cFzo~3Y-)+*y9cMyH(&ctFW!8l7zU{3j}RhV^M(Rx@$8$xE1Pv{foh;fsl-kQ32 zdkOQm7q|&kW*v91!r~k1t$DUfIG9L@Tf_!xOi#7UX3C}5Zl?mI)%+B>tfqq%=&l@I zoMi5Zrhcw^-nV2Q9-$U7-u{j=s=aT{CJEha9Pl@!^WK&sO>Kk-7_E4W&k#e)uFqox zN*uIndp}l7>gfD+AW0G3!lXCx%!bYRc!Q(W>XU!j`0C@gk`TuIlH1nfm@sXb?9xec z7U+l71%~KcCL}kdBB}2kDK2^9`%eq&uU;c%P)Z<|quq6$g928)gEm}k+D{gBFcA$K z*h=;KVjkN4s?!+`6p83qEfcsv4rs2;j!C*}8^s;(>z`ew+$s!-vdoL5@KZ6Ctun)0 z=Ik#UR2n`cbtj(=o0XdY5MN|Nk#zMT;`UsF=*snFzr|D!W#YHB_2K_V+IvUCxxeef zDWXIWM2Rj4(L2Eq1ks7!MGr=a7Ih+eCwkP7=)KJ7z4z#h&L~la(fj+@zu(#4z0Z5j zTJKu#pOZDSVxIYw`zrT!4>v>`=H+#C-n!klt34NDIC4KMK0UZT6&ria_N;j*MbYK! z!PZ9Q{$4$G!S=2nA+jrgBz1cf8@rE2;1*yvQ+(x|fJH+wfmX5ESp!KZ(s1%Vd?UH} zt4b6k^g#szPdpefUmLqdJ7XBCI#RfTv34GrEX1&Xh8*q5atNLLS-DaAC3SZQ{|$4Z z@Sg&X-x0a?e=NrTsBOUe${37a*;Wnmj!_TP9KC&Taa_=xB7GKc zq^rFs#&5?kZDZI-F0{@#ygkE!TvuwlLlGUDo9`wtJbOTK$r0CE&*{f;f=Z)GUvf`i z+npkZTLhdSZF``P1@poCoIsn@aO5N2K+3g=m;ftQSCG#f6M{&GC)1aF2Xxx|98eKu z!2}2UZ^uyE2@^VT!lyw-2a792a)JXU2+aR*RaQ zGfwQDBZ!sFCW?+j_T~8)H65N)dCgK53$Q5Hxp#<8bE%u8 z-@JL#_%Qu)UitI-OrrWt_?DU@O167SZ<2d8J4&=2PX7hraP6YC+(ljjMF|ZZhBOni zb`UCy7I&NiHAjcAeWUG+|7<#Hn)mAF@&Un4mnmmNYadLzwcIzuf0(2`IIL-u+zHS(j%yVL!h zfo`SC>){?caE!HIW1Z_u`p zL0qC%^mUWqVO4C)iawNqiSy~BfFon?8EaOfTFnX2b=<1sAB`iA8{ zOzS7<_jY6s)$!e|jlWxE1G2yH`>}Vk)~^D<;{Tt{wN@%1H6XFpNh0i^(fQ z17H-hcs|EJ4$r^W-vn+cRP&zrV#>V`>@t&`Lk4B<89#KAt*7-h~vcP+^1WdqQyJ_pZGcr_xg#e#s z+$JpLxZQ|ldLmC|8&8BeEu@}t>IT?(1GA! zY(*_+qWhoZsb?wdX~HY%xAVqBZK=rMZpce2)(&&=5_4nKJwhHs302h)0)*(rKIlkg zVJ&8Wl9la}d)5LEX7S_bsGIt|VQ|EscTG?CH6LU^M6pX74@$U^74jTyX}9%Khwp9Z zYs@)jb5ku)3m~5>ZIRm@-k|omCU1r$2~Cq9RDd*^bNoiT4AA`QN2uS z$YW>tz&N};=&R*V%AF}(=K@U^NI67|9ipL7Vf&{md_BEvBSP3XSkkwm^COihP8=B4 zI6Z;?TwZTt2?72%mM#(Ze_Sm$TB`eg?!ECqw>>*sv!TAe3B%9oqRW1J$nw6 zF}bD4sZi)9&r2Z!Wl;+hXFi9P(G`IDJFdh?3U&@ZHfOxOTr^~2T-LL&;Lpm=e)`c8 z%k`wk^Y-UQ;{!=6E6j9n>x#)Ip84i@eH6Nk&^7>PR}s{KXDcX?(HI7}050pIgc%m1 z<~!f>&9#UPH|)P0#Y^h&u(eE?#KI|h)#?Am4SyO6#-K_)VhT~ldsY6&X;@M6(|hv4 zcXWU~K{8qJ6rfhlorXb#YA=OFVLx-J@4B;RErY%qTX!mz@#Riy{3p>N&$4=(1>RADG|y+nrh6Xu@U% zxHi8V&<5UJo1JLPEQMt@%0imO^IyNuk`0cY)mTx8Sv)oAh%M;)nJ)lLsV?U?7l!Uk zXS)oZ>Vx6*OC76$)*mZq|9Si@&EFkL^OrJ3gmR~6*(-Aoe|_vAJ0@!?h5?qetuuAwss;l74x|g<5yKI z5>Rn{$)Fx=nlKrFmnrUp0v9kaTeB1m5XVqE;Uupd=^1*K9<3iRgUBc8}fr=@x!f$&h{`oI7kqS(o%NNQ823eeg%)N6ELV;oa!do{YL13I{RTQT43HI9ZO)$brd;%tzBmw zTeryXMy2>-vz!k7g(!PpD*eBu6hno(>aD@4gZE#T`(O?!LM#DGw zVF^X*zu|UuWB_}?W65_h2Kmc#&<0}>=*5~D z`ft@3IRy%-jD~qY4>{VMZ{K_9PW-}tq2eJ%kFXgQo0^{7ZhVZEF|jXkVw}|rbGuVp zpp(G$twVp?7^7vwK=0-|R%CO3RY#p%*;>UAFsyv@ITi>WsgH$YpFc5 z)-d1{IZ91a(wxQIf6fml1jM2lmo%79bG8|yml_i1zp*}EP)N6O%h}UNkC6`+e}x5| zQTz1Vo0yRL@YIl_27yj;RY|&deU@T<85bMbUTc|_1+9%>%x(TjT4_1g{c<9cN)T=dLpk$7|dtgfA{`~3;Vt+Q{eA1weP#m zM9SNzh#ErNEBA-${F|B>AHjBdC&%l(@nC#w%L$-$kDwqRpXP!@Z17U@xmQ;{VD5q|%=h+5?G{G8T*w7p$2ek9Mkp1z~AYZ^QUQ0M9LIw~KZaaUGw z?QUsla1n=BXpIF1g4SLgbZRZCbw-g3KOiys44p3k*yvTisOI9pM{>T3f(o?!FUWO6*P#L$*qzgE}eVEnn3%B7ZQdXqbC! z+QCdfAwbEB?T!NLDVKmzJIM79%a9!Nxl(|k2`A<6$$1)f0?crsMogS8{a_uW;~+8n zAo=+->58eTYhpI|Rp+%lURFP^( z7*1*hl$@pej2Ry6?kDUo@U1<)c(w^s_*n^w+4cQH@IVFMUW$2%4T%lkxWg-kCc$t= z!Vu?kim}*+XffUcs-wO6FhkBV)<-+aVqe@A&hItf9>DrOo1q>GBIhcLuxCQ9CHX;o z*X|y&nNJf9KH=}xtiD8brAdAq{xJCcxIkL3PIPw>@&+9BoQFVJAx(j*lWwPK(ph$p zqlRyA>WqU8EAxTTZB?*b)tqb&D(BnLxMK6e!RLdhkKmM#PZFTp5u=H2{6SJv^DI$oAOEOGfr8?*RL;YsK!&H*93H(f& zAut;U%YmGrZD{-|a^*8xOlNV_0y|bWu|S3OrZn^- z{s`Mdu^=LB9r+jY8d#upx>~@7EU{l?0-jZ@Bb}c9U}51l$6px>CP+Kh}w9%gs*VGzB2czov0xE9FL>64-e$$=NGpj=2X`>ER!QD zZ+I_EW0DSUUg|}O=1Hi|uj0iwCeu+0CewCRB4-9}`u6ciCX-h+lmZrl0G^|$?@TP! z4;ya&UWnQOT1c~hRy}+EJXy{xUb#Qk(!#iV#Y5K|nP+LW>rpK6aetmka?|M*sG!^sa9g!O3;&eMCcz?eR&9B&Kouj4n@K*B| zYe0L#L=q3S)66PEkRknh3w##^=Q!6Vju}YE5ktsfXgp0yz|6(|WPOHlKQ!&nbQ7{9 zB`)cB9#6EpYY?vf+w;bauFiQcQ^ScwzPJ_LRsnM2g5XLD6BXLB+jo=sdZ$tPwAYPy+7U_W6gs1*E2c{JLF4T#;FeUy?6++r_z}{NyTmFp=DAN3})}Cn? zF9-TD6&AH7OUB|8QjIUw?Xhbc82EuMxy!81g~D>YN0>z)o60=NBx%iJ9c{GXfn|}2 z?eun2=hr%Cy#LimubUCy)Fc`lh1>NDwBqnM#D2S;&X}Wi+e!XlE5Y_>>LP7j%}5E80V>?noq4__8@>#*;2tmQAvd4RO4|6W0X)KcAzHJh7?rr;}J)q?<+t;Q7 zx1aZVr$BFeNw43YT9jDc#nhCWjMs9Oc@oGi-P#(ETj=ee$8x<7*1$3iP3g{U+E2(v zWZWfj>Fk>=J`h1Rs6EWk`>aAfds5i}31!;?%k9bv3%1=+y-R*UfC%T<3e6visz*IRi8YlF7{H168t^*p9YDJzE`a{+(}%;dQa)xwgxp;@;8-klyhEi+Xl- zxWM=#mqxIFR3HFYzE&LFLEuU>Z3p4)MfHKyW=gP$B-aNol2q|FxHbWp--RhVu?1?o z7!ju^TwUURlRQ^P)D^jttNC+;yTQz_an^2#qkTY8=N-t(Bc}XEPWc;tdis00&LOP` z15PSc~=D41Xu+yb);7<|F~oG~{%(oO=!^uu=sk z04}aMDG2M8SJQ9ADQBFl6}t+(B`#GlpRM{ZTmxe%r(>*9a}eIRG}<3-etDk+?h0fs z#y1v(Ht#Pt$A6L0yt*aRabKCUk zeC~=s*@ilB+f*Uu-ZY}Y5(ILoKa}KnSG+s_HMO9%qNijg&W#GY!qwbVu3#$WLo-!>=OAR);KAa?GdcOe#Vn42$&&2 zl$$E31m3t;rbCrrq1KNAUC6mb8wGnLC|H|Z|14yE$hdCu_1 z!f{tkje7j;e8P2EaI(~@NXZ2n>=(V6cPLtyREMY#GeK^K>jMk#LqF?vVAgiGj%BLZ z%+Fa@4EYr4ZCPVDGWkppi^#fnJ3-9wv&UnsrRzVh*m@;egt5wkT>w5JunWvET)I9| zDI-w*+Urc^3K^L)*sI;-MYPx8nH36w3u5SmkE*{8*|65)#9ng@)arG+{N_aZkTKAU=^%^rq+NePH8g^UVcDy5}+x zqV=@SrnDo1K9jGR)3LwU&2+c!8KU>}ARo_WqO@+^0)caSbvV?u7KEG{O)-^3gAIxs zTmX`COYoOpOOyK0T7Ou86oYo95BbSYO3sw5b-T1#SnK8o?}^7xbOT9juIlLHr9HSUXn>YWq0DX@GSjm)UFz1*5 zq@`&7enGK~rd?w};l(?ge$_EDniAP~k!oS5*`F(yQ`Ii>=aQ+M;?zJMkLESS$qx_u z%+*gpuOh~_IIIg_7ZVdrXjH9P5Xs5+Ynnbkrva;fQ3ECIa4Q*JKub&(r|CTt-7?-Gha^|^pn-&(+j$yN)-p|6! zc^eg=y+3RMh5%eEOONTkOomr6S~F{E!+Kv>%t)VZ!vGja&LuZapvV#Z!~v+8j1A0C%c$a>w+&6Do=@HqzFtDCVL(KidObZnJd^=g6k8#mz^HVSy- z+k|tU803e$!Mcnp^~nYEGE{Z)GxiglQgf}};AZx1+wb}Fk)xUSz46J(i;;5i?x-y- zb&pT)ZG`NQWv}S4BwFBDJJaRZ?(R8<-|6&nMNXcf4iC5LpZYOUL*5caA;Xq2sH) zxr>x)9?5DXYcA$s~Iql}G8qThqH8P}5NNyJ61s!MreaaPouW{*5HoG~wL$ZT{+g{-AZFyr%6NrSvU?D3mT*B;j;(7MBkFbaLOK+al0UEvfhVOgT?%!q&>}{Up|0!m)PKl6K6NYOv6o z9^0)^;;Q-O#^OJ6oml9LY{auzH(o%>_wa}2E%_zoVIr3KMTcD3_pCGC8~u~dZE3tK zmJHKJzyEJ{2nE3iS~;$K2++C})EQ9Obd80e?^(OE3nN_OJ0YxjYYZ(;?>;*NX8sh| z-aU@hK|>k9?;3hIB#P5YEbmmO=Fo5Q)4lmRptEH&ov2cYlR)Ogucs zWldjHLH}3yuJHT#>(X(rEUo8 zFm9s%!lwE_or*EczdQ1|^d${edDY;Gx}6i^kIOrF#*gD-lDUd^yZxoj?H4$D>cHGA zy(y)tXSQXbi7GcxuyDL_;^kVCAizr(T0JrPmTOQM9N!7`?p3n~aDUu>#3QRMdK0}m z+lZB+W1ToJV4U#2h2KMn7Pa?^J0Cw3aUioN<6KppIXMd7i*CIhskaoUdRbnCcbzCJ zFd|C%y{5x?!I^E|U&{yBSV=r3lW+irW#FGBqjsU?3 zShi;@GjLBh$;H#RPIl$n#cr>1JF4d1l%~%EhTOxoNAL>@R9jf-YO_?>gxekZXamE( zi%g(gOjjhMOs+3*3T{>Df=tKrmgSuLr{aMq7pC&P74x&x=FYslytj9rC}oKmV6M;X z^uW~6M`cj1e=RG0I+r(dBMo;;0fpzi8|z8i4wakjQjwscG+~oFqyx;ToOrzx(~Gy% z;51xOFgA`4P=9=mTgm|S7x)x-GJI14SoXrJ;XlCm_dIZ7!4I^zM{mD+zI7utf;NVtE}B{?md?zE*jXlLwer;SN$ZBLJbIYyXo?Gt#9uT)NM8aI_B`Z0{) zLE!-U)l7Vymiu?UC_YZkd-(J%1^M}^D*!^0?8pS$~?OuNvtixFgIKk)) zeU!NqArR>Qv-&7nG^*hPVjc17hYcy{sBtNEjLYPVX0QO5CwN~zq2&F+{yt}C0yS>s z8BY|N$@!xIYp;gEPOQ%+YN(}1W5 z{thta39CETE_OidRf!i zkYVu!?3_B!E)iOb1(5hPkjRS{4`h!jq~5*5tf+J4KKlgJypb|`qU|8>>@en#qa^G<%&VBe1Jb|^|MDO;V zk+U^Xpj!U!0sRo4XVGABUe~E7iVI?iTh7zSWcgA1-UPXv%O3SKnYi=qnsrYvOGgH_ zR#sV06*DG`M2>?7H}iTt+Xh1`CGq0FG|0caW>hZ$&ko+hg!TVf-o8(3EDJ!O1m0A* zh4@y^AUv+;6P^3#Y8Y=#bF&x_y(upN_az+x@^c;XkpZ1aYPpSh--N4_yB?lS8~NxN z4XdVhR_*jUpZD=iCnl7*TT~YjK7IOyeJ$DTsOQI8Jd|;IvJ1^8smZpJj8&)UdjnHW zJ1R+zUVO5KtG%_YH#uYA{a^-U?<2h^RiR6#1Y60lp`RO4wz6P2V0y?E3^(4%`>?rK z3M1f6VX=$}wmtZ!q21v8>!lt4M!A*i=F)vRhf6s1ZJwFuSG^(QR#s2QysUi6#^@+) zCnhPN{lJmSYKlD>ur;1q_}nLs`!s@W_c{V}P@-LpOU`enAz`Fc`2?RHa}S=2A^n8> zZ5BKdXwX?$PDv-d~7_>ZR66pi^RG3%Knm$p|SUV~UyBvpSk&Bf*783OjGAQ|YE5CQDV2sX9F67xBt1h1Wa#|lyNO6zYr2JYtp34?{+Jcy8u zI0wIEQSL2vgvM+^^jrTH)wfGoVWkqfvp%T(S**&YtC8iNGohpQsKc@)BxK90!6-yy zkZ88*W3hi(qQ2LC^cVphpX3(q{nMz%p&JpTK)lzv`E3y3{b{ejbeCET$>@o-lk1aq z5oKj&9!0r_06BECfGI;saASvu)87zt|L|}OHAwFHj@R?HL&i#Bi}b%N>7;N(!Fgwh zee*T$;?Ox&@*3L$g|?X|LL(6n<(0rkF8y-}g&9B(c6{bI34o9Y(Nclkb9w5&pMZ=% zq3-FZ&`42nHPd*y$HDy~TqO78ZDM5a`riDBj^tFuN`Y=1wN8ASYP%QFlgz}Cwue_` z?77c4zPZ7_ePb?U_R0@`g4coYCUE%l$v>hd-h0F%Uh9L8F0JcYVvH3(fkD<+e8ns{ zCd6omwWx)sa5P47!Qq&eew=#4IjZ}dG8ES2Npi_l5o==kIggk(;l5vb``gz!l-M+&uz7Tc{D+`(-Ou^lNx{x9V4MJ!z;=n*B%yof^(z_$+_V6wrhU z+gi*7wO?C}WfEf5HAUFE@GTab{+_YpvG(&SB@2rQplchfoqpQQMLO2RvHI1EgOB7uf# zRY=`lS{Rwb=$&RJ%+qJzSN>NzgP$O)XN(#%as?e+D@2@ffqwm(dxCQ~ z5A5gFSbR~Vc#FRKoRX1$_jPRMHoQku>u_F(IBl1|oxkU_pnRINRNm@OIq6Yui5x@&r&blV;iryFXFUw>w>u|jIgv@*tOuyJ)oHMoDpbgN8! z#dAMj=HtV&S@6NVQ~}8WaC7UvDciNMR}FeK-<3{S=pSbF7{SV_@uQXs$l_i>)cQ^P zgF#;1y%bPz#i=%N^eEF)X~ReEuaN$lj(yk}Gd2Yah9_@(7Cyb+f4J%6?YR}k%RIEw zKks=;%fce#9?C|`;cKh+6eNO!jl*DH_8S0fjPTi6%+l1|XzD!VY@@QfD(j2krk&^f zsSR44o!?0E*eT;TZ4M{X3TBij;k5aRSsEnqYg|d4b*z)X9@3=nmgOXue^E4|V#kP{ zCQC8!K-JrL58hL0i(hVuSLO9Y>YHVE9snd1Cl`mQ_1-D;`#u^3$L?~3=_*ng;8FFx zPq&)!fj~S|h76rnP2zh_L$)~l8u6XV7;6yDqQu%u1Fp{w%ipwZ+#}elm@=S}uXmO0 z^W#VaD;U!rk8w2oXke}cM=94DVfnGaSCDg&Y4yD+U|e@n_MfX2NmNN=eh?JdfT3Hx z%dS7pS~0AlL1OpxH{JHBcK_-;6r{mNO}bR-znb7Z0o#2nPs~?2Wp-!Z(WK&KyPT=D z!2|fD962({7d!pzqEp;@(0~?InWZSPTg{DMd3oo z@jgv*h7JsPd7QU3n;k4p_Zp3dD=4H#PYVt7^thhEYVD1_3k@SiYa>D11&6$8EUQ}- zV?tc_(}Y}p67OJ~R5gA+;Etau)WSR3QN8`P65x!hSM5QGOC|F5N$6Gs)vqp2=S>=f z&Xf62mE)q=`No2Mdt2qA7HH-a*RqIW8Ib46F!<&jnYr-WSdnh$>9 zPb1JFe!l0=iUWzY5MN4e@@7luKJ)ij9xU36Cl2rlS>4oR~rhH}H z%f{h<$kv2~iL+7srcPE3vB{IBAH$a>=YGh3hGSVi0S8TE#xiO-8P4arKwP#a^}IML zIIf>2lrH2I8@4cHeT)>fwxX_5{Nz)Ou}x)Vjz=)H$HXclE)^l#{~=YG!%_TZQ-;dw zFmG=v|8)|qd=G)^gis;qOrN5oBCP95jwQR&(KHBKJRw<;BtZR7PX2&qn%0FFFUmJp`T3t$P5Ey;PAsivkD5S_^g|=5eGW9j zBY$6KQA1m`?{WuV&w<0q<1jUpyb5eqC~8CvEAPw{OF<3MlU5bq>3nYHarTuNM>sVE zcgNjSHSjLgre*CX7gNcrg4QDmF~ue8@bHNisvtkE0-I>$j&^t-JbduSfs%#LYvQ|b zgp|7zq~^Ol7cp?sGP(sk`_}>dFF(8$>0g~1HNuZz^i-(f;v))aTDuejrj!{8JNx%L;8_|AaRP2oBcVVnVU-NHfI#YzF`66ZwE0 zYTPo;I2p9pbhKlNn_}^SC(1YK5%Co|2F5qeNlRA*(!yui7wATc?CXyFW8Kh#}S}e>+n-&Btcc?;JHOX>NU- zI3F6dXjDnqps-#Mr`G(c*DvP^J>H#u^+Fc7)T-V*D8aNFYm*GU(P}-Gx=8m38wZ_}POg8rFh`7(vgBqVkQOr)| zLw}b2lXQ7Ac4yTb<4L6YpKDoP(CD#S$30Bw8pmPD7heh)Wg+}8cQhJ@8OaA44_(abwnoS6E zG{0rKwE9Xk)K)23S?`GkH;kl@GZ4d$^A9`fvojx*772gxPX4uSq6E3XI5V-jWD?;P z%olf2`_#_~J`nXd=(tEFr=t2oegW(1?Tx{)?pCEW6t|e~N}H}?(_rax+Q9|ut=9bZ ztKyyc*S^|U0s?i8hpt~}0zLl!LgN4Th0H78Ku|Cd9!zFyPi#G?+7ju*U}!G>#>`Cc z;&>|ruphtRf2r&4$I8Uo2HmYMv%7xzY?OPK;?Cn7PR^61Gjk35{JJUmuo7kV8Q^@3 zJIdA}Pxn41c$IkEwsVw!7}G?3dL9mVu*9((bJ8YcXymZ{tV>!u& zDv8;u4KvY(ii|CAF=1sBL_F#qXVA1vT+%_c=&62~&ld*GB_wKnn|2id0))l}Hsa;J z>B8E2SA#zOcavz^9d(#?DOL2p_!%PK15X|#=T`KjP#jH8PX4aff`u)-DmhF+MuVZAKyT6Locc?KqdTEC_UyS-HEeVyxkCXT}6fmo(oPq8S#zY!V|k z7hzg-dY_E=lq=1Y+Yf!N0N|n^GgetQd|PQR@Rl6@+rf*7zGnXa&8_ zsTn~olSSv}FdWTKN?`9LrmE^hip>+cKlI00U1L(0kBaDduxF3_-iT(`uC_)M;j(wN z_l78|USsczDGb&~(X^BJ|K>=$1GvZqF_W}^o)!O5yB*?yMyp*_sHC}|5~10@YHWY;Ggo%YK9Uat|#Rmdysoq)cq?fb_=Z5r>17*bY#ztLZr|+Wt$T9t+Wu{vV zRvgaHhDhgGeu%SG1i>luS!?Fy4!4EMtx`G!Q$5-+(a_HX@+g&w`$~)QwH(M5zfRu9 zFwWv*ec<$jc{@E{WT~-Gefycljx0Ku@LM?Y)hFhHgNaCrt0q2pfe|$U4vcoVeoPuF zDG|I)0jMSA=9dd}D^_D?US2)zY`cYORz|Y_-t2aFn|<$^Zt{QI?9YMLaVm3R^}sQv z2Si8F?nb&o6%|gZnwo*56`#xe zNlO_UN12_i@J-)(+H{$FqGs>#6dpL1(4lRbR`=yM44xrwkkP;kk=o%D*;ZlPIR$F#1MzZ+3wb+WmUOksT zh_$ML*$w!75$_=b?m3vltwn!OXxlwk!{g1pP`bhIFRh8sbuVHf+*!uK~YjQ-FdE}>@t zfku3v*3z0XR@Oz=EL!mID_}0xR&b`5#@h}9t|whxC%d9yw$AWhADyFg7$5V)S2s5N zB8%G`K<=lz_>}%MVq@ni0d>OI{RiIGR0+tT>`P52oH0hva>Y;_)zjLK$qbXp&sO{2 zJU}eITX4GU@~0VC9A{r7AyL;feLit+EuRo!sb|-dSc1K)7qC*k4F1hLy_mDxMgNRA z-gu@!ak~CCQxil(bI(Ayx-*#8yNVawzDdg2<94C{VI;lIN2spLDi98L*wz0*9VTiw zmMsv`*+M)V)rs$EknUS7ytYQeL;r}?eLoCYxN?Uxm|ax&n)Ul+jdrd&c*&>%!Zv=$eNsZhTYoSsQei{EUFHRP+|e%SvmhHF{dSV!PKR~Fw+aU= zJQ8}0IA*Q8O-GX2O&&lV8FTflD*iGle+`MdGC2De--fi0InMge^_5GUWY@tZHHSBu z)C9e7a8MqN`tL>?O<5xD$9<}r7A&I(>8uwI9kJcZihq*G80jTg(Dfj==Ssw|ob;s7 ze_)5$(>=I~mfhX$Ws&kxWhf{F4=2^Jz_g=WiBb6b z!7U}x0p(5RGL>CaZM!5oE86#nFFarMlrh1B4@>j&#bwB-sHD86L`K9l7PhQ4N!_s*ZgTud z$`sBwg^hL4T|2&qFfdt`Nw=FP`gHjCUZA}|mw+o*JCb1}ED)~XVc zpgysZ>wSJ^q8KO-Eu%Rp+B>KLe84yK!Nv4^$Wh78&z`&Y1*9Cdt1)s(T@?rcAr=P*)t$-iSmWho8NL_4q^jhVk(?YK z)XDN*MO(e-nCRKFyaqTf^*Av4IWS`MkM32BVenluvy@bX+RO8AH+-zDPjg*EJLBgS zO!S-{@~w%xDZ0Kg)K3n4PcZ*}Jii4jBZannW#=eZDp{omf`7+(9Ty*#0Wk`lovm|} z@elfNwj^qmxHGfbVe9wr1TWrn;EyFARgf=?J}$CNhn_Jctl8~`emMmes}`=zw>Su?zF6h zTB8o;fBd5VsOpxO7-+u2vz@#9%Kj3^{@RyOK!9K|rX9%Ri|ndIW(*qZBiJBqRW)yY zS>7{peq=}FxVLUaMh5jP1B3Cvz7Hl2&g5vLxgThRinX|HXI#ICCJM%Yn8+(Ani!yC zW7ak!S6KK;NY{I4yP-{y@$3gec$O)zs5N8jQBpG_wL3$6-p`r{C zb>oq3wt!Ld=O*)4BB=FkE%_Utav5|W>veTMj z7yUgf`e4LxjWGlb6_u)l)+ zs<9$hQv3r~LeX^a_48z1t*cbpd>0WcyUQ1>yl>_03vl{@XDdV!+|}YO^G?2Q5@m15 zCe_~F+!zA{Ap46vik7gYh?KkQa3ZI ziS;51LH-2qAnt=M%IXh76LpMlpJzB#xbp&;QGoo!O(kzF%^nx0ndc(pf{9_zq0DCo zRX?cBWnMQq>VYic@^@=0O0lI?LveU}VrbFRrC4h9)bDhMtgkSd0k9wqpXAD{la&=n3#A&o-hfsGowMy_RHT_ z@b{|fnIGe<@1BLc=ow;B0b}DG1dSMH=VmeJn?VJmjr8B+e(Xl6>ph%>`6a!(C<1R@ z_PdzU{^+}DcM<#Q?pYn6a zCc&oK8VMt1V+8TOMk2$;{|pxoJPE>kN7Z`laKw^6#2 zzD|=%x~(=kVT7u&#$HN~<8xarEp2rAnHPijmK6H5dH8|!a!Ng$<5v;v)z8Mgys%Yf z%Tv9Wp4sTw5>D}!tF~@Z_8jTxnJPNyNg6`(KtR50Fv{p<3tG}WLgNPtEtHrwh7Njk zKEl7TO(#C@p6Zsb6&SevKeWANSd?woHY{Bdk|Nz8Ez;czA|TDsh~yB0Fm!{6w17y1 zfOOB$DIn4yAwzc$F?78r-p_U2*Y$1hvu)q^&`h0rtC>s_LmrdpC_c&xzlzCCi*n z$(Z|T-SB{bD|Wb6OuOkebgBGNzC8&g88zv>PORgwXqtULu5eZ+nfdYRx6z$n{Gs=7 zoDvr{H*wOJEX}4C<{*UAs?R5yrd#&j%V8qu45V&(IL(VwF#6<|8?G8l&@yp=e^)nk z%So4AUqQR$O0BrnVv*Jc?a`#mP*3jdFQ*jcRx}HC`vyCE_6FBf)f|&mUZB?p`M)0O zQ_TG2a;G=tef1ufFeK|9Q+p{|x~RSmZymmpIMaxU$NdS4PV+sRqKaN4=WP^b)VGsa zruRLR+Dnt;7N9s-77TS!_c4jf>n$sYIM8z!guXv>hP&kgg$nS?3z;-P=PF%INfN{r zCa&~|%xP5O+M;0|e({LuS$<$Nn2ouGx_(n#bnW{B z?Z&}={AtfJYr}-`zBn>pbUF7-@sXk!T$)#II%s>X)t1P0)R#9Uz2i{_+czbRk2=rs zms_RxyqbRnY>A>EeaU;(cdMCfTPl?|g75i>SJAf9*^|GV=&F*xL8#$kvAEmIto! zw)>b%5f_+xZVR0{s;!Za4*D<`anj^pqC^KrV65lO4RW_q#$cUQq!PW^mrSlR%UvP2 z6K!E>&cHjiymF%Yu5mjZ2Dy7h*c`IY(VXwXt{))k_ z5$%bGA}Yh~z7r3p-sBFLx0fb`?S008iP69OShX+_!6&FzxuA>I84=D^_m1&}vDQ^* z8NvI69N#IQ*HH;VtZn1#&Zmp=Y1PIB>+2Mc0}-;%Xf%Ga+2Bobg@AIqJeV zYo|XkhS~wGoU1GCYrEbI0*#K=qC?P(VNnLmmo$QH5Q?Xh=8H*jG8lVjkbP&dt7<>- zy_b49x^wEk1-E_gBvQFXM^j=D88 zFu-tQO&9oNYZo``ifl!v!j{$|T6X_AxWgvJTa9GY5vDPt{#5i%BqCkFYY*Jp46LSZy=VP;l{5bXc#x@cW(+P!>3L=o zZO7@$j|c!&H`+hz*(Uc*(L)6@&F9DYztFfyYL3@a-Ay`O$u|BSrl$+5JW?l5x)3mH2LCCV{TX*fR*bsbc<*6Rv3-Cay=G9dHE1SUR3V~a)_%HDB8zP; zQO3k__xNkhuXo3s5jz0q!?>e`GyZavJ*CHe;4lo7?BA_vp^iykLl}3tm2qdHA(-3# zcQ^UW+FEAFlEp>IF_Fn7Qzz;#@MC+4VFAZ?wfiBU;B6YiqXpA%WnXLTfL5^p+^d&H zMh+Kczj--E-m%?-_5Y8ByxS6JsCzthiKSM%*T&t6w2tQ<2Eil)fn0#30}2FF2Y5si zY2dQZ(a=ZtKBWsx_kP6(o1hVRO!}sWN~8oK z+#ouYljOzPlI#90P%eic<^%?;Wmb0A2lFA%|8bMHRF$Ec^KPMMlU){Tmq&s!Y0s(cE7--Z~=S;i=i zW)6y7=EOs-W{%G<>O%SBZ@7NK6X@+h$-LD%2~Nh&#rA~$9-4iNEDGLanqz{U*-y8E zg1*EgzOWUnJyr_>HSlD2PiRkk0aVCwi;Dj^NA`pNr*n+7XKfPBr|2#^m_AO^e>+~* z_`-9GvHxn$5bPP6J{=uTe?GYQc_GPRw2XfIr9GkBxftj;uPdi&WRJ=aS*AMtyR0v9 z`Y~1UYm>A~8q+7_Dcn_+KMt*Sw||R~CV$j@tXRWdnRZ4`D#TR)_k+hSe^M!e`;^^gbqX6x4R0#OS>An!yV;i(*S@U>74bH#gj@DuLYm zjWJz&1U~4aQhFRM~ z+1Wp)<5&8+8G&eIJiC4KvGCoN*(|B%eQXQrHU`M|K@XWWhjN-EajKy2&Yys+&bcqr z##|>W$E@LG$+axK$pevGtp-D>AyKM5tec=AW4g&qrm8C?n#goZS2HePhhAWc4*ugz z{T+h*vAGMRs73S>6@q%Wj@M z#J8fNAST6DYca{I;!~eu_jxPc*V2%=^4v+r!Vt)}>bYM}D9Xkg{sHK5th2IztdpWxv*6REmAtv*?aFYleyGL|&88Ytx z+bMR{GhM2oZIt8w%p@FORggu{re_109Il-3guf{CDxj zKYsE*58N@pB!TAA4&VRxXOkpm?c8{d#{NkzgfFtrNwN^BR;y&OsUE2AJ5u*3Q$)A2 ze&pKq)Uk{B_S5ep9g6dh0_|~zeRgL3(I=ed@R?h5f{0{J)f9$07ZZ)qE5M3>3%%*sxJ~d`JJnk8;ssplN^s z5ZF1h3!=HR7G(XXR-w@}3y{7~Gesg<++AervtWpN&W0P%1b_2py^tpEOqBJ>{q-E- znxo@Dcd0o$TDm_$*k2#KP8e8^hSRHxcmG=2zaM1q?lvL0P__j1-&2{T39M@p2B7tu z(uKXLCx#d0|9+DIoI3Hlpoav6T3TA72jr-^ zVJwUG74iM$Jd84P;7P|B9NSF;JHnOOq%||=TiOK#0;`3+?s(rOckKw}Un}WNQo&GH zDqAc$1AjX%mQq^fQ_CO>+^V*0{45DZOh8tvRAcT2rcXdL1IfqppU)+dy1yFVw(O)+ z7@S|6?p(!t!I3V$F;zako_gI@&^odCM9VSQYljcvtw1(H-{zOfd-{ zfB0F~Pp*7qY}?ojKGNTM->d&C(d{~}pWL@aYR?OgYA(26SNVv_G3ChqP(N+x7bW+! zIB(VAU`1gzcmq7vbG$pTD%`vP#e|Ux{?=R8L=$}2ZmfKeILc3;qhTCTE(l40R-r!L zSK{_m&KU+G5$(9!C;vS;S#dZ|n-?Z(GICq%%!mU+?Clho?GU9YKT}nfjDdZcgE2g@#n-^~<$Z71dN9q-JA)a&z$!?KTk4leIn zID7J)8d(4ldLiGLxyqkEx8Y9xb#p?#Moy7jcjO%|DcsR(lfND1ok4m5F@GJXf1R#B z4{6F-n;0RY#()i`zH^NDuUY&gGlu7=#*_te1DsYjlN)b)X=Q0z zAF#`h09FMZj*366@h-Ju>+V#?%4Fya;Qos z1|X`)=V0cv?}WgU+L)c_8`BzCNBjGX+?}6OwzeS9X(kgi_U|G5brJbvBW+{>6ABMv zO$hJ!+gd$+1e`}yk)cj-uG*bB`Yc28APbScS_8uIsvqbd1ZqxCU<=p%5^D*)*h=2|6gV`h? z3Hy|3?EXh5ak`DMYJvMZsWwT24|=e*b#-L7M!3%GXN3gfs>7A3u<>w00SH@<;1z@em`qgS2Z z*=?ZrJR~Q_V*l_kq@rS&oR9IG=@l*f2wh!W{n-XlXbzki5OmRuKd%i$e>RiWbjo)H z0~5wB7~p_4^{L1xana(vvW6#=OFDZSOT)v%Uxk>a{CDPnkO1dy;S(Y(1pf8yzmHd7 zk}ME)oD4DHtp4olQ&jZ7J*m5X6EGV^N=DHcLBeLg?J48%;?peH8H0707+ZTW>UK!V z6el!Pk%*caUC+ebT=ij++kNTlDolcWY82u`qjz13!*fIGhT(WMw5Z5)XQYkT%G#=| zf&w}~-6SIu&`K(!srg{oTH6;j-TRlLygUYOw}61a$l(2bn`IOimr5csGMo%BTqX5u zt@0aPA!^Zh74eVqJ<$h%$c*ELPRxbs&<`Ro*4ZV%miWGgPLJY0k%n)y%jJtK7GnAl zYYwk^mLcf*IY!01b*UeHdMy+wN;7jq6c@*PxPXi79>OFK5JF1OGq~D$30>7Xa(>GC zQO^Te@X(ijJwwCDB=>!tH^LDP1)84TeLVYbv;{19_}zjJ8CB-}!-+Zv+?&%xyQ%zz z5@7V#`3V>UJm-Ypr^sX`L2;7qOi#Pwhr)!TpW9llu@){7 z{y}MJ)Ia+A!U63e?ECj+cz-Yuk&xh%u%_YBXiV90UR@8h?vEdqgRN5YlodicYn17p zsurt%rN($wtb0x9zB9!_OWiB4S%Kx%%Y@>fp+SG2_UXMrTK_P$11=nE>B}9}sd{hW zXp*jW_7;3X!eBsTp<`Unm`7sApn5r+&Oa>E|J?ZX?Ax(-!v*TR_FazzqcC8=iTOnm zEpCbWl4-c6wQph}fjqIJ4_vQ*YxQQeJt^HgbQ0dc;00_1I;8p*res4m{OUy^=a8}& zDj-l1o9<10W6+BB)>$nZ|L#U4%0TYrzRj!vHJQs8Ch#y`_-6!q$~IhMZ{V@o83gi3 zr-VlSZ63@}U$V4CninjsbpN&0MP%+adZ+j63nL^EAomD8Itc8cZK3MuklUWsaB;!u z_ccdJlQ77dFxda;aQvC@vy4513>;_3`&#muJYk9~`(vMt8*zH{<{4<1Mi~5($H$%@ z7opYl8PUAWihTWO;!)V3WsR)a`rz#Ti8x)`+5jkUkkHrWF8n5>#ZEx9;ETOe8Mcl* z6G!-ABbpkg>@uX{ntt+JE;0F5nKzM2UrNbV?s&{!(@Ve&IcEyBls`W`V7&6k-d`x; zt$w@ev44_tI^vCRVHgDmTg(EgV%YNSd&VBKxD+o%)J-v7y&~wW>B$TMn6KL_%!AD* z`g``Ti5)e|DoO4P4!m1xy-u2Sff`lqw$VX{%&WfZ9sRDGhM^$=7C~P79Gdbz<^8Gw zQi)*$d5AvWN9uTV%{Vp0xKU-XXcKYQ@`m8&?@%Cef5Ykxsc9dYp?@e=K@qD5x}avQ zEG;OQk#9DTr~YrS{aGe~$mXKfA>lq~lmpL^B|s$gAItNP<70+8$eh(&XxnHU(~z3E z@zrFzV9wB2MQbmy=v=?|ldcwM9?eEv6L-ZoTrLW0qVwrvyoi-f6K(^om)Ca3&sfzlua+C4UWlREO)y^fKGqi<4a!b8wI0eV8q zq&KA5Lq{I-mqbb2x0unn`a%Gm$DqiO+j}|jq9T{RtzWtOaD@ND$-+4i4Go5{1)PLe z==7d?=4G<63tEy|a3IpoAeZE$B7P`9x}<3 zX#JNzd`fudCTWkp>;CK8|8=F@Apwuy3sMu}Io3jeL^fZOfvE3R^TI9|H1+itTjhvq zc{6^Y?WRgR1W5N%5=7UaqPp#-++JK(&`Ii!;@OW#b}g(qMUpk0l9GZ!!qXu4oi5!= z`h|ifUubz!c?g9`8e4Shtz(LfslxtHRk?0Q)43CFd20fqo~Eq+;%%o3$MK_OAXyAd z;m4zomv`xpd%nDnJHt7iLqIw@7|H@~&5lkam-NNo5YH+phu(3ZFo^sxP3`K@#Rh7i z+Sb6A^q#j2kw(1g>hBRm_&^Rn$Qmxx(a7yt5031i{>uRVS&uKgck#e{y=CA35)Zt2 zc4sEl0fk*v?iu%^@nPP=OMA4jYBJS~n8C_jnSxuJ*pO&LG0jb+Uz8FV~ zF=<@phF4AGI=Z?!6omq!}cjuBBg{kY)MWQ$$js8AuYTq>|ztsSioCipG) zQ?WYS>c{d*uiU=vdX&WUB%IvB;MFTkMMcF8&z~e$KE8RbWpqr(#`^l`D+*%Fb&f5C zU}7PS;S8#a3(|rrMfMD)q0y(ACuxKe(^{j^R&P3wcv~3;Yk{ux&w&FxDiyr4o5ZFYv?2ZkP**08&_hbGJG>Ix|+DYbdbe{NC+ zk=mJcd?1_es2*x%w3~NZu66F&6*e#$`Z=t%2ym~V&)@D>v!CweU<{X=#!oMo&3Z3% zr|yxu5HFwX&1z9Q!J#CM&AwG4H!I7hS>7<7B@t0i!WWtRRHLKO9aELLX5Gj_nGDZa zmOm+my|+A7G%vF1iL(&GE2~Kpdq|pf=PiB)QkDm0Lc<;*g9rS4Z}o}Kel0U7gJ&n) zUSxLmUdFWfgSbQczVq?0QpbC_lg)G3;HwdOc`l#cC-|2cA4t6mj!v&CkN@@UzaL}- zm}EMhdYTc!43#F(VUi6VfxRBHU%B5L1Dse%ovl~N)sZFZ zt2mQmAxYwQyG*Cwa)_mQ@vD+)VN`VxW|-i>mVKe?Lr6sRh!E#>Z|>6w|33;U z;hXrk;K1g~R|?+Om&ajW=Ojy@Y7xEOC!PMOu*j>BXd1KrZ`p6G(%VN%WQ{}0u-uHZ z_+C3p1L8h?ZY(0xqd3Ez_#_(as^%;2&G(n^s!It{=J2dD#WjsOEiG~aC8q4qnuWX5 zJp+j<2`Qft&FR|^_t^D`yp`}@gztAzQuuC4 zTi0ycR`E4I-Zbs*!OFEnmANn-X@R`|flUFwU&_MyOS#@26gMHmi0 zpSyzp$&bf2DYu2)Y&);Usuv38Zv}_i^ntrO!(&EL%oDZmwN1j11%IUT>qd8zvo;V_ zkP7%FM!GaiNBZV*d|B(-t22*lR+0E5p6{6| zqQvI$u_r}+yb7AjnrEBI;~O;m6e=oe9}B6E$H)|;tYf6f0AlYVZ5>lvshjZQlblk@ zo+q03Z4ZlzN$Fjjm5~!7uburLMlb0#E05}}@ycmh7qR(WadAEI0lR(u*QTq2i7@Hm%ldWl>bLbG1=80SSh%8u*zKI2<-fu-kb_gj)*f{Z zqZs5SZqIG5;9LG04ypMWRMQPB=1CH!CeC}5GD{l1S*KJuBF}eJ*YD#ztO>~p_uZ?Jn0J`$CPBbaBm+G z&v~6%PSxATe6t(C{7LU*Eq#UX5OLnG7(W=Ur=)y<`CKIbXo#}F%Yl{ufGsoi`&e__ zu`$flY3#cPg+C?;wo80Y!Yf7iQrhaPh&#DzD$V4Z*r~S@JIM!+^ny*^2QO^0(I)9E zUXd$hJ){dbJBA5bXd}(!Zf|@`qhr6{EDzN`^9e)l#9`C*M}hueh1!e6o914ZeIS@^Q%ncljmks$cVq;l;V${?B4OMdY|%M({{(7^gwU z@`>oW+IM>`fHHNHr9+j+7hsC(7Owyp|ABiLF6s-Q3v1Gq=>HTfVQB!fH@~}>XK6AtBzt7;+ zU8?DPh#}^mX`a757?7({LMLU2uI%Ni8$Z-UhqVK#LDc4>IKDUlB#sG;WJ}`)?7zX$ zq?kU`C-Dd4qAjcArSArxrxR)gYn_^EUjT2CfAI%Rv@1AXAQ-rDd-+S^Tn=l|N4(nX zKC-n`?m$mh)-7FtYRNV26F;INVVMTVivrRcPqSeYxC{X_Pw8=Xdjo57DJ?jih+oHV z96qya@H%Q#U5|Diq7nXZ6EboZK1g@?s=@u*zXR{_>@W)opJ!%iNzwO{=)#OQOd1bG z7n=mk&2AfZy9#Ma7m_4O-%$4jv6J#7Y$Qsg#Md2tP~{CVZanQsMQ}YZP6*c{9yKJ1 z-JQ=wJ(`1+V5K7x1hzzLrIr%#b@(kj&?9tR@AS?5Ln_sY{viIIy6g z<7D(kvm?tuA#+}Y`PAfd@ez`q@aD}1&i+B1F7jMGF(=y0<0doNT?uLHhW+W1@@l{3 zH~P>eZyjdZkf248v`aox?o4)eq99{0!q{)AbKbd1_aCUmdaV2&YGxgLe)v<|^@0@p zKK8IM;Y!!(rnL#layHoA`eka6#p^Nm<3Tgqk?cft3)vtL@m&0w`Cv(*3~dsSNt6t{ z6#@q~?)k|un~E$-d_Jgqu2K96(5>X0aVgl84csnkCcZdU4GPA3K`1wz`vj1GkNrG_ zkBPs-TZW?|Y26afewJMr)7kKDTd|rm$^S#9DE}Mdeu#z86>`jpC~%UrD)jDxy4=a> z>D-R7-bNxo8(Ip2b$&E(r6-Xl927fpgY1l8%^v!;-z9Rtq|e;l&$HUmH&ALvN8gU2 zrF^R#=)od`?Mz{L_NeREJh%Tn^>C)v93nl#-!aM9TFde&EBtcSo1onv{(`V7C1xHi z2o;`d4X3T^#wRrZJMZr9E@RA@n5-#^0;uSJoz}1e&J@wi=$O6XJjb4d)E%hf@hJ5U zSDE!Jsj956-t~gNwv1cdhT8*ZjIM#7)^r&H1e7BHlxkW4u(5S?e2`ybJP*4A2y{&{ z=RdnBgA>P{`YT1IlkW-$lrKHr_};y&_4JYr$P0Ar;(PfQ0wnSUp#t9pr}n&3e$ky% z_IiwN6HvTQos)x;|8RKsbl!a^Dznql)@SW_b7amlF0ouav+Qy1U3>j0D0v?ze*jWdvEqIr2LvXYoR)-W-v|E8>Sz zPgmVZiOZ@u>R5&p5ZorX;&ze&CogtznZgOfG)OZq&d+fJ7uw~O7yPBmAN1U?cQ+q* z7iZZgqu1I42ay|JU+lrW142~=ZcHso?mN=>qoh+s~dPPs-)PoEUFSdZrvLi!`de8F;^JVg>I@{EW zNQuL_s5zzHu_9t1J)$DMT*E)y>}^f@>=hL&zZElX^|zS%p#h2v`{y6Uz+26L&T`q) z+!ntoH;fW_rxsG41~ZAY2+JZTXKiOylaHBcm$(Zy$|Cz)rt(*0A_XhG zr+wuuB$ff9C7?Ey3IO=UJZgE*tghX#|Ve*&S4+Sh$YW!(&{Y-Yf_h>0aaI z8wN-62Uqg&US6MVw0`Nw@joK>G?0&}X~`Lzl*q}+JETaNZjsxWayF&E09fbtbnKD- zajR+9xy<^{`ek(zOZrNCO0PU--tN|N1J3V&a#Qn4j%&yQ$hKUnoS7%%+#^)4mj_#qTxNEh z&@?Juec|K@dvJC$5`HV>6yBxULe$$_vD-KT=f$wDB#jzh9`Yf5KQ^N=JY+9fZ69D_ZTIrg2nIq? z0JjKR>sjwV21O#%D!j=t!@eB%$bLO31w4Z32{Pe*>o(fK=NlP)5K9GFQtxO&z}#A7VWtj_f{juXN1Nc)fRaisnp| z3ux4GbcSWsMR&8XV;N9Q)8tZGSuXtl8fknwp9mFi+)a8qktC6{_EhN3Zj^fy0_JFf zY=P-tu-(5N)*sk-wU=&&J&yX(umF980ULMZtn>9+>)ap2V%||DPk6gro7}!2d(Fja zgJ>aT2xFdG0iWFT!m>W^8>a%ce{9hIT5^#kQR1tK)F!H?I^5aQ6Qktji0;gNoR`sa zDi+0gc0A!1qajd4D(%#I{s^i4sBkUe+i5zX6iJ39M_h>h>6~Y73WY3jlix{~3TcHS z`SCa3EoB@$4fZ;iF8ebRZ{Bo>l%x7q?(4`&%Z==PV^YEdWm8-|BQccjkB?ZRH)C|2 z;jK=*02!@-Y?&bu;SYH}PuzUxn|kXuQR{Tp=tSw7^ewHSCRCv2p+kPB-}V&GsZph6 zXI!&=7hn2 z8DwaP>zZjwuQ0GebE<;ml5m!x6A-t#-#9FO=uO8%X0gjhiX8lM6JRX7+Z%Zxz^+{Y zfMBhZF|!5Jxzw>hjKW4I)dVrO+V@!SE-eFcLJ{{MMKDI&PQ{u|*?+TIj7mJ;R5MwSP10=2J z(Z?~fpS~VA=o&2-E6xCs&XBA0O!-8D*JywAZJ>l<4q4m4gp>vMb--{2#t>z9A zD$G@%NTDa&<~=7Q9lww{Ejt)4b){ZQr8Ub!knd_Zs0La6JC(zIhjW1jjSipv!>Rux zQVx9c2Tf5QWg1(T!@(ta{!8RCqA<4U^j_1=gvE$P@=Kb~3Uyu!2B%sObeGhstl2Jy zNUKEx0Zt8qTXD983)bd5BbJP&75r6{4SPoqhbb|72y?UUHm3=YxeU2QE}u0xA=nnlB%G&>_?y&G5b8M`rvsp`KhH zxqHZ!Rvti_3_8A0?Jy-y)}rU%n^{+*jf+_Q z*prWqsAD9#jTK%h$n?d3_El}2cQxVE26xbm<5AIiCgAOG{BCyDHNBP;*E==~qKmB6 zcqV{!j5Ts{z9a}n;TwRMl~_zX`CVU~!o}N9SeAi8`J)M>@Qdu8U;7#*?hO*IA`K(1V#Jx z>3pe_hFK}cBdTUXj@U`p2Ho;Y4>XBmq^m^e(O}o#A-8BYnT8>MeJF?of1Az)44>J>v(}($Y-s$AU-b z)1oX)0$4&|cw{Ex{H!SyveV(9z3ZX|FZU3BAFaUf#H*=bn7j)rCB+UseqC8g$@R~& z2>{YJYX{?fR-i@wUkVd^?m*s~`cXW`-m#s?@)itc5k@Cj!Z{D|?>#+5`0J~yc!5k2 zZfIzz8q8t_5Z0%}Gx79?HVwT;^W({;A1#>uYbCGS*ZW$!s7BaA_zv@|t&5g8N*7MP zaPkH|=)~MC?wGe1?il55CEuh_dq`-VAvKY6KjN{ezjx&`Y5N)dy8WPoB?uvI6h(`b z3L<4n=RHU3vLYPZ@`Ag4btTC>DLo{Gbn z6(FdRmr4pD90ug&)2`}(bn+WATxown9BJjKhp5-_UWUJPh;PnMrRif@Nb|FL)*Ow+ zB9e8971~tAJ?&qlC)=yY ziWPcYHHZCZapAzVjj_V(IJ08m7{)**X$q)MwWFQRqcJOh?YjhMaBQD{0tIE1prKwJ zxU$c^(ALt|$Ckc56!&WPr7Pz?mvcKhNj=K)aDpR_F8WcM+19xsB)X*+ne0;TJM0j% zpR>c+^0VHRQoFCMtUK@GH5zeu9Cg@GRz;m<59Gi^T{8YLtrC6A)WHFbwu_JN^gAoc zKNX&d>lCm7bVE)QuZm)Hx-`ZZ80j+&Lv4Lj@zbv|7nRhNM-dtLyKciQ4CFwvG33N= z_ZNcl;_ZOw%c|-4_*XN=%w$4N^WixwDv^sot!i+iH+p-(R|O-yU!EOo=2e7G7+?My zDKex5kRoW4=<0+2rR?)hz3Pd2^c_-k1-)?6KNyI~spMx0?;uMy{w8!a#%sR-#IX+! z#=4_Jo+kq^SZz)ZMtQ$(-&lLDz?z(kOX0If1d%;t>~ly9^F?0P@qQuM%p8C@v1jbC z{It0REH(+R($JRzeXog`V7MQz&k>rY8fTqxBLPOF>1XuFX*clY^s<4giPF%AbH>ds zYucXO7w`y6V6U&Pzxh!5qxKlt12_;0uT?>u#zC=V(z^YtYK1t9CX{RBj9wPDS%E-9FL&NkP49da564ab?9OZRxs2?c>U!;N|CCBIz?nu5mpHcMG)l)hN zW@yHc>`)UcE6YYRR2x#kErXKXk@5&~1{5M>TVmCgYLl`j$fTm;xNw*rK(3~PJQihs zn#Y~CHN#{9#egpUYZpw_+Db2Ko37SlPu}s|=RBjR*bY;5IBNs`BmjiOtK>SF4r|lV zGbu6=r+T8`g=i8&sOh&XQE6TeiaUm-IyICrs6~i%L882t2Tq6a5FQ;Mw^y&6AS;U; z!`0R~#^89i&hw-Bpu9|8l1vnJX;GT)C~-2yYjN}6dYlXtlE#@_>}}gNM6suHR8Dn| zfD(v`VnRLAH-E~5T})h3f$Z8n?JNqt=~9_Xa`WvLV8`UiVmOf*_Xm>SHvnvQuk%8(k|NM_?Be7sv0vol!u^H_Khg zw>V7V$-hE<*0y6rKg-`-0RIVb+VF8~oGhk=hI04buId+YTXRCI6QKJXE+Ip`H1wZNN%3$ECk}=pxBWK1)+rKO%eGhld zOeM_Q2u)B(9HXnJaB_nxs~0409JmGU_fJB>R1jpgH$AJ^tIuHOIzWiKK*89%r+|#Q z!O*$!BBpkK{3jwbBH74|;G_7vn(TUJA7&Kh(0X+#MkrB%r8f}GjJpYWxw2$iiQtyM z$*M?#KAWuqvo*mW9D+EVVFV%DWnb8%ch8rc2-$!6`v&V)_|N@bUYMy?FL%=6nUurXnW?8T@!Wkk6&<7n zT!W+@IM%OvF^If#`vD+c_fFM36`s1TQ5K+h#)F@+b8?0gO6dc#%k@U@7fFVxc01Xj zG*S)~vje3jM-=@jmy9OT>K%#6>OtOn_4u&f!LAw#v$6croMwWveH_p8d_FHEHpFhi z?bua;S*V@vPXQv%OYyyUoEluz8iJB;2MR0?4<7-Q zdQ9QSz~NY#V{=a5`ZXdp0*tz`E~qiqeq)#U;_l>^*&3nf$Oxd!prNoaT|<=cDrTY% zsJ$Kd5?ssg`mdG%85+PcPgMTzm)W|s0Nr2KjRNE|cE16ttXDV6bpAM0&fea*fb8~z zkF@;g&53)8=8ME}6HJwyGrpI{GC8WafLg1qx&&S*#5J)au>(}5yT%n?dIRWXvU$Bc zrtmBypD6>i;z$`Z$RP#yYDS!UL)Z0dpFj6m+N4;7+&q8ayZJlCLfrMk6lYzYtNS8| zu5HejW2yTf_;i-Fsk;{C&&73WGb_Zd}tYiepbgF8XB)_jw(q0U>E4&;3xgQO8hkrEhMRM3vbNa^5GxO;>HV29C= z&W(i=ox3SOVokQXRH$YXhh{lT-sq!H@4m?D@Po8d4~3L6W3fdagC{T4r7;23hZLe> zE!jili>BVAvX~fQuXE%BT8Lh`0Uq3aha3!)B!4>N^inV}*nV)HgR{KYKi1RnS8$Q; zs=45m@p577ep1eX*Nwr=am@bZmsZ71RkjSmf@n(3p)W=yEW{!}or;N{CyK+BQ}x3+ z0B0eD;sxS-~BV?{cdoO-zadj z@@Mc1GKF-nKNdTAE62QPvmCQ-&yc*#GM$&=yWFI_D-SdUijXq=7j;JZKXG_03epqA zC!BUPB7B)g$p`&$!USbzK&FjbTG4mtXX%hn?rK=t~Un& zLCLlq>`N2$^!)uzH@*;IH4~HcOSBkrA{=c6ZDMg&HxLFMS~K=~uofP!dXX9}5dB$f?oY&UNMd zq|o{WD$pNrvg#Q*Ebdsu?u{@OmbEzLv6I|IIX*@TlxLrvhdi6Wb!@%aV*?n_r4=vm zCrvN`357A;chmehvDUfa2DmGEkcnkN{hDhkTr0g_xK@`)m5?!Yn$RHmgnKDXikyq- zr_!?R;HvkABr|Jq%CC`9YRl145v1$gKrL3((t551!5ax7jE%GrOzVnYP&RQty3oN? z`_MsQ#?yA5C7$ZwqtuLh5$dLpO+o!e_h!DewCbS%xKksJSk{y_`9%3G;fD{AUA0dA z8*xIBK$QxbWAn91oV4Ri;r@((`ZSk4cQ7q3P-Fl?I$rX>wqBQE|FD2a^#Qc)qz5%N zoJzU9L>5CS*4u%rXh%5V)k2D>dfPY6PQ{TPYYF_jfZJ{F(>*%hnrA=)iPo7n#f_Vk zl(dcJM`+WHkky}p;MBvb<(3o~dwO~W7<&b`V)@pz%seA*qzX{FPAc+Y3BI-U7!37# zF)xhjavEncOOgd(hempr0m`Wtl0Uu)jlRcXu3;fOwB7t&As~v;+)M{!s1fum2d{6V z(K!23(NKmp+MpLF#ZOI)6?4~ghX4A6FtTI)cRx^#2r7`p*{DU;3&sr2TP@IRk=2Rh zy6e%r!!C@3#GSavgU48YT*R-yCCQ(A1H|N1iOAABqAK%`|9`Z15)4It^=<5CRk zsgP?EB+YwKr?~yE2E;B20Ae{V7=m*0*sI3#QUNU;V!Dl(OdK;)mT^e7$_WwBDD-3F z9i#Dv(P*Zkr#JCy@b;k<)b6kp&+*;vB7(&hEgVQ6PTD(mXBwKo9m>!PV2{$L!(=fkI4 zK^`F#T89>@8MeKVtT;TK9dZkm;d>8EM9EyE&|!V8Hz<-OH%uQ)AngzlyyhrFK+gWc z>Bzlu0Al3uX^T7YClG{z0_L=>2mB~u-las>@ju3rlC?^eN4`56YovK6h@}A%eUTqN zEN)txcDiPx_t0XmXN8XfB?#Qp%m=%G+GsY^X{a4(Fq9ixtO2p{xrhkY*r2x2y#Ak3 zrwq2^Ab8XAx$}-bd74b%?tAlKE=T9F`u)vy&hKfOo$EQX>)GKtMaoH5YTs_W7&eahvXq$N0xwrN0^M-+cbO=MZW+0YlN-&j?I+W^%6%)L97LkDis4kbgJ zo|i1`QW*A@-_)s$^3O?r^!A48nR*+)e_{KyAVUmuujPn*W2T;@du8#Q!W4~oZ1nOb zF*&1sC|x5`1?dMlDm^tj2+t44bZk7vtlOQS;{N$tCF?@^20@{Z9K<@)c!r6Nj^4K7 z?HGJCBu*u{;|VW%BXAu~=SPle*^qx%I@giFEBQ%wFauE`QC>Y>qV?g&;qk7)(}jL?fEzL2 z3i|Uf57_nPupYj<(}2*mdB5c#3-g&|7(aQ1#TsI5x=4RKIfxshX;}<_>4x`*7q;p2;35{C8!78mZ zit^}_MZTNr-H{}(L!yqwvpV+UMyq>XM|u33w8rq}X32IcX?5=MqiDmTU&(2%Rj%Ln zTwhFNS|oFt0LQ*3CkFJH*%oLD79er+?Q=+6?OQYW;xshn1_fy+{%I!m*wW|vILY#- z|NQ?;GqDH6gn1V(NN!;M+_b7ve?@iLbyJjM6XaAZRi@0+=k%*`N>m7|+XCqDc8Xp8 zzkB^VK=~y@*89DWRIYgo~-nX9whp5|!WvWyDjL7d__(l-yL>$81!qBNXZmru)XJT0bzXJVyq{v;?HhNW{4T0FD^|mYHtr90pt-# z17c_BP;oRio5kLK*QmSPgJ&ySz`SCP zgS+VP__=lJwu<@|%ETSJT?+^0h4OAMw(a!Kx)~Xg^3Ik{=R<)0l+kPvtlJB3nw7P+ zj(v0aEGjALY(oE=^O$d$L6gr9pLql2we2hvre-5CEg7{UwfwsWY>NOW&*v~@_F3?V z|NXF0Bcj>q@l~TA(?=R{ToXT+GMk{eQxe{0azG4zp@@?W$Oo!JC){%L>P?&@M>&3d z+rrSg5Si^DIlX_-^@;7(SAdZ9$72zovAuTi{Lj9&L`70+1QCLDbjGDh3rTxaO&Fx= zD%aZ{FzDwYqLc#5d>PIvrrN&l4Rc5tLYit%y=;E@`5ryPlgm8+U4LHTdy4W*@=IQs zEx150gHJLP~NI?L)V zk=^%MnHJ-JNo2qHlgN&!T3t*sWE`0h;N`k^cvFOaD0FtlbSej_tB1)lwSzI{e6HO# zaqkKWY{I@LK5zDxDF}hkn_HU9xrlsmxsQ>Rs?ETOgY{hI8@ir%U7jC7mf2RRqG|{r zjdL&Np%4+Ek&PxRi_)R$A~s#;*Qq;IjR@e2>~`6X(hHQHBh{6Y2aeV3HP$P$xorgJ z!28L;^#8-yTSrCJc5%bfB_JW)-H1qcw{&-RNq2XNQqmwH(%s$CNXO72IMO-9d+-kL zXT9&Y*0MpD(clVDI-;m4GV6fS1%83B(Zc~bgxF_DZ!U57YIHm0#2j^wfEiige z_#xs;6W(6ZaN~MPybn$WiSRp-(fWS3A$X?aagsg==-)q7c=BK>fMo+Lb9nvauL zc2tff`!NEou!r~jjl8G?^#bM!5Mb>6X}JgGHKhiPgprdb2nT(4pG0aMkwMc)-<#H5sze5Ff2Ahc(D;pYYB zNEOQwY)6$6dM;57m2Ue33cCXI?ofd4oF!b?w=kWap4PcukDDu(`qp!70UDj3TLCeNBP}jr* zq|hg|vrBKWmL3S+$sdkTtd#6{`a^kdG4~O(yxn9$4ZE&Rd#GIA$}TCSFi7SeM}nkmTJt0gt5`^fotF&j~~79Isr)l*;T zy*cMPHY|Zkl}M3|ALgl<2vpnC;lSj$5oeS|OGCXt(V8v50p0M}KJKDo((=YK^{4Osr-4B42U55olP7Hu|#ezeQ zY3`Ax8i7ng6fFvJSl37KS~GSy0x`n#?LtJX54Y!iZ_pRQK@RjlY<)X9xov=<$G9d; zyw|^@L$pqA3qW3X1c1EKe$~j}3U?M5P&iEF1Sm5>PAo?xl7Vp)y%+O(HX2#tUt>TJ z*hWN7FCsJvM+5TiZc!pFEv-oY(_HNKOgM7NQ!=^kl=YO;FRTZuNKbj$jEYXZD4jOm zkR9D47Li2vENSn{vXbCW4YjiY`9nToGJt?d+i+U!L;35B5%Id>Idr(aHZYaXuC*Ro zZP|4DFe3(Uyc;W(r#T^B58J-isq=u!bmK{HW^RshBIs2@t;~`&@#&NHCa?HQmezBV zre8~?WIAV`*nGy%j=>&6U%~fPHqFOX6;%9?JH{%L{zh4BQVOIHqc$4+uwSb!J*tXt z8|hAgHqVWEFUQDnRS5BDxI(#aGXJFb;9n7m`aD{Sy4`8{EQ$!&2N!3ZhJXeUjVN|3B{{&|(0bJ2$F z?d-rLO8o08GaP@Cd4VKt-Pz-?xnuw9D)aeJt^EaZ0@9V!GGYbPiV?;tg^%l;&n0@Z zuuPZ)Ehqiv zJ*ONIse%yvMCV=j0i4@u7T0FOx<2!_Vc15sjmZr)txjhYyS2nvP{LcCIuX&Y1%d)b z*ONhXEnu^h$M38GT|oIZ)3gH+Xe!Mgs(*9{RunQM|0dsdt;ci}1+u*oaEwgRZ z#j9;!Wbd3Tj=h&t5{jAgK2HA0!bh~2S}OP30uc47(hrJUCzO-lPrf9I869`|TWrdm z_Q<;2LkYD26}OlM0$8@vUWG|q8o)us zgZWM)@6Jafn8#617n*k~1C)u{M(kLIaD+PDfsT|{8|3cGXdgX2ff%0X;5B!7$pIUZ zhoSCu1woGQp285eL>zp#athUG(G{7!UuK~DQ_;h@yWKA&&y9>2b@WMekPo4&*VrdwvzN;IB8ru(=oC(YK*>$1A4I5iIDW$f6QhWC_J_u z=e<$XGgWAmjNdSUy$v)BKenOz0o%#8UwEO`I->;C|feEJ<)#gfdIKK&xz)7%XM z(Rm}xr9NN2R)(xN>{DE0-q`Re3KqqtohVKcs;K;ZYAU*vQkpnO86_q?fP1416AEHC$uvHtvG7ifG(a2J@58?auy8a5`YKK;_F9IEV_M76|2_f>fYC} z$=7!f6PYnA6qdEk>f)jZRRVoLK~$q8C1yxDG== zs@78MeL|;gI-xF-%WEpyOWs-hFFlSx+IBZK8W@yR&&j%3XDQJK>cG6SdG-!`ef^>l zXlzyfy*SFuuO>-v^BZ++gY3u>nr?1r!y@!Bc_5#S((H2QCsO@@zM)zJwRT*I+^ALN zuwp8AzE~Gol4z94R#qgB;SroM`U{2Z*e#RK;B?mZ@~5icr+O$*ABo>FOJpzSMG$PK z8G;uc%~1!HZ>}>e0)ps7pTqm8z2j2N;D0{Nfk+hZ~DfN>z%Q^?6 z5w&P`%U~{-qdi&c!-G#2;CPfqR7qu23J7|gQUQqyl#W66FogBoT(Y)beb119{yK!7 zA~dEZ^KN_9oRAeEEGsbVK133~BF8$b7*^tg&YmBR6SMB~)+^#3eWn^4zX^uI)gQAk zq#t@$Ih^7$7V0U*rNWW7toX5$oIjbIx94FB-0Vgj8E>5XF#iAr|4cy8Ujl1g^Y z=iIdlrS{;-PH6bdrHMSpU!VTcL0H_gNc5MWAjlns{71XQnYxA!T3?|6azRPfEi8j! zWKZB}^gFVN_HA>OBm4y&KD7kc>@3X9uvZH@__99cAPQ-bqhahKg)BRDE9TcH=uu(A zwia;N9(B$vW3+K0u)gu(e)|Gm{^eKOK+#V(ho*r^?eJ^t^pBpOTBuVlJw+Q9zlem_ zYE63yKQBkJp1*5GODWf)E^Bh#gmXGb+knS$#=)w}dFE&EUMnke4DgPTJo^FPf1L32+!yWFzEtKeTX{ijg?s3{C21iaI7LV4(nNiygN0NS&dIWbN@%034v%;L*wAPY z(D~=IDV`@?QBCinZo{*eOrmF-V7oSsR6WVYf=pUf>O-e^Vr5%i%-Q5#9C5;blHAur zFBM7tV9-j(!>xH`JY-Ee$i;W2B>{7Z?W#LUyViU@jT$;gZ;+ZPst_%^xnHq4TI3c12M-?_ce^S+ZSE*K*br3jo9;;s>6Yt#&=JGQs0aL$UZpWhrMt&nR`q z=m)7k*oxXM=Am{q?GAfu=JvITV=>&;c2zrTzd@k=*VoMB)+QwP3U=zd`TM8V%zw1f zdf60b;WIFv_?WvTH@!{2GKr3=g^5rJTVo$S1IwHv8mj40#K$;$MC5E4>r)S9KyTy3oJ�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%0A0v5rHZw3y$3A}{l?7is=m-*R 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 literal 0 HcmV?d00001 diff --git a/docs/apm/images/green-service.png b/docs/apm/images/green-service.png new file mode 100644 index 0000000000000000000000000000000000000000..bbc00a3543b08f391fcdd043df561c867374823c GIT binary patch literal 4464 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 literal 0 HcmV?d00001 diff --git a/docs/apm/images/service-maps.png b/docs/apm/images/service-maps.png index 454ae9bb720fbd69560ecb3b3cfa90ddad1a06cc..d4272e899999164f26f7b5f1fcdaa00436d375c1 100644 GIT binary patch literal 722545 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 z zb7tdH7mKP?PgI7GVhmFkcf36x?GYfl*0e$D3_~S>;}0@``bx1Tgo}cy^~7Q4%PwI2*ZGVc64KWs0M`+C@ELTo z(%7N0B=-lMRhf0I$*%WR(Ybrl)V{~(kIH7<_KL9DAF5W|`A>5^=fef3O!lG|s~j`8 ze5a1T)KN)2ueF)@RX(3lQQVRwELYytC*+i-Wfk4t;VBb+pHpi(Ri~bWoF*CwDN@26 z+dq>HnHovhiKk=|f67Z4psNKoveoX5Ql@#^6%j;Q8SY8cjsFL*(15*T^%$U}(rfWs z9^ZmNygf%lfpiUxj#;G9X+frN|LijAKGZ#d!IA5U6cCUVcE3-oWPU7^k}1I%+`S3+cW4#8!j9o+1Yt;N%coBm3<0!XcfG0+sSy2N3ZdDrXk{Yo9^RoF#g$UO>#UQxh##@2nES~G zO4+urK^b;Klocn8s>?Vqff26xEWMm-&~rgoe|R?jYN+H#Bh~;||0W7C&>V$`yg-_- z^-1kdZrktrzg81GV3Is$aHZhuJp`Qr%YEk5M2?iPo5(#%m67-w#~(by*IwLVb`E#7I!09J@FIkOOBK1s^Cx z&wpygTWZk}@^u^ti^|&Jp__QSZx&VKkrhmfU}t(E z1RIjlfo~p2wBO?Q12B*%O~Cq}ul4Ym-|xvt0`j_dWNc2As&?xj4oW)GAda^GKxG9O-e#9T0+>-@y~ zU=Sg-xlKp0)c`$aIxclj<<=M0t+vQB6JV*i#sN5#l?m7mX70BYFr1hFW;&AD(bo@K zIl?g5k1nN9;^CM&z3IFbMbq#nT#w;DuX3#)Pu}!wGx)Z3&`Z9ivaNaQ7o~!7ItB%# zZ%eKC#LWO>34e{foM%6S2UDynn74lIDBHA|?8kF!WUF|1%Ob{Za@yqXO3exRwWLqt zVK9cV4}Nb`Z!)t)OU$~2gc`*2rVe-!C}Fguih#zqz`Gskr(@^!(?1CXIUS4@u>I;@ z7#fusv&d@bSV^YgOaqK69$^UhU%kU6C5?mTeoJM4YJBJy8gWWh2wHz<>o4Rw&i-TKKPdH^|W}h2_UA`rK6z-Pj`WiFE zOn)yMcj~v{fXz=NUnumKeMN`2GS93CMYDkuPq(moJL__hA*9wECja+9_qd+?Ph1uy z($hh=|Dr{KqR8fp#uA6?B*A=CJ*TvjzWndsv3dwEW$h?kMfL%3xa*<)xXXwV7HK#k8GHLt+G&m{D%)&D3KbU$mB```Kw2Kw7uot2Y zk#Kh(LBkEGmzK^Ko&)DQ9GCAIUbX)|eX9&K4Lfv3VuRgx7YeYM%_@D#73}{T`Bt>v zHQ;<-WYkeIL~iJ6a3l_}c_f9{=P`YmOnw#D)UtRMSvBcP)okf#TL0NGb;gm3uzc2H z`{(=*)%%2dXuret57P(T#<9;_EgIKSOk%~VF$=ncV;m}=du8EIFrb9AW;Z&g_Z$v} zxu?5Z!qZ}47X$?tG@N_78s{G{+PE9fU$*!ZICx`R(L;(^Ur3$>5d2=H1LrJy5VTi+ zkK^O8&kj02P@D}PkEOzWpM}vWstFuC#+MQEYNJV(aHGKa9a%Xneg`_?bHuP+`BhP~(#}!}b=pGll=f zQ;#PZD|k)XJ{dFs<_CSgnRMmL@)!yoNOz)-$^63l@*y9o9RU`JVV?UdCMq6)}`|h51Bi?RxMdZ>Qop+nNk{jXcM5blUeV9mZ|Ew zX1i|sM%i58J)~Ttb8gerB9!a{BY=GAT23k#U(QX?eL3^e9N1c5?+3uFbm~g8{=9!W z*`yPNS6NgM(&C{9X886FXOoi`aqnH~*k#^(Pkvotlv6<=y?N(${CBO^fB5($@@7EW zrGD2^=G&2ySQkcJ&$1eEwXwQRnB2Q#IYJ2Hl~V65KErnC7EO4T`|<%WZdkMm5P`$5 zq%CU=7#@F7>@L+S3u&y7UdeK8rx1CY|5n>3y8Fwuf%7KY#5B>xWWA%&z0afhDqFwx zlx+chKLH2+#fkA*biE3g7POr$bm$h0@kV*eA$@F{72JVMWMAu*A@A|iQ~gA6w))|@;}qUPI#%ssbR?Aq842iN!xt~+L)5*K_X$^-YY ztJOD5`^LQ)#Jpf10b0#ttDK1)gx(_EjQ8mfOfBifmw+6V6h7Oec59uY;s~@7Los@A5z59#e0= z(7V~?4&gma6ZH5x83G1R5OG&5*12`SSUOzh+py0wq{XS-!)f`YbvN$P?1Qv+i*^+-4o1{ zX+_x3>OCLhmi|}&>yMdb+OJcb8qWr^c_xQLOOpkZLVcdigFgeD;Nfmi&Y#LxTr&=? zaW9Lkzlrk)A|2sNyn)Ld8wZo167UZ_hZnS6+&1?Tmq@Dmc>|c^F(SLJp`080B<;Hi z=WD@tEfoiB>*|)7d~(4!`+)|6WvmTr0k;ln1 z(2ItT9PvXprA7!JJw}2W72e@`Qzi%|GXWEn@DcwYTMw&?Kg3!WEA%2XZocc+feOVA zNH35MN;ejqG``w>A&QLt&_u694zR-$!O@{JbqCSCiM*Mmy3ogFWGMnIY3u;|bh$F> z=Ka3@0p0@N@lK(*NkFPBNqUQsizVRvM>jimV@%mc8rhz+3k0XB7r6*!62-B!TxgX; zcK4Y^f!)Z$EuZ`ia+GfRg=O*{8AgO*g!QPTh|F{tets4zVPO7a!wJX%s;)Xnx>$g^*PH} zj5C;i_RZq~1`=)ng~`J0?M9cmdwc*RnzZ7mV6z*P6i$Ff(Pu0X&-0|k3Hqn9{=gGA zN4&bylG2Ii&gNmhN-sZ*hSskA+?9!a;`+5l_z^FC+Z{Wv5C^cMl8pX&Dx(BQ^%A=S zyOrKOJpRMHX?&3uO$p{XxG{C3#vZ(8o>xW&{i}^MZqPucKqpX-qnao^<71hBI=Zo~ zh|vN#FE9To&Ny9D9Ut;#f6cVsXB>KR%9`A05~YwXl`|CjSE{)G39G>y<=;e+87hvk zA{KZP$4#u(*ooka=Pj4-(xJ{>T-xOC9}4(6EX#56v-)2>rs)oTfSM@yC0L`$pj}_^ zj&pe9+i{%r#=5-T&WGdFnxRnRQ@#aL^?Ih+BEWHZ2Pg8F4?KMwRLUR3C)EY6v0QEj z9TP5ogqV6Ib^u!$`YoUlJNc^ajZu(I>`FqAPz+}M&+oy%AN(T4hd?b7fBTCvO{>=r z;bJmGuh<5-<*vW9F)#0ne~Nn>DGxLd^oJFn2sN&%y^B54|KWuARw;;+J+R$_D}}d2 zD9QeVKtpu`C||9V(xN1|HM9g!qvf=@pRVLc*Up6s`|k?Vu?RR-X|45UDCWy}hTiL0 z6}w&OOWfVjaXPy?sM`WMd<{Gd5Wj8%Sz8peKVAhw)&B&{6(63+)2Kc1``2eGZMUIr zp-NmUpErQF%aKyo1200|n{{BLcOyM-LS661g4bEHKR@W~7FF`@JVX&?nQ>gGJTMS& zfoHqmMB`ppc#U`htnVNF!s!67qt0QTgMvZmNYs-;`ZCJLY#?dG@M1z6)uRFRfuP;9 zC++Kdf3dUp0I!iOk%9q#(3WM{sfN*sTd-S^v3!#t*K*~4$0bVeWrx2(g~VE~HmSQR zH)G^pX|K#VM`p_VD*VdLEn+VG>RA_dvbZokG z3vBhg9hf;M8RVoaC|nyVbsR?CyZ{{>bx4!|c<1nOg1y*7Olowb3XJL4x~1*tG#4Qy zqBy-&9*LFad>`{Lh)+PI|08v7Rww1saKPTZ!PHJiQFu#xff%P z%lLVut2qV8%kvMVCs8o$_jM4syt|b4NoZ8Mvtv1K-Tw7!rDU|l&jPg0k;=f<966Py z6L^`4BZk+K)tiuWRON~a*mZZy-WF=igOJ^9JPNtWeDnuCCvi@S-2w9e1?K!ajm8gqIA4j-Db!v>Ycb=W; z6zcG2N`f$h>Rhb%M~&8+Rn~3mswt#Gur2eS@6uejXz7pne4Z}yx8^h)wah9i1iHH; zgVF9~oEnhTbiZV`{0ez#H@JnM>XV({?L*(j2Rg;D>TGC>S?#h}eh5twxnIM$k8VEy zR`05x{~xdB|Cp!n>)~ynJV~)Ii7LVh#BAR}qp3XdQ7C)y6$#syLKqBj{HD_l@EBlxbyty6xi_>X3DeMJ4=nhN>uYkV~WuDkMueAru1We86qp~?` zR_ZL*dIH!?WqG&Vn;qR>`tGpBbL!_}AB#DkHTzY0C8A#5Hav~IxF6$>MJ*uQ6k@YBpshRVlA0?}yDkDghZy^8GB>72DGLNATjQCe5KG4MDEs?_a zRSjRF?jLb%d3Mtmr-cKl63PzEf8{gJIzAq*k7%q7q@zdPfQ{7p;?xcg3lBu%E_q;* z_;keAzmAH**DIN9^yg;Ph3%%+|L||jdji>=5>lH>DS-DePjWv3u_2>2nmnP0XoQ=Z z?@WQkG{O~x4-2W#5guI9UWYYrSj5-?)nmMY?vtlc8xe-tpFDb_jiSUGveWl!i5m%N zFsG3kYW8mjW-;5WNsp(pi}Zb|(rdI3_D=>Fk{iPO1O11;eqRy#Vd`ClYsva<3vrsL zr>~uw-vG^*3@)7$`>(?U5~cy)m{psxA9$O%8;R1)yNlwPHC35baTQp2GZVk>4vTbw zS;24HvnEe#^;LT68TA>q!ggQi`@yY)jZ5R}>L-2|A9Fufe(KMQ>}5bXSHr-4lEy_(u{8m=bKiC!@GA zV`)TwD3tZRad;RJJgyE@Mrq&O>~r_^ukOb82jZW>5s@ceY5cTdXF7fMJS~EGe1?0x zJG=Aiw&g~WmxG#3fliQJtTZ#lw1_O7Xt{7t!5%@k@?$bQIIRL1afg zxZY}A1ms>O?5e>3tzvpub{Pg+x2wCupjqeTAaLTxV_RVXMb1^B3nyrK#fA=NUW=`S zm^40x(QWJDt~=ll3b(@|nTDl@EAR6Mi=fmWN8J;_-^Qj$+w}X3J)dFYKXrr=7RDRe!9xhHTE}?WKVl2lI?Z!(j=`>55$rf1Ja z)tZu-D?J1e!}qzhSNmB}w{G&Rbj<`Bf4(z}v%Pf8H_0F=F1F;G9(RExTn;kNIa>@^A<3m^a_hXKK!+I>=k-uc&ozpma6z4yiR9Y8|Gz%GJrF$vGfX1S~?@#DjXfR|6K+UJPg zyF!y8inZFjpY_8Q;w`|9mfTDiuoeq^;&b6&WP}$+Z|IEy%E1ll0cXeXHGYrn2bu1~ zngC$)Hq=}@tThvuMih(<*C-diZ#4_0nYxAcxhVgTbS`@>byd6h@}D`EB_jHdvim;@ zd4kMnfV}WzOkmPHb!!a&?*BWR_a*QIT^s#OcXjbT@Kepm-n#m6#@3PFpQ)$o>{CPM zzu#%kb1xyi{C2K@=CBBWk{HF^dUB>cS(~|!wop4C&}oYOmpfW1pTl2bu4pl}Y0M!o zVJd&Sxr*lrFNr0JY%nW?jb5W9`07dP)+o0aR4S-uh+&-1L=4iE`-~H{n}nNRxmf(% z)9Jc(^@i6?uJ1FPV1InLrr3Urk~&<{^ZCE;$A9(dwlr|7+ANu@)c*C|{{36*vOw(W zFJ~Db^1ATyV)iUQtOcf}y%0d=npjv^8!Mv5jME zt+bi2v7R`~YEVTL!%o+#_eqlqX3IK~Y(u3pw{*^BgqOJF2xPWO`iqAgB_ z{^v6Of1xON7_9`nYH#U0fwdR=vj4*K|G39Do&xdQ51A4k-8Q=Xl3VF^zRG1+7<1&K zV*W0(c{NNx4pfr`dj%e}n|`}J2&6iP3p$Jr6x6<4WU-bCTprC+R>#62=GfhNX&#Tx zq(lY9{sioF^()lf);ogtIsgAA9M=iZ+Gf1i7A_c_<| z;OBF!9Z9~yC*)sa=8DuvqKsOlA~LY8KL$HT7io{ zF%=rlcZS6FRtG!Vab}*FRxv=d|qWm-mjDjXCb*k?p&fP@UUL^oi@CnQCuS^E~od8sj zlh0Y^#lYlqqe%j)3qM&go`7h8GU3K(Vg)qvvNp`ZDx1q=e%1K2ZGV+Vq*Jr3MyaJn zq&<~`#rXVqUa1nKvc#&N)T{`zJWTOcf=3WGBr}T|eo;QzNo^Bbu7COMNG0W^b<*k6 zo8W`*y|w>+6~FMxbC4daroAEwNzq5>GT*C1zL$v5feS!eExhEp1C-2V-EG4OtrwSO zD^j;~id>E?35r?5#KSd9E%&k>tdYAXQ&`oU=kQvLe=;69AD${&WNwSR{h_C7E_bw0 zKeeQyJiV18QvoKQqn7>kA=yUfA+>NC6n>B9!$`KOme|>>Xi(L0r`=Y+0x8E?cP$e6 zg|wNb_T+yhEb_Y~!A_(3jeOkxGWp09>3=l%iO7E85P_n)9}X`5?N{8f77U2Df2hw- z@4n9sRubwT>2vu_Ie6$B(}M&`ptOay`2)X$B!8jY^M`xrIe6o@TO0XHw?>Id)poBZ z@E5$ye_Bz+*YDy^@Gprw0MQy-8RPni@PE3LKfg=$_}>_agZVEp5NJb0DJp#L52w)n z(;oiNt)6{H43w(T&o%EPLzIY^o>?wkrwvh!g5BbKet#|5tGTg|GkqNbtMwghl#C zgcZC4+AZ45eZAncJ&^!#LJ6J@jocW7*mvIB!d3deZK;IPyJ5;kaU`7JJWIWm7rGV7 zqCc*#T#anIU_N>rhO88(5{6Dz4dMA+VPTW*3YwmVx+r8nNseFm5+a(#*IY@2N;Nn5 zT<`Cmq4wBsHwr_1Y8$Zmx}U?{luIs+{@=zPX=}+1GrCFyRi8kT-AqL&ZR^bTON4#ZzUm zq{DP7VFzvC)Qhp>g65{GVK*VOgW-0 zj4ZVrQb}|!s#cn4dkDM@o2+7`zbldRx$-rN8mJQ{4g-7MrrQ!kQ8G{3z2a$dzo zrZOdzh5ODmZo^xsRI9l?yegp&g!a7a!>O>+JSpL)1fd5^_oW_W25zR=W*!cg>_uVP znY=X{OFLrH>R^qT4Fp(Jxj?G1ypx4fpq*^miuL~XCPly|-~SJW!{7`CHt%Mr`&^T> zpv!qpyqK+GAdN61k2-=8^eKuICrAjjT@Fj{fbKAN#bRIglJLgCWsl@6e#DxfuKB21 z(`Nb0wHO}h`-Uz4Af({T>MA8At*Rm$3BctuFONewhyY#6MO5ix;;k@)fpzl19muQf zC6j3bGvbgVBDoh+-?mXSfg60ab&v1Y9KN4qIk1>k3UkRiZ*(sAR734FWuDi)TurII zUFBKH68)2~M)Bn3nB8bk64P;(O%h93T}hJUer^X}vAc5$)8i%6Lz3Fno0PcD-%jIFurf3I1QtBb8d@d3^RP^UkJT+ja%*>ab3vtU?#xzalQ3y zrUCuwDW_<+*(u`tDjvF#^A_seSF~O!e8_FQg~s}2ev`kINedebm5RPn*c9Vu0q`>? z{j|3~e&p4aLYZg7-B0sr)mu5Mpcinyy!cr<1utRnzL63}fU!kGeKU54Jx_(;W;%D? zu|93apo?ASz!MWOzC+j(OBbkW++77)?RiU4^3_+6K6rC$B8>!fo%}geqes$hIwpxN z<{D!^hSl9@Ix4)zJ|VZ8O#3I%;cEH>vxQ#VcgXAX(Z?)C^4;S6X#@xJ@z+5SnEv8( z+R2#$~(E)Xo$-Iq~ZIX7Lmn`)&g9+{Oro7WehR z(obqFKvTW-#rd}FmI=eQ;jZ12cj-h2Fsm&K<3p(0yM?y(#B%1?aufDG7yuT(qaI6|phtu%RsY1n!d~K#a8GNnv=RNTnfk|TQ0Uhe0o=2s-)wQ(+ ziqsRb%Zi)u{IEw6z-EnL+x&Z;{Qp`r;6fIqS)xixmTkqkH=#OoI`SwoMYQ)t@ae$G z2H9^jKBVMpo3ILqkR$2PJ0xuFI?)usZk}~m8`kc8nVzA9A6A;|=bKvx zvGu#5KhALY;sS&dBJb~Vz|Oj2;5K;g17CClLF>}n#OodmecrskA~gTPX?s7W+W@gW zhaXq9=aK>_@PXe)hBU~Q$nN8$<;nHVKuuQ8?s%pj)Mzu}qVz*-x)s!w~CJG_A;Nks_f-4+T^I(2A zB3*sn<;-$DSNl7&D4_Tfzc&5bs^Vu`<|o6T9_P@q}2Ow z1*#2Mg|(1;cya*c-_N=9Tu(R7+uXrwUz~`XoId38WunV554qEN=vMpRo^aLwYP|MO ziIznXDQx~B#(yxT7~v0EoID_Tpv_D$oW)pbRWqhTwsCilG>_34fqJsmp_C4+#YRig z&;#IP<1hsL(%t>}!}`QP!uTfk8BDpz4*Do?J1;0_>%jPe!l(dEvW=BVQ$!W8<;m~d z3lVV=jl>czHf-Zwop29+l&h@RQZLFe+I6Rl2H13|Y4rcuyQO18)5n|rhoqH$cO{aA zRw0~9ut(EsWE{5661!xU&^ARGoU-OtI*_uAqsanoeyF}WcUGr@_aQx5a@4vcymp!62P zqb=aV)ZQKZlST6r>HfXr@(iaZJVXgJXbtQz5Oqd+6L%<@^nILUw$Nw;xq;|u>@IOC7mN#g5;P@p<`MM`w$Ya`=tn9eBi6rfm)T0N78)IohUPmz=frk!ZZO#vX zak5)%`}e5hUy&ExG+G<*&tzOTMy<(@*0hi=SrGA;5QgefdDeu1L%9T@GM+g~_BN@(p$4G3_t9Cy$4{?bOpZ&W){O_6k zZyNjWnf&)m{#YIUvw;3Do&1+h{v&kKfEcSLXb@=ULCgmkbx40Mn+yo3Ui5Kkt~G%8 zN}w&!VsByxqv4$NBZtmc_o>QMgL z{o;P;jBrUY&tBw7O|eu_AB^~a-_-9q;Q#$fxd~{^mzO|Kiq`kMzW>Yt|L=GH`G3O; zLF$PHow#9+>qggq*pp#olK@L@K(1ZR_76>^zjAkfxCaRwT+n`o3*>)j{^LfNax5f{$zcnJbVwGTI+i`rp*ILW40Q34@#06 zmu9n+CDWdLz8b`6g8#29?mxAi+x;4l$+TUgkgph!N4IdV-hBKFe#fbjxdQ+9C2U{d z(C$S{x@lm~?o3CL0(gSwD{R7shlJ^O;#HBT?T!zcvfo};$SF$y=@XgqI?W|0Y-bMlW?rsOUQn z!OCgBt^R2Dbpwg0XlIJ=kVf%*170`Jvw-S61LfGi2d6?_>kI&3?6_UL>JfxI$2UqN z-&y%?44~MDd~@0yXxMj=pb;7+0O|U-*zuSH2#jsj1{BvTVC6EdRo{UnbnO79@TLf7 z+2*nY9TE$(^AeQx?OY9C`WIC9=WNpeM7Mxz5*p@gDpMC*^;K0lh(jl2Xi@Dzz~P-w1%$B8f!c2WGn9 z?+p5juXc0*Da>SgpdJHol5fzlUBGX;LLwZA)-xjRUcBZZ@d>=1`xXv<{5$ggzby6t zFP4&H_n2Q}hMIChR|k4zs9r^(U-M{wpfLXTkpuS$fgB=w?#Xq`2xw7ncmKPbm)J+r zqML0u34@1(A&oT8e`NEOO#sJTRJeBmuvmkt=NtUlmkWK&hSO)#{Z;l4T>7-i zEx~-pBWkCWMl2EOogywYfttZI_FrVk-_r_jFu?a+(oBfydl(>ldG2o~h7At#nvTA&OQRAo9FhrYzc?8!VifDP zjbUxKKCChAbX4G37+Aekqd-JV>>9%YguH&H>fgS$8~RSJOw1F8kw&% zmxtE7?WpZ+sW>U2$TUW)4sb6lAdzc^Ifl9wgjwOyS2<;G6Qx@wq&0}~{e9J@2iAOc zkm=}-)HfqZ(?9eL6ZmtAX<4Nj&^LEI-+-0`$^kMoFr~2~qc~o3WxYg~L(@LGfEu|M zFJeXDoyFW%=hrGvTxLS5x2trZkO|RHo1I`bEpFk097YF!l)xI(qfDw0dp(QD{e2#% zB$L20%b`a?C8iu7KYlz(?7;ck2EVcm^77-^*=3Me?htVqf5P7sy65gSz|BrEviaz! z80|S8R;W~AOiB?^dQMWjcNw_28c$ab-+RIr-p+_nj7HIJh@YQ;sU9xn9J`{#P05~A z9`ov| z@xnWwgS+Urzs~0@en_ULGUGRo?CiwtuX?PyYV+8p&RziZ&kd-5A(Cs52C$2&CYvx? zI(5UhL*ea?Y}HK0?%euHM4ij7w-9J1ezpiF*c246fx}cX6)mc3EvGPJxNHN#NJkCm z?mX?{7$(+tl9iydK^lJXl~1n&yEy@^4g->_S*y0?KD*qXXJ+iQ7ZA0OotYHTrkc@4 zSx|pts@lHoHu0$*g@X6%N!z2%%0SQ$VJ@22DF@7)F7~AH!aN{w(ly-xP=HLE=g%|b z6YIWsn;6E<2JrP)8HL3&FYIxM&ik|JmMQXnN_Cqc?N7GoaD4%($h~ON+rHQlW#OTq zQR`zu%Wr%29ACiYFg}e+=tYtd=#I^&f7d?!dBCR~5&@O#p1j2S;e<)<4XPm&nMA)T z90?bZ)Nz7G2s#(XqEZPvZbojqBf33~UAAjkEGE1Wsb$FV!?e@Z1)_-N`g+!`IR4@Z zTKCH3noMK7`yhl2llPf%TI?GS0UOIyV=`kbBSP zs`M6n=L~FSXCDeWoTa5@q)!yS(Y$RIZPy#ypJK|8{p4eco)l{-l#E@Ab-Bk_u474E zF02JlWYw{!&a23L5pzPVU`t(gfR)m@pCceVQKCXn{y|SL$p`*%&;6BgNh0E}?`~%m z1H5bh;`(CINxfylglxbX&g&OejiI+~Kz)qT_RJY(q3sb=qtqb`FWS0$s7G;|hB~3V z#+mMx(dnJO-i(Th9PZOtRGO0e#J?_$EP=e7q_{8xT1J0x-8qN#S6CYmheCWGQ**C{+8#rnT zG#DPTs#3F}7Pxm%T7^QpZJ zRnNA9>}0*uK}?9X8k3S9p+Neb*B2dJlo4B>%dmOdeGKEdx(A993V0BS_irKU{wHMi zF9d>K0(VTNkInrhY_rH=lS1nxJ2NrTdcKt`kN(BUO=V3~D$uk!^y9o`C^54lWo7iAY*ac6H_0wo%+`)*EFGLknW z`*rj1aE{)(fH!x;QlrE?f$F{>n`pItFwhM*ENw637tG|fGiW@5TWG5CQU zG&Bt{XjN*<9xzQ=HtG9((2RKynie~>3EMqRy^eM%kV=#uH`358d31Y?L#5s_&qmtu z+gIrmyRYUh3e*$jp=E7d9YY7JpS|OnO$cU>pLZyZ?Huq4&rpw-g*#ZpPAuQ8tVX>y z`)Z#&b3;YR;cT`z%a*ORBRRC>1V^t4*$3@ch zY(4iWW>D2mNlfU)+0i7MyQG|2ta(~|Aso~bFS(aGJLONzceVR&1znc9<8C@DDZs70M0F)1ZpKUn7v zzRYkhdWI$cNr_Ju3E^m|S(N-$@$NdS@se!U^Ut3eK8B9p$U_O7fo}=M0E6{9<52ip zy|V{(u-b`*2G1+xe0GH*@O@%>&LGgKh;8G$%k#bygpnRT&kXbg-jd+u8~mtLz?`hB z+1t`v3>eW12j0>#pC|^zu&>}r?L&u6K{_wk5z>4Si3ArIfDnu!lBBQIVO7nPUSv z%q?UU3dS^e#U{0*qjHTpV@EGi-JstVMPPMEU7Yclr+PDywmQ{AJifADjF|YVjke!_ z_k4^xt#i;yZ3<(&i~g2yrjn!91-x11o`KAP%_sY@ykBlSLTaea#QG+hwVBKhyt#U< zmd1wh5&NJz-T6)pFgpYvJ+9^)gj22=wpM7~t{wS$Cn0oMY?-IRbx6HPe6bMT8BlEr zc^^1&qj11HEj=m3-=8NX$;z!|(LM;vMX$?HUZcCjS6YkI+ z6i0*ZWr^09nLW1pZ=?&*!McOQL9?N+4ufva@~vO-Ws8`rpaQm9(d&b2inS@z#NC90 zjqpqT*0kc*?Z=GK>uqqVK9|+wHr3b8bwUPR>*UGvI7S)p)q2jGafBc5?m4xu)7a&| zRsTf?=MBDR5otqmy_WMzuOy}GW#TZnj6lLz|BT*{ZOO{EywGyIu%n_Pl{m-2+6ckM zfbG6^-u#uL?KEN7{!wc}%BE@cmUDL<7;!aIuLm5hbmxP~dIHz;GbcgImZA5O=$U@n z1&WBR^}cfg8j&0J>%+I}j}l==B~n8Vy#@ydfZaEx?Ut625j&G7YBteff6K)8aC4E$ zWKU>%s@ky)Z$!_^WdJ2m2?39pa&X@htf*EC;YA1C+H(XJ-ke7aoS}<AoQ z`TT6y#bKr-J82BYa10DxY|=T=?_%g0?hf~rGYqWD-+eW`A=~iJtS4S?rPLqe~9OrqgL#Dy{#i$8nL86DOkPh zChEMA)~OLpl0$g2#Awr}tH}1~oXTL36QjWVk)E@CeNF@JrxCYO=`!;P3$o>)TFYQI z?V=VoS8?j&{zq8j$L~)2i?w{IaA8wqPnQi6VuJSL_mcH-bcD3O6_o=B=zdhW{!4}uQr}*wZU%5g;0Go z_B$jN+b!Rk(S3O_B$M!}k1`gbwU%kN`%0zqC2-1*ZcD+wtl7u;cV$b!YnDWNKaTan zUVJOEPuX0Jno#URaLwi%vNKj1sT!*Xjx>q&T;$fpD?2`oqb^H2SC4~`7|`U%-|jJF z{&YX7Z7t2{bb~QPU+7exS}@ltKPP#KufRBAKqAXox{|p>^oYk~@Xa~5Ro_iY*M&0z zu2a{oi4Vni%6+qurR)656+t)S5RFm@x4H9Np?S7Wo~G>i=%H+#0kH?SA#zDtihb+m zuF|3|@_E0C7$uxSGh*~GINZ?Sb{pr_D17R90*BkZ4GM~~oT~0{tcU54-+KD=DN(uQ z*fstsyHq##sjP=Kt<;WRIyh_D{Kz;j#@lY!iicKj)lHmP7q=JLEMBaHT)@=V^-!+n#Au+*)@WFdNEYM90Dp zp{2zKq-@cg+jV>SxjNM?hw1Y#&-m*@^qY&^`NwH)iOapfFM)5z3Qjy*;&^m&WSsP1 zZ>dX)`sQIBkR8!{ZjmA<3)`Dd5T}h3OXsHgTW{gJQ`=L|k32;90B;sUzq>2NVu#&@53dJ{li5VV)uvTtPSuM1z3g zA7(iv^x()+rwP9VI9rFKz}ad}+(UZG!rSMMr(eQ9i%eXc@Q}g6p8fJ_P#zp<1H)K`YW-C03fi9~tc@SvT4~mpUx;5#_Bd(yvf$-V%p?4F}rpTA_g0 z;M-akyKtreTc$osKK;w<3MO}T)1@XN`|B+Hs4@lU(Q$CBD_;p~mR9s*8k)TB(sCR_ z380G5vAX#<=Y|y4VJO8=akFH6nb}B=KG|8dV$a8Hda7}CNx6z(Or7w2NusJOF>Mx; zUXNitgIDrpo1WapHfNuzo{`O-%+83tWu5>T=}LX`LqX}v?WQjM z3ixn z%vXx9V7B!Lo0b%9diHMXS`J4PU!NWm3F(T^N5xf_XeWhR^~=q&dQKYZrqZCb8=RkQ zADtg6#NwdGav948K8>5*J3ZJ6WmV3)(Np}&pT7^o*aY&H6i=7DH&bf|vanIP$NjA% zmvir+u2;~ZJ&Grw66fYcl7^6(NgwB7)9RBU)=tsnO~D?zJoUU65mfqQ&f0!~=`K-+ zMZmnEPrB`lFnQ_gV=s_?qX#>0oo`@y2xM;KnQUu@^DJ_)47HX8zEJ+Eey8v(A_Tqu zcCYWLce_(NC?>j}U!Y`4X0DLBC1h722SV*%zRkDV4#67`8CC)XihY{cJJDI5AR5 z?0mG0c&$~-s-B_N`QRdzO%t!34B{M)o=ojY+<6bo23}|mI@d?s&)#wzS?w#%%+(G# zXuUmUf4*K`AHm!up4={zk#|Tfgn=KiKxM+bDCjZYh(#N+$f_1Y7?QC&H#379J#Bvk zFESl?zB;&i^JE~d0OL@Y5(6SY^uvG;R&Ah8d>BrMp9#Hlr{-*FB> zd_?wh{R$5A;nxEeTKr+G3X~rsZnkaJVj0f!3vXOoe@9|qxKZk54tdLGyZb1oGrqc$ zX26+(H`$H(lX@6+_0h!Zx$bAH+y0c6b!Rz*D^ob+z0_5`)oyX54wA4++nCTtJbgaA z8{&{BAed*oZh|6p#IczMozmpPehTY$vpF^yCiA7Jv+nBMxb<$fOjs|1O`R{ts=#U> zGNH&|L~J7C@IxcPmh~7qJ+y*sdHtG|&PLv1LnA|x$*N{`o<6QK^+D%V0%}1fJ-1qR z!p=GT+CpaElQ}l1Bfgo0XQ19P_vigmn@uKIdKS(0Kyer^-^k(>Jl1GFvya+U;kSb* zKBd^E*cK0Tw&sgsq1mSEQlPzGY7a8#h#cgj6R@qbdQyF#FZK{>>>dhz7BmeCge(2# z0e^tn>0~i#0bYOhIT5;^Hxng8<2IOmv)<{OY-P<2lD_0iDQUv5_%ie5RL4)N=f2DC;l(l6fY4|p_Ao$#s#IR|l zG0}g(^e&n1I@$&Zwu};@8N18YTaH#dt{bajmEj-CQR7M`wZH3imDl{bc8sX|YdpN( z&w~_KF1zNt=sOoPso(Fh)MzW9;4O4$CKa^aEt$%MSNLHno6NqBq(^s_OBf$R#Z~;` zakz@_1sOruePyGJ1qIxx3JsndvyM?3dy!bAE@mjNFzHRK$A>pBOXZX56mD`nP|qds zCh->95*rzFpsYX_;3bqKYh1UV6o6LPR=Ev5#l`!SrIz;&&!F#Cz}Y*OZ`D2lmw5N) zIAnqn!Ub{FMs?PvKENJ(Hd_)*(TdP+NuM{;;~}fhm6*HBEbPr^>8ac_-P!LIzM~mPZdcLnc}yUDX(Wz-6wsnezX#u`oQtHsgx;~ z?%PB|@DJGo#Ty+hamtM6N+x#>Vv3!`a_oZ;;xS++!e&wM6QmLzIQGrH8(OdXSWPil zz>a=uhfC$KH3R;)y!XCm%gpzv>%a*zBTV7?9u@lnOZT#*7n|i(VK$iv)yx4y;8r*! zi7DL+q6%h(JloyBfJ{Io^4LA)1i_nT%W9p2V&Rs-p@xvA@E^9)rtuT;4_h{8pI9^s zUj_{F^^oA{K*SKzZiyszHChTLotnfnsnXjTwT@Gtzx6H;;~5m!?KlPs>l0DX%;C>M zmdXlygfbJOj=W)F{T@-kcNK0f@0oX3inS2$s2ZU5pO0VY)TqIEMsfR^aC8PRRxAd% z1~x&A)9841x{Cb9=|-%8eVxfwzet=^UyM5`Xv`mfwa)n=1K}zvRsHFZf#>@GJ;bT? z$<|RFS#(@IV$;gA!3T@h^*;1vD>V^S!?%5&`Y=$IH7*2LF5FB;mpBWt<>DR!dKY(O zD8wy9#ubkb&H8E-FOSZkc6WA$H+o@WqOme5BtE-CL@{xC0cW-X;fb}dRlSXKrdW8M z_!0qiL*ImN9o0wmrM8Y9?vJ`1!S6?Mw4LfKxSY?6FL+`>&4VhNd0PT#Ih8~YN~Q|j zpYELE%p+Tc9o8lm9F$b7o0z=u@imDNvd#SmS;9I@N|v$JS*%VAbu*dWIL0MyVP1Q`67|#7^8CO}Xl(ppA===WPl06ZSy&R8fOm7x4j#1# zDph4hFf|CvN@OE3XmP1>YdEqNe%nCn_tl>gz#|j@Lm%rw;-H@5zb&BaWV??L)@uIiZ6xVlli zPxk9uA66uyHpnV^+V(>5CnhT z{ljH^R>)RI#f!%lJ6_ebHD%3H-;Icx(_Vu(zU|-wK8x~9)2uf>ekRsfkc9&$Ycvtw z_-B*$UgkRRxykx16#S#*WUKA&{w)34hLdg|=v?lR2UKGUcw>}k3sfEJw+m1L*(V%2 zstU?R*S5^;$}{&e_p*MtT)5Sn4(u=J`j*2$wdzTVo|iE16UptQvv;;LR}P)jdcUn1 zFV2K5Ju${3>4(r~RxGnTLMTRi!|EU-ES<&OIz1gOO&~Z}h>KSXi2@m!6CAmh|L6ta zr)k=@9uUKEL@y@Qu6ZSr&eP`;0b|M zz0PpHj=}m_PjOFM>4>gbd20|QC3ewqt2jb^ywr>tWUZnQ70Z?`H4mclch9kCM=jtF z!30XDJ+k`&6l3+A^;R=tJk+d*@^X9Sh#x8%(5+d&JvF8&z~m&2{FiV6XcvCegA`#3T}cD^G6E7Ps5+FfNv z+^WY)taW$|(n(i-q?5c!ZJ9T_J z5(FR+t6O($lPH=gU3`y;H%%>YFM*$e?>#D&6MN2ZSzv+yWA>7WDF0&b!-=}GzA}5B zRS-=a(55q_(^hT>)PWfejVm0UQMTZ-_BOd>S~EAiUyZ<%M(2Cw2a6TfGinmmT*N=Z z&Y#zf-^QOEt#ql+)!wt8wZp47F=`?}rnW%S)=L|lD?TpYU;*>K6KQj^RmkkuV2K^T zCxos092NUcjSQx%QkqVs$U<(zrbTrfkNu-SiwG2J;Nrk#$hy}>laraN^qTedtKw6V zB;jmeL|u8@Ait&NBt1*x9Qz^0NYJbA7Cls*%t6(QNikl)VuNR+lv>1f5F=5$sMQC5 zgR#`i$Sr0A=qfA~jPi2myxLfeebm%uqS^AfJr<;5InTHp-*a$fmQOu@%%t^Ek82>- z!8VPnzyhoWlm>c`*G3h9tcRi7)XB*e;&5v*)wQA9@WYO^5n!e7Khf_o)F^o=8weVs5et2DXL4=QNj%%MS_DSr;Fb**q~>V4 zdbd?w_akh(8Ud|5nx<{r>k((BJ%?{Q%vdG9yaO6{XGo}?fRv4gFQ!vPhyUt;1;lrY zQphg4=D7dCRjj@Relg(a5@{QFSBpD0I66< zrVN~q+E2Zl17il}x)X#Kfp*-~0;3Fgm*3Z1fVdVr`2h>w4d1G+z}zH!o6ue`4h8FbIgjZcZi-)jpq9(|C}^wDgU7h14U_nK;dX<5@ebnIr~`6WQkatw zQL)m~E?w8Qqoc2$bXUA`Yg-v~Bz@*9|=V<@-+_ot*MhkqK-&p=vle7~1*mrGES{uW!R346pc($2LR#-n39&AZ# zQ?&sFs23Zt!PsNRZC!HV=Oq?p(teSqix?_bE~ zcG~4dB2}*oRz|>-vn@d%<1SIBQ?#}(0%pzJyu7IuMq5o0HVZ2_t7Cayyk<7i)^U3! zbv}ynNws%D(5iHE?T(8MqyRTX9RxLwOh={VeqCf1@m3h{LZJgVt(MzXv(o|+~3q>dgwJ`Ttv@Yc2knm{b*VE`!?HICGL2|#y{A4}eqY#A+!S~;@V0ofxaXs_?}VMnM8A(02Ei~+ z7#RQjT~pkJ_PkHQ1iz5aMK4lQBeoaOLY#F)-hm3`RJ`EK3RAsAtdrL1YI zocLRVO1cqU$65{dFnV;%{V-$1GK+9jGW6`QZKh*?wfH&!;4mqiJ;{j`x6A@L6J^bf z?=>iNH6Fs=1|au(`02tPnd~c#k;Cy1oO0{K?9J*NuNeT61dUqlV~U25){6EG zdSFLoc5CG3>0f5({JJ|jI=bQYdUCwVEhu-Ya14{y1m%t?sm}X+#`+!qJmJo(BgW}( z@mB^Efah(2F36;$^>m$JWngIIgF!j&ZnK6!{_=2M!gY|=jG!1Iws~aVgmICwVeaJ% z1H~uz1AX>h&hM}4MsJJhG~XAC6KUOAbA4QNz5K= z*$7`{jGg(6km1Bu!U;Qc#1=px;sss6<`b;q)~3@FN=!(F@HARWLA?L41~~pal0?=H z)dFA?of2Nw${@W)ET8F(k4y=pEFdz-F6_8XK;B?IJ9}B9#4b;?)T*GH>1sv_+moX4 zy80>^naUz-^h|P?<{*q?lFDad+gr&bGfz{S#Ud;&P9h|i6JeL+GC2o&Uti!dfdhCh z4#uFX@#Id!GXEfa{ageYO0gg0tGVHH0n({gGmdHcsYQ*5`3b|Lq`(NDHv)~cbJ|iv zoGW5*5z{YyWeF~e673-pxA9E--c#aTy}7oRTR3mOWlH_Yn@h?NuC9en&pR)J7ugeKj_Ru=tf8LX5)JW^L!Bx2!sfB(F+C79j&N#`e4Sir{*DB?8 zzwh9G1xzHK4?-~Zh`>uM#Kpv>&$w#rK&YFFA-|HTx4`lWqlc8cZ?SuQou`A|%Q*sW z*H3RGs>NZeN`})lPKR)6$7vRE*qE2Y1Q^5KAB*lN@%FSQuD;=nt7T*6BY}idMaUxt zGdB-kh4BnhPTiXXh+XSyc(w8Q1JE<>YMCEo8T1a1^hf^=KJzAl_(E1>Lx}2<4d^|j zNRX*r4|lY5(uQwdBf6n^zW84#9nbGq-9F-nXI}@yB)((|JI={fzpobXa~R<1{^Bp# zah-=pmDe>D;7#Kb!e^_01dPhC@CJLI20)COTk>|hhII}LUE-5mxjHbVO}%~4u`BTvj5Vy`2_M6Cr8bQe=S z%%m!-ULVP`AX51-zNw6gxmC6Gc~%!>Ug#+s#m0MO3HsKk#Tcv^3R}SiM$qETyxM#?& zz|B?E?mw7kU3-wEn=mO=II+$bjS{d4yzL4Ue8=895cJc^p&qN9W#-=);L^r~!rI6O z>dAOF+BI8>-Mb@-%Za@^SMWR_QC4Le;dpvh#nmA2MrS=#BxbN>+a0?T^>)UmzQk-m z8)OmMY48`<^3{7S6dvFoNEZvEq(Am!S{jQWsZt&U7Er5;(CsNG>4A`tqkLpR{h0na zHAFJ>g<8}cQ!mRS>!$0IN3UHharbg}% zg3n@=w{g-yD?l?pX2tkmdM{ff?`3!hpEysGiB@R#>}u={K;8C$w)XrDa+)~ zgb+xO*rukT2_(M!Y8rFfC7*g~Lqjz!XPrO`lR(2g^R(*W$b)`hE97ZE^Ul5;B+aDECPpTL~@2)i=Z#g!y$Gg-P57 z$?(uj(9fyA_JNC*BNDG-y_7qcl}I;oX_MHbXAIJ$uP0ln$%M=M*>{$aIO*j z@X_}rBOto{rO$x*;8CT+6TLlJn)ywKEEIH?*$LXy*WJcp#Z4sdfST7Qdl8!my|*@$ z&FFRN=;&xrUP`-Jz>6mEyi?=Fw!vlvVn_$%ID`aSY)9Etl8!d7*_W#DWST&{Fv(2% z1h=MAQ*Cd|sN+d$)R-rTT7B_IRLOMcqOwovpUMZy&r|-|ZCLQ2riNMWnn$WY4|c13!kyP~ zE4DAc4muqQepvRWz5V2-I>%&vb1BX5ql^AU@x%YnV(q@jm|51Y3@!9VkLZ#4lO1G? zw|W~cy*8MwnhQDv&l-!v-*(3FbM}r@e4AecfM)y}N4|Fy0Gj7}zOE*M#b4}CJQ=>XJoX0 zF=HOp4L1j&{ zMD_(p)|5C|PgL6n^|oOtEV%$1P!|}bsW*NZgp(_Q78*rC#hdHh2}qn0ioO+CRjG8T zxRv^AUv3*o88lk;f#Fe3sa^+&K3Pmut<)&2Kkq+&=ghQE-;KeY)|SlBYB;czz=tBK zbP=Bqf_44Vr%(5z0^69plan=OIYVt$vT`R1rMsgE@!8qq_#*-Gf6M}pu$K;%9SIJO z?4t1F=ofc53wJFwjiVBDZlW2W1y%;c_sS!_y_96agEgkH;I|gShwWRnEM@T7rydYg z%MJ5l6jP4?rmqsDjvimt|&wSLA zW*eA%m4P`b)oOUzSFX5*riMDD>cv8ZtjjjbUqsyOFSXS&eNrEYMB8G?3$(7;&tPnc zTEGBi%`5KKNZ9jy)@3rkW~`$!+$}F9jx{$jj;HjKP`rdb2nn@qRG`Ji@;!7S{202h z$7XzOW40PeIMjN8KQ!yjGRycz?>1jAi|gqe-gL=*OEa)TfoBMjtAIJK2Z|Osz@NLs z3LULYH+m;rA0rHgW8rszr&Z1%H>UYMl#I^Oz7 z>CrKtEwxObkz4nA3|)w1K3xbT-wD6PURgXdNhyXB((j@o6!R%j`mqwD%(U3$7 z$4+wiD*{WilSA{P(aAG9fVhJ=!wUx0s{rb*T*Bgd)?HJe%CtsymAB_YYD*Ix=I0la z^}0-s{LLEQ`&n!TxEORf0t{VCS$-l&g`Dh=ZiX>q}k19LICd3Qinrh21fMG?MLBk>rK@nG2ROV&M$?zo_fn8ydD_Ycl z+W>r9BP4;ePXN_FRENf^5Q=moyR_-b4I|e2%hR9sA8J48B6^BBed&5MdleYD=@#rI zKFBHQ?Ub!h{0UPzO_hs%&itVB1h;mz97I67N>3N^b0b`7TAr+OKEF)#=x&4BBVQo_ zoo)Kg1i0CvKAAhJ$C6>%bNDOM-u@%^Cth^&bkMTZ0$Km@b=+S(Oq27@ak$QWWbU}y z;*d>_sO@`wg7Fd^=?8j?YYew#=l&sst#Tq{5d`$zp_VjUd zd0$sAXf!|}#(8Xd?8Ifw%?Nv_C;aAFl`qjCO|vCcbf#=7SuRSsI;P|DWU8V60{S-B zRTspu+0grVeV3QhWK%;$?EydgGCvu3N4nKX?Dj>6HVG4ARECiTQi>RtbS2{|Sih~C7 zKIGoJzofaYh7ux!mYWVa3v$qMBZO#7wVMHXEAUgibVQ*!z6#^05szW|Jx(t1~ z(9|8?5|E}6?c&59N+kpl6}4)-|L#UltC3=hIm1{KkUv9SFh8aLo(pe{={dP_^%)_T z?M77%W@y_2$;L>!-=l|?_&HgVWdo=@OQ%WC7poNyG8Mh$kf z^V-*UYJQ(_u)VC|TG;5aZ>3@O+6T@v&eVp$P&cl_Ty7*01trtN(B5fV#f76%@5bBr z2^DA`al>6eQQrOLXV8<>hG^7s!Au@1rlImqC+WT!g+P3;uYJrRJsPh)#)sYX_rWXV z$9fS3);5$qJF?;x)YbARBUc+FIpD)LaO&b2mmqE8;kgix1$Eo5T#`(U+>&cCOOycG zwmkZz70PBNgUrqzWq3Nm6XFqPXpq*0Q(gNk41lLUaZdoK2XqTNb?xTZQ-=7aIZshf z44?aJg`LZdP{(_qej;nYTZnSuBM7*-nT16;G5wd)IN847U3i=&PJ#*Zjv|%TQm?nM5@!mWi+tPZ2$OX>!P2 z6mE&HUlOF`PcqcNUU~s{zC@Yt1nK=&tQ)Ke7}a~En0)u&_N?+6 zuV_>_i9Qmccu3APxvPv>j6krdMQeoZbpFo%vxYXbMm&Lzh|^yVg9V@i*`Y1(Un5gVEbBexiCcXo>3ASRv#%{+tT z_3g491OpgEd@@6;eLLdEHI_|Dan~@FKlo)+7PpU~dP{OHdN~fj4_bO=ZK^&}i+mB< z^E6AveOvqf_0l5wxUYCATQnJY&D4&{mlw~XlgRIa-kTA9VgVGua=$~yn0`~ zaCe6xQ>{|heenwbz21bV8&rNe&e~axy^k)T8GCC3$v>#^cx0ou-EzI`T1Ag**HY~y zouWTu+k-TZKS@tD{}R|13(j;^8F$1MJiwv(*^l+)A>!}UWCMt5>KjBKltkUs3K&@D zV|UJX`x$3dE#0f1T~bykpaK`VadipvPxdXh1p^V#(J#512?MfW_bY|@O+W|aZ^p8Q zASo3S2COOpF<`3a-A59Z8#nz28KZ!^YTOXriU3|A)aq5haUpykXP^8JCvAUW5kSzs zG_>aN6Cm20-zzT={GzHqTnGPtPmAO(7*8XZ3m%cA3(R#P@mT1I#%>6TH5UR^py1{R zqMz&>?yte+@1EQJ**SXlfQlmsa-+EoK|M9^{Jxy;m)E%mUf91S0z(LJ8}!hEmi6YH z7YGiVqer#?C)MNn=FOXJu8_uG(ph9vxGguPL;`_8lwsxnf?xX+A}|Na

V(>^jE= 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%0AaAU9*>6Usl=!bYFNbV)S}18%6k2rf9E<1G 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

;b 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 z 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

(FhB5f4rM8x-k5dYs|ZcSiVCS&f9atF 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∨mKQS$&lYDc{<2()5DUDI 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

<(f!^u*&emsmU#V*3A1CYVPjj)&n-00gQo)rD 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

x#XQ&2#DQ{1JgSrU@}=Q9c8wG}H$-;hQbhP}LS! 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

oOowp0-RyD3X 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 diff --git a/docs/apm/images/yellow-service.png b/docs/apm/images/yellow-service.png new file mode 100644 index 0000000000000000000000000000000000000000..43afd6250be7243ba4740e22c51ac045805270b3 GIT binary patch literal 4425 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 with machine learning ++++ -The Machine Learning integration will initiate a new job predefined to calculate anomaly scores on transaction response times. -The response time graph will show the expected bounds and add an annotation when the anomaly score is 75 or above. -Jobs can be created per transaction type, and based on the average response time. -Manage jobs in the *Machine Learning jobs management*. +The Machine Learning integration initiates a new job predefined to calculate anomaly scores on APM transaction durations. +Jobs can be created per transaction type, and are based on the service's average response time. + +After a machine learning job is created, results are shown in two places: + +The transaction duration graph will show the expected bounds and add an annotation when the anomaly score is 75 or above. + +[role="screenshot"] +image::apm/images/apm-ml-integration.png[Example view of anomaly scores on response times in the APM app] + +Service maps will display a color-coded anomaly indicator based on the detected anomaly score. [role="screenshot"] -image::apm/images/apm-ml-integration.png[Example view of anomaly scores on response times in APM app in Kibana] +image::apm/images/apm-service-map-anomaly.png[Example view of anomaly scores on service maps in the APM app] [float] [[create-ml-integration]] @@ -20,8 +27,10 @@ image::apm/images/apm-ml-integration.png[Example view of anomaly scores on respo To enable machine learning anomaly detection, first choose a service to monitor. Then, select **Integrations** > **Enable ML anomaly detection** and click **Create job**. + That's it! After a few minutes, the job will begin calculating results; it might take additional time for results to appear on your graph. +Jobs can be managed in *Machine Learning jobs management*. APM specific anomaly detection wizards are also available for certain Agents. See the machine learning {ml-docs}/ootb-ml-jobs-apm.html[APM anomaly detection configurations] for more information. diff --git a/docs/apm/service-maps.asciidoc b/docs/apm/service-maps.asciidoc index be86b9d522ac5..3a6a96fca9d09 100644 --- a/docs/apm/service-maps.asciidoc +++ b/docs/apm/service-maps.asciidoc @@ -9,7 +9,9 @@ Please use Chrome or Firefox if available. A service map is a real-time visual representation of the instrumented services in your application's architecture. It shows you how these services are connected, along with high-level metrics like average transaction duration, -requests per minute, and errors per minute, that allow you to quickly assess the status of your services. +requests per minute, and errors per minute. +If enabled, service maps also integrate with machine learning--for real time health indicators based on anomaly detection scores. +All of these features can help you to quickly and visually assess the status and health of your services. We currently surface two types of service maps: @@ -52,6 +54,26 @@ Additional filters are not currently available for service maps. [role="screenshot"] image::apm/images/service-maps-java.png[Example view of service maps with Java highlighted in the APM app in Kibana] +[float] +[[service-map-anomaly-detection]] +=== Anomaly detection with machine learning + +Machine learning jobs can be created to calculate anomaly scores on APM transaction durations within the selected service. +When these jobs are active, service maps will display a color-coded anomaly indicator based on the detected anomaly score: + +[horizontal] +image:apm/images/green-service.png[APM green service]:: Max anomaly score **<=25**. Service is healthy. +image:apm/images/yellow-service.png[APM yellow service]:: Max anomaly score **26-74**. Anomalous activity detected. Service may be degraded. +image:apm/images/red-service.png[APM red service]:: Max anomaly score **>=75**. Anomalous activity detected. Service is unhealthy. + +[role="screenshot"] +image::apm/images/apm-service-map-anomaly.png[Example view of anomaly scores on service maps in the APM app] + +If an anomaly has been detected, click *view anomalies* to view the anomaly detection metric viewier in the Machine learning app. +This time series analysis will display additional details on the severity and time of the detected anomalies. + +To learn how to create a machine learning job, see <>. + [float] [[service-maps-legend]] === Legend diff --git a/x-pack/plugins/apm/public/components/app/ServiceDetails/ServiceIntegrations/MachineLearningFlyout/view.tsx b/x-pack/plugins/apm/public/components/app/ServiceDetails/ServiceIntegrations/MachineLearningFlyout/view.tsx index cff190cd98a11..6aa7815ad688c 100644 --- a/x-pack/plugins/apm/public/components/app/ServiceDetails/ServiceIntegrations/MachineLearningFlyout/view.tsx +++ b/x-pack/plugins/apm/public/components/app/ServiceDetails/ServiceIntegrations/MachineLearningFlyout/view.tsx @@ -134,9 +134,11 @@ export function MachineLearningFlyoutView({

+ ), + serviceMapAnnotationText: ( + + {i18n.translate( + 'xpack.apm.serviceDetails.enableAnomalyDetectionPanel.createMLJobDescription.serviceMapAnnotationText', + { + defaultMessage: 'service maps' } )} @@ -155,15 +167,15 @@ export function MachineLearningFlyoutView({

@@ -358,7 +389,21 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` Array [ Object { "field": "groupId", - "name": "Group ID", + "name": + Group ID + + + , "render": [Function], "sortable": false, "width": "96px", @@ -524,9 +569,26 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` > Group ID + + +
+
@@ -689,6 +751,23 @@ exports[`ErrorGroupOverview -> List should render with data 1`] = ` className="euiTableRowCell__mobileHeader euiTableRowCell--hideForDesktop" > Group ID + + +
+
List should render with data 1`] = ` className="euiTableRowCell__mobileHeader euiTableRowCell--hideForDesktop" > Group ID + + +
+
List should render with data 1`] = ` className="euiTableRowCell__mobileHeader euiTableRowCell--hideForDesktop" > Group ID + + +
+
List should render with data 1`] = ` className="euiTableRowCell__mobileHeader euiTableRowCell--hideForDesktop" > Group ID + + +
+
= props => { if (!serviceName) { throw new Error('Service name is required'); } - const columns = useMemo( () => [ { - name: i18n.translate('xpack.apm.errorsTable.groupIdColumnLabel', { - defaultMessage: 'Group ID' - }), + name: ( + <> + {i18n.translate('xpack.apm.errorsTable.groupIdColumnLabel', { + defaultMessage: 'Group ID' + })}{' '} + + + ), field: 'groupId', sortable: false, width: px(unit * 6), diff --git a/x-pack/plugins/apm/public/components/app/TransactionOverview/List/index.tsx b/x-pack/plugins/apm/public/components/app/TransactionOverview/List/index.tsx index e3b33f11d0805..f8dcec14630a5 100644 --- a/x-pack/plugins/apm/public/components/app/TransactionOverview/List/index.tsx +++ b/x-pack/plugins/apm/public/components/app/TransactionOverview/List/index.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { EuiIcon, EuiToolTip } from '@elastic/eui'; +import { EuiToolTip, EuiIconTip } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React, { useMemo } from 'react'; import styled from 'styled-components'; @@ -109,27 +109,26 @@ export function TransactionList({ items, isLoading }: Props) { { field: 'impact', name: ( - - <> - {i18n.translate('xpack.apm.transactionsTable.impactColumnLabel', { - defaultMessage: 'Impact' - })}{' '} - - - + <> + {i18n.translate('xpack.apm.transactionsTable.impactColumnLabel', { + defaultMessage: 'Impact' + })}{' '} + + ), sortable: true, dataType: 'number', diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index f6b645ee33ed1..a2b4bd224e637 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -4209,6 +4209,7 @@ "xpack.apm.errorRateAlertTrigger.isAbove": "の下限は", "xpack.apm.errorsTable.errorMessageAndCulpritColumnLabel": "エラーメッセージと原因", "xpack.apm.errorsTable.groupIdColumnLabel": "グループ ID", + "xpack.apm.errorsTable.groupIdColumnDescription": "スタックトレースのハッシュ。動的パラメーターによりエラーメッセージが異なる場合でも、同様のエラーをグループ化します。", "xpack.apm.errorsTable.latestOccurrenceColumnLabel": "最近のオカレンス", "xpack.apm.errorsTable.noErrorsLabel": "エラーが見つかりませんでした", "xpack.apm.errorsTable.occurrencesColumnLabel": "オカレンス", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index c9ed2111a4e7c..f7caf1619f5fb 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -4209,6 +4209,7 @@ "xpack.apm.errorRateAlertTrigger.errors": "错误", "xpack.apm.errorRateAlertTrigger.isAbove": "高于", "xpack.apm.errorsTable.errorMessageAndCulpritColumnLabel": "错误消息和原因", + "xpack.apm.errorsTable.groupIdColumnDescription": "堆栈跟踪的哈希值。即使由于动态参数而导致错误消息不同,也将相似的错误归为一组。", "xpack.apm.errorsTable.groupIdColumnLabel": "组 ID", "xpack.apm.errorsTable.latestOccurrenceColumnLabel": "最新一次发生", "xpack.apm.errorsTable.noErrorsLabel": "未找到任何错误", From ef58a90e45db1777eee67e795d2bb2a73972e79e Mon Sep 17 00:00:00 2001 From: Diana Derevyankina <54894989+DziyanaDzeraviankina@users.noreply.github.com> Date: Fri, 8 May 2020 12:31:46 +0300 Subject: [PATCH 032/102] Clean up TSVB turn Joi schema into kbn schema (#65482) * Clean up TSVB turn Joi schema into kbn schema Part of #57342 * Return validationTelemerty and logging part back * Add schema.maybe() where it was missed --- .../server/routes/post_vis_schema.ts | 208 +++++++++--------- .../vis_type_timeseries/server/routes/vis.ts | 8 +- 2 files changed, 107 insertions(+), 109 deletions(-) diff --git a/src/plugins/vis_type_timeseries/server/routes/post_vis_schema.ts b/src/plugins/vis_type_timeseries/server/routes/post_vis_schema.ts index fa4427fbb8c12..1d565e69a801c 100644 --- a/src/plugins/vis_type_timeseries/server/routes/post_vis_schema.ts +++ b/src/plugins/vis_type_timeseries/server/routes/post_vis_schema.ts @@ -17,59 +17,65 @@ * under the License. */ -import Joi from 'joi'; -const stringOptionalNullable = Joi.string() - .allow('', null) - .optional(); -const stringRequired = Joi.string() - .allow('') - .required(); -const arrayNullable = Joi.array().allow(null); -const numberIntegerOptional = Joi.number() - .integer() - .optional(); -const numberIntegerRequired = Joi.number() - .integer() - .required(); -const numberOptional = Joi.number().optional(); -const queryObject = Joi.object({ - language: Joi.string().allow(''), - query: Joi.string().allow(''), +import { schema } from '@kbn/config-schema'; +import { TypeOptions } from '@kbn/config-schema/target/types/types'; + +const stringOptionalNullable = schema.maybe(schema.nullable(schema.string())); + +const stringRequired = schema.string(); + +const arrayNullable = schema.arrayOf(schema.nullable(schema.any())); + +const validateInteger: TypeOptions['validate'] = value => { + if (!Number.isInteger(value)) { + return `${value} is not an integer`; + } +}; +const numberIntegerOptional = schema.maybe(schema.number({ validate: validateInteger })); +const numberIntegerRequired = schema.number({ validate: validateInteger }); + +const numberOptional = schema.maybe(schema.number()); + +const queryObject = schema.object({ + language: schema.string(), + query: schema.string(), }); -const stringOrNumberOptionalNullable = Joi.alternatives([stringOptionalNullable, numberOptional]); -const numberOptionalOrEmptyString = Joi.alternatives(numberOptional, Joi.string().valid('')); +const stringOrNumberOptionalNullable = schema.nullable( + schema.oneOf([stringOptionalNullable, numberOptional]) +); +const numberOptionalOrEmptyString = schema.maybe( + schema.oneOf([numberOptional, schema.literal('')]) +); -const annotationsItems = Joi.object({ +const annotationsItems = schema.object({ color: stringOptionalNullable, fields: stringOptionalNullable, - hidden: Joi.boolean().optional(), + hidden: schema.maybe(schema.boolean()), icon: stringOptionalNullable, id: stringOptionalNullable, ignore_global_filters: numberIntegerOptional, ignore_panel_filters: numberIntegerOptional, index_pattern: stringOptionalNullable, - query_string: queryObject.optional(), + query_string: schema.maybe(queryObject), template: stringOptionalNullable, time_field: stringOptionalNullable, }); -const backgroundColorRulesItems = Joi.object({ - value: Joi.number() - .allow(null) - .optional(), +const backgroundColorRulesItems = schema.object({ + value: schema.maybe(schema.nullable(schema.number())), id: stringOptionalNullable, background_color: stringOptionalNullable, color: stringOptionalNullable, }); -const gaugeColorRulesItems = Joi.object({ +const gaugeColorRulesItems = schema.object({ gauge: stringOptionalNullable, text: stringOptionalNullable, id: stringOptionalNullable, operator: stringOptionalNullable, - value: Joi.number(), + value: schema.number(), }); -const metricsItems = Joi.object({ +const metricsItems = schema.object({ field: stringOptionalNullable, id: stringRequired, metric_agg: stringOptionalNullable, @@ -84,50 +90,49 @@ const metricsItems = Joi.object({ beta: numberOptional, gamma: numberOptional, period: numberOptional, - multiplicative: Joi.boolean(), + multiplicative: schema.maybe(schema.boolean()), window: numberOptional, function: stringOptionalNullable, script: stringOptionalNullable, - variables: Joi.array() - .items( - Joi.object({ + variables: schema.maybe( + schema.arrayOf( + schema.object({ field: stringOptionalNullable, id: stringRequired, name: stringOptionalNullable, }) ) - .optional(), - percentiles: Joi.array() - .items( - Joi.object({ + ), + percentiles: schema.maybe( + schema.arrayOf( + schema.object({ id: stringRequired, field: stringOptionalNullable, - mode: Joi.string().allow('line', 'band'), - shade: Joi.alternatives(numberOptional, stringOptionalNullable), - value: Joi.alternatives(numberOptional, stringOptionalNullable), + mode: schema.oneOf([schema.literal('line'), schema.literal('band')]), + shade: schema.oneOf([numberOptional, stringOptionalNullable]), + value: schema.oneOf([numberOptional, stringOptionalNullable]), percentile: stringOptionalNullable, }) ) - .optional(), + ), type: stringRequired, value: stringOptionalNullable, - values: Joi.array() - .items(Joi.string().allow('', null)) - .allow(null) - .optional(), + values: schema.maybe(schema.nullable(schema.arrayOf(schema.nullable(schema.string())))), }); -const splitFiltersItems = Joi.object({ +const splitFiltersItems = schema.object({ id: stringOptionalNullable, color: stringOptionalNullable, - filter: Joi.object({ - language: Joi.string().allow(''), - query: Joi.string().allow(''), - }).optional(), + filter: schema.maybe( + schema.object({ + language: schema.string(), + query: schema.string(), + }) + ), label: stringOptionalNullable, }); -const seriesItems = Joi.object({ +const seriesItems = schema.object({ aggregate_by: stringOptionalNullable, aggregate_function: stringOptionalNullable, axis_position: stringRequired, @@ -135,31 +140,33 @@ const seriesItems = Joi.object({ axis_min: stringOrNumberOptionalNullable, chart_type: stringRequired, color: stringRequired, - color_rules: Joi.array() - .items( - Joi.object({ + color_rules: schema.maybe( + schema.arrayOf( + schema.object({ value: numberOptional, id: stringRequired, text: stringOptionalNullable, operator: stringOptionalNullable, }) ) - .optional(), + ), fill: numberOptionalOrEmptyString, - filter: Joi.alternatives( - Joi.object({ - query: stringRequired, - language: stringOptionalNullable, - }).optional(), - Joi.string().valid('') + filter: schema.maybe( + schema.oneOf([ + schema.object({ + query: stringRequired, + language: stringOptionalNullable, + }), + schema.literal(''), + ]) ), formatter: stringRequired, hide_in_legend: numberIntegerOptional, - hidden: Joi.boolean().optional(), + hidden: schema.maybe(schema.boolean()), id: stringRequired, label: stringOptionalNullable, line_width: numberOptionalOrEmptyString, - metrics: Joi.array().items(metricsItems), + metrics: schema.arrayOf(metricsItems), offset_time: stringOptionalNullable, override_index_pattern: numberOptional, point_size: numberOptionalOrEmptyString, @@ -170,9 +177,7 @@ const seriesItems = Joi.object({ series_interval: stringOptionalNullable, series_drop_last_bucket: numberIntegerOptional, split_color_mode: stringOptionalNullable, - split_filters: Joi.array() - .items(splitFiltersItems) - .optional(), + split_filters: schema.maybe(schema.arrayOf(splitFiltersItems)), split_mode: stringRequired, stacked: stringRequired, steps: numberIntegerOptional, @@ -189,38 +194,34 @@ const seriesItems = Joi.object({ var_name: stringOptionalNullable, }); -export const visPayloadSchema = Joi.object({ +export const visPayloadSchema = schema.object({ filters: arrayNullable, - panels: Joi.array().items( - Joi.object({ - annotations: Joi.array() - .items(annotationsItems) - .optional(), + panels: schema.arrayOf( + schema.object({ + annotations: schema.maybe(schema.arrayOf(annotationsItems)), axis_formatter: stringRequired, axis_position: stringRequired, axis_scale: stringRequired, axis_min: stringOrNumberOptionalNullable, axis_max: stringOrNumberOptionalNullable, - bar_color_rules: arrayNullable.optional(), + bar_color_rules: schema.maybe(arrayNullable), background_color: stringOptionalNullable, - background_color_rules: Joi.array() - .items(backgroundColorRulesItems) - .optional(), + background_color_rules: schema.maybe(schema.arrayOf(backgroundColorRulesItems)), default_index_pattern: stringOptionalNullable, default_timefield: stringOptionalNullable, drilldown_url: stringOptionalNullable, drop_last_bucket: numberIntegerOptional, - filter: Joi.alternatives( - stringOptionalNullable, - Joi.object({ - language: stringOptionalNullable, - query: stringOptionalNullable, - }) + filter: schema.nullable( + schema.oneOf([ + stringOptionalNullable, + schema.object({ + language: stringOptionalNullable, + query: stringOptionalNullable, + }), + ]) ), - gauge_color_rules: Joi.array() - .items(gaugeColorRulesItems) - .optional(), - gauge_width: [stringOptionalNullable, numberOptional], + gauge_color_rules: schema.maybe(schema.arrayOf(gaugeColorRulesItems)), + gauge_width: schema.nullable(schema.oneOf([stringOptionalNullable, numberOptional])), gauge_inner_color: stringOptionalNullable, gauge_inner_width: stringOrNumberOptionalNullable, gauge_style: stringOptionalNullable, @@ -230,7 +231,7 @@ export const visPayloadSchema = Joi.object({ ignore_global_filter: numberOptional, index_pattern: stringRequired, interval: stringRequired, - isModelInvalid: Joi.boolean().optional(), + isModelInvalid: schema.maybe(schema.boolean()), legend_position: stringOptionalNullable, markdown: stringOptionalNullable, markdown_scrollbars: numberIntegerOptional, @@ -242,9 +243,7 @@ export const visPayloadSchema = Joi.object({ pivot_label: stringOptionalNullable, pivot_type: stringOptionalNullable, pivot_rows: stringOptionalNullable, - series: Joi.array() - .items(seriesItems) - .required(), + series: schema.arrayOf(seriesItems), show_grid: numberIntegerRequired, show_legend: numberIntegerRequired, time_field: stringOptionalNullable, @@ -253,22 +252,19 @@ export const visPayloadSchema = Joi.object({ }) ), // general - query: Joi.array() - .items(queryObject) - .allow(null) - .required(), - state: Joi.object({ - sort: Joi.object({ - column: stringRequired, - order: Joi.string() - .valid(['asc', 'desc']) - .required(), - }).optional(), - }).required(), - savedObjectId: Joi.string().optional(), - timerange: Joi.object({ + query: schema.nullable(schema.arrayOf(queryObject)), + state: schema.object({ + sort: schema.maybe( + schema.object({ + column: stringRequired, + order: schema.oneOf([schema.literal('asc'), schema.literal('desc')]), + }) + ), + }), + savedObjectId: schema.maybe(schema.string()), + timerange: schema.object({ timezone: stringRequired, min: stringRequired, max: stringRequired, - }).required(), + }), }); diff --git a/src/plugins/vis_type_timeseries/server/routes/vis.ts b/src/plugins/vis_type_timeseries/server/routes/vis.ts index 9abbc4ad617dc..744020b583882 100644 --- a/src/plugins/vis_type_timeseries/server/routes/vis.ts +++ b/src/plugins/vis_type_timeseries/server/routes/vis.ts @@ -38,16 +38,18 @@ export const visDataRoutes = ( }, }, async (requestContext, request, response) => { - const { error: validationError } = visPayloadSchema.validate(request.body); - if (validationError) { + try { + visPayloadSchema.validate(request.body); + } catch (error) { logFailedValidation(); const savedObjectId = (typeof request.body === 'object' && (request.body as any).savedObjectId) || 'unavailable'; framework.logger.warn( - `Request validation error: ${validationError.message} (saved object id: ${savedObjectId}). This most likely means your TSVB visualization contains outdated configuration. You can report this problem under https://github.com/elastic/kibana/issues/new?template=Bug_report.md` + `Request validation error: ${error.message} (saved object id: ${savedObjectId}). This most likely means your TSVB visualization contains outdated configuration. You can report this problem under https://github.com/elastic/kibana/issues/new?template=Bug_report.md` ); } + try { const results = await getVisData( requestContext, From 918dac3b087a1b71addffe0497cf3713ab3fec07 Mon Sep 17 00:00:00 2001 From: Dario Gieselaar Date: Fri, 8 May 2020 11:49:03 +0200 Subject: [PATCH 033/102] [APM] use navigateToApp for infra/metrics/uptime links (#65712) --- .../TransactionActionMenu.tsx | 38 ++++++++++++++++++- 1 file changed, 36 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/apm/public/components/shared/TransactionActionMenu/TransactionActionMenu.tsx b/x-pack/plugins/apm/public/components/shared/TransactionActionMenu/TransactionActionMenu.tsx index 4092e0148286e..6d9a917af659f 100644 --- a/x-pack/plugins/apm/public/components/shared/TransactionActionMenu/TransactionActionMenu.tsx +++ b/x-pack/plugins/apm/public/components/shared/TransactionActionMenu/TransactionActionMenu.tsx @@ -6,7 +6,8 @@ import { EuiButtonEmpty } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import React, { FunctionComponent, useMemo, useState } from 'react'; +import React, { FunctionComponent, useMemo, useState, MouseEvent } from 'react'; +import url from 'url'; import { Filter } from '../../../../common/custom_link/custom_link_types'; import { Transaction } from '../../../../typings/es_schemas/ui/transaction'; import { @@ -82,7 +83,39 @@ export const TransactionActionMenu: FunctionComponent = ({ basePath: core.http.basePath, location, urlParams - }); + }).map(sectionList => + sectionList.map(section => ({ + ...section, + actions: section.actions.map(action => { + const { href } = action; + + // use navigateToApp as a temporary workaround for faster navigation between observability apps. + // see https://github.com/elastic/kibana/issues/65682 + + return { + ...action, + onClick: (event: MouseEvent) => { + const parsed = url.parse(href); + + const appPathname = core.http.basePath.remove( + parsed.pathname ?? '' + ); + + const [, , app, ...rest] = appPathname.split('/'); + + if (app === 'uptime' || app === 'metrics' || app === 'logs') { + event.preventDefault(); + core.application.navigateToApp(app, { + path: `${rest.join('/')}${ + parsed.search ? `&${parsed.search}` : '' + }` + }); + } + } + }; + }) + })) + ); const closePopover = () => { setIsActionPopoverOpen(false); @@ -151,6 +184,7 @@ export const TransactionActionMenu: FunctionComponent = ({ key={action.key} label={action.label} href={action.href} + onClick={action.onClick} /> ))} From 7cf7c261b990b3de01bdef44feeb1cca176fa6e9 Mon Sep 17 00:00:00 2001 From: Anton Dosov Date: Fri, 8 May 2020 12:03:42 +0200 Subject: [PATCH 034/102] fix fetchSoon delay in case of 0ms. Add async_dashboard test (#65083) * forwardport #64999 * Add additional verifications on dashboard I hope you don't mind me updating the test directly. I *thought* the other dashboard tests required a consistent set of exact documents so that the count would always be the same. Since the test uses sample data, I added a new timepicker:quickRanges so that the test can just select it. Test FTR isn't set up to do relative time ranges right now. But it looks like the dashboard checks aren't that specific to the data. The dashboard seems to have `Last 24 hours` saved in it. And when I don't change it to the whole sample data time range the test still passes. * fix eslint error * [page_objects/time_picker] allow any string in setCommonlyUsedTime Co-authored-by: Lee Drengenberg Co-authored-by: Dzmitry Lemechko --- .../public/search/legacy/fetch_soon.test.ts | 4 +- .../data/public/search/legacy/fetch_soon.ts | 4 + test/functional/page_objects/time_picker.ts | 2 +- .../apps/dashboard/_async_dashboard.ts | 174 ++++++++++++++++++ .../test/functional/apps/dashboard/index.ts | 1 + 5 files changed, 181 insertions(+), 4 deletions(-) create mode 100644 x-pack/test/functional/apps/dashboard/_async_dashboard.ts diff --git a/src/plugins/data/public/search/legacy/fetch_soon.test.ts b/src/plugins/data/public/search/legacy/fetch_soon.test.ts index b2e17798ccc9f..6c0467e3297e8 100644 --- a/src/plugins/data/public/search/legacy/fetch_soon.test.ts +++ b/src/plugins/data/public/search/legacy/fetch_soon.test.ts @@ -58,7 +58,7 @@ describe('fetchSoon', () => { (callClient as jest.Mock).mockClear(); }); - test('should delay by 0ms if config is set to not batch searches', () => { + test('should execute asap if config is set to not batch searches', () => { const config = getConfigStub({ 'courier:batchSearches': false, }); @@ -67,8 +67,6 @@ describe('fetchSoon', () => { fetchSoon(request, options, { config } as FetchHandlers); - expect(callClient).not.toBeCalled(); - jest.advanceTimersByTime(0); expect(callClient).toBeCalled(); }); diff --git a/src/plugins/data/public/search/legacy/fetch_soon.ts b/src/plugins/data/public/search/legacy/fetch_soon.ts index 18fa410a5bef0..83617d394fe95 100644 --- a/src/plugins/data/public/search/legacy/fetch_soon.ts +++ b/src/plugins/data/public/search/legacy/fetch_soon.ts @@ -67,6 +67,10 @@ async function delayedFetch( fetchHandlers: FetchHandlers, ms: number ) { + if (ms === 0) { + return callClient([request], [options], fetchHandlers)[0]; + } + const i = requestsToFetch.length; requestsToFetch = [...requestsToFetch, request]; requestOptions = [...requestOptions, options]; diff --git a/test/functional/page_objects/time_picker.ts b/test/functional/page_objects/time_picker.ts index 92f0d090ff5ee..4606d93ac27f5 100644 --- a/test/functional/page_objects/time_picker.ts +++ b/test/functional/page_objects/time_picker.ts @@ -65,7 +65,7 @@ export function TimePickerProvider({ getService, getPageObjects }: FtrProviderCo * Sets commonly used time * @param option 'Today' | 'This_week' | 'Last_15 minutes' | 'Last_24 hours' ... */ - async setCommonlyUsedTime(option: CommonlyUsed) { + async setCommonlyUsedTime(option: CommonlyUsed | string) { await testSubjects.click('superDatePickerToggleQuickMenuButton'); await testSubjects.click(`superDatePickerCommonlyUsed_${option}`); } diff --git a/x-pack/test/functional/apps/dashboard/_async_dashboard.ts b/x-pack/test/functional/apps/dashboard/_async_dashboard.ts new file mode 100644 index 0000000000000..2c8abda999ddd --- /dev/null +++ b/x-pack/test/functional/apps/dashboard/_async_dashboard.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../ftr_provider_context'; + +export default function({ getService, getPageObjects }: FtrProviderContext) { + const retry = getService('retry'); + const kibanaServer = getService('kibanaServer'); + const log = getService('log'); + const pieChart = getService('pieChart'); + const find = getService('find'); + const renderable = getService('renderable'); + const dashboardExpect = getService('dashboardExpect'); + const appMenu = getService('appsMenu'); + const PageObjects = getPageObjects([ + 'common', + 'header', + 'home', + 'discover', + 'dashboard', + 'timePicker', + ]); + + describe('sample data dashboard', function describeIndexTests() { + before(async () => { + await PageObjects.common.sleep(5000); + await PageObjects.common.navigateToUrl('home', 'tutorial_directory/sampleData'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.home.addSampleDataSet('flights'); + const isInstalled = await PageObjects.home.isSampleDataSetInstalled('flights'); + expect(isInstalled).to.be(true); + // add the range of the sample data so we can pick it in the quick pick list + const SAMPLE_DATA_RANGE = `[ + { + "from": "now-30d", + "to": "now+40d", + "display": "sample data range" + }, + { + "from": "now/d", + "to": "now/d", + "display": "Today" + }, + { + "from": "now/w", + "to": "now/w", + "display": "This week" + }, + { + "from": "now-15m", + "to": "now", + "display": "Last 15 minutes" + }, + { + "from": "now-30m", + "to": "now", + "display": "Last 30 minutes" + }, + { + "from": "now-1h", + "to": "now", + "display": "Last 1 hour" + }, + { + "from": "now-24h", + "to": "now", + "display": "Last 24 hours" + }, + { + "from": "now-7d", + "to": "now", + "display": "Last 7 days" + }, + { + "from": "now-30d", + "to": "now", + "display": "Last 30 days" + }, + { + "from": "now-90d", + "to": "now", + "display": "Last 90 days" + }, + { + "from": "now-1y", + "to": "now", + "display": "Last 1 year" + } + ]`; + + await kibanaServer.uiSettings.update({ 'timepicker:quickRanges': SAMPLE_DATA_RANGE }); + await appMenu.clickLink('Discover'); + await PageObjects.discover.selectIndexPattern('kibana_sample_data_flights'); + await PageObjects.timePicker.setCommonlyUsedTime('sample_data range'); + await retry.try(async function() { + const hitCount = parseInt(await PageObjects.discover.getHitCount(), 10); + expect(hitCount).to.be.greaterThan(0); + }); + }); + + after(async () => { + await PageObjects.common.navigateToUrl('home', 'tutorial_directory/sampleData'); + await PageObjects.home.removeSampleDataSet('flights'); + const isInstalled = await PageObjects.home.isSampleDataSetInstalled('flights'); + expect(isInstalled).to.be(false); + }); + + it('should launch sample flights data set dashboard', async () => { + await appMenu.clickLink('Dashboard'); + await PageObjects.dashboard.loadSavedDashboard('[Flights] Global Flight Dashboard'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.timePicker.setCommonlyUsedTime('sample_data range'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + // check at least one visualization + await renderable.waitForRender(); + log.debug('Checking pie charts rendered'); + await pieChart.expectPieSliceCount(4); + + await appMenu.clickLink('Discover'); + await retry.try(async function() { + const hitCount = parseInt(await PageObjects.discover.getHitCount(), 10); + expect(hitCount).to.be.greaterThan(0); + }); + await appMenu.clickLink('Dashboard'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await renderable.waitForRender(); + log.debug('Checking pie charts rendered'); + await pieChart.expectPieSliceCount(4); + }); + + it('toggle from Discover to Dashboard attempt 1', async () => { + await appMenu.clickLink('Discover'); + await retry.try(async function() { + const hitCount = parseInt(await PageObjects.discover.getHitCount(), 10); + expect(hitCount).to.be.greaterThan(0); + }); + await appMenu.clickLink('Dashboard'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await renderable.waitForRender(); + log.debug('Checking pie charts rendered'); + await pieChart.expectPieSliceCount(4); + }); + + it('toggle from Discover to Dashboard attempt 2', async () => { + await appMenu.clickLink('Discover'); + await retry.try(async function() { + const hitCount = parseInt(await PageObjects.discover.getHitCount(), 10); + expect(hitCount).to.be.greaterThan(0); + }); + await appMenu.clickLink('Dashboard'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await renderable.waitForRender(); + log.debug('Checking pie charts rendered'); + await pieChart.expectPieSliceCount(4); + + log.debug('Checking area, bar and heatmap charts rendered'); + await dashboardExpect.seriesElementCount(15); + log.debug('Checking saved searches rendered'); + await dashboardExpect.savedSearchRowCount(50); + log.debug('Checking input controls rendered'); + await dashboardExpect.inputControlItemCount(3); + log.debug('Checking tag cloud rendered'); + await dashboardExpect.tagCloudWithValuesFound(['Sunny', 'Rain', 'Clear', 'Cloudy', 'Hail']); + log.debug('Checking vega chart rendered'); + const tsvb = await find.existsByCssSelector('.vgaVis__view'); + expect(tsvb).to.be(true); + }); + }); +} diff --git a/x-pack/test/functional/apps/dashboard/index.ts b/x-pack/test/functional/apps/dashboard/index.ts index 2c8ac93c53fef..d45988e63c37f 100644 --- a/x-pack/test/functional/apps/dashboard/index.ts +++ b/x-pack/test/functional/apps/dashboard/index.ts @@ -13,5 +13,6 @@ export default function({ loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./preserve_url')); loadTestFile(require.resolve('./reporting')); loadTestFile(require.resolve('./drilldowns')); + loadTestFile(require.resolve('./_async_dashboard')); }); } From 75e12db4ba261b1f2984f392b00d974da5715ab7 Mon Sep 17 00:00:00 2001 From: James Gowdy Date: Fri, 8 May 2020 13:13:17 +0100 Subject: [PATCH 035/102] [ML] Show warning when the model memory limit is higher than the memory available in the ML node (#65652) * [ML] Show warning when the model memory limit is higher than the memory available in the ML node * reverting UI check * removing from UI job validator * adding cap to estimate mml * adding mml value to message * fixing translations * updating translations * fixing translation ids --- .../plugins/ml/common/types/ml_server_info.ts | 1 + .../calculate_model_memory_limit.ts | 41 +++++++++++------- .../server/models/job_validation/messages.js | 11 +++++ .../validate_model_memory_limit.test.ts | 25 +++++++++++ .../validate_model_memory_limit.ts | 43 +++++++++++++------ .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - 7 files changed, 94 insertions(+), 29 deletions(-) diff --git a/x-pack/plugins/ml/common/types/ml_server_info.ts b/x-pack/plugins/ml/common/types/ml_server_info.ts index 26dd1758827b4..66142f53add3a 100644 --- a/x-pack/plugins/ml/common/types/ml_server_info.ts +++ b/x-pack/plugins/ml/common/types/ml_server_info.ts @@ -18,6 +18,7 @@ export interface MlServerDefaults { export interface MlServerLimits { max_model_memory_limit?: string; + effective_max_model_memory_limit?: string; } export interface MlInfoResponse { diff --git a/x-pack/plugins/ml/server/models/calculate_model_memory_limit/calculate_model_memory_limit.ts b/x-pack/plugins/ml/server/models/calculate_model_memory_limit/calculate_model_memory_limit.ts index cd61dd9eddcdd..1cc2a07ddbc88 100644 --- a/x-pack/plugins/ml/server/models/calculate_model_memory_limit/calculate_model_memory_limit.ts +++ b/x-pack/plugins/ml/server/models/calculate_model_memory_limit/calculate_model_memory_limit.ts @@ -9,6 +9,7 @@ import { APICaller } from 'kibana/server'; import { MLCATEGORY } from '../../../common/constants/field_types'; import { AnalysisConfig } from '../../../common/types/anomaly_detection_jobs'; import { fieldsServiceProvider } from '../fields_service'; +import { MlInfoResponse } from '../../../common/types/ml_server_info'; interface ModelMemoryEstimationResult { /** @@ -139,15 +140,9 @@ export function calculateModelMemoryLimitProvider(callAsCurrentUser: APICaller) latestMs: number, allowMMLGreaterThanMax = false ): Promise { - let maxModelMemoryLimit; - try { - const resp = await callAsCurrentUser('ml.info'); - if (resp?.limits?.max_model_memory_limit !== undefined) { - maxModelMemoryLimit = resp.limits.max_model_memory_limit.toUpperCase(); - } - } catch (e) { - throw new Error('Unable to retrieve max model memory limit'); - } + const info = await callAsCurrentUser('ml.info'); + const maxModelMemoryLimit = info.limits.max_model_memory_limit?.toUpperCase(); + const effectiveMaxModelMemoryLimit = info.limits.effective_max_model_memory_limit?.toUpperCase(); const { overallCardinality, maxBucketCardinality } = await getCardinalities( analysisConfig, @@ -168,17 +163,32 @@ export function calculateModelMemoryLimitProvider(callAsCurrentUser: APICaller) }) ).model_memory_estimate.toUpperCase(); - let modelMemoryLimit: string = estimatedModelMemoryLimit; + let modelMemoryLimit = estimatedModelMemoryLimit; + let mmlCappedAtMax = false; // if max_model_memory_limit has been set, // make sure the estimated value is not greater than it. - if (!allowMMLGreaterThanMax && maxModelMemoryLimit !== undefined) { - // @ts-ignore - const maxBytes = numeral(maxModelMemoryLimit).value(); + if (allowMMLGreaterThanMax === false) { // @ts-ignore const mmlBytes = numeral(estimatedModelMemoryLimit).value(); - if (mmlBytes > maxBytes) { + if (maxModelMemoryLimit !== undefined) { + // @ts-ignore + const maxBytes = numeral(maxModelMemoryLimit).value(); + if (mmlBytes > maxBytes) { + // @ts-ignore + modelMemoryLimit = `${Math.floor(maxBytes / numeral('1MB').value())}MB`; + mmlCappedAtMax = true; + } + } + + // if we've not already capped the estimated mml at the hard max server setting + // ensure that the estimated mml isn't greater than the effective max mml + if (mmlCappedAtMax === false && effectiveMaxModelMemoryLimit !== undefined) { // @ts-ignore - modelMemoryLimit = `${Math.floor(maxBytes / numeral('1MB').value())}MB`; + const effectiveMaxMmlBytes = numeral(effectiveMaxModelMemoryLimit).value(); + if (mmlBytes > effectiveMaxMmlBytes) { + // @ts-ignore + modelMemoryLimit = `${Math.floor(effectiveMaxMmlBytes / numeral('1MB').value())}MB`; + } } } @@ -186,6 +196,7 @@ export function calculateModelMemoryLimitProvider(callAsCurrentUser: APICaller) estimatedModelMemoryLimit, modelMemoryLimit, ...(maxModelMemoryLimit ? { maxModelMemoryLimit } : {}), + ...(effectiveMaxModelMemoryLimit ? { effectiveMaxModelMemoryLimit } : {}), }; }; } diff --git a/x-pack/plugins/ml/server/models/job_validation/messages.js b/x-pack/plugins/ml/server/models/job_validation/messages.js index 3fd90d0a356a1..6cdbc457e6ade 100644 --- a/x-pack/plugins/ml/server/models/job_validation/messages.js +++ b/x-pack/plugins/ml/server/models/job_validation/messages.js @@ -433,6 +433,17 @@ export const getMessages = () => { } ), }, + mml_greater_than_effective_max_mml: { + status: 'WARNING', + text: i18n.translate( + 'xpack.ml.models.jobValidation.messages.mmlGreaterThanEffectiveMaxMmlMessage', + { + defaultMessage: + 'Job will not be able to run in the current cluster because model memory limit is higher than {effectiveMaxModelMemoryLimit}.', + values: { effectiveMaxModelMemoryLimit: '{{effectiveMaxModelMemoryLimit}}' }, + } + ), + }, mml_greater_than_max_mml: { status: 'ERROR', text: i18n.translate('xpack.ml.models.jobValidation.messages.mmlGreaterThanMaxMmlMessage', { diff --git a/x-pack/plugins/ml/server/models/job_validation/validate_model_memory_limit.test.ts b/x-pack/plugins/ml/server/models/job_validation/validate_model_memory_limit.test.ts index 6b5d5614325bf..bf88716181bb3 100644 --- a/x-pack/plugins/ml/server/models/job_validation/validate_model_memory_limit.test.ts +++ b/x-pack/plugins/ml/server/models/job_validation/validate_model_memory_limit.test.ts @@ -24,6 +24,7 @@ describe('ML - validateModelMemoryLimit', () => { }, limits: { max_model_memory_limit: '30mb', + effective_max_model_memory_limit: '40mb', }, }; @@ -211,6 +212,30 @@ describe('ML - validateModelMemoryLimit', () => { }); }); + it('Called with no duration or split and mml above limit, no max setting', () => { + const job = getJobConfig(); + const duration = undefined; + // @ts-ignore + job.analysis_limits.model_memory_limit = '31mb'; + + return validateModelMemoryLimit(getMockCallWithRequest(), job, duration).then(messages => { + const ids = messages.map(m => m.id); + expect(ids).toEqual([]); + }); + }); + + it('Called with no duration or split and mml above limit, no max setting, above effective max mml', () => { + const job = getJobConfig(); + const duration = undefined; + // @ts-ignore + job.analysis_limits.model_memory_limit = '41mb'; + + return validateModelMemoryLimit(getMockCallWithRequest(), job, duration).then(messages => { + const ids = messages.map(m => m.id); + expect(ids).toEqual(['mml_greater_than_effective_max_mml']); + }); + }); + it('Called with small number of detectors, so estimated mml is under specified mml, no max setting', () => { const dtrs = createDetectors(1); const job = getJobConfig(['instance'], dtrs); diff --git a/x-pack/plugins/ml/server/models/job_validation/validate_model_memory_limit.ts b/x-pack/plugins/ml/server/models/job_validation/validate_model_memory_limit.ts index 16a48addfeaf4..5c3250af6ef46 100644 --- a/x-pack/plugins/ml/server/models/job_validation/validate_model_memory_limit.ts +++ b/x-pack/plugins/ml/server/models/job_validation/validate_model_memory_limit.ts @@ -10,6 +10,7 @@ import { CombinedJob } from '../../../common/types/anomaly_detection_jobs'; import { validateJobObject } from './validate_job_object'; import { calculateModelMemoryLimitProvider } from '../calculate_model_memory_limit'; import { ALLOWED_DATA_UNITS } from '../../../common/constants/validation'; +import { MlInfoResponse } from '../../../common/types/ml_server_info'; // The minimum value the backend expects is 1MByte const MODEL_MEMORY_LIMIT_MINIMUM_BYTES = 1048576; @@ -50,9 +51,9 @@ export async function validateModelMemoryLimit( // retrieve the max_model_memory_limit value from the server // this will be unset unless the user has set this on their cluster - const maxModelMemoryLimit: string | undefined = ( - await callWithRequest('ml.info') - )?.limits?.max_model_memory_limit?.toUpperCase(); + const info = await callWithRequest('ml.info'); + const maxModelMemoryLimit = info.limits.max_model_memory_limit?.toUpperCase(); + const effectiveMaxModelMemoryLimit = info.limits.effective_max_model_memory_limit?.toUpperCase(); if (runCalcModelMemoryTest) { const { modelMemoryLimit } = await calculateModelMemoryLimitProvider(callWithRequest)( @@ -113,17 +114,35 @@ export async function validateModelMemoryLimit( // if max_model_memory_limit has been set, // make sure the user defined MML is not greater than it - if (maxModelMemoryLimit !== undefined && mml !== null) { - // @ts-ignore - const maxMmlBytes = numeral(maxModelMemoryLimit).value(); + if (mml !== null) { + let maxMmlExceeded = false; // @ts-ignore const mmlBytes = numeral(mml).value(); - if (mmlBytes > maxMmlBytes) { - messages.push({ - id: 'mml_greater_than_max_mml', - maxModelMemoryLimit, - mml, - }); + + if (maxModelMemoryLimit !== undefined) { + // @ts-ignore + const maxMmlBytes = numeral(maxModelMemoryLimit).value(); + if (mmlBytes > maxMmlBytes) { + maxMmlExceeded = true; + messages.push({ + id: 'mml_greater_than_max_mml', + maxModelMemoryLimit, + mml, + }); + } + } + + if (effectiveMaxModelMemoryLimit !== undefined && maxMmlExceeded === false) { + // @ts-ignore + const effectiveMaxMmlBytes = numeral(effectiveMaxModelMemoryLimit).value(); + if (mmlBytes > effectiveMaxMmlBytes) { + messages.push({ + id: 'mml_greater_than_effective_max_mml', + maxModelMemoryLimit, + mml, + effectiveMaxModelMemoryLimit, + }); + } } } diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index a2b4bd224e637..956dcb08e5fc1 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -10053,7 +10053,6 @@ "xpack.ml.models.jobValidation.messages.jobIdInvalidMessage": "ジョブ ID が無効です。アルファベットの小文字 (a-z と 0-9)、ハイフンまたはアンダーラインが使用でき、最初と最後を英数字にする必要があります。", "xpack.ml.models.jobValidation.messages.jobIdValidHeading": "ジョブ ID のフォーマットは有効です。", "xpack.ml.models.jobValidation.messages.jobIdValidMessage": "アルファベットの小文字 (a-z と 0-9)、ハイフンまたはアンダーライン、最初と最後を英数字にし、{maxLength, plural, one {# 文字} other {# 文字}}以内にする必要があります。", - "xpack.ml.models.jobValidation.messages.mmlGreaterThanMaxMmlMessage": "モデルメモリー制限が、このクラスターに構成された最大モデルメモリー制限を超えています。", "xpack.ml.models.jobValidation.messages.mmlValueInvalidMessage": "{mml} はモデルメモリー制限の有効な値ではありません。この値は最低 1MB で、バイト (例: 10MB) で指定する必要があります。", "xpack.ml.models.jobValidation.messages.skippedExtendedTestsMessage": "ジョブの構成の基本要件が満たされていないため、他のチェックをスキップしました。", "xpack.ml.models.jobValidation.messages.successBucketSpanHeading": "バケットスパン", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index f7caf1619f5fb..cc42647f356bf 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -10059,7 +10059,6 @@ "xpack.ml.models.jobValidation.messages.jobIdInvalidMessage": "作业 ID 无效.其可以包含小写字母数字(a-z 和 0-9)字符、连字符或下划线,且必须以字母数字字符开头和结尾。", "xpack.ml.models.jobValidation.messages.jobIdValidHeading": "作业 ID 格式有效", "xpack.ml.models.jobValidation.messages.jobIdValidMessage": "小写字母数字(a-z 和 0-9)字符、连字符或下划线,以字母数字字符开头和结尾,且长度不超过 {maxLength, plural, one {# 个字符} other {# 个字符}}。", - "xpack.ml.models.jobValidation.messages.mmlGreaterThanMaxMmlMessage": "模型内存限制大于为此集群配置的最大模型内存限制。", "xpack.ml.models.jobValidation.messages.mmlValueInvalidMessage": "{mml} 不是有效的模型内存限制值。该值需要至少 1MB,且应以字节为单位(例如 10MB)指定。", "xpack.ml.models.jobValidation.messages.skippedExtendedTestsMessage": "已跳过其他检查,因为未满足作业配置的基本要求。", "xpack.ml.models.jobValidation.messages.successBucketSpanHeading": "存储桶跨度", From 8f05cf0ecfd91e1ba4470512e9d1f26b3459cfd8 Mon Sep 17 00:00:00 2001 From: Shahzad Date: Fri, 8 May 2020 14:43:02 +0200 Subject: [PATCH 036/102] [Uptime] Enable loading on monitor list (#65670) --- .../__snapshots__/fingerprint_col.test.tsx.snap | 2 ++ .../public/components/certificates/certificates_list.tsx | 3 ++- .../public/components/certificates/fingerprint_col.tsx | 9 ++++++++- .../components/overview/monitor_list/monitor_list.tsx | 5 +---- x-pack/plugins/uptime/public/pages/certificates.tsx | 2 +- .../uptime/public/state/certificates/certificates.ts | 2 +- 6 files changed, 15 insertions(+), 8 deletions(-) diff --git a/x-pack/plugins/uptime/public/components/certificates/__tests__/__snapshots__/fingerprint_col.test.tsx.snap b/x-pack/plugins/uptime/public/components/certificates/__tests__/__snapshots__/fingerprint_col.test.tsx.snap index c9b17db5532f4..b4e5a34412212 100644 --- a/x-pack/plugins/uptime/public/components/certificates/__tests__/__snapshots__/fingerprint_col.test.tsx.snap +++ b/x-pack/plugins/uptime/public/components/certificates/__tests__/__snapshots__/fingerprint_col.test.tsx.snap @@ -36,6 +36,7 @@ Array [ class="euiToolTipAnchor" > -
- {{(hits || 0) | number:0}} - - -
+ +
; + + beforeAll(() => { + props = { + onResetQuery: jest.fn(), + showResetButton: true, + hits: 2, + }; + }); + + it('HitsCounter renders a button by providing the showResetButton property', () => { + component = mountWithIntl(); + expect(findTestSubject(component, 'resetSavedSearch').length).toBe(1); + }); + + it('HitsCounter not renders a button when the showResetButton property is false', () => { + component = mountWithIntl( + + ); + expect(findTestSubject(component, 'resetSavedSearch').length).toBe(0); + }); + + it('expect to render the number of hits', function() { + component = mountWithIntl(); + const hits = findTestSubject(component, 'discoverQueryHits'); + expect(hits.text()).toBe('2'); + }); + + it('expect to render 1,899 hits if 1899 hits given', function() { + component = mountWithIntl( + + ); + const hits = findTestSubject(component, 'discoverQueryHits'); + expect(hits.text()).toBe('1,899'); + }); + + it('should reset query', function() { + component = mountWithIntl(); + findTestSubject(component, 'resetSavedSearch').simulate('click'); + expect(props.onResetQuery).toHaveBeenCalled(); + }); +}); diff --git a/src/plugins/discover/public/application/components/hits_counter/hits_counter.tsx b/src/plugins/discover/public/application/components/hits_counter/hits_counter.tsx new file mode 100644 index 0000000000000..1d2cd12877b1c --- /dev/null +++ b/src/plugins/discover/public/application/components/hits_counter/hits_counter.tsx @@ -0,0 +1,83 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React from 'react'; +import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem, EuiText } from '@elastic/eui'; +import { FormattedMessage, I18nProvider } from '@kbn/i18n/react'; +import { i18n } from '@kbn/i18n'; +import { formatNumWithCommas } from '../../helpers'; + +export interface HitsCounterProps { + /** + * the number of query hits + */ + hits: number; + /** + * displays the reset button + */ + showResetButton: boolean; + /** + * resets the query + */ + onResetQuery: () => void; +} + +export function HitsCounter({ hits, showResetButton, onResetQuery }: HitsCounterProps) { + return ( + + + + + {formatNumWithCommas(hits)}{' '} + + + + {showResetButton && ( + + + + + + )} + + + ); +} diff --git a/src/plugins/discover/public/application/components/hits_counter/hits_counter_directive.ts b/src/plugins/discover/public/application/components/hits_counter/hits_counter_directive.ts new file mode 100644 index 0000000000000..8d45e28370cad --- /dev/null +++ b/src/plugins/discover/public/application/components/hits_counter/hits_counter_directive.ts @@ -0,0 +1,27 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import { HitsCounter } from './hits_counter'; + +export function createHitsCounterDirective(reactDirective: any) { + return reactDirective(HitsCounter, [ + ['hits', { watchDepth: 'reference' }], + ['showResetButton', { watchDepth: 'reference' }], + ['onResetQuery', { watchDepth: 'reference' }], + ]); +} diff --git a/src/plugins/discover/public/application/components/hits_counter/index.ts b/src/plugins/discover/public/application/components/hits_counter/index.ts new file mode 100644 index 0000000000000..58e7a9eda7f51 --- /dev/null +++ b/src/plugins/discover/public/application/components/hits_counter/index.ts @@ -0,0 +1,21 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +export { HitsCounter } from './hits_counter'; +export { createHitsCounterDirective } from './hits_counter_directive'; diff --git a/src/plugins/discover/public/application/helpers/format_number_with_commas.ts b/src/plugins/discover/public/application/helpers/format_number_with_commas.ts new file mode 100644 index 0000000000000..01a010d823d5f --- /dev/null +++ b/src/plugins/discover/public/application/helpers/format_number_with_commas.ts @@ -0,0 +1,27 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +const COMMA_SEPARATOR_RE = /(\d)(?=(\d{3})+(?!\d))/g; + +/** + * Converts a number to a string and adds commas + * as thousands separators + */ +export const formatNumWithCommas = (input: number) => + String(input).replace(COMMA_SEPARATOR_RE, '$1,'); diff --git a/src/plugins/discover/public/application/helpers/index.ts b/src/plugins/discover/public/application/helpers/index.ts index 7196c96989e97..3555d24924e80 100644 --- a/src/plugins/discover/public/application/helpers/index.ts +++ b/src/plugins/discover/public/application/helpers/index.ts @@ -18,3 +18,4 @@ */ export { shortenDottedString } from './shorten_dotted_string'; +export { formatNumWithCommas } from './format_number_with_commas'; diff --git a/src/plugins/discover/public/get_inner_angular.ts b/src/plugins/discover/public/get_inner_angular.ts index e7813c43383f9..8c3f4f030688c 100644 --- a/src/plugins/discover/public/get_inner_angular.ts +++ b/src/plugins/discover/public/get_inner_angular.ts @@ -57,6 +57,7 @@ import { createTopNavHelper, } from '../../kibana_legacy/public'; import { createDiscoverSidebarDirective } from './application/components/sidebar'; +import { createHitsCounterDirective } from '././application/components/hits_counter'; import { DiscoverStartPlugins } from './plugin'; /** @@ -151,6 +152,7 @@ export function initializeInnerAngularModule( .directive('fixedScroll', FixedScrollProvider) .directive('renderComplete', createRenderCompleteDirective) .directive('discoverSidebar', createDiscoverSidebarDirective) + .directive('hitsCounter', createHitsCounterDirective) .service('debounce', ['$timeout', DebounceProviderTimeout]); } From d40387161e16aa9cf8396d669c1f8478ec674442 Mon Sep 17 00:00:00 2001 From: Brian Seeders Date: Fri, 8 May 2020 11:35:17 -0400 Subject: [PATCH 041/102] Skipping failing tests. #65867 #65866 #65865 --- .../server/models/job_validation/job_validation.test.ts | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/ml/server/models/job_validation/job_validation.test.ts b/x-pack/plugins/ml/server/models/job_validation/job_validation.test.ts index 9851f80a42d5b..ca127f43d08af 100644 --- a/x-pack/plugins/ml/server/models/job_validation/job_validation.test.ts +++ b/x-pack/plugins/ml/server/models/job_validation/job_validation.test.ts @@ -290,7 +290,8 @@ describe('ML - validateJob', () => { }); }); - it('basic validation passes, extended checks return some messages', () => { + // Failing https://github.com/elastic/kibana/issues/65865 + it.skip('basic validation passes, extended checks return some messages', () => { const payload = getBasicPayload(); return validateJob(callWithRequest, payload).then(messages => { const ids = messages.map(m => m.id); @@ -303,7 +304,8 @@ describe('ML - validateJob', () => { }); }); - it('categorization job using mlcategory passes aggregatable field check', () => { + // Failing https://github.com/elastic/kibana/issues/65866 + it.skip('categorization job using mlcategory passes aggregatable field check', () => { const payload: any = { job: { job_id: 'categorization_test', @@ -369,7 +371,8 @@ describe('ML - validateJob', () => { }); }); - it('script field not reported as non aggregatable', () => { + // Failing https://github.com/elastic/kibana/issues/65867 + it.skip('script field not reported as non aggregatable', () => { const payload: any = { job: { job_id: 'categorization_test', From e79f331fb460c954dcb2d8fcf5704681f26d9f5a Mon Sep 17 00:00:00 2001 From: Andrew Goldstein Date: Fri, 8 May 2020 09:38:38 -0600 Subject: [PATCH 042/102] [SIEM] Fixes a CSS issue with Timeline field truncation (#65789) ## Summary Fixes [a CSS issue where Timeline field truncation](https://github.com/elastic/kibana/issues/65170) wasn't working, per the following screenshots: ### Before before ### After after ## Desk testing * The timeline in the _Before_ and _After_ screenshots above includes columns that typically contain large values (e.g. `process.hash.sha256`). It also contains the `event.module` column, which has special formatting, as detailed below. * You may re-create the timeline shown in the _Before_ and _After_ screenshots, or download the exported timeline from the following link [truncation.ndjson.txt](https://github.com/elastic/kibana/files/4596036/truncation.ndjson.txt) and import it. (Remove the `.txt` extension after downloading it.) * The `event.module` field has special formatting that displays an icon link to the endpoint if it's been configured. To desk test this without configuring an endpoint, edit `x-pack/plugins/siem/public/components/timeline/body/renderers/formatted_field_helpers.tsx`, and change the following line: ``` {endpointRefUrl != null && canYouAddEndpointLogo(moduleName, endpointRefUrl) && ( ``` to ``` {true && ( ``` The above change forces the icon to always appear, even if you don't have an endpoint configured. ### Desk tested in: - Chrome `81.0.4044.138` - Firefox `76.0` - Safari `13.1` --- .../body/renderers/formatted_field_helpers.tsx | 9 +++++++-- .../public/components/with_hover_actions/index.tsx | 13 +++++++++++-- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/formatted_field_helpers.tsx b/x-pack/plugins/siem/public/components/timeline/body/renderers/formatted_field_helpers.tsx index b48cc546fe78c..7c9accd4cef49 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/formatted_field_helpers.tsx +++ b/x-pack/plugins/siem/public/components/timeline/body/renderers/formatted_field_helpers.tsx @@ -7,6 +7,7 @@ import { EuiLink, EuiFlexGroup, EuiFlexItem, EuiIcon, EuiToolTip } from '@elastic/eui'; import { isString, isEmpty } from 'lodash/fp'; import React from 'react'; +import styled from 'styled-components'; import { DefaultDraggable } from '../../../draggables'; import { getEmptyTagValue } from '../../../empty_value'; @@ -18,6 +19,10 @@ import endPointSvg from '../../../../utils/logo_endpoint/64_color.svg'; import * as i18n from './translations'; +const EventModuleFlexItem = styled(EuiFlexItem)` + width: 100%; +`; + export const renderRuleName = ({ contextId, eventId, @@ -87,7 +92,7 @@ export const renderEventModule = ({ endpointRefUrl != null && !isEmpty(endpointRefUrl) ? 'flexStart' : 'spaceBetween' } > - + {content} - + {endpointRefUrl != null && canYouAddEndpointLogo(moduleName, endpointRefUrl) && ( ( const popover = useMemo(() => { return ( - ( panelPaddingSize={!alwaysShow ? 's' : 'none'} > {isOpen ? hoverContent : null} - + ); }, [content, onMouseLeave, isOpen, alwaysShow, hoverContent]); From 3a6c1ceeddfb51efed5cff163599ab17bcf78701 Mon Sep 17 00:00:00 2001 From: Matthias Wilhelm Date: Fri, 8 May 2020 17:56:28 +0200 Subject: [PATCH 043/102] [Discover] Prevent whitespace wrapping of doc table header (#52861) Co-authored-by: Dave Snider --- .../angular/doc_table/components/_table_header.scss | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/plugins/discover/public/application/angular/doc_table/components/_table_header.scss b/src/plugins/discover/public/application/angular/doc_table/components/_table_header.scss index 099286f8c875c..9ea4e21632ace 100644 --- a/src/plugins/discover/public/application/angular/doc_table/components/_table_header.scss +++ b/src/plugins/discover/public/application/angular/doc_table/components/_table_header.scss @@ -1,3 +1,6 @@ +.kbnDocTableHeader { + white-space: nowrap; +} .kbnDocTableHeader button { margin-left: $euiSizeXS; } From 97561d6751a6f864d06697800a8fbf0d39d05966 Mon Sep 17 00:00:00 2001 From: Matthew Kime Date: Fri, 8 May 2020 11:53:42 -0500 Subject: [PATCH 044/102] restore index pattern management data-test-subj's (#64697) * restore index pattern management data-test-subj's --- .../edit_index_pattern/tabs/utils.ts | 3 +++ test/functional/page_objects/settings_page.ts | 16 +++++++--------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/tabs/utils.ts b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/tabs/utils.ts index bdb1436c37efb..83335a6fabfeb 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/tabs/utils.ts +++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/tabs/utils.ts @@ -96,18 +96,21 @@ export function getTabs( tabs.push({ name: getTitle('indexed', filteredCount, totalCount), id: TAB_INDEXED_FIELDS, + 'data-test-subj': 'tab-indexedFields', }); if (indexPatternListProvider.areScriptedFieldsEnabled(indexPattern)) { tabs.push({ name: getTitle('scripted', filteredCount, totalCount), id: TAB_SCRIPTED_FIELDS, + 'data-test-subj': 'tab-scriptedFields', }); } tabs.push({ name: getTitle('sourceFilters', filteredCount, totalCount), id: TAB_SOURCE_FILTERS, + 'data-test-subj': 'tab-sourceFilters', }); return tabs; diff --git a/test/functional/page_objects/settings_page.ts b/test/functional/page_objects/settings_page.ts index 8175361ffc842..b8069b31257d3 100644 --- a/test/functional/page_objects/settings_page.ts +++ b/test/functional/page_objects/settings_page.ts @@ -206,17 +206,15 @@ export function SettingsPageProvider({ getService, getPageObjects }: FtrProvider async getFieldsTabCount() { return retry.try(async () => { - const indexedFieldsTab = await find.byCssSelector('#indexedFields .euiTab__content'); - const text = await indexedFieldsTab.getVisibleText(); - return text.split(/[()]/)[1]; + const text = await testSubjects.getVisibleText('tab-indexedFields'); + return text.split(' ')[1].replace(/\((.*)\)/, '$1'); }); } async getScriptedFieldsTabCount() { return await retry.try(async () => { - const scriptedFieldsTab = await find.byCssSelector('#scriptedFields .euiTab__content'); - const text = await scriptedFieldsTab.getVisibleText(); - return text.split(/[()]/)[1]; + const text = await testSubjects.getVisibleText('tab-scriptedFields'); + return text.split(' ')[2].replace(/\((.*)\)/, '$1'); }); } @@ -431,17 +429,17 @@ export function SettingsPageProvider({ getService, getPageObjects }: FtrProvider async clickFieldsTab() { log.debug('click Fields tab'); - await find.clickByCssSelector('#indexedFields'); + await testSubjects.click('tab-indexedFields'); } async clickScriptedFieldsTab() { log.debug('click Scripted Fields tab'); - await find.clickByCssSelector('#scriptedFields'); + await testSubjects.click('tab-scriptedFields'); } async clickSourceFiltersTab() { log.debug('click Source Filters tab'); - await find.clickByCssSelector('#sourceFilters'); + await testSubjects.click('tab-sourceFilters'); } async editScriptedField(name: string) { From d3b155f8437f1cf2dbe09ba30f667231dce386e0 Mon Sep 17 00:00:00 2001 From: Quynh Nguyen <43350163+qn895@users.noreply.github.com> Date: Fri, 8 May 2020 12:06:59 -0500 Subject: [PATCH 045/102] [ML] Add job timing stats to anomaly jobs (#65696) * [ML] Add anomaly job timing stats to Counts & JSON * [ML] Remove roundTo3DecimalPlace and clean up * [ML] Fix format_values to round decimals for time values * [ML] Remove timing_stats and forecast_stats from cloneJob * [ML] Remove timing_stats & forecasts in job_service instead of utils --- .../components/job_details/extract_job_details.js | 10 ++++++++++ .../jobs_list/components/job_details/format_values.js | 6 ++++++ .../jobs_list/components/job_details/job_details.js | 3 ++- .../ml/public/application/services/job_service.js | 2 ++ x-pack/plugins/ml/server/models/job_service/jobs.ts | 6 ++---- 5 files changed, 22 insertions(+), 5 deletions(-) diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/extract_job_details.js b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/extract_job_details.js index f7b0e726ecc53..fa36a0626d632 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/extract_job_details.js +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/extract_job_details.js @@ -165,6 +165,15 @@ export function extractJobDetails(job) { items: filterObjects(job.model_size_stats).map(formatValues), }; + const jobTimingStats = { + id: 'jobTimingStats', + title: i18n.translate('xpack.ml.jobsList.jobDetails.jobTimingStatsTitle', { + defaultMessage: 'Job timing stats', + }), + position: 'left', + items: filterObjects(job.timing_stats).map(formatValues), + }; + const datafeedTimingStats = { id: 'datafeedTimingStats', title: i18n.translate('xpack.ml.jobsList.jobDetails.datafeedTimingStatsTitle', { @@ -192,6 +201,7 @@ export function extractJobDetails(job) { datafeed, counts, modelSizeStats, + jobTimingStats, datafeedTimingStats, }; } diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/format_values.js b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/format_values.js index 9984f3be299ae..246a476517ace 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/format_values.js +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/format_values.js @@ -63,6 +63,12 @@ export function formatValues([key, value]) { // numbers rounded to 3 decimal places case 'average_search_time_per_bucket_ms': case 'exponential_average_search_time_per_hour_ms': + case 'total_bucket_processing_time_ms': + case 'minimum_bucket_processing_time_ms': + case 'maximum_bucket_processing_time_ms': + case 'average_bucket_processing_time_ms': + case 'exponential_average_bucket_processing_time_ms': + case 'exponential_average_bucket_processing_time_per_hour_ms': value = typeof value === 'number' ? roundToDecimalPlace(value, 3).toLocaleString() : value; break; diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/job_details.js b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/job_details.js index e3f348ad32b0c..0375997b86bb8 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/job_details.js +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/job_details/job_details.js @@ -60,6 +60,7 @@ export class JobDetails extends Component { datafeed, counts, modelSizeStats, + jobTimingStats, datafeedTimingStats, } = extractJobDetails(job); @@ -102,7 +103,7 @@ export class JobDetails extends Component { content: ( ), }, diff --git a/x-pack/plugins/ml/public/application/services/job_service.js b/x-pack/plugins/ml/public/application/services/job_service.js index bbfec49ac1388..fb75476c48fa3 100644 --- a/x-pack/plugins/ml/public/application/services/job_service.js +++ b/x-pack/plugins/ml/public/application/services/job_service.js @@ -369,6 +369,8 @@ class JobService { delete tempJob.open_time; delete tempJob.established_model_memory; delete tempJob.calendars; + delete tempJob.timing_stats; + delete tempJob.forecasts_stats; delete tempJob.analysis_config.use_per_partition_normalization; diff --git a/x-pack/plugins/ml/server/models/job_service/jobs.ts b/x-pack/plugins/ml/server/models/job_service/jobs.ts index 6024ecf4925e6..225cd43e411a4 100644 --- a/x-pack/plugins/ml/server/models/job_service/jobs.ts +++ b/x-pack/plugins/ml/server/models/job_service/jobs.ts @@ -328,7 +328,7 @@ export function jobsProvider(callAsCurrentUser: APICaller) { // create jobs objects containing job stats, datafeeds, datafeed stats and calendars if (jobResults && jobResults.jobs) { jobResults.jobs.forEach(job => { - const tempJob = job as CombinedJobWithStats; + let tempJob = job as CombinedJobWithStats; const calendars: string[] = [ ...(calendarsByJobId[tempJob.job_id] || []), @@ -341,9 +341,7 @@ export function jobsProvider(callAsCurrentUser: APICaller) { if (jobStatsResults && jobStatsResults.jobs) { const jobStats = jobStatsResults.jobs.find(js => js.job_id === tempJob.job_id); if (jobStats !== undefined) { - tempJob.state = jobStats.state; - tempJob.data_counts = jobStats.data_counts; - tempJob.model_size_stats = jobStats.model_size_stats; + tempJob = { ...tempJob, ...jobStats }; if (jobStats.node) { tempJob.node = jobStats.node; } From 1c6e6cb7b7a3ac7522691989881cd74fd3b17992 Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Fri, 8 May 2020 10:55:43 -0700 Subject: [PATCH 046/102] [Metrics UI] Fix p95/p99 charts and alerting error (#65579) * [Metrics UI] Fix p95/p99 charts and alerting error - Fixes #65561 * Fixing open in visualize for percentiles * Adding test for P95; refactoring to use first consitently --- .../components/expression_chart.tsx | 5 +- .../components/expression_row.tsx | 16 ++++++ .../public/alerting/metric_threshold/types.ts | 2 + .../components/helpers/create_tsvb_link.ts | 18 +++++++ .../components/series_chart.tsx | 19 ++++--- .../create_percentile_aggregation.ts | 22 ++++++++ .../metric_threshold_executor.test.ts | 52 +++++++++++++++++++ .../metric_threshold_executor.ts | 18 +++++-- .../alerting/metric_threshold/test_mocks.ts | 8 +-- .../lib/alerting/metric_threshold/types.ts | 2 + 10 files changed, 144 insertions(+), 18 deletions(-) create mode 100644 x-pack/plugins/infra/server/lib/alerting/metric_threshold/create_percentile_aggregation.ts diff --git a/x-pack/plugins/infra/public/alerting/metric_threshold/components/expression_chart.tsx b/x-pack/plugins/infra/public/alerting/metric_threshold/components/expression_chart.tsx index 82e751627a05b..77147d1b3b2b7 100644 --- a/x-pack/plugins/infra/public/alerting/metric_threshold/components/expression_chart.tsx +++ b/x-pack/plugins/infra/public/alerting/metric_threshold/components/expression_chart.tsx @@ -118,10 +118,7 @@ export const ExpressionChart: React.FC = ({ const series = { ...firstSeries, rows: firstSeries.rows.map(row => { - const newRow: MetricsExplorerRow = { - timestamp: row.timestamp, - metric_0: row.metric_0 || null, - }; + const newRow: MetricsExplorerRow = { ...row }; thresholds.forEach((thresholdValue, index) => { newRow[`metric_threshold_${index}`] = thresholdValue; }); diff --git a/x-pack/plugins/infra/public/alerting/metric_threshold/components/expression_row.tsx b/x-pack/plugins/infra/public/alerting/metric_threshold/components/expression_row.tsx index 8801df380b48d..be0f5f88a2b55 100644 --- a/x-pack/plugins/infra/public/alerting/metric_threshold/components/expression_row.tsx +++ b/x-pack/plugins/infra/public/alerting/metric_threshold/components/expression_row.tsx @@ -234,4 +234,20 @@ export const aggregationType: { [key: string]: any } = { value: AGGREGATION_TYPES.SUM, validNormalizedTypes: ['number'], }, + p95: { + text: i18n.translate('xpack.infra.metrics.alertFlyout.aggregationText.p95', { + defaultMessage: '95th Percentile', + }), + fieldRequired: false, + value: AGGREGATION_TYPES.P95, + validNormalizedTypes: ['number'], + }, + p99: { + text: i18n.translate('xpack.infra.metrics.alertFlyout.aggregationText.p99', { + defaultMessage: '99th Percentile', + }), + fieldRequired: false, + value: AGGREGATION_TYPES.P99, + validNormalizedTypes: ['number'], + }, }; diff --git a/x-pack/plugins/infra/public/alerting/metric_threshold/types.ts b/x-pack/plugins/infra/public/alerting/metric_threshold/types.ts index af3baf191bed2..e421455cf6efd 100644 --- a/x-pack/plugins/infra/public/alerting/metric_threshold/types.ts +++ b/x-pack/plugins/infra/public/alerting/metric_threshold/types.ts @@ -29,6 +29,8 @@ export enum AGGREGATION_TYPES { MAX = 'max', RATE = 'rate', CARDINALITY = 'cardinality', + P95 = 'p95', + P99 = 'p99', } export interface MetricThresholdAlertParams { diff --git a/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/components/helpers/create_tsvb_link.ts b/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/components/helpers/create_tsvb_link.ts index 559422584f579..f773c843d12fd 100644 --- a/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/components/helpers/create_tsvb_link.ts +++ b/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/components/helpers/create_tsvb_link.ts @@ -46,6 +46,24 @@ export const metricsExplorerMetricToTSVBMetric = (metric: MetricsExplorerOptions field: derivativeId, }, ]; + } else if (metric.aggregation === 'p95' || metric.aggregation === 'p99') { + const percentileValue = metric.aggregation === 'p95' ? '95' : '99'; + return [ + { + id: uuid.v1(), + type: 'percentile', + field: metric.field, + percentiles: [ + { + id: uuid.v1(), + value: percentileValue, + mode: 'line', + percentile: '', + shade: 0.2, + }, + ], + }, + ]; } else { return [ { diff --git a/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/components/series_chart.tsx b/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/components/series_chart.tsx index 3b84fcbc34836..223318da8cf46 100644 --- a/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/components/series_chart.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/components/series_chart.tsx @@ -20,6 +20,7 @@ import { MetricsExplorerOptionsMetric, MetricsExplorerChartType, } from '../hooks/use_metrics_explorer_options'; +import { getMetricId } from './helpers/get_metric_id'; type NumberOrString = string | number; @@ -45,10 +46,12 @@ export const MetricsExplorerAreaChart = ({ metric, id, series, type, stack, opac colorTransformer(MetricsExplorerColor.color0); const yAccessors = Array.isArray(id) - ? id.map(i => `metric_${i}`).slice(id.length - 1, id.length) - : [`metric_${id}`]; + ? id.map(i => getMetricId(metric, i)).slice(id.length - 1, id.length) + : [getMetricId(metric, id)]; const y0Accessors = - Array.isArray(id) && id.length > 1 ? id.map(i => `metric_${i}`).slice(0, 1) : undefined; + Array.isArray(id) && id.length > 1 + ? id.map(i => getMetricId(metric, i)).slice(0, 1) + : undefined; const chartId = `series-${series.id}-${yAccessors.join('-')}`; const seriesAreaStyle: RecursivePartial = { @@ -85,8 +88,10 @@ export const MetricsExplorerBarChart = ({ metric, id, series, stack }: Props) => (metric.color && colorTransformer(metric.color)) || colorTransformer(MetricsExplorerColor.color0); - const yAccessor = `metric_${id}`; - const chartId = `series-${series.id}-${yAccessor}`; + const yAccessors = Array.isArray(id) + ? id.map(i => getMetricId(metric, i)).slice(id.length - 1, id.length) + : [getMetricId(metric, id)]; + const chartId = `series-${series.id}-${yAccessors.join('-')}`; const seriesBarStyle: RecursivePartial = { rectBorder: { @@ -100,13 +105,13 @@ export const MetricsExplorerBarChart = ({ metric, id, series, stack }: Props) => }; return ( { + const value = type === Aggregators.P95 ? 95 : 99; + return { + aggregatedValue: { + percentiles: { + field, + percents: [value], + keyed: false, + }, + }, + }; +}; diff --git a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.test.ts b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.test.ts index 2531e939792af..ed5efc1473953 100644 --- a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.test.ts +++ b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.test.ts @@ -233,6 +233,58 @@ describe('The metric threshold alert type', () => { expect(getState(instanceID).alertState).toBe(AlertStates.OK); }); }); + describe('querying with the p99 aggregator', () => { + const instanceID = 'test-*'; + const execute = (comparator: Comparator, threshold: number[]) => + executor({ + services, + params: { + criteria: [ + { + ...baseCriterion, + comparator, + threshold, + aggType: 'p99', + metric: 'test.metric.2', + }, + ], + }, + }); + test('alerts based on the p99 values', async () => { + await execute(Comparator.GT, [1]); + expect(mostRecentAction(instanceID).id).toBe(FIRED_ACTIONS.id); + expect(getState(instanceID).alertState).toBe(AlertStates.ALERT); + await execute(Comparator.LT, [1]); + expect(mostRecentAction(instanceID)).toBe(undefined); + expect(getState(instanceID).alertState).toBe(AlertStates.OK); + }); + }); + describe('querying with the p95 aggregator', () => { + const instanceID = 'test-*'; + const execute = (comparator: Comparator, threshold: number[]) => + executor({ + services, + params: { + criteria: [ + { + ...baseCriterion, + comparator, + threshold, + aggType: 'p95', + metric: 'test.metric.1', + }, + ], + }, + }); + test('alerts based on the p95 values', async () => { + await execute(Comparator.GT, [0.25]); + expect(mostRecentAction(instanceID).id).toBe(FIRED_ACTIONS.id); + expect(getState(instanceID).alertState).toBe(AlertStates.ALERT); + await execute(Comparator.LT, [0.95]); + expect(mostRecentAction(instanceID)).toBe(undefined); + expect(getState(instanceID).alertState).toBe(AlertStates.OK); + }); + }); describe("querying a metric that hasn't reported data", () => { const instanceID = 'test-*'; const execute = (alertOnNoData: boolean) => diff --git a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.ts b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.ts index ec9389537835b..71bee3209bf53 100644 --- a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.ts +++ b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.ts @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import { mapValues } from 'lodash'; +import { mapValues, first } from 'lodash'; import { i18n } from '@kbn/i18n'; import { InfraDatabaseSearchResponse } from '../../adapters/framework/adapter_types'; import { createAfterKeyHandler } from '../../../utils/create_afterkey_handler'; @@ -21,12 +21,16 @@ import { AlertServices, AlertExecutorOptions } from '../../../../../alerting/ser import { getIntervalInSeconds } from '../../../utils/get_interval_in_seconds'; import { getDateHistogramOffset } from '../../snapshot/query_helpers'; import { InfraBackendLibs } from '../../infra_types'; +import { createPercentileAggregation } from './create_percentile_aggregation'; const TOTAL_BUCKETS = 5; interface Aggregation { aggregatedIntervals: { - buckets: Array<{ aggregatedValue: { value: number }; doc_count: number }>; + buckets: Array<{ + aggregatedValue: { value: number; values?: Array<{ key: number; value: number }> }; + doc_count: number; + }>; }; } @@ -47,6 +51,12 @@ const getCurrentValueFromAggregations = ( if (aggType === Aggregators.COUNT) { return mostRecentBucket.doc_count; } + if (aggType === Aggregators.P95 || aggType === Aggregators.P99) { + const values = mostRecentBucket.aggregatedValue?.values || []; + const firstValue = first(values); + if (!firstValue) return null; + return firstValue.value; + } const { value } = mostRecentBucket.aggregatedValue; return value; } catch (e) { @@ -86,6 +96,8 @@ export const getElasticsearchMetricQuery = ( ? {} : aggType === Aggregators.RATE ? networkTraffic('aggregatedValue', metric) + : aggType === Aggregators.P95 || aggType === Aggregators.P99 + ? createPercentileAggregation(aggType, metric) : { aggregatedValue: { [aggType]: { @@ -275,7 +287,7 @@ export const createMetricThresholdExecutor = (libs: InfraBackendLibs, alertId: s ); // Because each alert result has the same group definitions, just grap the groups from the first one. - const groups = Object.keys(alertResults[0]); + const groups = Object.keys(first(alertResults)); for (const group of groups) { const alertInstance = services.alertInstanceFactory(`${alertId}-${group}`); diff --git a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/test_mocks.ts b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/test_mocks.ts index fa55f80e472de..25b709d6afc51 100644 --- a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/test_mocks.ts +++ b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/test_mocks.ts @@ -7,22 +7,22 @@ const bucketsA = [ { doc_count: 2, - aggregatedValue: { value: 0.5 }, + aggregatedValue: { value: 0.5, values: [{ key: 95.0, value: 0.5 }] }, }, { doc_count: 3, - aggregatedValue: { value: 1.0 }, + aggregatedValue: { value: 1.0, values: [{ key: 95.0, value: 1.0 }] }, }, ]; const bucketsB = [ { doc_count: 4, - aggregatedValue: { value: 2.5 }, + aggregatedValue: { value: 2.5, values: [{ key: 99.0, value: 2.5 }] }, }, { doc_count: 5, - aggregatedValue: { value: 3.5 }, + aggregatedValue: { value: 3.5, values: [{ key: 99.0, value: 3.5 }] }, }, ]; diff --git a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/types.ts b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/types.ts index 18f5503fe2c9e..76ddd107bd728 100644 --- a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/types.ts +++ b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/types.ts @@ -23,6 +23,8 @@ export enum Aggregators { MAX = 'max', RATE = 'rate', CARDINALITY = 'cardinality', + P95 = 'p95', + P99 = 'p99', } export enum AlertStates { From 808e02564b67a89b9098c098eb57af841afd7152 Mon Sep 17 00:00:00 2001 From: Christos Nasikas Date: Fri, 8 May 2020 21:24:44 +0300 Subject: [PATCH 047/102] [SIEM][CASE] Moves functional tests from "legacyEs" to "Es" (#65851) --- .../basic/tests/configure/get_configure.ts | 2 +- .../basic/tests/configure/patch_configure.ts | 2 +- .../basic/tests/configure/post_configure.ts | 2 +- x-pack/test/case_api_integration/common/lib/utils.ts | 7 ++++--- 4 files changed, 7 insertions(+), 6 deletions(-) diff --git a/x-pack/test/case_api_integration/basic/tests/configure/get_configure.ts b/x-pack/test/case_api_integration/basic/tests/configure/get_configure.ts index a9fc2706a6ba2..930cf42b9efc5 100644 --- a/x-pack/test/case_api_integration/basic/tests/configure/get_configure.ts +++ b/x-pack/test/case_api_integration/basic/tests/configure/get_configure.ts @@ -18,7 +18,7 @@ import { // eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext): void => { const supertest = getService('supertest'); - const es = getService('legacyEs'); + const es = getService('es'); describe('get_configure', () => { afterEach(async () => { diff --git a/x-pack/test/case_api_integration/basic/tests/configure/patch_configure.ts b/x-pack/test/case_api_integration/basic/tests/configure/patch_configure.ts index d66baa2a2eee2..5f7d7c4c5c346 100644 --- a/x-pack/test/case_api_integration/basic/tests/configure/patch_configure.ts +++ b/x-pack/test/case_api_integration/basic/tests/configure/patch_configure.ts @@ -18,7 +18,7 @@ import { // eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext): void => { const supertest = getService('supertest'); - const es = getService('legacyEs'); + const es = getService('es'); describe('post_configure', () => { afterEach(async () => { diff --git a/x-pack/test/case_api_integration/basic/tests/configure/post_configure.ts b/x-pack/test/case_api_integration/basic/tests/configure/post_configure.ts index c2284492e5b77..86214a2bd3187 100644 --- a/x-pack/test/case_api_integration/basic/tests/configure/post_configure.ts +++ b/x-pack/test/case_api_integration/basic/tests/configure/post_configure.ts @@ -18,7 +18,7 @@ import { // eslint-disable-next-line import/no-default-export export default ({ getService }: FtrProviderContext): void => { const supertest = getService('supertest'); - const es = getService('legacyEs'); + const es = getService('es'); describe('post_configure', () => { afterEach(async () => { diff --git a/x-pack/test/case_api_integration/common/lib/utils.ts b/x-pack/test/case_api_integration/common/lib/utils.ts index 6d0db69309b90..df768ff09b368 100644 --- a/x-pack/test/case_api_integration/common/lib/utils.ts +++ b/x-pack/test/case_api_integration/common/lib/utils.ts @@ -4,6 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ +import { Client } from '@elastic/elasticsearch'; import { CasesConfigureRequest, CasesConfigureResponse } from '../../../../plugins/case/common/api'; export const getConfiguration = (connector_id: string = 'connector-1'): CasesConfigureRequest => { @@ -29,12 +30,12 @@ export const removeServerGeneratedPropertiesFromConfigure = ( return rest; }; -export const deleteConfiguration = async (es: any): Promise => { +export const deleteConfiguration = async (es: Client): Promise => { await es.deleteByQuery({ index: '.kibana', q: 'type:cases-configure', - waitForCompletion: true, - refresh: 'wait_for', + wait_for_completion: true, + refresh: true, body: {}, }); }; From 4d3261083b30567ff81b3fa132259872c27eaab9 Mon Sep 17 00:00:00 2001 From: Frank Hassanabad Date: Fri, 8 May 2020 13:26:31 -0600 Subject: [PATCH 048/102] [SIEM][Detection Engine] Increases the template limit for ECS mappings ## Summary Increases the template limit for ECS mappings from default of 1k to 10k. This mirrors auditbeat, winlogbeat, filebeat, etc.. - [x] [Unit or functional tests](https://github.com/elastic/kibana/blob/master/CONTRIBUTING.md#cross-browser-compatibility) were updated or added to match the most common scenarios ### For maintainers --- .../routes/index/get_signals_template.test.ts | 17 +++++++++++++++-- .../routes/index/get_signals_template.ts | 5 +++++ 2 files changed, 20 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/index/get_signals_template.test.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/index/get_signals_template.test.ts index 80594ca74a353..30362392898d1 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/index/get_signals_template.test.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/index/get_signals_template.test.ts @@ -7,10 +7,18 @@ import { getSignalsTemplate } from './get_signals_template'; describe('get_signals_template', () => { - test('it should set the lifecycle name and the rollover alias to be the name of the index passed in', () => { + test('it should set the lifecycle "name" and "rollover_alias" to be the name of the index passed in', () => { const template = getSignalsTemplate('test-index'); expect(template.settings).toEqual({ - index: { lifecycle: { name: 'test-index', rollover_alias: 'test-index' } }, + index: { + lifecycle: { + name: 'test-index', + rollover_alias: 'test-index', + }, + }, + mapping: { + total_fields: { limit: 10000 }, + }, }); }); @@ -28,4 +36,9 @@ describe('get_signals_template', () => { const template = getSignalsTemplate('test-index'); expect(typeof template.mappings.properties.signal).toEqual('object'); }); + + test('it should have a "total_fields" section that is at least 10k in size', () => { + const template = getSignalsTemplate('test-index'); + expect(template.settings.mapping.total_fields.limit).toBeGreaterThanOrEqual(10000); + }); }); diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/index/get_signals_template.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/index/get_signals_template.ts index c6580f0bdda42..01d7182e253ce 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/index/get_signals_template.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/index/get_signals_template.ts @@ -17,6 +17,11 @@ export const getSignalsTemplate = (index: string) => { rollover_alias: index, }, }, + mapping: { + total_fields: { + limit: 10000, + }, + }, }, index_patterns: [`${index}-*`], mappings: ecsMapping.mappings, From 04f37364fd228ab429bede7eb13768e4ed7f264b Mon Sep 17 00:00:00 2001 From: Nathan L Smith Date: Fri, 8 May 2020 16:16:15 -0500 Subject: [PATCH 049/102] Fix anomalies display on focused APM service map (#65882) The map anomlies rings display was working on the global map and on the focused service of a focused map, but not on the other services on a focused map. This is because we were adding the anomlies to the list of services from the initial query, but not to the list of services derived from the connections data. Make the transformation that add anomalies happen after the derived services nodes are added. This is done in the function that was called `dedupeConnections`, but since it does much more than dedupe connections has been renamed to `transformServiceMapResponses`. Also make the node types extend `cytoscape.NodeDataDefinition` in order to simplify the types in the transformation (we were adding `& { id: string }` in some places which this replaces.) Fixes #65403. --- x-pack/plugins/apm/common/service_map.ts | 9 +-- .../server/lib/service_map/get_service_map.ts | 17 ++--- .../server/lib/service_map/ml_helpers.test.ts | 12 ++-- .../apm/server/lib/service_map/ml_helpers.ts | 9 +-- ...> transform_service_map_responses.test.ts} | 37 +++++++---- ....ts => transform_service_map_responses.ts} | 66 +++++++++++-------- 6 files changed, 85 insertions(+), 65 deletions(-) rename x-pack/plugins/apm/server/lib/service_map/{dedupe_connections/index.test.ts => transform_service_map_responses.test.ts} (83%) rename x-pack/plugins/apm/server/lib/service_map/{dedupe_connections/index.ts => transform_service_map_responses.ts} (76%) diff --git a/x-pack/plugins/apm/common/service_map.ts b/x-pack/plugins/apm/common/service_map.ts index dc457c38a52af..87db0005fb656 100644 --- a/x-pack/plugins/apm/common/service_map.ts +++ b/x-pack/plugins/apm/common/service_map.ts @@ -5,22 +5,23 @@ */ import { i18n } from '@kbn/i18n'; +import cytoscape from 'cytoscape'; import { ILicense } from '../../licensing/public'; import { AGENT_NAME, SERVICE_ENVIRONMENT, SERVICE_NAME, + SPAN_DESTINATION_SERVICE_RESOURCE, SPAN_SUBTYPE, - SPAN_TYPE, - SPAN_DESTINATION_SERVICE_RESOURCE + SPAN_TYPE } from './elasticsearch_fieldnames'; -export interface ServiceConnectionNode { +export interface ServiceConnectionNode extends cytoscape.NodeDataDefinition { [SERVICE_NAME]: string; [SERVICE_ENVIRONMENT]: string | null; [AGENT_NAME]: string; } -export interface ExternalConnectionNode { +export interface ExternalConnectionNode extends cytoscape.NodeDataDefinition { [SPAN_DESTINATION_SERVICE_RESOURCE]: string; [SPAN_TYPE]: string; [SPAN_SUBTYPE]: string; diff --git a/x-pack/plugins/apm/server/lib/service_map/get_service_map.ts b/x-pack/plugins/apm/server/lib/service_map/get_service_map.ts index 7d5f0a75d2208..8fb44b70bc081 100644 --- a/x-pack/plugins/apm/server/lib/service_map/get_service_map.ts +++ b/x-pack/plugins/apm/server/lib/service_map/get_service_map.ts @@ -9,16 +9,15 @@ import { SERVICE_ENVIRONMENT, SERVICE_NAME } from '../../../common/elasticsearch_fieldnames'; +import { getMlIndex } from '../../../common/ml_job_constants'; import { getServicesProjection } from '../../../common/projections/services'; import { mergeProjection } from '../../../common/projections/util/merge_projection'; import { PromiseReturnType } from '../../../typings/common'; +import { rangeFilter } from '../helpers/range_filter'; import { Setup, SetupTimeRange } from '../helpers/setup_request'; -import { dedupeConnections } from './dedupe_connections'; +import { transformServiceMapResponses } from './transform_service_map_responses'; import { getServiceMapFromTraceIds } from './get_service_map_from_trace_ids'; import { getTraceSampleIds } from './get_trace_sample_ids'; -import { addAnomaliesToServicesData } from './ml_helpers'; -import { getMlIndex } from '../../../common/ml_job_constants'; -import { rangeFilter } from '../helpers/range_filter'; export interface IEnvOptions { setup: Setup & SetupTimeRange; @@ -179,13 +178,9 @@ export async function getServiceMap(options: IEnvOptions) { getAnomaliesData(options) ]); - const servicesDataWithAnomalies = addAnomaliesToServicesData( - servicesData, - anomaliesData - ); - - return dedupeConnections({ + return transformServiceMapResponses({ ...connectionData, - services: servicesDataWithAnomalies + anomalies: anomaliesData, + services: servicesData }); } diff --git a/x-pack/plugins/apm/server/lib/service_map/ml_helpers.test.ts b/x-pack/plugins/apm/server/lib/service_map/ml_helpers.test.ts index c80ba8dba01ea..908dbe6df4636 100644 --- a/x-pack/plugins/apm/server/lib/service_map/ml_helpers.test.ts +++ b/x-pack/plugins/apm/server/lib/service_map/ml_helpers.test.ts @@ -5,11 +5,11 @@ */ import { AnomaliesResponse } from './get_service_map'; -import { addAnomaliesToServicesData } from './ml_helpers'; +import { addAnomaliesDataToNodes } from './ml_helpers'; -describe('addAnomaliesToServicesData', () => { - it('adds anomalies to services data', () => { - const servicesData = [ +describe('addAnomaliesDataToNodes', () => { + it('adds anomalies to nodes', () => { + const nodes = [ { 'service.name': 'opbeans-ruby', 'agent.name': 'ruby', @@ -89,8 +89,8 @@ describe('addAnomaliesToServicesData', () => { ]; expect( - addAnomaliesToServicesData( - servicesData, + addAnomaliesDataToNodes( + nodes, (anomaliesResponse as unknown) as AnomaliesResponse ) ).toEqual(result); diff --git a/x-pack/plugins/apm/server/lib/service_map/ml_helpers.ts b/x-pack/plugins/apm/server/lib/service_map/ml_helpers.ts index 9789911660bd0..fae9e7d4cb1c6 100644 --- a/x-pack/plugins/apm/server/lib/service_map/ml_helpers.ts +++ b/x-pack/plugins/apm/server/lib/service_map/ml_helpers.ts @@ -9,10 +9,11 @@ import { getMlJobServiceName, getSeverity } from '../../../common/ml_job_constants'; -import { AnomaliesResponse, ServicesResponse } from './get_service_map'; +import { ConnectionNode } from '../../../common/service_map'; +import { AnomaliesResponse } from './get_service_map'; -export function addAnomaliesToServicesData( - servicesData: ServicesResponse, +export function addAnomaliesDataToNodes( + nodes: ConnectionNode[], anomaliesResponse: AnomaliesResponse ) { const anomaliesMap = ( @@ -52,7 +53,7 @@ export function addAnomaliesToServicesData( }; }, {}); - const servicesDataWithAnomalies = servicesData.map(service => { + const servicesDataWithAnomalies = nodes.map(service => { const serviceAnomalies = anomaliesMap[service[SERVICE_NAME]]; if (serviceAnomalies) { const maxScore = serviceAnomalies.max_score; diff --git a/x-pack/plugins/apm/server/lib/service_map/dedupe_connections/index.test.ts b/x-pack/plugins/apm/server/lib/service_map/transform_service_map_responses.test.ts similarity index 83% rename from x-pack/plugins/apm/server/lib/service_map/dedupe_connections/index.test.ts rename to x-pack/plugins/apm/server/lib/service_map/transform_service_map_responses.test.ts index 4af8a54139204..45b64c1ad03a4 100644 --- a/x-pack/plugins/apm/server/lib/service_map/dedupe_connections/index.test.ts +++ b/x-pack/plugins/apm/server/lib/service_map/transform_service_map_responses.test.ts @@ -4,16 +4,19 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ServiceMapResponse } from './'; import { - SPAN_DESTINATION_SERVICE_RESOURCE, - SERVICE_NAME, - SERVICE_ENVIRONMENT, AGENT_NAME, - SPAN_TYPE, - SPAN_SUBTYPE -} from '../../../../common/elasticsearch_fieldnames'; -import { dedupeConnections } from './'; + SERVICE_ENVIRONMENT, + SERVICE_NAME, + SPAN_DESTINATION_SERVICE_RESOURCE, + SPAN_SUBTYPE, + SPAN_TYPE +} from '../../../common/elasticsearch_fieldnames'; +import { AnomaliesResponse } from './get_service_map'; +import { + transformServiceMapResponses, + ServiceMapResponse +} from './transform_service_map_responses'; const nodejsService = { [SERVICE_NAME]: 'opbeans-node', @@ -33,9 +36,14 @@ const javaService = { [AGENT_NAME]: 'java' }; -describe('dedupeConnections', () => { +const anomalies = ({ + aggregations: { jobs: { buckets: [] } } +} as unknown) as AnomaliesResponse; + +describe('transformServiceMapResponses', () => { it('maps external destinations to internal services', () => { const response: ServiceMapResponse = { + anomalies, services: [nodejsService, javaService], discoveredServices: [ { @@ -51,7 +59,7 @@ describe('dedupeConnections', () => { ] }; - const { elements } = dedupeConnections(response); + const { elements } = transformServiceMapResponses(response); const connection = elements.find( element => 'source' in element.data && 'target' in element.data @@ -67,6 +75,7 @@ describe('dedupeConnections', () => { it('collapses external destinations based on span.destination.resource.name', () => { const response: ServiceMapResponse = { + anomalies, services: [nodejsService, javaService], discoveredServices: [ { @@ -89,7 +98,7 @@ describe('dedupeConnections', () => { ] }; - const { elements } = dedupeConnections(response); + const { elements } = transformServiceMapResponses(response); const connections = elements.filter(element => 'source' in element.data); @@ -102,6 +111,7 @@ describe('dedupeConnections', () => { it('picks the first span.type/subtype in an alphabetically sorted list', () => { const response: ServiceMapResponse = { + anomalies, services: [javaService], discoveredServices: [], connections: [ @@ -126,7 +136,7 @@ describe('dedupeConnections', () => { ] }; - const { elements } = dedupeConnections(response); + const { elements } = transformServiceMapResponses(response); const nodes = elements.filter(element => !('source' in element.data)); @@ -140,6 +150,7 @@ describe('dedupeConnections', () => { it('processes connections without a matching "service" aggregation', () => { const response: ServiceMapResponse = { + anomalies, services: [javaService], discoveredServices: [], connections: [ @@ -150,7 +161,7 @@ describe('dedupeConnections', () => { ] }; - const { elements } = dedupeConnections(response); + const { elements } = transformServiceMapResponses(response); expect(elements.length).toBe(3); }); diff --git a/x-pack/plugins/apm/server/lib/service_map/dedupe_connections/index.ts b/x-pack/plugins/apm/server/lib/service_map/transform_service_map_responses.ts similarity index 76% rename from x-pack/plugins/apm/server/lib/service_map/dedupe_connections/index.ts rename to x-pack/plugins/apm/server/lib/service_map/transform_service_map_responses.ts index e5d7c0b2de10c..8b91bb98b5200 100644 --- a/x-pack/plugins/apm/server/lib/service_map/dedupe_connections/index.ts +++ b/x-pack/plugins/apm/server/lib/service_map/transform_service_map_responses.ts @@ -10,14 +10,19 @@ import { SPAN_DESTINATION_SERVICE_RESOURCE, SPAN_TYPE, SPAN_SUBTYPE -} from '../../../../common/elasticsearch_fieldnames'; +} from '../../../common/elasticsearch_fieldnames'; import { Connection, ConnectionNode, ServiceConnectionNode, ExternalConnectionNode -} from '../../../../common/service_map'; -import { ConnectionsResponse, ServicesResponse } from '../get_service_map'; +} from '../../../common/service_map'; +import { + ConnectionsResponse, + ServicesResponse, + AnomaliesResponse +} from './get_service_map'; +import { addAnomaliesDataToNodes } from './ml_helpers'; function getConnectionNodeId(node: ConnectionNode): string { if ('span.destination.service.resource' in node) { @@ -34,13 +39,16 @@ function getConnectionId(connection: Connection) { } export type ServiceMapResponse = ConnectionsResponse & { + anomalies: AnomaliesResponse; services: ServicesResponse; }; -export function dedupeConnections(response: ServiceMapResponse) { - const { discoveredServices, services, connections } = response; +export function transformServiceMapResponses(response: ServiceMapResponse) { + const { anomalies, discoveredServices, services, connections } = response; - const allNodes = connections + // Derive the rest of the map nodes from the connections and add the services + // from the services data query + const allNodes: ConnectionNode[] = connections .flatMap(connection => [connection.source, connection.destination]) .map(node => ({ ...node, id: getConnectionNodeId(node) })) .concat( @@ -50,25 +58,21 @@ export function dedupeConnections(response: ServiceMapResponse) { })) ); - const serviceNodes = allNodes.filter(node => SERVICE_NAME in node) as Array< - ServiceConnectionNode & { - id: string; - } - >; + // List of nodes that are services + const serviceNodes = allNodes.filter( + node => SERVICE_NAME in node + ) as ServiceConnectionNode[]; + // List of nodes that are externals const externalNodes = allNodes.filter( node => SPAN_DESTINATION_SERVICE_RESOURCE in node - ) as Array< - ExternalConnectionNode & { - id: string; - } - >; + ) as ExternalConnectionNode[]; - // 1. maps external nodes to internal services - // 2. collapses external nodes into one node based on span.destination.service.resource - // 3. picks the first available span.type/span.subtype in an alphabetically sorted list + // 1. Map external nodes to internal services + // 2. Collapse external nodes into one node based on span.destination.service.resource + // 3. Pick the first available span.type/span.subtype in an alphabetically sorted list const nodeMap = allNodes.reduce((map, node) => { - if (map[node.id]) { + if (!node.id || map[node.id]) { return map; } @@ -119,14 +123,14 @@ export function dedupeConnections(response: ServiceMapResponse) { .sort()[0] } }; - }, {} as Record); + }, {} as Record); - // maps destination.address to service.name if possible + // Map destination.address to service.name if possible function getConnectionNode(node: ConnectionNode) { return nodeMap[getConnectionNodeId(node)]; } - // build connections with mapped nodes + // Build connections with mapped nodes const mappedConnections = connections .map(connection => { const sourceData = getConnectionNode(connection.source); @@ -166,7 +170,7 @@ export function dedupeConnections(response: ServiceMapResponse) { {} as Record ); - // instead of adding connections in two directions, + // Instead of adding connections in two directions, // we add a `bidirectional` flag to use in styling const dedupedConnections = (sortBy( Object.values(connectionsById), @@ -192,10 +196,18 @@ export function dedupeConnections(response: ServiceMapResponse) { return prev.concat(connection); }, []); + // Add anomlies data + const dedupedNodesWithAnomliesData = addAnomaliesDataToNodes( + dedupedNodes, + anomalies + ); + // Put everything together in elements, with everything in the "data" property - const elements = [...dedupedConnections, ...dedupedNodes].map(element => ({ - data: element - })); + const elements = [...dedupedConnections, ...dedupedNodesWithAnomliesData].map( + element => ({ + data: element + }) + ); return { elements }; } From 5e5ad194f6358ca32d3fa5728eabf8320ea6901a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20C=C3=B4t=C3=A9?= Date: Sat, 9 May 2020 12:32:26 -0400 Subject: [PATCH 050/102] Fix edit alert flyout to update initialAlert after edit (#65359) --- .../components/alert_details.tsx | 41 ++++++++++--------- .../sections/alert_form/alert_edit.test.tsx | 6 +-- .../sections/alert_form/alert_edit.tsx | 17 ++------ 3 files changed, 26 insertions(+), 38 deletions(-) diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details.tsx index 3440bb28b2468..8511ab468ca80 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_details/components/alert_details.tsx @@ -127,26 +127,27 @@ export const AlertDetails: React.FunctionComponent = ({ defaultMessage="Edit" /> - - - + {editFlyoutVisible && ( + + setEditFlyoutVisibility(false)} + /> + + )} ) : null} diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_edit.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_edit.test.tsx index 722db146a54ce..4d8801d8b7484 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_edit.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_edit.test.tsx @@ -131,11 +131,7 @@ describe('alert_edit', () => { capabilities: deps!.capabilities, }} > - {}} - initialAlert={alert} - /> + {}} initialAlert={alert} /> ); diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_edit.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_edit.tsx index 00bc9874face1..747464d2212f4 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_edit.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alert_form/alert_edit.tsx @@ -31,15 +31,10 @@ import { PLUGIN } from '../../constants/plugin'; interface AlertEditProps { initialAlert: Alert; - editFlyoutVisible: boolean; - setEditFlyoutVisibility: React.Dispatch>; + onClose(): void; } -export const AlertEdit = ({ - initialAlert, - editFlyoutVisible, - setEditFlyoutVisibility, -}: AlertEditProps) => { +export const AlertEdit = ({ initialAlert, onClose }: AlertEditProps) => { const [{ alert }, dispatch] = useReducer(alertReducer, { alert: initialAlert }); const [isSaving, setIsSaving] = useState(false); const [hasActionsDisabled, setHasActionsDisabled] = useState(false); @@ -57,14 +52,10 @@ export const AlertEdit = ({ } = useAlertsContext(); const closeFlyout = useCallback(() => { - setEditFlyoutVisibility(false); + onClose(); setAlert('alert', initialAlert); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [setEditFlyoutVisibility]); - - if (!editFlyoutVisible) { - return null; - } + }, [onClose]); const alertType = alertTypeRegistry.get(alert.alertTypeId); From ef1800be7693ce1e72a8fb9afd89928b071213fe Mon Sep 17 00:00:00 2001 From: Shahzad Date: Sun, 10 May 2020 16:39:17 +0200 Subject: [PATCH 051/102] [Uptime] Settings threshold validation (#65454) --- x-pack/plugins/uptime/common/translations.ts | 14 +++++++ .../components/settings/certificate_form.tsx | 14 ++++--- .../plugins/uptime/public/pages/settings.tsx | 39 +++++++++++-------- .../uptime/public/pages/translations.ts | 4 ++ .../server/rest_api/dynamic_settings.ts | 29 +++++++++++--- 5 files changed, 71 insertions(+), 29 deletions(-) create mode 100644 x-pack/plugins/uptime/common/translations.ts diff --git a/x-pack/plugins/uptime/common/translations.ts b/x-pack/plugins/uptime/common/translations.ts new file mode 100644 index 0000000000000..678fe7cb1f984 --- /dev/null +++ b/x-pack/plugins/uptime/common/translations.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { i18n } from '@kbn/i18n'; + +export const VALUE_MUST_BE_GREATER_THEN_ZEO = i18n.translate( + 'xpack.uptime.settings.invalid.error', + { + defaultMessage: 'Value must be greater than 0.', + } +); diff --git a/x-pack/plugins/uptime/public/components/settings/certificate_form.tsx b/x-pack/plugins/uptime/public/components/settings/certificate_form.tsx index 5bfd26f7c6401..8200e8292cd98 100644 --- a/x-pack/plugins/uptime/public/components/settings/certificate_form.tsx +++ b/x-pack/plugins/uptime/public/components/settings/certificate_form.tsx @@ -59,7 +59,7 @@ export const CertificateExpirationForm: React.FC = ({ > = ({ }} /> } - isInvalid={!!fieldErrors?.certificatesThresholds?.expirationThresholdError} + isInvalid={!!fieldErrors?.expirationThresholdError} label={ = ({ = ({ = ({ }} /> } - isInvalid={!!fieldErrors?.certificatesThresholds?.ageThresholdError} + isInvalid={!!fieldErrors?.ageThresholdError} label={ = ({ + onChange={({ currentTarget: { value } }) => onChange({ - certAgeThreshold: Number(e.currentTarget.value), + certAgeThreshold: Number(value), }) } /> diff --git a/x-pack/plugins/uptime/public/pages/settings.tsx b/x-pack/plugins/uptime/public/pages/settings.tsx index 7ed9cf4444343..d018567ae1104 100644 --- a/x-pack/plugins/uptime/public/pages/settings.tsx +++ b/x-pack/plugins/uptime/public/pages/settings.tsx @@ -32,13 +32,12 @@ import { OnFieldChangeType, } from '../components/settings/certificate_form'; import * as Translations from './translations'; +import { VALUE_MUST_BE_GREATER_THEN_ZEO } from '../../common/translations'; interface SettingsPageFieldErrors { - heartbeatIndices: 'May not be blank' | ''; - certificatesThresholds: { - expirationThresholdError: string | null; - ageThresholdError: string | null; - } | null; + heartbeatIndices: string | ''; + expirationThresholdError?: string; + ageThresholdError?: string; } export interface SettingsFormProps { @@ -49,22 +48,28 @@ export interface SettingsFormProps { isDisabled: boolean; } +const isValidCertVal = (val: string | number) => { + if (val === '') { + return Translations.BLANK_STR; + } + if (val === 0) { + return VALUE_MUST_BE_GREATER_THEN_ZEO; + } +}; + const getFieldErrors = (formFields: DynamicSettings | null): SettingsPageFieldErrors | null => { if (formFields) { - const blankStr = 'May not be blank'; const { certAgeThreshold, certExpirationThreshold, heartbeatIndices } = formFields; - const heartbeatIndErr = heartbeatIndices.match(/^\S+$/) ? '' : blankStr; - const expirationThresholdError = certExpirationThreshold ? null : blankStr; - const ageThresholdError = certAgeThreshold ? null : blankStr; + + const indError = heartbeatIndices.match(/^\S+$/) ? '' : Translations.BLANK_STR; + + const expError = isValidCertVal(certExpirationThreshold); + const ageError = isValidCertVal(certAgeThreshold); + return { - heartbeatIndices: heartbeatIndErr, - certificatesThresholds: - expirationThresholdError || ageThresholdError - ? { - expirationThresholdError, - ageThresholdError, - } - : null, + heartbeatIndices: indError, + expirationThresholdError: expError, + ageThresholdError: ageError, }; } return null; diff --git a/x-pack/plugins/uptime/public/pages/translations.ts b/x-pack/plugins/uptime/public/pages/translations.ts index 74fb2eeb1416b..8ed5503235884 100644 --- a/x-pack/plugins/uptime/public/pages/translations.ts +++ b/x-pack/plugins/uptime/public/pages/translations.ts @@ -36,3 +36,7 @@ export const settings = { defaultMessage: 'Return to overview', }), }; + +export const BLANK_STR = i18n.translate('xpack.uptime.settings.blank.error', { + defaultMessage: 'May not be blank.', +}); diff --git a/x-pack/plugins/uptime/server/rest_api/dynamic_settings.ts b/x-pack/plugins/uptime/server/rest_api/dynamic_settings.ts index 31833a25ee8ac..c7d532d932aa6 100644 --- a/x-pack/plugins/uptime/server/rest_api/dynamic_settings.ts +++ b/x-pack/plugins/uptime/server/rest_api/dynamic_settings.ts @@ -11,6 +11,7 @@ import { UMServerLibs } from '../lib/lib'; import { DynamicSettings, DynamicSettingsType } from '../../common/runtime_types'; import { UMRestApiRouteFactory } from '.'; import { savedObjectsAdapter } from '../lib/saved_objects'; +import { VALUE_MUST_BE_GREATER_THEN_ZEO } from '../../common/translations'; export const createGetDynamicSettingsRoute: UMRestApiRouteFactory = (libs: UMServerLibs) => ({ method: 'GET', @@ -23,19 +24,35 @@ export const createGetDynamicSettingsRoute: UMRestApiRouteFactory = (libs: UMSer }, }); +const validateCertsValues = (settings: DynamicSettings) => { + const errors: any = {}; + if (settings.certAgeThreshold <= 0) { + errors.certAgeThreshold = VALUE_MUST_BE_GREATER_THEN_ZEO; + } + if (settings.certExpirationThreshold <= 0) { + errors.certExpirationThreshold = VALUE_MUST_BE_GREATER_THEN_ZEO; + } + if (errors.certAgeThreshold || errors.certExpirationThreshold) { + return errors; + } +}; + export const createPostDynamicSettingsRoute: UMRestApiRouteFactory = (libs: UMServerLibs) => ({ method: 'POST', path: '/api/uptime/dynamic_settings', validate: { - body: schema.object({}, { unknowns: 'allow' }), + body: schema.object({ + heartbeatIndices: schema.string(), + certAgeThreshold: schema.number(), + certExpirationThreshold: schema.number(), + }), }, writeAccess: true, - options: { - tags: ['access:uptime-write'], - }, handler: async ({ savedObjectsClient }, _context, request, response): Promise => { const decoded = DynamicSettingsType.decode(request.body); - if (isRight(decoded)) { + const certThresholdErrors = validateCertsValues(request.body as DynamicSettings); + + if (isRight(decoded) && !certThresholdErrors) { const newSettings: DynamicSettings = decoded.right; await savedObjectsAdapter.setUptimeDynamicSettings(savedObjectsClient, newSettings); @@ -47,7 +64,7 @@ export const createPostDynamicSettingsRoute: UMRestApiRouteFactory = (libs: UMSe } else { const error = PathReporter.report(decoded).join(', '); return response.badRequest({ - body: error, + body: JSON.stringify(certThresholdErrors) || error, }); } }, From 1c554d9964516c9b590e5c84c0a71cf522f9a9bc Mon Sep 17 00:00:00 2001 From: Josh Dover Date: Sun, 10 May 2020 14:00:49 -0600 Subject: [PATCH 052/102] Mount ui/new_platform applications in same div structure as Core (#63930) --- .../public/new_platform/new_platform.test.ts | 19 ++++++++++++++++--- .../ui/public/new_platform/new_platform.ts | 3 ++- 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/src/legacy/ui/public/new_platform/new_platform.test.ts b/src/legacy/ui/public/new_platform/new_platform.test.ts index 1629aac588a61..21e7b559f71f5 100644 --- a/src/legacy/ui/public/new_platform/new_platform.test.ts +++ b/src/legacy/ui/public/new_platform/new_platform.test.ts @@ -22,6 +22,7 @@ jest.mock('history'); import { setRootControllerMock, historyMock } from './new_platform.test.mocks'; import { legacyAppRegister, __reset__, __setup__, __start__ } from './new_platform'; import { coreMock } from '../../../../core/public/mocks'; +import { AppMount } from '../../../../core/public'; describe('ui/new_platform', () => { describe('legacyAppRegister', () => { @@ -33,7 +34,7 @@ describe('ui/new_platform', () => { const registerApp = () => { const unmountMock = jest.fn(); - const mountMock = jest.fn(() => unmountMock); + const mountMock = jest.fn, Parameters>(() => unmountMock); legacyAppRegister({ id: 'test', title: 'Test', @@ -62,13 +63,25 @@ describe('ui/new_platform', () => { controller(scopeMock, elementMock); expect(mountMock).toHaveBeenCalledWith({ - element: elementMock[0], + element: expect.any(HTMLElement), appBasePath: '/test/base/path/app/test', onAppLeave: expect.any(Function), history: historyMock, }); }); + test('app is mounted in new div inside containing element', () => { + const { mountMock } = registerApp(); + const controller = setRootControllerMock.mock.calls[0][1]; + const scopeMock = { $on: jest.fn() }; + const elementMock = [document.createElement('div')]; + + controller(scopeMock, elementMock); + + const { element } = mountMock.mock.calls[0][0]; + expect(element.parentElement).toEqual(elementMock[0]); + }); + test('controller calls deprecated context app.mount when invoked', () => { const unmountMock = jest.fn(); // Two arguments changes how this is called. @@ -84,7 +97,7 @@ describe('ui/new_platform', () => { controller(scopeMock, elementMock); expect(mountMock).toHaveBeenCalledWith(expect.any(Object), { - element: elementMock[0], + element: expect.any(HTMLElement), appBasePath: '/test/base/path/app/test', onAppLeave: expect.any(Function), history: historyMock, diff --git a/src/legacy/ui/public/new_platform/new_platform.ts b/src/legacy/ui/public/new_platform/new_platform.ts index a15c7cce5511d..1eb46e1a43895 100644 --- a/src/legacy/ui/public/new_platform/new_platform.ts +++ b/src/legacy/ui/public/new_platform/new_platform.ts @@ -176,7 +176,8 @@ export const legacyAppRegister = (app: App) => { legacyAppRegistered = true; require('ui/chrome').setRootController(app.id, ($scope: IScope, $element: JQLite) => { - const element = $element[0]; + const element = document.createElement('div'); + $element[0].appendChild(element); // Root controller cannot return a Promise so use an internal async function and call it immediately (async () => { From faaa12729e3d1d6752f4b40c1dd973db2705031c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Louv-Jansen?= Date: Sun, 10 May 2020 22:50:43 +0200 Subject: [PATCH 053/102] Point 7.x to 7.9.0 in .backportrc.json --- .backportrc.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.backportrc.json b/.backportrc.json index 0894909d2aac4..87bc3a1be583b 100644 --- a/.backportrc.json +++ b/.backportrc.json @@ -25,7 +25,7 @@ ], "targetPRLabels": ["backport"], "branchLabelMapping": { - "^v7.8.0$": "7.x", + "^v7.9.0$": "7.x", "^v(\\d+).(\\d+).\\d+$": "$1.$2" } } From e5b4054a8e8899d9e4353d077464bb840d4b067e Mon Sep 17 00:00:00 2001 From: Anton Dosov Date: Mon, 11 May 2020 09:36:45 +0200 Subject: [PATCH 054/102] fix double flyouts in add panel flow (#65861) Co-authored-by: Elastic Machine --- .../add_panel/add_panel_flyout.test.tsx | 4 ++++ .../panel_actions/add_panel/add_panel_flyout.tsx | 12 +++--------- .../add_panel/open_add_panel_flyout.tsx | 3 ++- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_flyout.test.tsx b/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_flyout.test.tsx index 282b0f05891e0..3894d6fbed382 100644 --- a/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_flyout.test.tsx +++ b/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_flyout.test.tsx @@ -18,6 +18,7 @@ */ import * as React from 'react'; +import { EuiFlyout } from '@elastic/eui'; import { AddPanelFlyout } from './add_panel_flyout'; import { ContactCardEmbeddableFactory, @@ -75,6 +76,9 @@ test('createNewEmbeddable() add embeddable to container', async () => { /> ) as ReactWrapper; + // https://github.com/elastic/kibana/issues/64789 + expect(component.exists(EuiFlyout)).toBe(false); + expect(Object.values(container.getInput().panels).length).toBe(0); component.instance().createNewEmbeddable(CONTACT_CARD_EMBEDDABLE); await new Promise(r => setTimeout(r, 1)); diff --git a/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_flyout.tsx b/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_flyout.tsx index 5bf3f69a95c30..4c23916675e8f 100644 --- a/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_flyout.tsx +++ b/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/add_panel_flyout.tsx @@ -21,13 +21,7 @@ import { FormattedMessage } from '@kbn/i18n/react'; import React, { ReactElement } from 'react'; import { CoreSetup } from 'src/core/public'; -import { - EuiContextMenuItem, - EuiFlyout, - EuiFlyoutBody, - EuiFlyoutHeader, - EuiTitle, -} from '@elastic/eui'; +import { EuiContextMenuItem, EuiFlyoutBody, EuiFlyoutHeader, EuiTitle } from '@elastic/eui'; import { EmbeddableStart } from 'src/plugins/embeddable/public'; import { IContainer } from '../../../../containers'; @@ -152,7 +146,7 @@ export class AddPanelFlyout extends React.Component { ); return ( - + <>

@@ -161,7 +155,7 @@ export class AddPanelFlyout extends React.Component { {savedObjectsFinder} - + ); } } diff --git a/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/open_add_panel_flyout.tsx b/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/open_add_panel_flyout.tsx index a452e07b51577..867092b78ef7a 100644 --- a/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/open_add_panel_flyout.tsx +++ b/src/plugins/embeddable/public/lib/panel/panel_header/panel_actions/add_panel/open_add_panel_flyout.tsx @@ -55,7 +55,8 @@ export async function openAddPanelFlyout(options: { /> ), { - 'data-test-subj': 'addPanelFlyout', + 'data-test-subj': 'dashboardAddPanel', + ownFocus: true, } ); } From 387e28a6a419eab942fd4b6088a2523719242d00 Mon Sep 17 00:00:00 2001 From: Anton Dosov Date: Mon, 11 May 2020 10:12:59 +0200 Subject: [PATCH 055/102] [Drilldowns][chore] import dashboard url generator from plugin contract (#64628) Co-authored-by: Elastic Machine --- src/plugins/dashboard/public/index.ts | 2 +- src/plugins/dashboard/public/plugin.tsx | 19 ++++++++--- .../dashboard/public/url_generator.test.ts | 24 ++++++------- src/plugins/dashboard/public/url_generator.ts | 2 +- .../url_generator_service.test.ts | 18 ++++++++-- .../url_generators/url_generator_service.ts | 11 +++--- .../dashboard_enhanced/public/plugin.ts | 2 ++ .../dashboard_drilldowns_services.ts | 11 +++++- .../drilldown.test.tsx | 34 ++++++++----------- .../drilldown.tsx | 9 +++-- 10 files changed, 82 insertions(+), 50 deletions(-) diff --git a/src/plugins/dashboard/public/index.ts b/src/plugins/dashboard/public/index.ts index 44733499cdcba..e093342f95735 100644 --- a/src/plugins/dashboard/public/index.ts +++ b/src/plugins/dashboard/public/index.ts @@ -31,7 +31,7 @@ export { } from './application'; export { DashboardConstants, createDashboardEditUrl } from './dashboard_constants'; -export { DashboardStart } from './plugin'; +export { DashboardStart, DashboardUrlGenerator } from './plugin'; export { DASHBOARD_APP_URL_GENERATOR } from './url_generator'; export function plugin(initializerContext: PluginInitializerContext) { diff --git a/src/plugins/dashboard/public/plugin.tsx b/src/plugins/dashboard/public/plugin.tsx index b28822120b31e..894440cfa9cbb 100644 --- a/src/plugins/dashboard/public/plugin.tsx +++ b/src/plugins/dashboard/public/plugin.tsx @@ -42,7 +42,11 @@ import { DataPublicPluginSetup, esFilters, } from '../../../plugins/data/public'; -import { SharePluginSetup, SharePluginStart } from '../../../plugins/share/public'; +import { + SharePluginSetup, + SharePluginStart, + UrlGeneratorContract, +} from '../../../plugins/share/public'; import { UiActionsSetup, UiActionsStart } from '../../../plugins/ui_actions/public'; import { Start as InspectorStartContract } from '../../../plugins/inspector/public'; @@ -77,7 +81,7 @@ import { import { DashboardAppLinkGeneratorState, DASHBOARD_APP_URL_GENERATOR, - createDirectAccessDashboardLinkGenerator, + createDashboardUrlGenerator, } from './url_generator'; import { createSavedDashboardLoader } from './saved_dashboards'; import { DashboardConstants } from './dashboard_constants'; @@ -89,6 +93,8 @@ declare module '../../share/public' { } } +export type DashboardUrlGenerator = UrlGeneratorContract; + interface SetupDependencies { data: DataPublicPluginSetup; embeddable: EmbeddableSetup; @@ -111,8 +117,10 @@ interface StartDependencies { } export type Setup = void; + export interface DashboardStart { getSavedDashboardLoader: () => SavedObjectLoader; + dashboardUrlGenerator?: DashboardUrlGenerator; } declare module '../../../plugins/ui_actions/public' { @@ -130,6 +138,8 @@ export class DashboardPlugin private appStateUpdater = new BehaviorSubject(() => ({})); private stopUrlTracking: (() => void) | undefined = undefined; + private dashboardUrlGenerator?: DashboardUrlGenerator; + public setup( core: CoreSetup, { share, uiActions, embeddable, home, kibanaLegacy, data, usageCollection }: SetupDependencies @@ -140,8 +150,8 @@ export class DashboardPlugin const startServices = core.getStartServices(); if (share) { - share.urlGenerators.registerUrlGenerator( - createDirectAccessDashboardLinkGenerator(async () => { + this.dashboardUrlGenerator = share.urlGenerators.registerUrlGenerator( + createDashboardUrlGenerator(async () => { const [coreStart, , selfStart] = await startServices; return { appBasePath: coreStart.application.getUrlForApp('dashboard'), @@ -325,6 +335,7 @@ export class DashboardPlugin }); return { getSavedDashboardLoader: () => savedDashboardLoader, + dashboardUrlGenerator: this.dashboardUrlGenerator, }; } diff --git a/src/plugins/dashboard/public/url_generator.test.ts b/src/plugins/dashboard/public/url_generator.test.ts index 248a3f991d6cb..68d447c4a1336 100644 --- a/src/plugins/dashboard/public/url_generator.test.ts +++ b/src/plugins/dashboard/public/url_generator.test.ts @@ -17,7 +17,7 @@ * under the License. */ -import { createDirectAccessDashboardLinkGenerator } from './url_generator'; +import { createDashboardUrlGenerator } from './url_generator'; import { hashedItemStore } from '../../kibana_utils/public'; // eslint-disable-next-line import { mockStorage } from '../../kibana_utils/public/storage/hashed_item_store/mock'; @@ -55,7 +55,7 @@ describe('dashboard url generator', () => { }); test('creates a link to a saved dashboard', async () => { - const generator = createDirectAccessDashboardLinkGenerator(() => + const generator = createDashboardUrlGenerator(() => Promise.resolve({ appBasePath: APP_BASE_PATH, useHashedUrl: false, @@ -67,7 +67,7 @@ describe('dashboard url generator', () => { }); test('creates a link with global time range set up', async () => { - const generator = createDirectAccessDashboardLinkGenerator(() => + const generator = createDashboardUrlGenerator(() => Promise.resolve({ appBasePath: APP_BASE_PATH, useHashedUrl: false, @@ -83,7 +83,7 @@ describe('dashboard url generator', () => { }); test('creates a link with filters, time range, refresh interval and query to a saved object', async () => { - const generator = createDirectAccessDashboardLinkGenerator(() => + const generator = createDashboardUrlGenerator(() => Promise.resolve({ appBasePath: APP_BASE_PATH, useHashedUrl: false, @@ -123,7 +123,7 @@ describe('dashboard url generator', () => { }); test('if no useHash setting is given, uses the one was start services', async () => { - const generator = createDirectAccessDashboardLinkGenerator(() => + const generator = createDashboardUrlGenerator(() => Promise.resolve({ appBasePath: APP_BASE_PATH, useHashedUrl: true, @@ -137,7 +137,7 @@ describe('dashboard url generator', () => { }); test('can override a false useHash ui setting', async () => { - const generator = createDirectAccessDashboardLinkGenerator(() => + const generator = createDashboardUrlGenerator(() => Promise.resolve({ appBasePath: APP_BASE_PATH, useHashedUrl: false, @@ -152,7 +152,7 @@ describe('dashboard url generator', () => { }); test('can override a true useHash ui setting', async () => { - const generator = createDirectAccessDashboardLinkGenerator(() => + const generator = createDashboardUrlGenerator(() => Promise.resolve({ appBasePath: APP_BASE_PATH, useHashedUrl: true, @@ -195,7 +195,7 @@ describe('dashboard url generator', () => { }; test('attaches filters from destination dashboard', async () => { - const generator = createDirectAccessDashboardLinkGenerator(() => + const generator = createDashboardUrlGenerator(() => Promise.resolve({ appBasePath: APP_BASE_PATH, useHashedUrl: false, @@ -224,7 +224,7 @@ describe('dashboard url generator', () => { }); test("doesn't fail if can't retrieve filters from destination dashboard", async () => { - const generator = createDirectAccessDashboardLinkGenerator(() => + const generator = createDashboardUrlGenerator(() => Promise.resolve({ appBasePath: APP_BASE_PATH, useHashedUrl: false, @@ -246,7 +246,7 @@ describe('dashboard url generator', () => { }); test('can enforce empty filters', async () => { - const generator = createDirectAccessDashboardLinkGenerator(() => + const generator = createDashboardUrlGenerator(() => Promise.resolve({ appBasePath: APP_BASE_PATH, useHashedUrl: false, @@ -270,7 +270,7 @@ describe('dashboard url generator', () => { }); test('no filters in result url if no filters applied', async () => { - const generator = createDirectAccessDashboardLinkGenerator(() => + const generator = createDashboardUrlGenerator(() => Promise.resolve({ appBasePath: APP_BASE_PATH, useHashedUrl: false, @@ -288,7 +288,7 @@ describe('dashboard url generator', () => { }); test('can turn off preserving filters', async () => { - const generator = createDirectAccessDashboardLinkGenerator(() => + const generator = createDashboardUrlGenerator(() => Promise.resolve({ appBasePath: APP_BASE_PATH, useHashedUrl: false, diff --git a/src/plugins/dashboard/public/url_generator.ts b/src/plugins/dashboard/public/url_generator.ts index 6f121ceb2d373..9d66f2df65777 100644 --- a/src/plugins/dashboard/public/url_generator.ts +++ b/src/plugins/dashboard/public/url_generator.ts @@ -75,7 +75,7 @@ export type DashboardAppLinkGeneratorState = UrlGeneratorState<{ preserveSavedFilters?: boolean; }>; -export const createDirectAccessDashboardLinkGenerator = ( +export const createDashboardUrlGenerator = ( getStartServices: () => Promise<{ appBasePath: string; useHashedUrl: boolean; diff --git a/src/plugins/share/public/url_generators/url_generator_service.test.ts b/src/plugins/share/public/url_generators/url_generator_service.test.ts index 4a377db033762..d256dcf5f7aa0 100644 --- a/src/plugins/share/public/url_generators/url_generator_service.test.ts +++ b/src/plugins/share/public/url_generators/url_generator_service.test.ts @@ -30,11 +30,11 @@ test('Asking for a generator that does not exist throws an error', () => { }); test('Registering and retrieving a generator', async () => { - setup.registerUrlGenerator({ + const generator = setup.registerUrlGenerator({ id: 'TEST_GENERATOR', createUrl: () => Promise.resolve('myurl'), }); - const generator = start.getUrlGenerator('TEST_GENERATOR'); + expect(generator).toMatchInlineSnapshot(` Object { "createUrl": [Function], @@ -47,6 +47,20 @@ test('Registering and retrieving a generator', async () => { new Error('You cannot call migrate on a non-deprecated generator.') ); expect(await generator.createUrl({})).toBe('myurl'); + + const retrievedGenerator = start.getUrlGenerator('TEST_GENERATOR'); + expect(retrievedGenerator).toMatchInlineSnapshot(` + Object { + "createUrl": [Function], + "id": "TEST_GENERATOR", + "isDeprecated": false, + "migrate": [Function], + } + `); + await expect(generator.migrate({})).rejects.toEqual( + new Error('You cannot call migrate on a non-deprecated generator.') + ); + expect(await generator.createUrl({})).toBe('myurl'); }); test('Registering a generator with a createUrl function that is deprecated throws an error', () => { diff --git a/src/plugins/share/public/url_generators/url_generator_service.ts b/src/plugins/share/public/url_generators/url_generator_service.ts index 332750671cee3..13c1b94acdd07 100644 --- a/src/plugins/share/public/url_generators/url_generator_service.ts +++ b/src/plugins/share/public/url_generators/url_generator_service.ts @@ -28,7 +28,9 @@ export interface UrlGeneratorsStart { } export interface UrlGeneratorsSetup { - registerUrlGenerator: (generator: UrlGeneratorsDefinition) => void; + registerUrlGenerator: ( + generator: UrlGeneratorsDefinition + ) => UrlGeneratorContract; } export class UrlGeneratorsService implements Plugin { @@ -43,10 +45,9 @@ export class UrlGeneratorsService implements Plugin( generatorOptions: UrlGeneratorsDefinition ) => { - this.urlGenerators.set( - generatorOptions.id, - new UrlGeneratorInternal(generatorOptions, this.getUrlGenerator) - ); + const generator = new UrlGeneratorInternal(generatorOptions, this.getUrlGenerator); + this.urlGenerators.set(generatorOptions.id, generator); + return generator.getPublicContract(); }, }; return setup; diff --git a/x-pack/plugins/dashboard_enhanced/public/plugin.ts b/x-pack/plugins/dashboard_enhanced/public/plugin.ts index 772e032289bce..c258a4148f84a 100644 --- a/x-pack/plugins/dashboard_enhanced/public/plugin.ts +++ b/x-pack/plugins/dashboard_enhanced/public/plugin.ts @@ -11,6 +11,7 @@ import { DashboardDrilldownsService } from './services'; import { DataPublicPluginStart } from '../../../../src/plugins/data/public'; import { AdvancedUiActionsSetup, AdvancedUiActionsStart } from '../../advanced_ui_actions/public'; import { DrilldownsSetup, DrilldownsStart } from '../../drilldowns/public'; +import { DashboardStart } from '../../../../src/plugins/dashboard/public'; export interface SetupDependencies { advancedUiActions: AdvancedUiActionsSetup; @@ -25,6 +26,7 @@ export interface StartDependencies { drilldowns: DrilldownsStart; embeddable: EmbeddableStart; share: SharePluginStart; + dashboard: DashboardStart; } // eslint-disable-next-line diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_drilldowns_services.ts b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_drilldowns_services.ts index 0161836b2c5b9..f5926cd6961c2 100644 --- a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_drilldowns_services.ts +++ b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_drilldowns_services.ts @@ -44,6 +44,12 @@ export class DashboardDrilldownsService { { advancedUiActions: uiActions }: SetupDependencies ) { const start = createStartServicesGetter(core.getStartServices); + const getDashboardUrlGenerator = () => { + const urlGenerator = start().plugins.dashboard.dashboardUrlGenerator; + if (!urlGenerator) + throw new Error('dashboardUrlGenerator is required for dashboard to dashboard drilldown'); + return urlGenerator; + }; const actionFlyoutCreateDrilldown = new FlyoutCreateDrilldownAction({ start }); uiActions.addTriggerAction(CONTEXT_MENU_TRIGGER, actionFlyoutCreateDrilldown); @@ -51,7 +57,10 @@ export class DashboardDrilldownsService { const actionFlyoutEditDrilldown = new FlyoutEditDrilldownAction({ start }); uiActions.addTriggerAction(CONTEXT_MENU_TRIGGER, actionFlyoutEditDrilldown); - const dashboardToDashboardDrilldown = new DashboardToDashboardDrilldown({ start }); + const dashboardToDashboardDrilldown = new DashboardToDashboardDrilldown({ + start, + getDashboardUrlGenerator, + }); uiActions.registerDrilldown(dashboardToDashboardDrilldown); } } diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/drilldown.test.tsx b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/drilldown.test.tsx index 18ee95cb57b3b..d8465562f9302 100644 --- a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/drilldown.test.tsx +++ b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/drilldown.test.tsx @@ -5,8 +5,7 @@ */ import { DashboardToDashboardDrilldown } from './drilldown'; -import { UrlGeneratorContract } from '../../../../../../../src/plugins/share/public'; -import { savedObjectsServiceMock } from '../../../../../../../src/core/public/mocks'; +import { savedObjectsServiceMock, coreMock } from '../../../../../../../src/core/public/mocks'; import { dataPluginMock } from '../../../../../../../src/plugins/data/public/mocks'; import { ActionContext, Config } from './types'; import { @@ -19,15 +18,16 @@ import { import { esFilters } from '../../../../../../../src/plugins/data/public'; // convenient to use real implementation here. -import { createDirectAccessDashboardLinkGenerator } from '../../../../../../../src/plugins/dashboard/public/url_generator'; +import { createDashboardUrlGenerator } from '../../../../../../../src/plugins/dashboard/public/url_generator'; +import { UrlGeneratorsService } from '../../../../../../../src/plugins/share/public/url_generators'; import { VisualizeEmbeddableContract } from '../../../../../../../src/plugins/visualizations/public'; import { RangeSelectTriggerContext, ValueClickTriggerContext, } from '../../../../../../../src/plugins/embeddable/public'; +import { StartDependencies } from '../../../plugin'; import { SavedObjectLoader } from '../../../../../../../src/plugins/saved_objects/public'; import { StartServicesGetter } from '../../../../../../../src/plugins/kibana_utils/public/core'; -import { StartDependencies } from '../../../plugin'; describe('.isConfigValid()', () => { const drilldown = new DashboardToDashboardDrilldown({} as any); @@ -105,23 +105,19 @@ describe('.execute() & getHref', () => { data: { actions: dataPluginActions, }, - share: { - urlGenerators: { - getUrlGenerator: () => - createDirectAccessDashboardLinkGenerator(() => - Promise.resolve({ - appBasePath: 'test', - useHashedUrl: false, - savedDashboardLoader: ({} as unknown) as SavedObjectLoader, - }) - ) as UrlGeneratorContract, - }, - }, }, self: {}, - })) as unknown) as StartServicesGetter< - Pick - >, + })) as unknown) as StartServicesGetter>, + getDashboardUrlGenerator: () => + new UrlGeneratorsService().setup(coreMock.createSetup()).registerUrlGenerator( + createDashboardUrlGenerator(() => + Promise.resolve({ + appBasePath: 'test', + useHashedUrl: false, + savedDashboardLoader: ({} as unknown) as SavedObjectLoader, + }) + ) + ), }); const selectRangeFiltersSpy = jest .spyOn(dataPluginActions, 'createFiltersFromRangeSelectAction') diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/drilldown.tsx b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/drilldown.tsx index 848e77384f7f0..6d83b8443a828 100644 --- a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/drilldown.tsx +++ b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/dashboard_to_dashboard_drilldown/drilldown.tsx @@ -6,7 +6,7 @@ import React from 'react'; import { reactToUiComponent } from '../../../../../../../src/plugins/kibana_react/public'; -import { DASHBOARD_APP_URL_GENERATOR } from '../../../../../../../src/plugins/dashboard/public'; +import { DashboardUrlGenerator } from '../../../../../../../src/plugins/dashboard/public'; import { ActionContext, Config } from './types'; import { CollectConfigContainer } from './components'; import { DASHBOARD_TO_DASHBOARD_DRILLDOWN } from './constants'; @@ -22,7 +22,8 @@ import { StartServicesGetter } from '../../../../../../../src/plugins/kibana_uti import { StartDependencies } from '../../../plugin'; export interface Params { - start: StartServicesGetter>; + start: StartServicesGetter>; + getDashboardUrlGenerator: () => DashboardUrlGenerator; } export class DashboardToDashboardDrilldown @@ -142,9 +143,7 @@ export class DashboardToDashboardDrilldown } } - const { plugins } = this.params.start(); - - return plugins.share.urlGenerators.getUrlGenerator(DASHBOARD_APP_URL_GENERATOR).createUrl({ + return this.params.getDashboardUrlGenerator().createUrl({ dashboardId: config.dashboardId, query: config.useCurrentFilters ? query : undefined, timeRange, From af102afb7a524531fc97a5be96e8a7b3afa9908f Mon Sep 17 00:00:00 2001 From: James Gowdy Date: Mon, 11 May 2020 10:00:44 +0100 Subject: [PATCH 056/102] [ML] Fixing watch creation (#65956) --- .../components/create_watch_flyout/create_watch_service.js | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/create_watch_flyout/create_watch_service.js b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/create_watch_flyout/create_watch_service.js index 29e89022a5502..2a65ee06f2c2c 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/create_watch_flyout/create_watch_service.js +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/create_watch_flyout/create_watch_service.js @@ -157,6 +157,7 @@ class CreateWatchService { id, type: 'json', isNew: false, // Set to false, as we want to allow watches to be overwritten. + isActive: true, watch, }, }; From e148eb4437cb890c93ee328ea424d2d67584de50 Mon Sep 17 00:00:00 2001 From: Walter Rafelsberger Date: Mon, 11 May 2020 11:41:01 +0200 Subject: [PATCH 057/102] [ML] Anomaly Detection: Fix test to reflect model memory limit change. (#65967) Adapt jest test mocks to consider update introduced in #65652. --- .../models/job_validation/job_validation.test.ts | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/ml/server/models/job_validation/job_validation.test.ts b/x-pack/plugins/ml/server/models/job_validation/job_validation.test.ts index ca127f43d08af..d907677855c12 100644 --- a/x-pack/plugins/ml/server/models/job_validation/job_validation.test.ts +++ b/x-pack/plugins/ml/server/models/job_validation/job_validation.test.ts @@ -14,6 +14,13 @@ const callWithRequest: APICaller = (method: string) => { if (method === 'fieldCaps') { resolve({ fields: [] }); return; + } else if (method === 'ml.info') { + resolve({ + limits: { + effective_max_model_memory_limit: '100MB', + max_model_memory_limit: '1GB', + }, + }); } resolve({}); }) as Promise; @@ -291,7 +298,7 @@ describe('ML - validateJob', () => { }); // Failing https://github.com/elastic/kibana/issues/65865 - it.skip('basic validation passes, extended checks return some messages', () => { + it('basic validation passes, extended checks return some messages', () => { const payload = getBasicPayload(); return validateJob(callWithRequest, payload).then(messages => { const ids = messages.map(m => m.id); @@ -305,7 +312,7 @@ describe('ML - validateJob', () => { }); // Failing https://github.com/elastic/kibana/issues/65866 - it.skip('categorization job using mlcategory passes aggregatable field check', () => { + it('categorization job using mlcategory passes aggregatable field check', () => { const payload: any = { job: { job_id: 'categorization_test', @@ -372,7 +379,7 @@ describe('ML - validateJob', () => { }); // Failing https://github.com/elastic/kibana/issues/65867 - it.skip('script field not reported as non aggregatable', () => { + it('script field not reported as non aggregatable', () => { const payload: any = { job: { job_id: 'categorization_test', From ae38c6ba4c3fed23be12085a9032073d3cfe79c9 Mon Sep 17 00:00:00 2001 From: Anton Dosov Date: Mon, 11 May 2020 12:38:39 +0200 Subject: [PATCH 058/102] [Drilldowns] Copy improvements (#65838) * update toast messages * update HelloBar text Co-authored-by: Elastic Machine --- .../connected_flyout_manage_drilldowns.tsx | 12 +-- .../i18n.ts | 75 +++++++++---------- .../components/drilldown_hello_bar/i18n.ts | 2 +- 3 files changed, 43 insertions(+), 46 deletions(-) diff --git a/x-pack/plugins/drilldowns/public/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.tsx b/x-pack/plugins/drilldowns/public/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.tsx index 0d4a67e325e4d..5ebda079a15bf 100644 --- a/x-pack/plugins/drilldowns/public/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.tsx +++ b/x-pack/plugins/drilldowns/public/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.tsx @@ -289,8 +289,8 @@ function useDrilldownsStateManager( await run(async () => { await actionManager.createEvent(action, selectedTriggers); notifications.toasts.addSuccess({ - title: toastDrilldownCreated.title, - text: toastDrilldownCreated.text(action.name), + title: toastDrilldownCreated.title(action.name), + text: toastDrilldownCreated.text, }); }); } @@ -303,8 +303,8 @@ function useDrilldownsStateManager( await run(async () => { await actionManager.updateEvent(drilldownId, action, selectedTriggers); notifications.toasts.addSuccess({ - title: toastDrilldownEdited.title, - text: toastDrilldownEdited.text(action.name), + title: toastDrilldownEdited.title(action.name), + text: toastDrilldownEdited.text, }); }); } @@ -320,8 +320,8 @@ function useDrilldownsStateManager( text: toastDrilldownDeleted.text, } : { - title: toastDrilldownsDeleted.title, - text: toastDrilldownsDeleted.text(drilldownIds.length), + title: toastDrilldownsDeleted.title(drilldownIds.length), + text: toastDrilldownsDeleted.text, } ); }); diff --git a/x-pack/plugins/drilldowns/public/components/connected_flyout_manage_drilldowns/i18n.ts b/x-pack/plugins/drilldowns/public/components/connected_flyout_manage_drilldowns/i18n.ts index 31384860786ef..851439eccbe7e 100644 --- a/x-pack/plugins/drilldowns/public/components/connected_flyout_manage_drilldowns/i18n.ts +++ b/x-pack/plugins/drilldowns/public/components/connected_flyout_manage_drilldowns/i18n.ts @@ -7,35 +7,41 @@ import { i18n } from '@kbn/i18n'; export const toastDrilldownCreated = { - title: i18n.translate( - 'xpack.drilldowns.components.flyoutDrilldownWizard.toast.drilldownCreatedTitle', + title: (drilldownName: string) => + i18n.translate( + 'xpack.drilldowns.components.flyoutDrilldownWizard.toast.drilldownCreatedTitle', + { + defaultMessage: 'Drilldown "{drilldownName}" created', + values: { + drilldownName, + }, + } + ), + text: i18n.translate( + 'xpack.drilldowns.components.flyoutDrilldownWizard.toast.drilldownCreatedText', { - defaultMessage: 'Drilldown created', + // TODO: remove `Save your dashboard before testing.` part + // when drilldowns are used not only in dashboard + // or after https://github.com/elastic/kibana/issues/65179 implemented + defaultMessage: 'Save your dashboard before testing.', } ), - text: (drilldownName: string) => - i18n.translate('xpack.drilldowns.components.flyoutDrilldownWizard.toast.drilldownCreatedText', { - defaultMessage: 'You created "{drilldownName}". Save dashboard before testing.', - values: { - drilldownName, - }, - }), }; export const toastDrilldownEdited = { - title: i18n.translate( - 'xpack.drilldowns.components.flyoutDrilldownWizard.toast.drilldownEditedTitle', - { - defaultMessage: 'Drilldown edited', - } - ), - text: (drilldownName: string) => - i18n.translate('xpack.drilldowns.components.flyoutDrilldownWizard.toast.drilldownEditedText', { - defaultMessage: 'You edited "{drilldownName}". Save dashboard before testing.', + title: (drilldownName: string) => + i18n.translate('xpack.drilldowns.components.flyoutDrilldownWizard.toast.drilldownEditedTitle', { + defaultMessage: 'Drilldown "{drilldownName}" updated', values: { drilldownName, }, }), + text: i18n.translate( + 'xpack.drilldowns.components.flyoutDrilldownWizard.toast.drilldownEditedText', + { + defaultMessage: 'Save your dashboard before testing.', + } + ), }; export const toastDrilldownDeleted = { @@ -48,28 +54,26 @@ export const toastDrilldownDeleted = { text: i18n.translate( 'xpack.drilldowns.components.flyoutDrilldownWizard.toast.drilldownDeletedText', { - defaultMessage: 'You deleted a drilldown.', + defaultMessage: 'Save your dashboard before testing.', } ), }; export const toastDrilldownsDeleted = { - title: i18n.translate( - 'xpack.drilldowns.components.flyoutDrilldownWizard.toast.drilldownsDeletedTitle', - { - defaultMessage: 'Drilldowns deleted', - } - ), - text: (n: number) => + title: (n: number) => i18n.translate( - 'xpack.drilldowns.components.flyoutDrilldownWizard.toast.drilldownsDeletedText', + 'xpack.drilldowns.components.flyoutDrilldownWizard.toast.drilldownsDeletedTitle', { - defaultMessage: 'You deleted {n} drilldowns', - values: { - n, - }, + defaultMessage: '{n} drilldowns deleted', + values: { n }, } ), + text: i18n.translate( + 'xpack.drilldowns.components.flyoutDrilldownWizard.toast.drilldownsDeletedText', + { + defaultMessage: 'Save your dashboard before testing.', + } + ), }; export const toastDrilldownsCRUDError = i18n.translate( @@ -79,10 +83,3 @@ export const toastDrilldownsCRUDError = i18n.translate( description: 'Title for generic error toast when persisting drilldown updates failed', } ); - -export const toastDrilldownsFetchError = i18n.translate( - 'xpack.drilldowns.components.flyoutDrilldownWizard.toast.drilldownsFetchErrorTitle', - { - defaultMessage: 'Error fetching drilldowns', - } -); diff --git a/x-pack/plugins/drilldowns/public/components/drilldown_hello_bar/i18n.ts b/x-pack/plugins/drilldowns/public/components/drilldown_hello_bar/i18n.ts index 63dc95dabc0fb..622376c5b40ad 100644 --- a/x-pack/plugins/drilldowns/public/components/drilldown_hello_bar/i18n.ts +++ b/x-pack/plugins/drilldowns/public/components/drilldown_hello_bar/i18n.ts @@ -10,7 +10,7 @@ export const txtHelpText = i18n.translate( 'xpack.drilldowns.components.DrilldownHelloBar.helpText', { defaultMessage: - 'Drilldowns provide the ability to define a new behavior when interacting with a panel. You can add multiple options or simply override the default filtering behavior.', + 'Drilldowns enable you to define new behaviors for interacting with panels. You can add multiple actions and override the default filter.', } ); From f4ba630da0e1ad4cea94820770263a9a3806b026 Mon Sep 17 00:00:00 2001 From: Sonja Krause-Harder Date: Mon, 11 May 2020 13:29:13 +0200 Subject: [PATCH 059/102] [EPM] Don't crash on invalid characters in integration search bar (#65872) * Catch and hide EuiSearchBar parse errors in package search. * Fix typo. * Remove unnecesary type cast. Co-authored-by: Elastic Machine --- .../epm/components/package_list_grid.tsx | 26 ++++++++++++++++--- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/epm/components/package_list_grid.tsx b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/epm/components/package_list_grid.tsx index 818b365d5be12..2f06d1d8703c2 100644 --- a/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/epm/components/package_list_grid.tsx +++ b/x-pack/plugins/ingest_manager/public/applications/ingest_manager/sections/epm/components/package_list_grid.tsx @@ -13,6 +13,7 @@ import { // @ts-ignore EuiSearchBar, EuiText, + Query, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; @@ -35,9 +36,28 @@ export function PackageListGrid({ list, showInstalledBadge, }: ListProps) { + const initialQuery = EuiSearchBar.Query.MATCH_ALL; + + const [query, setQuery] = useState(initialQuery); const [searchTerm, setSearchTerm] = useState(''); const localSearchRef = useLocalSearch(list); + const onQueryChange = ({ + // eslint-disable-next-line no-shadow + query, + queryText: userInput, + error, + }: { + query: Query | null; + queryText: string; + error: { message: string } | null; + }) => { + if (!error) { + setQuery(query); + setSearchTerm(userInput); + } + }; + const controlsContent = ; let gridContent: JSX.Element; @@ -59,16 +79,14 @@ export function PackageListGrid({ {controlsContent} { - setSearchTerm(userInput); - }} + onChange={onQueryChange} /> {gridContent} From c3a1b24ea09b2ed4238110b37b895083f1042bdd Mon Sep 17 00:00:00 2001 From: Dima Arnautov Date: Mon, 11 May 2020 14:06:10 +0200 Subject: [PATCH 060/102] [ML] api integration tests for get anomaly detectors (#65828) --- .../apis/ml/anomaly_detectors/get.ts | 222 ++++++++++++++++++ .../apis/ml/anomaly_detectors/index.ts | 1 + 2 files changed, 223 insertions(+) create mode 100644 x-pack/test/api_integration/apis/ml/anomaly_detectors/get.ts diff --git a/x-pack/test/api_integration/apis/ml/anomaly_detectors/get.ts b/x-pack/test/api_integration/apis/ml/anomaly_detectors/get.ts new file mode 100644 index 0000000000000..255afecde74cb --- /dev/null +++ b/x-pack/test/api_integration/apis/ml/anomaly_detectors/get.ts @@ -0,0 +1,222 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../ftr_provider_context'; +import { USER } from '../../../../functional/services/machine_learning/security_common'; + +const COMMON_HEADERS = { + 'kbn-xsrf': 'some-xsrf-token', +}; + +export default ({ getService }: FtrProviderContext) => { + const esArchiver = getService('esArchiver'); + const supertest = getService('supertestWithoutAuth'); + const ml = getService('ml'); + + const jobId = `fq_single_${Date.now()}`; + + async function createJobs() { + const mockJobConfigs = [ + { + job_id: `${jobId}_1`, + description: + 'Single metric job based on the farequote dataset with 30m bucketspan and mean(responsetime)', + groups: ['automated', 'farequote', 'single-metric'], + analysis_config: { + bucket_span: '30m', + detectors: [{ function: 'mean', field_name: 'responsetime' }], + influencers: [], + summary_count_field_name: 'doc_count', + }, + data_description: { time_field: '@timestamp' }, + analysis_limits: { model_memory_limit: '11MB' }, + model_plot_config: { enabled: true }, + }, + { + job_id: `${jobId}_2`, + description: + 'Another single metric job based on the farequote dataset with 30m bucketspan and mean(responsetime)', + groups: ['automated', 'farequote', 'single-metric'], + analysis_config: { + bucket_span: '30m', + detectors: [{ function: 'mean', field_name: 'responsetime' }], + influencers: [], + summary_count_field_name: 'doc_count', + }, + data_description: { time_field: '@timestamp' }, + analysis_limits: { model_memory_limit: '11MB' }, + model_plot_config: { enabled: false }, + }, + ]; + + for (const jobConfig of mockJobConfigs) { + await ml.api.createAnomalyDetectionJob(jobConfig); + } + } + + describe('GET anomaly_detectors', () => { + before(async () => { + await esArchiver.loadIfNeeded('ml/farequote'); + await ml.testResources.setKibanaTimeZoneToUTC(); + + await createJobs(); + }); + + after(async () => { + await ml.api.cleanMlIndices(); + }); + + describe('GetAnomalyDetectors', () => { + it('should fetch all anomaly detector jobs', async () => { + const { body } = await supertest + .get(`/api/ml/anomaly_detectors`) + .auth(USER.ML_VIEWER, ml.securityCommon.getPasswordForUser(USER.ML_VIEWER)) + .set(COMMON_HEADERS) + .expect(200); + + expect(body.count).to.eql(2); + expect(body.jobs.length).to.eql(2); + expect(body.jobs[0].job_id).to.eql(`${jobId}_1`); + expect(body.jobs[1].job_id).to.eql(`${jobId}_2`); + }); + + it('should not allow to retrieve jobs for the user without required permissions', async () => { + const { body } = await supertest + .get(`/api/ml/anomaly_detectors`) + .auth(USER.ML_UNAUTHORIZED, ml.securityCommon.getPasswordForUser(USER.ML_UNAUTHORIZED)) + .set(COMMON_HEADERS) + .expect(404); + + expect(body.error).to.eql('Not Found'); + expect(body.message).to.eql('Not Found'); + }); + }); + + describe('GetAnomalyDetectorsById', () => { + it('should fetch single anomaly detector job by id', async () => { + const { body } = await supertest + .get(`/api/ml/anomaly_detectors/${jobId}_1`) + .auth(USER.ML_VIEWER, ml.securityCommon.getPasswordForUser(USER.ML_VIEWER)) + .set(COMMON_HEADERS) + .expect(200); + + expect(body.count).to.eql(1); + expect(body.jobs.length).to.eql(1); + expect(body.jobs[0].job_id).to.eql(`${jobId}_1`); + }); + + it('should fetch anomaly detector jobs based on provided ids', async () => { + const { body } = await supertest + .get(`/api/ml/anomaly_detectors/${jobId}_1,${jobId}_2`) + .auth(USER.ML_VIEWER, ml.securityCommon.getPasswordForUser(USER.ML_VIEWER)) + .set(COMMON_HEADERS) + .expect(200); + + expect(body.count).to.eql(2); + expect(body.jobs.length).to.eql(2); + expect(body.jobs[0].job_id).to.eql(`${jobId}_1`); + expect(body.jobs[1].job_id).to.eql(`${jobId}_2`); + }); + + it('should not allow to retrieve a job for the user without required permissions', async () => { + const { body } = await supertest + .get(`/api/ml/anomaly_detectors/${jobId}_1`) + .auth(USER.ML_UNAUTHORIZED, ml.securityCommon.getPasswordForUser(USER.ML_UNAUTHORIZED)) + .set(COMMON_HEADERS) + .expect(404); + + expect(body.error).to.eql('Not Found'); + expect(body.message).to.eql('Not Found'); + }); + }); + + describe('GetAnomalyDetectorsStats', () => { + it('should fetch jobs stats', async () => { + const { body } = await supertest + .get(`/api/ml/anomaly_detectors/_stats`) + .auth(USER.ML_VIEWER, ml.securityCommon.getPasswordForUser(USER.ML_VIEWER)) + .set(COMMON_HEADERS) + .expect(200); + + expect(body.count).to.eql(2); + expect(body.jobs.length).to.eql(2); + expect(body.jobs[0].job_id).to.eql(`${jobId}_1`); + expect(body.jobs[0]).to.keys( + 'timing_stats', + 'state', + 'forecasts_stats', + 'model_size_stats', + 'data_counts' + ); + expect(body.jobs[1].job_id).to.eql(`${jobId}_2`); + }); + + it('should not allow to retrieve jobs stats for the user without required permissions', async () => { + const { body } = await supertest + .get(`/api/ml/anomaly_detectors/_stats`) + .auth(USER.ML_UNAUTHORIZED, ml.securityCommon.getPasswordForUser(USER.ML_UNAUTHORIZED)) + .set(COMMON_HEADERS) + .expect(404); + + expect(body.error).to.eql('Not Found'); + expect(body.message).to.eql('Not Found'); + }); + }); + + describe('GetAnomalyDetectorsStatsById', () => { + it('should fetch single job stats', async () => { + const { body } = await supertest + .get(`/api/ml/anomaly_detectors/${jobId}_1/_stats`) + .auth(USER.ML_VIEWER, ml.securityCommon.getPasswordForUser(USER.ML_VIEWER)) + .set(COMMON_HEADERS) + .expect(200); + + expect(body.count).to.eql(1); + expect(body.jobs.length).to.eql(1); + expect(body.jobs[0].job_id).to.eql(`${jobId}_1`); + expect(body.jobs[0]).to.keys( + 'timing_stats', + 'state', + 'forecasts_stats', + 'model_size_stats', + 'data_counts' + ); + }); + + it('should fetch multiple jobs stats based on provided ids', async () => { + const { body } = await supertest + .get(`/api/ml/anomaly_detectors/${jobId}_1,${jobId}_2/_stats`) + .auth(USER.ML_VIEWER, ml.securityCommon.getPasswordForUser(USER.ML_VIEWER)) + .set(COMMON_HEADERS) + .expect(200); + + expect(body.count).to.eql(2); + expect(body.jobs.length).to.eql(2); + expect(body.jobs[0].job_id).to.eql(`${jobId}_1`); + expect(body.jobs[0]).to.keys( + 'timing_stats', + 'state', + 'forecasts_stats', + 'model_size_stats', + 'data_counts' + ); + expect(body.jobs[1].job_id).to.eql(`${jobId}_2`); + }); + + it('should not allow to retrieve a job stats for the user without required permissions', async () => { + const { body } = await supertest + .get(`/api/ml/anomaly_detectors/${jobId}_1/_stats`) + .auth(USER.ML_UNAUTHORIZED, ml.securityCommon.getPasswordForUser(USER.ML_UNAUTHORIZED)) + .set(COMMON_HEADERS) + .expect(404); + + expect(body.error).to.eql('Not Found'); + expect(body.message).to.eql('Not Found'); + }); + }); + }); +}; diff --git a/x-pack/test/api_integration/apis/ml/anomaly_detectors/index.ts b/x-pack/test/api_integration/apis/ml/anomaly_detectors/index.ts index fb8acaf5c3ae9..3985cd39e4d1c 100644 --- a/x-pack/test/api_integration/apis/ml/anomaly_detectors/index.ts +++ b/x-pack/test/api_integration/apis/ml/anomaly_detectors/index.ts @@ -8,5 +8,6 @@ import { FtrProviderContext } from '../../../ftr_provider_context'; export default function({ loadTestFile }: FtrProviderContext) { describe('anomaly detectors', function() { loadTestFile(require.resolve('./create')); + loadTestFile(require.resolve('./get')); }); } From d005a55d163bbb550af4b8ba6eac75572b11cd20 Mon Sep 17 00:00:00 2001 From: Dima Arnautov Date: Mon, 11 May 2020 14:06:54 +0200 Subject: [PATCH 061/102] [ML] API integration tests for fetching anomalies table data (#65844) --- x-pack/test/api_integration/apis/ml/index.ts | 1 + .../ml/results/get_anomalies_table_data.ts | 136 ++++++++++++++++++ .../api_integration/apis/ml/results/index.ts | 12 ++ 3 files changed, 149 insertions(+) create mode 100644 x-pack/test/api_integration/apis/ml/results/get_anomalies_table_data.ts create mode 100644 x-pack/test/api_integration/apis/ml/results/index.ts diff --git a/x-pack/test/api_integration/apis/ml/index.ts b/x-pack/test/api_integration/apis/ml/index.ts index 58356637c63ac..df99b125e6adb 100644 --- a/x-pack/test/api_integration/apis/ml/index.ts +++ b/x-pack/test/api_integration/apis/ml/index.ts @@ -37,5 +37,6 @@ export default function({ getService, loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./fields_service')); loadTestFile(require.resolve('./job_validation')); loadTestFile(require.resolve('./jobs')); + loadTestFile(require.resolve('./results')); }); } diff --git a/x-pack/test/api_integration/apis/ml/results/get_anomalies_table_data.ts b/x-pack/test/api_integration/apis/ml/results/get_anomalies_table_data.ts new file mode 100644 index 0000000000000..9f34a3c639562 --- /dev/null +++ b/x-pack/test/api_integration/apis/ml/results/get_anomalies_table_data.ts @@ -0,0 +1,136 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import expect from '@kbn/expect'; +import { USER } from '../../../../functional/services/machine_learning/security_common'; +import { FtrProviderContext } from '../../../ftr_provider_context'; +import { Datafeed, Job } from '../../../../../plugins/ml/common/types/anomaly_detection_jobs'; + +// eslint-disable-next-line import/no-default-export +export default ({ getService }: FtrProviderContext) => { + const esArchiver = getService('esArchiver'); + const supertest = getService('supertestWithoutAuth'); + const ml = getService('ml'); + + const COMMON_HEADERS = { + 'kbn-xsrf': 'some-xsrf-token', + }; + + const JOB_CONFIG: Job = { + job_id: `fq_multi_1_ae`, + description: + 'mean/min/max(responsetime) partition=airline on farequote dataset with 1h bucket span', + groups: ['farequote', 'automated', 'multi-metric'], + analysis_config: { + bucket_span: '1h', + influencers: ['airline'], + detectors: [ + { function: 'mean', field_name: 'responsetime', partition_field_name: 'airline' }, + { function: 'min', field_name: 'responsetime', partition_field_name: 'airline' }, + { function: 'max', field_name: 'responsetime', partition_field_name: 'airline' }, + ], + }, + data_description: { time_field: '@timestamp' }, + analysis_limits: { model_memory_limit: '20mb' }, + model_plot_config: { enabled: true }, + }; + + const DATAFEED_CONFIG: Datafeed = { + datafeed_id: 'datafeed-fq_multi_1_se', + indices: ['ft_farequote'], + job_id: 'fq_multi_1_ae', + query: { bool: { must: [{ match_all: {} }] } }, + }; + + async function createMockJobs() { + await ml.api.createAndRunAnomalyDetectionLookbackJob(JOB_CONFIG, DATAFEED_CONFIG); + } + + describe('GetAnomaliesTableData', () => { + before(async () => { + await esArchiver.loadIfNeeded('ml/farequote'); + await ml.testResources.setKibanaTimeZoneToUTC(); + await createMockJobs(); + }); + + after(async () => { + await ml.api.cleanMlIndices(); + }); + + it('should fetch anomalies table data', async () => { + const requestBody = { + jobIds: [JOB_CONFIG.job_id], + criteriaFields: [{ fieldName: 'detector_index', fieldValue: 0 }], + influencers: [], + aggregationInterval: 'auto', + threshold: 0, + earliestMs: 1454889600000, // February 8, 2016 12:00:00 AM GMT + latestMs: 1454976000000, // February 9, 2016 12:00:00 AM GMT + dateFormatTz: 'UTC', + maxRecords: 500, + }; + + const { body } = await supertest + .post(`/api/ml/results/anomalies_table_data`) + .auth(USER.ML_VIEWER, ml.securityCommon.getPasswordForUser(USER.ML_VIEWER)) + .set(COMMON_HEADERS) + .send(requestBody) + .expect(200); + + expect(body.interval).to.eql('hour'); + expect(body.anomalies.length).to.eql(12); + }); + + it('should validate request body', async () => { + const requestBody = { + // missing jobIds + criteriaFields: [{ fieldName: 'detector_index', fieldValue: 0 }], + influencers: [], + aggregationInterval: 'auto', + threshold: 0, + // invalid earliest and latest instead of earliestMs and latestMs + earliest: 1454889600000, // February 8, 2016 12:00:00 AM GMT + latest: 1454976000000, // February 9, 2016 12:00:00 AM GMT + dateFormatTz: 'UTC', + maxRecords: 500, + }; + + const { body } = await supertest + .post(`/api/ml/results/anomalies_table_data`) + .auth(USER.ML_VIEWER, ml.securityCommon.getPasswordForUser(USER.ML_VIEWER)) + .set(COMMON_HEADERS) + .send(requestBody) + .expect(400); + + expect(body.error).to.eql('Bad Request'); + expect(body.message).to.eql( + '[request body.jobIds]: expected value of type [array] but got [undefined]' + ); + }); + + it('should not allow fetching of anomalies table data without required permissions', async () => { + const requestBody = { + jobIds: [JOB_CONFIG.job_id], + criteriaFields: [{ fieldName: 'detector_index', fieldValue: 0 }], + influencers: [], + aggregationInterval: 'auto', + threshold: 0, + earliestMs: 1454889600000, // February 8, 2016 12:00:00 AM GMT + latestMs: 1454976000000, // February 9, 2016 12:00:00 AM GMT + dateFormatTz: 'UTC', + maxRecords: 500, + }; + const { body } = await supertest + .post(`/api/ml/results/anomalies_table_data`) + .auth(USER.ML_UNAUTHORIZED, ml.securityCommon.getPasswordForUser(USER.ML_UNAUTHORIZED)) + .set(COMMON_HEADERS) + .send(requestBody) + .expect(404); + + expect(body.error).to.eql('Not Found'); + expect(body.message).to.eql('Not Found'); + }); + }); +}; diff --git a/x-pack/test/api_integration/apis/ml/results/index.ts b/x-pack/test/api_integration/apis/ml/results/index.ts new file mode 100644 index 0000000000000..80197e6a32ad9 --- /dev/null +++ b/x-pack/test/api_integration/apis/ml/results/index.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; + * you may not use this file except in compliance with the Elastic License. + */ +import { FtrProviderContext } from '../../../ftr_provider_context'; + +export default function({ loadTestFile }: FtrProviderContext) { + describe('ResultsService', () => { + loadTestFile(require.resolve('./get_anomalies_table_data')); + }); +} From 0830a8bd4c67c63ee08a10bce81ec8d6f766904b Mon Sep 17 00:00:00 2001 From: Nicolas Chaulet Date: Mon, 11 May 2020 08:11:17 -0400 Subject: [PATCH 062/102] [Ingest] Validate config_id when creating an enrollment API key (#65765) --- .../routes/enrollment_api_key/handler.ts | 6 + .../services/api_keys/enrollment_api_key.ts | 15 + .../apis/fleet/enrollment_api_keys/crud.ts | 19 +- .../es_archives/fleet/agents/data.json | 27 + .../es_archives/fleet/agents/mappings.json | 678 ++++++++++-------- 5 files changed, 458 insertions(+), 287 deletions(-) diff --git a/x-pack/plugins/ingest_manager/server/routes/enrollment_api_key/handler.ts b/x-pack/plugins/ingest_manager/server/routes/enrollment_api_key/handler.ts index 9d3eb5360dbe3..94fc6de609613 100644 --- a/x-pack/plugins/ingest_manager/server/routes/enrollment_api_key/handler.ts +++ b/x-pack/plugins/ingest_manager/server/routes/enrollment_api_key/handler.ts @@ -58,6 +58,12 @@ export const postEnrollmentApiKeyHandler: RequestHandler< return response.ok({ body }); } catch (e) { + if (e.isBoom) { + return response.customError({ + statusCode: e.output.statusCode, + body: { message: e.message }, + }); + } return response.customError({ statusCode: 500, body: { message: e.message }, diff --git a/x-pack/plugins/ingest_manager/server/services/api_keys/enrollment_api_key.ts b/x-pack/plugins/ingest_manager/server/services/api_keys/enrollment_api_key.ts index 1ac812c3380cd..3b003f47eb6f9 100644 --- a/x-pack/plugins/ingest_manager/server/services/api_keys/enrollment_api_key.ts +++ b/x-pack/plugins/ingest_manager/server/services/api_keys/enrollment_api_key.ts @@ -5,6 +5,7 @@ */ import uuid from 'uuid'; +import Boom from 'boom'; import { SavedObjectsClientContract, SavedObject } from 'src/core/server'; import { EnrollmentAPIKey, EnrollmentAPIKeySOAttributes } from '../../types'; import { ENROLLMENT_API_KEYS_SAVED_OBJECT_TYPE } from '../../constants'; @@ -106,6 +107,9 @@ export async function generateEnrollmentAPIKey( ) { const id = uuid.v4(); const { name: providedKeyName } = data; + if (data.configId) { + await validateConfigId(soClient, data.configId); + } const configId = data.configId ?? (await agentConfigService.getDefaultAgentConfigId(soClient)); const name = providedKeyName ? `${providedKeyName} (${id})` : id; const key = await createAPIKey(soClient, name, { @@ -143,6 +147,17 @@ export async function generateEnrollmentAPIKey( return getEnrollmentAPIKey(soClient, so.id); } +async function validateConfigId(soClient: SavedObjectsClientContract, configId: string) { + try { + await agentConfigService.get(soClient, configId); + } catch (e) { + if (e.isBoom && e.output.statusCode === 404) { + throw Boom.badRequest(`Agent config ${configId} does not exist`); + } + throw e; + } +} + function savedObjectToEnrollmentApiKey({ error, attributes, diff --git a/x-pack/test/api_integration/apis/fleet/enrollment_api_keys/crud.ts b/x-pack/test/api_integration/apis/fleet/enrollment_api_keys/crud.ts index 602ec6ca9d9e4..9d0629a7b32e2 100644 --- a/x-pack/test/api_integration/apis/fleet/enrollment_api_keys/crud.ts +++ b/x-pack/test/api_integration/apis/fleet/enrollment_api_keys/crud.ts @@ -25,6 +25,7 @@ export default function(providerContext: FtrProviderContext) { after(async () => { await esArchiver.unload('fleet/agents'); }); + describe('GET /fleet/enrollment-api-keys', async () => { it('should list existing api keys', async () => { const { body: apiResponse } = await supertest @@ -54,7 +55,7 @@ export default function(providerContext: FtrProviderContext) { .post(`/api/ingest_manager/fleet/enrollment-api-keys`) .set('kbn-xsrf', 'xxx') .send({ - config_id: 'policy1', + config_id: 'config1', }) .expect(200); keyId = apiResponse.item.id; @@ -89,12 +90,22 @@ export default function(providerContext: FtrProviderContext) { .expect(400); }); - it('should allow to create an enrollment api key with a policy', async () => { + it('should not allow to create an enrollment api key for a non existing agent config', async () => { + await supertest + .post(`/api/ingest_manager/fleet/enrollment-api-keys`) + .set('kbn-xsrf', 'xxx') + .send({ + config_id: 'idonotexistsconfig', + }) + .expect(400); + }); + + it('should allow to create an enrollment api key with an agent config', async () => { const { body: apiResponse } = await supertest .post(`/api/ingest_manager/fleet/enrollment-api-keys`) .set('kbn-xsrf', 'xxx') .send({ - config_id: 'policy1', + config_id: 'config1', }) .expect(200); @@ -107,7 +118,7 @@ export default function(providerContext: FtrProviderContext) { .post(`/api/ingest_manager/fleet/enrollment-api-keys`) .set('kbn-xsrf', 'xxx') .send({ - config_id: 'policy1', + config_id: 'config1', }) .expect(200); expect(apiResponse.success).to.eql(true); diff --git a/x-pack/test/functional/es_archives/fleet/agents/data.json b/x-pack/test/functional/es_archives/fleet/agents/data.json index d22e3cd3fecdd..1739f583b2e87 100644 --- a/x-pack/test/functional/es_archives/fleet/agents/data.json +++ b/x-pack/test/functional/es_archives/fleet/agents/data.json @@ -199,3 +199,30 @@ } } } + +{ + "type": "doc", + "value": { + "id": "ingest-agent-configs:config1", + "index": ".kibana", + "source": { + "type": "ingest-agent-configs", + "ingest-agent-configs": { + "name": "Test config", + "namespace": "default", + "description": "Config 1", + "status": "active", + "datasources": [], + "is_default": true, + "monitoring_enabled": [ + "logs", + "metrics" + ], + "revision": 2, + "updated_on": "2020-05-07T19:34:42.533Z", + "updated_by": "system", + "id": "config1" + } + } + } +} 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 409cc3c689eaf..15e5a5524107b 100644 --- a/x-pack/test/functional/es_archives/fleet/agents/mappings.json +++ b/x-pack/test/functional/es_archives/fleet/agents/mappings.json @@ -9,39 +9,42 @@ "dynamic": "strict", "_meta": { "migrationMappingPropertyHashes": { - "ingest-outputs": "aee9782e0d500b867859650a36280165", "ml-telemetry": "257fd1d4b4fdbb9cb4b8a3b27da201e9", "visualization": "52d7a13ad68a150c4525b292d23e12cc", "references": "7997cf5a56cc02bdc9c93361bde732b0", "graph-workspace": "cd7ba1330e6682e9cc00b78850874be1", + "epm-packages": "92b4b1899b887b090d01c033f3118a85", "type": "2f4316de49999235636386fe51dc06c1", - "infrastructure-ui-source": "ddc0ecb18383f6b26101a2fadb2dab0c", "space": "c5ca8acafa0beaa4d08d014a97b6bc6b", + "infrastructure-ui-source": "ddc0ecb18383f6b26101a2fadb2dab0c", + "ingest_manager_settings": "c5b0749b4ab03c582efd4c14cb8f132c", "application_usage_totals": "c897e4310c5f24b07caaff3db53ae2c1", "action": "6e96ac5e648f57523879661ea72525b7", - "agent_configs": "38abaf89513877745c359e7700c0c66a", "dashboard": "d00f614b29a80360e1190193fd333bab", - "metrics-explorer-view": "53c5365793677328df0ccb6138bf3cdd", - "siem-detection-engine-rule-actions": "90eee2e4635260f4be0a1da8f5bc0aa0", - "fleet-agent-events": "3231653fafe4ef3196fe3b32ab774bf2", + "metrics-explorer-view": "428e319af3e822c80a84cf87123ca35c", + "siem-detection-engine-rule-actions": "6569b288c169539db10cb262bf79de18", "query": "11aaeb7f5f7fa5bb43f25e18ce26e7d9", "file-upload-telemetry": "0ed4d3e1983d1217a30982630897092e", "application_usage_transactional": "965839e75f809fefe04f92dc4d99722a", "action_task_params": "a9d49f184ee89641044be0ca2950fa3a", + "fleet-agent-events": "3231653fafe4ef3196fe3b32ab774bf2", + "ingest-datasources": "2346514df03316001d56ed4c8d46fa94", "apm-indices": "9bb9b2bf1fa636ed8619cbab5ce6a1dd", - "inventory-view": "9ecce5b58867403613d82fe496470b34", - "fleet-enrollment-api-keys": "28b91e20b105b6f928e2012600085d8f", - "upgrade-assistant-reindex-operation": "a53a20fe086b72c9a86da3cc12dad8a6", + "inventory-view": "5299b67717e96502c77babf1c16fd4d3", + "upgrade-assistant-reindex-operation": "296a89039fc4260292be36b1b005d8f2", "cases-comments": "c2061fb929f585df57425102fa928b4b", + "fleet-enrollment-api-keys": "28b91e20b105b6f928e2012600085d8f", "canvas-element": "7390014e1091044523666d97247392fc", - "datasources": "d4bc0c252b2b5683ff21ea32d00acffc", + "ingest-outputs": "0e57221778a7153c8292edf154099036", "telemetry": "36a616f7026dfa617d6655df850fe16d", "upgrade-assistant-telemetry": "56702cec857e0a9dacfb696655b4ff7b", "lens-ui-telemetry": "509bfa5978586998e05f9e303c07a327", + "namespaces": "2f4316de49999235636386fe51dc06c1", "server": "ec97f1c5da1a19609a60874e5af1100c", "siem-ui-timeline-note": "8874706eedc49059d4cf0f5094559084", "lens": "21c3ea0763beb1ecb0162529706b88c5", "sample-data-telemetry": "7d3cfeb915303c9641c59681967ffeb4", + "fleet-agent-actions": "e520c855577170c24481be05c3ae14ec", "search": "181661168bbadd1eff5902361e2a0d5c", "updated_at": "00da57df13e94e9d98437d13ace4bfe0", "cases-configure": "42711cbb311976c0687853f4c1354572", @@ -49,23 +52,22 @@ "alert": "7b44fba6773e37c806ce290ea9b7024e", "siem-detection-engine-rule-status": "ae783f41c6937db6b7a2ef5c93a9e9b0", "map": "23d7aa4a720d4938ccde3983f87bd58d", - "uptime-dynamic-settings": "b6289473c8985c79b6c47eebc19a0ca5", - "epm-packages": "75d12cd13c867fd713d7dfb27366bc20", + "uptime-dynamic-settings": "fcdb453a30092f022f2642db29523d80", + "cases": "32aa96a6d3855ddda53010ae2048ac22", "apm-telemetry": "3525d7c22c42bc80f5e6e9cb3f2b26a2", - "cases": "08b8b110dbca273d37e8aef131ecab61", - "siem-ui-timeline": "ac8020190f5950dd3250b6499144e7fb", + "siem-ui-timeline": "f2d929253ecd06ffbac78b4047f45a86", "kql-telemetry": "d12a98a6f19a2d273696597547e064ee", "ui-metric": "0d409297dc5ebe1e3a1da691c6ee32e3", - "url": "c7f66a0df8b1b52f17c28c4adb111105", - "fleet-agents": "c3eeb7b9d97176f15f6d126370ab23c7", + "ingest-agent-configs": "f4bdc17427437537ca1754d5d5057ad5", + "url": "b675c3be8d76ecf029294d51dc7ec65d", "migrationVersion": "4a1746014a75ade3a714e1db5763276f", "index-pattern": "66eccb05066c5a89924f48a9e9736499", - "maps-telemetry": "268da3a48066123fc5baf35abaa55014", + "fleet-agents": "864760267df6c970f629bd4458506c53", + "maps-telemetry": "bfd39d88aadadb4be597ea984d433dbe", "namespace": "2f4316de49999235636386fe51dc06c1", "cases-user-actions": "32277330ec6b721abe3b846cfd939a71", - "fleet-agent-actions": "ed270b46812f0fa1439366c428a2cf17", - "siem-ui-timeline-pinned-event": "20638091112f0e14f0e443d512301c29", "timelion-sheet": "9a2a2748877c7a7b582fef201ab1d4cf", + "siem-ui-timeline-pinned-event": "20638091112f0e14f0e443d512301c29", "config": "ae24d22d5986d04124cc6568f771066f", "tsvb-validation-telemetry": "3a37ef6c8700ae6fc97d5c7da00e9215" } @@ -107,145 +109,6 @@ } } }, - "fleet-agent-actions": { - "properties": { - "agent_id": { - "type": "keyword" - }, - "created_at": { - "type": "date" - }, - "data": { - "type": "flattened" - }, - "sent_at": { - "type": "date" - }, - "type": { - "type": "keyword" - } - } - }, - "agent_configs": { - "properties": { - "datasources": { - "type": "keyword" - }, - "description": { - "type": "text" - }, - "id": { - "type": "keyword" - }, - "is_default": { - "type": "boolean" - }, - "name": { - "type": "text" - }, - "namespace": { - "type": "keyword" - }, - "revision": { - "type": "integer" - }, - "status": { - "type": "keyword" - }, - "updated_by": { - "type": "keyword" - }, - "updated_on": { - "type": "keyword" - } - } - }, - "fleet-agent-events": { - "properties": { - "action_id": { - "type": "keyword" - }, - "agent_id": { - "type": "keyword" - }, - "config_id": { - "type": "keyword" - }, - "data": { - "type": "text" - }, - "message": { - "type": "text" - }, - "payload": { - "type": "text" - }, - "stream_id": { - "type": "keyword" - }, - "subtype": { - "type": "keyword" - }, - "timestamp": { - "type": "date" - }, - "type": { - "type": "keyword" - } - } - }, - "fleet-agents": { - "properties": { - "access_api_key_id": { - "type": "keyword" - }, - "active": { - "type": "boolean" - }, - "config_id": { - "type": "keyword" - }, - "config_newest_revision": { - "type": "integer" - }, - "config_revision": { - "type": "integer" - }, - "current_error_events": { - "type": "text" - }, - "default_api_key": { - "type": "keyword" - }, - "enrolled_at": { - "type": "date" - }, - "last_checkin": { - "type": "date" - }, - "last_updated": { - "type": "date" - }, - "local_metadata": { - "type": "flattened" - }, - "shared_id": { - "type": "keyword" - }, - "type": { - "type": "keyword" - }, - "updated_at": { - "type": "date" - }, - "user_provided_metadata": { - "type": "flattened" - }, - "version": { - "type": "keyword" - } - } - }, "alert": { "properties": { "actions": { @@ -1355,6 +1218,9 @@ } } }, + "connector_id": { + "type": "keyword" + }, "created_at": { "type": "date" }, @@ -1630,137 +1496,180 @@ } } }, - "datasources": { + "epm-packages": { "properties": { - "config_id": { - "type": "keyword" - }, - "description": { - "type": "text" - }, - "enabled": { - "type": "boolean" + "es_index_patterns": { + "type": "object", + "dynamic": "false" }, - "inputs": { + "installed": { "type": "nested", "properties": { - "config": { - "type": "flattened" - }, - "enabled": { - "type": "boolean" - }, - "processors": { + "id": { "type": "keyword" }, - "streams": { - "type": "nested", - "properties": { - "config": { - "type": "flattened" - }, - "dataset": { - "type": "keyword" - }, - "enabled": { - "type": "boolean" - }, - "id": { - "type": "keyword" - }, - "processors": { - "type": "keyword" - } - } - }, "type": { "type": "keyword" } } }, + "internal": { + "type": "boolean" + }, "name": { "type": "keyword" }, - "namespace": { - "type": "keyword" + "removable": { + "type": "boolean" }, - "output_id": { + "version": { "type": "keyword" - }, - "package": { - "properties": { - "name": { - "type": "keyword" - }, - "title": { - "type": "keyword" - }, - "version": { - "type": "keyword" - } - } - }, - "revision": { - "type": "integer" } } }, - "fleet-enrollment-api-keys": { + "file-upload-telemetry": { "properties": { - "active": { - "type": "boolean" - }, - "api_key": { - "type": "binary" - }, - "api_key_id": { - "type": "keyword" - }, - "config_id": { + "filesUploadedTotalCount": { + "type": "long" + } + } + }, + "fleet-agent-actions": { + "properties": { + "agent_id": { "type": "keyword" }, "created_at": { "type": "date" }, - "expire_at": { - "type": "date" + "data": { + "type": "binary" }, - "name": { - "type": "keyword" + "sent_at": { + "type": "date" }, "type": { "type": "keyword" - }, - "updated_at": { - "type": "date" } } }, - "epm-packages": { + "fleet-agent-events": { "properties": { - "installed": { - "type": "nested", - "properties": { - "id": { - "type": "keyword" - }, - "type": { - "type": "keyword" - } - } - }, - "name": { + "action_id": { + "type": "keyword" + }, + "agent_id": { + "type": "keyword" + }, + "config_id": { + "type": "keyword" + }, + "data": { + "type": "text" + }, + "message": { + "type": "text" + }, + "payload": { + "type": "text" + }, + "stream_id": { + "type": "keyword" + }, + "subtype": { + "type": "keyword" + }, + "timestamp": { + "type": "date" + }, + "type": { + "type": "keyword" + } + } + }, + "fleet-agents": { + "properties": { + "access_api_key_id": { + "type": "keyword" + }, + "active": { + "type": "boolean" + }, + "config_id": { + "type": "keyword" + }, + "config_newest_revision": { + "type": "integer" + }, + "config_revision": { + "type": "integer" + }, + "current_error_events": { + "type": "text" + }, + "default_api_key": { + "type": "keyword" + }, + "default_api_key_id": { + "type": "keyword" + }, + "enrolled_at": { + "type": "date" + }, + "last_checkin": { + "type": "date" + }, + "last_updated": { + "type": "date" + }, + "local_metadata": { + "type": "flattened" + }, + "shared_id": { "type": "keyword" }, + "type": { + "type": "keyword" + }, + "updated_at": { + "type": "date" + }, + "user_provided_metadata": { + "type": "flattened" + }, "version": { "type": "keyword" } } }, - "file-upload-telemetry": { + "fleet-enrollment-api-keys": { "properties": { - "filesUploadedTotalCount": { - "type": "long" + "active": { + "type": "boolean" + }, + "api_key": { + "type": "binary" + }, + "api_key_id": { + "type": "keyword" + }, + "config_id": { + "type": "keyword" + }, + "created_at": { + "type": "date" + }, + "expire_at": { + "type": "date" + }, + "name": { + "type": "keyword" + }, + "type": { + "type": "keyword" + }, + "updated_at": { + "type": "date" } } }, @@ -1888,8 +1797,176 @@ } } }, + "ingest-agent-configs": { + "properties": { + "datasources": { + "type": "keyword" + }, + "description": { + "type": "text" + }, + "id": { + "type": "keyword" + }, + "is_default": { + "type": "boolean" + }, + "monitoring_enabled": { + "type": "keyword" + }, + "name": { + "type": "text" + }, + "namespace": { + "type": "keyword" + }, + "revision": { + "type": "integer" + }, + "status": { + "type": "keyword" + }, + "updated_by": { + "type": "keyword" + }, + "updated_on": { + "type": "keyword" + } + } + }, + "ingest-datasources": { + "properties": { + "config_id": { + "type": "keyword" + }, + "description": { + "type": "text" + }, + "enabled": { + "type": "boolean" + }, + "inputs": { + "type": "nested", + "properties": { + "config": { + "type": "flattened" + }, + "enabled": { + "type": "boolean" + }, + "processors": { + "type": "keyword" + }, + "streams": { + "type": "nested", + "properties": { + "agent_stream": { + "type": "flattened" + }, + "config": { + "type": "flattened" + }, + "dataset": { + "type": "keyword" + }, + "enabled": { + "type": "boolean" + }, + "id": { + "type": "keyword" + }, + "processors": { + "type": "keyword" + }, + "vars": { + "type": "flattened" + } + } + }, + "type": { + "type": "keyword" + }, + "vars": { + "type": "flattened" + } + } + }, + "name": { + "type": "keyword" + }, + "namespace": { + "type": "keyword" + }, + "output_id": { + "type": "keyword" + }, + "package": { + "properties": { + "name": { + "type": "keyword" + }, + "title": { + "type": "keyword" + }, + "version": { + "type": "keyword" + } + } + }, + "revision": { + "type": "integer" + } + } + }, + "ingest-outputs": { + "properties": { + "ca_sha256": { + "type": "keyword" + }, + "config": { + "type": "flattened" + }, + "fleet_enroll_password": { + "type": "binary" + }, + "fleet_enroll_username": { + "type": "binary" + }, + "hosts": { + "type": "keyword" + }, + "is_default": { + "type": "boolean" + }, + "name": { + "type": "keyword" + }, + "type": { + "type": "keyword" + } + } + }, + "ingest_manager_settings": { + "properties": { + "agent_auto_upgrade": { + "type": "keyword" + }, + "kibana_ca_sha256": { + "type": "keyword" + }, + "kibana_url": { + "type": "keyword" + }, + "package_auto_upgrade": { + "type": "keyword" + } + } + }, "inventory-view": { "properties": { + "accountId": { + "type": "keyword" + }, "autoBounds": { "type": "boolean" }, @@ -1983,8 +2060,11 @@ "nodeType": { "type": "keyword" }, + "region": { + "type": "keyword" + }, "time": { - "type": "integer" + "type": "long" }, "view": { "type": "keyword" @@ -2102,6 +2182,12 @@ "indexPatternsWithGeoFieldCount": { "type": "long" }, + "indexPatternsWithGeoPointFieldCount": { + "type": "long" + }, + "indexPatternsWithGeoShapeFieldCount": { + "type": "long" + }, "mapsTotalCount": { "type": "long" }, @@ -2156,6 +2242,9 @@ "filterQuery": { "type": "keyword" }, + "forceInterval": { + "type": "boolean" + }, "groupBy": { "type": "keyword" }, @@ -2211,36 +2300,8 @@ "namespace": { "type": "keyword" }, - "ingest-outputs": { - "properties": { - "api_key": { - "type": "keyword" - }, - "ca_sha256": { - "type": "keyword" - }, - "config": { - "type": "flattened" - }, - "fleet_enroll_password": { - "type": "binary" - }, - "fleet_enroll_username": { - "type": "binary" - }, - "hosts": { - "type": "keyword" - }, - "is_default": { - "type": "boolean" - }, - "name": { - "type": "keyword" - }, - "type": { - "type": "keyword" - } - } + "namespaces": { + "type": "keyword" }, "query": { "properties": { @@ -2346,7 +2407,7 @@ }, "params": { "type": "object", - "dynamic": "true" + "enabled": false } } }, @@ -2647,6 +2708,15 @@ } } }, + "templateTimelineId": { + "type": "text" + }, + "templateTimelineVersion": { + "type": "integer" + }, + "timelineType": { + "type": "keyword" + }, "title": { "type": "text" }, @@ -2827,11 +2897,48 @@ "type": "date" }, "upgrade-assistant-reindex-operation": { - "dynamic": "true", "properties": { + "errorMessage": { + "type": "keyword" + }, "indexName": { "type": "keyword" }, + "lastCompletedStep": { + "type": "integer" + }, + "locked": { + "type": "date" + }, + "newIndexName": { + "type": "keyword" + }, + "reindexOptions": { + "properties": { + "openAndClose": { + "type": "boolean" + }, + "queueSettings": { + "properties": { + "queuedAt": { + "type": "long" + }, + "startedAt": { + "type": "long" + } + } + } + } + }, + "reindexTaskId": { + "type": "keyword" + }, + "reindexTaskPercComplete": { + "type": "float" + }, + "runningReindexCount": { + "type": "integer" + }, "status": { "type": "integer" } @@ -2891,6 +2998,12 @@ }, "uptime-dynamic-settings": { "properties": { + "certAgeThreshold": { + "type": "long" + }, + "certExpirationThreshold": { + "type": "long" + }, "heartbeatIndices": { "type": "keyword" } @@ -2911,8 +3024,7 @@ "type": "text", "fields": { "keyword": { - "type": "keyword", - "ignore_above": 2048 + "type": "keyword" } } } From d4ae987dd40abec422d3d8a74c9c3d5a011b4f5c Mon Sep 17 00:00:00 2001 From: Mikhail Shustov Date: Mon, 11 May 2020 14:21:39 +0200 Subject: [PATCH 063/102] specify last known SO version (#65987) --- .../saved_objects/migrations/core/document_migrator.test.ts | 4 ++-- .../server/saved_objects/migrations/core/document_migrator.ts | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) 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 3ec478e3ca28d..bd10520ca1c57 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 @@ -293,7 +293,7 @@ describe('DocumentMigrator', () => { migrationVersion: { dog: '10.2.0' }, }) ).toThrow( - /Document "smelly" has property "dog" which belongs to a more recent version of Kibana \(10\.2\.0\)/i + /Document "smelly" has property "dog" which belongs to a more recent version of Kibana \[10\.2\.0\]\. The last known version is \[undefined\]/i ); }); @@ -315,7 +315,7 @@ describe('DocumentMigrator', () => { migrationVersion: { dawg: '1.2.4' }, }) ).toThrow( - /Document "fleabag" has property "dawg" which belongs to a more recent version of Kibana \(1\.2\.4\)/i + /Document "fleabag" has property "dawg" which belongs to a more recent version of Kibana \[1\.2\.4\]\. The last known version is \[1\.2\.3\]/i ); }); 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 4ddb2b070d3ac..07c1da5586107 100644 --- a/src/core/server/saved_objects/migrations/core/document_migrator.ts +++ b/src/core/server/saved_objects/migrations/core/document_migrator.ts @@ -350,7 +350,7 @@ function nextUnmigratedProp(doc: SavedObjectUnsanitizedDoc, migrations: ActiveMi if (docVersion && (!latestVersion || Semver.gt(docVersion, latestVersion))) { throw Boom.badData( `Document "${doc.id}" has property "${p}" which belongs to a more recent` + - ` version of Kibana (${docVersion}).`, + ` version of Kibana [${docVersion}]. The last known version is [${latestVersion}]`, doc ); } From d29370207126fc8537aa7072de5cc599e47ae7f1 Mon Sep 17 00:00:00 2001 From: Mikhail Shustov Date: Mon, 11 May 2020 14:21:55 +0200 Subject: [PATCH 064/102] load VizOptions component lazily (#64778) Co-authored-by: Elastic Machine --- .../public/components/table_vis_options.tsx | 5 ++-- .../components/table_vis_options_lazy.tsx | 30 +++++++++++++++++++ .../vis_type_table/public/table_vis_type.ts | 2 +- 3 files changed, 34 insertions(+), 3 deletions(-) create mode 100644 src/plugins/vis_type_table/public/components/table_vis_options_lazy.tsx diff --git a/src/plugins/vis_type_table/public/components/table_vis_options.tsx b/src/plugins/vis_type_table/public/components/table_vis_options.tsx index 68348d5ef1060..837d478535936 100644 --- a/src/plugins/vis_type_table/public/components/table_vis_options.tsx +++ b/src/plugins/vis_type_table/public/components/table_vis_options.tsx @@ -147,5 +147,6 @@ function TableOptions({ ); } - -export { TableOptions }; +// default export required for React.Lazy +// eslint-disable-next-line import/no-default-export +export { TableOptions as default }; diff --git a/src/plugins/vis_type_table/public/components/table_vis_options_lazy.tsx b/src/plugins/vis_type_table/public/components/table_vis_options_lazy.tsx new file mode 100644 index 0000000000000..ca273aa771ef1 --- /dev/null +++ b/src/plugins/vis_type_table/public/components/table_vis_options_lazy.tsx @@ -0,0 +1,30 @@ +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +import React, { lazy, Suspense } from 'react'; +import { EuiLoadingSpinner } from '@elastic/eui'; +import { VisOptionsProps } from 'src/plugins/vis_default_editor/public'; +import { TableVisParams } from '../types'; + +const TableOptionsComponent = lazy(() => import('./table_vis_options')); + +export const TableOptions = (props: VisOptionsProps) => ( + }> + + +); diff --git a/src/plugins/vis_type_table/public/table_vis_type.ts b/src/plugins/vis_type_table/public/table_vis_type.ts index 26e5ac8cfd71a..c3bc72497007e 100644 --- a/src/plugins/vis_type_table/public/table_vis_type.ts +++ b/src/plugins/vis_type_table/public/table_vis_type.ts @@ -24,7 +24,7 @@ import { Vis } from '../../visualizations/public'; import { tableVisResponseHandler } from './table_vis_response_handler'; // @ts-ignore import tableVisTemplate from './table_vis.html'; -import { TableOptions } from './components/table_vis_options'; +import { TableOptions } from './components/table_vis_options_lazy'; import { getTableVisualizationControllerClass } from './vis_controller'; export function getTableVisTypeDefinition(core: CoreSetup, context: PluginInitializerContext) { From 92c6ffa909e26aa887b52ea2219197f94e9fdf1f Mon Sep 17 00:00:00 2001 From: Anton Dosov Date: Mon, 11 May 2020 14:22:09 +0200 Subject: [PATCH 065/102] stabilize async_dashboard test (#65976) --- x-pack/test/functional/apps/dashboard/_async_dashboard.ts | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/x-pack/test/functional/apps/dashboard/_async_dashboard.ts b/x-pack/test/functional/apps/dashboard/_async_dashboard.ts index 2c8abda999ddd..82641db457aea 100644 --- a/x-pack/test/functional/apps/dashboard/_async_dashboard.ts +++ b/x-pack/test/functional/apps/dashboard/_async_dashboard.ts @@ -9,6 +9,7 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default function({ getService, getPageObjects }: FtrProviderContext) { const retry = getService('retry'); + const browser = getService('browser'); const kibanaServer = getService('kibanaServer'); const log = getService('log'); const pieChart = getService('pieChart'); @@ -93,6 +94,9 @@ export default function({ getService, getPageObjects }: FtrProviderContext) { ]`; await kibanaServer.uiSettings.update({ 'timepicker:quickRanges': SAMPLE_DATA_RANGE }); + // refresh page to make sure ui settings update is picked up + await browser.refresh(); + await PageObjects.header.waitUntilLoadingHasFinished(); await appMenu.clickLink('Discover'); await PageObjects.discover.selectIndexPattern('kibana_sample_data_flights'); await PageObjects.timePicker.setCommonlyUsedTime('sample_data range'); @@ -104,6 +108,7 @@ export default function({ getService, getPageObjects }: FtrProviderContext) { after(async () => { await PageObjects.common.navigateToUrl('home', 'tutorial_directory/sampleData'); + await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.home.removeSampleDataSet('flights'); const isInstalled = await PageObjects.home.isSampleDataSetInstalled('flights'); expect(isInstalled).to.be(false); From b180fd378dbb622d01c8fefd0712a3c27ed59f39 Mon Sep 17 00:00:00 2001 From: Rudolf Meijering Date: Mon, 11 May 2020 15:00:48 +0200 Subject: [PATCH 066/102] Log error when encountering corrupt saved object during migration (#65829) * Log error when encountering corrupt saved object during migration * Fix documentation * Fix types --- ...re-server.savedobjectsmigrationlogger.error.md | 11 +++++++++++ ...gin-core-server.savedobjectsmigrationlogger.md | 1 + ...gins-data-server.iindexpattern.gettimefield.md | 15 +++++++++++++++ .../migrations/core/index_migrator.ts | 2 +- .../migrations/core/migrate_raw_docs.test.ts | 12 +++++++++--- .../migrations/core/migrate_raw_docs.ts | 8 +++++++- .../migrations/core/migration_coordinator.test.ts | 8 ++------ .../migrations/core/migration_logger.ts | 4 +++- .../migrations/kibana/kibana_migrator.ts | 2 +- src/core/server/saved_objects/migrations/mocks.ts | 5 +++-- src/core/server/server.api.md | 3 ++- src/plugins/data/server/server.api.md | 3 +-- 12 files changed, 56 insertions(+), 18 deletions(-) create mode 100644 docs/development/core/server/kibana-plugin-core-server.savedobjectsmigrationlogger.error.md create mode 100644 docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iindexpattern.gettimefield.md diff --git a/docs/development/core/server/kibana-plugin-core-server.savedobjectsmigrationlogger.error.md b/docs/development/core/server/kibana-plugin-core-server.savedobjectsmigrationlogger.error.md new file mode 100644 index 0000000000000..7536cd2b07ae6 --- /dev/null +++ b/docs/development/core/server/kibana-plugin-core-server.savedobjectsmigrationlogger.error.md @@ -0,0 +1,11 @@ + + +[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [SavedObjectsMigrationLogger](./kibana-plugin-core-server.savedobjectsmigrationlogger.md) > [error](./kibana-plugin-core-server.savedobjectsmigrationlogger.error.md) + +## SavedObjectsMigrationLogger.error property + +Signature: + +```typescript +error: (msg: string, meta: LogMeta) => void; +``` diff --git a/docs/development/core/server/kibana-plugin-core-server.savedobjectsmigrationlogger.md b/docs/development/core/server/kibana-plugin-core-server.savedobjectsmigrationlogger.md index 066643516b213..1b691ee8cb16d 100644 --- a/docs/development/core/server/kibana-plugin-core-server.savedobjectsmigrationlogger.md +++ b/docs/development/core/server/kibana-plugin-core-server.savedobjectsmigrationlogger.md @@ -16,6 +16,7 @@ export interface SavedObjectsMigrationLogger | Property | Type | Description | | --- | --- | --- | | [debug](./kibana-plugin-core-server.savedobjectsmigrationlogger.debug.md) | (msg: string) => void | | +| [error](./kibana-plugin-core-server.savedobjectsmigrationlogger.error.md) | (msg: string, meta: LogMeta) => void | | | [info](./kibana-plugin-core-server.savedobjectsmigrationlogger.info.md) | (msg: string) => void | | | [warn](./kibana-plugin-core-server.savedobjectsmigrationlogger.warn.md) | (msg: string) => void | | | [warning](./kibana-plugin-core-server.savedobjectsmigrationlogger.warning.md) | (msg: string) => void | | diff --git a/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iindexpattern.gettimefield.md b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iindexpattern.gettimefield.md new file mode 100644 index 0000000000000..a4d6abcf86a94 --- /dev/null +++ b/docs/development/plugins/data/server/kibana-plugin-plugins-data-server.iindexpattern.gettimefield.md @@ -0,0 +1,15 @@ + + +[Home](./index.md) > [kibana-plugin-plugins-data-server](./kibana-plugin-plugins-data-server.md) > [IIndexPattern](./kibana-plugin-plugins-data-server.iindexpattern.md) > [getTimeField](./kibana-plugin-plugins-data-server.iindexpattern.gettimefield.md) + +## IIndexPattern.getTimeField() method + +Signature: + +```typescript +getTimeField?(): IFieldType | undefined; +``` +Returns: + +`IFieldType | undefined` + diff --git a/src/core/server/saved_objects/migrations/core/index_migrator.ts b/src/core/server/saved_objects/migrations/core/index_migrator.ts index c75fa68572c71..ef2a8870d78d0 100644 --- a/src/core/server/saved_objects/migrations/core/index_migrator.ts +++ b/src/core/server/saved_objects/migrations/core/index_migrator.ts @@ -195,7 +195,7 @@ async function migrateSourceToDest(context: Context) { await Index.write( callCluster, dest.indexName, - migrateRawDocs(serializer, documentMigrator.migrate, docs) + migrateRawDocs(serializer, documentMigrator.migrate, docs, log) ); } } diff --git a/src/core/server/saved_objects/migrations/core/migrate_raw_docs.test.ts b/src/core/server/saved_objects/migrations/core/migrate_raw_docs.test.ts index 89f3fde384848..e55b72be2436d 100644 --- a/src/core/server/saved_objects/migrations/core/migrate_raw_docs.test.ts +++ b/src/core/server/saved_objects/migrations/core/migrate_raw_docs.test.ts @@ -21,6 +21,7 @@ import _ from 'lodash'; import { SavedObjectTypeRegistry } from '../../saved_objects_type_registry'; import { SavedObjectsSerializer } from '../../serialization'; import { migrateRawDocs } from './migrate_raw_docs'; +import { createSavedObjectsMigrationLoggerMock } from '../../migrations/mocks'; describe('migrateRawDocs', () => { test('converts raw docs to saved objects', async () => { @@ -31,7 +32,8 @@ describe('migrateRawDocs', () => { [ { _id: 'a:b', _source: { type: 'a', a: { name: 'AAA' } } }, { _id: 'c:d', _source: { type: 'c', c: { name: 'DDD' } } }, - ] + ], + createSavedObjectsMigrationLoggerMock() ); expect(result).toEqual([ @@ -48,7 +50,8 @@ describe('migrateRawDocs', () => { expect(transform).toHaveBeenCalled(); }); - test('passes invalid docs through untouched', async () => { + test('passes invalid docs through untouched and logs error', async () => { + const logger = createSavedObjectsMigrationLoggerMock(); const transform = jest.fn((doc: any) => _.set(_.cloneDeep(doc), 'attributes.name', 'TADA') ); @@ -58,7 +61,8 @@ describe('migrateRawDocs', () => { [ { _id: 'foo:b', _source: { type: 'a', a: { name: 'AAA' } } }, { _id: 'c:d', _source: { type: 'c', c: { name: 'DDD' } } }, - ] + ], + logger ); expect(result).toEqual([ @@ -82,5 +86,7 @@ describe('migrateRawDocs', () => { }, ], ]); + + expect(logger.error).toBeCalledTimes(1); }); }); diff --git a/src/core/server/saved_objects/migrations/core/migrate_raw_docs.ts b/src/core/server/saved_objects/migrations/core/migrate_raw_docs.ts index 5fe15f40db8ec..49acea82e1c8a 100644 --- a/src/core/server/saved_objects/migrations/core/migrate_raw_docs.ts +++ b/src/core/server/saved_objects/migrations/core/migrate_raw_docs.ts @@ -23,6 +23,7 @@ import { SavedObjectsRawDoc, SavedObjectsSerializer } from '../../serialization'; import { TransformFn } from './document_migrator'; +import { SavedObjectsMigrationLogger } from '.'; /** * Applies the specified migration function to every saved object document in the list @@ -35,7 +36,8 @@ import { TransformFn } from './document_migrator'; export function migrateRawDocs( serializer: SavedObjectsSerializer, migrateDoc: TransformFn, - rawDocs: SavedObjectsRawDoc[] + rawDocs: SavedObjectsRawDoc[], + log: SavedObjectsMigrationLogger ): SavedObjectsRawDoc[] { return rawDocs.map(raw => { if (serializer.isRawSavedObject(raw)) { @@ -47,6 +49,10 @@ export function migrateRawDocs( }); } + log.error( + `Error: Unable to migrate the corrupt Saved Object document ${raw._id}. To prevent Kibana from performing a migration on every restart, please delete or fix this document by ensuring that the namespace and type in the document's id matches the values in the namespace and type fields.`, + { rawDocument: raw } + ); return raw; }); } diff --git a/src/core/server/saved_objects/migrations/core/migration_coordinator.test.ts b/src/core/server/saved_objects/migrations/core/migration_coordinator.test.ts index 800edaeaa5885..3f2c31a7c0e5c 100644 --- a/src/core/server/saved_objects/migrations/core/migration_coordinator.test.ts +++ b/src/core/server/saved_objects/migrations/core/migration_coordinator.test.ts @@ -19,14 +19,10 @@ import _ from 'lodash'; import { coordinateMigration } from './migration_coordinator'; +import { createSavedObjectsMigrationLoggerMock } from '../mocks'; describe('coordinateMigration', () => { - const log = { - debug: jest.fn(), - warning: jest.fn(), - warn: jest.fn(), - info: jest.fn(), - }; + const log = createSavedObjectsMigrationLoggerMock(); test('waits for isMigrated, if there is an index conflict', async () => { const pollInterval = 1; diff --git a/src/core/server/saved_objects/migrations/core/migration_logger.ts b/src/core/server/saved_objects/migrations/core/migration_logger.ts index 9dfb3abc8e72d..00ed8bf0b73fc 100644 --- a/src/core/server/saved_objects/migrations/core/migration_logger.ts +++ b/src/core/server/saved_objects/migrations/core/migration_logger.ts @@ -17,7 +17,7 @@ * under the License. */ -import { Logger } from 'src/core/server/logging'; +import { Logger, LogMeta } from '../../../logging'; /* * This file provides a helper class for ensuring that all logging @@ -35,6 +35,7 @@ export interface SavedObjectsMigrationLogger { */ warning: (msg: string) => void; warn: (msg: string) => void; + error: (msg: string, meta: LogMeta) => void; } export class MigrationLogger implements SavedObjectsMigrationLogger { @@ -48,4 +49,5 @@ export class MigrationLogger implements SavedObjectsMigrationLogger { public debug = (msg: string) => this.logger.debug(msg); public warning = (msg: string) => this.logger.warn(msg); public warn = (msg: string) => this.logger.warn(msg); + public error = (msg: string, meta: LogMeta) => this.logger.error(msg, meta); } diff --git a/src/core/server/saved_objects/migrations/kibana/kibana_migrator.ts b/src/core/server/saved_objects/migrations/kibana/kibana_migrator.ts index dafd6c5341196..7d9ff9bed6d72 100644 --- a/src/core/server/saved_objects/migrations/kibana/kibana_migrator.ts +++ b/src/core/server/saved_objects/migrations/kibana/kibana_migrator.ts @@ -22,9 +22,9 @@ * (the shape of the mappings and documents in the index). */ -import { Logger } from 'src/core/server/logging'; import { KibanaConfigType } from 'src/core/server/kibana_config'; import { BehaviorSubject } from 'rxjs'; +import { Logger } from '../../../logging'; import { IndexMapping, SavedObjectsTypeMappingDefinitions } from '../../mappings'; import { SavedObjectUnsanitizedDoc, SavedObjectsSerializer } from '../../serialization'; import { docValidator, PropertyValidators } from '../../validation'; diff --git a/src/core/server/saved_objects/migrations/mocks.ts b/src/core/server/saved_objects/migrations/mocks.ts index 76a890d26bfa0..50a7191393472 100644 --- a/src/core/server/saved_objects/migrations/mocks.ts +++ b/src/core/server/saved_objects/migrations/mocks.ts @@ -20,12 +20,13 @@ import { SavedObjectMigrationContext } from './types'; import { SavedObjectsMigrationLogger } from './core'; -const createLoggerMock = (): jest.Mocked => { +export const createSavedObjectsMigrationLoggerMock = (): jest.Mocked => { const mock = { debug: jest.fn(), info: jest.fn(), warning: jest.fn(), warn: jest.fn(), + error: jest.fn(), }; return mock; @@ -33,7 +34,7 @@ const createLoggerMock = (): jest.Mocked => { const createContextMock = (): jest.Mocked => { const mock = { - log: createLoggerMock(), + log: createSavedObjectsMigrationLoggerMock(), }; return mock; }; diff --git a/src/core/server/server.api.md b/src/core/server/server.api.md index bd6046b5ec281..e4234689c25e8 100644 --- a/src/core/server/server.api.md +++ b/src/core/server/server.api.md @@ -91,7 +91,6 @@ import { IngestGetPipelineParams } from 'elasticsearch'; import { IngestPutPipelineParams } from 'elasticsearch'; import { IngestSimulateParams } from 'elasticsearch'; import { KibanaConfigType } from 'src/core/server/kibana_config'; -import { Logger as Logger_2 } from 'src/core/server/logging'; import { MGetParams } from 'elasticsearch'; import { MGetResponse } from 'elasticsearch'; import { MSearchParams } from 'elasticsearch'; @@ -2169,6 +2168,8 @@ export interface SavedObjectsMigrationLogger { // (undocumented) debug: (msg: string) => void; // (undocumented) + error: (msg: string, meta: LogMeta) => void; + // (undocumented) info: (msg: string) => void; // (undocumented) warn: (msg: string) => void; diff --git a/src/plugins/data/server/server.api.md b/src/plugins/data/server/server.api.md index df4ba23244b4d..1f4076aa12bde 100644 --- a/src/plugins/data/server/server.api.md +++ b/src/plugins/data/server/server.api.md @@ -93,8 +93,7 @@ import { IngestGetPipelineParams } from 'elasticsearch'; import { IngestPutPipelineParams } from 'elasticsearch'; import { IngestSimulateParams } from 'elasticsearch'; import { KibanaConfigType as KibanaConfigType_2 } from 'src/core/server/kibana_config'; -import { Logger as Logger_2 } from 'src/core/server/logging'; -import { Logger as Logger_3 } from 'kibana/server'; +import { Logger as Logger_2 } from 'kibana/server'; import { MGetParams } from 'elasticsearch'; import { MGetResponse } from 'elasticsearch'; import moment from 'moment'; From 0ae5e24d01a850357a9394afa01622ae7ffc2de4 Mon Sep 17 00:00:00 2001 From: Jason Rhodes Date: Mon, 11 May 2020 09:56:37 -0400 Subject: [PATCH 067/102] Initializes alert form with existing values (for editing) (#65926) --- .../components/alerting/logs/expression_editor/editor.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/infra/public/components/alerting/logs/expression_editor/editor.tsx b/x-pack/plugins/infra/public/components/alerting/logs/expression_editor/editor.tsx index 8bdffbeb36f3a..06855cc7e765d 100644 --- a/x-pack/plugins/infra/public/components/alerting/logs/expression_editor/editor.tsx +++ b/x-pack/plugins/infra/public/components/alerting/logs/expression_editor/editor.tsx @@ -129,7 +129,7 @@ export const Editor: React.FC = props => { const { sourceStatus } = useLogSourceContext(); useMount(() => { - for (const [key, value] of Object.entries(DEFAULT_EXPRESSION)) { + for (const [key, value] of Object.entries({ ...DEFAULT_EXPRESSION, ...alertParams })) { setAlertParams(key, value); setHasSetDefaults(true); } From d1e4d37c46686423dfd24cb37b6ba227c3a8afdd Mon Sep 17 00:00:00 2001 From: Dima Arnautov Date: Mon, 11 May 2020 15:57:12 +0200 Subject: [PATCH 068/102] [ML] Cardinality validation API integration tests (#65971) * [ML] refactor validate_cardinality to TS * [ML] cardinality api integration tests * [ML] resolve PR comments, validateJobObject as TS guard --- .../models/data_visualizer/data_visualizer.ts | 4 +- .../job_validation/validate_cardinality.d.ts | 13 -- ...cardinality.js => validate_cardinality.ts} | 64 ++++--- .../job_validation/validate_job_object.ts | 3 +- .../apis/ml/job_validation/cardinality.ts | 175 ++++++++++++++++++ .../apis/ml/job_validation/index.ts | 1 + 6 files changed, 223 insertions(+), 37 deletions(-) delete mode 100644 x-pack/plugins/ml/server/models/job_validation/validate_cardinality.d.ts rename x-pack/plugins/ml/server/models/job_validation/{validate_cardinality.js => validate_cardinality.ts} (76%) create mode 100644 x-pack/test/api_integration/apis/ml/job_validation/cardinality.ts diff --git a/x-pack/plugins/ml/server/models/data_visualizer/data_visualizer.ts b/x-pack/plugins/ml/server/models/data_visualizer/data_visualizer.ts index 645625f92df29..8ccd359137b67 100644 --- a/x-pack/plugins/ml/server/models/data_visualizer/data_visualizer.ts +++ b/x-pack/plugins/ml/server/models/data_visualizer/data_visualizer.ts @@ -342,8 +342,8 @@ export class DataVisualizer { aggregatableFields: string[], samplerShardSize: number, timeFieldName: string, - earliestMs: number, - latestMs: number + earliestMs?: number, + latestMs?: number ) { const index = indexPatternTitle; const size = 0; diff --git a/x-pack/plugins/ml/server/models/job_validation/validate_cardinality.d.ts b/x-pack/plugins/ml/server/models/job_validation/validate_cardinality.d.ts deleted file mode 100644 index 2fad1252e6446..0000000000000 --- a/x-pack/plugins/ml/server/models/job_validation/validate_cardinality.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -import { APICaller } from 'kibana/server'; -import { CombinedJob } from '../../../common/types/anomaly_detection_jobs'; - -export function validateCardinality( - callAsCurrentUser: APICaller, - job?: CombinedJob -): Promise; diff --git a/x-pack/plugins/ml/server/models/job_validation/validate_cardinality.js b/x-pack/plugins/ml/server/models/job_validation/validate_cardinality.ts similarity index 76% rename from x-pack/plugins/ml/server/models/job_validation/validate_cardinality.js rename to x-pack/plugins/ml/server/models/job_validation/validate_cardinality.ts index 22e0510782e11..cf3d6d004c37e 100644 --- a/x-pack/plugins/ml/server/models/job_validation/validate_cardinality.js +++ b/x-pack/plugins/ml/server/models/job_validation/validate_cardinality.ts @@ -4,21 +4,22 @@ * you may not use this file except in compliance with the Elastic License. */ -import _ from 'lodash'; - +import { APICaller } from 'kibana/server'; import { DataVisualizer } from '../data_visualizer'; import { validateJobObject } from './validate_job_object'; +import { CombinedJob } from '../../../common/types/anomaly_detection_jobs'; +import { Detector } from '../../../common/types/anomaly_detection_jobs'; -function isValidCategorizationConfig(job, fieldName) { +function isValidCategorizationConfig(job: CombinedJob, fieldName: string): boolean { return ( typeof job.analysis_config.categorization_field_name !== 'undefined' && fieldName === 'mlcategory' ); } -function isScriptField(job, fieldName) { - const scriptFields = Object.keys(_.get(job, 'datafeed_config.script_fields', {})); +function isScriptField(job: CombinedJob, fieldName: string): boolean { + const scriptFields = Object.keys(job.datafeed_config.script_fields ?? {}); return scriptFields.includes(fieldName); } @@ -30,10 +31,21 @@ const PARTITION_FIELD_CARDINALITY_THRESHOLD = 1000; const BY_FIELD_CARDINALITY_THRESHOLD = 1000; const MODEL_PLOT_THRESHOLD_HIGH = 100; -const validateFactory = (callWithRequest, job) => { +type Messages = Array<{ id: string; fieldName?: string }>; + +type Validator = (obj: { + type: string; + isInvalid: (cardinality: number) => boolean; + messageId?: string; +}) => Promise<{ + modelPlotCardinality: number; + messages: Messages; +}>; + +const validateFactory = (callWithRequest: APICaller, job: CombinedJob): Validator => { const dv = new DataVisualizer(callWithRequest); - const modelPlotConfigTerms = _.get(job, ['model_plot_config', 'terms'], ''); + const modelPlotConfigTerms = job?.model_plot_config?.terms ?? ''; const modelPlotConfigFieldCount = modelPlotConfigTerms.length > 0 ? modelPlotConfigTerms.split(',').length : 0; @@ -42,8 +54,11 @@ const validateFactory = (callWithRequest, job) => { // if model_plot_config.terms is used, it doesn't count the real cardinality of the field // but adds only the count of fields used in model_plot_config.terms let modelPlotCardinality = 0; - const messages = []; - const fieldName = `${type}_field_name`; + const messages: Messages = []; + const fieldName = `${type}_field_name` as keyof Pick< + Detector, + 'by_field_name' | 'over_field_name' | 'partition_field_name' + >; const detectors = job.analysis_config.detectors; const relevantDetectors = detectors.filter(detector => { @@ -52,7 +67,7 @@ const validateFactory = (callWithRequest, job) => { if (relevantDetectors.length > 0) { try { - const uniqueFieldNames = _.uniq(relevantDetectors.map(f => f[fieldName])); + const uniqueFieldNames = [...new Set(relevantDetectors.map(f => f[fieldName]))] as string[]; // use fieldCaps endpoint to get data about whether fields are aggregatable const fieldCaps = await callWithRequest('fieldCaps', { @@ -60,7 +75,7 @@ const validateFactory = (callWithRequest, job) => { fields: uniqueFieldNames, }); - let aggregatableFieldNames = []; + let aggregatableFieldNames: string[] = []; // parse fieldCaps to return an array of just the fields which are aggregatable if (typeof fieldCaps === 'object' && typeof fieldCaps.fields === 'object') { aggregatableFieldNames = uniqueFieldNames.filter(field => { @@ -81,12 +96,14 @@ const validateFactory = (callWithRequest, job) => { ); uniqueFieldNames.forEach(uniqueFieldName => { - const field = _.find(stats.aggregatableExistsFields, { fieldName: uniqueFieldName }); - if (typeof field === 'object') { + const field = stats.aggregatableExistsFields.find( + fieldData => fieldData.fieldName === uniqueFieldName + ); + if (field !== undefined && typeof field === 'object' && field.stats) { modelPlotCardinality += - modelPlotConfigFieldCount > 0 ? modelPlotConfigFieldCount : field.stats.cardinality; + modelPlotConfigFieldCount > 0 ? modelPlotConfigFieldCount : field.stats.cardinality!; - if (isInvalid(field.stats.cardinality)) { + if (isInvalid(field.stats.cardinality!)) { messages.push({ id: messageId || `cardinality_${type}_field`, fieldName: uniqueFieldName, @@ -115,7 +132,7 @@ const validateFactory = (callWithRequest, job) => { if (relevantDetectors.length === 1) { messages.push({ id: 'field_not_aggregatable', - fieldName: relevantDetectors[0][fieldName], + fieldName: relevantDetectors[0][fieldName]!, }); } else { messages.push({ id: 'fields_not_aggregatable' }); @@ -129,10 +146,16 @@ const validateFactory = (callWithRequest, job) => { }; }; -export async function validateCardinality(callWithRequest, job) { +export async function validateCardinality( + callWithRequest: APICaller, + job?: CombinedJob +): Promise> | never { const messages = []; - validateJobObject(job); + if (!validateJobObject(job)) { + // required for TS type casting, validateJobObject throws an error internally. + throw new Error(); + } // find out if there are any relevant detector field names // where cardinality checks could be run against. @@ -140,14 +163,13 @@ export async function validateCardinality(callWithRequest, job) { return d.by_field_name || d.over_field_name || d.partition_field_name; }); if (numDetectorsWithFieldNames.length === 0) { - return Promise.resolve([]); + return []; } // validate({ type, isInvalid }) asynchronously returns an array of validation messages const validate = validateFactory(callWithRequest, job); - const modelPlotEnabled = - (job.model_plot_config && job.model_plot_config.enabled === true) || false; + const modelPlotEnabled = job.model_plot_config?.enabled ?? false; // check over fields (population analysis) const validateOverFieldsLow = validate({ diff --git a/x-pack/plugins/ml/server/models/job_validation/validate_job_object.ts b/x-pack/plugins/ml/server/models/job_validation/validate_job_object.ts index b0271fb5b4f45..0d89656e05117 100644 --- a/x-pack/plugins/ml/server/models/job_validation/validate_job_object.ts +++ b/x-pack/plugins/ml/server/models/job_validation/validate_job_object.ts @@ -7,7 +7,7 @@ import { i18n } from '@kbn/i18n'; import { CombinedJob } from '../../../common/types/anomaly_detection_jobs'; -export function validateJobObject(job: CombinedJob | null) { +export function validateJobObject(job: CombinedJob | null | undefined): job is CombinedJob | never { if (job === null || typeof job !== 'object') { throw new Error( i18n.translate('xpack.ml.models.jobValidation.validateJobObject.jobIsNotObjectErrorMessage', { @@ -93,4 +93,5 @@ export function validateJobObject(job: CombinedJob | null) { ) ); } + return true; } diff --git a/x-pack/test/api_integration/apis/ml/job_validation/cardinality.ts b/x-pack/test/api_integration/apis/ml/job_validation/cardinality.ts new file mode 100644 index 0000000000000..e51a3b3c1772c --- /dev/null +++ b/x-pack/test/api_integration/apis/ml/job_validation/cardinality.ts @@ -0,0 +1,175 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../ftr_provider_context'; +import { USER } from '../../../../functional/services/machine_learning/security_common'; + +const COMMON_HEADERS = { + 'kbn-xsrf': 'some-xsrf-token', +}; + +// eslint-disable-next-line import/no-default-export +export default ({ getService }: FtrProviderContext) => { + const esArchiver = getService('esArchiver'); + const supertest = getService('supertestWithoutAuth'); + const ml = getService('ml'); + + describe('ValidateCardinality', function() { + before(async () => { + await esArchiver.loadIfNeeded('ml/ecommerce'); + await ml.testResources.setKibanaTimeZoneToUTC(); + }); + + after(async () => { + await ml.api.cleanMlIndices(); + }); + + it(`should recognize a valid cardinality`, async () => { + const requestBody = { + job_id: '', + description: '', + groups: [], + analysis_config: { + bucket_span: '10m', + detectors: [ + { + function: 'mean', + field_name: 'products.base_price', + partition_field_name: 'geoip.city_name', + }, + ], + influencers: ['geoip.city_name'], + }, + data_description: { time_field: 'order_date' }, + analysis_limits: { model_memory_limit: '12MB' }, + model_plot_config: { enabled: true }, + datafeed_config: { + datafeed_id: 'datafeed-', + job_id: '', + indices: ['ft_ecommerce'], + query: { bool: { must: [{ match_all: {} }], filter: [], must_not: [] } }, + }, + }; + + const { body } = await supertest + .post('/api/ml/validate/cardinality') + .auth(USER.ML_POWERUSER, ml.securityCommon.getPasswordForUser(USER.ML_POWERUSER)) + .set(COMMON_HEADERS) + .send(requestBody) + .expect(200); + + expect(body).to.eql([{ id: 'success_cardinality' }]); + }); + + it(`should recognize a high model plot cardinality`, async () => { + const requestBody = { + job_id: '', + description: '', + groups: [], + analysis_config: { + bucket_span: '10m', + detectors: [ + { + function: 'mean', + field_name: 'products.base_price', + // some high cardinality field + partition_field_name: 'order_id', + }, + ], + influencers: ['geoip.city_name'], + }, + data_description: { time_field: 'order_date' }, + analysis_limits: { model_memory_limit: '11MB' }, + model_plot_config: { enabled: true }, + datafeed_config: { + datafeed_id: 'datafeed-', + job_id: '', + indices: ['ft_ecommerce'], + query: { bool: { must: [{ match_all: {} }], filter: [], must_not: [] } }, + }, + }; + const { body } = await supertest + .post('/api/ml/validate/cardinality') + .auth(USER.ML_POWERUSER, ml.securityCommon.getPasswordForUser(USER.ML_POWERUSER)) + .set(COMMON_HEADERS) + .send(requestBody) + .expect(200); + + expect(body).to.eql([ + { id: 'cardinality_model_plot_high', modelPlotCardinality: 4711 }, + { id: 'cardinality_partition_field', fieldName: 'order_id' }, + ]); + }); + + it('should not validate cardinality in case request payload is invalid', async () => { + const requestBody = { + job_id: '', + description: '', + groups: [], + // missing analysis_config + data_description: { time_field: 'order_date' }, + analysis_limits: { model_memory_limit: '12MB' }, + model_plot_config: { enabled: true }, + datafeed_config: { + datafeed_id: 'datafeed-', + job_id: '', + indices: ['ft_ecommerce'], + query: { bool: { must: [{ match_all: {} }], filter: [], must_not: [] } }, + }, + }; + + const { body } = await supertest + .post('/api/ml/validate/cardinality') + .auth(USER.ML_POWERUSER, ml.securityCommon.getPasswordForUser(USER.ML_POWERUSER)) + .set(COMMON_HEADERS) + .send(requestBody) + .expect(400); + + expect(body.error).to.eql('Bad Request'); + expect(body.message).to.eql( + '[request body.analysis_config.detectors]: expected value of type [array] but got [undefined]' + ); + }); + + it('should not validate cardinality if the user does not have required permissions', async () => { + const requestBody = { + job_id: '', + description: '', + groups: [], + analysis_config: { + bucket_span: '10m', + detectors: [ + { + function: 'mean', + field_name: 'products.base_price', + partition_field_name: 'geoip.city_name', + }, + ], + influencers: ['geoip.city_name'], + }, + data_description: { time_field: 'order_date' }, + analysis_limits: { model_memory_limit: '12MB' }, + model_plot_config: { enabled: true }, + datafeed_config: { + datafeed_id: 'datafeed-', + job_id: '', + indices: ['ft_ecommerce'], + query: { bool: { must: [{ match_all: {} }], filter: [], must_not: [] } }, + }, + }; + + const { body } = await supertest + .post('/api/ml/validate/cardinality') + .auth(USER.ML_VIEWER, ml.securityCommon.getPasswordForUser(USER.ML_VIEWER)) + .set(COMMON_HEADERS) + .send(requestBody) + .expect(404); + + expect(body.error).to.eql('Not Found'); + expect(body.message).to.eql('Not Found'); + }); + }); +}; diff --git a/x-pack/test/api_integration/apis/ml/job_validation/index.ts b/x-pack/test/api_integration/apis/ml/job_validation/index.ts index 6ca9dcbbe9e5b..fa894de839cd2 100644 --- a/x-pack/test/api_integration/apis/ml/job_validation/index.ts +++ b/x-pack/test/api_integration/apis/ml/job_validation/index.ts @@ -9,5 +9,6 @@ export default function({ loadTestFile }: FtrProviderContext) { describe('job validation', function() { loadTestFile(require.resolve('./bucket_span_estimator')); loadTestFile(require.resolve('./calculate_model_memory_limit')); + loadTestFile(require.resolve('./cardinality')); }); } From d5737a54c242cc0128f3b262ba030a11029afd23 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Marcondes?= <55978943+cauemarcondes@users.noreply.github.com> Date: Mon, 11 May 2020 14:57:46 +0100 Subject: [PATCH 069/102] [APM] Don't mutating the original waterfall item while reparenting spans (#65840) * do not mutate the waterfall items * addressing pr comments Co-authored-by: Elastic Machine --- .../waterfall_helpers/waterfall_helpers.ts | 41 +++++++++++-------- .../waterfallContainer.stories.data.ts | 2 +- 2 files changed, 24 insertions(+), 19 deletions(-) diff --git a/x-pack/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/WaterfallContainer/Waterfall/waterfall_helpers/waterfall_helpers.ts b/x-pack/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/WaterfallContainer/Waterfall/waterfall_helpers/waterfall_helpers.ts index 8ddce66f0b853..e15cf2df38c5f 100644 --- a/x-pack/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/WaterfallContainer/Waterfall/waterfall_helpers/waterfall_helpers.ts +++ b/x-pack/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/WaterfallContainer/Waterfall/waterfall_helpers/waterfall_helpers.ts @@ -236,28 +236,33 @@ const getWaterfallItems = (items: TraceAPIResponse['trace']['items']) => } }); -/** - * Changes the parent_id of items based on the child.id property. - * Solves the problem of Inferred spans that are created as child of trace spans - * when it actually should be its parent. - * @param waterfallItems - */ -const reparentSpans = (waterfallItems: IWaterfallItem[]) => { +function reparentSpans(waterfallItems: IWaterfallItem[]) { + // find children that needs to be re-parented and map them to their correct parent id + const childIdToParentIdMapping = Object.fromEntries( + flatten( + waterfallItems.map(waterfallItem => { + if (waterfallItem.docType === 'span') { + const childIds = waterfallItem.doc.child?.id ?? []; + return childIds.map(id => [id, waterfallItem.id]); + } + return []; + }) + ) + ); + + // update parent id for children that needs it or return unchanged return waterfallItems.map(waterfallItem => { - if (waterfallItem.docType === 'span') { - const childId = waterfallItem.doc.child?.id; - if (childId) { - childId.forEach(id => { - const item = waterfallItems.find(_item => _item.id === id); - if (item) { - item.parentId = waterfallItem.id; - } - }); - } + const newParentId = childIdToParentIdMapping[waterfallItem.id]; + if (newParentId) { + return { + ...waterfallItem, + parentId: newParentId + }; } + return waterfallItem; }); -}; +} const getChildrenGroupedByParentId = (waterfallItems: IWaterfallItem[]) => groupBy(waterfallItems, item => (item.parentId ? item.parentId : ROOT_ID)); diff --git a/x-pack/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/WaterfallContainer/waterfallContainer.stories.data.ts b/x-pack/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/WaterfallContainer/waterfallContainer.stories.data.ts index 2f28e37f73f62..6f4a0629c7bc5 100644 --- a/x-pack/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/WaterfallContainer/waterfallContainer.stories.data.ts +++ b/x-pack/plugins/apm/public/components/app/TransactionDetails/WaterfallWithSummmary/WaterfallContainer/waterfallContainer.stories.data.ts @@ -2027,7 +2027,7 @@ export const inferredSpans = { id: '41226ae63af4f235', type: 'unknown' }, - child: { ids: ['8d80de06aa11a6fc'] } + child: { id: ['8d80de06aa11a6fc'] } }, { container: { From a3d3ae9661fcb115f65f3e5c259395bb8275f2a0 Mon Sep 17 00:00:00 2001 From: Alison Goryachev Date: Mon, 11 May 2020 10:05:27 -0400 Subject: [PATCH 070/102] [Ingest pipelines] Make description field optional (#65961) --- .../ingest_pipelines_create.test.tsx | 6 +--- .../components/pipeline_form/schema.tsx | 11 +------ .../pipelines_list/details_flyout.tsx | 18 +++++++----- .../server/routes/api/create.ts | 2 +- .../ingest_pipelines/ingest_pipelines.ts | 29 ++++++++++++++++++- 5 files changed, 41 insertions(+), 25 deletions(-) diff --git a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_create.test.tsx b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_create.test.tsx index e0be8d2937729..6acb6369e2e90 100644 --- a/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_create.test.tsx +++ b/x-pack/plugins/ingest_pipelines/__jest__/client_integration/ingest_pipelines_create.test.tsx @@ -107,15 +107,11 @@ describe('', () => { component.update(); }); - expect(form.getErrorsMessages()).toEqual([ - 'Name is required.', - 'A description is required.', - ]); + expect(form.getErrorsMessages()).toEqual(['Name is required.']); expect(find('submitButton').props().disabled).toEqual(true); // Add required fields and verify button is enabled again form.setInputValue('nameField.input', 'my_pipeline'); - form.setInputValue('descriptionField.input', 'pipeline description'); await act(async () => { await nextTick(); diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/schema.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/schema.tsx index f222d48c11af0..e122307ca9485 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/schema.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_form/schema.tsx @@ -34,17 +34,8 @@ export const pipelineFormSchema: FormSchema = { description: { type: FIELD_TYPES.TEXTAREA, label: i18n.translate('xpack.ingestPipelines.form.descriptionFieldLabel', { - defaultMessage: 'Description', + defaultMessage: 'Description (optional)', }), - validations: [ - { - validator: emptyField( - i18n.translate('xpack.ingestPipelines.form.pipelineDescriptionRequiredError', { - defaultMessage: 'A description is required.', - }) - ), - }, - ], }, processors: { label: i18n.translate('xpack.ingestPipelines.form.processorsFieldLabel', { diff --git a/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_list/details_flyout.tsx b/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_list/details_flyout.tsx index a6eff63b5e725..39789bb38ed41 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_list/details_flyout.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/sections/pipelines_list/details_flyout.tsx @@ -117,14 +117,16 @@ export const PipelineDetailsFlyout: FunctionComponent = ({ {/* Pipeline description */} - - {i18n.translate('xpack.ingestPipelines.list.pipelineDetails.descriptionTitle', { - defaultMessage: 'Description', - })} - - - {pipeline.description ?? ''} - + {pipeline.description && ( + <> + + {i18n.translate('xpack.ingestPipelines.list.pipelineDetails.descriptionTitle', { + defaultMessage: 'Description', + })} + + {pipeline.description} + + )} {/* Pipeline version */} {pipeline.version && ( diff --git a/x-pack/plugins/ingest_pipelines/server/routes/api/create.ts b/x-pack/plugins/ingest_pipelines/server/routes/api/create.ts index 63637eaac765d..803d34bf0042b 100644 --- a/x-pack/plugins/ingest_pipelines/server/routes/api/create.ts +++ b/x-pack/plugins/ingest_pipelines/server/routes/api/create.ts @@ -12,7 +12,7 @@ import { RouteDependencies } from '../../types'; const bodySchema = schema.object({ name: schema.string(), - description: schema.string(), + description: schema.maybe(schema.string()), processors: schema.arrayOf(schema.recordOf(schema.string(), schema.any())), version: schema.maybe(schema.number()), on_failure: schema.maybe(schema.arrayOf(schema.recordOf(schema.string(), schema.any()))), diff --git a/x-pack/test/api_integration/apis/management/ingest_pipelines/ingest_pipelines.ts b/x-pack/test/api_integration/apis/management/ingest_pipelines/ingest_pipelines.ts index 88a78d048a3b6..f2f749a58dac3 100644 --- a/x-pack/test/api_integration/apis/management/ingest_pipelines/ingest_pipelines.ts +++ b/x-pack/test/api_integration/apis/management/ingest_pipelines/ingest_pipelines.ts @@ -19,7 +19,12 @@ export default function({ getService }: FtrProviderContext) { describe('Pipelines', function() { describe('Create', () => { const PIPELINE_ID = 'test_create_pipeline'; - after(() => deletePipeline(PIPELINE_ID)); + const REQUIRED_FIELDS_PIPELINE_ID = 'test_create_required_fields_pipeline'; + + after(() => { + deletePipeline(PIPELINE_ID); + deletePipeline(REQUIRED_FIELDS_PIPELINE_ID); + }); it('should create a pipeline', async () => { const { body } = await supertest @@ -52,6 +57,28 @@ export default function({ getService }: FtrProviderContext) { }); }); + it('should create a pipeline with only required fields', async () => { + const { body } = await supertest + .post(API_BASE_PATH) + .set('kbn-xsrf', 'xxx') + // Excludes description, version and on_failure processors + .send({ + name: REQUIRED_FIELDS_PIPELINE_ID, + processors: [ + { + script: { + source: 'ctx._type = null', + }, + }, + ], + }) + .expect(200); + + expect(body).to.eql({ + acknowledged: true, + }); + }); + it('should not allow creation of an existing pipeline', async () => { const { body } = await supertest .post(API_BASE_PATH) From 7526db98e8f67f7c01758b7a8000b47a90c8e9ea Mon Sep 17 00:00:00 2001 From: Bhavya RM Date: Mon, 11 May 2020 10:30:50 -0400 Subject: [PATCH 071/102] Addressing test failures with a11y tests on management (#65758) fixing test failure #60470 --- .../edit_index_pattern/tabs/tabs.tsx | 11 +++++--- test/accessibility/apps/management.ts | 25 ++++++------------- 2 files changed, 16 insertions(+), 20 deletions(-) diff --git a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/tabs/tabs.tsx b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/tabs/tabs.tsx index bfd507876a9d6..247af7e20d581 100644 --- a/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/tabs/tabs.tsx +++ b/src/legacy/core_plugins/kibana/public/management/sections/index_patterns/edit_index_pattern/tabs/tabs.tsx @@ -49,14 +49,18 @@ interface TabsProps extends Pick { }; } +const searchAriaLabel = i18n.translate('kbn.management.editIndexPattern.fields.searchAria', { + defaultMessage: 'Search fields', +}); + const filterAriaLabel = i18n.translate('kbn.management.editIndexPattern.fields.filterAria', { - defaultMessage: 'Filter', + defaultMessage: 'Filter field types', }); const filterPlaceholder = i18n.translate( 'kbn.management.editIndexPattern.fields.filterPlaceholder', { - defaultMessage: 'Filter', + defaultMessage: 'Search', } ); @@ -108,7 +112,7 @@ export function Tabs({ config, indexPattern, fields, services, history, location value={fieldFilter} onChange={e => setFieldFilter(e.target.value)} data-test-subj="indexPatternFieldFilter" - aria-label={filterAriaLabel} + aria-label={searchAriaLabel} /> {type === TAB_INDEXED_FIELDS && indexedFieldTypes.length > 0 && ( @@ -118,6 +122,7 @@ export function Tabs({ config, indexPattern, fields, services, history, location value={indexedFieldTypeFilter} onChange={e => setIndexedFieldTypeFilter(e.target.value)} data-test-subj="indexedFieldTypeFilterDropdown" + aria-label={filterAriaLabel} /> )} diff --git a/test/accessibility/apps/management.ts b/test/accessibility/apps/management.ts index 9e75250403d6b..cc60e672fe880 100644 --- a/test/accessibility/apps/management.ts +++ b/test/accessibility/apps/management.ts @@ -20,23 +20,12 @@ import { FtrProviderContext } from '../ftr_provider_context'; export default function({ getService, getPageObjects }: FtrProviderContext) { - const PageObjects = getPageObjects(['common', 'settings']); + const PageObjects = getPageObjects(['common', 'settings', 'header']); const esArchiver = getService('esArchiver'); const kibanaServer = getService('kibanaServer'); - const testSubjects = getService('testSubjects'); const a11y = getService('a11y'); - // describe('Management', () => { - // before(async () => { - // await esArchiver.loadIfNeeded('logstash_functional'); - // await kibanaServer.uiSettings.update({ - // defaultIndex: 'logstash-*', - // }); - // await PageObjects.common.navigateToApp('settings'); - // }); - - // FLAKY: https://github.com/elastic/kibana/issues/60470 - describe.skip('Management', () => { + describe('Management', () => { before(async () => { await esArchiver.load('discover'); await esArchiver.loadIfNeeded('logstash_functional'); @@ -57,23 +46,25 @@ export default function({ getService, getPageObjects }: FtrProviderContext) { it('Single indexpattern view', async () => { await PageObjects.settings.clickIndexPatternLogstash(); + await PageObjects.header.waitUntilLoadingHasFinished(); await a11y.testAppSnapshot(); }); - it('Create Index pattern wizard', async () => { + it('Open create index pattern wizard', async () => { await PageObjects.settings.clickKibanaIndexPatterns(); - await (await testSubjects.find('createIndexPatternButton')).click(); + await PageObjects.settings.clickAddNewIndexPatternButton(); + await PageObjects.header.waitUntilLoadingHasFinished(); await a11y.testAppSnapshot(); }); - // index patterns page + // We are navigating back to index pattern page to test field formatters it('Navigate back to logstash index page', async () => { await PageObjects.settings.clickKibanaIndexPatterns(); await PageObjects.settings.clickIndexPatternLogstash(); await a11y.testAppSnapshot(); }); - // Issue: https://github.com/elastic/kibana/issues/60030 + // Will be enabling this and field formatters after this issue is addressed: https://github.com/elastic/kibana/issues/60030 it.skip('Edit field type', async () => { await PageObjects.settings.clickEditFieldFormat(); await a11y.testAppSnapshot(); From 431a7eb07a8ee95018ae0f77481f3ac983a56642 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Mon, 11 May 2020 08:50:20 -0600 Subject: [PATCH 072/102] [Maps] remove dateline check for geo_shape queries, split geo_bounding_box queries that cross dateline into 2 boxes (#64598) * remove dateline check for geo_shape queries * fix jest test * split bounding box * replace convertMapExtentToPolygon with formatEnvelopeAsPolygon * clamp latitudes * use clampToLatBounds * use single box where left lon is greater then right lon when crossing 180 meridian Co-authored-by: Elastic Machine --- .../public/angular/services/saved_gis_map.js | 4 +- .../maps/public/elasticsearch_geo_utils.js | 96 +++--- .../public/elasticsearch_geo_utils.test.js | 280 ++++++++---------- 3 files changed, 162 insertions(+), 218 deletions(-) diff --git a/x-pack/plugins/maps/public/angular/services/saved_gis_map.js b/x-pack/plugins/maps/public/angular/services/saved_gis_map.js index 1a58b0cefaed9..2de4432871347 100644 --- a/x-pack/plugins/maps/public/angular/services/saved_gis_map.js +++ b/x-pack/plugins/maps/public/angular/services/saved_gis_map.js @@ -19,7 +19,7 @@ import { } from '../../selectors/map_selectors'; import { getIsLayerTOCOpen, getOpenTOCDetails } from '../../selectors/ui_selectors'; -import { convertMapExtentToPolygon } from '../../elasticsearch_geo_utils'; +import { formatEnvelopeAsPolygon } from '../../elasticsearch_geo_utils'; import { copyPersistentState } from '../../reducers/util'; import { extractReferences, injectReferences } from '../../../common/migrations/references'; @@ -107,7 +107,7 @@ export function createSavedGisMapClass(services) { openTOCDetails: getOpenTOCDetails(state), }); - this.bounds = convertMapExtentToPolygon(getMapExtent(state)); + this.bounds = formatEnvelopeAsPolygon(getMapExtent(state)); } } return SavedGisMap; diff --git a/x-pack/plugins/maps/public/elasticsearch_geo_utils.js b/x-pack/plugins/maps/public/elasticsearch_geo_utils.js index 888fce7e7afe0..419b169138ef1 100644 --- a/x-pack/plugins/maps/public/elasticsearch_geo_utils.js +++ b/x-pack/plugins/maps/public/elasticsearch_geo_utils.js @@ -225,41 +225,62 @@ export function geoShapeToGeometry(value, accumulator) { accumulator.push(geoJson); } -function createGeoBoundBoxFilter(geometry, geoFieldName, filterProps = {}) { - ensureGeometryType(geometry.type, [GEO_JSON_TYPE.POLYGON]); +function createGeoBoundBoxFilter({ maxLat, maxLon, minLat, minLon }, geoFieldName) { + const top = clampToLatBounds(maxLat); + const bottom = clampToLatBounds(minLat); + + // geo_bounding_box does not support ranges outside of -180 and 180 + // When the area crosses the 180° meridian, + // the value of the lower left longitude will be greater than the value of the upper right longitude. + // http://docs.opengeospatial.org/is/12-063r5/12-063r5.html#30 + let boundingBox; + if (maxLon - minLon >= 360) { + boundingBox = { + top_left: [-180, top], + bottom_right: [180, bottom], + }; + } else if (maxLon > 180) { + const overflow = maxLon - 180; + boundingBox = { + top_left: [minLon, top], + bottom_right: [-180 + overflow, bottom], + }; + } else if (minLon < -180) { + const overflow = Math.abs(minLon) - 180; + boundingBox = { + top_left: [180 - overflow, top], + bottom_right: [maxLon, bottom], + }; + } else { + boundingBox = { + top_left: [minLon, top], + bottom_right: [maxLon, bottom], + }; + } - const TOP_LEFT_INDEX = 0; - const BOTTOM_RIGHT_INDEX = 2; - const verticies = geometry.coordinates[POLYGON_COORDINATES_EXTERIOR_INDEX]; return { geo_bounding_box: { - [geoFieldName]: { - top_left: verticies[TOP_LEFT_INDEX], - bottom_right: verticies[BOTTOM_RIGHT_INDEX], - }, + [geoFieldName]: boundingBox, }, - ...filterProps, }; } export function createExtentFilter(mapExtent, geoFieldName, geoFieldType) { ensureGeoField(geoFieldType); - const safePolygon = convertMapExtentToPolygon(mapExtent); - // Extent filters are used to dynamically filter data for the current map view port. // Continue to use geo_bounding_box queries for extent filters // 1) geo_bounding_box queries are faster than polygon queries // 2) geo_shape benefits of pre-indexed shapes and // compatability across multi-indices with geo_point and geo_shape do not apply to this use case. if (geoFieldType === ES_GEO_FIELD_TYPE.GEO_POINT) { - return createGeoBoundBoxFilter(safePolygon, geoFieldName); + return createGeoBoundBoxFilter(mapExtent, geoFieldName); } return { geo_shape: { [geoFieldName]: { - shape: safePolygon, + shape: formatEnvelopeAsPolygon(mapExtent), relation: ES_SPATIAL_RELATIONS.INTERSECTS, }, }, @@ -376,16 +397,16 @@ export function getBoundingBoxGeometry(geometry) { extent.maxLat = Math.max(exterior[i][LAT_INDEX], extent.maxLat); } - return convertMapExtentToPolygon(extent); + return formatEnvelopeAsPolygon(extent); } -function formatEnvelopeAsPolygon({ maxLat, maxLon, minLat, minLon }) { +export function formatEnvelopeAsPolygon({ maxLat, maxLon, minLat, minLon }) { // GeoJSON mandates that the outer polygon must be counterclockwise to avoid ambiguous polygons // when the shape crosses the dateline const left = minLon; const right = maxLon; - const top = maxLat > 90 ? 90 : maxLat; - const bottom = minLat < -90 ? -90 : minLat; + const top = clampToLatBounds(maxLat); + const bottom = clampToLatBounds(minLat); const topLeft = [left, top]; const bottomLeft = [left, bottom]; const bottomRight = [right, bottom]; @@ -396,45 +417,6 @@ function formatEnvelopeAsPolygon({ maxLat, maxLon, minLat, minLon }) { }; } -/* - * Convert map bounds to polygon - */ -export function convertMapExtentToPolygon({ maxLat, maxLon, minLat, minLon }) { - const lonDelta = maxLon - minLon; - if (lonDelta >= 360) { - return formatEnvelopeAsPolygon({ - maxLat, - maxLon: 180, - minLat, - minLon: -180, - }); - } - - if (maxLon > 180) { - // bounds cross dateline east to west - const overlapWestOfDateLine = maxLon - 180; - return formatEnvelopeAsPolygon({ - maxLat, - maxLon: -180 + overlapWestOfDateLine, - minLat, - minLon, - }); - } - - if (minLon < -180) { - // bounds cross dateline west to east - const overlapEastOfDateLine = Math.abs(minLon) - 180; - return formatEnvelopeAsPolygon({ - maxLat, - maxLon, - minLat, - minLon: 180 - overlapEastOfDateLine, - }); - } - - return formatEnvelopeAsPolygon({ maxLat, maxLon, minLat, minLon }); -} - export function clampToLatBounds(lat) { return clamp(lat, -89, 89); } diff --git a/x-pack/plugins/maps/public/elasticsearch_geo_utils.test.js b/x-pack/plugins/maps/public/elasticsearch_geo_utils.test.js index d13291a8e2ba5..c0baf5e4bcb6e 100644 --- a/x-pack/plugins/maps/public/elasticsearch_geo_utils.test.js +++ b/x-pack/plugins/maps/public/elasticsearch_geo_utils.test.js @@ -17,19 +17,12 @@ import { geoPointToGeometry, geoShapeToGeometry, createExtentFilter, - convertMapExtentToPolygon, roundCoordinates, extractFeaturesFromFilters, } from './elasticsearch_geo_utils'; import { indexPatterns } from '../../../../src/plugins/data/public'; const geoFieldName = 'location'; -const mapExtent = { - maxLat: 39, - maxLon: -83, - minLat: 35, - minLon: -89, -}; const flattenHitMock = hit => { const properties = {}; @@ -317,174 +310,143 @@ describe('geoShapeToGeometry', () => { }); describe('createExtentFilter', () => { - it('should return elasticsearch geo_bounding_box filter for geo_point field', () => { - const filter = createExtentFilter(mapExtent, geoFieldName, 'geo_point'); - expect(filter).toEqual({ - geo_bounding_box: { - location: { - bottom_right: [-83, 35], - top_left: [-89, 39], + describe('geo_point field', () => { + it('should return elasticsearch geo_bounding_box filter for geo_point field', () => { + const mapExtent = { + maxLat: 39, + maxLon: -83, + minLat: 35, + minLon: -89, + }; + const filter = createExtentFilter(mapExtent, geoFieldName, 'geo_point'); + expect(filter).toEqual({ + geo_bounding_box: { + location: { + top_left: [-89, 39], + bottom_right: [-83, 35], + }, }, - }, + }); }); - }); - it('should return elasticsearch geo_shape filter for geo_shape field', () => { - const filter = createExtentFilter(mapExtent, geoFieldName, 'geo_shape'); - expect(filter).toEqual({ - geo_shape: { - location: { - relation: 'INTERSECTS', - shape: { - coordinates: [ - [ - [-89, 39], - [-89, 35], - [-83, 35], - [-83, 39], - [-89, 39], - ], - ], - type: 'Polygon', + it('should clamp longitudes to -180 to 180 and latitudes to -90 to 90', () => { + const mapExtent = { + maxLat: 120, + maxLon: 200, + minLat: -100, + minLon: -190, + }; + const filter = createExtentFilter(mapExtent, geoFieldName, 'geo_point'); + expect(filter).toEqual({ + geo_bounding_box: { + location: { + top_left: [-180, 89], + bottom_right: [180, -89], }, }, - }, + }); }); - }); - it('should clamp longitudes to -180 to 180', () => { - const mapExtent = { - maxLat: 39, - maxLon: 209, - minLat: 35, - minLon: -191, - }; - const filter = createExtentFilter(mapExtent, geoFieldName, 'geo_shape'); - expect(filter).toEqual({ - geo_shape: { - location: { - relation: 'INTERSECTS', - shape: { - coordinates: [ - [ - [-180, 39], - [-180, 35], - [180, 35], - [180, 39], - [-180, 39], - ], - ], - type: 'Polygon', + it('should make left longitude greater then right longitude when area crosses 180 meridian east to west', () => { + const mapExtent = { + maxLat: 39, + maxLon: 200, + minLat: 35, + minLon: 100, + }; + const filter = createExtentFilter(mapExtent, geoFieldName, 'geo_point'); + const leftLon = filter.geo_bounding_box.location.top_left[0]; + const rightLon = filter.geo_bounding_box.location.bottom_right[0]; + expect(leftLon).toBeGreaterThan(rightLon); + expect(filter).toEqual({ + geo_bounding_box: { + location: { + top_left: [100, 39], + bottom_right: [-160, 35], }, }, - }, - }); - }); -}); - -describe('convertMapExtentToPolygon', () => { - it('should convert bounds to envelope', () => { - const bounds = { - maxLat: 10, - maxLon: 100, - minLat: -10, - minLon: 90, - }; - expect(convertMapExtentToPolygon(bounds)).toEqual({ - type: 'Polygon', - coordinates: [ - [ - [90, 10], - [90, -10], - [100, -10], - [100, 10], - [90, 10], - ], - ], - }); - }); - - it('should clamp longitudes to -180 to 180', () => { - const bounds = { - maxLat: 10, - maxLon: 200, - minLat: -10, - minLon: -400, - }; - expect(convertMapExtentToPolygon(bounds)).toEqual({ - type: 'Polygon', - coordinates: [ - [ - [-180, 10], - [-180, -10], - [180, -10], - [180, 10], - [-180, 10], - ], - ], + }); }); - }); - it('should clamp longitudes to -180 to 180 when bounds span entire globe (360)', () => { - const bounds = { - maxLat: 10, - maxLon: 170, - minLat: -10, - minLon: -400, - }; - expect(convertMapExtentToPolygon(bounds)).toEqual({ - type: 'Polygon', - coordinates: [ - [ - [-180, 10], - [-180, -10], - [180, -10], - [180, 10], - [-180, 10], - ], - ], + it('should make left longitude greater then right longitude when area crosses 180 meridian west to east', () => { + const mapExtent = { + maxLat: 39, + maxLon: -100, + minLat: 35, + minLon: -200, + }; + const filter = createExtentFilter(mapExtent, geoFieldName, 'geo_point'); + const leftLon = filter.geo_bounding_box.location.top_left[0]; + const rightLon = filter.geo_bounding_box.location.bottom_right[0]; + expect(leftLon).toBeGreaterThan(rightLon); + expect(filter).toEqual({ + geo_bounding_box: { + location: { + top_left: [160, 39], + bottom_right: [-100, 35], + }, + }, + }); }); }); - it('should handle bounds that cross dateline(east to west)', () => { - const bounds = { - maxLat: 10, - maxLon: 190, - minLat: -10, - minLon: 170, - }; - expect(convertMapExtentToPolygon(bounds)).toEqual({ - type: 'Polygon', - coordinates: [ - [ - [170, 10], - [170, -10], - [-170, -10], - [-170, 10], - [170, 10], - ], - ], + describe('geo_shape field', () => { + it('should return elasticsearch geo_shape filter', () => { + const mapExtent = { + maxLat: 39, + maxLon: -83, + minLat: 35, + minLon: -89, + }; + const filter = createExtentFilter(mapExtent, geoFieldName, 'geo_shape'); + expect(filter).toEqual({ + geo_shape: { + location: { + relation: 'INTERSECTS', + shape: { + coordinates: [ + [ + [-89, 39], + [-89, 35], + [-83, 35], + [-83, 39], + [-89, 39], + ], + ], + type: 'Polygon', + }, + }, + }, + }); }); - }); - it('should handle bounds that cross dateline(west to east)', () => { - const bounds = { - maxLat: 10, - maxLon: -170, - minLat: -10, - minLon: -190, - }; - expect(convertMapExtentToPolygon(bounds)).toEqual({ - type: 'Polygon', - coordinates: [ - [ - [170, 10], - [170, -10], - [-170, -10], - [-170, 10], - [170, 10], - ], - ], + it('should not clamp longitudes to -180 to 180', () => { + const mapExtent = { + maxLat: 39, + maxLon: 209, + minLat: 35, + minLon: -191, + }; + const filter = createExtentFilter(mapExtent, geoFieldName, 'geo_shape'); + expect(filter).toEqual({ + geo_shape: { + location: { + relation: 'INTERSECTS', + shape: { + coordinates: [ + [ + [-191, 39], + [-191, 35], + [209, 35], + [209, 39], + [-191, 39], + ], + ], + type: 'Polygon', + }, + }, + }, + }); }); }); }); From e67480d1fcdf6e898e636b78327055edd289d68a Mon Sep 17 00:00:00 2001 From: Gidi Meir Morris Date: Mon, 11 May 2020 16:35:48 +0100 Subject: [PATCH 073/102] [Task Manager] restores migrations of old tasks in TM (#65978) When migrating to KP last week the migrations were missed - this PR restores them. --- .../server/saved_objects/index.ts | 2 ++ .../server/saved_objects/migrations.ts | 21 ++++++++++--------- 2 files changed, 13 insertions(+), 10 deletions(-) diff --git a/x-pack/plugins/task_manager/server/saved_objects/index.ts b/x-pack/plugins/task_manager/server/saved_objects/index.ts index 0ad9021cd7f39..fbb54b566ece0 100644 --- a/x-pack/plugins/task_manager/server/saved_objects/index.ts +++ b/x-pack/plugins/task_manager/server/saved_objects/index.ts @@ -6,6 +6,7 @@ import { SavedObjectsServiceSetup } from 'kibana/server'; import mappings from './mappings.json'; +import { migrations } from './migrations'; import { TaskManagerConfig } from '../config.js'; export function setupSavedObjects( @@ -18,6 +19,7 @@ export function setupSavedObjects( hidden: true, convertToAliasScript: `ctx._id = ctx._source.type + ':' + ctx._id`, mappings: mappings.task, + migrations, indexPattern: config.index, }); } diff --git a/x-pack/plugins/task_manager/server/saved_objects/migrations.ts b/x-pack/plugins/task_manager/server/saved_objects/migrations.ts index 1c2cf73d0fe13..617ef80749d6a 100644 --- a/x-pack/plugins/task_manager/server/saved_objects/migrations.ts +++ b/x-pack/plugins/task_manager/server/saved_objects/migrations.ts @@ -3,22 +3,23 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import { SavedObject } from '../../../../../src/core/server'; +import { SavedObjectMigrationMap, SavedObjectUnsanitizedDoc } from '../../../../../src/core/server'; +import { TaskInstance, TaskInstanceWithDeprecatedFields } from '../task'; -export const migrations = { - task: { - '7.4.0': (doc: SavedObject>) => ({ - ...doc, - updated_at: new Date().toISOString(), - }), - '7.6.0': moveIntervalIntoSchedule, - }, +export const migrations: SavedObjectMigrationMap = { + '7.4.0': doc => ({ + ...doc, + updated_at: new Date().toISOString(), + }), + '7.6.0': moveIntervalIntoSchedule, }; function moveIntervalIntoSchedule({ attributes: { interval, ...attributes }, ...doc -}: SavedObject>) { +}: SavedObjectUnsanitizedDoc): SavedObjectUnsanitizedDoc< + TaskInstance +> { return { ...doc, attributes: { From 49226ddc1fdbe3841422404c6634643629200631 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20Haro?= Date: Mon, 11 May 2020 16:57:45 +0100 Subject: [PATCH 074/102] [Telemetry] Remove ui_metric from the legacy codebase (#65739) --- src/legacy/core_plugins/ui_metric/index.ts | 30 ------------- .../core_plugins/ui_metric/package.json | 4 -- .../core_plugins/ui_metric/public/index.ts | 21 --------- .../public/services/telemetry_analytics.ts | 24 ---------- src/plugins/usage_collection/README.md | 44 ------------------- 5 files changed, 123 deletions(-) delete mode 100644 src/legacy/core_plugins/ui_metric/index.ts delete mode 100644 src/legacy/core_plugins/ui_metric/package.json delete mode 100644 src/legacy/core_plugins/ui_metric/public/index.ts delete mode 100644 src/legacy/core_plugins/ui_metric/public/services/telemetry_analytics.ts diff --git a/src/legacy/core_plugins/ui_metric/index.ts b/src/legacy/core_plugins/ui_metric/index.ts deleted file mode 100644 index 2e5be3d7b0a39..0000000000000 --- a/src/legacy/core_plugins/ui_metric/index.ts +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -import { resolve } from 'path'; - -// eslint-disable-next-line import/no-default-export -export default function(kibana: any) { - return new kibana.Plugin({ - id: 'ui_metric', - require: ['kibana', 'elasticsearch'], - publicDir: resolve(__dirname, 'public'), - init() {}, - }); -} diff --git a/src/legacy/core_plugins/ui_metric/package.json b/src/legacy/core_plugins/ui_metric/package.json deleted file mode 100644 index 3ddcac4eec47f..0000000000000 --- a/src/legacy/core_plugins/ui_metric/package.json +++ /dev/null @@ -1,4 +0,0 @@ -{ - "name": "ui_metric", - "version": "kibana" -} diff --git a/src/legacy/core_plugins/ui_metric/public/index.ts b/src/legacy/core_plugins/ui_metric/public/index.ts deleted file mode 100644 index 19246b571cb84..0000000000000 --- a/src/legacy/core_plugins/ui_metric/public/index.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ - -export { createUiStatsReporter } from './services/telemetry_analytics'; -export { METRIC_TYPE, UiStatsMetricType } from '@kbn/analytics'; diff --git a/src/legacy/core_plugins/ui_metric/public/services/telemetry_analytics.ts b/src/legacy/core_plugins/ui_metric/public/services/telemetry_analytics.ts deleted file mode 100644 index 0e517e6ff2244..0000000000000 --- a/src/legacy/core_plugins/ui_metric/public/services/telemetry_analytics.ts +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -import { npSetup } from 'ui/new_platform'; - -export const createUiStatsReporter = (appName: string) => { - const { usageCollection } = npSetup.plugins; - return usageCollection.reportUiStats.bind(usageCollection, appName); -}; diff --git a/src/plugins/usage_collection/README.md b/src/plugins/usage_collection/README.md index e32dfae35832b..99075d5d48f59 100644 --- a/src/plugins/usage_collection/README.md +++ b/src/plugins/usage_collection/README.md @@ -126,41 +126,6 @@ export function registerMyPluginUsageCollector( } ``` -### Migrating to NP from Legacy Plugins - -Pass `usageCollection` to the setup NP plugin setup function under plugins. Inside the `setup` function call the `registerCollector` like what you'd do in the NP example above. - -```js -// index.js -export const myPlugin = (kibana: any) => { - return new kibana.Plugin({ - init: async function (server) { - const { usageCollection } = server.newPlatform.setup.plugins; - const plugins = { - usageCollection, - }; - plugin(initializerContext).setup(core, plugins); - } - }); -} -``` - -### Legacy Plugins - -Typically, a plugin will create the collector object and register it with the Telemetry service from the `init` method of the plugin definition, or a helper module called from `init`. - -```js -// index.js -export const myPlugin = (kibana: any) => { - return new kibana.Plugin({ - init: async function (server) { - const { usageCollection } = server.newPlatform.setup.plugins; - registerMyPluginUsageCollector(usageCollection); - } - }); -} -``` - ## Update the telemetry payload and telemetry cluster field mappings There is a module in the telemetry service that creates the payload of data that gets sent up to the telemetry cluster. @@ -239,15 +204,6 @@ To track a user interaction, use the `reportUiStats` method exposed by the plugi } ``` -Alternatively, in the Legacy world you can still import the `createUiStatsReporter` helper function from UI Metric app: - -```js -import { createUiStatsReporter, METRIC_TYPE } from 'relative/path/to/src/legacy/core_plugins/ui_metric/public'; -const trackMetric = createUiStatsReporter(``); -trackMetric(METRIC_TYPE.CLICK, ``); -trackMetric('click', ``); -``` - Metric Types: - `METRIC_TYPE.CLICK` for tracking clicks `trackMetric(METRIC_TYPE.CLICK, 'my_button_clicked');` From a1a157dc87135c9dd26da45320072283df1f932e Mon Sep 17 00:00:00 2001 From: Sonja Krause-Harder Date: Mon, 11 May 2020 18:06:19 +0200 Subject: [PATCH 075/102] [Ingest] Use Kibana logger for proper server-side logging (#66017) * Add logger to app context. --- x-pack/plugins/ingest_manager/server/plugin.ts | 5 +++++ .../plugins/ingest_manager/server/services/app_context.ts | 8 +++++++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/ingest_manager/server/plugin.ts b/x-pack/plugins/ingest_manager/server/plugin.ts index 24f3a11789dc7..cd44b61974b03 100644 --- a/x-pack/plugins/ingest_manager/server/plugin.ts +++ b/x-pack/plugins/ingest_manager/server/plugin.ts @@ -8,6 +8,7 @@ import { first } from 'rxjs/operators'; import { CoreSetup, CoreStart, + Logger, Plugin, PluginInitializerContext, SavedObjectsServiceStart, @@ -73,6 +74,7 @@ export interface IngestManagerAppContext { isProductionMode: boolean; kibanaVersion: string; cloud?: CloudSetup; + logger?: Logger; httpSetup?: HttpServiceSetup; } @@ -108,6 +110,7 @@ export class IngestManagerPlugin private config$: Observable; private security: SecurityPluginSetup | undefined; private cloud: CloudSetup | undefined; + private logger: Logger | undefined; private isProductionMode: boolean; private kibanaVersion: string; @@ -117,6 +120,7 @@ export class IngestManagerPlugin this.config$ = this.initializerContext.config.create(); this.isProductionMode = this.initializerContext.env.mode.prod; this.kibanaVersion = this.initializerContext.env.packageInfo.version; + this.logger = this.initializerContext.logger.get(); } public async setup(core: CoreSetup, deps: IngestManagerSetupDeps) { @@ -208,6 +212,7 @@ export class IngestManagerPlugin kibanaVersion: this.kibanaVersion, httpSetup: this.httpSetup, cloud: this.cloud, + logger: this.logger, }); licenseService.start(this.licensing$); return { diff --git a/x-pack/plugins/ingest_manager/server/services/app_context.ts b/x-pack/plugins/ingest_manager/server/services/app_context.ts index 6da0a137fa087..e5bc082f6f0fc 100644 --- a/x-pack/plugins/ingest_manager/server/services/app_context.ts +++ b/x-pack/plugins/ingest_manager/server/services/app_context.ts @@ -5,7 +5,7 @@ */ import { BehaviorSubject, Observable } from 'rxjs'; import { first } from 'rxjs/operators'; -import { SavedObjectsServiceStart, HttpServiceSetup } from 'src/core/server'; +import { SavedObjectsServiceStart, HttpServiceSetup, Logger } from 'src/core/server'; import { EncryptedSavedObjectsPluginStart } from '../../../encrypted_saved_objects/server'; import { SecurityPluginSetup } from '../../../security/server'; import { IngestManagerConfigType } from '../../common'; @@ -21,6 +21,7 @@ class AppContextService { private isProductionMode: boolean = false; private kibanaVersion: string | undefined; private cloud?: CloudSetup; + private logger?: Logger; private httpSetup?: HttpServiceSetup; public async start(appContext: IngestManagerAppContext) { @@ -29,6 +30,7 @@ class AppContextService { this.savedObjects = appContext.savedObjects; this.isProductionMode = appContext.isProductionMode; this.cloud = appContext.cloud; + this.logger = appContext.logger; this.kibanaVersion = appContext.kibanaVersion; this.httpSetup = appContext.httpSetup; @@ -60,6 +62,10 @@ class AppContextService { return this.cloud; } + public getLogger() { + return this.logger; + } + public getConfig() { return this.configSubject$?.value; } From 4912153ce6c6943815f4944e21de6b6b08597fe7 Mon Sep 17 00:00:00 2001 From: Mikhail Shustov Date: Mon, 11 May 2020 18:43:45 +0200 Subject: [PATCH 076/102] don't register any features in LP. (#65611) * don't register any features in LP. breaks features value reading in KP * move test plugin to NP * fix mappings * update docs * migrate another test * use contstants file for BWC with original code Co-authored-by: Elastic Machine --- ...ver.savedobjectscorefieldmapping.fields.md | 1 + ...ore-server.savedobjectscorefieldmapping.md | 2 +- .../server/saved_objects/mappings/types.ts | 1 + src/core/server/server.api.md | 1 + x-pack/legacy/plugins/maps/server/plugin.js | 34 +--------- .../xpack_main/server/lib/setup_xpack_main.js | 3 +- .../plugins/xpack_main/server/xpack_main.d.ts | 1 - x-pack/plugins/maps/kibana.json | 6 +- .../app.js => plugins/maps/server/index.ts} | 5 ++ x-pack/plugins/maps/server/plugin.ts | 52 +++++++++++++++ .../namespace_agnostic_type_plugin/index.js | 55 ---------------- .../kibana.json | 8 +++ .../mappings.json | 15 ----- .../package.json | 7 -- .../server/index.ts | 64 +++++++++++++++++++ .../fixtures/plugins/foo_plugin/index.js | 52 --------------- .../fixtures/plugins/foo_plugin/kibana.json | 8 +++ .../fixtures/plugins/foo_plugin/package.json | 7 -- .../plugins/foo_plugin/public/index.ts | 21 ++++++ .../plugins/foo_plugin/server/index.ts | 47 ++++++++++++++ 20 files changed, 215 insertions(+), 175 deletions(-) rename x-pack/{test/ui_capabilities/common/fixtures/plugins/foo_plugin/public/app.js => plugins/maps/server/index.ts} (53%) create mode 100644 x-pack/plugins/maps/server/plugin.ts delete mode 100644 x-pack/test/saved_object_api_integration/common/fixtures/namespace_agnostic_type_plugin/index.js create mode 100644 x-pack/test/saved_object_api_integration/common/fixtures/namespace_agnostic_type_plugin/kibana.json delete mode 100644 x-pack/test/saved_object_api_integration/common/fixtures/namespace_agnostic_type_plugin/mappings.json delete mode 100644 x-pack/test/saved_object_api_integration/common/fixtures/namespace_agnostic_type_plugin/package.json create mode 100644 x-pack/test/saved_object_api_integration/common/fixtures/namespace_agnostic_type_plugin/server/index.ts delete mode 100644 x-pack/test/ui_capabilities/common/fixtures/plugins/foo_plugin/index.js create mode 100644 x-pack/test/ui_capabilities/common/fixtures/plugins/foo_plugin/kibana.json delete mode 100644 x-pack/test/ui_capabilities/common/fixtures/plugins/foo_plugin/package.json create mode 100644 x-pack/test/ui_capabilities/common/fixtures/plugins/foo_plugin/public/index.ts create mode 100644 x-pack/test/ui_capabilities/common/fixtures/plugins/foo_plugin/server/index.ts diff --git a/docs/development/core/server/kibana-plugin-core-server.savedobjectscorefieldmapping.fields.md b/docs/development/core/server/kibana-plugin-core-server.savedobjectscorefieldmapping.fields.md index db774a055e528..4f88b635ca2f7 100644 --- a/docs/development/core/server/kibana-plugin-core-server.savedobjectscorefieldmapping.fields.md +++ b/docs/development/core/server/kibana-plugin-core-server.savedobjectscorefieldmapping.fields.md @@ -10,6 +10,7 @@ fields?: { [subfield: string]: { type: string; + ignore_above?: number; }; }; ``` diff --git a/docs/development/core/server/kibana-plugin-core-server.savedobjectscorefieldmapping.md b/docs/development/core/server/kibana-plugin-core-server.savedobjectscorefieldmapping.md index dbc7d0ca431ce..9a31d37b3ff30 100644 --- a/docs/development/core/server/kibana-plugin-core-server.savedobjectscorefieldmapping.md +++ b/docs/development/core/server/kibana-plugin-core-server.savedobjectscorefieldmapping.md @@ -17,7 +17,7 @@ export interface SavedObjectsCoreFieldMapping | Property | Type | Description | | --- | --- | --- | | [enabled](./kibana-plugin-core-server.savedobjectscorefieldmapping.enabled.md) | boolean | | -| [fields](./kibana-plugin-core-server.savedobjectscorefieldmapping.fields.md) | {
[subfield: string]: {
type: string;
};
} | | +| [fields](./kibana-plugin-core-server.savedobjectscorefieldmapping.fields.md) | {
[subfield: string]: {
type: string;
ignore_above?: number;
};
} | | | [index](./kibana-plugin-core-server.savedobjectscorefieldmapping.index.md) | boolean | | | [null\_value](./kibana-plugin-core-server.savedobjectscorefieldmapping.null_value.md) | number | boolean | string | | | [type](./kibana-plugin-core-server.savedobjectscorefieldmapping.type.md) | string | | diff --git a/src/core/server/saved_objects/mappings/types.ts b/src/core/server/saved_objects/mappings/types.ts index c1b65763949bb..8362d1f16bd2a 100644 --- a/src/core/server/saved_objects/mappings/types.ts +++ b/src/core/server/saved_objects/mappings/types.ts @@ -137,6 +137,7 @@ export interface SavedObjectsCoreFieldMapping { fields?: { [subfield: string]: { type: string; + ignore_above?: number; }; }; } diff --git a/src/core/server/server.api.md b/src/core/server/server.api.md index e4234689c25e8..bb8ee1d8e7a31 100644 --- a/src/core/server/server.api.md +++ b/src/core/server/server.api.md @@ -1884,6 +1884,7 @@ export interface SavedObjectsCoreFieldMapping { fields?: { [subfield: string]: { type: string; + ignore_above?: number; }; }; // (undocumented) diff --git a/x-pack/legacy/plugins/maps/server/plugin.js b/x-pack/legacy/plugins/maps/server/plugin.js index d2d5309606cde..6a542dff2eb1b 100644 --- a/x-pack/legacy/plugins/maps/server/plugin.js +++ b/x-pack/legacy/plugins/maps/server/plugin.js @@ -19,42 +19,10 @@ import { emsBoundariesSpecProvider } from './tutorials/ems'; export class MapPlugin { setup(core, plugins, __LEGACY) { - const { featuresPlugin, home, licensing, usageCollection, mapsLegacy } = plugins; + const { home, licensing, usageCollection, mapsLegacy } = plugins; let routesInitialized = false; const mapConfig = mapsLegacy.config; - featuresPlugin.registerFeature({ - id: APP_ID, - name: i18n.translate('xpack.maps.featureRegistry.mapsFeatureName', { - defaultMessage: 'Maps', - }), - order: 600, - icon: APP_ICON, - navLinkId: APP_ID, - app: [APP_ID, 'kibana'], - catalogue: [APP_ID], - privileges: { - all: { - app: [APP_ID, 'kibana'], - catalogue: [APP_ID], - savedObject: { - all: [MAP_SAVED_OBJECT_TYPE, 'query'], - read: ['index-pattern'], - }, - ui: ['save', 'show', 'saveQuery'], - }, - read: { - app: [APP_ID, 'kibana'], - catalogue: [APP_ID], - savedObject: { - all: [], - read: [MAP_SAVED_OBJECT_TYPE, 'index-pattern', 'query'], - }, - ui: ['show'], - }, - }, - }); - licensing.license$.subscribe(license => { const { state } = license.check('maps', 'basic'); if (state === 'valid' && !routesInitialized) { diff --git a/x-pack/legacy/plugins/xpack_main/server/lib/setup_xpack_main.js b/x-pack/legacy/plugins/xpack_main/server/lib/setup_xpack_main.js index 2707858a5fec8..9196b210bba20 100644 --- a/x-pack/legacy/plugins/xpack_main/server/lib/setup_xpack_main.js +++ b/x-pack/legacy/plugins/xpack_main/server/lib/setup_xpack_main.js @@ -22,8 +22,7 @@ export function setupXPackMain(server) { server.ext('onPreResponse', (request, h) => injectXPackInfoSignature(info, request, h)); - const { registerFeature, getFeatures } = server.newPlatform.setup.plugins.features; - server.expose('registerFeature', registerFeature); + const { getFeatures } = server.newPlatform.setup.plugins.features; server.expose('getFeatures', getFeatures); const setPluginStatus = () => { diff --git a/x-pack/legacy/plugins/xpack_main/server/xpack_main.d.ts b/x-pack/legacy/plugins/xpack_main/server/xpack_main.d.ts index 7b5dc19760627..2a59c2f1366d4 100644 --- a/x-pack/legacy/plugins/xpack_main/server/xpack_main.d.ts +++ b/x-pack/legacy/plugins/xpack_main/server/xpack_main.d.ts @@ -12,5 +12,4 @@ export { XPackFeature } from './lib/xpack_info'; export interface XPackMainPlugin { info: XPackInfo; getFeatures(): Feature[]; - registerFeature(feature: FeatureConfig): void; } diff --git a/x-pack/plugins/maps/kibana.json b/x-pack/plugins/maps/kibana.json index 077601204e3ee..efbac56a817be 100644 --- a/x-pack/plugins/maps/kibana.json +++ b/x-pack/plugins/maps/kibana.json @@ -4,8 +4,9 @@ "kibanaVersion": "kibana", "configPath": ["xpack", "maps"], "requiredPlugins": [ - "inspector", "licensing", + "features", + "inspector", "home", "data", "fileUpload", @@ -15,5 +16,6 @@ "embeddable", "mapsLegacy" ], - "ui": true + "ui": true, + "server": true } diff --git a/x-pack/test/ui_capabilities/common/fixtures/plugins/foo_plugin/public/app.js b/x-pack/plugins/maps/server/index.ts similarity index 53% rename from x-pack/test/ui_capabilities/common/fixtures/plugins/foo_plugin/public/app.js rename to x-pack/plugins/maps/server/index.ts index 41bc2aa258807..1b714a3555b34 100644 --- a/x-pack/test/ui_capabilities/common/fixtures/plugins/foo_plugin/public/app.js +++ b/x-pack/plugins/maps/server/index.ts @@ -3,3 +3,8 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ +import { PluginInitializerContext } from 'src/core/server'; +import { MapsPlugin } from './plugin'; + +export const plugin = (initializerContext: PluginInitializerContext) => + new MapsPlugin(initializerContext); diff --git a/x-pack/plugins/maps/server/plugin.ts b/x-pack/plugins/maps/server/plugin.ts new file mode 100644 index 0000000000000..7de0a69fb0079 --- /dev/null +++ b/x-pack/plugins/maps/server/plugin.ts @@ -0,0 +1,52 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ +import { i18n } from '@kbn/i18n'; +import { CoreSetup, CoreStart, Plugin, PluginInitializerContext } from 'src/core/server'; +import { PluginSetupContract as FeaturesPluginSetupContract } from '../../features/server'; + +import { APP_ID, APP_ICON, MAP_SAVED_OBJECT_TYPE } from '../common/constants'; + +interface SetupDeps { + features: FeaturesPluginSetupContract; +} + +export class MapsPlugin implements Plugin { + constructor(initializerContext: PluginInitializerContext) {} + setup(core: CoreSetup, plugins: SetupDeps) { + plugins.features.registerFeature({ + id: APP_ID, + name: i18n.translate('xpack.maps.featureRegistry.mapsFeatureName', { + defaultMessage: 'Maps', + }), + order: 600, + icon: APP_ICON, + navLinkId: APP_ID, + app: [APP_ID, 'kibana'], + catalogue: [APP_ID], + privileges: { + all: { + app: [APP_ID, 'kibana'], + catalogue: [APP_ID], + savedObject: { + all: [MAP_SAVED_OBJECT_TYPE, 'query'], + read: ['index-pattern'], + }, + ui: ['save', 'show', 'saveQuery'], + }, + read: { + app: [APP_ID, 'kibana'], + catalogue: [APP_ID], + savedObject: { + all: [], + read: [MAP_SAVED_OBJECT_TYPE, 'index-pattern', 'query'], + }, + ui: ['show'], + }, + }, + }); + } + start(core: CoreStart) {} +} diff --git a/x-pack/test/saved_object_api_integration/common/fixtures/namespace_agnostic_type_plugin/index.js b/x-pack/test/saved_object_api_integration/common/fixtures/namespace_agnostic_type_plugin/index.js deleted file mode 100644 index b8dbdeb07d7fe..0000000000000 --- a/x-pack/test/saved_object_api_integration/common/fixtures/namespace_agnostic_type_plugin/index.js +++ /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; - * you may not use this file except in compliance with the Elastic License. - */ - -import mappings from './mappings.json'; - -export default function(kibana) { - return new kibana.Plugin({ - require: ['kibana', 'elasticsearch', 'xpack_main'], - name: 'namespace_agnostic_type_plugin', - uiExports: { - savedObjectsManagement: { - globaltype: { - isImportableAndExportable: true, - }, - }, - savedObjectSchemas: { - globaltype: { - isNamespaceAgnostic: true, - }, - }, - mappings, - }, - - config() {}, - - init(server) { - server.plugins.xpack_main.registerFeature({ - id: 'namespace_agnostic_type_plugin', - name: 'namespace_agnostic_type_plugin', - icon: 'upArrow', - navLinkId: 'namespace_agnostic_type_plugin', - app: [], - privileges: { - all: { - savedObject: { - all: ['globaltype'], - read: [], - }, - ui: [], - }, - read: { - savedObject: { - all: [], - read: ['globaltype'], - }, - ui: [], - }, - }, - }); - }, - }); -} diff --git a/x-pack/test/saved_object_api_integration/common/fixtures/namespace_agnostic_type_plugin/kibana.json b/x-pack/test/saved_object_api_integration/common/fixtures/namespace_agnostic_type_plugin/kibana.json new file mode 100644 index 0000000000000..ec3077999d8bd --- /dev/null +++ b/x-pack/test/saved_object_api_integration/common/fixtures/namespace_agnostic_type_plugin/kibana.json @@ -0,0 +1,8 @@ +{ + "id": "namespace_agnostic_type_plugin", + "version": "1.0.0", + "kibanaVersion": "kibana", + "requiredPlugins": ["features"], + "server": true, + "ui": false +} diff --git a/x-pack/test/saved_object_api_integration/common/fixtures/namespace_agnostic_type_plugin/mappings.json b/x-pack/test/saved_object_api_integration/common/fixtures/namespace_agnostic_type_plugin/mappings.json deleted file mode 100644 index 64d309b4209a2..0000000000000 --- a/x-pack/test/saved_object_api_integration/common/fixtures/namespace_agnostic_type_plugin/mappings.json +++ /dev/null @@ -1,15 +0,0 @@ -{ - "globaltype": { - "properties": { - "title": { - "type": "text", - "fields": { - "keyword": { - "type": "keyword", - "ignore_above": 2048 - } - } - } - } - } -} diff --git a/x-pack/test/saved_object_api_integration/common/fixtures/namespace_agnostic_type_plugin/package.json b/x-pack/test/saved_object_api_integration/common/fixtures/namespace_agnostic_type_plugin/package.json deleted file mode 100644 index 1a0afbc6bfcb3..0000000000000 --- a/x-pack/test/saved_object_api_integration/common/fixtures/namespace_agnostic_type_plugin/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "namespace_agnostic_type_plugin", - "version": "0.0.0", - "kibana": { - "version": "kibana" - } -} diff --git a/x-pack/test/saved_object_api_integration/common/fixtures/namespace_agnostic_type_plugin/server/index.ts b/x-pack/test/saved_object_api_integration/common/fixtures/namespace_agnostic_type_plugin/server/index.ts new file mode 100644 index 0000000000000..d8940c96e676a --- /dev/null +++ b/x-pack/test/saved_object_api_integration/common/fixtures/namespace_agnostic_type_plugin/server/index.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; + * you may not use this file except in compliance with the Elastic License. + */ +import { CoreSetup, Plugin } from 'src/core/server'; +import { PluginSetupContract as FeaturesPluginSetupContract } from '../../../../../../plugins/features/server'; + +export const plugin = () => new NamespaceAgnosticTypePlugin(); + +interface SetupDeps { + features: FeaturesPluginSetupContract; +} + +class NamespaceAgnosticTypePlugin implements Plugin { + setup(core: CoreSetup, plugins: SetupDeps) { + core.savedObjects.registerType({ + name: 'globaltype', + hidden: false, + namespaceType: 'agnostic', + management: { + importableAndExportable: true, + }, + mappings: { + properties: { + title: { + type: 'text', + fields: { + keyword: { + type: 'keyword', + ignore_above: 2048, + }, + }, + }, + }, + }, + }); + + plugins.features.registerFeature({ + id: 'namespace_agnostic_type_plugin', + name: 'namespace_agnostic_type_plugin', + icon: 'upArrow', + navLinkId: 'namespace_agnostic_type_plugin', + app: [], + privileges: { + all: { + savedObject: { + all: ['globaltype'], + read: [], + }, + ui: [], + }, + read: { + savedObject: { + all: [], + read: ['globaltype'], + }, + ui: [], + }, + }, + }); + } + start() {} +} diff --git a/x-pack/test/ui_capabilities/common/fixtures/plugins/foo_plugin/index.js b/x-pack/test/ui_capabilities/common/fixtures/plugins/foo_plugin/index.js deleted file mode 100644 index 89ae0125614b6..0000000000000 --- a/x-pack/test/ui_capabilities/common/fixtures/plugins/foo_plugin/index.js +++ /dev/null @@ -1,52 +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; - * you may not use this file except in compliance with the Elastic License. - */ - -export default function(kibana) { - return new kibana.Plugin({ - require: ['kibana', 'elasticsearch', 'xpack_main'], - name: 'foo', - uiExports: { - app: { - title: 'Foo', - order: 1000, - euiIconType: 'uiArray', - description: 'Foo app', - main: 'plugins/foo_plugin/app', - }, - }, - - init(server) { - server.plugins.xpack_main.registerFeature({ - id: 'foo', - name: 'Foo', - icon: 'upArrow', - navLinkId: 'foo_plugin', - app: ['kibana'], - catalogue: ['foo'], - privileges: { - all: { - app: ['kibana'], - catalogue: ['foo'], - savedObject: { - all: ['foo'], - read: ['index-pattern'], - }, - ui: ['create', 'edit', 'delete', 'show'], - }, - read: { - app: ['kibana'], - catalogue: ['foo'], - savedObject: { - all: [], - read: ['foo', 'index-pattern'], - }, - ui: ['show'], - }, - }, - }); - }, - }); -} diff --git a/x-pack/test/ui_capabilities/common/fixtures/plugins/foo_plugin/kibana.json b/x-pack/test/ui_capabilities/common/fixtures/plugins/foo_plugin/kibana.json new file mode 100644 index 0000000000000..cec1640fbb047 --- /dev/null +++ b/x-pack/test/ui_capabilities/common/fixtures/plugins/foo_plugin/kibana.json @@ -0,0 +1,8 @@ +{ + "id": "foo_plugin", + "version": "1.0.0", + "kibanaVersion": "kibana", + "requiredPlugins": ["features"], + "server": true, + "ui": true +} diff --git a/x-pack/test/ui_capabilities/common/fixtures/plugins/foo_plugin/package.json b/x-pack/test/ui_capabilities/common/fixtures/plugins/foo_plugin/package.json deleted file mode 100644 index 45228b47c0a31..0000000000000 --- a/x-pack/test/ui_capabilities/common/fixtures/plugins/foo_plugin/package.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "name": "foo_plugin", - "version": "0.0.0", - "kibana": { - "version": "kibana" - } -} diff --git a/x-pack/test/ui_capabilities/common/fixtures/plugins/foo_plugin/public/index.ts b/x-pack/test/ui_capabilities/common/fixtures/plugins/foo_plugin/public/index.ts new file mode 100644 index 0000000000000..357cbba334928 --- /dev/null +++ b/x-pack/test/ui_capabilities/common/fixtures/plugins/foo_plugin/public/index.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; + * you may not use this file except in compliance with the Elastic License. + */ +import { CoreSetup, Plugin } from 'src/core/public'; +export const plugin = () => new FooPlugin(); + +class FooPlugin implements Plugin { + setup(core: CoreSetup) { + core.application.register({ + id: 'foo', + title: 'Foo app', + euiIconType: 'uiArray', + mount() { + return () => null; + }, + }); + } + start() {} +} diff --git a/x-pack/test/ui_capabilities/common/fixtures/plugins/foo_plugin/server/index.ts b/x-pack/test/ui_capabilities/common/fixtures/plugins/foo_plugin/server/index.ts new file mode 100644 index 0000000000000..bff794801119a --- /dev/null +++ b/x-pack/test/ui_capabilities/common/fixtures/plugins/foo_plugin/server/index.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; + * you may not use this file except in compliance with the Elastic License. + */ +import { CoreSetup, Plugin } from 'src/core/server'; +import { PluginSetupContract as FeaturesPluginSetupContract } from '../../../../../../../plugins/features/server'; + +export const plugin = () => new FooPlugin(); + +interface SetupDeps { + features: FeaturesPluginSetupContract; +} + +class FooPlugin implements Plugin { + setup(core: CoreSetup, plugins: SetupDeps) { + plugins.features.registerFeature({ + id: 'foo', + name: 'Foo', + icon: 'upArrow', + navLinkId: 'foo_plugin', + app: ['kibana'], + catalogue: ['foo'], + privileges: { + all: { + app: ['kibana'], + catalogue: ['foo'], + savedObject: { + all: ['foo'], + read: ['index-pattern'], + }, + ui: ['create', 'edit', 'delete', 'show'], + }, + read: { + app: ['kibana'], + catalogue: ['foo'], + savedObject: { + all: [], + read: ['foo', 'index-pattern'], + }, + ui: ['show'], + }, + }, + }); + } + start() {} +} From 4174bab3cc357f1c85b8e643dad83ea62ae73956 Mon Sep 17 00:00:00 2001 From: Melissa Alvarez Date: Mon, 11 May 2020 12:56:25 -0400 Subject: [PATCH 077/102] [ML] Anomaly Explorer: if filter includes wildcard ensure matching swimlanes are not masked (#65384) * if wildcard search no mask for matching swimlanes * update swimlane proptypes * add helper function * add tests for helper function --- .../__mocks__/mock_viewby_swimlane.json | 33 +++++++++++++++++++ .../public/application/explorer/explorer.js | 11 ++++++- .../explorer/explorer_swimlane.tsx | 2 +- .../explorer/has_matching_points.test.ts | 31 +++++++++++++++++ .../explorer/has_matching_points.ts | 30 +++++++++++++++++ 5 files changed, 105 insertions(+), 2 deletions(-) create mode 100644 x-pack/plugins/ml/public/application/explorer/__mocks__/mock_viewby_swimlane.json create mode 100644 x-pack/plugins/ml/public/application/explorer/has_matching_points.test.ts create mode 100644 x-pack/plugins/ml/public/application/explorer/has_matching_points.ts diff --git a/x-pack/plugins/ml/public/application/explorer/__mocks__/mock_viewby_swimlane.json b/x-pack/plugins/ml/public/application/explorer/__mocks__/mock_viewby_swimlane.json new file mode 100644 index 0000000000000..05095c90ac1d6 --- /dev/null +++ b/x-pack/plugins/ml/public/application/explorer/__mocks__/mock_viewby_swimlane.json @@ -0,0 +1,33 @@ +{ + "laneLabels": [ + "View by" + ], + "points": [ + { + "laneLabel": "test-1", + "time": 1486425600, + "value": 0 + }, + { + "laneLabel": "test-2", + "time": 1486440000, + "value": 0.01107053 + }, + { + "laneLabel": "other-3", + "time": 1486454400, + "value": 0.1870243 + }, + { + "laneLabel": "other-4", + "time": 1486468800, + "value": 0.5947769 + }, + { + "laneLabel": "other-5", + "time": 1486483200, + "value": 0 + } + ], + "interval": 14400 +} diff --git a/x-pack/plugins/ml/public/application/explorer/explorer.js b/x-pack/plugins/ml/public/application/explorer/explorer.js index 8fd2479817807..9c9c82a212472 100644 --- a/x-pack/plugins/ml/public/application/explorer/explorer.js +++ b/x-pack/plugins/ml/public/application/explorer/explorer.js @@ -81,6 +81,7 @@ import { AnomaliesTable } from '../components/anomalies_table/anomalies_table'; import { ResizeChecker } from '../../../../../../src/plugins/kibana_utils/public'; import { getTimefilter, getToastNotifications } from '../util/dependency_cache'; import { MlTooltipComponent } from '../components/chart_tooltip'; +import { hasMatchingPoints } from './has_matching_points'; function mapSwimlaneOptionsToEuiOptions(options) { return options.map(option => ({ @@ -284,6 +285,7 @@ export class Explorer extends React.Component { annotationsData, chartsData, filterActive, + filteredFields, filterPlaceHolder, indexPattern, influencers, @@ -418,6 +420,7 @@ export class Explorer extends React.Component { { if (selectedCellTimes.length > 0) { this.highlightOverall(selectedCellTimes); } - this.maskIrrelevantSwimlanes(!!maskAll); + this.maskIrrelevantSwimlanes(Boolean(maskAll)); } else { this.clearSelection(); } diff --git a/x-pack/plugins/ml/public/application/explorer/has_matching_points.test.ts b/x-pack/plugins/ml/public/application/explorer/has_matching_points.test.ts new file mode 100644 index 0000000000000..8d6f71bb7720d --- /dev/null +++ b/x-pack/plugins/ml/public/application/explorer/has_matching_points.test.ts @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import mockViewBySwimlaneData from './__mocks__/mock_viewby_swimlane.json'; +import { hasMatchingPoints } from './has_matching_points'; + +const filteredFieldsMatch = ['test@kuery-wildcard@']; +const filteredFieldsNoMatch = ['no-match@kuery-wildcard@', 'nonexistant']; + +describe('hasMatchingPoints', () => { + test('is true', () => { + expect( + hasMatchingPoints({ + filteredFields: filteredFieldsMatch, + swimlaneData: mockViewBySwimlaneData, + }) + ).toBe(true); + }); + + test('is false', () => { + expect( + hasMatchingPoints({ + filteredFields: filteredFieldsNoMatch, + swimlaneData: mockViewBySwimlaneData, + }) + ).toBe(false); + }); +}); diff --git a/x-pack/plugins/ml/public/application/explorer/has_matching_points.ts b/x-pack/plugins/ml/public/application/explorer/has_matching_points.ts new file mode 100644 index 0000000000000..397615d68f189 --- /dev/null +++ b/x-pack/plugins/ml/public/application/explorer/has_matching_points.ts @@ -0,0 +1,30 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { ExplorerState } from './reducers'; +import { OverallSwimlaneData, SwimlaneData } from './explorer_utils'; + +interface HasMatchingPointsParams { + filteredFields?: ExplorerState['filteredFields']; + swimlaneData: SwimlaneData | OverallSwimlaneData; +} + +export const hasMatchingPoints = ({ + filteredFields = [], + swimlaneData, +}: HasMatchingPointsParams): boolean => { + // If filtered fields includes a wildcard search maskAll only if there are no points matching the pattern + const wildCardField = filteredFields.find(field => /\@kuery-wildcard\@$/.test(field)); + const substring = + wildCardField !== undefined ? wildCardField.replace(/\@kuery-wildcard\@$/, '') : null; + + return ( + substring !== null && + swimlaneData.points.some(point => { + return point.laneLabel.includes(substring); + }) + ); +}; From be7902311d92d28befee183ff6c8ef7b44cd142d Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Mon, 11 May 2020 18:23:42 +0100 Subject: [PATCH 078/102] chore(NA): skip mapping editor shape datatype test (#66041) --- .../client_integration/datatypes/shape_datatype.test.tsx | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/datatypes/shape_datatype.test.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/datatypes/shape_datatype.test.tsx index 19bf6973472ff..0816770aab3a8 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/datatypes/shape_datatype.test.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/datatypes/shape_datatype.test.tsx @@ -20,7 +20,9 @@ export const defaultShapeParameters = { ignore_z_value: true, }; -describe('Mappings editor: shape datatype', () => { +// That test is being flaky and is under work to be fixed +// Skipping it for now. +describe.skip('Mappings editor: shape datatype', () => { let testBed: MappingsEditorTestBed; /** From cbe559745a66ddf41b2d5c7dce67d16f572ba200 Mon Sep 17 00:00:00 2001 From: Spencer Date: Mon, 11 May 2020 11:04:23 -0700 Subject: [PATCH 079/102] [procrunner] avoid waiting for processes forever (#65909) --- .../src/proc_runner/proc_runner.ts | 26 +- packages/kbn-pm/dist/index.js | 21246 ++++++++-------- 2 files changed, 10647 insertions(+), 10625 deletions(-) diff --git a/packages/kbn-dev-utils/src/proc_runner/proc_runner.ts b/packages/kbn-dev-utils/src/proc_runner/proc_runner.ts index 14c87766213cd..1759ca2840c5b 100644 --- a/packages/kbn-dev-utils/src/proc_runner/proc_runner.ts +++ b/packages/kbn-dev-utils/src/proc_runner/proc_runner.ts @@ -18,17 +18,22 @@ */ import moment from 'moment'; -import { filter, first, catchError } from 'rxjs/operators'; +import * as Rx from 'rxjs'; +import { filter, first, catchError, map } from 'rxjs/operators'; import exitHook from 'exit-hook'; import { ToolingLog } from '../tooling_log'; import { createCliError } from './errors'; import { Proc, ProcOptions, startProc } from './proc'; +const SECOND = 1000; +const MINUTE = 60 * SECOND; + const noop = () => {}; interface RunOptions extends ProcOptions { wait: true | RegExp; + waitTimeout?: number | false; } /** @@ -71,6 +76,7 @@ export class ProcRunner { cwd = process.cwd(), stdin = undefined, wait = false, + waitTimeout = 15 * MINUTE, env = process.env, } = options; @@ -97,8 +103,8 @@ export class ProcRunner { try { if (wait instanceof RegExp) { // wait for process to log matching line - await proc.lines$ - .pipe( + await Rx.race( + proc.lines$.pipe( filter(line => wait.test(line)), first(), catchError(err => { @@ -108,8 +114,18 @@ export class ProcRunner { throw err; } }) - ) - .toPromise(); + ), + waitTimeout === false + ? Rx.NEVER + : Rx.timer(waitTimeout).pipe( + map(() => { + const sec = waitTimeout / SECOND; + throw createCliError( + `[${name}] failed to match pattern within ${sec} seconds [pattern=${wait}]` + ); + }) + ) + ).toPromise(); } if (wait === true) { diff --git a/packages/kbn-pm/dist/index.js b/packages/kbn-pm/dist/index.js index 1b70cced4a5c9..1b670eb8cd816 100644 --- a/packages/kbn-pm/dist/index.js +++ b/packages/kbn-pm/dist/index.js @@ -4838,10 +4838,13 @@ exports.withProcRunner = withProcRunner; Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = __webpack_require__(36); const moment_1 = tslib_1.__importDefault(__webpack_require__(40)); -const operators_1 = __webpack_require__(169); -const exit_hook_1 = tslib_1.__importDefault(__webpack_require__(348)); -const errors_1 = __webpack_require__(349); -const proc_1 = __webpack_require__(350); +const Rx = tslib_1.__importStar(__webpack_require__(169)); +const operators_1 = __webpack_require__(270); +const exit_hook_1 = tslib_1.__importDefault(__webpack_require__(368)); +const errors_1 = __webpack_require__(369); +const proc_1 = __webpack_require__(370); +const SECOND = 1000; +const MINUTE = 60 * SECOND; const noop = () => { }; /** * Helper for starting and managing processes. In many ways it resembles the @@ -4875,7 +4878,7 @@ class ProcRunner { * @return {Promise} */ async run(name, options) { - const { cmd, args = [], cwd = process.cwd(), stdin = undefined, wait = false, env = process.env, } = options; + const { cmd, args = [], cwd = process.cwd(), stdin = undefined, wait = false, waitTimeout = 15 * MINUTE, env = process.env, } = options; if (this.closing) { throw new Error('ProcRunner is closing'); } @@ -4895,16 +4898,19 @@ class ProcRunner { try { if (wait instanceof RegExp) { // wait for process to log matching line - await proc.lines$ - .pipe(operators_1.filter(line => wait.test(line)), operators_1.first(), operators_1.catchError(err => { + await Rx.race(proc.lines$.pipe(operators_1.filter(line => wait.test(line)), operators_1.first(), operators_1.catchError(err => { if (err.name !== 'EmptyError') { throw errors_1.createCliError(`[${name}] exited without matching pattern: ${wait}`); } else { throw err; } - })) - .toPromise(); + })), waitTimeout === false + ? Rx.NEVER + : Rx.timer(waitTimeout).pipe(operators_1.map(() => { + const sec = waitTimeout / SECOND; + throw errors_1.createCliError(`[${name}] failed to match pattern within ${sec} seconds [pattern=${wait}]`); + }))).toPromise(); } if (wait === true) { // wait for process to complete @@ -21959,316 +21965,172 @@ webpackContext.id = 41; "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_operators_audit__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); -/* 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__(198); -/* 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__(207); -/* 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__(208); -/* 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__(209); -/* 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__(210); -/* 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__(211); -/* 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__(212); -/* 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__(213); -/* 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__(217); -/* 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__(225); -/* 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__(228); -/* 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__(233); -/* 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__(234); -/* 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__(235); -/* 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__(236); -/* 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__(237); -/* 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__(238); -/* 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__(239); -/* 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__(244); -/* 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__(245); -/* 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__(246); -/* 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__(247); -/* 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__(248); -/* 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__(249); -/* 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__(255); -/* 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__(256); -/* 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__(257); -/* 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__(258); -/* 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__(259); -/* 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__(251); -/* 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__(260); -/* 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__(261); -/* 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__(262); -/* 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__(263); -/* 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__(264); -/* 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__(268); -/* 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__(269); -/* 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__(270); -/* 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__(231); -/* 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__(272); -/* 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__(273); -/* 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__(274); -/* 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__(277); -/* 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__(229); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mergeAll", function() { return _internal_operators_mergeAll__WEBPACK_IMPORTED_MODULE_44__["mergeAll"]; }); - -/* harmony import */ var _internal_operators_mergeMap__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(230); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mergeMap", function() { return _internal_operators_mergeMap__WEBPACK_IMPORTED_MODULE_45__["mergeMap"]; }); - -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "flatMap", function() { return _internal_operators_mergeMap__WEBPACK_IMPORTED_MODULE_45__["mergeMap"]; }); - -/* harmony import */ var _internal_operators_mergeMapTo__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(279); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mergeMapTo", function() { return _internal_operators_mergeMapTo__WEBPACK_IMPORTED_MODULE_46__["mergeMapTo"]; }); +/* harmony import */ var _internal_Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Observable", function() { return _internal_Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"]; }); -/* harmony import */ var _internal_operators_mergeScan__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(280); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mergeScan", function() { return _internal_operators_mergeScan__WEBPACK_IMPORTED_MODULE_47__["mergeScan"]; }); +/* harmony import */ var _internal_observable_ConnectableObservable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(186); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ConnectableObservable", function() { return _internal_observable_ConnectableObservable__WEBPACK_IMPORTED_MODULE_1__["ConnectableObservable"]; }); -/* harmony import */ var _internal_operators_min__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(281); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "min", function() { return _internal_operators_min__WEBPACK_IMPORTED_MODULE_48__["min"]; }); +/* harmony import */ var _internal_operators_groupBy__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(191); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "GroupedObservable", function() { return _internal_operators_groupBy__WEBPACK_IMPORTED_MODULE_2__["GroupedObservable"]; }); -/* harmony import */ var _internal_operators_multicast__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(282); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "multicast", function() { return _internal_operators_multicast__WEBPACK_IMPORTED_MODULE_49__["multicast"]; }); +/* harmony import */ var _internal_symbol_observable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(183); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "observable", function() { return _internal_symbol_observable__WEBPACK_IMPORTED_MODULE_3__["observable"]; }); -/* harmony import */ var _internal_operators_observeOn__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(285); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "observeOn", function() { return _internal_operators_observeOn__WEBPACK_IMPORTED_MODULE_50__["observeOn"]; }); +/* harmony import */ var _internal_Subject__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(187); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Subject", function() { return _internal_Subject__WEBPACK_IMPORTED_MODULE_4__["Subject"]; }); -/* harmony import */ var _internal_operators_onErrorResumeNext__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(286); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "onErrorResumeNext", function() { return _internal_operators_onErrorResumeNext__WEBPACK_IMPORTED_MODULE_51__["onErrorResumeNext"]; }); +/* harmony import */ var _internal_BehaviorSubject__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(192); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BehaviorSubject", function() { return _internal_BehaviorSubject__WEBPACK_IMPORTED_MODULE_5__["BehaviorSubject"]; }); -/* harmony import */ var _internal_operators_pairwise__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(287); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pairwise", function() { return _internal_operators_pairwise__WEBPACK_IMPORTED_MODULE_52__["pairwise"]; }); +/* harmony import */ var _internal_ReplaySubject__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(193); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ReplaySubject", function() { return _internal_ReplaySubject__WEBPACK_IMPORTED_MODULE_6__["ReplaySubject"]; }); -/* harmony import */ var _internal_operators_partition__WEBPACK_IMPORTED_MODULE_53__ = __webpack_require__(288); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "partition", function() { return _internal_operators_partition__WEBPACK_IMPORTED_MODULE_53__["partition"]; }); +/* harmony import */ var _internal_AsyncSubject__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(210); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AsyncSubject", function() { return _internal_AsyncSubject__WEBPACK_IMPORTED_MODULE_7__["AsyncSubject"]; }); -/* harmony import */ var _internal_operators_pluck__WEBPACK_IMPORTED_MODULE_54__ = __webpack_require__(290); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pluck", function() { return _internal_operators_pluck__WEBPACK_IMPORTED_MODULE_54__["pluck"]; }); +/* harmony import */ var _internal_scheduler_asap__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(211); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "asapScheduler", function() { return _internal_scheduler_asap__WEBPACK_IMPORTED_MODULE_8__["asap"]; }); -/* harmony import */ var _internal_operators_publish__WEBPACK_IMPORTED_MODULE_55__ = __webpack_require__(291); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "publish", function() { return _internal_operators_publish__WEBPACK_IMPORTED_MODULE_55__["publish"]; }); +/* harmony import */ var _internal_scheduler_async__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(215); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "asyncScheduler", function() { return _internal_scheduler_async__WEBPACK_IMPORTED_MODULE_9__["async"]; }); -/* harmony import */ var _internal_operators_publishBehavior__WEBPACK_IMPORTED_MODULE_56__ = __webpack_require__(292); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "publishBehavior", function() { return _internal_operators_publishBehavior__WEBPACK_IMPORTED_MODULE_56__["publishBehavior"]; }); +/* harmony import */ var _internal_scheduler_queue__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(194); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "queueScheduler", function() { return _internal_scheduler_queue__WEBPACK_IMPORTED_MODULE_10__["queue"]; }); -/* harmony import */ var _internal_operators_publishLast__WEBPACK_IMPORTED_MODULE_57__ = __webpack_require__(294); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "publishLast", function() { return _internal_operators_publishLast__WEBPACK_IMPORTED_MODULE_57__["publishLast"]; }); +/* harmony import */ var _internal_scheduler_animationFrame__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(216); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "animationFrameScheduler", function() { return _internal_scheduler_animationFrame__WEBPACK_IMPORTED_MODULE_11__["animationFrame"]; }); -/* harmony import */ var _internal_operators_publishReplay__WEBPACK_IMPORTED_MODULE_58__ = __webpack_require__(296); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "publishReplay", function() { return _internal_operators_publishReplay__WEBPACK_IMPORTED_MODULE_58__["publishReplay"]; }); +/* harmony import */ var _internal_scheduler_VirtualTimeScheduler__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(219); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "VirtualTimeScheduler", function() { return _internal_scheduler_VirtualTimeScheduler__WEBPACK_IMPORTED_MODULE_12__["VirtualTimeScheduler"]; }); -/* harmony import */ var _internal_operators_race__WEBPACK_IMPORTED_MODULE_59__ = __webpack_require__(301); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "race", function() { return _internal_operators_race__WEBPACK_IMPORTED_MODULE_59__["race"]; }); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "VirtualAction", function() { return _internal_scheduler_VirtualTimeScheduler__WEBPACK_IMPORTED_MODULE_12__["VirtualAction"]; }); -/* harmony import */ var _internal_operators_reduce__WEBPACK_IMPORTED_MODULE_60__ = __webpack_require__(275); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "reduce", function() { return _internal_operators_reduce__WEBPACK_IMPORTED_MODULE_60__["reduce"]; }); +/* harmony import */ var _internal_Scheduler__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(200); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Scheduler", function() { return _internal_Scheduler__WEBPACK_IMPORTED_MODULE_13__["Scheduler"]; }); -/* harmony import */ var _internal_operators_repeat__WEBPACK_IMPORTED_MODULE_61__ = __webpack_require__(303); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "repeat", function() { return _internal_operators_repeat__WEBPACK_IMPORTED_MODULE_61__["repeat"]; }); +/* harmony import */ var _internal_Subscription__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(177); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Subscription", function() { return _internal_Subscription__WEBPACK_IMPORTED_MODULE_14__["Subscription"]; }); -/* harmony import */ var _internal_operators_repeatWhen__WEBPACK_IMPORTED_MODULE_62__ = __webpack_require__(304); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "repeatWhen", function() { return _internal_operators_repeatWhen__WEBPACK_IMPORTED_MODULE_62__["repeatWhen"]; }); +/* harmony import */ var _internal_Subscriber__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(172); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Subscriber", function() { return _internal_Subscriber__WEBPACK_IMPORTED_MODULE_15__["Subscriber"]; }); -/* harmony import */ var _internal_operators_retry__WEBPACK_IMPORTED_MODULE_63__ = __webpack_require__(305); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "retry", function() { return _internal_operators_retry__WEBPACK_IMPORTED_MODULE_63__["retry"]; }); +/* harmony import */ var _internal_Notification__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(202); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Notification", function() { return _internal_Notification__WEBPACK_IMPORTED_MODULE_16__["Notification"]; }); -/* harmony import */ var _internal_operators_retryWhen__WEBPACK_IMPORTED_MODULE_64__ = __webpack_require__(306); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "retryWhen", function() { return _internal_operators_retryWhen__WEBPACK_IMPORTED_MODULE_64__["retryWhen"]; }); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "NotificationKind", function() { return _internal_Notification__WEBPACK_IMPORTED_MODULE_16__["NotificationKind"]; }); -/* harmony import */ var _internal_operators_refCount__WEBPACK_IMPORTED_MODULE_65__ = __webpack_require__(284); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "refCount", function() { return _internal_operators_refCount__WEBPACK_IMPORTED_MODULE_65__["refCount"]; }); +/* harmony import */ var _internal_util_pipe__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(184); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pipe", function() { return _internal_util_pipe__WEBPACK_IMPORTED_MODULE_17__["pipe"]; }); -/* harmony import */ var _internal_operators_sample__WEBPACK_IMPORTED_MODULE_66__ = __webpack_require__(307); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sample", function() { return _internal_operators_sample__WEBPACK_IMPORTED_MODULE_66__["sample"]; }); +/* harmony import */ var _internal_util_noop__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(185); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "noop", function() { return _internal_util_noop__WEBPACK_IMPORTED_MODULE_18__["noop"]; }); -/* harmony import */ var _internal_operators_sampleTime__WEBPACK_IMPORTED_MODULE_67__ = __webpack_require__(308); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sampleTime", function() { return _internal_operators_sampleTime__WEBPACK_IMPORTED_MODULE_67__["sampleTime"]; }); +/* harmony import */ var _internal_util_identity__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(220); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "identity", function() { return _internal_util_identity__WEBPACK_IMPORTED_MODULE_19__["identity"]; }); -/* harmony import */ var _internal_operators_scan__WEBPACK_IMPORTED_MODULE_68__ = __webpack_require__(276); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scan", function() { return _internal_operators_scan__WEBPACK_IMPORTED_MODULE_68__["scan"]; }); +/* harmony import */ var _internal_util_isObservable__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(221); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isObservable", function() { return _internal_util_isObservable__WEBPACK_IMPORTED_MODULE_20__["isObservable"]; }); -/* harmony import */ var _internal_operators_sequenceEqual__WEBPACK_IMPORTED_MODULE_69__ = __webpack_require__(309); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "sequenceEqual", function() { return _internal_operators_sequenceEqual__WEBPACK_IMPORTED_MODULE_69__["sequenceEqual"]; }); +/* harmony import */ var _internal_util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(222); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ArgumentOutOfRangeError", function() { return _internal_util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_21__["ArgumentOutOfRangeError"]; }); -/* harmony import */ var _internal_operators_share__WEBPACK_IMPORTED_MODULE_70__ = __webpack_require__(310); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "share", function() { return _internal_operators_share__WEBPACK_IMPORTED_MODULE_70__["share"]; }); +/* harmony import */ var _internal_util_EmptyError__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(223); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "EmptyError", function() { return _internal_util_EmptyError__WEBPACK_IMPORTED_MODULE_22__["EmptyError"]; }); -/* harmony import */ var _internal_operators_shareReplay__WEBPACK_IMPORTED_MODULE_71__ = __webpack_require__(311); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "shareReplay", function() { return _internal_operators_shareReplay__WEBPACK_IMPORTED_MODULE_71__["shareReplay"]; }); +/* harmony import */ var _internal_util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(188); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ObjectUnsubscribedError", function() { return _internal_util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_23__["ObjectUnsubscribedError"]; }); -/* harmony import */ var _internal_operators_single__WEBPACK_IMPORTED_MODULE_72__ = __webpack_require__(312); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "single", function() { return _internal_operators_single__WEBPACK_IMPORTED_MODULE_72__["single"]; }); +/* harmony import */ var _internal_util_UnsubscriptionError__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(180); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "UnsubscriptionError", function() { return _internal_util_UnsubscriptionError__WEBPACK_IMPORTED_MODULE_24__["UnsubscriptionError"]; }); -/* harmony import */ var _internal_operators_skip__WEBPACK_IMPORTED_MODULE_73__ = __webpack_require__(313); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "skip", function() { return _internal_operators_skip__WEBPACK_IMPORTED_MODULE_73__["skip"]; }); +/* harmony import */ var _internal_util_TimeoutError__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(224); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TimeoutError", function() { return _internal_util_TimeoutError__WEBPACK_IMPORTED_MODULE_25__["TimeoutError"]; }); -/* harmony import */ var _internal_operators_skipLast__WEBPACK_IMPORTED_MODULE_74__ = __webpack_require__(314); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "skipLast", function() { return _internal_operators_skipLast__WEBPACK_IMPORTED_MODULE_74__["skipLast"]; }); +/* harmony import */ var _internal_observable_bindCallback__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(225); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bindCallback", function() { return _internal_observable_bindCallback__WEBPACK_IMPORTED_MODULE_26__["bindCallback"]; }); -/* harmony import */ var _internal_operators_skipUntil__WEBPACK_IMPORTED_MODULE_75__ = __webpack_require__(315); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "skipUntil", function() { return _internal_operators_skipUntil__WEBPACK_IMPORTED_MODULE_75__["skipUntil"]; }); +/* harmony import */ var _internal_observable_bindNodeCallback__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(227); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bindNodeCallback", function() { return _internal_observable_bindNodeCallback__WEBPACK_IMPORTED_MODULE_27__["bindNodeCallback"]; }); -/* harmony import */ var _internal_operators_skipWhile__WEBPACK_IMPORTED_MODULE_76__ = __webpack_require__(316); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "skipWhile", function() { return _internal_operators_skipWhile__WEBPACK_IMPORTED_MODULE_76__["skipWhile"]; }); +/* harmony import */ var _internal_observable_combineLatest__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(228); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "combineLatest", function() { return _internal_observable_combineLatest__WEBPACK_IMPORTED_MODULE_28__["combineLatest"]; }); -/* harmony import */ var _internal_operators_startWith__WEBPACK_IMPORTED_MODULE_77__ = __webpack_require__(317); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "startWith", function() { return _internal_operators_startWith__WEBPACK_IMPORTED_MODULE_77__["startWith"]; }); +/* harmony import */ var _internal_observable_concat__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(239); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concat", function() { return _internal_observable_concat__WEBPACK_IMPORTED_MODULE_29__["concat"]; }); -/* harmony import */ var _internal_operators_subscribeOn__WEBPACK_IMPORTED_MODULE_78__ = __webpack_require__(318); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "subscribeOn", function() { return _internal_operators_subscribeOn__WEBPACK_IMPORTED_MODULE_78__["subscribeOn"]; }); +/* harmony import */ var _internal_observable_defer__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(250); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "defer", function() { return _internal_observable_defer__WEBPACK_IMPORTED_MODULE_30__["defer"]; }); -/* harmony import */ var _internal_operators_switchAll__WEBPACK_IMPORTED_MODULE_79__ = __webpack_require__(324); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "switchAll", function() { return _internal_operators_switchAll__WEBPACK_IMPORTED_MODULE_79__["switchAll"]; }); +/* harmony import */ var _internal_observable_empty__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(203); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "empty", function() { return _internal_observable_empty__WEBPACK_IMPORTED_MODULE_31__["empty"]; }); -/* harmony import */ var _internal_operators_switchMap__WEBPACK_IMPORTED_MODULE_80__ = __webpack_require__(325); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "switchMap", function() { return _internal_operators_switchMap__WEBPACK_IMPORTED_MODULE_80__["switchMap"]; }); +/* harmony import */ var _internal_observable_forkJoin__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(251); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "forkJoin", function() { return _internal_observable_forkJoin__WEBPACK_IMPORTED_MODULE_32__["forkJoin"]; }); -/* harmony import */ var _internal_operators_switchMapTo__WEBPACK_IMPORTED_MODULE_81__ = __webpack_require__(326); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "switchMapTo", function() { return _internal_operators_switchMapTo__WEBPACK_IMPORTED_MODULE_81__["switchMapTo"]; }); +/* harmony import */ var _internal_observable_from__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(243); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "from", function() { return _internal_observable_from__WEBPACK_IMPORTED_MODULE_33__["from"]; }); -/* harmony import */ var _internal_operators_take__WEBPACK_IMPORTED_MODULE_82__ = __webpack_require__(254); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "take", function() { return _internal_operators_take__WEBPACK_IMPORTED_MODULE_82__["take"]; }); +/* harmony import */ var _internal_observable_fromEvent__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(252); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fromEvent", function() { return _internal_observable_fromEvent__WEBPACK_IMPORTED_MODULE_34__["fromEvent"]; }); -/* harmony import */ var _internal_operators_takeLast__WEBPACK_IMPORTED_MODULE_83__ = __webpack_require__(271); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "takeLast", function() { return _internal_operators_takeLast__WEBPACK_IMPORTED_MODULE_83__["takeLast"]; }); +/* harmony import */ var _internal_observable_fromEventPattern__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(253); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fromEventPattern", function() { return _internal_observable_fromEventPattern__WEBPACK_IMPORTED_MODULE_35__["fromEventPattern"]; }); -/* harmony import */ var _internal_operators_takeUntil__WEBPACK_IMPORTED_MODULE_84__ = __webpack_require__(327); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "takeUntil", function() { return _internal_operators_takeUntil__WEBPACK_IMPORTED_MODULE_84__["takeUntil"]; }); +/* harmony import */ var _internal_observable_generate__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(254); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "generate", function() { return _internal_observable_generate__WEBPACK_IMPORTED_MODULE_36__["generate"]; }); -/* harmony import */ var _internal_operators_takeWhile__WEBPACK_IMPORTED_MODULE_85__ = __webpack_require__(328); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "takeWhile", function() { return _internal_operators_takeWhile__WEBPACK_IMPORTED_MODULE_85__["takeWhile"]; }); +/* harmony import */ var _internal_observable_iif__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(255); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "iif", function() { return _internal_observable_iif__WEBPACK_IMPORTED_MODULE_37__["iif"]; }); -/* harmony import */ var _internal_operators_tap__WEBPACK_IMPORTED_MODULE_86__ = __webpack_require__(329); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "tap", function() { return _internal_operators_tap__WEBPACK_IMPORTED_MODULE_86__["tap"]; }); +/* harmony import */ var _internal_observable_interval__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(256); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interval", function() { return _internal_observable_interval__WEBPACK_IMPORTED_MODULE_38__["interval"]; }); -/* harmony import */ var _internal_operators_throttle__WEBPACK_IMPORTED_MODULE_87__ = __webpack_require__(330); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "throttle", function() { return _internal_operators_throttle__WEBPACK_IMPORTED_MODULE_87__["throttle"]; }); +/* harmony import */ var _internal_observable_merge__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(258); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "merge", function() { return _internal_observable_merge__WEBPACK_IMPORTED_MODULE_39__["merge"]; }); -/* harmony import */ var _internal_operators_throttleTime__WEBPACK_IMPORTED_MODULE_88__ = __webpack_require__(331); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "throttleTime", function() { return _internal_operators_throttleTime__WEBPACK_IMPORTED_MODULE_88__["throttleTime"]; }); +/* harmony import */ var _internal_observable_never__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(259); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "never", function() { return _internal_observable_never__WEBPACK_IMPORTED_MODULE_40__["never"]; }); -/* harmony import */ var _internal_operators_throwIfEmpty__WEBPACK_IMPORTED_MODULE_89__ = __webpack_require__(252); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "throwIfEmpty", function() { return _internal_operators_throwIfEmpty__WEBPACK_IMPORTED_MODULE_89__["throwIfEmpty"]; }); +/* harmony import */ var _internal_observable_of__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(204); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "of", function() { return _internal_observable_of__WEBPACK_IMPORTED_MODULE_41__["of"]; }); -/* harmony import */ var _internal_operators_timeInterval__WEBPACK_IMPORTED_MODULE_90__ = __webpack_require__(332); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeInterval", function() { return _internal_operators_timeInterval__WEBPACK_IMPORTED_MODULE_90__["timeInterval"]; }); +/* harmony import */ var _internal_observable_onErrorResumeNext__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(260); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "onErrorResumeNext", function() { return _internal_observable_onErrorResumeNext__WEBPACK_IMPORTED_MODULE_42__["onErrorResumeNext"]; }); -/* harmony import */ var _internal_operators_timeout__WEBPACK_IMPORTED_MODULE_91__ = __webpack_require__(334); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeout", function() { return _internal_operators_timeout__WEBPACK_IMPORTED_MODULE_91__["timeout"]; }); +/* harmony import */ var _internal_observable_pairs__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(261); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pairs", function() { return _internal_observable_pairs__WEBPACK_IMPORTED_MODULE_43__["pairs"]; }); -/* harmony import */ var _internal_operators_timeoutWith__WEBPACK_IMPORTED_MODULE_92__ = __webpack_require__(336); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timeoutWith", function() { return _internal_operators_timeoutWith__WEBPACK_IMPORTED_MODULE_92__["timeoutWith"]; }); +/* harmony import */ var _internal_observable_partition__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(262); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "partition", function() { return _internal_observable_partition__WEBPACK_IMPORTED_MODULE_44__["partition"]; }); -/* harmony import */ var _internal_operators_timestamp__WEBPACK_IMPORTED_MODULE_93__ = __webpack_require__(337); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timestamp", function() { return _internal_operators_timestamp__WEBPACK_IMPORTED_MODULE_93__["timestamp"]; }); +/* harmony import */ var _internal_observable_race__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(265); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "race", function() { return _internal_observable_race__WEBPACK_IMPORTED_MODULE_45__["race"]; }); -/* harmony import */ var _internal_operators_toArray__WEBPACK_IMPORTED_MODULE_94__ = __webpack_require__(338); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "toArray", function() { return _internal_operators_toArray__WEBPACK_IMPORTED_MODULE_94__["toArray"]; }); +/* harmony import */ var _internal_observable_range__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(266); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "range", function() { return _internal_observable_range__WEBPACK_IMPORTED_MODULE_46__["range"]; }); -/* harmony import */ var _internal_operators_window__WEBPACK_IMPORTED_MODULE_95__ = __webpack_require__(339); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "window", function() { return _internal_operators_window__WEBPACK_IMPORTED_MODULE_95__["window"]; }); +/* harmony import */ var _internal_observable_throwError__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(209); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "throwError", function() { return _internal_observable_throwError__WEBPACK_IMPORTED_MODULE_47__["throwError"]; }); -/* harmony import */ var _internal_operators_windowCount__WEBPACK_IMPORTED_MODULE_96__ = __webpack_require__(340); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "windowCount", function() { return _internal_operators_windowCount__WEBPACK_IMPORTED_MODULE_96__["windowCount"]; }); +/* harmony import */ var _internal_observable_timer__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(267); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timer", function() { return _internal_observable_timer__WEBPACK_IMPORTED_MODULE_48__["timer"]; }); -/* harmony import */ var _internal_operators_windowTime__WEBPACK_IMPORTED_MODULE_97__ = __webpack_require__(341); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "windowTime", function() { return _internal_operators_windowTime__WEBPACK_IMPORTED_MODULE_97__["windowTime"]; }); +/* harmony import */ var _internal_observable_using__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(268); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "using", function() { return _internal_observable_using__WEBPACK_IMPORTED_MODULE_49__["using"]; }); -/* harmony import */ var _internal_operators_windowToggle__WEBPACK_IMPORTED_MODULE_98__ = __webpack_require__(342); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "windowToggle", function() { return _internal_operators_windowToggle__WEBPACK_IMPORTED_MODULE_98__["windowToggle"]; }); +/* harmony import */ var _internal_observable_zip__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(269); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zip", function() { return _internal_observable_zip__WEBPACK_IMPORTED_MODULE_50__["zip"]; }); -/* harmony import */ var _internal_operators_windowWhen__WEBPACK_IMPORTED_MODULE_99__ = __webpack_require__(343); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "windowWhen", function() { return _internal_operators_windowWhen__WEBPACK_IMPORTED_MODULE_99__["windowWhen"]; }); +/* harmony import */ var _internal_scheduled_scheduled__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(244); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scheduled", function() { return _internal_scheduled_scheduled__WEBPACK_IMPORTED_MODULE_51__["scheduled"]; }); -/* harmony import */ var _internal_operators_withLatestFrom__WEBPACK_IMPORTED_MODULE_100__ = __webpack_require__(344); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "withLatestFrom", function() { return _internal_operators_withLatestFrom__WEBPACK_IMPORTED_MODULE_100__["withLatestFrom"]; }); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "EMPTY", function() { return _internal_observable_empty__WEBPACK_IMPORTED_MODULE_31__["EMPTY"]; }); -/* harmony import */ var _internal_operators_zip__WEBPACK_IMPORTED_MODULE_101__ = __webpack_require__(345); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zip", function() { return _internal_operators_zip__WEBPACK_IMPORTED_MODULE_101__["zip"]; }); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "NEVER", function() { return _internal_observable_never__WEBPACK_IMPORTED_MODULE_40__["NEVER"]; }); -/* harmony import */ var _internal_operators_zipAll__WEBPACK_IMPORTED_MODULE_102__ = __webpack_require__(347); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zipAll", function() { return _internal_operators_zipAll__WEBPACK_IMPORTED_MODULE_102__["zipAll"]; }); +/* harmony import */ var _internal_config__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(175); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "config", function() { return _internal_config__WEBPACK_IMPORTED_MODULE_52__["config"]; }); /** PURE_IMPORTS_START PURE_IMPORTS_END */ @@ -22305,55 +22167,6 @@ __webpack_require__.r(__webpack_exports__); - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - @@ -22384,79 +22197,128 @@ __webpack_require__.r(__webpack_exports__); "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "audit", function() { return audit; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(171); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(182); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Observable", function() { return Observable; }); +/* harmony import */ var _util_canReportError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(171); +/* harmony import */ var _util_toSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(182); +/* harmony import */ var _symbol_observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(183); +/* harmony import */ var _util_pipe__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(184); +/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(175); +/** PURE_IMPORTS_START _util_canReportError,_util_toSubscriber,_symbol_observable,_util_pipe,_config PURE_IMPORTS_END */ -function audit(durationSelector) { - return function auditOperatorFunction(source) { - return source.lift(new AuditOperator(durationSelector)); - }; -} -var AuditOperator = /*@__PURE__*/ (function () { - function AuditOperator(durationSelector) { - this.durationSelector = durationSelector; + + +var Observable = /*@__PURE__*/ (function () { + function Observable(subscribe) { + this._isScalar = false; + if (subscribe) { + this._subscribe = subscribe; + } } - AuditOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new AuditSubscriber(subscriber, this.durationSelector)); + Observable.prototype.lift = function (operator) { + var observable = new Observable(); + observable.source = this; + observable.operator = operator; + return observable; }; - return AuditOperator; -}()); -var AuditSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AuditSubscriber, _super); - function AuditSubscriber(destination, durationSelector) { - var _this = _super.call(this, destination) || this; - _this.durationSelector = durationSelector; - _this.hasValue = false; - return _this; - } - AuditSubscriber.prototype._next = function (value) { - this.value = value; - this.hasValue = true; - if (!this.throttled) { - var duration = void 0; - try { - var durationSelector = this.durationSelector; - duration = durationSelector(value); + Observable.prototype.subscribe = function (observerOrNext, error, complete) { + var operator = this.operator; + var sink = Object(_util_toSubscriber__WEBPACK_IMPORTED_MODULE_1__["toSubscriber"])(observerOrNext, error, complete); + if (operator) { + sink.add(operator.call(sink, this.source)); + } + else { + sink.add(this.source || (_config__WEBPACK_IMPORTED_MODULE_4__["config"].useDeprecatedSynchronousErrorHandling && !sink.syncErrorThrowable) ? + this._subscribe(sink) : + this._trySubscribe(sink)); + } + if (_config__WEBPACK_IMPORTED_MODULE_4__["config"].useDeprecatedSynchronousErrorHandling) { + if (sink.syncErrorThrowable) { + sink.syncErrorThrowable = false; + if (sink.syncErrorThrown) { + throw sink.syncErrorValue; + } } - catch (err) { - return this.destination.error(err); + } + return sink; + }; + Observable.prototype._trySubscribe = function (sink) { + try { + return this._subscribe(sink); + } + catch (err) { + if (_config__WEBPACK_IMPORTED_MODULE_4__["config"].useDeprecatedSynchronousErrorHandling) { + sink.syncErrorThrown = true; + sink.syncErrorValue = err; } - var innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, duration); - if (!innerSubscription || innerSubscription.closed) { - this.clearThrottle(); + if (Object(_util_canReportError__WEBPACK_IMPORTED_MODULE_0__["canReportError"])(sink)) { + sink.error(err); } else { - this.add(this.throttled = innerSubscription); + console.warn(err); } } }; - AuditSubscriber.prototype.clearThrottle = function () { - var _a = this, value = _a.value, hasValue = _a.hasValue, throttled = _a.throttled; - if (throttled) { - this.remove(throttled); - this.throttled = null; - throttled.unsubscribe(); + Observable.prototype.forEach = function (next, promiseCtor) { + var _this = this; + promiseCtor = getPromiseCtor(promiseCtor); + return new promiseCtor(function (resolve, reject) { + var subscription; + subscription = _this.subscribe(function (value) { + try { + next(value); + } + catch (err) { + reject(err); + if (subscription) { + subscription.unsubscribe(); + } + } + }, reject, resolve); + }); + }; + Observable.prototype._subscribe = function (subscriber) { + var source = this.source; + return source && source.subscribe(subscriber); + }; + Observable.prototype[_symbol_observable__WEBPACK_IMPORTED_MODULE_2__["observable"]] = function () { + return this; + }; + Observable.prototype.pipe = function () { + var operations = []; + for (var _i = 0; _i < arguments.length; _i++) { + operations[_i] = arguments[_i]; } - if (hasValue) { - this.value = null; - this.hasValue = false; - this.destination.next(value); + if (operations.length === 0) { + return this; } + return Object(_util_pipe__WEBPACK_IMPORTED_MODULE_3__["pipeFromArray"])(operations)(this); }; - AuditSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex) { - this.clearThrottle(); + Observable.prototype.toPromise = function (promiseCtor) { + var _this = this; + promiseCtor = getPromiseCtor(promiseCtor); + return new promiseCtor(function (resolve, reject) { + var value; + _this.subscribe(function (x) { return value = x; }, function (err) { return reject(err); }, function () { return resolve(value); }); + }); }; - AuditSubscriber.prototype.notifyComplete = function () { - this.clearThrottle(); + Observable.create = function (subscribe) { + return new Observable(subscribe); }; - return AuditSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=audit.js.map + return Observable; +}()); + +function getPromiseCtor(promiseCtor) { + if (!promiseCtor) { + promiseCtor = _config__WEBPACK_IMPORTED_MODULE_4__["config"].Promise || Promise; + } + if (!promiseCtor) { + throw new Error('no Promise impl found'); + } + return promiseCtor; +} +//# sourceMappingURL=Observable.js.map /***/ }), @@ -22465,30 +22327,26 @@ var AuditSubscriber = /*@__PURE__*/ (function (_super) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "OuterSubscriber", function() { return OuterSubscriber; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "canReportError", function() { return canReportError; }); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(172); +/** PURE_IMPORTS_START _Subscriber PURE_IMPORTS_END */ -var OuterSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](OuterSubscriber, _super); - function OuterSubscriber() { - return _super !== null && _super.apply(this, arguments) || this; +function canReportError(observer) { + while (observer) { + var _a = observer, closed_1 = _a.closed, destination = _a.destination, isStopped = _a.isStopped; + if (closed_1 || isStopped) { + return false; + } + else if (destination && destination instanceof _Subscriber__WEBPACK_IMPORTED_MODULE_0__["Subscriber"]) { + observer = destination; + } + else { + observer = null; + } } - OuterSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.destination.next(innerValue); - }; - OuterSubscriber.prototype.notifyError = function (error, innerSub) { - this.destination.error(error); - }; - OuterSubscriber.prototype.notifyComplete = function (innerSub) { - this.destination.complete(); - }; - return OuterSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); - -//# sourceMappingURL=OuterSubscriber.js.map + return true; +} +//# sourceMappingURL=canReportError.js.map /***/ }), @@ -23048,27 +22906,29 @@ var $$rxSubscriber = rxSubscriber; "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeToResult", function() { return subscribeToResult; }); -/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(183); -/* harmony import */ var _subscribeTo__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(184); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(193); -/** PURE_IMPORTS_START _InnerSubscriber,_subscribeTo,_Observable PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "toSubscriber", function() { return toSubscriber; }); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(172); +/* harmony import */ var _symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(181); +/* harmony import */ var _Observer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(174); +/** PURE_IMPORTS_START _Subscriber,_symbol_rxSubscriber,_Observer PURE_IMPORTS_END */ -function subscribeToResult(outerSubscriber, result, outerValue, outerIndex, destination) { - if (destination === void 0) { - destination = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_0__["InnerSubscriber"](outerSubscriber, outerValue, outerIndex); - } - if (destination.closed) { - return undefined; +function toSubscriber(nextOrObserver, error, complete) { + if (nextOrObserver) { + if (nextOrObserver instanceof _Subscriber__WEBPACK_IMPORTED_MODULE_0__["Subscriber"]) { + return nextOrObserver; + } + if (nextOrObserver[_symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_1__["rxSubscriber"]]) { + return nextOrObserver[_symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_1__["rxSubscriber"]](); + } } - if (result instanceof _Observable__WEBPACK_IMPORTED_MODULE_2__["Observable"]) { - return result.subscribe(destination); + if (!nextOrObserver && !error && !complete) { + return new _Subscriber__WEBPACK_IMPORTED_MODULE_0__["Subscriber"](_Observer__WEBPACK_IMPORTED_MODULE_2__["empty"]); } - return Object(_subscribeTo__WEBPACK_IMPORTED_MODULE_1__["subscribeTo"])(result)(destination); + return new _Subscriber__WEBPACK_IMPORTED_MODULE_0__["Subscriber"](nextOrObserver, error, complete); } -//# sourceMappingURL=subscribeToResult.js.map +//# sourceMappingURL=toSubscriber.js.map /***/ }), @@ -23077,37 +22937,10 @@ function subscribeToResult(outerSubscriber, result, outerValue, outerIndex, dest "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "InnerSubscriber", function() { return InnerSubscriber; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ - - -var InnerSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](InnerSubscriber, _super); - function InnerSubscriber(parent, outerValue, outerIndex) { - var _this = _super.call(this) || this; - _this.parent = parent; - _this.outerValue = outerValue; - _this.outerIndex = outerIndex; - _this.index = 0; - return _this; - } - InnerSubscriber.prototype._next = function (value) { - this.parent.notifyNext(this.outerValue, value, this.outerIndex, this.index++, this); - }; - InnerSubscriber.prototype._error = function (error) { - this.parent.notifyError(error, this); - this.unsubscribe(); - }; - InnerSubscriber.prototype._complete = function () { - this.parent.notifyComplete(this); - this.unsubscribe(); - }; - return InnerSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); - -//# sourceMappingURL=InnerSubscriber.js.map +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "observable", function() { return observable; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +var observable = /*@__PURE__*/ (function () { return typeof Symbol === 'function' && Symbol.observable || '@@observable'; })(); +//# sourceMappingURL=observable.js.map /***/ }), @@ -23116,47 +22949,30 @@ var InnerSubscriber = /*@__PURE__*/ (function (_super) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeTo", function() { return subscribeTo; }); -/* harmony import */ var _subscribeToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(185); -/* harmony import */ var _subscribeToPromise__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(186); -/* harmony import */ var _subscribeToIterable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(187); -/* harmony import */ var _subscribeToObservable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(189); -/* harmony import */ var _isArrayLike__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(191); -/* harmony import */ var _isPromise__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(192); -/* harmony import */ var _isObject__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(179); -/* harmony import */ var _symbol_iterator__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(188); -/* harmony import */ var _symbol_observable__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(190); -/** PURE_IMPORTS_START _subscribeToArray,_subscribeToPromise,_subscribeToIterable,_subscribeToObservable,_isArrayLike,_isPromise,_isObject,_symbol_iterator,_symbol_observable PURE_IMPORTS_END */ - - - - - - - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pipe", function() { return pipe; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pipeFromArray", function() { return pipeFromArray; }); +/* harmony import */ var _noop__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(185); +/** PURE_IMPORTS_START _noop PURE_IMPORTS_END */ -var subscribeTo = function (result) { - if (!!result && typeof result[_symbol_observable__WEBPACK_IMPORTED_MODULE_8__["observable"]] === 'function') { - return Object(_subscribeToObservable__WEBPACK_IMPORTED_MODULE_3__["subscribeToObservable"])(result); - } - else if (Object(_isArrayLike__WEBPACK_IMPORTED_MODULE_4__["isArrayLike"])(result)) { - return Object(_subscribeToArray__WEBPACK_IMPORTED_MODULE_0__["subscribeToArray"])(result); - } - else if (Object(_isPromise__WEBPACK_IMPORTED_MODULE_5__["isPromise"])(result)) { - return Object(_subscribeToPromise__WEBPACK_IMPORTED_MODULE_1__["subscribeToPromise"])(result); +function pipe() { + var fns = []; + for (var _i = 0; _i < arguments.length; _i++) { + fns[_i] = arguments[_i]; } - else if (!!result && typeof result[_symbol_iterator__WEBPACK_IMPORTED_MODULE_7__["iterator"]] === 'function') { - return Object(_subscribeToIterable__WEBPACK_IMPORTED_MODULE_2__["subscribeToIterable"])(result); + return pipeFromArray(fns); +} +function pipeFromArray(fns) { + if (!fns) { + return _noop__WEBPACK_IMPORTED_MODULE_0__["noop"]; } - else { - var value = Object(_isObject__WEBPACK_IMPORTED_MODULE_6__["isObject"])(result) ? 'an invalid object' : "'" + result + "'"; - var msg = "You provided " + value + " where a stream was expected." - + ' You can provide an Observable, Promise, Array, or Iterable.'; - throw new TypeError(msg); + if (fns.length === 1) { + return fns[0]; } -}; -//# sourceMappingURL=subscribeTo.js.map + return function piped(input) { + return fns.reduce(function (prev, fn) { return fn(prev); }, input); + }; +} +//# sourceMappingURL=pipe.js.map /***/ }), @@ -23165,17 +22981,10 @@ var subscribeTo = function (result) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeToArray", function() { return subscribeToArray; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "noop", function() { return noop; }); /** PURE_IMPORTS_START PURE_IMPORTS_END */ -var subscribeToArray = function (array) { - return function (subscriber) { - for (var i = 0, len = array.length; i < len && !subscriber.closed; i++) { - subscriber.next(array[i]); - } - subscriber.complete(); - }; -}; -//# sourceMappingURL=subscribeToArray.js.map +function noop() { } +//# sourceMappingURL=noop.js.map /***/ }), @@ -23184,2009 +22993,2195 @@ var subscribeToArray = function (array) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeToPromise", function() { return subscribeToPromise; }); -/* harmony import */ var _hostReportError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(176); -/** PURE_IMPORTS_START _hostReportError PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ConnectableObservable", function() { return ConnectableObservable; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "connectableObservableDescriptor", function() { return connectableObservableDescriptor; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(187); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(170); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(172); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(177); +/* harmony import */ var _operators_refCount__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(190); +/** PURE_IMPORTS_START tslib,_Subject,_Observable,_Subscriber,_Subscription,_operators_refCount PURE_IMPORTS_END */ -var subscribeToPromise = function (promise) { - return function (subscriber) { - promise.then(function (value) { - if (!subscriber.closed) { - subscriber.next(value); - subscriber.complete(); - } - }, function (err) { return subscriber.error(err); }) - .then(null, _hostReportError__WEBPACK_IMPORTED_MODULE_0__["hostReportError"]); - return subscriber; - }; -}; -//# sourceMappingURL=subscribeToPromise.js.map -/***/ }), -/* 187 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeToIterable", function() { return subscribeToIterable; }); -/* harmony import */ var _symbol_iterator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(188); -/** PURE_IMPORTS_START _symbol_iterator PURE_IMPORTS_END */ -var subscribeToIterable = function (iterable) { - return function (subscriber) { - var iterator = iterable[_symbol_iterator__WEBPACK_IMPORTED_MODULE_0__["iterator"]](); - do { - var item = iterator.next(); - if (item.done) { - subscriber.complete(); - break; - } - subscriber.next(item.value); - if (subscriber.closed) { - break; + +var ConnectableObservable = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ConnectableObservable, _super); + function ConnectableObservable(source, subjectFactory) { + var _this = _super.call(this) || this; + _this.source = source; + _this.subjectFactory = subjectFactory; + _this._refCount = 0; + _this._isComplete = false; + return _this; + } + ConnectableObservable.prototype._subscribe = function (subscriber) { + return this.getSubject().subscribe(subscriber); + }; + ConnectableObservable.prototype.getSubject = function () { + var subject = this._subject; + if (!subject || subject.isStopped) { + this._subject = this.subjectFactory(); + } + return this._subject; + }; + ConnectableObservable.prototype.connect = function () { + var connection = this._connection; + if (!connection) { + this._isComplete = false; + connection = this._connection = new _Subscription__WEBPACK_IMPORTED_MODULE_4__["Subscription"](); + connection.add(this.source + .subscribe(new ConnectableSubscriber(this.getSubject(), this))); + if (connection.closed) { + this._connection = null; + connection = _Subscription__WEBPACK_IMPORTED_MODULE_4__["Subscription"].EMPTY; } - } while (true); - if (typeof iterator.return === 'function') { - subscriber.add(function () { - if (iterator.return) { - iterator.return(); - } - }); } - return subscriber; + return connection; }; -}; -//# sourceMappingURL=subscribeToIterable.js.map - - -/***/ }), -/* 188 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + ConnectableObservable.prototype.refCount = function () { + return Object(_operators_refCount__WEBPACK_IMPORTED_MODULE_5__["refCount"])()(this); + }; + return ConnectableObservable; +}(_Observable__WEBPACK_IMPORTED_MODULE_2__["Observable"])); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getSymbolIterator", function() { return getSymbolIterator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "iterator", function() { return iterator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "$$iterator", function() { return $$iterator; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -function getSymbolIterator() { - if (typeof Symbol !== 'function' || !Symbol.iterator) { - return '@@iterator'; +var connectableObservableDescriptor = /*@__PURE__*/ (function () { + var connectableProto = ConnectableObservable.prototype; + return { + operator: { value: null }, + _refCount: { value: 0, writable: true }, + _subject: { value: null, writable: true }, + _connection: { value: null, writable: true }, + _subscribe: { value: connectableProto._subscribe }, + _isComplete: { value: connectableProto._isComplete, writable: true }, + getSubject: { value: connectableProto.getSubject }, + connect: { value: connectableProto.connect }, + refCount: { value: connectableProto.refCount } + }; +})(); +var ConnectableSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ConnectableSubscriber, _super); + function ConnectableSubscriber(destination, connectable) { + var _this = _super.call(this, destination) || this; + _this.connectable = connectable; + return _this; } - return Symbol.iterator; -} -var iterator = /*@__PURE__*/ getSymbolIterator(); -var $$iterator = iterator; -//# sourceMappingURL=iterator.js.map - - -/***/ }), -/* 189 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeToObservable", function() { return subscribeToObservable; }); -/* harmony import */ var _symbol_observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(190); -/** PURE_IMPORTS_START _symbol_observable PURE_IMPORTS_END */ - -var subscribeToObservable = function (obj) { - return function (subscriber) { - var obs = obj[_symbol_observable__WEBPACK_IMPORTED_MODULE_0__["observable"]](); - if (typeof obs.subscribe !== 'function') { - throw new TypeError('Provided object does not correctly implement Symbol.observable'); + ConnectableSubscriber.prototype._error = function (err) { + this._unsubscribe(); + _super.prototype._error.call(this, err); + }; + ConnectableSubscriber.prototype._complete = function () { + this.connectable._isComplete = true; + this._unsubscribe(); + _super.prototype._complete.call(this); + }; + ConnectableSubscriber.prototype._unsubscribe = function () { + var connectable = this.connectable; + if (connectable) { + this.connectable = null; + var connection = connectable._connection; + connectable._refCount = 0; + connectable._subject = null; + connectable._connection = null; + if (connection) { + connection.unsubscribe(); + } } - else { - return obs.subscribe(subscriber); + }; + return ConnectableSubscriber; +}(_Subject__WEBPACK_IMPORTED_MODULE_1__["SubjectSubscriber"])); +var RefCountOperator = /*@__PURE__*/ (function () { + function RefCountOperator(connectable) { + this.connectable = connectable; + } + RefCountOperator.prototype.call = function (subscriber, source) { + var connectable = this.connectable; + connectable._refCount++; + var refCounter = new RefCountSubscriber(subscriber, connectable); + var subscription = source.subscribe(refCounter); + if (!refCounter.closed) { + refCounter.connection = connectable.connect(); } + return subscription; }; -}; -//# sourceMappingURL=subscribeToObservable.js.map - - -/***/ }), -/* 190 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "observable", function() { return observable; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -var observable = /*@__PURE__*/ (function () { return typeof Symbol === 'function' && Symbol.observable || '@@observable'; })(); -//# sourceMappingURL=observable.js.map - - -/***/ }), -/* 191 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isArrayLike", function() { return isArrayLike; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -var isArrayLike = (function (x) { return x && typeof x.length === 'number' && typeof x !== 'function'; }); -//# sourceMappingURL=isArrayLike.js.map + return RefCountOperator; +}()); +var RefCountSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RefCountSubscriber, _super); + function RefCountSubscriber(destination, connectable) { + var _this = _super.call(this, destination) || this; + _this.connectable = connectable; + return _this; + } + RefCountSubscriber.prototype._unsubscribe = function () { + var connectable = this.connectable; + if (!connectable) { + this.connection = null; + return; + } + this.connectable = null; + var refCount = connectable._refCount; + if (refCount <= 0) { + this.connection = null; + return; + } + connectable._refCount = refCount - 1; + if (refCount > 1) { + this.connection = null; + return; + } + var connection = this.connection; + var sharedConnection = connectable._connection; + this.connection = null; + if (sharedConnection && (!connection || sharedConnection === connection)) { + sharedConnection.unsubscribe(); + } + }; + return RefCountSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_3__["Subscriber"])); +//# sourceMappingURL=ConnectableObservable.js.map /***/ }), -/* 192 */ +/* 187 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isPromise", function() { return isPromise; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -function isPromise(value) { - return !!value && typeof value.subscribe !== 'function' && typeof value.then === 'function'; -} -//# sourceMappingURL=isPromise.js.map +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SubjectSubscriber", function() { return SubjectSubscriber; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Subject", function() { return Subject; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AnonymousSubject", function() { return AnonymousSubject; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(170); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(172); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(177); +/* harmony import */ var _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(188); +/* harmony import */ var _SubjectSubscription__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(189); +/* harmony import */ var _internal_symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(181); +/** PURE_IMPORTS_START tslib,_Observable,_Subscriber,_Subscription,_util_ObjectUnsubscribedError,_SubjectSubscription,_internal_symbol_rxSubscriber PURE_IMPORTS_END */ -/***/ }), -/* 193 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Observable", function() { return Observable; }); -/* harmony import */ var _util_canReportError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(194); -/* harmony import */ var _util_toSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(195); -/* harmony import */ var _symbol_observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(190); -/* harmony import */ var _util_pipe__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(196); -/* harmony import */ var _config__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(175); -/** PURE_IMPORTS_START _util_canReportError,_util_toSubscriber,_symbol_observable,_util_pipe,_config PURE_IMPORTS_END */ +var SubjectSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SubjectSubscriber, _super); + function SubjectSubscriber(destination) { + var _this = _super.call(this, destination) || this; + _this.destination = destination; + return _this; + } + return SubjectSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_2__["Subscriber"])); -var Observable = /*@__PURE__*/ (function () { - function Observable(subscribe) { - this._isScalar = false; - if (subscribe) { - this._subscribe = subscribe; - } +var Subject = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](Subject, _super); + function Subject() { + var _this = _super.call(this) || this; + _this.observers = []; + _this.closed = false; + _this.isStopped = false; + _this.hasError = false; + _this.thrownError = null; + return _this; } - Observable.prototype.lift = function (operator) { - var observable = new Observable(); - observable.source = this; - observable.operator = operator; - return observable; + Subject.prototype[_internal_symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_6__["rxSubscriber"]] = function () { + return new SubjectSubscriber(this); }; - Observable.prototype.subscribe = function (observerOrNext, error, complete) { - var operator = this.operator; - var sink = Object(_util_toSubscriber__WEBPACK_IMPORTED_MODULE_1__["toSubscriber"])(observerOrNext, error, complete); - if (operator) { - sink.add(operator.call(sink, this.source)); - } - else { - sink.add(this.source || (_config__WEBPACK_IMPORTED_MODULE_4__["config"].useDeprecatedSynchronousErrorHandling && !sink.syncErrorThrowable) ? - this._subscribe(sink) : - this._trySubscribe(sink)); + Subject.prototype.lift = function (operator) { + var subject = new AnonymousSubject(this, this); + subject.operator = operator; + return subject; + }; + Subject.prototype.next = function (value) { + if (this.closed) { + throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__["ObjectUnsubscribedError"](); } - if (_config__WEBPACK_IMPORTED_MODULE_4__["config"].useDeprecatedSynchronousErrorHandling) { - if (sink.syncErrorThrowable) { - sink.syncErrorThrowable = false; - if (sink.syncErrorThrown) { - throw sink.syncErrorValue; - } + if (!this.isStopped) { + var observers = this.observers; + var len = observers.length; + var copy = observers.slice(); + for (var i = 0; i < len; i++) { + copy[i].next(value); } } - return sink; }; - Observable.prototype._trySubscribe = function (sink) { - try { - return this._subscribe(sink); + Subject.prototype.error = function (err) { + if (this.closed) { + throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__["ObjectUnsubscribedError"](); } - catch (err) { - if (_config__WEBPACK_IMPORTED_MODULE_4__["config"].useDeprecatedSynchronousErrorHandling) { - sink.syncErrorThrown = true; - sink.syncErrorValue = err; - } - if (Object(_util_canReportError__WEBPACK_IMPORTED_MODULE_0__["canReportError"])(sink)) { - sink.error(err); - } - else { - console.warn(err); - } + this.hasError = true; + this.thrownError = err; + this.isStopped = true; + var observers = this.observers; + var len = observers.length; + var copy = observers.slice(); + for (var i = 0; i < len; i++) { + copy[i].error(err); } + this.observers.length = 0; }; - Observable.prototype.forEach = function (next, promiseCtor) { - var _this = this; - promiseCtor = getPromiseCtor(promiseCtor); - return new promiseCtor(function (resolve, reject) { - var subscription; - subscription = _this.subscribe(function (value) { - try { - next(value); - } - catch (err) { - reject(err); - if (subscription) { - subscription.unsubscribe(); - } - } - }, reject, resolve); - }); - }; - Observable.prototype._subscribe = function (subscriber) { - var source = this.source; - return source && source.subscribe(subscriber); - }; - Observable.prototype[_symbol_observable__WEBPACK_IMPORTED_MODULE_2__["observable"]] = function () { - return this; - }; - Observable.prototype.pipe = function () { - var operations = []; - for (var _i = 0; _i < arguments.length; _i++) { - operations[_i] = arguments[_i]; + Subject.prototype.complete = function () { + if (this.closed) { + throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__["ObjectUnsubscribedError"](); } - if (operations.length === 0) { - return this; + this.isStopped = true; + var observers = this.observers; + var len = observers.length; + var copy = observers.slice(); + for (var i = 0; i < len; i++) { + copy[i].complete(); } - return Object(_util_pipe__WEBPACK_IMPORTED_MODULE_3__["pipeFromArray"])(operations)(this); + this.observers.length = 0; }; - Observable.prototype.toPromise = function (promiseCtor) { - var _this = this; - promiseCtor = getPromiseCtor(promiseCtor); - return new promiseCtor(function (resolve, reject) { - var value; - _this.subscribe(function (x) { return value = x; }, function (err) { return reject(err); }, function () { return resolve(value); }); - }); + Subject.prototype.unsubscribe = function () { + this.isStopped = true; + this.closed = true; + this.observers = null; }; - Observable.create = function (subscribe) { - return new Observable(subscribe); + Subject.prototype._trySubscribe = function (subscriber) { + if (this.closed) { + throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__["ObjectUnsubscribedError"](); + } + else { + return _super.prototype._trySubscribe.call(this, subscriber); + } }; - return Observable; -}()); - -function getPromiseCtor(promiseCtor) { - if (!promiseCtor) { - promiseCtor = _config__WEBPACK_IMPORTED_MODULE_4__["config"].Promise || Promise; - } - if (!promiseCtor) { - throw new Error('no Promise impl found'); - } - return promiseCtor; -} -//# sourceMappingURL=Observable.js.map - - -/***/ }), -/* 194 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "canReportError", function() { return canReportError; }); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(172); -/** PURE_IMPORTS_START _Subscriber PURE_IMPORTS_END */ - -function canReportError(observer) { - while (observer) { - var _a = observer, closed_1 = _a.closed, destination = _a.destination, isStopped = _a.isStopped; - if (closed_1 || isStopped) { - return false; + Subject.prototype._subscribe = function (subscriber) { + if (this.closed) { + throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__["ObjectUnsubscribedError"](); } - else if (destination && destination instanceof _Subscriber__WEBPACK_IMPORTED_MODULE_0__["Subscriber"]) { - observer = destination; + else if (this.hasError) { + subscriber.error(this.thrownError); + return _Subscription__WEBPACK_IMPORTED_MODULE_3__["Subscription"].EMPTY; + } + else if (this.isStopped) { + subscriber.complete(); + return _Subscription__WEBPACK_IMPORTED_MODULE_3__["Subscription"].EMPTY; } else { - observer = null; + this.observers.push(subscriber); + return new _SubjectSubscription__WEBPACK_IMPORTED_MODULE_5__["SubjectSubscription"](this, subscriber); } - } - return true; -} -//# sourceMappingURL=canReportError.js.map - - -/***/ }), -/* 195 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "toSubscriber", function() { return toSubscriber; }); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(172); -/* harmony import */ var _symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(181); -/* harmony import */ var _Observer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(174); -/** PURE_IMPORTS_START _Subscriber,_symbol_rxSubscriber,_Observer PURE_IMPORTS_END */ - - + }; + Subject.prototype.asObservable = function () { + var observable = new _Observable__WEBPACK_IMPORTED_MODULE_1__["Observable"](); + observable.source = this; + return observable; + }; + Subject.create = function (destination, source) { + return new AnonymousSubject(destination, source); + }; + return Subject; +}(_Observable__WEBPACK_IMPORTED_MODULE_1__["Observable"])); -function toSubscriber(nextOrObserver, error, complete) { - if (nextOrObserver) { - if (nextOrObserver instanceof _Subscriber__WEBPACK_IMPORTED_MODULE_0__["Subscriber"]) { - return nextOrObserver; +var AnonymousSubject = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AnonymousSubject, _super); + function AnonymousSubject(destination, source) { + var _this = _super.call(this) || this; + _this.destination = destination; + _this.source = source; + return _this; + } + AnonymousSubject.prototype.next = function (value) { + var destination = this.destination; + if (destination && destination.next) { + destination.next(value); } - if (nextOrObserver[_symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_1__["rxSubscriber"]]) { - return nextOrObserver[_symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_1__["rxSubscriber"]](); + }; + AnonymousSubject.prototype.error = function (err) { + var destination = this.destination; + if (destination && destination.error) { + this.destination.error(err); } - } - if (!nextOrObserver && !error && !complete) { - return new _Subscriber__WEBPACK_IMPORTED_MODULE_0__["Subscriber"](_Observer__WEBPACK_IMPORTED_MODULE_2__["empty"]); - } - return new _Subscriber__WEBPACK_IMPORTED_MODULE_0__["Subscriber"](nextOrObserver, error, complete); -} -//# sourceMappingURL=toSubscriber.js.map - - -/***/ }), -/* 196 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pipe", function() { return pipe; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pipeFromArray", function() { return pipeFromArray; }); -/* harmony import */ var _noop__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(197); -/** PURE_IMPORTS_START _noop PURE_IMPORTS_END */ - -function pipe() { - var fns = []; - for (var _i = 0; _i < arguments.length; _i++) { - fns[_i] = arguments[_i]; - } - return pipeFromArray(fns); -} -function pipeFromArray(fns) { - if (!fns) { - return _noop__WEBPACK_IMPORTED_MODULE_0__["noop"]; - } - if (fns.length === 1) { - return fns[0]; - } - return function piped(input) { - return fns.reduce(function (prev, fn) { return fn(prev); }, input); }; -} -//# sourceMappingURL=pipe.js.map - - -/***/ }), -/* 197 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + AnonymousSubject.prototype.complete = function () { + var destination = this.destination; + if (destination && destination.complete) { + this.destination.complete(); + } + }; + AnonymousSubject.prototype._subscribe = function (subscriber) { + var source = this.source; + if (source) { + return this.source.subscribe(subscriber); + } + else { + return _Subscription__WEBPACK_IMPORTED_MODULE_3__["Subscription"].EMPTY; + } + }; + return AnonymousSubject; +}(Subject)); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "noop", function() { return noop; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -function noop() { } -//# sourceMappingURL=noop.js.map +//# sourceMappingURL=Subject.js.map /***/ }), -/* 198 */ +/* 188 */ /***/ (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__(199); -/* harmony import */ var _audit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(170); -/* harmony import */ var _observable_timer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(204); -/** PURE_IMPORTS_START _scheduler_async,_audit,_observable_timer PURE_IMPORTS_END */ - - - -function auditTime(duration, scheduler) { - if (scheduler === void 0) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_0__["async"]; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ObjectUnsubscribedError", function() { return ObjectUnsubscribedError; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +var ObjectUnsubscribedErrorImpl = /*@__PURE__*/ (function () { + function ObjectUnsubscribedErrorImpl() { + Error.call(this); + this.message = 'object unsubscribed'; + this.name = 'ObjectUnsubscribedError'; + return this; } - return Object(_audit__WEBPACK_IMPORTED_MODULE_1__["audit"])(function () { return Object(_observable_timer__WEBPACK_IMPORTED_MODULE_2__["timer"])(duration, scheduler); }); -} -//# sourceMappingURL=auditTime.js.map - - -/***/ }), -/* 199 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "async", function() { return async; }); -/* harmony import */ var _AsyncAction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(200); -/* harmony import */ var _AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(202); -/** PURE_IMPORTS_START _AsyncAction,_AsyncScheduler PURE_IMPORTS_END */ - - -var async = /*@__PURE__*/ new _AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__["AsyncScheduler"](_AsyncAction__WEBPACK_IMPORTED_MODULE_0__["AsyncAction"]); -//# sourceMappingURL=async.js.map + ObjectUnsubscribedErrorImpl.prototype = /*@__PURE__*/ Object.create(Error.prototype); + return ObjectUnsubscribedErrorImpl; +})(); +var ObjectUnsubscribedError = ObjectUnsubscribedErrorImpl; +//# sourceMappingURL=ObjectUnsubscribedError.js.map /***/ }), -/* 200 */ +/* 189 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AsyncAction", function() { return AsyncAction; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SubjectSubscription", function() { return SubjectSubscription; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(201); -/** PURE_IMPORTS_START tslib,_Action PURE_IMPORTS_END */ +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(177); +/** PURE_IMPORTS_START tslib,_Subscription PURE_IMPORTS_END */ -var AsyncAction = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AsyncAction, _super); - function AsyncAction(scheduler, work) { - var _this = _super.call(this, scheduler, work) || this; - _this.scheduler = scheduler; - _this.work = work; - _this.pending = false; +var SubjectSubscription = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SubjectSubscription, _super); + function SubjectSubscription(subject, subscriber) { + var _this = _super.call(this) || this; + _this.subject = subject; + _this.subscriber = subscriber; + _this.closed = false; return _this; } - AsyncAction.prototype.schedule = function (state, delay) { - if (delay === void 0) { - delay = 0; - } - if (this.closed) { - return this; - } - this.state = state; - var id = this.id; - var scheduler = this.scheduler; - if (id != null) { - this.id = this.recycleAsyncId(scheduler, id, delay); - } - this.pending = true; - this.delay = delay; - this.id = this.id || this.requestAsyncId(scheduler, this.id, delay); - return this; - }; - AsyncAction.prototype.requestAsyncId = function (scheduler, id, delay) { - if (delay === void 0) { - delay = 0; - } - return setInterval(scheduler.flush.bind(scheduler, this), delay); - }; - AsyncAction.prototype.recycleAsyncId = function (scheduler, id, delay) { - if (delay === void 0) { - delay = 0; - } - if (delay !== null && this.delay === delay && this.pending === false) { - return id; - } - clearInterval(id); - return undefined; - }; - AsyncAction.prototype.execute = function (state, delay) { + SubjectSubscription.prototype.unsubscribe = function () { if (this.closed) { - return new Error('executing a cancelled action'); - } - this.pending = false; - var error = this._execute(state, delay); - if (error) { - return error; - } - else if (this.pending === false && this.id != null) { - this.id = this.recycleAsyncId(this.scheduler, this.id, null); - } - }; - AsyncAction.prototype._execute = function (state, delay) { - var errored = false; - var errorValue = undefined; - try { - this.work(state); - } - catch (e) { - errored = true; - errorValue = !!e && e || new Error(e); - } - if (errored) { - this.unsubscribe(); - return errorValue; + return; } - }; - AsyncAction.prototype._unsubscribe = function () { - var id = this.id; - var scheduler = this.scheduler; - var actions = scheduler.actions; - var index = actions.indexOf(this); - this.work = null; - this.state = null; - this.pending = false; - this.scheduler = null; - if (index !== -1) { - actions.splice(index, 1); + this.closed = true; + var subject = this.subject; + var observers = subject.observers; + this.subject = null; + if (!observers || observers.length === 0 || subject.isStopped || subject.closed) { + return; } - if (id != null) { - this.id = this.recycleAsyncId(scheduler, id, null); + var subscriberIndex = observers.indexOf(this.subscriber); + if (subscriberIndex !== -1) { + observers.splice(subscriberIndex, 1); } - this.delay = null; }; - return AsyncAction; -}(_Action__WEBPACK_IMPORTED_MODULE_1__["Action"])); + return SubjectSubscription; +}(_Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"])); -//# sourceMappingURL=AsyncAction.js.map +//# sourceMappingURL=SubjectSubscription.js.map /***/ }), -/* 201 */ +/* 190 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Action", function() { return Action; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "refCount", function() { return refCount; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(177); -/** PURE_IMPORTS_START tslib,_Subscription PURE_IMPORTS_END */ +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -var Action = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](Action, _super); - function Action(scheduler, work) { - return _super.call(this) || this; +function refCount() { + return function refCountOperatorFunction(source) { + return source.lift(new RefCountOperator(source)); + }; +} +var RefCountOperator = /*@__PURE__*/ (function () { + function RefCountOperator(connectable) { + this.connectable = connectable; } - Action.prototype.schedule = function (state, delay) { - if (delay === void 0) { - delay = 0; + RefCountOperator.prototype.call = function (subscriber, source) { + var connectable = this.connectable; + connectable._refCount++; + var refCounter = new RefCountSubscriber(subscriber, connectable); + var subscription = source.subscribe(refCounter); + if (!refCounter.closed) { + refCounter.connection = connectable.connect(); } - return this; + return subscription; }; - return Action; -}(_Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"])); - -//# sourceMappingURL=Action.js.map - - -/***/ }), -/* 202 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AsyncScheduler", function() { return AsyncScheduler; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Scheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(203); -/** PURE_IMPORTS_START tslib,_Scheduler PURE_IMPORTS_END */ - - -var AsyncScheduler = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AsyncScheduler, _super); - function AsyncScheduler(SchedulerAction, now) { - if (now === void 0) { - now = _Scheduler__WEBPACK_IMPORTED_MODULE_1__["Scheduler"].now; - } - var _this = _super.call(this, SchedulerAction, function () { - if (AsyncScheduler.delegate && AsyncScheduler.delegate !== _this) { - return AsyncScheduler.delegate.now(); - } - else { - return now(); - } - }) || this; - _this.actions = []; - _this.active = false; - _this.scheduled = undefined; + return RefCountOperator; +}()); +var RefCountSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RefCountSubscriber, _super); + function RefCountSubscriber(destination, connectable) { + var _this = _super.call(this, destination) || this; + _this.connectable = connectable; return _this; } - AsyncScheduler.prototype.schedule = function (work, delay, state) { - if (delay === void 0) { - delay = 0; - } - if (AsyncScheduler.delegate && AsyncScheduler.delegate !== this) { - return AsyncScheduler.delegate.schedule(work, delay, state); + RefCountSubscriber.prototype._unsubscribe = function () { + var connectable = this.connectable; + if (!connectable) { + this.connection = null; + return; } - else { - return _super.prototype.schedule.call(this, work, delay, state); + this.connectable = null; + var refCount = connectable._refCount; + if (refCount <= 0) { + this.connection = null; + return; } - }; - AsyncScheduler.prototype.flush = function (action) { - var actions = this.actions; - if (this.active) { - actions.push(action); + connectable._refCount = refCount - 1; + if (refCount > 1) { + this.connection = null; return; } - var error; - this.active = true; - do { - if (error = action.execute(action.state, action.delay)) { - break; - } - } while (action = actions.shift()); - this.active = false; - if (error) { - while (action = actions.shift()) { - action.unsubscribe(); - } - throw error; + var connection = this.connection; + var sharedConnection = connectable._connection; + this.connection = null; + if (sharedConnection && (!connection || sharedConnection === connection)) { + sharedConnection.unsubscribe(); } }; - return AsyncScheduler; -}(_Scheduler__WEBPACK_IMPORTED_MODULE_1__["Scheduler"])); - -//# sourceMappingURL=AsyncScheduler.js.map + return RefCountSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=refCount.js.map /***/ }), -/* 203 */ +/* 191 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Scheduler", function() { return Scheduler; }); -var Scheduler = /*@__PURE__*/ (function () { - function Scheduler(SchedulerAction, now) { - if (now === void 0) { - now = Scheduler.now; - } - this.SchedulerAction = SchedulerAction; - this.now = now; - } - Scheduler.prototype.schedule = function (work, delay, state) { - if (delay === void 0) { - delay = 0; - } - return new this.SchedulerAction(this, work).schedule(state, delay); - }; - Scheduler.now = function () { return Date.now(); }; - return Scheduler; -}()); - -//# sourceMappingURL=Scheduler.js.map - - -/***/ }), -/* 204 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "groupBy", function() { return groupBy; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GroupedObservable", function() { return GroupedObservable; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(177); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(170); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(187); +/** PURE_IMPORTS_START tslib,_Subscriber,_Subscription,_Observable,_Subject PURE_IMPORTS_END */ -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timer", function() { return timer; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(193); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(199); -/* harmony import */ var _util_isNumeric__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(205); -/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(206); -/** PURE_IMPORTS_START _Observable,_scheduler_async,_util_isNumeric,_util_isScheduler PURE_IMPORTS_END */ -function timer(dueTime, periodOrScheduler, scheduler) { - if (dueTime === void 0) { - dueTime = 0; - } - var period = -1; - if (Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_2__["isNumeric"])(periodOrScheduler)) { - period = Number(periodOrScheduler) < 1 && 1 || Number(periodOrScheduler); +function groupBy(keySelector, elementSelector, durationSelector, subjectSelector) { + return function (source) { + return source.lift(new GroupByOperator(keySelector, elementSelector, durationSelector, subjectSelector)); + }; +} +var GroupByOperator = /*@__PURE__*/ (function () { + function GroupByOperator(keySelector, elementSelector, durationSelector, subjectSelector) { + this.keySelector = keySelector; + this.elementSelector = elementSelector; + this.durationSelector = durationSelector; + this.subjectSelector = subjectSelector; } - else if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_3__["isScheduler"])(periodOrScheduler)) { - scheduler = periodOrScheduler; + GroupByOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new GroupBySubscriber(subscriber, this.keySelector, this.elementSelector, this.durationSelector, this.subjectSelector)); + }; + return GroupByOperator; +}()); +var GroupBySubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](GroupBySubscriber, _super); + function GroupBySubscriber(destination, keySelector, elementSelector, durationSelector, subjectSelector) { + var _this = _super.call(this, destination) || this; + _this.keySelector = keySelector; + _this.elementSelector = elementSelector; + _this.durationSelector = durationSelector; + _this.subjectSelector = subjectSelector; + _this.groups = null; + _this.attemptedToUnsubscribe = false; + _this.count = 0; + return _this; } - if (!Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_3__["isScheduler"])(scheduler)) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; + GroupBySubscriber.prototype._next = function (value) { + var key; + try { + key = this.keySelector(value); + } + catch (err) { + this.error(err); + return; + } + this._group(value, key); + }; + GroupBySubscriber.prototype._group = function (value, key) { + var groups = this.groups; + if (!groups) { + groups = this.groups = new Map(); + } + var group = groups.get(key); + var element; + if (this.elementSelector) { + try { + element = this.elementSelector(value); + } + catch (err) { + this.error(err); + } + } + else { + element = value; + } + if (!group) { + group = (this.subjectSelector ? this.subjectSelector() : new _Subject__WEBPACK_IMPORTED_MODULE_4__["Subject"]()); + groups.set(key, group); + var groupedObservable = new GroupedObservable(key, group, this); + this.destination.next(groupedObservable); + if (this.durationSelector) { + var duration = void 0; + try { + duration = this.durationSelector(new GroupedObservable(key, group)); + } + catch (err) { + this.error(err); + return; + } + this.add(duration.subscribe(new GroupDurationSubscriber(key, group, this))); + } + } + if (!group.closed) { + group.next(element); + } + }; + GroupBySubscriber.prototype._error = function (err) { + var groups = this.groups; + if (groups) { + groups.forEach(function (group, key) { + group.error(err); + }); + groups.clear(); + } + this.destination.error(err); + }; + GroupBySubscriber.prototype._complete = function () { + var groups = this.groups; + if (groups) { + groups.forEach(function (group, key) { + group.complete(); + }); + groups.clear(); + } + this.destination.complete(); + }; + GroupBySubscriber.prototype.removeGroup = function (key) { + this.groups.delete(key); + }; + GroupBySubscriber.prototype.unsubscribe = function () { + if (!this.closed) { + this.attemptedToUnsubscribe = true; + if (this.count === 0) { + _super.prototype.unsubscribe.call(this); + } + } + }; + return GroupBySubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +var GroupDurationSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](GroupDurationSubscriber, _super); + function GroupDurationSubscriber(key, group, parent) { + var _this = _super.call(this, group) || this; + _this.key = key; + _this.group = group; + _this.parent = parent; + return _this; } - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var due = Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_2__["isNumeric"])(dueTime) - ? dueTime - : (+dueTime - scheduler.now()); - return scheduler.schedule(dispatch, due, { - index: 0, period: period, subscriber: subscriber - }); - }); -} -function dispatch(state) { - var index = state.index, period = state.period, subscriber = state.subscriber; - subscriber.next(index); - if (subscriber.closed) { - return; + GroupDurationSubscriber.prototype._next = function (value) { + this.complete(); + }; + GroupDurationSubscriber.prototype._unsubscribe = function () { + var _a = this, parent = _a.parent, key = _a.key; + this.key = this.parent = null; + if (parent) { + parent.removeGroup(key); + } + }; + return GroupDurationSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +var GroupedObservable = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](GroupedObservable, _super); + function GroupedObservable(key, groupSubject, refCountSubscription) { + var _this = _super.call(this) || this; + _this.key = key; + _this.groupSubject = groupSubject; + _this.refCountSubscription = refCountSubscription; + return _this; } - else if (period === -1) { - return subscriber.complete(); + GroupedObservable.prototype._subscribe = function (subscriber) { + var subscription = new _Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"](); + var _a = this, refCountSubscription = _a.refCountSubscription, groupSubject = _a.groupSubject; + if (refCountSubscription && !refCountSubscription.closed) { + subscription.add(new InnerRefCountSubscription(refCountSubscription)); + } + subscription.add(groupSubject.subscribe(subscriber)); + return subscription; + }; + return GroupedObservable; +}(_Observable__WEBPACK_IMPORTED_MODULE_3__["Observable"])); + +var InnerRefCountSubscription = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](InnerRefCountSubscription, _super); + function InnerRefCountSubscription(parent) { + var _this = _super.call(this) || this; + _this.parent = parent; + parent.count++; + return _this; } - state.index = index + 1; - this.schedule(state, period); -} -//# sourceMappingURL=timer.js.map + InnerRefCountSubscription.prototype.unsubscribe = function () { + var parent = this.parent; + if (!parent.closed && !this.closed) { + _super.prototype.unsubscribe.call(this); + parent.count -= 1; + if (parent.count === 0 && parent.attemptedToUnsubscribe) { + parent.unsubscribe(); + } + } + }; + return InnerRefCountSubscription; +}(_Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"])); +//# sourceMappingURL=groupBy.js.map /***/ }), -/* 205 */ +/* 192 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isNumeric", function() { return isNumeric; }); -/* harmony import */ var _isArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(178); -/** PURE_IMPORTS_START _isArray PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BehaviorSubject", function() { return BehaviorSubject; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(187); +/* harmony import */ var _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(188); +/** PURE_IMPORTS_START tslib,_Subject,_util_ObjectUnsubscribedError PURE_IMPORTS_END */ -function isNumeric(val) { - return !Object(_isArray__WEBPACK_IMPORTED_MODULE_0__["isArray"])(val) && (val - parseFloat(val) + 1) >= 0; -} -//# sourceMappingURL=isNumeric.js.map -/***/ }), -/* 206 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +var BehaviorSubject = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BehaviorSubject, _super); + function BehaviorSubject(_value) { + var _this = _super.call(this) || this; + _this._value = _value; + return _this; + } + Object.defineProperty(BehaviorSubject.prototype, "value", { + get: function () { + return this.getValue(); + }, + enumerable: true, + configurable: true + }); + BehaviorSubject.prototype._subscribe = function (subscriber) { + var subscription = _super.prototype._subscribe.call(this, subscriber); + if (subscription && !subscription.closed) { + subscriber.next(this._value); + } + return subscription; + }; + BehaviorSubject.prototype.getValue = function () { + if (this.hasError) { + throw this.thrownError; + } + else if (this.closed) { + throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_2__["ObjectUnsubscribedError"](); + } + else { + return this._value; + } + }; + BehaviorSubject.prototype.next = function (value) { + _super.prototype.next.call(this, this._value = value); + }; + return BehaviorSubject; +}(_Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"])); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isScheduler", function() { return isScheduler; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -function isScheduler(value) { - return value && typeof value.schedule === 'function'; -} -//# sourceMappingURL=isScheduler.js.map +//# sourceMappingURL=BehaviorSubject.js.map /***/ }), -/* 207 */ +/* 193 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buffer", function() { return buffer; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ReplaySubject", function() { return ReplaySubject; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(171); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(182); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(187); +/* harmony import */ var _scheduler_queue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(194); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(177); +/* harmony import */ var _operators_observeOn__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(201); +/* harmony import */ var _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(188); +/* harmony import */ var _SubjectSubscription__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(189); +/** PURE_IMPORTS_START tslib,_Subject,_scheduler_queue,_Subscription,_operators_observeOn,_util_ObjectUnsubscribedError,_SubjectSubscription PURE_IMPORTS_END */ -function buffer(closingNotifier) { - return function bufferOperatorFunction(source) { - return source.lift(new BufferOperator(closingNotifier)); - }; -} -var BufferOperator = /*@__PURE__*/ (function () { - function BufferOperator(closingNotifier) { - this.closingNotifier = closingNotifier; - } - BufferOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new BufferSubscriber(subscriber, this.closingNotifier)); - }; - return BufferOperator; -}()); -var BufferSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferSubscriber, _super); - function BufferSubscriber(destination, closingNotifier) { - var _this = _super.call(this, destination) || this; - _this.buffer = []; - _this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(_this, closingNotifier)); - return _this; - } - BufferSubscriber.prototype._next = function (value) { - this.buffer.push(value); - }; - BufferSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - var buffer = this.buffer; - this.buffer = []; - this.destination.next(buffer); - }; - return BufferSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=buffer.js.map -/***/ }), -/* 208 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bufferCount", function() { return bufferCount; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function bufferCount(bufferSize, startBufferEvery) { - if (startBufferEvery === void 0) { - startBufferEvery = null; - } - return function bufferCountOperatorFunction(source) { - return source.lift(new BufferCountOperator(bufferSize, startBufferEvery)); - }; -} -var BufferCountOperator = /*@__PURE__*/ (function () { - function BufferCountOperator(bufferSize, startBufferEvery) { - this.bufferSize = bufferSize; - this.startBufferEvery = startBufferEvery; - if (!startBufferEvery || bufferSize === startBufferEvery) { - this.subscriberClass = BufferCountSubscriber; +var ReplaySubject = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ReplaySubject, _super); + function ReplaySubject(bufferSize, windowTime, scheduler) { + if (bufferSize === void 0) { + bufferSize = Number.POSITIVE_INFINITY; + } + if (windowTime === void 0) { + windowTime = Number.POSITIVE_INFINITY; + } + var _this = _super.call(this) || this; + _this.scheduler = scheduler; + _this._events = []; + _this._infiniteTimeWindow = false; + _this._bufferSize = bufferSize < 1 ? 1 : bufferSize; + _this._windowTime = windowTime < 1 ? 1 : windowTime; + if (windowTime === Number.POSITIVE_INFINITY) { + _this._infiniteTimeWindow = true; + _this.next = _this.nextInfiniteTimeWindow; } else { - this.subscriberClass = BufferSkipCountSubscriber; + _this.next = _this.nextTimeWindow; } - } - BufferCountOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new this.subscriberClass(subscriber, this.bufferSize, this.startBufferEvery)); - }; - return BufferCountOperator; -}()); -var BufferCountSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferCountSubscriber, _super); - function BufferCountSubscriber(destination, bufferSize) { - var _this = _super.call(this, destination) || this; - _this.bufferSize = bufferSize; - _this.buffer = []; return _this; } - BufferCountSubscriber.prototype._next = function (value) { - var buffer = this.buffer; - buffer.push(value); - if (buffer.length == this.bufferSize) { - this.destination.next(buffer); - this.buffer = []; + ReplaySubject.prototype.nextInfiniteTimeWindow = function (value) { + var _events = this._events; + _events.push(value); + if (_events.length > this._bufferSize) { + _events.shift(); } + _super.prototype.next.call(this, value); }; - BufferCountSubscriber.prototype._complete = function () { - var buffer = this.buffer; - if (buffer.length > 0) { - this.destination.next(buffer); - } - _super.prototype._complete.call(this); + ReplaySubject.prototype.nextTimeWindow = function (value) { + this._events.push(new ReplayEvent(this._getNow(), value)); + this._trimBufferThenGetEvents(); + _super.prototype.next.call(this, value); }; - return BufferCountSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -var BufferSkipCountSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferSkipCountSubscriber, _super); - function BufferSkipCountSubscriber(destination, bufferSize, startBufferEvery) { - var _this = _super.call(this, destination) || this; - _this.bufferSize = bufferSize; - _this.startBufferEvery = startBufferEvery; - _this.buffers = []; - _this.count = 0; - return _this; - } - BufferSkipCountSubscriber.prototype._next = function (value) { - var _a = this, bufferSize = _a.bufferSize, startBufferEvery = _a.startBufferEvery, buffers = _a.buffers, count = _a.count; - this.count++; - if (count % startBufferEvery === 0) { - buffers.push([]); + ReplaySubject.prototype._subscribe = function (subscriber) { + var _infiniteTimeWindow = this._infiniteTimeWindow; + var _events = _infiniteTimeWindow ? this._events : this._trimBufferThenGetEvents(); + var scheduler = this.scheduler; + var len = _events.length; + var subscription; + if (this.closed) { + throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_5__["ObjectUnsubscribedError"](); } - for (var i = buffers.length; i--;) { - var buffer = buffers[i]; - buffer.push(value); - if (buffer.length === bufferSize) { - buffers.splice(i, 1); - this.destination.next(buffer); + else if (this.isStopped || this.hasError) { + subscription = _Subscription__WEBPACK_IMPORTED_MODULE_3__["Subscription"].EMPTY; + } + else { + this.observers.push(subscriber); + subscription = new _SubjectSubscription__WEBPACK_IMPORTED_MODULE_6__["SubjectSubscription"](this, subscriber); + } + if (scheduler) { + subscriber.add(subscriber = new _operators_observeOn__WEBPACK_IMPORTED_MODULE_4__["ObserveOnSubscriber"](subscriber, scheduler)); + } + if (_infiniteTimeWindow) { + for (var i = 0; i < len && !subscriber.closed; i++) { + subscriber.next(_events[i]); + } + } + else { + for (var i = 0; i < len && !subscriber.closed; i++) { + subscriber.next(_events[i].value); } } + if (this.hasError) { + subscriber.error(this.thrownError); + } + else if (this.isStopped) { + subscriber.complete(); + } + return subscription; }; - BufferSkipCountSubscriber.prototype._complete = function () { - var _a = this, buffers = _a.buffers, destination = _a.destination; - while (buffers.length > 0) { - var buffer = buffers.shift(); - if (buffer.length > 0) { - destination.next(buffer); + ReplaySubject.prototype._getNow = function () { + return (this.scheduler || _scheduler_queue__WEBPACK_IMPORTED_MODULE_2__["queue"]).now(); + }; + ReplaySubject.prototype._trimBufferThenGetEvents = function () { + var now = this._getNow(); + var _bufferSize = this._bufferSize; + var _windowTime = this._windowTime; + var _events = this._events; + var eventsCount = _events.length; + var spliceCount = 0; + while (spliceCount < eventsCount) { + if ((now - _events[spliceCount].time) < _windowTime) { + break; } + spliceCount++; } - _super.prototype._complete.call(this); + if (eventsCount > _bufferSize) { + spliceCount = Math.max(spliceCount, eventsCount - _bufferSize); + } + if (spliceCount > 0) { + _events.splice(0, spliceCount); + } + return _events; }; - return BufferSkipCountSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=bufferCount.js.map + return ReplaySubject; +}(_Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"])); + +var ReplayEvent = /*@__PURE__*/ (function () { + function ReplayEvent(time, value) { + this.time = time; + this.value = value; + } + return ReplayEvent; +}()); +//# sourceMappingURL=ReplaySubject.js.map /***/ }), -/* 209 */ +/* 194 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bufferTime", function() { return bufferTime; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(199); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(172); -/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(206); -/** PURE_IMPORTS_START tslib,_scheduler_async,_Subscriber,_util_isScheduler PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "queue", function() { return queue; }); +/* harmony import */ var _QueueAction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(195); +/* harmony import */ var _QueueScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(198); +/** PURE_IMPORTS_START _QueueAction,_QueueScheduler PURE_IMPORTS_END */ +var queue = /*@__PURE__*/ new _QueueScheduler__WEBPACK_IMPORTED_MODULE_1__["QueueScheduler"](_QueueAction__WEBPACK_IMPORTED_MODULE_0__["QueueAction"]); +//# sourceMappingURL=queue.js.map -function bufferTime(bufferTimeSpan) { - var length = arguments.length; - var scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; - if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_3__["isScheduler"])(arguments[arguments.length - 1])) { - scheduler = arguments[arguments.length - 1]; - length--; - } - var bufferCreationInterval = null; - if (length >= 2) { - bufferCreationInterval = arguments[1]; +/***/ }), +/* 195 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QueueAction", function() { return QueueAction; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); +/* harmony import */ var _AsyncAction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(196); +/** PURE_IMPORTS_START tslib,_AsyncAction PURE_IMPORTS_END */ + + +var QueueAction = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](QueueAction, _super); + function QueueAction(scheduler, work) { + var _this = _super.call(this, scheduler, work) || this; + _this.scheduler = scheduler; + _this.work = work; + return _this; } - var maxBufferSize = Number.POSITIVE_INFINITY; - if (length >= 3) { - maxBufferSize = arguments[2]; - } - return function bufferTimeOperatorFunction(source) { - return source.lift(new BufferTimeOperator(bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler)); - }; -} -var BufferTimeOperator = /*@__PURE__*/ (function () { - function BufferTimeOperator(bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler) { - this.bufferTimeSpan = bufferTimeSpan; - this.bufferCreationInterval = bufferCreationInterval; - this.maxBufferSize = maxBufferSize; - this.scheduler = scheduler; - } - BufferTimeOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new BufferTimeSubscriber(subscriber, this.bufferTimeSpan, this.bufferCreationInterval, this.maxBufferSize, this.scheduler)); - }; - return BufferTimeOperator; -}()); -var Context = /*@__PURE__*/ (function () { - function Context() { - this.buffer = []; - } - return Context; -}()); -var BufferTimeSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferTimeSubscriber, _super); - function BufferTimeSubscriber(destination, bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler) { - var _this = _super.call(this, destination) || this; - _this.bufferTimeSpan = bufferTimeSpan; - _this.bufferCreationInterval = bufferCreationInterval; - _this.maxBufferSize = maxBufferSize; - _this.scheduler = scheduler; - _this.contexts = []; - var context = _this.openContext(); - _this.timespanOnly = bufferCreationInterval == null || bufferCreationInterval < 0; - if (_this.timespanOnly) { - var timeSpanOnlyState = { subscriber: _this, context: context, bufferTimeSpan: bufferTimeSpan }; - _this.add(context.closeAction = scheduler.schedule(dispatchBufferTimeSpanOnly, bufferTimeSpan, timeSpanOnlyState)); - } - else { - var closeState = { subscriber: _this, context: context }; - var creationState = { bufferTimeSpan: bufferTimeSpan, bufferCreationInterval: bufferCreationInterval, subscriber: _this, scheduler: scheduler }; - _this.add(context.closeAction = scheduler.schedule(dispatchBufferClose, bufferTimeSpan, closeState)); - _this.add(scheduler.schedule(dispatchBufferCreation, bufferCreationInterval, creationState)); - } - return _this; - } - BufferTimeSubscriber.prototype._next = function (value) { - var contexts = this.contexts; - var len = contexts.length; - var filledBufferContext; - for (var i = 0; i < len; i++) { - var context_1 = contexts[i]; - var buffer = context_1.buffer; - buffer.push(value); - if (buffer.length == this.maxBufferSize) { - filledBufferContext = context_1; - } - } - if (filledBufferContext) { - this.onBufferFull(filledBufferContext); + QueueAction.prototype.schedule = function (state, delay) { + if (delay === void 0) { + delay = 0; } - }; - BufferTimeSubscriber.prototype._error = function (err) { - this.contexts.length = 0; - _super.prototype._error.call(this, err); - }; - BufferTimeSubscriber.prototype._complete = function () { - var _a = this, contexts = _a.contexts, destination = _a.destination; - while (contexts.length > 0) { - var context_2 = contexts.shift(); - destination.next(context_2.buffer); + if (delay > 0) { + return _super.prototype.schedule.call(this, state, delay); } - _super.prototype._complete.call(this); + this.delay = delay; + this.state = state; + this.scheduler.flush(this); + return this; }; - BufferTimeSubscriber.prototype._unsubscribe = function () { - this.contexts = null; + QueueAction.prototype.execute = function (state, delay) { + return (delay > 0 || this.closed) ? + _super.prototype.execute.call(this, state, delay) : + this._execute(state, delay); }; - BufferTimeSubscriber.prototype.onBufferFull = function (context) { - this.closeContext(context); - var closeAction = context.closeAction; - closeAction.unsubscribe(); - this.remove(closeAction); - if (!this.closed && this.timespanOnly) { - context = this.openContext(); - var bufferTimeSpan = this.bufferTimeSpan; - var timeSpanOnlyState = { subscriber: this, context: context, bufferTimeSpan: bufferTimeSpan }; - this.add(context.closeAction = this.scheduler.schedule(dispatchBufferTimeSpanOnly, bufferTimeSpan, timeSpanOnlyState)); + QueueAction.prototype.requestAsyncId = function (scheduler, id, delay) { + if (delay === void 0) { + delay = 0; } - }; - BufferTimeSubscriber.prototype.openContext = function () { - var context = new Context(); - this.contexts.push(context); - return context; - }; - BufferTimeSubscriber.prototype.closeContext = function (context) { - this.destination.next(context.buffer); - var contexts = this.contexts; - var spliceIndex = contexts ? contexts.indexOf(context) : -1; - if (spliceIndex >= 0) { - contexts.splice(contexts.indexOf(context), 1); + if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) { + return _super.prototype.requestAsyncId.call(this, scheduler, id, delay); } + return scheduler.flush(this); }; - return BufferTimeSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_2__["Subscriber"])); -function dispatchBufferTimeSpanOnly(state) { - var subscriber = state.subscriber; - var prevContext = state.context; - if (prevContext) { - subscriber.closeContext(prevContext); - } - if (!subscriber.closed) { - state.context = subscriber.openContext(); - state.context.closeAction = this.schedule(state, state.bufferTimeSpan); - } -} -function dispatchBufferCreation(state) { - var bufferCreationInterval = state.bufferCreationInterval, bufferTimeSpan = state.bufferTimeSpan, subscriber = state.subscriber, scheduler = state.scheduler; - var context = subscriber.openContext(); - var action = this; - if (!subscriber.closed) { - subscriber.add(context.closeAction = scheduler.schedule(dispatchBufferClose, bufferTimeSpan, { subscriber: subscriber, context: context })); - action.schedule(state, bufferCreationInterval); - } -} -function dispatchBufferClose(arg) { - var subscriber = arg.subscriber, context = arg.context; - subscriber.closeContext(context); -} -//# sourceMappingURL=bufferTime.js.map + return QueueAction; +}(_AsyncAction__WEBPACK_IMPORTED_MODULE_1__["AsyncAction"])); + +//# sourceMappingURL=QueueAction.js.map /***/ }), -/* 210 */ +/* 196 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bufferToggle", function() { return bufferToggle; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AsyncAction", function() { return AsyncAction; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(177); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(182); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(171); -/** PURE_IMPORTS_START tslib,_Subscription,_util_subscribeToResult,_OuterSubscriber PURE_IMPORTS_END */ - - +/* harmony import */ var _Action__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(197); +/** PURE_IMPORTS_START tslib,_Action PURE_IMPORTS_END */ -function bufferToggle(openings, closingSelector) { - return function bufferToggleOperatorFunction(source) { - return source.lift(new BufferToggleOperator(openings, closingSelector)); - }; -} -var BufferToggleOperator = /*@__PURE__*/ (function () { - function BufferToggleOperator(openings, closingSelector) { - this.openings = openings; - this.closingSelector = closingSelector; - } - BufferToggleOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new BufferToggleSubscriber(subscriber, this.openings, this.closingSelector)); - }; - return BufferToggleOperator; -}()); -var BufferToggleSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferToggleSubscriber, _super); - function BufferToggleSubscriber(destination, openings, closingSelector) { - var _this = _super.call(this, destination) || this; - _this.openings = openings; - _this.closingSelector = closingSelector; - _this.contexts = []; - _this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(_this, openings)); +var AsyncAction = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AsyncAction, _super); + function AsyncAction(scheduler, work) { + var _this = _super.call(this, scheduler, work) || this; + _this.scheduler = scheduler; + _this.work = work; + _this.pending = false; return _this; } - BufferToggleSubscriber.prototype._next = function (value) { - var contexts = this.contexts; - var len = contexts.length; - for (var i = 0; i < len; i++) { - contexts[i].buffer.push(value); + AsyncAction.prototype.schedule = function (state, delay) { + if (delay === void 0) { + delay = 0; } - }; - BufferToggleSubscriber.prototype._error = function (err) { - var contexts = this.contexts; - while (contexts.length > 0) { - var context_1 = contexts.shift(); - context_1.subscription.unsubscribe(); - context_1.buffer = null; - context_1.subscription = null; + if (this.closed) { + return this; } - this.contexts = null; - _super.prototype._error.call(this, err); + this.state = state; + var id = this.id; + var scheduler = this.scheduler; + if (id != null) { + this.id = this.recycleAsyncId(scheduler, id, delay); + } + this.pending = true; + this.delay = delay; + this.id = this.id || this.requestAsyncId(scheduler, this.id, delay); + return this; }; - BufferToggleSubscriber.prototype._complete = function () { - var contexts = this.contexts; - while (contexts.length > 0) { - var context_2 = contexts.shift(); - this.destination.next(context_2.buffer); - context_2.subscription.unsubscribe(); - context_2.buffer = null; - context_2.subscription = null; + AsyncAction.prototype.requestAsyncId = function (scheduler, id, delay) { + if (delay === void 0) { + delay = 0; } - this.contexts = null; - _super.prototype._complete.call(this); + return setInterval(scheduler.flush.bind(scheduler, this), delay); }; - BufferToggleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - outerValue ? this.closeBuffer(outerValue) : this.openBuffer(innerValue); + AsyncAction.prototype.recycleAsyncId = function (scheduler, id, delay) { + if (delay === void 0) { + delay = 0; + } + if (delay !== null && this.delay === delay && this.pending === false) { + return id; + } + clearInterval(id); + return undefined; }; - BufferToggleSubscriber.prototype.notifyComplete = function (innerSub) { - this.closeBuffer(innerSub.context); + AsyncAction.prototype.execute = function (state, delay) { + if (this.closed) { + return new Error('executing a cancelled action'); + } + this.pending = false; + var error = this._execute(state, delay); + if (error) { + return error; + } + else if (this.pending === false && this.id != null) { + this.id = this.recycleAsyncId(this.scheduler, this.id, null); + } }; - BufferToggleSubscriber.prototype.openBuffer = function (value) { + AsyncAction.prototype._execute = function (state, delay) { + var errored = false; + var errorValue = undefined; try { - var closingSelector = this.closingSelector; - var closingNotifier = closingSelector.call(this, value); - if (closingNotifier) { - this.trySubscribe(closingNotifier); - } + this.work(state); } - catch (err) { - this._error(err); + catch (e) { + errored = true; + errorValue = !!e && e || new Error(e); } - }; - BufferToggleSubscriber.prototype.closeBuffer = function (context) { - var contexts = this.contexts; - if (contexts && context) { - var buffer = context.buffer, subscription = context.subscription; - this.destination.next(buffer); - contexts.splice(contexts.indexOf(context), 1); - this.remove(subscription); - subscription.unsubscribe(); + if (errored) { + this.unsubscribe(); + return errorValue; } }; - BufferToggleSubscriber.prototype.trySubscribe = function (closingNotifier) { - var contexts = this.contexts; - var buffer = []; - var subscription = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); - var context = { buffer: buffer, subscription: subscription }; - contexts.push(context); - var innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, closingNotifier, context); - if (!innerSubscription || innerSubscription.closed) { - this.closeBuffer(context); + AsyncAction.prototype._unsubscribe = function () { + var id = this.id; + var scheduler = this.scheduler; + var actions = scheduler.actions; + var index = actions.indexOf(this); + this.work = null; + this.state = null; + this.pending = false; + this.scheduler = null; + if (index !== -1) { + actions.splice(index, 1); } - else { - innerSubscription.context = context; - this.add(innerSubscription); - subscription.add(innerSubscription); + if (id != null) { + this.id = this.recycleAsyncId(scheduler, id, null); } + this.delay = null; }; - return BufferToggleSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); -//# sourceMappingURL=bufferToggle.js.map + return AsyncAction; +}(_Action__WEBPACK_IMPORTED_MODULE_1__["Action"])); + +//# sourceMappingURL=AsyncAction.js.map /***/ }), -/* 211 */ +/* 197 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bufferWhen", function() { return bufferWhen; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Action", function() { return Action; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); /* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(177); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(171); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(182); -/** PURE_IMPORTS_START tslib,_Subscription,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - - +/** PURE_IMPORTS_START tslib,_Subscription PURE_IMPORTS_END */ -function bufferWhen(closingSelector) { - return function (source) { - return source.lift(new BufferWhenOperator(closingSelector)); - }; -} -var BufferWhenOperator = /*@__PURE__*/ (function () { - function BufferWhenOperator(closingSelector) { - this.closingSelector = closingSelector; - } - BufferWhenOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new BufferWhenSubscriber(subscriber, this.closingSelector)); - }; - return BufferWhenOperator; -}()); -var BufferWhenSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferWhenSubscriber, _super); - function BufferWhenSubscriber(destination, closingSelector) { - var _this = _super.call(this, destination) || this; - _this.closingSelector = closingSelector; - _this.subscribing = false; - _this.openBuffer(); - return _this; +var Action = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](Action, _super); + function Action(scheduler, work) { + return _super.call(this) || this; } - BufferWhenSubscriber.prototype._next = function (value) { - this.buffer.push(value); - }; - BufferWhenSubscriber.prototype._complete = function () { - var buffer = this.buffer; - if (buffer) { - this.destination.next(buffer); - } - _super.prototype._complete.call(this); - }; - BufferWhenSubscriber.prototype._unsubscribe = function () { - this.buffer = null; - this.subscribing = false; - }; - BufferWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.openBuffer(); - }; - BufferWhenSubscriber.prototype.notifyComplete = function () { - if (this.subscribing) { - this.complete(); - } - else { - this.openBuffer(); - } - }; - BufferWhenSubscriber.prototype.openBuffer = function () { - var closingSubscription = this.closingSubscription; - if (closingSubscription) { - this.remove(closingSubscription); - closingSubscription.unsubscribe(); - } - var buffer = this.buffer; - if (this.buffer) { - this.destination.next(buffer); - } - this.buffer = []; - var closingNotifier; - try { - var closingSelector = this.closingSelector; - closingNotifier = closingSelector(); - } - catch (err) { - return this.error(err); + Action.prototype.schedule = function (state, delay) { + if (delay === void 0) { + delay = 0; } - closingSubscription = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); - this.closingSubscription = closingSubscription; - this.add(closingSubscription); - this.subscribing = true; - closingSubscription.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, closingNotifier)); - this.subscribing = false; + return this; }; - return BufferWhenSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); -//# sourceMappingURL=bufferWhen.js.map + return Action; +}(_Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"])); + +//# sourceMappingURL=Action.js.map /***/ }), -/* 212 */ +/* 198 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "catchError", function() { return catchError; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QueueScheduler", function() { return QueueScheduler; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(171); -/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(183); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(182); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - - +/* harmony import */ var _AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(199); +/** PURE_IMPORTS_START tslib,_AsyncScheduler PURE_IMPORTS_END */ -function catchError(selector) { - return function catchErrorOperatorFunction(source) { - var operator = new CatchOperator(selector); - var caught = source.lift(operator); - return (operator.caught = caught); - }; -} -var CatchOperator = /*@__PURE__*/ (function () { - function CatchOperator(selector) { - this.selector = selector; - } - CatchOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new CatchSubscriber(subscriber, this.selector, this.caught)); - }; - return CatchOperator; -}()); -var CatchSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](CatchSubscriber, _super); - function CatchSubscriber(destination, selector, caught) { - var _this = _super.call(this, destination) || this; - _this.selector = selector; - _this.caught = caught; - return _this; +var QueueScheduler = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](QueueScheduler, _super); + function QueueScheduler() { + return _super !== null && _super.apply(this, arguments) || this; } - CatchSubscriber.prototype.error = function (err) { - if (!this.isStopped) { - var result = void 0; - try { - result = this.selector(err, this.caught); - } - catch (err2) { - _super.prototype.error.call(this, err2); - return; - } - this._unsubscribeAndRecycle(); - var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__["InnerSubscriber"](this, undefined, undefined); - this.add(innerSubscriber); - Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, result, undefined, undefined, innerSubscriber); - } - }; - return CatchSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=catchError.js.map - - -/***/ }), -/* 213 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "combineAll", function() { return combineAll; }); -/* harmony import */ var _observable_combineLatest__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(214); -/** PURE_IMPORTS_START _observable_combineLatest PURE_IMPORTS_END */ + return QueueScheduler; +}(_AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__["AsyncScheduler"])); -function combineAll(project) { - return function (source) { return source.lift(new _observable_combineLatest__WEBPACK_IMPORTED_MODULE_0__["CombineLatestOperator"](project)); }; -} -//# sourceMappingURL=combineAll.js.map +//# sourceMappingURL=QueueScheduler.js.map /***/ }), -/* 214 */ +/* 199 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "combineLatest", function() { return combineLatest; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CombineLatestOperator", function() { return CombineLatestOperator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CombineLatestSubscriber", function() { return CombineLatestSubscriber; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AsyncScheduler", function() { return AsyncScheduler; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(206); -/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(178); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(171); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(182); -/* harmony import */ var _fromArray__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(215); -/** PURE_IMPORTS_START tslib,_util_isScheduler,_util_isArray,_OuterSubscriber,_util_subscribeToResult,_fromArray PURE_IMPORTS_END */ - - - - +/* harmony import */ var _Scheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(200); +/** PURE_IMPORTS_START tslib,_Scheduler PURE_IMPORTS_END */ -var NONE = {}; -function combineLatest() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i] = arguments[_i]; - } - var resultSelector = null; - var scheduler = null; - if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_1__["isScheduler"])(observables[observables.length - 1])) { - scheduler = observables.pop(); - } - if (typeof observables[observables.length - 1] === 'function') { - resultSelector = observables.pop(); - } - if (observables.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_2__["isArray"])(observables[0])) { - observables = observables[0]; - } - return Object(_fromArray__WEBPACK_IMPORTED_MODULE_5__["fromArray"])(observables, scheduler).lift(new CombineLatestOperator(resultSelector)); -} -var CombineLatestOperator = /*@__PURE__*/ (function () { - function CombineLatestOperator(resultSelector) { - this.resultSelector = resultSelector; - } - CombineLatestOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new CombineLatestSubscriber(subscriber, this.resultSelector)); - }; - return CombineLatestOperator; -}()); - -var CombineLatestSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](CombineLatestSubscriber, _super); - function CombineLatestSubscriber(destination, resultSelector) { - var _this = _super.call(this, destination) || this; - _this.resultSelector = resultSelector; - _this.active = 0; - _this.values = []; - _this.observables = []; +var AsyncScheduler = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AsyncScheduler, _super); + function AsyncScheduler(SchedulerAction, now) { + if (now === void 0) { + now = _Scheduler__WEBPACK_IMPORTED_MODULE_1__["Scheduler"].now; + } + var _this = _super.call(this, SchedulerAction, function () { + if (AsyncScheduler.delegate && AsyncScheduler.delegate !== _this) { + return AsyncScheduler.delegate.now(); + } + else { + return now(); + } + }) || this; + _this.actions = []; + _this.active = false; + _this.scheduled = undefined; return _this; } - CombineLatestSubscriber.prototype._next = function (observable) { - this.values.push(NONE); - this.observables.push(observable); - }; - CombineLatestSubscriber.prototype._complete = function () { - var observables = this.observables; - var len = observables.length; - if (len === 0) { - this.destination.complete(); + AsyncScheduler.prototype.schedule = function (work, delay, state) { + if (delay === void 0) { + delay = 0; + } + if (AsyncScheduler.delegate && AsyncScheduler.delegate !== this) { + return AsyncScheduler.delegate.schedule(work, delay, state); } else { - this.active = len; - this.toRespond = len; - for (var i = 0; i < len; i++) { - var observable = observables[i]; - this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["subscribeToResult"])(this, observable, observable, i)); - } + return _super.prototype.schedule.call(this, work, delay, state); } }; - CombineLatestSubscriber.prototype.notifyComplete = function (unused) { - if ((this.active -= 1) === 0) { - this.destination.complete(); + AsyncScheduler.prototype.flush = function (action) { + var actions = this.actions; + if (this.active) { + actions.push(action); + return; } - }; - CombineLatestSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - var values = this.values; - var oldVal = values[outerIndex]; - var toRespond = !this.toRespond - ? 0 - : oldVal === NONE ? --this.toRespond : this.toRespond; - values[outerIndex] = innerValue; - if (toRespond === 0) { - if (this.resultSelector) { - this._tryResultSelector(values); + var error; + this.active = true; + do { + if (error = action.execute(action.state, action.delay)) { + break; } - else { - this.destination.next(values.slice()); + } while (action = actions.shift()); + this.active = false; + if (error) { + while (action = actions.shift()) { + action.unsubscribe(); } + throw error; } }; - CombineLatestSubscriber.prototype._tryResultSelector = function (values) { - var result; - try { - result = this.resultSelector.apply(this, values); + return AsyncScheduler; +}(_Scheduler__WEBPACK_IMPORTED_MODULE_1__["Scheduler"])); + +//# sourceMappingURL=AsyncScheduler.js.map + + +/***/ }), +/* 200 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Scheduler", function() { return Scheduler; }); +var Scheduler = /*@__PURE__*/ (function () { + function Scheduler(SchedulerAction, now) { + if (now === void 0) { + now = Scheduler.now; } - catch (err) { - this.destination.error(err); - return; + this.SchedulerAction = SchedulerAction; + this.now = now; + } + Scheduler.prototype.schedule = function (work, delay, state) { + if (delay === void 0) { + delay = 0; } - this.destination.next(result); + return new this.SchedulerAction(this, work).schedule(state, delay); }; - return CombineLatestSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); + Scheduler.now = function () { return Date.now(); }; + return Scheduler; +}()); -//# sourceMappingURL=combineLatest.js.map +//# sourceMappingURL=Scheduler.js.map /***/ }), -/* 215 */ +/* 201 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fromArray", function() { return fromArray; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(193); -/* harmony import */ var _util_subscribeToArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(185); -/* harmony import */ var _scheduled_scheduleArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(216); -/** PURE_IMPORTS_START _Observable,_util_subscribeToArray,_scheduled_scheduleArray PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "observeOn", function() { return observeOn; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ObserveOnOperator", function() { return ObserveOnOperator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ObserveOnSubscriber", function() { return ObserveOnSubscriber; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ObserveOnMessage", function() { return ObserveOnMessage; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); +/* harmony import */ var _Notification__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(202); +/** PURE_IMPORTS_START tslib,_Subscriber,_Notification PURE_IMPORTS_END */ -function fromArray(input, scheduler) { - if (!scheduler) { - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](Object(_util_subscribeToArray__WEBPACK_IMPORTED_MODULE_1__["subscribeToArray"])(input)); - } - else { - return Object(_scheduled_scheduleArray__WEBPACK_IMPORTED_MODULE_2__["scheduleArray"])(input, scheduler); +function observeOn(scheduler, delay) { + if (delay === void 0) { + delay = 0; } + return function observeOnOperatorFunction(source) { + return source.lift(new ObserveOnOperator(scheduler, delay)); + }; } -//# sourceMappingURL=fromArray.js.map +var ObserveOnOperator = /*@__PURE__*/ (function () { + function ObserveOnOperator(scheduler, delay) { + if (delay === void 0) { + delay = 0; + } + this.scheduler = scheduler; + this.delay = delay; + } + ObserveOnOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new ObserveOnSubscriber(subscriber, this.scheduler, this.delay)); + }; + return ObserveOnOperator; +}()); + +var ObserveOnSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ObserveOnSubscriber, _super); + function ObserveOnSubscriber(destination, scheduler, delay) { + if (delay === void 0) { + delay = 0; + } + var _this = _super.call(this, destination) || this; + _this.scheduler = scheduler; + _this.delay = delay; + return _this; + } + ObserveOnSubscriber.dispatch = function (arg) { + var notification = arg.notification, destination = arg.destination; + notification.observe(destination); + this.unsubscribe(); + }; + ObserveOnSubscriber.prototype.scheduleMessage = function (notification) { + var destination = this.destination; + destination.add(this.scheduler.schedule(ObserveOnSubscriber.dispatch, this.delay, new ObserveOnMessage(notification, this.destination))); + }; + ObserveOnSubscriber.prototype._next = function (value) { + this.scheduleMessage(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createNext(value)); + }; + ObserveOnSubscriber.prototype._error = function (err) { + this.scheduleMessage(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createError(err)); + this.unsubscribe(); + }; + ObserveOnSubscriber.prototype._complete = function () { + this.scheduleMessage(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createComplete()); + this.unsubscribe(); + }; + return ObserveOnSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); + +var ObserveOnMessage = /*@__PURE__*/ (function () { + function ObserveOnMessage(notification, destination) { + this.notification = notification; + this.destination = destination; + } + return ObserveOnMessage; +}()); + +//# sourceMappingURL=observeOn.js.map /***/ }), -/* 216 */ +/* 202 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheduleArray", function() { return scheduleArray; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(193); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(177); -/** PURE_IMPORTS_START _Observable,_Subscription PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NotificationKind", function() { return NotificationKind; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Notification", function() { return Notification; }); +/* harmony import */ var _observable_empty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(203); +/* harmony import */ var _observable_of__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(204); +/* harmony import */ var _observable_throwError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(209); +/** PURE_IMPORTS_START _observable_empty,_observable_of,_observable_throwError PURE_IMPORTS_END */ -function scheduleArray(input, scheduler) { - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var sub = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); - var i = 0; - sub.add(scheduler.schedule(function () { - if (i === input.length) { - subscriber.complete(); - return; - } - subscriber.next(input[i++]); - if (!subscriber.closed) { - sub.add(this.schedule()); - } - })); - return sub; - }); -} -//# sourceMappingURL=scheduleArray.js.map + +var NotificationKind; +/*@__PURE__*/ (function (NotificationKind) { + NotificationKind["NEXT"] = "N"; + NotificationKind["ERROR"] = "E"; + NotificationKind["COMPLETE"] = "C"; +})(NotificationKind || (NotificationKind = {})); +var Notification = /*@__PURE__*/ (function () { + function Notification(kind, value, error) { + this.kind = kind; + this.value = value; + this.error = error; + this.hasValue = kind === 'N'; + } + Notification.prototype.observe = function (observer) { + switch (this.kind) { + case 'N': + return observer.next && observer.next(this.value); + case 'E': + return observer.error && observer.error(this.error); + case 'C': + return observer.complete && observer.complete(); + } + }; + Notification.prototype.do = function (next, error, complete) { + var kind = this.kind; + switch (kind) { + case 'N': + return next && next(this.value); + case 'E': + return error && error(this.error); + case 'C': + return complete && complete(); + } + }; + Notification.prototype.accept = function (nextOrObserver, error, complete) { + if (nextOrObserver && typeof nextOrObserver.next === 'function') { + return this.observe(nextOrObserver); + } + else { + return this.do(nextOrObserver, error, complete); + } + }; + Notification.prototype.toObservable = function () { + var kind = this.kind; + switch (kind) { + case 'N': + return Object(_observable_of__WEBPACK_IMPORTED_MODULE_1__["of"])(this.value); + case 'E': + return Object(_observable_throwError__WEBPACK_IMPORTED_MODULE_2__["throwError"])(this.error); + case 'C': + return Object(_observable_empty__WEBPACK_IMPORTED_MODULE_0__["empty"])(); + } + throw new Error('unexpected notification kind value'); + }; + Notification.createNext = function (value) { + if (typeof value !== 'undefined') { + return new Notification('N', value); + } + return Notification.undefinedValueNotification; + }; + Notification.createError = function (err) { + return new Notification('E', undefined, err); + }; + Notification.createComplete = function () { + return Notification.completeNotification; + }; + Notification.completeNotification = new Notification('C'); + Notification.undefinedValueNotification = new Notification('N', undefined); + return Notification; +}()); + +//# sourceMappingURL=Notification.js.map /***/ }), -/* 217 */ +/* 203 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "combineLatest", function() { return combineLatest; }); -/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(178); -/* harmony import */ var _observable_combineLatest__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(214); -/* harmony import */ var _observable_from__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(218); -/** PURE_IMPORTS_START _util_isArray,_observable_combineLatest,_observable_from PURE_IMPORTS_END */ - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EMPTY", function() { return EMPTY; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empty", function() { return empty; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); +/** PURE_IMPORTS_START _Observable PURE_IMPORTS_END */ -var none = {}; -function combineLatest() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i] = arguments[_i]; - } - var project = null; - if (typeof observables[observables.length - 1] === 'function') { - project = observables.pop(); - } - if (observables.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_0__["isArray"])(observables[0])) { - observables = observables[0].slice(); - } - return function (source) { return source.lift.call(Object(_observable_from__WEBPACK_IMPORTED_MODULE_2__["from"])([source].concat(observables)), new _observable_combineLatest__WEBPACK_IMPORTED_MODULE_1__["CombineLatestOperator"](project)); }; +var EMPTY = /*@__PURE__*/ new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { return subscriber.complete(); }); +function empty(scheduler) { + return scheduler ? emptyScheduled(scheduler) : EMPTY; } -//# sourceMappingURL=combineLatest.js.map +function emptyScheduled(scheduler) { + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { return scheduler.schedule(function () { return subscriber.complete(); }); }); +} +//# sourceMappingURL=empty.js.map /***/ }), -/* 218 */ +/* 204 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "from", function() { return from; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(193); -/* harmony import */ var _util_subscribeTo__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(184); -/* harmony import */ var _scheduled_scheduled__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(219); -/** PURE_IMPORTS_START _Observable,_util_subscribeTo,_scheduled_scheduled PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "of", function() { return of; }); +/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(205); +/* harmony import */ var _fromArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(206); +/* harmony import */ var _scheduled_scheduleArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(208); +/** PURE_IMPORTS_START _util_isScheduler,_fromArray,_scheduled_scheduleArray PURE_IMPORTS_END */ -function from(input, scheduler) { - if (!scheduler) { - if (input instanceof _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"]) { - return input; - } - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](Object(_util_subscribeTo__WEBPACK_IMPORTED_MODULE_1__["subscribeTo"])(input)); +function of() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + var scheduler = args[args.length - 1]; + if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_0__["isScheduler"])(scheduler)) { + args.pop(); + return Object(_scheduled_scheduleArray__WEBPACK_IMPORTED_MODULE_2__["scheduleArray"])(args, scheduler); } else { - return Object(_scheduled_scheduled__WEBPACK_IMPORTED_MODULE_2__["scheduled"])(input, scheduler); + return Object(_fromArray__WEBPACK_IMPORTED_MODULE_1__["fromArray"])(args); } } -//# sourceMappingURL=from.js.map +//# sourceMappingURL=of.js.map /***/ }), -/* 219 */ +/* 205 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheduled", function() { return scheduled; }); -/* harmony import */ var _scheduleObservable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(220); -/* harmony import */ var _schedulePromise__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(221); -/* harmony import */ var _scheduleArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(216); -/* harmony import */ var _scheduleIterable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(222); -/* harmony import */ var _util_isInteropObservable__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(223); -/* harmony import */ var _util_isPromise__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(192); -/* harmony import */ var _util_isArrayLike__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(191); -/* harmony import */ var _util_isIterable__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(224); -/** PURE_IMPORTS_START _scheduleObservable,_schedulePromise,_scheduleArray,_scheduleIterable,_util_isInteropObservable,_util_isPromise,_util_isArrayLike,_util_isIterable PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isScheduler", function() { return isScheduler; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +function isScheduler(value) { + return value && typeof value.schedule === 'function'; +} +//# sourceMappingURL=isScheduler.js.map + +/***/ }), +/* 206 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fromArray", function() { return fromArray; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); +/* harmony import */ var _util_subscribeToArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(207); +/* harmony import */ var _scheduled_scheduleArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(208); +/** PURE_IMPORTS_START _Observable,_util_subscribeToArray,_scheduled_scheduleArray PURE_IMPORTS_END */ +function fromArray(input, scheduler) { + if (!scheduler) { + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](Object(_util_subscribeToArray__WEBPACK_IMPORTED_MODULE_1__["subscribeToArray"])(input)); + } + else { + return Object(_scheduled_scheduleArray__WEBPACK_IMPORTED_MODULE_2__["scheduleArray"])(input, scheduler); + } +} +//# sourceMappingURL=fromArray.js.map +/***/ }), +/* 207 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -function scheduled(input, scheduler) { - if (input != null) { - if (Object(_util_isInteropObservable__WEBPACK_IMPORTED_MODULE_4__["isInteropObservable"])(input)) { - return Object(_scheduleObservable__WEBPACK_IMPORTED_MODULE_0__["scheduleObservable"])(input, scheduler); - } - else if (Object(_util_isPromise__WEBPACK_IMPORTED_MODULE_5__["isPromise"])(input)) { - return Object(_schedulePromise__WEBPACK_IMPORTED_MODULE_1__["schedulePromise"])(input, scheduler); - } - else if (Object(_util_isArrayLike__WEBPACK_IMPORTED_MODULE_6__["isArrayLike"])(input)) { - return Object(_scheduleArray__WEBPACK_IMPORTED_MODULE_2__["scheduleArray"])(input, scheduler); - } - else if (Object(_util_isIterable__WEBPACK_IMPORTED_MODULE_7__["isIterable"])(input) || typeof input === 'string') { - return Object(_scheduleIterable__WEBPACK_IMPORTED_MODULE_3__["scheduleIterable"])(input, scheduler); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeToArray", function() { return subscribeToArray; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +var subscribeToArray = function (array) { + return function (subscriber) { + for (var i = 0, len = array.length; i < len && !subscriber.closed; i++) { + subscriber.next(array[i]); } - } - throw new TypeError((input !== null && typeof input || input) + ' is not observable'); -} -//# sourceMappingURL=scheduled.js.map + subscriber.complete(); + }; +}; +//# sourceMappingURL=subscribeToArray.js.map /***/ }), -/* 220 */ +/* 208 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheduleObservable", function() { return scheduleObservable; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(193); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheduleArray", function() { return scheduleArray; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); /* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(177); -/* harmony import */ var _symbol_observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(190); -/** PURE_IMPORTS_START _Observable,_Subscription,_symbol_observable PURE_IMPORTS_END */ - +/** PURE_IMPORTS_START _Observable,_Subscription PURE_IMPORTS_END */ -function scheduleObservable(input, scheduler) { +function scheduleArray(input, scheduler) { return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { var sub = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); + var i = 0; sub.add(scheduler.schedule(function () { - var observable = input[_symbol_observable__WEBPACK_IMPORTED_MODULE_2__["observable"]](); - sub.add(observable.subscribe({ - next: function (value) { sub.add(scheduler.schedule(function () { return subscriber.next(value); })); }, - error: function (err) { sub.add(scheduler.schedule(function () { return subscriber.error(err); })); }, - complete: function () { sub.add(scheduler.schedule(function () { return subscriber.complete(); })); }, - })); + if (i === input.length) { + subscriber.complete(); + return; + } + subscriber.next(input[i++]); + if (!subscriber.closed) { + sub.add(this.schedule()); + } })); return sub; }); } -//# sourceMappingURL=scheduleObservable.js.map +//# sourceMappingURL=scheduleArray.js.map /***/ }), -/* 221 */ +/* 209 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "schedulePromise", function() { return schedulePromise; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(193); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(177); -/** PURE_IMPORTS_START _Observable,_Subscription PURE_IMPORTS_END */ - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "throwError", function() { return throwError; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); +/** PURE_IMPORTS_START _Observable PURE_IMPORTS_END */ -function schedulePromise(input, scheduler) { - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var sub = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); - sub.add(scheduler.schedule(function () { - return input.then(function (value) { - sub.add(scheduler.schedule(function () { - subscriber.next(value); - sub.add(scheduler.schedule(function () { return subscriber.complete(); })); - })); - }, function (err) { - sub.add(scheduler.schedule(function () { return subscriber.error(err); })); - }); - })); - return sub; - }); +function throwError(error, scheduler) { + if (!scheduler) { + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { return subscriber.error(error); }); + } + else { + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { return scheduler.schedule(dispatch, 0, { error: error, subscriber: subscriber }); }); + } } -//# sourceMappingURL=schedulePromise.js.map +function dispatch(_a) { + var error = _a.error, subscriber = _a.subscriber; + subscriber.error(error); +} +//# sourceMappingURL=throwError.js.map /***/ }), -/* 222 */ +/* 210 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheduleIterable", function() { return scheduleIterable; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(193); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(177); -/* harmony import */ var _symbol_iterator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(188); -/** PURE_IMPORTS_START _Observable,_Subscription,_symbol_iterator PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AsyncSubject", function() { return AsyncSubject; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(187); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(177); +/** PURE_IMPORTS_START tslib,_Subject,_Subscription PURE_IMPORTS_END */ -function scheduleIterable(input, scheduler) { - if (!input) { - throw new Error('Iterable cannot be null'); +var AsyncSubject = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AsyncSubject, _super); + function AsyncSubject() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.value = null; + _this.hasNext = false; + _this.hasCompleted = false; + return _this; } - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var sub = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); - var iterator; - sub.add(function () { - if (iterator && typeof iterator.return === 'function') { - iterator.return(); - } - }); - sub.add(scheduler.schedule(function () { - iterator = input[_symbol_iterator__WEBPACK_IMPORTED_MODULE_2__["iterator"]](); - sub.add(scheduler.schedule(function () { - if (subscriber.closed) { - return; - } - var value; - var done; - try { - var result = iterator.next(); - value = result.value; - done = result.done; - } - catch (err) { - subscriber.error(err); - return; - } - if (done) { - subscriber.complete(); - } - else { - subscriber.next(value); - this.schedule(); - } - })); - })); - return sub; - }); -} -//# sourceMappingURL=scheduleIterable.js.map + AsyncSubject.prototype._subscribe = function (subscriber) { + if (this.hasError) { + subscriber.error(this.thrownError); + return _Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"].EMPTY; + } + else if (this.hasCompleted && this.hasNext) { + subscriber.next(this.value); + subscriber.complete(); + return _Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"].EMPTY; + } + return _super.prototype._subscribe.call(this, subscriber); + }; + AsyncSubject.prototype.next = function (value) { + if (!this.hasCompleted) { + this.value = value; + this.hasNext = true; + } + }; + AsyncSubject.prototype.error = function (error) { + if (!this.hasCompleted) { + _super.prototype.error.call(this, error); + } + }; + AsyncSubject.prototype.complete = function () { + this.hasCompleted = true; + if (this.hasNext) { + _super.prototype.next.call(this, this.value); + } + _super.prototype.complete.call(this); + }; + return AsyncSubject; +}(_Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"])); + +//# sourceMappingURL=AsyncSubject.js.map /***/ }), -/* 223 */ +/* 211 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isInteropObservable", function() { return isInteropObservable; }); -/* harmony import */ var _symbol_observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(190); -/** PURE_IMPORTS_START _symbol_observable PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "asap", function() { return asap; }); +/* harmony import */ var _AsapAction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(212); +/* harmony import */ var _AsapScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(214); +/** PURE_IMPORTS_START _AsapAction,_AsapScheduler PURE_IMPORTS_END */ -function isInteropObservable(input) { - return input && typeof input[_symbol_observable__WEBPACK_IMPORTED_MODULE_0__["observable"]] === 'function'; -} -//# sourceMappingURL=isInteropObservable.js.map + +var asap = /*@__PURE__*/ new _AsapScheduler__WEBPACK_IMPORTED_MODULE_1__["AsapScheduler"](_AsapAction__WEBPACK_IMPORTED_MODULE_0__["AsapAction"]); +//# sourceMappingURL=asap.js.map /***/ }), -/* 224 */ +/* 212 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isIterable", function() { return isIterable; }); -/* harmony import */ var _symbol_iterator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(188); -/** PURE_IMPORTS_START _symbol_iterator PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AsapAction", function() { return AsapAction; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); +/* harmony import */ var _util_Immediate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(213); +/* harmony import */ var _AsyncAction__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(196); +/** PURE_IMPORTS_START tslib,_util_Immediate,_AsyncAction PURE_IMPORTS_END */ -function isIterable(input) { - return input && typeof input[_symbol_iterator__WEBPACK_IMPORTED_MODULE_0__["iterator"]] === 'function'; -} -//# sourceMappingURL=isIterable.js.map + + +var AsapAction = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AsapAction, _super); + function AsapAction(scheduler, work) { + var _this = _super.call(this, scheduler, work) || this; + _this.scheduler = scheduler; + _this.work = work; + return _this; + } + AsapAction.prototype.requestAsyncId = function (scheduler, id, delay) { + if (delay === void 0) { + delay = 0; + } + if (delay !== null && delay > 0) { + return _super.prototype.requestAsyncId.call(this, scheduler, id, delay); + } + scheduler.actions.push(this); + return scheduler.scheduled || (scheduler.scheduled = _util_Immediate__WEBPACK_IMPORTED_MODULE_1__["Immediate"].setImmediate(scheduler.flush.bind(scheduler, null))); + }; + AsapAction.prototype.recycleAsyncId = function (scheduler, id, delay) { + if (delay === void 0) { + delay = 0; + } + if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) { + return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay); + } + if (scheduler.actions.length === 0) { + _util_Immediate__WEBPACK_IMPORTED_MODULE_1__["Immediate"].clearImmediate(id); + scheduler.scheduled = undefined; + } + return undefined; + }; + return AsapAction; +}(_AsyncAction__WEBPACK_IMPORTED_MODULE_2__["AsyncAction"])); + +//# sourceMappingURL=AsapAction.js.map /***/ }), -/* 225 */ +/* 213 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concat", function() { return concat; }); -/* harmony import */ var _observable_concat__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(226); -/** PURE_IMPORTS_START _observable_concat PURE_IMPORTS_END */ - -function concat() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i] = arguments[_i]; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Immediate", function() { return Immediate; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +var nextHandle = 1; +var tasksByHandle = {}; +function runIfPresent(handle) { + var cb = tasksByHandle[handle]; + if (cb) { + cb(); } - return function (source) { return source.lift.call(_observable_concat__WEBPACK_IMPORTED_MODULE_0__["concat"].apply(void 0, [source].concat(observables))); }; } -//# sourceMappingURL=concat.js.map +var Immediate = { + setImmediate: function (cb) { + var handle = nextHandle++; + tasksByHandle[handle] = cb; + Promise.resolve().then(function () { return runIfPresent(handle); }); + return handle; + }, + clearImmediate: function (handle) { + delete tasksByHandle[handle]; + }, +}; +//# sourceMappingURL=Immediate.js.map /***/ }), -/* 226 */ +/* 214 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concat", function() { return concat; }); -/* harmony import */ var _of__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(227); -/* harmony import */ var _operators_concatAll__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(228); -/** PURE_IMPORTS_START _of,_operators_concatAll PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AsapScheduler", function() { return AsapScheduler; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); +/* harmony import */ var _AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(199); +/** PURE_IMPORTS_START tslib,_AsyncScheduler PURE_IMPORTS_END */ -function concat() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i] = arguments[_i]; +var AsapScheduler = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AsapScheduler, _super); + function AsapScheduler() { + return _super !== null && _super.apply(this, arguments) || this; } - return Object(_operators_concatAll__WEBPACK_IMPORTED_MODULE_1__["concatAll"])()(_of__WEBPACK_IMPORTED_MODULE_0__["of"].apply(void 0, observables)); -} -//# sourceMappingURL=concat.js.map + AsapScheduler.prototype.flush = function (action) { + this.active = true; + this.scheduled = undefined; + var actions = this.actions; + var error; + var index = -1; + var count = actions.length; + action = action || actions.shift(); + do { + if (error = action.execute(action.state, action.delay)) { + break; + } + } while (++index < count && (action = actions.shift())); + this.active = false; + if (error) { + while (++index < count && (action = actions.shift())) { + action.unsubscribe(); + } + throw error; + } + }; + return AsapScheduler; +}(_AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__["AsyncScheduler"])); + +//# sourceMappingURL=AsapScheduler.js.map /***/ }), -/* 227 */ +/* 215 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "of", function() { return of; }); -/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(206); -/* harmony import */ var _fromArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(215); -/* harmony import */ var _scheduled_scheduleArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(216); -/** PURE_IMPORTS_START _util_isScheduler,_fromArray,_scheduled_scheduleArray PURE_IMPORTS_END */ - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "async", function() { return async; }); +/* harmony import */ var _AsyncAction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(196); +/* harmony import */ var _AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(199); +/** PURE_IMPORTS_START _AsyncAction,_AsyncScheduler PURE_IMPORTS_END */ -function of() { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } - var scheduler = args[args.length - 1]; - if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_0__["isScheduler"])(scheduler)) { - args.pop(); - return Object(_scheduled_scheduleArray__WEBPACK_IMPORTED_MODULE_2__["scheduleArray"])(args, scheduler); - } - else { - return Object(_fromArray__WEBPACK_IMPORTED_MODULE_1__["fromArray"])(args); - } -} -//# sourceMappingURL=of.js.map +var async = /*@__PURE__*/ new _AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__["AsyncScheduler"](_AsyncAction__WEBPACK_IMPORTED_MODULE_0__["AsyncAction"]); +//# sourceMappingURL=async.js.map /***/ }), -/* 228 */ +/* 216 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concatAll", function() { return concatAll; }); -/* harmony import */ var _mergeAll__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(229); -/** PURE_IMPORTS_START _mergeAll PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "animationFrame", function() { return animationFrame; }); +/* harmony import */ var _AnimationFrameAction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(217); +/* harmony import */ var _AnimationFrameScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(218); +/** PURE_IMPORTS_START _AnimationFrameAction,_AnimationFrameScheduler PURE_IMPORTS_END */ -function concatAll() { - return Object(_mergeAll__WEBPACK_IMPORTED_MODULE_0__["mergeAll"])(1); -} -//# sourceMappingURL=concatAll.js.map + +var animationFrame = /*@__PURE__*/ new _AnimationFrameScheduler__WEBPACK_IMPORTED_MODULE_1__["AnimationFrameScheduler"](_AnimationFrameAction__WEBPACK_IMPORTED_MODULE_0__["AnimationFrameAction"]); +//# sourceMappingURL=animationFrame.js.map /***/ }), -/* 229 */ +/* 217 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mergeAll", function() { return mergeAll; }); -/* harmony import */ var _mergeMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(230); -/* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(232); -/** PURE_IMPORTS_START _mergeMap,_util_identity PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AnimationFrameAction", function() { return AnimationFrameAction; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); +/* harmony import */ var _AsyncAction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(196); +/** PURE_IMPORTS_START tslib,_AsyncAction PURE_IMPORTS_END */ -function mergeAll(concurrent) { - if (concurrent === void 0) { - concurrent = Number.POSITIVE_INFINITY; +var AnimationFrameAction = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AnimationFrameAction, _super); + function AnimationFrameAction(scheduler, work) { + var _this = _super.call(this, scheduler, work) || this; + _this.scheduler = scheduler; + _this.work = work; + return _this; } - return Object(_mergeMap__WEBPACK_IMPORTED_MODULE_0__["mergeMap"])(_util_identity__WEBPACK_IMPORTED_MODULE_1__["identity"], concurrent); -} -//# sourceMappingURL=mergeAll.js.map + AnimationFrameAction.prototype.requestAsyncId = function (scheduler, id, delay) { + if (delay === void 0) { + delay = 0; + } + if (delay !== null && delay > 0) { + return _super.prototype.requestAsyncId.call(this, scheduler, id, delay); + } + scheduler.actions.push(this); + return scheduler.scheduled || (scheduler.scheduled = requestAnimationFrame(function () { return scheduler.flush(null); })); + }; + AnimationFrameAction.prototype.recycleAsyncId = function (scheduler, id, delay) { + if (delay === void 0) { + delay = 0; + } + if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) { + return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay); + } + if (scheduler.actions.length === 0) { + cancelAnimationFrame(id); + scheduler.scheduled = undefined; + } + return undefined; + }; + return AnimationFrameAction; +}(_AsyncAction__WEBPACK_IMPORTED_MODULE_1__["AsyncAction"])); + +//# sourceMappingURL=AnimationFrameAction.js.map /***/ }), -/* 230 */ +/* 218 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mergeMap", function() { return mergeMap; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MergeMapOperator", function() { return MergeMapOperator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MergeMapSubscriber", function() { return MergeMapSubscriber; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AnimationFrameScheduler", function() { return AnimationFrameScheduler; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(182); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(171); -/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(183); -/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(231); -/* harmony import */ var _observable_from__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(218); -/** PURE_IMPORTS_START tslib,_util_subscribeToResult,_OuterSubscriber,_InnerSubscriber,_map,_observable_from PURE_IMPORTS_END */ +/* harmony import */ var _AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(199); +/** PURE_IMPORTS_START tslib,_AsyncScheduler PURE_IMPORTS_END */ + + +var AnimationFrameScheduler = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AnimationFrameScheduler, _super); + function AnimationFrameScheduler() { + return _super !== null && _super.apply(this, arguments) || this; + } + AnimationFrameScheduler.prototype.flush = function (action) { + this.active = true; + this.scheduled = undefined; + var actions = this.actions; + var error; + var index = -1; + var count = actions.length; + action = action || actions.shift(); + do { + if (error = action.execute(action.state, action.delay)) { + break; + } + } while (++index < count && (action = actions.shift())); + this.active = false; + if (error) { + while (++index < count && (action = actions.shift())) { + action.unsubscribe(); + } + throw error; + } + }; + return AnimationFrameScheduler; +}(_AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__["AsyncScheduler"])); +//# sourceMappingURL=AnimationFrameScheduler.js.map +/***/ }), +/* 219 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VirtualTimeScheduler", function() { return VirtualTimeScheduler; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VirtualAction", function() { return VirtualAction; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); +/* harmony import */ var _AsyncAction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(196); +/* harmony import */ var _AsyncScheduler__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(199); +/** PURE_IMPORTS_START tslib,_AsyncAction,_AsyncScheduler PURE_IMPORTS_END */ -function mergeMap(project, resultSelector, concurrent) { - if (concurrent === void 0) { - concurrent = Number.POSITIVE_INFINITY; - } - if (typeof resultSelector === 'function') { - return function (source) { return source.pipe(mergeMap(function (a, i) { return Object(_observable_from__WEBPACK_IMPORTED_MODULE_5__["from"])(project(a, i)).pipe(Object(_map__WEBPACK_IMPORTED_MODULE_4__["map"])(function (b, ii) { return resultSelector(a, b, i, ii); })); }, concurrent)); }; - } - else if (typeof resultSelector === 'number') { - concurrent = resultSelector; - } - return function (source) { return source.lift(new MergeMapOperator(project, concurrent)); }; -} -var MergeMapOperator = /*@__PURE__*/ (function () { - function MergeMapOperator(project, concurrent) { - if (concurrent === void 0) { - concurrent = Number.POSITIVE_INFINITY; + +var VirtualTimeScheduler = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](VirtualTimeScheduler, _super); + function VirtualTimeScheduler(SchedulerAction, maxFrames) { + if (SchedulerAction === void 0) { + SchedulerAction = VirtualAction; } - this.project = project; - this.concurrent = concurrent; + if (maxFrames === void 0) { + maxFrames = Number.POSITIVE_INFINITY; + } + var _this = _super.call(this, SchedulerAction, function () { return _this.frame; }) || this; + _this.maxFrames = maxFrames; + _this.frame = 0; + _this.index = -1; + return _this; } - MergeMapOperator.prototype.call = function (observer, source) { - return source.subscribe(new MergeMapSubscriber(observer, this.project, this.concurrent)); + VirtualTimeScheduler.prototype.flush = function () { + var _a = this, actions = _a.actions, maxFrames = _a.maxFrames; + var error, action; + while ((action = actions[0]) && action.delay <= maxFrames) { + actions.shift(); + this.frame = action.delay; + if (error = action.execute(action.state, action.delay)) { + break; + } + } + if (error) { + while (action = actions.shift()) { + action.unsubscribe(); + } + throw error; + } }; - return MergeMapOperator; -}()); + VirtualTimeScheduler.frameTimeFactor = 10; + return VirtualTimeScheduler; +}(_AsyncScheduler__WEBPACK_IMPORTED_MODULE_2__["AsyncScheduler"])); -var MergeMapSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](MergeMapSubscriber, _super); - function MergeMapSubscriber(destination, project, concurrent) { - if (concurrent === void 0) { - concurrent = Number.POSITIVE_INFINITY; +var VirtualAction = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](VirtualAction, _super); + function VirtualAction(scheduler, work, index) { + if (index === void 0) { + index = scheduler.index += 1; } - var _this = _super.call(this, destination) || this; - _this.project = project; - _this.concurrent = concurrent; - _this.hasCompleted = false; - _this.buffer = []; - _this.active = 0; - _this.index = 0; + var _this = _super.call(this, scheduler, work) || this; + _this.scheduler = scheduler; + _this.work = work; + _this.index = index; + _this.active = true; + _this.index = scheduler.index = index; return _this; } - MergeMapSubscriber.prototype._next = function (value) { - if (this.active < this.concurrent) { - this._tryNext(value); + VirtualAction.prototype.schedule = function (state, delay) { + if (delay === void 0) { + delay = 0; } - else { - this.buffer.push(value); + if (!this.id) { + return _super.prototype.schedule.call(this, state, delay); } + this.active = false; + var action = new VirtualAction(this.scheduler, this.work); + this.add(action); + return action.schedule(state, delay); }; - MergeMapSubscriber.prototype._tryNext = function (value) { - var result; - var index = this.index++; - try { - result = this.project(value, index); - } - catch (err) { - this.destination.error(err); - return; + VirtualAction.prototype.requestAsyncId = function (scheduler, id, delay) { + if (delay === void 0) { + delay = 0; } - this.active++; - this._innerSub(result, value, index); - }; - MergeMapSubscriber.prototype._innerSub = function (ish, value, index) { - var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_3__["InnerSubscriber"](this, undefined, undefined); - var destination = this.destination; - destination.add(innerSubscriber); - Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_1__["subscribeToResult"])(this, ish, value, index, innerSubscriber); + this.delay = scheduler.frame + delay; + var actions = scheduler.actions; + actions.push(this); + actions.sort(VirtualAction.sortActions); + return true; }; - MergeMapSubscriber.prototype._complete = function () { - this.hasCompleted = true; - if (this.active === 0 && this.buffer.length === 0) { - this.destination.complete(); + VirtualAction.prototype.recycleAsyncId = function (scheduler, id, delay) { + if (delay === void 0) { + delay = 0; } - this.unsubscribe(); + return undefined; }; - MergeMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.destination.next(innerValue); + VirtualAction.prototype._execute = function (state, delay) { + if (this.active === true) { + return _super.prototype._execute.call(this, state, delay); + } }; - MergeMapSubscriber.prototype.notifyComplete = function (innerSub) { - var buffer = this.buffer; - this.remove(innerSub); - this.active--; - if (buffer.length > 0) { - this._next(buffer.shift()); + VirtualAction.sortActions = function (a, b) { + if (a.delay === b.delay) { + if (a.index === b.index) { + return 0; + } + else if (a.index > b.index) { + return 1; + } + else { + return -1; + } } - else if (this.active === 0 && this.hasCompleted) { - this.destination.complete(); + else if (a.delay > b.delay) { + return 1; + } + else { + return -1; } }; - return MergeMapSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); + return VirtualAction; +}(_AsyncAction__WEBPACK_IMPORTED_MODULE_1__["AsyncAction"])); -//# sourceMappingURL=mergeMap.js.map +//# sourceMappingURL=VirtualTimeScheduler.js.map /***/ }), -/* 231 */ +/* 220 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "map", function() { return map; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MapOperator", function() { return MapOperator; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "identity", function() { return identity; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +function identity(x) { + return x; +} +//# sourceMappingURL=identity.js.map -function map(project, thisArg) { - return function mapOperation(source) { +/***/ }), +/* 221 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isObservable", function() { return isObservable; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); +/** PURE_IMPORTS_START _Observable PURE_IMPORTS_END */ + +function isObservable(obj) { + return !!obj && (obj instanceof _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"] || (typeof obj.lift === 'function' && typeof obj.subscribe === 'function')); +} +//# sourceMappingURL=isObservable.js.map + + +/***/ }), +/* 222 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ArgumentOutOfRangeError", function() { return ArgumentOutOfRangeError; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +var ArgumentOutOfRangeErrorImpl = /*@__PURE__*/ (function () { + function ArgumentOutOfRangeErrorImpl() { + Error.call(this); + this.message = 'argument out of range'; + this.name = 'ArgumentOutOfRangeError'; + return this; + } + ArgumentOutOfRangeErrorImpl.prototype = /*@__PURE__*/ Object.create(Error.prototype); + return ArgumentOutOfRangeErrorImpl; +})(); +var ArgumentOutOfRangeError = ArgumentOutOfRangeErrorImpl; +//# sourceMappingURL=ArgumentOutOfRangeError.js.map + + +/***/ }), +/* 223 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EmptyError", function() { return EmptyError; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +var EmptyErrorImpl = /*@__PURE__*/ (function () { + function EmptyErrorImpl() { + Error.call(this); + this.message = 'no elements in sequence'; + this.name = 'EmptyError'; + return this; + } + EmptyErrorImpl.prototype = /*@__PURE__*/ Object.create(Error.prototype); + return EmptyErrorImpl; +})(); +var EmptyError = EmptyErrorImpl; +//# sourceMappingURL=EmptyError.js.map + + +/***/ }), +/* 224 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TimeoutError", function() { return TimeoutError; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +var TimeoutErrorImpl = /*@__PURE__*/ (function () { + function TimeoutErrorImpl() { + Error.call(this); + this.message = 'Timeout has occurred'; + this.name = 'TimeoutError'; + return this; + } + TimeoutErrorImpl.prototype = /*@__PURE__*/ Object.create(Error.prototype); + return TimeoutErrorImpl; +})(); +var TimeoutError = TimeoutErrorImpl; +//# sourceMappingURL=TimeoutError.js.map + + +/***/ }), +/* 225 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bindCallback", function() { return bindCallback; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); +/* harmony import */ var _AsyncSubject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(210); +/* harmony import */ var _operators_map__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(226); +/* harmony import */ var _util_canReportError__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(171); +/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(178); +/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(205); +/** PURE_IMPORTS_START _Observable,_AsyncSubject,_operators_map,_util_canReportError,_util_isArray,_util_isScheduler PURE_IMPORTS_END */ + + + + + + +function bindCallback(callbackFunc, resultSelector, scheduler) { + if (resultSelector) { + if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_5__["isScheduler"])(resultSelector)) { + scheduler = resultSelector; + } + else { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return bindCallback(callbackFunc, scheduler).apply(void 0, args).pipe(Object(_operators_map__WEBPACK_IMPORTED_MODULE_2__["map"])(function (args) { return Object(_util_isArray__WEBPACK_IMPORTED_MODULE_4__["isArray"])(args) ? resultSelector.apply(void 0, args) : resultSelector(args); })); + }; + } + } + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + var context = this; + var subject; + var params = { + context: context, + subject: subject, + callbackFunc: callbackFunc, + scheduler: scheduler, + }; + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + if (!scheduler) { + if (!subject) { + subject = new _AsyncSubject__WEBPACK_IMPORTED_MODULE_1__["AsyncSubject"](); + var handler = function () { + var innerArgs = []; + for (var _i = 0; _i < arguments.length; _i++) { + innerArgs[_i] = arguments[_i]; + } + subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs); + subject.complete(); + }; + try { + callbackFunc.apply(context, args.concat([handler])); + } + catch (err) { + if (Object(_util_canReportError__WEBPACK_IMPORTED_MODULE_3__["canReportError"])(subject)) { + subject.error(err); + } + else { + console.warn(err); + } + } + } + return subject.subscribe(subscriber); + } + else { + var state = { + args: args, subscriber: subscriber, params: params, + }; + return scheduler.schedule(dispatch, 0, state); + } + }); + }; +} +function dispatch(state) { + var _this = this; + var self = this; + var args = state.args, subscriber = state.subscriber, params = state.params; + var callbackFunc = params.callbackFunc, context = params.context, scheduler = params.scheduler; + var subject = params.subject; + if (!subject) { + subject = params.subject = new _AsyncSubject__WEBPACK_IMPORTED_MODULE_1__["AsyncSubject"](); + var handler = function () { + var innerArgs = []; + for (var _i = 0; _i < arguments.length; _i++) { + innerArgs[_i] = arguments[_i]; + } + var value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs; + _this.add(scheduler.schedule(dispatchNext, 0, { value: value, subject: subject })); + }; + try { + callbackFunc.apply(context, args.concat([handler])); + } + catch (err) { + subject.error(err); + } + } + this.add(subject.subscribe(subscriber)); +} +function dispatchNext(state) { + var value = state.value, subject = state.subject; + subject.next(value); + subject.complete(); +} +function dispatchError(state) { + var err = state.err, subject = state.subject; + subject.error(err); +} +//# sourceMappingURL=bindCallback.js.map + + +/***/ }), +/* 226 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "map", function() { return map; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MapOperator", function() { return MapOperator; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ + + +function map(project, thisArg) { + return function mapOperation(source) { if (typeof project !== 'function') { throw new TypeError('argument is not a function. Are you looking for `mapTo()`?'); } @@ -25230,1041 +25225,1045 @@ var MapSubscriber = /*@__PURE__*/ (function (_super) { /***/ }), -/* 232 */ +/* 227 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "identity", function() { return identity; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -function identity(x) { - return x; -} -//# sourceMappingURL=identity.js.map +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bindNodeCallback", function() { return bindNodeCallback; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); +/* harmony import */ var _AsyncSubject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(210); +/* harmony import */ var _operators_map__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(226); +/* harmony import */ var _util_canReportError__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(171); +/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(205); +/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(178); +/** PURE_IMPORTS_START _Observable,_AsyncSubject,_operators_map,_util_canReportError,_util_isScheduler,_util_isArray PURE_IMPORTS_END */ -/***/ }), -/* 233 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concatMap", function() { return concatMap; }); -/* harmony import */ var _mergeMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(230); -/** PURE_IMPORTS_START _mergeMap PURE_IMPORTS_END */ -function concatMap(project, resultSelector) { - return Object(_mergeMap__WEBPACK_IMPORTED_MODULE_0__["mergeMap"])(project, resultSelector, 1); + + +function bindNodeCallback(callbackFunc, resultSelector, scheduler) { + if (resultSelector) { + if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_4__["isScheduler"])(resultSelector)) { + scheduler = resultSelector; + } + else { + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return bindNodeCallback(callbackFunc, scheduler).apply(void 0, args).pipe(Object(_operators_map__WEBPACK_IMPORTED_MODULE_2__["map"])(function (args) { return Object(_util_isArray__WEBPACK_IMPORTED_MODULE_5__["isArray"])(args) ? resultSelector.apply(void 0, args) : resultSelector(args); })); + }; + } + } + return function () { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + var params = { + subject: undefined, + args: args, + callbackFunc: callbackFunc, + scheduler: scheduler, + context: this, + }; + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var context = params.context; + var subject = params.subject; + if (!scheduler) { + if (!subject) { + subject = params.subject = new _AsyncSubject__WEBPACK_IMPORTED_MODULE_1__["AsyncSubject"](); + var handler = function () { + var innerArgs = []; + for (var _i = 0; _i < arguments.length; _i++) { + innerArgs[_i] = arguments[_i]; + } + var err = innerArgs.shift(); + if (err) { + subject.error(err); + return; + } + subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs); + subject.complete(); + }; + try { + callbackFunc.apply(context, args.concat([handler])); + } + catch (err) { + if (Object(_util_canReportError__WEBPACK_IMPORTED_MODULE_3__["canReportError"])(subject)) { + subject.error(err); + } + else { + console.warn(err); + } + } + } + return subject.subscribe(subscriber); + } + else { + return scheduler.schedule(dispatch, 0, { params: params, subscriber: subscriber, context: context }); + } + }); + }; } -//# sourceMappingURL=concatMap.js.map +function dispatch(state) { + var _this = this; + var params = state.params, subscriber = state.subscriber, context = state.context; + var callbackFunc = params.callbackFunc, args = params.args, scheduler = params.scheduler; + var subject = params.subject; + if (!subject) { + subject = params.subject = new _AsyncSubject__WEBPACK_IMPORTED_MODULE_1__["AsyncSubject"](); + var handler = function () { + var innerArgs = []; + for (var _i = 0; _i < arguments.length; _i++) { + innerArgs[_i] = arguments[_i]; + } + var err = innerArgs.shift(); + if (err) { + _this.add(scheduler.schedule(dispatchError, 0, { err: err, subject: subject })); + } + else { + var value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs; + _this.add(scheduler.schedule(dispatchNext, 0, { value: value, subject: subject })); + } + }; + try { + callbackFunc.apply(context, args.concat([handler])); + } + catch (err) { + this.add(scheduler.schedule(dispatchError, 0, { err: err, subject: subject })); + } + } + this.add(subject.subscribe(subscriber)); +} +function dispatchNext(arg) { + var value = arg.value, subject = arg.subject; + subject.next(value); + subject.complete(); +} +function dispatchError(arg) { + var err = arg.err, subject = arg.subject; + subject.error(err); +} +//# sourceMappingURL=bindNodeCallback.js.map /***/ }), -/* 234 */ +/* 228 */ /***/ (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__(233); -/** PURE_IMPORTS_START _concatMap PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "combineLatest", function() { return combineLatest; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CombineLatestOperator", function() { return CombineLatestOperator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "CombineLatestSubscriber", function() { return CombineLatestSubscriber; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); +/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(205); +/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(178); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(229); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(230); +/* harmony import */ var _fromArray__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(206); +/** PURE_IMPORTS_START tslib,_util_isScheduler,_util_isArray,_OuterSubscriber,_util_subscribeToResult,_fromArray PURE_IMPORTS_END */ -function concatMapTo(innerObservable, resultSelector) { - return Object(_concatMap__WEBPACK_IMPORTED_MODULE_0__["concatMap"])(function () { return innerObservable; }, resultSelector); -} -//# sourceMappingURL=concatMapTo.js.map -/***/ }), -/* 235 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "count", function() { return count; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function count(predicate) { - return function (source) { return source.lift(new CountOperator(predicate, source)); }; +var NONE = {}; +function combineLatest() { + var observables = []; + for (var _i = 0; _i < arguments.length; _i++) { + observables[_i] = arguments[_i]; + } + var resultSelector = null; + var scheduler = null; + if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_1__["isScheduler"])(observables[observables.length - 1])) { + scheduler = observables.pop(); + } + if (typeof observables[observables.length - 1] === 'function') { + resultSelector = observables.pop(); + } + if (observables.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_2__["isArray"])(observables[0])) { + observables = observables[0]; + } + return Object(_fromArray__WEBPACK_IMPORTED_MODULE_5__["fromArray"])(observables, scheduler).lift(new CombineLatestOperator(resultSelector)); } -var CountOperator = /*@__PURE__*/ (function () { - function CountOperator(predicate, source) { - this.predicate = predicate; - this.source = source; +var CombineLatestOperator = /*@__PURE__*/ (function () { + function CombineLatestOperator(resultSelector) { + this.resultSelector = resultSelector; } - CountOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new CountSubscriber(subscriber, this.predicate, this.source)); + CombineLatestOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new CombineLatestSubscriber(subscriber, this.resultSelector)); }; - return CountOperator; + return CombineLatestOperator; }()); -var CountSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](CountSubscriber, _super); - function CountSubscriber(destination, predicate, source) { + +var CombineLatestSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](CombineLatestSubscriber, _super); + function CombineLatestSubscriber(destination, resultSelector) { var _this = _super.call(this, destination) || this; - _this.predicate = predicate; - _this.source = source; - _this.count = 0; - _this.index = 0; + _this.resultSelector = resultSelector; + _this.active = 0; + _this.values = []; + _this.observables = []; return _this; } - CountSubscriber.prototype._next = function (value) { - if (this.predicate) { - this._tryPredicate(value); + CombineLatestSubscriber.prototype._next = function (observable) { + this.values.push(NONE); + this.observables.push(observable); + }; + CombineLatestSubscriber.prototype._complete = function () { + var observables = this.observables; + var len = observables.length; + if (len === 0) { + this.destination.complete(); } else { - this.count++; + this.active = len; + this.toRespond = len; + for (var i = 0; i < len; i++) { + var observable = observables[i]; + this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["subscribeToResult"])(this, observable, observable, i)); + } } }; - CountSubscriber.prototype._tryPredicate = function (value) { + CombineLatestSubscriber.prototype.notifyComplete = function (unused) { + if ((this.active -= 1) === 0) { + this.destination.complete(); + } + }; + CombineLatestSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + var values = this.values; + var oldVal = values[outerIndex]; + var toRespond = !this.toRespond + ? 0 + : oldVal === NONE ? --this.toRespond : this.toRespond; + values[outerIndex] = innerValue; + if (toRespond === 0) { + if (this.resultSelector) { + this._tryResultSelector(values); + } + else { + this.destination.next(values.slice()); + } + } + }; + CombineLatestSubscriber.prototype._tryResultSelector = function (values) { var result; try { - result = this.predicate(value, this.index++, this.source); + result = this.resultSelector.apply(this, values); } catch (err) { this.destination.error(err); return; } - if (result) { - this.count++; - } + this.destination.next(result); }; - CountSubscriber.prototype._complete = function () { - this.destination.next(this.count); + return CombineLatestSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); + +//# sourceMappingURL=combineLatest.js.map + + +/***/ }), +/* 229 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "OuterSubscriber", function() { return OuterSubscriber; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ + + +var OuterSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](OuterSubscriber, _super); + function OuterSubscriber() { + return _super !== null && _super.apply(this, arguments) || this; + } + OuterSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.destination.next(innerValue); + }; + OuterSubscriber.prototype.notifyError = function (error, innerSub) { + this.destination.error(error); + }; + OuterSubscriber.prototype.notifyComplete = function (innerSub) { this.destination.complete(); }; - return CountSubscriber; + return OuterSubscriber; }(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=count.js.map + +//# sourceMappingURL=OuterSubscriber.js.map /***/ }), -/* 236 */ +/* 230 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "debounce", function() { return debounce; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(171); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(182); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeToResult", function() { return subscribeToResult; }); +/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(231); +/* harmony import */ var _subscribeTo__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(232); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(170); +/** PURE_IMPORTS_START _InnerSubscriber,_subscribeTo,_Observable PURE_IMPORTS_END */ -function debounce(durationSelector) { - return function (source) { return source.lift(new DebounceOperator(durationSelector)); }; -} -var DebounceOperator = /*@__PURE__*/ (function () { - function DebounceOperator(durationSelector) { - this.durationSelector = durationSelector; +function subscribeToResult(outerSubscriber, result, outerValue, outerIndex, destination) { + if (destination === void 0) { + destination = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_0__["InnerSubscriber"](outerSubscriber, outerValue, outerIndex); } - DebounceOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new DebounceSubscriber(subscriber, this.durationSelector)); - }; - return DebounceOperator; -}()); -var DebounceSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DebounceSubscriber, _super); - function DebounceSubscriber(destination, durationSelector) { - var _this = _super.call(this, destination) || this; - _this.durationSelector = durationSelector; - _this.hasValue = false; - _this.durationSubscription = null; - return _this; + if (destination.closed) { + return undefined; } - DebounceSubscriber.prototype._next = function (value) { - try { - var result = this.durationSelector.call(this, value); - if (result) { - this._tryNext(value, result); - } - } - catch (err) { - this.destination.error(err); - } - }; - DebounceSubscriber.prototype._complete = function () { - this.emitValue(); - this.destination.complete(); - }; - DebounceSubscriber.prototype._tryNext = function (value, duration) { - var subscription = this.durationSubscription; - this.value = value; - this.hasValue = true; - if (subscription) { - subscription.unsubscribe(); - this.remove(subscription); - } - subscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, duration); - if (subscription && !subscription.closed) { - this.add(this.durationSubscription = subscription); - } - }; - DebounceSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.emitValue(); - }; - DebounceSubscriber.prototype.notifyComplete = function () { - this.emitValue(); - }; - DebounceSubscriber.prototype.emitValue = function () { - if (this.hasValue) { - var value = this.value; - var subscription = this.durationSubscription; - if (subscription) { - this.durationSubscription = null; - subscription.unsubscribe(); - this.remove(subscription); - } - this.value = null; - this.hasValue = false; - _super.prototype._next.call(this, value); - } - }; - return DebounceSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=debounce.js.map + if (result instanceof _Observable__WEBPACK_IMPORTED_MODULE_2__["Observable"]) { + return result.subscribe(destination); + } + return Object(_subscribeTo__WEBPACK_IMPORTED_MODULE_1__["subscribeTo"])(result)(destination); +} +//# sourceMappingURL=subscribeToResult.js.map /***/ }), -/* 237 */ +/* 231 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "debounceTime", function() { return debounceTime; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "InnerSubscriber", function() { return InnerSubscriber; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); /* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(199); -/** PURE_IMPORTS_START tslib,_Subscriber,_scheduler_async PURE_IMPORTS_END */ - +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function debounceTime(dueTime, scheduler) { - if (scheduler === void 0) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_2__["async"]; - } - return function (source) { return source.lift(new DebounceTimeOperator(dueTime, scheduler)); }; -} -var DebounceTimeOperator = /*@__PURE__*/ (function () { - function DebounceTimeOperator(dueTime, scheduler) { - this.dueTime = dueTime; - this.scheduler = scheduler; - } - DebounceTimeOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new DebounceTimeSubscriber(subscriber, this.dueTime, this.scheduler)); - }; - return DebounceTimeOperator; -}()); -var DebounceTimeSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DebounceTimeSubscriber, _super); - function DebounceTimeSubscriber(destination, dueTime, scheduler) { - var _this = _super.call(this, destination) || this; - _this.dueTime = dueTime; - _this.scheduler = scheduler; - _this.debouncedSubscription = null; - _this.lastValue = null; - _this.hasValue = false; +var InnerSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](InnerSubscriber, _super); + function InnerSubscriber(parent, outerValue, outerIndex) { + var _this = _super.call(this) || this; + _this.parent = parent; + _this.outerValue = outerValue; + _this.outerIndex = outerIndex; + _this.index = 0; return _this; } - DebounceTimeSubscriber.prototype._next = function (value) { - this.clearDebounce(); - this.lastValue = value; - this.hasValue = true; - this.add(this.debouncedSubscription = this.scheduler.schedule(dispatchNext, this.dueTime, this)); - }; - DebounceTimeSubscriber.prototype._complete = function () { - this.debouncedNext(); - this.destination.complete(); + InnerSubscriber.prototype._next = function (value) { + this.parent.notifyNext(this.outerValue, value, this.outerIndex, this.index++, this); }; - DebounceTimeSubscriber.prototype.debouncedNext = function () { - this.clearDebounce(); - if (this.hasValue) { - var lastValue = this.lastValue; - this.lastValue = null; - this.hasValue = false; - this.destination.next(lastValue); - } + InnerSubscriber.prototype._error = function (error) { + this.parent.notifyError(error, this); + this.unsubscribe(); }; - DebounceTimeSubscriber.prototype.clearDebounce = function () { - var debouncedSubscription = this.debouncedSubscription; - if (debouncedSubscription !== null) { - this.remove(debouncedSubscription); - debouncedSubscription.unsubscribe(); - this.debouncedSubscription = null; - } + InnerSubscriber.prototype._complete = function () { + this.parent.notifyComplete(this); + this.unsubscribe(); }; - return DebounceTimeSubscriber; + return InnerSubscriber; }(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -function dispatchNext(subscriber) { - subscriber.debouncedNext(); -} -//# sourceMappingURL=debounceTime.js.map + +//# sourceMappingURL=InnerSubscriber.js.map /***/ }), -/* 238 */ +/* 232 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultIfEmpty", function() { return defaultIfEmpty; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeTo", function() { return subscribeTo; }); +/* harmony import */ var _subscribeToArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(207); +/* harmony import */ var _subscribeToPromise__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(233); +/* harmony import */ var _subscribeToIterable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(234); +/* harmony import */ var _subscribeToObservable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(236); +/* harmony import */ var _isArrayLike__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(237); +/* harmony import */ var _isPromise__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(238); +/* harmony import */ var _isObject__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(179); +/* harmony import */ var _symbol_iterator__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(235); +/* harmony import */ var _symbol_observable__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(183); +/** PURE_IMPORTS_START _subscribeToArray,_subscribeToPromise,_subscribeToIterable,_subscribeToObservable,_isArrayLike,_isPromise,_isObject,_symbol_iterator,_symbol_observable PURE_IMPORTS_END */ -function defaultIfEmpty(defaultValue) { - if (defaultValue === void 0) { - defaultValue = null; + + + + + + + +var subscribeTo = function (result) { + if (!!result && typeof result[_symbol_observable__WEBPACK_IMPORTED_MODULE_8__["observable"]] === 'function') { + return Object(_subscribeToObservable__WEBPACK_IMPORTED_MODULE_3__["subscribeToObservable"])(result); } - return function (source) { return source.lift(new DefaultIfEmptyOperator(defaultValue)); }; -} -var DefaultIfEmptyOperator = /*@__PURE__*/ (function () { - function DefaultIfEmptyOperator(defaultValue) { - this.defaultValue = defaultValue; + else if (Object(_isArrayLike__WEBPACK_IMPORTED_MODULE_4__["isArrayLike"])(result)) { + return Object(_subscribeToArray__WEBPACK_IMPORTED_MODULE_0__["subscribeToArray"])(result); } - DefaultIfEmptyOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new DefaultIfEmptySubscriber(subscriber, this.defaultValue)); - }; - return DefaultIfEmptyOperator; -}()); -var DefaultIfEmptySubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DefaultIfEmptySubscriber, _super); - function DefaultIfEmptySubscriber(destination, defaultValue) { - var _this = _super.call(this, destination) || this; - _this.defaultValue = defaultValue; - _this.isEmpty = true; - return _this; + else if (Object(_isPromise__WEBPACK_IMPORTED_MODULE_5__["isPromise"])(result)) { + return Object(_subscribeToPromise__WEBPACK_IMPORTED_MODULE_1__["subscribeToPromise"])(result); } - DefaultIfEmptySubscriber.prototype._next = function (value) { - this.isEmpty = false; - this.destination.next(value); - }; - DefaultIfEmptySubscriber.prototype._complete = function () { - if (this.isEmpty) { - this.destination.next(this.defaultValue); - } - this.destination.complete(); - }; - return DefaultIfEmptySubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=defaultIfEmpty.js.map + else if (!!result && typeof result[_symbol_iterator__WEBPACK_IMPORTED_MODULE_7__["iterator"]] === 'function') { + return Object(_subscribeToIterable__WEBPACK_IMPORTED_MODULE_2__["subscribeToIterable"])(result); + } + else { + var value = Object(_isObject__WEBPACK_IMPORTED_MODULE_6__["isObject"])(result) ? 'an invalid object' : "'" + result + "'"; + var msg = "You provided " + value + " where a stream was expected." + + ' You can provide an Observable, Promise, Array, or Iterable.'; + throw new TypeError(msg); + } +}; +//# sourceMappingURL=subscribeTo.js.map /***/ }), -/* 239 */ +/* 233 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __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__(36); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(199); -/* harmony import */ var _util_isDate__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(240); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(172); -/* harmony import */ var _Notification__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(241); -/** PURE_IMPORTS_START tslib,_scheduler_async,_util_isDate,_Subscriber,_Notification PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeToPromise", function() { return subscribeToPromise; }); +/* harmony import */ var _hostReportError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(176); +/** PURE_IMPORTS_START _hostReportError PURE_IMPORTS_END */ +var subscribeToPromise = function (promise) { + return function (subscriber) { + promise.then(function (value) { + if (!subscriber.closed) { + subscriber.next(value); + subscriber.complete(); + } + }, function (err) { return subscriber.error(err); }) + .then(null, _hostReportError__WEBPACK_IMPORTED_MODULE_0__["hostReportError"]); + return subscriber; + }; +}; +//# sourceMappingURL=subscribeToPromise.js.map +/***/ }), +/* 234 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeToIterable", function() { return subscribeToIterable; }); +/* harmony import */ var _symbol_iterator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(235); +/** PURE_IMPORTS_START _symbol_iterator PURE_IMPORTS_END */ -function delay(delay, scheduler) { - if (scheduler === void 0) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; - } - var absoluteDelay = Object(_util_isDate__WEBPACK_IMPORTED_MODULE_2__["isDate"])(delay); - var delayFor = absoluteDelay ? (+delay - scheduler.now()) : Math.abs(delay); - return function (source) { return source.lift(new DelayOperator(delayFor, scheduler)); }; -} -var DelayOperator = /*@__PURE__*/ (function () { - function DelayOperator(delay, scheduler) { - this.delay = delay; - this.scheduler = scheduler; - } - DelayOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new DelaySubscriber(subscriber, this.delay, this.scheduler)); - }; - return DelayOperator; -}()); -var DelaySubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DelaySubscriber, _super); - function DelaySubscriber(destination, delay, scheduler) { - var _this = _super.call(this, destination) || this; - _this.delay = delay; - _this.scheduler = scheduler; - _this.queue = []; - _this.active = false; - _this.errored = false; - return _this; - } - DelaySubscriber.dispatch = function (state) { - var source = state.source; - var queue = source.queue; - var scheduler = state.scheduler; - var destination = state.destination; - while (queue.length > 0 && (queue[0].time - scheduler.now()) <= 0) { - queue.shift().notification.observe(destination); - } - if (queue.length > 0) { - var delay_1 = Math.max(0, queue[0].time - scheduler.now()); - this.schedule(state, delay_1); - } - else { - this.unsubscribe(); - source.active = false; - } - }; - DelaySubscriber.prototype._schedule = function (scheduler) { - this.active = true; - var destination = this.destination; - destination.add(scheduler.schedule(DelaySubscriber.dispatch, this.delay, { - source: this, destination: this.destination, scheduler: scheduler - })); - }; - DelaySubscriber.prototype.scheduleNotification = function (notification) { - if (this.errored === true) { - return; - } - var scheduler = this.scheduler; - var message = new DelayMessage(scheduler.now() + this.delay, notification); - this.queue.push(message); - if (this.active === false) { - this._schedule(scheduler); +var subscribeToIterable = function (iterable) { + return function (subscriber) { + var iterator = iterable[_symbol_iterator__WEBPACK_IMPORTED_MODULE_0__["iterator"]](); + do { + var item = iterator.next(); + if (item.done) { + subscriber.complete(); + break; + } + subscriber.next(item.value); + if (subscriber.closed) { + break; + } + } while (true); + if (typeof iterator.return === 'function') { + subscriber.add(function () { + if (iterator.return) { + iterator.return(); + } + }); } + return subscriber; }; - DelaySubscriber.prototype._next = function (value) { - this.scheduleNotification(_Notification__WEBPACK_IMPORTED_MODULE_4__["Notification"].createNext(value)); - }; - DelaySubscriber.prototype._error = function (err) { - this.errored = true; - this.queue = []; - this.destination.error(err); - this.unsubscribe(); - }; - DelaySubscriber.prototype._complete = function () { - this.scheduleNotification(_Notification__WEBPACK_IMPORTED_MODULE_4__["Notification"].createComplete()); - this.unsubscribe(); - }; - return DelaySubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_3__["Subscriber"])); -var DelayMessage = /*@__PURE__*/ (function () { - function DelayMessage(time, notification) { - this.time = time; - this.notification = notification; - } - return DelayMessage; -}()); -//# sourceMappingURL=delay.js.map +}; +//# sourceMappingURL=subscribeToIterable.js.map /***/ }), -/* 240 */ +/* 235 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isDate", function() { return isDate; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "getSymbolIterator", function() { return getSymbolIterator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "iterator", function() { return iterator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "$$iterator", function() { return $$iterator; }); /** PURE_IMPORTS_START PURE_IMPORTS_END */ -function isDate(value) { - return value instanceof Date && !isNaN(+value); +function getSymbolIterator() { + if (typeof Symbol !== 'function' || !Symbol.iterator) { + return '@@iterator'; + } + return Symbol.iterator; } -//# sourceMappingURL=isDate.js.map +var iterator = /*@__PURE__*/ getSymbolIterator(); +var $$iterator = iterator; +//# sourceMappingURL=iterator.js.map /***/ }), -/* 241 */ +/* 236 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NotificationKind", function() { return NotificationKind; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Notification", function() { return Notification; }); -/* harmony import */ var _observable_empty__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(242); -/* harmony import */ var _observable_of__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(227); -/* harmony import */ var _observable_throwError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(243); -/** PURE_IMPORTS_START _observable_empty,_observable_of,_observable_throwError PURE_IMPORTS_END */ - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "subscribeToObservable", function() { return subscribeToObservable; }); +/* harmony import */ var _symbol_observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(183); +/** PURE_IMPORTS_START _symbol_observable PURE_IMPORTS_END */ -var NotificationKind; -/*@__PURE__*/ (function (NotificationKind) { - NotificationKind["NEXT"] = "N"; - NotificationKind["ERROR"] = "E"; - NotificationKind["COMPLETE"] = "C"; -})(NotificationKind || (NotificationKind = {})); -var Notification = /*@__PURE__*/ (function () { - function Notification(kind, value, error) { - this.kind = kind; - this.value = value; - this.error = error; - this.hasValue = kind === 'N'; - } - Notification.prototype.observe = function (observer) { - switch (this.kind) { - case 'N': - return observer.next && observer.next(this.value); - case 'E': - return observer.error && observer.error(this.error); - case 'C': - return observer.complete && observer.complete(); - } - }; - Notification.prototype.do = function (next, error, complete) { - var kind = this.kind; - switch (kind) { - case 'N': - return next && next(this.value); - case 'E': - return error && error(this.error); - case 'C': - return complete && complete(); - } - }; - Notification.prototype.accept = function (nextOrObserver, error, complete) { - if (nextOrObserver && typeof nextOrObserver.next === 'function') { - return this.observe(nextOrObserver); +var subscribeToObservable = function (obj) { + return function (subscriber) { + var obs = obj[_symbol_observable__WEBPACK_IMPORTED_MODULE_0__["observable"]](); + if (typeof obs.subscribe !== 'function') { + throw new TypeError('Provided object does not correctly implement Symbol.observable'); } else { - return this.do(nextOrObserver, error, complete); - } - }; - Notification.prototype.toObservable = function () { - var kind = this.kind; - switch (kind) { - case 'N': - return Object(_observable_of__WEBPACK_IMPORTED_MODULE_1__["of"])(this.value); - case 'E': - return Object(_observable_throwError__WEBPACK_IMPORTED_MODULE_2__["throwError"])(this.error); - case 'C': - return Object(_observable_empty__WEBPACK_IMPORTED_MODULE_0__["empty"])(); - } - throw new Error('unexpected notification kind value'); - }; - Notification.createNext = function (value) { - if (typeof value !== 'undefined') { - return new Notification('N', value); + return obs.subscribe(subscriber); } - return Notification.undefinedValueNotification; - }; - Notification.createError = function (err) { - return new Notification('E', undefined, err); - }; - Notification.createComplete = function () { - return Notification.completeNotification; }; - Notification.completeNotification = new Notification('C'); - Notification.undefinedValueNotification = new Notification('N', undefined); - return Notification; -}()); - -//# sourceMappingURL=Notification.js.map +}; +//# sourceMappingURL=subscribeToObservable.js.map /***/ }), -/* 242 */ +/* 237 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EMPTY", function() { return EMPTY; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "empty", function() { return empty; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(193); -/** PURE_IMPORTS_START _Observable PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isArrayLike", function() { return isArrayLike; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +var isArrayLike = (function (x) { return x && typeof x.length === 'number' && typeof x !== 'function'; }); +//# sourceMappingURL=isArrayLike.js.map -var EMPTY = /*@__PURE__*/ new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { return subscriber.complete(); }); -function empty(scheduler) { - return scheduler ? emptyScheduled(scheduler) : EMPTY; -} -function emptyScheduled(scheduler) { - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { return scheduler.schedule(function () { return subscriber.complete(); }); }); + +/***/ }), +/* 238 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isPromise", function() { return isPromise; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +function isPromise(value) { + return !!value && typeof value.subscribe !== 'function' && typeof value.then === 'function'; } -//# sourceMappingURL=empty.js.map +//# sourceMappingURL=isPromise.js.map /***/ }), -/* 243 */ +/* 239 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "throwError", function() { return throwError; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(193); -/** PURE_IMPORTS_START _Observable PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concat", function() { return concat; }); +/* harmony import */ var _of__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(204); +/* harmony import */ var _operators_concatAll__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(240); +/** PURE_IMPORTS_START _of,_operators_concatAll PURE_IMPORTS_END */ -function throwError(error, scheduler) { - if (!scheduler) { - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { return subscriber.error(error); }); - } - else { - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { return scheduler.schedule(dispatch, 0, { error: error, subscriber: subscriber }); }); + +function concat() { + var observables = []; + for (var _i = 0; _i < arguments.length; _i++) { + observables[_i] = arguments[_i]; } + return Object(_operators_concatAll__WEBPACK_IMPORTED_MODULE_1__["concatAll"])()(_of__WEBPACK_IMPORTED_MODULE_0__["of"].apply(void 0, observables)); } -function dispatch(_a) { - var error = _a.error, subscriber = _a.subscriber; - subscriber.error(error); -} -//# sourceMappingURL=throwError.js.map +//# sourceMappingURL=concat.js.map /***/ }), -/* 244 */ +/* 240 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "delayWhen", function() { return delayWhen; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concatAll", function() { return concatAll; }); +/* harmony import */ var _mergeAll__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(241); +/** PURE_IMPORTS_START _mergeAll PURE_IMPORTS_END */ + +function concatAll() { + return Object(_mergeAll__WEBPACK_IMPORTED_MODULE_0__["mergeAll"])(1); +} +//# sourceMappingURL=concatAll.js.map + + +/***/ }), +/* 241 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mergeAll", function() { return mergeAll; }); +/* harmony import */ var _mergeMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(242); +/* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(220); +/** PURE_IMPORTS_START _mergeMap,_util_identity PURE_IMPORTS_END */ + + +function mergeAll(concurrent) { + if (concurrent === void 0) { + concurrent = Number.POSITIVE_INFINITY; + } + return Object(_mergeMap__WEBPACK_IMPORTED_MODULE_0__["mergeMap"])(_util_identity__WEBPACK_IMPORTED_MODULE_1__["identity"], concurrent); +} +//# sourceMappingURL=mergeAll.js.map + + +/***/ }), +/* 242 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mergeMap", function() { return mergeMap; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MergeMapOperator", function() { return MergeMapOperator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MergeMapSubscriber", function() { return MergeMapSubscriber; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(193); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(171); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(182); -/** PURE_IMPORTS_START tslib,_Subscriber,_Observable,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(230); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(229); +/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(231); +/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(226); +/* harmony import */ var _observable_from__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(243); +/** PURE_IMPORTS_START tslib,_util_subscribeToResult,_OuterSubscriber,_InnerSubscriber,_map,_observable_from PURE_IMPORTS_END */ -function delayWhen(delayDurationSelector, subscriptionDelay) { - if (subscriptionDelay) { - return function (source) { - return new SubscriptionDelayObservable(source, subscriptionDelay) - .lift(new DelayWhenOperator(delayDurationSelector)); - }; + +function mergeMap(project, resultSelector, concurrent) { + if (concurrent === void 0) { + concurrent = Number.POSITIVE_INFINITY; } - return function (source) { return source.lift(new DelayWhenOperator(delayDurationSelector)); }; + if (typeof resultSelector === 'function') { + return function (source) { return source.pipe(mergeMap(function (a, i) { return Object(_observable_from__WEBPACK_IMPORTED_MODULE_5__["from"])(project(a, i)).pipe(Object(_map__WEBPACK_IMPORTED_MODULE_4__["map"])(function (b, ii) { return resultSelector(a, b, i, ii); })); }, concurrent)); }; + } + else if (typeof resultSelector === 'number') { + concurrent = resultSelector; + } + return function (source) { return source.lift(new MergeMapOperator(project, concurrent)); }; } -var DelayWhenOperator = /*@__PURE__*/ (function () { - function DelayWhenOperator(delayDurationSelector) { - this.delayDurationSelector = delayDurationSelector; +var MergeMapOperator = /*@__PURE__*/ (function () { + function MergeMapOperator(project, concurrent) { + if (concurrent === void 0) { + concurrent = Number.POSITIVE_INFINITY; + } + this.project = project; + this.concurrent = concurrent; } - DelayWhenOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new DelayWhenSubscriber(subscriber, this.delayDurationSelector)); + MergeMapOperator.prototype.call = function (observer, source) { + return source.subscribe(new MergeMapSubscriber(observer, this.project, this.concurrent)); }; - return DelayWhenOperator; + return MergeMapOperator; }()); -var DelayWhenSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DelayWhenSubscriber, _super); - function DelayWhenSubscriber(destination, delayDurationSelector) { + +var MergeMapSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](MergeMapSubscriber, _super); + function MergeMapSubscriber(destination, project, concurrent) { + if (concurrent === void 0) { + concurrent = Number.POSITIVE_INFINITY; + } var _this = _super.call(this, destination) || this; - _this.delayDurationSelector = delayDurationSelector; - _this.completed = false; - _this.delayNotifierSubscriptions = []; + _this.project = project; + _this.concurrent = concurrent; + _this.hasCompleted = false; + _this.buffer = []; + _this.active = 0; _this.index = 0; return _this; } - DelayWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.destination.next(outerValue); - this.removeSubscription(innerSub); - this.tryComplete(); - }; - DelayWhenSubscriber.prototype.notifyError = function (error, innerSub) { - this._error(error); - }; - DelayWhenSubscriber.prototype.notifyComplete = function (innerSub) { - var value = this.removeSubscription(innerSub); - if (value) { - this.destination.next(value); + MergeMapSubscriber.prototype._next = function (value) { + if (this.active < this.concurrent) { + this._tryNext(value); + } + else { + this.buffer.push(value); } - this.tryComplete(); }; - DelayWhenSubscriber.prototype._next = function (value) { + MergeMapSubscriber.prototype._tryNext = function (value) { + var result; var index = this.index++; try { - var delayNotifier = this.delayDurationSelector(value, index); - if (delayNotifier) { - this.tryDelay(delayNotifier, value); - } + result = this.project(value, index); } catch (err) { this.destination.error(err); + return; } + this.active++; + this._innerSub(result, value, index); }; - DelayWhenSubscriber.prototype._complete = function () { - this.completed = true; - this.tryComplete(); - this.unsubscribe(); - }; - DelayWhenSubscriber.prototype.removeSubscription = function (subscription) { - subscription.unsubscribe(); - var subscriptionIdx = this.delayNotifierSubscriptions.indexOf(subscription); - if (subscriptionIdx !== -1) { - this.delayNotifierSubscriptions.splice(subscriptionIdx, 1); - } - return subscription.outerValue; - }; - DelayWhenSubscriber.prototype.tryDelay = function (delayNotifier, value) { - var notifierSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["subscribeToResult"])(this, delayNotifier, value); - if (notifierSubscription && !notifierSubscription.closed) { - var destination = this.destination; - destination.add(notifierSubscription); - this.delayNotifierSubscriptions.push(notifierSubscription); - } + MergeMapSubscriber.prototype._innerSub = function (ish, value, index) { + var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_3__["InnerSubscriber"](this, undefined, undefined); + var destination = this.destination; + destination.add(innerSubscriber); + Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_1__["subscribeToResult"])(this, ish, value, index, innerSubscriber); }; - DelayWhenSubscriber.prototype.tryComplete = function () { - if (this.completed && this.delayNotifierSubscriptions.length === 0) { + MergeMapSubscriber.prototype._complete = function () { + this.hasCompleted = true; + if (this.active === 0 && this.buffer.length === 0) { this.destination.complete(); } - }; - return DelayWhenSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); -var SubscriptionDelayObservable = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SubscriptionDelayObservable, _super); - function SubscriptionDelayObservable(source, subscriptionDelay) { - var _this = _super.call(this) || this; - _this.source = source; - _this.subscriptionDelay = subscriptionDelay; - return _this; - } - SubscriptionDelayObservable.prototype._subscribe = function (subscriber) { - this.subscriptionDelay.subscribe(new SubscriptionDelaySubscriber(subscriber, this.source)); - }; - return SubscriptionDelayObservable; -}(_Observable__WEBPACK_IMPORTED_MODULE_2__["Observable"])); -var SubscriptionDelaySubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SubscriptionDelaySubscriber, _super); - function SubscriptionDelaySubscriber(parent, source) { - var _this = _super.call(this) || this; - _this.parent = parent; - _this.source = source; - _this.sourceSubscribed = false; - return _this; - } - SubscriptionDelaySubscriber.prototype._next = function (unused) { - this.subscribeToSource(); - }; - SubscriptionDelaySubscriber.prototype._error = function (err) { this.unsubscribe(); - this.parent.error(err); }; - SubscriptionDelaySubscriber.prototype._complete = function () { - this.unsubscribe(); - this.subscribeToSource(); + MergeMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.destination.next(innerValue); }; - SubscriptionDelaySubscriber.prototype.subscribeToSource = function () { - if (!this.sourceSubscribed) { - this.sourceSubscribed = true; - this.unsubscribe(); - this.source.subscribe(this.parent); + MergeMapSubscriber.prototype.notifyComplete = function (innerSub) { + var buffer = this.buffer; + this.remove(innerSub); + this.active--; + if (buffer.length > 0) { + this._next(buffer.shift()); + } + else if (this.active === 0 && this.hasCompleted) { + this.destination.complete(); } }; - return SubscriptionDelaySubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=delayWhen.js.map + return MergeMapSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); + +//# sourceMappingURL=mergeMap.js.map /***/ }), -/* 245 */ +/* 243 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dematerialize", function() { return dematerialize; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "from", function() { return from; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); +/* harmony import */ var _util_subscribeTo__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(232); +/* harmony import */ var _scheduled_scheduled__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(244); +/** PURE_IMPORTS_START _Observable,_util_subscribeTo,_scheduled_scheduled PURE_IMPORTS_END */ -function dematerialize() { - return function dematerializeOperatorFunction(source) { - return source.lift(new DeMaterializeOperator()); - }; -} -var DeMaterializeOperator = /*@__PURE__*/ (function () { - function DeMaterializeOperator() { + +function from(input, scheduler) { + if (!scheduler) { + if (input instanceof _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"]) { + return input; + } + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](Object(_util_subscribeTo__WEBPACK_IMPORTED_MODULE_1__["subscribeTo"])(input)); } - DeMaterializeOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new DeMaterializeSubscriber(subscriber)); - }; - return DeMaterializeOperator; -}()); -var DeMaterializeSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DeMaterializeSubscriber, _super); - function DeMaterializeSubscriber(destination) { - return _super.call(this, destination) || this; + else { + return Object(_scheduled_scheduled__WEBPACK_IMPORTED_MODULE_2__["scheduled"])(input, scheduler); } - DeMaterializeSubscriber.prototype._next = function (value) { - value.observe(this.destination); - }; - return DeMaterializeSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=dematerialize.js.map +} +//# sourceMappingURL=from.js.map /***/ }), -/* 246 */ +/* 244 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "distinct", function() { return distinct; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DistinctSubscriber", function() { return DistinctSubscriber; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(171); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(182); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheduled", function() { return scheduled; }); +/* harmony import */ var _scheduleObservable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(245); +/* harmony import */ var _schedulePromise__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(246); +/* harmony import */ var _scheduleArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(208); +/* harmony import */ var _scheduleIterable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(247); +/* harmony import */ var _util_isInteropObservable__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(248); +/* harmony import */ var _util_isPromise__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(238); +/* harmony import */ var _util_isArrayLike__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(237); +/* harmony import */ var _util_isIterable__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(249); +/** PURE_IMPORTS_START _scheduleObservable,_schedulePromise,_scheduleArray,_scheduleIterable,_util_isInteropObservable,_util_isPromise,_util_isArrayLike,_util_isIterable PURE_IMPORTS_END */ -function distinct(keySelector, flushes) { - return function (source) { return source.lift(new DistinctOperator(keySelector, flushes)); }; -} -var DistinctOperator = /*@__PURE__*/ (function () { - function DistinctOperator(keySelector, flushes) { - this.keySelector = keySelector; - this.flushes = flushes; - } - DistinctOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new DistinctSubscriber(subscriber, this.keySelector, this.flushes)); - }; - return DistinctOperator; -}()); -var DistinctSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DistinctSubscriber, _super); - function DistinctSubscriber(destination, keySelector, flushes) { - var _this = _super.call(this, destination) || this; - _this.keySelector = keySelector; - _this.values = new Set(); - if (flushes) { - _this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(_this, flushes)); - } - return _this; - } - DistinctSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.values.clear(); - }; - DistinctSubscriber.prototype.notifyError = function (error, innerSub) { - this._error(error); - }; - DistinctSubscriber.prototype._next = function (value) { - if (this.keySelector) { - this._useKeySelector(value); - } - else { - this._finalizeNext(value, value); + + + + + +function scheduled(input, scheduler) { + if (input != null) { + if (Object(_util_isInteropObservable__WEBPACK_IMPORTED_MODULE_4__["isInteropObservable"])(input)) { + return Object(_scheduleObservable__WEBPACK_IMPORTED_MODULE_0__["scheduleObservable"])(input, scheduler); } - }; - DistinctSubscriber.prototype._useKeySelector = function (value) { - var key; - var destination = this.destination; - try { - key = this.keySelector(value); + else if (Object(_util_isPromise__WEBPACK_IMPORTED_MODULE_5__["isPromise"])(input)) { + return Object(_schedulePromise__WEBPACK_IMPORTED_MODULE_1__["schedulePromise"])(input, scheduler); } - catch (err) { - destination.error(err); - return; + else if (Object(_util_isArrayLike__WEBPACK_IMPORTED_MODULE_6__["isArrayLike"])(input)) { + return Object(_scheduleArray__WEBPACK_IMPORTED_MODULE_2__["scheduleArray"])(input, scheduler); } - this._finalizeNext(key, value); - }; - DistinctSubscriber.prototype._finalizeNext = function (key, value) { - var values = this.values; - if (!values.has(key)) { - values.add(key); - this.destination.next(value); + else if (Object(_util_isIterable__WEBPACK_IMPORTED_MODULE_7__["isIterable"])(input) || typeof input === 'string') { + return Object(_scheduleIterable__WEBPACK_IMPORTED_MODULE_3__["scheduleIterable"])(input, scheduler); } - }; - return DistinctSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); - -//# sourceMappingURL=distinct.js.map + } + throw new TypeError((input !== null && typeof input || input) + ' is not observable'); +} +//# sourceMappingURL=scheduled.js.map /***/ }), -/* 247 */ +/* 245 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "distinctUntilChanged", function() { return distinctUntilChanged; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheduleObservable", function() { return scheduleObservable; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(177); +/* harmony import */ var _symbol_observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(183); +/** PURE_IMPORTS_START _Observable,_Subscription,_symbol_observable PURE_IMPORTS_END */ -function distinctUntilChanged(compare, keySelector) { - return function (source) { return source.lift(new DistinctUntilChangedOperator(compare, keySelector)); }; + +function scheduleObservable(input, scheduler) { + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var sub = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); + sub.add(scheduler.schedule(function () { + var observable = input[_symbol_observable__WEBPACK_IMPORTED_MODULE_2__["observable"]](); + sub.add(observable.subscribe({ + next: function (value) { sub.add(scheduler.schedule(function () { return subscriber.next(value); })); }, + error: function (err) { sub.add(scheduler.schedule(function () { return subscriber.error(err); })); }, + complete: function () { sub.add(scheduler.schedule(function () { return subscriber.complete(); })); }, + })); + })); + return sub; + }); } -var DistinctUntilChangedOperator = /*@__PURE__*/ (function () { - function DistinctUntilChangedOperator(compare, keySelector) { - this.compare = compare; - this.keySelector = keySelector; - } - DistinctUntilChangedOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new DistinctUntilChangedSubscriber(subscriber, this.compare, this.keySelector)); - }; - return DistinctUntilChangedOperator; -}()); -var DistinctUntilChangedSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DistinctUntilChangedSubscriber, _super); - function DistinctUntilChangedSubscriber(destination, compare, keySelector) { - var _this = _super.call(this, destination) || this; - _this.keySelector = keySelector; - _this.hasKey = false; - if (typeof compare === 'function') { - _this.compare = compare; - } - return _this; - } - DistinctUntilChangedSubscriber.prototype.compare = function (x, y) { - return x === y; - }; - DistinctUntilChangedSubscriber.prototype._next = function (value) { - var key; - try { - var keySelector = this.keySelector; - key = keySelector ? keySelector(value) : value; - } - catch (err) { - return this.destination.error(err); - } - var result = false; - if (this.hasKey) { - try { - var compare = this.compare; - result = compare(this.key, key); - } - catch (err) { - return this.destination.error(err); - } - } - else { - this.hasKey = true; - } - if (!result) { - this.key = key; - this.destination.next(value); - } - }; - return DistinctUntilChangedSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=distinctUntilChanged.js.map +//# sourceMappingURL=scheduleObservable.js.map /***/ }), -/* 248 */ +/* 246 */ /***/ (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__(247); -/** PURE_IMPORTS_START _distinctUntilChanged PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "schedulePromise", function() { return schedulePromise; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(177); +/** PURE_IMPORTS_START _Observable,_Subscription PURE_IMPORTS_END */ -function distinctUntilKeyChanged(key, compare) { - return Object(_distinctUntilChanged__WEBPACK_IMPORTED_MODULE_0__["distinctUntilChanged"])(function (x, y) { return compare ? compare(x[key], y[key]) : x[key] === y[key]; }); + +function schedulePromise(input, scheduler) { + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var sub = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); + sub.add(scheduler.schedule(function () { + return input.then(function (value) { + sub.add(scheduler.schedule(function () { + subscriber.next(value); + sub.add(scheduler.schedule(function () { return subscriber.complete(); })); + })); + }, function (err) { + sub.add(scheduler.schedule(function () { return subscriber.error(err); })); + }); + })); + return sub; + }); } -//# sourceMappingURL=distinctUntilKeyChanged.js.map +//# sourceMappingURL=schedulePromise.js.map /***/ }), -/* 249 */ +/* 247 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __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__(250); -/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(251); -/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(252); -/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(238); -/* harmony import */ var _take__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(254); -/** PURE_IMPORTS_START _util_ArgumentOutOfRangeError,_filter,_throwIfEmpty,_defaultIfEmpty,_take PURE_IMPORTS_END */ - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scheduleIterable", function() { return scheduleIterable; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(177); +/* harmony import */ var _symbol_iterator__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(235); +/** PURE_IMPORTS_START _Observable,_Subscription,_symbol_iterator PURE_IMPORTS_END */ -function elementAt(index, defaultValue) { - if (index < 0) { - throw new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_0__["ArgumentOutOfRangeError"](); +function scheduleIterable(input, scheduler) { + if (!input) { + throw new Error('Iterable cannot be null'); } - var hasDefaultValue = arguments.length >= 2; - return function (source) { - return source.pipe(Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(function (v, i) { return i === index; }), Object(_take__WEBPACK_IMPORTED_MODULE_4__["take"])(1), hasDefaultValue - ? Object(_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__["defaultIfEmpty"])(defaultValue) - : Object(_throwIfEmpty__WEBPACK_IMPORTED_MODULE_2__["throwIfEmpty"])(function () { return new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_0__["ArgumentOutOfRangeError"](); })); - }; + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var sub = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); + var iterator; + sub.add(function () { + if (iterator && typeof iterator.return === 'function') { + iterator.return(); + } + }); + sub.add(scheduler.schedule(function () { + iterator = input[_symbol_iterator__WEBPACK_IMPORTED_MODULE_2__["iterator"]](); + sub.add(scheduler.schedule(function () { + if (subscriber.closed) { + return; + } + var value; + var done; + try { + var result = iterator.next(); + value = result.value; + done = result.done; + } + catch (err) { + subscriber.error(err); + return; + } + if (done) { + subscriber.complete(); + } + else { + subscriber.next(value); + this.schedule(); + } + })); + })); + return sub; + }); } -//# sourceMappingURL=elementAt.js.map +//# sourceMappingURL=scheduleIterable.js.map /***/ }), -/* 250 */ +/* 248 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ArgumentOutOfRangeError", function() { return ArgumentOutOfRangeError; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -var ArgumentOutOfRangeErrorImpl = /*@__PURE__*/ (function () { - function ArgumentOutOfRangeErrorImpl() { - Error.call(this); - this.message = 'argument out of range'; - this.name = 'ArgumentOutOfRangeError'; - return this; - } - ArgumentOutOfRangeErrorImpl.prototype = /*@__PURE__*/ Object.create(Error.prototype); - return ArgumentOutOfRangeErrorImpl; -})(); -var ArgumentOutOfRangeError = ArgumentOutOfRangeErrorImpl; -//# sourceMappingURL=ArgumentOutOfRangeError.js.map +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isInteropObservable", function() { return isInteropObservable; }); +/* harmony import */ var _symbol_observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(183); +/** PURE_IMPORTS_START _symbol_observable PURE_IMPORTS_END */ + +function isInteropObservable(input) { + return input && typeof input[_symbol_observable__WEBPACK_IMPORTED_MODULE_0__["observable"]] === 'function'; +} +//# sourceMappingURL=isInteropObservable.js.map /***/ }), -/* 251 */ +/* 249 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "filter", function() { return filter; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isIterable", function() { return isIterable; }); +/* harmony import */ var _symbol_iterator__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(235); +/** PURE_IMPORTS_START _symbol_iterator PURE_IMPORTS_END */ -function filter(predicate, thisArg) { - return function filterOperatorFunction(source) { - return source.lift(new FilterOperator(predicate, thisArg)); - }; +function isIterable(input) { + return input && typeof input[_symbol_iterator__WEBPACK_IMPORTED_MODULE_0__["iterator"]] === 'function'; } -var FilterOperator = /*@__PURE__*/ (function () { - function FilterOperator(predicate, thisArg) { - this.predicate = predicate; - this.thisArg = thisArg; - } - FilterOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new FilterSubscriber(subscriber, this.predicate, this.thisArg)); - }; - return FilterOperator; -}()); -var FilterSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](FilterSubscriber, _super); - function FilterSubscriber(destination, predicate, thisArg) { - var _this = _super.call(this, destination) || this; - _this.predicate = predicate; - _this.thisArg = thisArg; - _this.count = 0; - return _this; - } - FilterSubscriber.prototype._next = function (value) { - var result; +//# sourceMappingURL=isIterable.js.map + + +/***/ }), +/* 250 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defer", function() { return defer; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); +/* harmony import */ var _from__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(243); +/* harmony import */ var _empty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(203); +/** PURE_IMPORTS_START _Observable,_from,_empty PURE_IMPORTS_END */ + + + +function defer(observableFactory) { + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var input; try { - result = this.predicate.call(this.thisArg, value, this.count++); + input = observableFactory(); } catch (err) { - this.destination.error(err); + subscriber.error(err); + return undefined; + } + var source = input ? Object(_from__WEBPACK_IMPORTED_MODULE_1__["from"])(input) : Object(_empty__WEBPACK_IMPORTED_MODULE_2__["empty"])(); + return source.subscribe(subscriber); + }); +} +//# sourceMappingURL=defer.js.map + + +/***/ }), +/* 251 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "forkJoin", function() { return forkJoin; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); +/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(178); +/* harmony import */ var _operators_map__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(226); +/* harmony import */ var _util_isObject__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(179); +/* harmony import */ var _from__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(243); +/** PURE_IMPORTS_START _Observable,_util_isArray,_operators_map,_util_isObject,_from PURE_IMPORTS_END */ + + + + + +function forkJoin() { + var sources = []; + for (var _i = 0; _i < arguments.length; _i++) { + sources[_i] = arguments[_i]; + } + if (sources.length === 1) { + var first_1 = sources[0]; + if (Object(_util_isArray__WEBPACK_IMPORTED_MODULE_1__["isArray"])(first_1)) { + return forkJoinInternal(first_1, null); + } + if (Object(_util_isObject__WEBPACK_IMPORTED_MODULE_3__["isObject"])(first_1) && Object.getPrototypeOf(first_1) === Object.prototype) { + var keys = Object.keys(first_1); + return forkJoinInternal(keys.map(function (key) { return first_1[key]; }), keys); + } + } + if (typeof sources[sources.length - 1] === 'function') { + var resultSelector_1 = sources.pop(); + sources = (sources.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_1__["isArray"])(sources[0])) ? sources[0] : sources; + return forkJoinInternal(sources, null).pipe(Object(_operators_map__WEBPACK_IMPORTED_MODULE_2__["map"])(function (args) { return resultSelector_1.apply(void 0, args); })); + } + return forkJoinInternal(sources, null); +} +function forkJoinInternal(sources, keys) { + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var len = sources.length; + if (len === 0) { + subscriber.complete(); return; } - if (result) { - this.destination.next(value); + var values = new Array(len); + var completed = 0; + var emitted = 0; + var _loop_1 = function (i) { + var source = Object(_from__WEBPACK_IMPORTED_MODULE_4__["from"])(sources[i]); + var hasValue = false; + subscriber.add(source.subscribe({ + next: function (value) { + if (!hasValue) { + hasValue = true; + emitted++; + } + values[i] = value; + }, + error: function (err) { return subscriber.error(err); }, + complete: function () { + completed++; + if (completed === len || !hasValue) { + if (emitted === len) { + subscriber.next(keys ? + keys.reduce(function (result, key, i) { return (result[key] = values[i], result); }, {}) : + values); + } + subscriber.complete(); + } + } + })); + }; + for (var i = 0; i < len; i++) { + _loop_1(i); } - }; - return FilterSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=filter.js.map + }); +} +//# sourceMappingURL=forkJoin.js.map /***/ }), @@ -26273,64 +26272,74 @@ var FilterSubscriber = /*@__PURE__*/ (function (_super) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "throwIfEmpty", function() { return throwIfEmpty; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _util_EmptyError__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(253); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_util_EmptyError,_Subscriber PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fromEvent", function() { return fromEvent; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); +/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(178); +/* harmony import */ var _util_isFunction__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(173); +/* harmony import */ var _operators_map__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(226); +/** PURE_IMPORTS_START _Observable,_util_isArray,_util_isFunction,_operators_map PURE_IMPORTS_END */ -function throwIfEmpty(errorFactory) { - if (errorFactory === void 0) { - errorFactory = defaultErrorFactory; - } - return function (source) { - return source.lift(new ThrowIfEmptyOperator(errorFactory)); - }; -} -var ThrowIfEmptyOperator = /*@__PURE__*/ (function () { - function ThrowIfEmptyOperator(errorFactory) { - this.errorFactory = errorFactory; + +var toString = /*@__PURE__*/ (function () { return Object.prototype.toString; })(); +function fromEvent(target, eventName, options, resultSelector) { + if (Object(_util_isFunction__WEBPACK_IMPORTED_MODULE_2__["isFunction"])(options)) { + resultSelector = options; + options = undefined; } - ThrowIfEmptyOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new ThrowIfEmptySubscriber(subscriber, this.errorFactory)); - }; - return ThrowIfEmptyOperator; -}()); -var ThrowIfEmptySubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ThrowIfEmptySubscriber, _super); - function ThrowIfEmptySubscriber(destination, errorFactory) { - var _this = _super.call(this, destination) || this; - _this.errorFactory = errorFactory; - _this.hasValue = false; - return _this; + if (resultSelector) { + return fromEvent(target, eventName, options).pipe(Object(_operators_map__WEBPACK_IMPORTED_MODULE_3__["map"])(function (args) { return Object(_util_isArray__WEBPACK_IMPORTED_MODULE_1__["isArray"])(args) ? resultSelector.apply(void 0, args) : resultSelector(args); })); } - ThrowIfEmptySubscriber.prototype._next = function (value) { - this.hasValue = true; - this.destination.next(value); - }; - ThrowIfEmptySubscriber.prototype._complete = function () { - if (!this.hasValue) { - var err = void 0; - try { - err = this.errorFactory(); + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + function handler(e) { + if (arguments.length > 1) { + subscriber.next(Array.prototype.slice.call(arguments)); } - catch (e) { - err = e; + else { + subscriber.next(e); } - this.destination.error(err); } - else { - return this.destination.complete(); + setupSubscription(target, eventName, handler, subscriber, options); + }); +} +function setupSubscription(sourceObj, eventName, handler, subscriber, options) { + var unsubscribe; + if (isEventTarget(sourceObj)) { + var source_1 = sourceObj; + sourceObj.addEventListener(eventName, handler, options); + unsubscribe = function () { return source_1.removeEventListener(eventName, handler, options); }; + } + else if (isJQueryStyleEventEmitter(sourceObj)) { + var source_2 = sourceObj; + sourceObj.on(eventName, handler); + unsubscribe = function () { return source_2.off(eventName, handler); }; + } + else if (isNodeStyleEventEmitter(sourceObj)) { + var source_3 = sourceObj; + sourceObj.addListener(eventName, handler); + unsubscribe = function () { return source_3.removeListener(eventName, handler); }; + } + else if (sourceObj && sourceObj.length) { + for (var i = 0, len = sourceObj.length; i < len; i++) { + setupSubscription(sourceObj[i], eventName, handler, subscriber, options); } - }; - return ThrowIfEmptySubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_2__["Subscriber"])); -function defaultErrorFactory() { - return new _util_EmptyError__WEBPACK_IMPORTED_MODULE_1__["EmptyError"](); + } + else { + throw new TypeError('Invalid event target'); + } + subscriber.add(unsubscribe); } -//# sourceMappingURL=throwIfEmpty.js.map +function isNodeStyleEventEmitter(sourceObj) { + return sourceObj && typeof sourceObj.addListener === 'function' && typeof sourceObj.removeListener === 'function'; +} +function isJQueryStyleEventEmitter(sourceObj) { + return sourceObj && typeof sourceObj.on === 'function' && typeof sourceObj.off === 'function'; +} +function isEventTarget(sourceObj) { + return sourceObj && typeof sourceObj.addEventListener === 'function' && typeof sourceObj.removeEventListener === 'function'; +} +//# sourceMappingURL=fromEvent.js.map /***/ }), @@ -26339,20 +26348,43 @@ function defaultErrorFactory() { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "EmptyError", function() { return EmptyError; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -var EmptyErrorImpl = /*@__PURE__*/ (function () { - function EmptyErrorImpl() { - Error.call(this); - this.message = 'no elements in sequence'; - this.name = 'EmptyError'; - return this; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fromEventPattern", function() { return fromEventPattern; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); +/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(178); +/* harmony import */ var _util_isFunction__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(173); +/* harmony import */ var _operators_map__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(226); +/** PURE_IMPORTS_START _Observable,_util_isArray,_util_isFunction,_operators_map PURE_IMPORTS_END */ + + + + +function fromEventPattern(addHandler, removeHandler, resultSelector) { + if (resultSelector) { + return fromEventPattern(addHandler, removeHandler).pipe(Object(_operators_map__WEBPACK_IMPORTED_MODULE_3__["map"])(function (args) { return Object(_util_isArray__WEBPACK_IMPORTED_MODULE_1__["isArray"])(args) ? resultSelector.apply(void 0, args) : resultSelector(args); })); } - EmptyErrorImpl.prototype = /*@__PURE__*/ Object.create(Error.prototype); - return EmptyErrorImpl; -})(); -var EmptyError = EmptyErrorImpl; -//# sourceMappingURL=EmptyError.js.map + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var handler = function () { + var e = []; + for (var _i = 0; _i < arguments.length; _i++) { + e[_i] = arguments[_i]; + } + return subscriber.next(e.length === 1 ? e[0] : e); + }; + var retValue; + try { + retValue = addHandler(handler); + } + catch (err) { + subscriber.error(err); + return undefined; + } + if (!Object(_util_isFunction__WEBPACK_IMPORTED_MODULE_2__["isFunction"])(removeHandler)) { + return undefined; + } + return function () { return removeHandler(handler, retValue); }; + }); +} +//# sourceMappingURL=fromEventPattern.js.map /***/ }), @@ -26361,60 +26393,135 @@ var EmptyError = EmptyErrorImpl; "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "take", function() { return take; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(250); -/* harmony import */ var _observable_empty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(242); -/** PURE_IMPORTS_START tslib,_Subscriber,_util_ArgumentOutOfRangeError,_observable_empty PURE_IMPORTS_END */ - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "generate", function() { return generate; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); +/* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(220); +/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(205); +/** PURE_IMPORTS_START _Observable,_util_identity,_util_isScheduler PURE_IMPORTS_END */ -function take(count) { - return function (source) { - if (count === 0) { - return Object(_observable_empty__WEBPACK_IMPORTED_MODULE_3__["empty"])(); - } - else { - return source.lift(new TakeOperator(count)); +function generate(initialStateOrOptions, condition, iterate, resultSelectorOrObservable, scheduler) { + var resultSelector; + var initialState; + if (arguments.length == 1) { + var options = initialStateOrOptions; + initialState = options.initialState; + condition = options.condition; + iterate = options.iterate; + resultSelector = options.resultSelector || _util_identity__WEBPACK_IMPORTED_MODULE_1__["identity"]; + scheduler = options.scheduler; + } + else if (resultSelectorOrObservable === undefined || Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_2__["isScheduler"])(resultSelectorOrObservable)) { + initialState = initialStateOrOptions; + resultSelector = _util_identity__WEBPACK_IMPORTED_MODULE_1__["identity"]; + scheduler = resultSelectorOrObservable; + } + else { + initialState = initialStateOrOptions; + resultSelector = resultSelectorOrObservable; + } + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var state = initialState; + if (scheduler) { + return scheduler.schedule(dispatch, 0, { + subscriber: subscriber, + iterate: iterate, + condition: condition, + resultSelector: resultSelector, + state: state + }); } - }; + do { + if (condition) { + var conditionResult = void 0; + try { + conditionResult = condition(state); + } + catch (err) { + subscriber.error(err); + return undefined; + } + if (!conditionResult) { + subscriber.complete(); + break; + } + } + var value = void 0; + try { + value = resultSelector(state); + } + catch (err) { + subscriber.error(err); + return undefined; + } + subscriber.next(value); + if (subscriber.closed) { + break; + } + try { + state = iterate(state); + } + catch (err) { + subscriber.error(err); + return undefined; + } + } while (true); + return undefined; + }); } -var TakeOperator = /*@__PURE__*/ (function () { - function TakeOperator(total) { - this.total = total; - if (this.total < 0) { - throw new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__["ArgumentOutOfRangeError"]; +function dispatch(state) { + var subscriber = state.subscriber, condition = state.condition; + if (subscriber.closed) { + return undefined; + } + if (state.needIterate) { + try { + state.state = state.iterate(state.state); + } + catch (err) { + subscriber.error(err); + return undefined; } } - TakeOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new TakeSubscriber(subscriber, this.total)); - }; - return TakeOperator; -}()); -var TakeSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TakeSubscriber, _super); - function TakeSubscriber(destination, total) { - var _this = _super.call(this, destination) || this; - _this.total = total; - _this.count = 0; - return _this; + else { + state.needIterate = true; } - TakeSubscriber.prototype._next = function (value) { - var total = this.total; - var count = ++this.count; - if (count <= total) { - this.destination.next(value); - if (count === total) { - this.destination.complete(); - this.unsubscribe(); - } + if (condition) { + var conditionResult = void 0; + try { + conditionResult = condition(state.state); } - }; - return TakeSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=take.js.map + catch (err) { + subscriber.error(err); + return undefined; + } + if (!conditionResult) { + subscriber.complete(); + return undefined; + } + if (subscriber.closed) { + return undefined; + } + } + var value; + try { + value = state.resultSelector(state.state); + } + catch (err) { + subscriber.error(err); + return undefined; + } + if (subscriber.closed) { + return undefined; + } + subscriber.next(value); + if (subscriber.closed) { + return undefined; + } + return this.schedule(state); +} +//# sourceMappingURL=generate.js.map /***/ }), @@ -26423,20 +26530,22 @@ var TakeSubscriber = /*@__PURE__*/ (function (_super) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "endWith", function() { return endWith; }); -/* harmony import */ var _observable_concat__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(226); -/* harmony import */ var _observable_of__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(227); -/** PURE_IMPORTS_START _observable_concat,_observable_of PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "iif", function() { return iif; }); +/* harmony import */ var _defer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(250); +/* harmony import */ var _empty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(203); +/** PURE_IMPORTS_START _defer,_empty PURE_IMPORTS_END */ -function endWith() { - var array = []; - for (var _i = 0; _i < arguments.length; _i++) { - array[_i] = arguments[_i]; +function iif(condition, trueResult, falseResult) { + if (trueResult === void 0) { + trueResult = _empty__WEBPACK_IMPORTED_MODULE_1__["EMPTY"]; } - return function (source) { return Object(_observable_concat__WEBPACK_IMPORTED_MODULE_0__["concat"])(source, _observable_of__WEBPACK_IMPORTED_MODULE_1__["of"].apply(void 0, array)); }; + if (falseResult === void 0) { + falseResult = _empty__WEBPACK_IMPORTED_MODULE_1__["EMPTY"]; + } + return Object(_defer__WEBPACK_IMPORTED_MODULE_0__["defer"])(function () { return condition() ? trueResult : falseResult; }); } -//# sourceMappingURL=endWith.js.map +//# sourceMappingURL=iif.js.map /***/ }), @@ -26445,60 +26554,38 @@ function endWith() { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "every", function() { return every; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "interval", function() { return interval; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(215); +/* harmony import */ var _util_isNumeric__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(257); +/** PURE_IMPORTS_START _Observable,_scheduler_async,_util_isNumeric PURE_IMPORTS_END */ -function every(predicate, thisArg) { - return function (source) { return source.lift(new EveryOperator(predicate, thisArg, source)); }; -} -var EveryOperator = /*@__PURE__*/ (function () { - function EveryOperator(predicate, thisArg, source) { - this.predicate = predicate; - this.thisArg = thisArg; - this.source = source; + +function interval(period, scheduler) { + if (period === void 0) { + period = 0; } - EveryOperator.prototype.call = function (observer, source) { - return source.subscribe(new EverySubscriber(observer, this.predicate, this.thisArg, this.source)); - }; - return EveryOperator; -}()); -var EverySubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](EverySubscriber, _super); - function EverySubscriber(destination, predicate, thisArg, source) { - var _this = _super.call(this, destination) || this; - _this.predicate = predicate; - _this.thisArg = thisArg; - _this.source = source; - _this.index = 0; - _this.thisArg = thisArg || _this; - return _this; + if (scheduler === void 0) { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; } - EverySubscriber.prototype.notifyComplete = function (everyValueMatch) { - this.destination.next(everyValueMatch); - this.destination.complete(); - }; - EverySubscriber.prototype._next = function (value) { - var result = false; - try { - result = this.predicate.call(this.thisArg, value, this.index++, this.source); - } - catch (err) { - this.destination.error(err); - return; - } - if (!result) { - this.notifyComplete(false); - } - }; - EverySubscriber.prototype._complete = function () { - this.notifyComplete(true); - }; - return EverySubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=every.js.map + if (!Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_2__["isNumeric"])(period) || period < 0) { + period = 0; + } + if (!scheduler || typeof scheduler.schedule !== 'function') { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; + } + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + subscriber.add(scheduler.schedule(dispatch, period, { subscriber: subscriber, counter: 0, period: period })); + return subscriber; + }); +} +function dispatch(state) { + var subscriber = state.subscriber, counter = state.counter, period = state.period; + subscriber.next(counter); + this.schedule({ subscriber: subscriber, counter: counter + 1, period: period }, period); +} +//# sourceMappingURL=interval.js.map /***/ }), @@ -26507,55 +26594,14 @@ var EverySubscriber = /*@__PURE__*/ (function (_super) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "exhaust", function() { return exhaust; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(171); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(182); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isNumeric", function() { return isNumeric; }); +/* harmony import */ var _isArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(178); +/** PURE_IMPORTS_START _isArray PURE_IMPORTS_END */ -function exhaust() { - return function (source) { return source.lift(new SwitchFirstOperator()); }; +function isNumeric(val) { + return !Object(_isArray__WEBPACK_IMPORTED_MODULE_0__["isArray"])(val) && (val - parseFloat(val) + 1) >= 0; } -var SwitchFirstOperator = /*@__PURE__*/ (function () { - function SwitchFirstOperator() { - } - SwitchFirstOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new SwitchFirstSubscriber(subscriber)); - }; - return SwitchFirstOperator; -}()); -var SwitchFirstSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SwitchFirstSubscriber, _super); - function SwitchFirstSubscriber(destination) { - var _this = _super.call(this, destination) || this; - _this.hasCompleted = false; - _this.hasSubscription = false; - return _this; - } - SwitchFirstSubscriber.prototype._next = function (value) { - if (!this.hasSubscription) { - this.hasSubscription = true; - this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, value)); - } - }; - SwitchFirstSubscriber.prototype._complete = function () { - this.hasCompleted = true; - if (!this.hasSubscription) { - this.destination.complete(); - } - }; - SwitchFirstSubscriber.prototype.notifyComplete = function (innerSub) { - this.remove(innerSub); - this.hasSubscription = false; - if (this.hasCompleted) { - this.destination.complete(); - } - }; - return SwitchFirstSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=exhaust.js.map +//# sourceMappingURL=isNumeric.js.map /***/ }), @@ -26564,95 +26610,39 @@ var SwitchFirstSubscriber = /*@__PURE__*/ (function (_super) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "exhaustMap", function() { return exhaustMap; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(171); -/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(183); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(182); -/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(231); -/* harmony import */ var _observable_from__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(218); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult,_map,_observable_from PURE_IMPORTS_END */ - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "merge", function() { return merge; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); +/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(205); +/* harmony import */ var _operators_mergeAll__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(241); +/* harmony import */ var _fromArray__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(206); +/** PURE_IMPORTS_START _Observable,_util_isScheduler,_operators_mergeAll,_fromArray PURE_IMPORTS_END */ -function exhaustMap(project, resultSelector) { - if (resultSelector) { - return function (source) { return source.pipe(exhaustMap(function (a, i) { return Object(_observable_from__WEBPACK_IMPORTED_MODULE_5__["from"])(project(a, i)).pipe(Object(_map__WEBPACK_IMPORTED_MODULE_4__["map"])(function (b, ii) { return resultSelector(a, b, i, ii); })); })); }; +function merge() { + var observables = []; + for (var _i = 0; _i < arguments.length; _i++) { + observables[_i] = arguments[_i]; } - return function (source) { - return source.lift(new ExhaustMapOperator(project)); - }; -} -var ExhaustMapOperator = /*@__PURE__*/ (function () { - function ExhaustMapOperator(project) { - this.project = project; + var concurrent = Number.POSITIVE_INFINITY; + var scheduler = null; + var last = observables[observables.length - 1]; + if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_1__["isScheduler"])(last)) { + scheduler = observables.pop(); + if (observables.length > 1 && typeof observables[observables.length - 1] === 'number') { + concurrent = observables.pop(); + } } - ExhaustMapOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new ExhaustMapSubscriber(subscriber, this.project)); - }; - return ExhaustMapOperator; -}()); -var ExhaustMapSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ExhaustMapSubscriber, _super); - function ExhaustMapSubscriber(destination, project) { - var _this = _super.call(this, destination) || this; - _this.project = project; - _this.hasSubscription = false; - _this.hasCompleted = false; - _this.index = 0; - return _this; + else if (typeof last === 'number') { + concurrent = observables.pop(); } - ExhaustMapSubscriber.prototype._next = function (value) { - if (!this.hasSubscription) { - this.tryNext(value); - } - }; - ExhaustMapSubscriber.prototype.tryNext = function (value) { - var result; - var index = this.index++; - try { - result = this.project(value, index); - } - catch (err) { - this.destination.error(err); - return; - } - this.hasSubscription = true; - this._innerSub(result, value, index); - }; - ExhaustMapSubscriber.prototype._innerSub = function (result, value, index) { - var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__["InnerSubscriber"](this, undefined, undefined); - var destination = this.destination; - destination.add(innerSubscriber); - Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, result, value, index, innerSubscriber); - }; - ExhaustMapSubscriber.prototype._complete = function () { - this.hasCompleted = true; - if (!this.hasSubscription) { - this.destination.complete(); - } - this.unsubscribe(); - }; - ExhaustMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.destination.next(innerValue); - }; - ExhaustMapSubscriber.prototype.notifyError = function (err) { - this.destination.error(err); - }; - ExhaustMapSubscriber.prototype.notifyComplete = function (innerSub) { - var destination = this.destination; - destination.remove(innerSub); - this.hasSubscription = false; - if (this.hasCompleted) { - this.destination.complete(); - } - }; - return ExhaustMapSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=exhaustMap.js.map + if (scheduler === null && observables.length === 1 && observables[0] instanceof _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"]) { + return observables[0]; + } + return Object(_operators_mergeAll__WEBPACK_IMPORTED_MODULE_2__["mergeAll"])(concurrent)(Object(_fromArray__WEBPACK_IMPORTED_MODULE_3__["fromArray"])(observables, scheduler)); +} +//# sourceMappingURL=merge.js.map /***/ }), @@ -26661,117 +26651,18 @@ var ExhaustMapSubscriber = /*@__PURE__*/ (function (_super) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "expand", function() { return expand; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ExpandOperator", function() { return ExpandOperator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ExpandSubscriber", function() { return ExpandSubscriber; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(171); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(182); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NEVER", function() { return NEVER; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "never", function() { return never; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); +/* harmony import */ var _util_noop__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(185); +/** PURE_IMPORTS_START _Observable,_util_noop PURE_IMPORTS_END */ -function expand(project, concurrent, scheduler) { - if (concurrent === void 0) { - concurrent = Number.POSITIVE_INFINITY; - } - if (scheduler === void 0) { - scheduler = undefined; - } - concurrent = (concurrent || 0) < 1 ? Number.POSITIVE_INFINITY : concurrent; - return function (source) { return source.lift(new ExpandOperator(project, concurrent, scheduler)); }; +var NEVER = /*@__PURE__*/ new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](_util_noop__WEBPACK_IMPORTED_MODULE_1__["noop"]); +function never() { + return NEVER; } -var ExpandOperator = /*@__PURE__*/ (function () { - function ExpandOperator(project, concurrent, scheduler) { - this.project = project; - this.concurrent = concurrent; - this.scheduler = scheduler; - } - ExpandOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new ExpandSubscriber(subscriber, this.project, this.concurrent, this.scheduler)); - }; - return ExpandOperator; -}()); - -var ExpandSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ExpandSubscriber, _super); - function ExpandSubscriber(destination, project, concurrent, scheduler) { - var _this = _super.call(this, destination) || this; - _this.project = project; - _this.concurrent = concurrent; - _this.scheduler = scheduler; - _this.index = 0; - _this.active = 0; - _this.hasCompleted = false; - if (concurrent < Number.POSITIVE_INFINITY) { - _this.buffer = []; - } - return _this; - } - ExpandSubscriber.dispatch = function (arg) { - var subscriber = arg.subscriber, result = arg.result, value = arg.value, index = arg.index; - subscriber.subscribeToProjection(result, value, index); - }; - ExpandSubscriber.prototype._next = function (value) { - var destination = this.destination; - if (destination.closed) { - this._complete(); - return; - } - var index = this.index++; - if (this.active < this.concurrent) { - destination.next(value); - try { - var project = this.project; - var result = project(value, index); - if (!this.scheduler) { - this.subscribeToProjection(result, value, index); - } - else { - var state = { subscriber: this, result: result, value: value, index: index }; - var destination_1 = this.destination; - destination_1.add(this.scheduler.schedule(ExpandSubscriber.dispatch, 0, state)); - } - } - catch (e) { - destination.error(e); - } - } - else { - this.buffer.push(value); - } - }; - ExpandSubscriber.prototype.subscribeToProjection = function (result, value, index) { - this.active++; - var destination = this.destination; - destination.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, result, value, index)); - }; - ExpandSubscriber.prototype._complete = function () { - this.hasCompleted = true; - if (this.hasCompleted && this.active === 0) { - this.destination.complete(); - } - this.unsubscribe(); - }; - ExpandSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this._next(innerValue); - }; - ExpandSubscriber.prototype.notifyComplete = function (innerSub) { - var buffer = this.buffer; - var destination = this.destination; - destination.remove(innerSub); - this.active--; - if (buffer && buffer.length > 0) { - this._next(buffer.shift()); - } - if (this.hasCompleted && this.active === 0) { - this.destination.complete(); - } - }; - return ExpandSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); - -//# sourceMappingURL=expand.js.map +//# sourceMappingURL=never.js.map /***/ }), @@ -26780,36 +26671,38 @@ var ExpandSubscriber = /*@__PURE__*/ (function (_super) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "finalize", function() { return finalize; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(177); -/** PURE_IMPORTS_START tslib,_Subscriber,_Subscription PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "onErrorResumeNext", function() { return onErrorResumeNext; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); +/* harmony import */ var _from__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(243); +/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(178); +/* harmony import */ var _empty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(203); +/** PURE_IMPORTS_START _Observable,_from,_util_isArray,_empty PURE_IMPORTS_END */ -function finalize(callback) { - return function (source) { return source.lift(new FinallyOperator(callback)); }; -} -var FinallyOperator = /*@__PURE__*/ (function () { - function FinallyOperator(callback) { - this.callback = callback; + +function onErrorResumeNext() { + var sources = []; + for (var _i = 0; _i < arguments.length; _i++) { + sources[_i] = arguments[_i]; } - FinallyOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new FinallySubscriber(subscriber, this.callback)); - }; - return FinallyOperator; -}()); -var FinallySubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](FinallySubscriber, _super); - function FinallySubscriber(destination, callback) { - var _this = _super.call(this, destination) || this; - _this.add(new _Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"](callback)); - return _this; + if (sources.length === 0) { + return _empty__WEBPACK_IMPORTED_MODULE_3__["EMPTY"]; } - return FinallySubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=finalize.js.map + var first = sources[0], remainder = sources.slice(1); + if (sources.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_2__["isArray"])(first)) { + return onErrorResumeNext.apply(void 0, first); + } + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var subNext = function () { return subscriber.add(onErrorResumeNext.apply(void 0, remainder).subscribe(subscriber)); }; + return Object(_from__WEBPACK_IMPORTED_MODULE_1__["from"])(first).subscribe({ + next: function (value) { subscriber.next(value); }, + error: subNext, + complete: subNext, + }); + }); +} +//# sourceMappingURL=onErrorResumeNext.js.map /***/ }), @@ -26818,70 +26711,49 @@ var FinallySubscriber = /*@__PURE__*/ (function (_super) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "find", function() { return find; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FindValueOperator", function() { return FindValueOperator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FindValueSubscriber", function() { return FindValueSubscriber; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pairs", function() { return pairs; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dispatch", function() { return dispatch; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(177); +/** PURE_IMPORTS_START _Observable,_Subscription PURE_IMPORTS_END */ -function find(predicate, thisArg) { - if (typeof predicate !== 'function') { - throw new TypeError('predicate is not a function'); - } - return function (source) { return source.lift(new FindValueOperator(predicate, source, false, thisArg)); }; -} -var FindValueOperator = /*@__PURE__*/ (function () { - function FindValueOperator(predicate, source, yieldIndex, thisArg) { - this.predicate = predicate; - this.source = source; - this.yieldIndex = yieldIndex; - this.thisArg = thisArg; +function pairs(obj, scheduler) { + if (!scheduler) { + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var keys = Object.keys(obj); + for (var i = 0; i < keys.length && !subscriber.closed; i++) { + var key = keys[i]; + if (obj.hasOwnProperty(key)) { + subscriber.next([key, obj[key]]); + } + } + subscriber.complete(); + }); } - FindValueOperator.prototype.call = function (observer, source) { - return source.subscribe(new FindValueSubscriber(observer, this.predicate, this.source, this.yieldIndex, this.thisArg)); - }; - return FindValueOperator; -}()); - -var FindValueSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](FindValueSubscriber, _super); - function FindValueSubscriber(destination, predicate, source, yieldIndex, thisArg) { - var _this = _super.call(this, destination) || this; - _this.predicate = predicate; - _this.source = source; - _this.yieldIndex = yieldIndex; - _this.thisArg = thisArg; - _this.index = 0; - return _this; + else { + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var keys = Object.keys(obj); + var subscription = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); + subscription.add(scheduler.schedule(dispatch, 0, { keys: keys, index: 0, subscriber: subscriber, subscription: subscription, obj: obj })); + return subscription; + }); } - FindValueSubscriber.prototype.notifyComplete = function (value) { - var destination = this.destination; - destination.next(value); - destination.complete(); - this.unsubscribe(); - }; - FindValueSubscriber.prototype._next = function (value) { - var _a = this, predicate = _a.predicate, thisArg = _a.thisArg; - var index = this.index++; - try { - var result = predicate.call(thisArg || this, value, index, this.source); - if (result) { - this.notifyComplete(this.yieldIndex ? index : value); - } +} +function dispatch(state) { + var keys = state.keys, index = state.index, subscriber = state.subscriber, subscription = state.subscription, obj = state.obj; + if (!subscriber.closed) { + if (index < keys.length) { + var key = keys[index]; + subscriber.next([key, obj[key]]); + subscription.add(this.schedule({ keys: keys, index: index + 1, subscriber: subscriber, subscription: subscription, obj: obj })); } - catch (err) { - this.destination.error(err); + else { + subscriber.complete(); } - }; - FindValueSubscriber.prototype._complete = function () { - this.notifyComplete(this.yieldIndex ? -1 : undefined); - }; - return FindValueSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); - -//# sourceMappingURL=find.js.map + } +} +//# sourceMappingURL=pairs.js.map /***/ }), @@ -26890,14 +26762,23 @@ var FindValueSubscriber = /*@__PURE__*/ (function (_super) { "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__(261); -/** PURE_IMPORTS_START _operators_find PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "partition", function() { return partition; }); +/* harmony import */ var _util_not__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(263); +/* harmony import */ var _util_subscribeTo__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(232); +/* harmony import */ var _operators_filter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(264); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(170); +/** PURE_IMPORTS_START _util_not,_util_subscribeTo,_operators_filter,_Observable PURE_IMPORTS_END */ -function findIndex(predicate, thisArg) { - return function (source) { return source.lift(new _operators_find__WEBPACK_IMPORTED_MODULE_0__["FindValueOperator"](predicate, source, true, thisArg)); }; + + + +function partition(source, predicate, thisArg) { + return [ + Object(_operators_filter__WEBPACK_IMPORTED_MODULE_2__["filter"])(predicate, thisArg)(new _Observable__WEBPACK_IMPORTED_MODULE_3__["Observable"](Object(_util_subscribeTo__WEBPACK_IMPORTED_MODULE_1__["subscribeTo"])(source))), + Object(_operators_filter__WEBPACK_IMPORTED_MODULE_2__["filter"])(Object(_util_not__WEBPACK_IMPORTED_MODULE_0__["not"])(predicate, thisArg))(new _Observable__WEBPACK_IMPORTED_MODULE_3__["Observable"](Object(_util_subscribeTo__WEBPACK_IMPORTED_MODULE_1__["subscribeTo"])(source))) + ]; } -//# sourceMappingURL=findIndex.js.map +//# sourceMappingURL=partition.js.map /***/ }), @@ -26906,25 +26787,17 @@ function findIndex(predicate, thisArg) { "use strict"; __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__(253); -/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(251); -/* harmony import */ var _take__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(254); -/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(238); -/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(252); -/* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(232); -/** PURE_IMPORTS_START _util_EmptyError,_filter,_take,_defaultIfEmpty,_throwIfEmpty,_util_identity PURE_IMPORTS_END */ - - - - - - -function first(predicate, defaultValue) { - var hasDefaultValue = arguments.length >= 2; - return function (source) { return source.pipe(predicate ? Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(function (v, i) { return predicate(v, i, source); }) : _util_identity__WEBPACK_IMPORTED_MODULE_5__["identity"], Object(_take__WEBPACK_IMPORTED_MODULE_2__["take"])(1), hasDefaultValue ? Object(_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__["defaultIfEmpty"])(defaultValue) : Object(_throwIfEmpty__WEBPACK_IMPORTED_MODULE_4__["throwIfEmpty"])(function () { return new _util_EmptyError__WEBPACK_IMPORTED_MODULE_0__["EmptyError"](); })); }; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "not", function() { return not; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +function not(pred, thisArg) { + function notPred() { + return !(notPred.pred.apply(notPred.thisArg, arguments)); + } + notPred.pred = pred; + notPred.thisArg = thisArg; + return notPred; } -//# sourceMappingURL=first.js.map +//# sourceMappingURL=not.js.map /***/ }), @@ -26933,195 +26806,52 @@ function first(predicate, defaultValue) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "groupBy", function() { return groupBy; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "GroupedObservable", function() { return GroupedObservable; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "filter", function() { return filter; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); /* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(177); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(193); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(265); -/** PURE_IMPORTS_START tslib,_Subscriber,_Subscription,_Observable,_Subject PURE_IMPORTS_END */ - - - +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function groupBy(keySelector, elementSelector, durationSelector, subjectSelector) { - return function (source) { - return source.lift(new GroupByOperator(keySelector, elementSelector, durationSelector, subjectSelector)); +function filter(predicate, thisArg) { + return function filterOperatorFunction(source) { + return source.lift(new FilterOperator(predicate, thisArg)); }; } -var GroupByOperator = /*@__PURE__*/ (function () { - function GroupByOperator(keySelector, elementSelector, durationSelector, subjectSelector) { - this.keySelector = keySelector; - this.elementSelector = elementSelector; - this.durationSelector = durationSelector; - this.subjectSelector = subjectSelector; +var FilterOperator = /*@__PURE__*/ (function () { + function FilterOperator(predicate, thisArg) { + this.predicate = predicate; + this.thisArg = thisArg; } - GroupByOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new GroupBySubscriber(subscriber, this.keySelector, this.elementSelector, this.durationSelector, this.subjectSelector)); + FilterOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new FilterSubscriber(subscriber, this.predicate, this.thisArg)); }; - return GroupByOperator; + return FilterOperator; }()); -var GroupBySubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](GroupBySubscriber, _super); - function GroupBySubscriber(destination, keySelector, elementSelector, durationSelector, subjectSelector) { +var FilterSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](FilterSubscriber, _super); + function FilterSubscriber(destination, predicate, thisArg) { var _this = _super.call(this, destination) || this; - _this.keySelector = keySelector; - _this.elementSelector = elementSelector; - _this.durationSelector = durationSelector; - _this.subjectSelector = subjectSelector; - _this.groups = null; - _this.attemptedToUnsubscribe = false; + _this.predicate = predicate; + _this.thisArg = thisArg; _this.count = 0; return _this; } - GroupBySubscriber.prototype._next = function (value) { - var key; + FilterSubscriber.prototype._next = function (value) { + var result; try { - key = this.keySelector(value); + result = this.predicate.call(this.thisArg, value, this.count++); } catch (err) { - this.error(err); + this.destination.error(err); return; } - this._group(value, key); - }; - GroupBySubscriber.prototype._group = function (value, key) { - var groups = this.groups; - if (!groups) { - groups = this.groups = new Map(); - } - var group = groups.get(key); - var element; - if (this.elementSelector) { - try { - element = this.elementSelector(value); - } - catch (err) { - this.error(err); - } - } - else { - element = value; - } - if (!group) { - group = (this.subjectSelector ? this.subjectSelector() : new _Subject__WEBPACK_IMPORTED_MODULE_4__["Subject"]()); - groups.set(key, group); - var groupedObservable = new GroupedObservable(key, group, this); - this.destination.next(groupedObservable); - if (this.durationSelector) { - var duration = void 0; - try { - duration = this.durationSelector(new GroupedObservable(key, group)); - } - catch (err) { - this.error(err); - return; - } - this.add(duration.subscribe(new GroupDurationSubscriber(key, group, this))); - } - } - if (!group.closed) { - group.next(element); - } - }; - GroupBySubscriber.prototype._error = function (err) { - var groups = this.groups; - if (groups) { - groups.forEach(function (group, key) { - group.error(err); - }); - groups.clear(); - } - this.destination.error(err); - }; - GroupBySubscriber.prototype._complete = function () { - var groups = this.groups; - if (groups) { - groups.forEach(function (group, key) { - group.complete(); - }); - groups.clear(); - } - this.destination.complete(); - }; - GroupBySubscriber.prototype.removeGroup = function (key) { - this.groups.delete(key); - }; - GroupBySubscriber.prototype.unsubscribe = function () { - if (!this.closed) { - this.attemptedToUnsubscribe = true; - if (this.count === 0) { - _super.prototype.unsubscribe.call(this); - } - } - }; - return GroupBySubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -var GroupDurationSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](GroupDurationSubscriber, _super); - function GroupDurationSubscriber(key, group, parent) { - var _this = _super.call(this, group) || this; - _this.key = key; - _this.group = group; - _this.parent = parent; - return _this; - } - GroupDurationSubscriber.prototype._next = function (value) { - this.complete(); - }; - GroupDurationSubscriber.prototype._unsubscribe = function () { - var _a = this, parent = _a.parent, key = _a.key; - this.key = this.parent = null; - if (parent) { - parent.removeGroup(key); + if (result) { + this.destination.next(value); } }; - return GroupDurationSubscriber; + return FilterSubscriber; }(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -var GroupedObservable = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](GroupedObservable, _super); - function GroupedObservable(key, groupSubject, refCountSubscription) { - var _this = _super.call(this) || this; - _this.key = key; - _this.groupSubject = groupSubject; - _this.refCountSubscription = refCountSubscription; - return _this; - } - GroupedObservable.prototype._subscribe = function (subscriber) { - var subscription = new _Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"](); - var _a = this, refCountSubscription = _a.refCountSubscription, groupSubject = _a.groupSubject; - if (refCountSubscription && !refCountSubscription.closed) { - subscription.add(new InnerRefCountSubscription(refCountSubscription)); - } - subscription.add(groupSubject.subscribe(subscriber)); - return subscription; - }; - return GroupedObservable; -}(_Observable__WEBPACK_IMPORTED_MODULE_3__["Observable"])); - -var InnerRefCountSubscription = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](InnerRefCountSubscription, _super); - function InnerRefCountSubscription(parent) { - var _this = _super.call(this) || this; - _this.parent = parent; - parent.count++; - return _this; - } - InnerRefCountSubscription.prototype.unsubscribe = function () { - var parent = this.parent; - if (!parent.closed && !this.closed) { - _super.prototype.unsubscribe.call(this); - parent.count -= 1; - if (parent.count === 0 && parent.attemptedToUnsubscribe) { - parent.unsubscribe(); - } - } - }; - return InnerRefCountSubscription; -}(_Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"])); -//# sourceMappingURL=groupBy.js.map +//# sourceMappingURL=filter.js.map /***/ }), @@ -27130,174 +26860,92 @@ var InnerRefCountSubscription = /*@__PURE__*/ (function (_super) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SubjectSubscriber", function() { return SubjectSubscriber; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Subject", function() { return Subject; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AnonymousSubject", function() { return AnonymousSubject; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "race", function() { return race; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RaceOperator", function() { return RaceOperator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RaceSubscriber", function() { return RaceSubscriber; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(193); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(172); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(177); -/* harmony import */ var _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(266); -/* harmony import */ var _SubjectSubscription__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(267); -/* harmony import */ var _internal_symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(181); -/** PURE_IMPORTS_START tslib,_Observable,_Subscriber,_Subscription,_util_ObjectUnsubscribedError,_SubjectSubscription,_internal_symbol_rxSubscriber PURE_IMPORTS_END */ - - - +/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(178); +/* harmony import */ var _fromArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(206); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(229); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(230); +/** PURE_IMPORTS_START tslib,_util_isArray,_fromArray,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -var SubjectSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SubjectSubscriber, _super); - function SubjectSubscriber(destination) { - var _this = _super.call(this, destination) || this; - _this.destination = destination; - return _this; - } - return SubjectSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_2__["Subscriber"])); -var Subject = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](Subject, _super); - function Subject() { - var _this = _super.call(this) || this; - _this.observers = []; - _this.closed = false; - _this.isStopped = false; - _this.hasError = false; - _this.thrownError = null; - return _this; +function race() { + var observables = []; + for (var _i = 0; _i < arguments.length; _i++) { + observables[_i] = arguments[_i]; } - Subject.prototype[_internal_symbol_rxSubscriber__WEBPACK_IMPORTED_MODULE_6__["rxSubscriber"]] = function () { - return new SubjectSubscriber(this); - }; - Subject.prototype.lift = function (operator) { - var subject = new AnonymousSubject(this, this); - subject.operator = operator; - return subject; - }; - Subject.prototype.next = function (value) { - if (this.closed) { - throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__["ObjectUnsubscribedError"](); - } - if (!this.isStopped) { - var observers = this.observers; - var len = observers.length; - var copy = observers.slice(); - for (var i = 0; i < len; i++) { - copy[i].next(value); - } - } - }; - Subject.prototype.error = function (err) { - if (this.closed) { - throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__["ObjectUnsubscribedError"](); - } - this.hasError = true; - this.thrownError = err; - this.isStopped = true; - var observers = this.observers; - var len = observers.length; - var copy = observers.slice(); - for (var i = 0; i < len; i++) { - copy[i].error(err); - } - this.observers.length = 0; - }; - Subject.prototype.complete = function () { - if (this.closed) { - throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__["ObjectUnsubscribedError"](); - } - this.isStopped = true; - var observers = this.observers; - var len = observers.length; - var copy = observers.slice(); - for (var i = 0; i < len; i++) { - copy[i].complete(); - } - this.observers.length = 0; - }; - Subject.prototype.unsubscribe = function () { - this.isStopped = true; - this.closed = true; - this.observers = null; - }; - Subject.prototype._trySubscribe = function (subscriber) { - if (this.closed) { - throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__["ObjectUnsubscribedError"](); - } - else { - return _super.prototype._trySubscribe.call(this, subscriber); - } - }; - Subject.prototype._subscribe = function (subscriber) { - if (this.closed) { - throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_4__["ObjectUnsubscribedError"](); - } - else if (this.hasError) { - subscriber.error(this.thrownError); - return _Subscription__WEBPACK_IMPORTED_MODULE_3__["Subscription"].EMPTY; - } - else if (this.isStopped) { - subscriber.complete(); - return _Subscription__WEBPACK_IMPORTED_MODULE_3__["Subscription"].EMPTY; + if (observables.length === 1) { + if (Object(_util_isArray__WEBPACK_IMPORTED_MODULE_1__["isArray"])(observables[0])) { + observables = observables[0]; } else { - this.observers.push(subscriber); - return new _SubjectSubscription__WEBPACK_IMPORTED_MODULE_5__["SubjectSubscription"](this, subscriber); + return observables[0]; } + } + return Object(_fromArray__WEBPACK_IMPORTED_MODULE_2__["fromArray"])(observables, undefined).lift(new RaceOperator()); +} +var RaceOperator = /*@__PURE__*/ (function () { + function RaceOperator() { + } + RaceOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new RaceSubscriber(subscriber)); }; - Subject.prototype.asObservable = function () { - var observable = new _Observable__WEBPACK_IMPORTED_MODULE_1__["Observable"](); - observable.source = this; - return observable; - }; - Subject.create = function (destination, source) { - return new AnonymousSubject(destination, source); - }; - return Subject; -}(_Observable__WEBPACK_IMPORTED_MODULE_1__["Observable"])); + return RaceOperator; +}()); -var AnonymousSubject = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AnonymousSubject, _super); - function AnonymousSubject(destination, source) { - var _this = _super.call(this) || this; - _this.destination = destination; - _this.source = source; +var RaceSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RaceSubscriber, _super); + function RaceSubscriber(destination) { + var _this = _super.call(this, destination) || this; + _this.hasFirst = false; + _this.observables = []; + _this.subscriptions = []; return _this; } - AnonymousSubject.prototype.next = function (value) { - var destination = this.destination; - if (destination && destination.next) { - destination.next(value); - } - }; - AnonymousSubject.prototype.error = function (err) { - var destination = this.destination; - if (destination && destination.error) { - this.destination.error(err); - } + RaceSubscriber.prototype._next = function (observable) { + this.observables.push(observable); }; - AnonymousSubject.prototype.complete = function () { - var destination = this.destination; - if (destination && destination.complete) { + RaceSubscriber.prototype._complete = function () { + var observables = this.observables; + var len = observables.length; + if (len === 0) { this.destination.complete(); } - }; - AnonymousSubject.prototype._subscribe = function (subscriber) { - var source = this.source; - if (source) { - return this.source.subscribe(subscriber); - } else { - return _Subscription__WEBPACK_IMPORTED_MODULE_3__["Subscription"].EMPTY; + for (var i = 0; i < len && !this.hasFirst; i++) { + var observable = observables[i]; + var subscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["subscribeToResult"])(this, observable, observable, i); + if (this.subscriptions) { + this.subscriptions.push(subscription); + } + this.add(subscription); + } + this.observables = null; } }; - return AnonymousSubject; -}(Subject)); + RaceSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + if (!this.hasFirst) { + this.hasFirst = true; + for (var i = 0; i < this.subscriptions.length; i++) { + if (i !== outerIndex) { + var subscription = this.subscriptions[i]; + subscription.unsubscribe(); + this.remove(subscription); + } + } + this.subscriptions = null; + } + this.destination.next(innerValue); + }; + return RaceSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); -//# sourceMappingURL=Subject.js.map +//# sourceMappingURL=race.js.map /***/ }), @@ -27306,20 +26954,57 @@ var AnonymousSubject = /*@__PURE__*/ (function (_super) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ObjectUnsubscribedError", function() { return ObjectUnsubscribedError; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -var ObjectUnsubscribedErrorImpl = /*@__PURE__*/ (function () { - function ObjectUnsubscribedErrorImpl() { - Error.call(this); - this.message = 'object unsubscribed'; - this.name = 'ObjectUnsubscribedError'; - return this; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "range", function() { return range; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dispatch", function() { return dispatch; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); +/** PURE_IMPORTS_START _Observable PURE_IMPORTS_END */ + +function range(start, count, scheduler) { + if (start === void 0) { + start = 0; } - ObjectUnsubscribedErrorImpl.prototype = /*@__PURE__*/ Object.create(Error.prototype); - return ObjectUnsubscribedErrorImpl; -})(); -var ObjectUnsubscribedError = ObjectUnsubscribedErrorImpl; -//# sourceMappingURL=ObjectUnsubscribedError.js.map + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + if (count === undefined) { + count = start; + start = 0; + } + var index = 0; + var current = start; + if (scheduler) { + return scheduler.schedule(dispatch, 0, { + index: index, count: count, start: start, subscriber: subscriber + }); + } + else { + do { + if (index++ >= count) { + subscriber.complete(); + break; + } + subscriber.next(current++); + if (subscriber.closed) { + break; + } + } while (true); + } + return undefined; + }); +} +function dispatch(state) { + var start = state.start, index = state.index, count = state.count, subscriber = state.subscriber; + if (index >= count) { + subscriber.complete(); + return; + } + subscriber.next(start); + if (subscriber.closed) { + return; + } + state.index = index + 1; + state.start = start + 1; + this.schedule(state); +} +//# sourceMappingURL=range.js.map /***/ }), @@ -27328,41 +27013,52 @@ var ObjectUnsubscribedError = ObjectUnsubscribedErrorImpl; "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SubjectSubscription", function() { return SubjectSubscription; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(177); -/** PURE_IMPORTS_START tslib,_Subscription PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timer", function() { return timer; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(215); +/* harmony import */ var _util_isNumeric__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(257); +/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(205); +/** PURE_IMPORTS_START _Observable,_scheduler_async,_util_isNumeric,_util_isScheduler PURE_IMPORTS_END */ -var SubjectSubscription = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SubjectSubscription, _super); - function SubjectSubscription(subject, subscriber) { - var _this = _super.call(this) || this; - _this.subject = subject; - _this.subscriber = subscriber; - _this.closed = false; - return _this; - } - SubjectSubscription.prototype.unsubscribe = function () { - if (this.closed) { - return; - } - this.closed = true; - var subject = this.subject; - var observers = subject.observers; - this.subject = null; - if (!observers || observers.length === 0 || subject.isStopped || subject.closed) { - return; - } - var subscriberIndex = observers.indexOf(this.subscriber); - if (subscriberIndex !== -1) { - observers.splice(subscriberIndex, 1); - } - }; - return SubjectSubscription; -}(_Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"])); -//# sourceMappingURL=SubjectSubscription.js.map + +function timer(dueTime, periodOrScheduler, scheduler) { + if (dueTime === void 0) { + dueTime = 0; + } + var period = -1; + if (Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_2__["isNumeric"])(periodOrScheduler)) { + period = Number(periodOrScheduler) < 1 && 1 || Number(periodOrScheduler); + } + else if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_3__["isScheduler"])(periodOrScheduler)) { + scheduler = periodOrScheduler; + } + if (!Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_3__["isScheduler"])(scheduler)) { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; + } + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var due = Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_2__["isNumeric"])(dueTime) + ? dueTime + : (+dueTime - scheduler.now()); + return scheduler.schedule(dispatch, due, { + index: 0, period: period, subscriber: subscriber + }); + }); +} +function dispatch(state) { + var index = state.index, period = state.period, subscriber = state.subscriber; + subscriber.next(index); + if (subscriber.closed) { + return; + } + else if (period === -1) { + return subscriber.complete(); + } + state.index = index + 1; + this.schedule(state, period); +} +//# sourceMappingURL=timer.js.map /***/ }), @@ -27371,35 +27067,43 @@ var SubjectSubscription = /*@__PURE__*/ (function (_super) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ignoreElements", function() { return ignoreElements; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "using", function() { return using; }); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(170); +/* harmony import */ var _from__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(243); +/* harmony import */ var _empty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(203); +/** PURE_IMPORTS_START _Observable,_from,_empty PURE_IMPORTS_END */ -function ignoreElements() { - return function ignoreElementsOperatorFunction(source) { - return source.lift(new IgnoreElementsOperator()); - }; + +function using(resourceFactory, observableFactory) { + return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { + var resource; + try { + resource = resourceFactory(); + } + catch (err) { + subscriber.error(err); + return undefined; + } + var result; + try { + result = observableFactory(resource); + } + catch (err) { + subscriber.error(err); + return undefined; + } + var source = result ? Object(_from__WEBPACK_IMPORTED_MODULE_1__["from"])(result) : _empty__WEBPACK_IMPORTED_MODULE_2__["EMPTY"]; + var subscription = source.subscribe(subscriber); + return function () { + subscription.unsubscribe(); + if (resource) { + resource.unsubscribe(); + } + }; + }); } -var IgnoreElementsOperator = /*@__PURE__*/ (function () { - function IgnoreElementsOperator() { - } - IgnoreElementsOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new IgnoreElementsSubscriber(subscriber)); - }; - return IgnoreElementsOperator; -}()); -var IgnoreElementsSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](IgnoreElementsSubscriber, _super); - function IgnoreElementsSubscriber() { - return _super !== null && _super.apply(this, arguments) || this; - } - IgnoreElementsSubscriber.prototype._next = function (unused) { - }; - return IgnoreElementsSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=ignoreElements.js.map +//# sourceMappingURL=using.js.map /***/ }), @@ -27408,8946 +27112,9248 @@ var IgnoreElementsSubscriber = /*@__PURE__*/ (function (_super) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isEmpty", function() { return isEmpty; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "zip", function() { return zip; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ZipOperator", function() { return ZipOperator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ZipSubscriber", function() { return ZipSubscriber; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ +/* harmony import */ var _fromArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(206); +/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(178); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(172); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(229); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(230); +/* harmony import */ var _internal_symbol_iterator__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(235); +/** PURE_IMPORTS_START tslib,_fromArray,_util_isArray,_Subscriber,_OuterSubscriber,_util_subscribeToResult,_.._internal_symbol_iterator PURE_IMPORTS_END */ -function isEmpty() { - return function (source) { return source.lift(new IsEmptyOperator()); }; + + + + + +function zip() { + var observables = []; + for (var _i = 0; _i < arguments.length; _i++) { + observables[_i] = arguments[_i]; + } + var resultSelector = observables[observables.length - 1]; + if (typeof resultSelector === 'function') { + observables.pop(); + } + return Object(_fromArray__WEBPACK_IMPORTED_MODULE_1__["fromArray"])(observables, undefined).lift(new ZipOperator(resultSelector)); } -var IsEmptyOperator = /*@__PURE__*/ (function () { - function IsEmptyOperator() { +var ZipOperator = /*@__PURE__*/ (function () { + function ZipOperator(resultSelector) { + this.resultSelector = resultSelector; } - IsEmptyOperator.prototype.call = function (observer, source) { - return source.subscribe(new IsEmptySubscriber(observer)); + ZipOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new ZipSubscriber(subscriber, this.resultSelector)); }; - return IsEmptyOperator; + return ZipOperator; }()); -var IsEmptySubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](IsEmptySubscriber, _super); - function IsEmptySubscriber(destination) { - return _super.call(this, destination) || this; + +var ZipSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ZipSubscriber, _super); + function ZipSubscriber(destination, resultSelector, values) { + if (values === void 0) { + values = Object.create(null); + } + var _this = _super.call(this, destination) || this; + _this.iterators = []; + _this.active = 0; + _this.resultSelector = (typeof resultSelector === 'function') ? resultSelector : null; + _this.values = values; + return _this; } - IsEmptySubscriber.prototype.notifyComplete = function (isEmpty) { - var destination = this.destination; - destination.next(isEmpty); - destination.complete(); + ZipSubscriber.prototype._next = function (value) { + var iterators = this.iterators; + if (Object(_util_isArray__WEBPACK_IMPORTED_MODULE_2__["isArray"])(value)) { + iterators.push(new StaticArrayIterator(value)); + } + else if (typeof value[_internal_symbol_iterator__WEBPACK_IMPORTED_MODULE_6__["iterator"]] === 'function') { + iterators.push(new StaticIterator(value[_internal_symbol_iterator__WEBPACK_IMPORTED_MODULE_6__["iterator"]]())); + } + else { + iterators.push(new ZipBufferIterator(this.destination, this, value)); + } }; - IsEmptySubscriber.prototype._next = function (value) { - this.notifyComplete(false); + ZipSubscriber.prototype._complete = function () { + var iterators = this.iterators; + var len = iterators.length; + this.unsubscribe(); + if (len === 0) { + this.destination.complete(); + return; + } + this.active = len; + for (var i = 0; i < len; i++) { + var iterator = iterators[i]; + if (iterator.stillUnsubscribed) { + var destination = this.destination; + destination.add(iterator.subscribe(iterator, i)); + } + else { + this.active--; + } + } }; - IsEmptySubscriber.prototype._complete = function () { - this.notifyComplete(true); + ZipSubscriber.prototype.notifyInactive = function () { + this.active--; + if (this.active === 0) { + this.destination.complete(); + } }; - return IsEmptySubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=isEmpty.js.map - - -/***/ }), -/* 270 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__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__(253); -/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(251); -/* harmony import */ var _takeLast__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(271); -/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(252); -/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(238); -/* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(232); -/** PURE_IMPORTS_START _util_EmptyError,_filter,_takeLast,_throwIfEmpty,_defaultIfEmpty,_util_identity PURE_IMPORTS_END */ - - - - - - -function last(predicate, defaultValue) { - var hasDefaultValue = arguments.length >= 2; - return function (source) { return source.pipe(predicate ? Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(function (v, i) { return predicate(v, i, source); }) : _util_identity__WEBPACK_IMPORTED_MODULE_5__["identity"], Object(_takeLast__WEBPACK_IMPORTED_MODULE_2__["takeLast"])(1), hasDefaultValue ? Object(_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_4__["defaultIfEmpty"])(defaultValue) : Object(_throwIfEmpty__WEBPACK_IMPORTED_MODULE_3__["throwIfEmpty"])(function () { return new _util_EmptyError__WEBPACK_IMPORTED_MODULE_0__["EmptyError"](); })); }; -} -//# sourceMappingURL=last.js.map - - -/***/ }), -/* 271 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "takeLast", function() { return takeLast; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(250); -/* harmony import */ var _observable_empty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(242); -/** PURE_IMPORTS_START tslib,_Subscriber,_util_ArgumentOutOfRangeError,_observable_empty PURE_IMPORTS_END */ - - - - -function takeLast(count) { - return function takeLastOperatorFunction(source) { - if (count === 0) { - return Object(_observable_empty__WEBPACK_IMPORTED_MODULE_3__["empty"])(); + ZipSubscriber.prototype.checkIterators = function () { + var iterators = this.iterators; + var len = iterators.length; + var destination = this.destination; + for (var i = 0; i < len; i++) { + var iterator = iterators[i]; + if (typeof iterator.hasValue === 'function' && !iterator.hasValue()) { + return; + } + } + var shouldComplete = false; + var args = []; + for (var i = 0; i < len; i++) { + var iterator = iterators[i]; + var result = iterator.next(); + if (iterator.hasCompleted()) { + shouldComplete = true; + } + if (result.done) { + destination.complete(); + return; + } + args.push(result.value); + } + if (this.resultSelector) { + this._tryresultSelector(args); } else { - return source.lift(new TakeLastOperator(count)); + destination.next(args); + } + if (shouldComplete) { + destination.complete(); } }; -} -var TakeLastOperator = /*@__PURE__*/ (function () { - function TakeLastOperator(total) { - this.total = total; - if (this.total < 0) { - throw new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__["ArgumentOutOfRangeError"]; + ZipSubscriber.prototype._tryresultSelector = function (args) { + var result; + try { + result = this.resultSelector.apply(this, args); + } + catch (err) { + this.destination.error(err); + return; } + this.destination.next(result); + }; + return ZipSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_3__["Subscriber"])); + +var StaticIterator = /*@__PURE__*/ (function () { + function StaticIterator(iterator) { + this.iterator = iterator; + this.nextResult = iterator.next(); } - TakeLastOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new TakeLastSubscriber(subscriber, this.total)); + StaticIterator.prototype.hasValue = function () { + return true; }; - return TakeLastOperator; + StaticIterator.prototype.next = function () { + var result = this.nextResult; + this.nextResult = this.iterator.next(); + return result; + }; + StaticIterator.prototype.hasCompleted = function () { + var nextResult = this.nextResult; + return nextResult && nextResult.done; + }; + return StaticIterator; }()); -var TakeLastSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TakeLastSubscriber, _super); - function TakeLastSubscriber(destination, total) { +var StaticArrayIterator = /*@__PURE__*/ (function () { + function StaticArrayIterator(array) { + this.array = array; + this.index = 0; + this.length = 0; + this.length = array.length; + } + StaticArrayIterator.prototype[_internal_symbol_iterator__WEBPACK_IMPORTED_MODULE_6__["iterator"]] = function () { + return this; + }; + StaticArrayIterator.prototype.next = function (value) { + var i = this.index++; + var array = this.array; + return i < this.length ? { value: array[i], done: false } : { value: null, done: true }; + }; + StaticArrayIterator.prototype.hasValue = function () { + return this.array.length > this.index; + }; + StaticArrayIterator.prototype.hasCompleted = function () { + return this.array.length === this.index; + }; + return StaticArrayIterator; +}()); +var ZipBufferIterator = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ZipBufferIterator, _super); + function ZipBufferIterator(destination, parent, observable) { var _this = _super.call(this, destination) || this; - _this.total = total; - _this.ring = new Array(); - _this.count = 0; + _this.parent = parent; + _this.observable = observable; + _this.stillUnsubscribed = true; + _this.buffer = []; + _this.isComplete = false; return _this; } - TakeLastSubscriber.prototype._next = function (value) { - var ring = this.ring; - var total = this.total; - var count = this.count++; - if (ring.length < total) { - ring.push(value); + ZipBufferIterator.prototype[_internal_symbol_iterator__WEBPACK_IMPORTED_MODULE_6__["iterator"]] = function () { + return this; + }; + ZipBufferIterator.prototype.next = function () { + var buffer = this.buffer; + if (buffer.length === 0 && this.isComplete) { + return { value: null, done: true }; } else { - var index = count % total; - ring[index] = value; + return { value: buffer.shift(), done: false }; } }; - TakeLastSubscriber.prototype._complete = function () { - var destination = this.destination; - var count = this.count; - if (count > 0) { - var total = this.count >= this.total ? this.total : this.count; - var ring = this.ring; - for (var i = 0; i < total; i++) { - var idx = (count++) % total; - destination.next(ring[idx]); - } + ZipBufferIterator.prototype.hasValue = function () { + return this.buffer.length > 0; + }; + ZipBufferIterator.prototype.hasCompleted = function () { + return this.buffer.length === 0 && this.isComplete; + }; + ZipBufferIterator.prototype.notifyComplete = function () { + if (this.buffer.length > 0) { + this.isComplete = true; + this.parent.notifyInactive(); + } + else { + this.destination.complete(); } - destination.complete(); }; - return TakeLastSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=takeLast.js.map + ZipBufferIterator.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.buffer.push(innerValue); + this.parent.checkIterators(); + }; + ZipBufferIterator.prototype.subscribe = function (value, index) { + return Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_5__["subscribeToResult"])(this, this.observable, this, index); + }; + return ZipBufferIterator; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_4__["OuterSubscriber"])); +//# sourceMappingURL=zip.js.map /***/ }), -/* 272 */ +/* 270 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mapTo", function() { return mapTo; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ +/* harmony import */ var _internal_operators_audit__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(271); +/* 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__(272); +/* 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__(273); +/* 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__(274); +/* 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__(275); +/* 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__(276); +/* 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__(277); +/* 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__(278); +/* 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__(279); +/* 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__(280); +/* 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__(281); +/* 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__(240); +/* 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__(282); +/* 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__(283); +/* 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__(284); +/* 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__(285); +/* 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__(286); +/* 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__(287); +/* 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__(288); +/* 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__(290); +/* 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__(291); +/* 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__(292); +/* 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__(293); +/* 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__(294); +/* 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__(295); +/* 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__(298); +/* 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__(299); +/* 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__(300); +/* 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__(301); +/* 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__(302); +/* 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__(264); +/* 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__(303); +/* 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__(304); +/* 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__(305); +/* 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__(306); +/* 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__(191); +/* 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__(307); +/* 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__(308); +/* 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__(309); +/* 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__(226); +/* 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__(311); +/* 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__(312); +/* 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__(313); +/* 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__(316); +/* 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__(241); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mergeAll", function() { return _internal_operators_mergeAll__WEBPACK_IMPORTED_MODULE_44__["mergeAll"]; }); + +/* harmony import */ var _internal_operators_mergeMap__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(242); +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "mergeMap", function() { return _internal_operators_mergeMap__WEBPACK_IMPORTED_MODULE_45__["mergeMap"]; }); + +/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "flatMap", function() { return _internal_operators_mergeMap__WEBPACK_IMPORTED_MODULE_45__["mergeMap"]; }); + +/* harmony import */ var _internal_operators_mergeMapTo__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(317); +/* 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__(318); +/* 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__(319); +/* 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__(320); +/* 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__(201); +/* 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__(321); +/* 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__(322); +/* 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__(323); +/* 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__(324); +/* 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__(325); +/* 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__(326); +/* 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__(327); +/* 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__(328); +/* 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__(329); +/* 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__(314); +/* 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__(330); +/* 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__(331); +/* 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__(332); +/* 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__(333); +/* 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__(190); +/* 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__(334); +/* 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__(335); +/* 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__(315); +/* 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__(336); +/* 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__(337); +/* 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__(338); +/* 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__(339); +/* 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__(340); +/* 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__(341); +/* 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__(342); +/* 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__(343); +/* 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__(344); +/* 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__(345); +/* 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__(347); +/* 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__(348); +/* 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__(349); +/* 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__(297); +/* 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__(310); +/* 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__(350); +/* 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__(351); +/* 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__(352); +/* 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__(353); +/* 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__(354); +/* 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__(296); +/* 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__(355); +/* 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__(356); +/* 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__(357); +/* 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__(358); +/* 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__(359); +/* 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__(360); +/* 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__(361); +/* 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__(362); +/* 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__(363); +/* 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__(364); +/* 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__(365); +/* 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__(366); +/* 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__(367); +/* 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 */ + + + + + + + + + + + + + + + + + + + + -function mapTo(value) { - return function (source) { return source.lift(new MapToOperator(value)); }; -} -var MapToOperator = /*@__PURE__*/ (function () { - function MapToOperator(value) { - this.value = value; - } - MapToOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new MapToSubscriber(subscriber, this.value)); - }; - return MapToOperator; -}()); -var MapToSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](MapToSubscriber, _super); - function MapToSubscriber(destination, value) { - var _this = _super.call(this, destination) || this; - _this.value = value; - return _this; - } - MapToSubscriber.prototype._next = function (x) { - this.destination.next(this.value); - }; - return MapToSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=mapTo.js.map -/***/ }), -/* 273 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "materialize", function() { return materialize; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _Notification__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(241); -/** PURE_IMPORTS_START tslib,_Subscriber,_Notification PURE_IMPORTS_END */ -function materialize() { - return function materializeOperatorFunction(source) { - return source.lift(new MaterializeOperator()); - }; -} -var MaterializeOperator = /*@__PURE__*/ (function () { - function MaterializeOperator() { - } - MaterializeOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new MaterializeSubscriber(subscriber)); - }; - return MaterializeOperator; -}()); -var MaterializeSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](MaterializeSubscriber, _super); - function MaterializeSubscriber(destination) { - return _super.call(this, destination) || this; - } - MaterializeSubscriber.prototype._next = function (value) { - this.destination.next(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createNext(value)); - }; - MaterializeSubscriber.prototype._error = function (err) { - var destination = this.destination; - destination.next(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createError(err)); - destination.complete(); - }; - MaterializeSubscriber.prototype._complete = function () { - var destination = this.destination; - destination.next(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createComplete()); - destination.complete(); - }; - return MaterializeSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=materialize.js.map -/***/ }), -/* 274 */ -/***/ (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__(275); -/** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */ -function max(comparer) { - var max = (typeof comparer === 'function') - ? function (x, y) { return comparer(x, y) > 0 ? x : y; } - : function (x, y) { return x > y ? x : y; }; - return Object(_reduce__WEBPACK_IMPORTED_MODULE_0__["reduce"])(max); -} -//# sourceMappingURL=max.js.map -/***/ }), -/* 275 */ -/***/ (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__(276); -/* harmony import */ var _takeLast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(271); -/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(238); -/* harmony import */ var _util_pipe__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(196); -/** PURE_IMPORTS_START _scan,_takeLast,_defaultIfEmpty,_util_pipe PURE_IMPORTS_END */ -function reduce(accumulator, seed) { - if (arguments.length >= 2) { - return function reduceOperatorFunctionWithSeed(source) { - return Object(_util_pipe__WEBPACK_IMPORTED_MODULE_3__["pipe"])(Object(_scan__WEBPACK_IMPORTED_MODULE_0__["scan"])(accumulator, seed), Object(_takeLast__WEBPACK_IMPORTED_MODULE_1__["takeLast"])(1), Object(_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_2__["defaultIfEmpty"])(seed))(source); - }; - } - return function reduceOperatorFunction(source) { - return Object(_util_pipe__WEBPACK_IMPORTED_MODULE_3__["pipe"])(Object(_scan__WEBPACK_IMPORTED_MODULE_0__["scan"])(function (acc, value, index) { return accumulator(acc, value, index + 1); }), Object(_takeLast__WEBPACK_IMPORTED_MODULE_1__["takeLast"])(1))(source); - }; -} -//# sourceMappingURL=reduce.js.map -/***/ }), -/* 276 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scan", function() { return scan; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function scan(accumulator, seed) { - var hasSeed = false; - if (arguments.length >= 2) { - hasSeed = true; - } - return function scanOperatorFunction(source) { - return source.lift(new ScanOperator(accumulator, seed, hasSeed)); - }; -} -var ScanOperator = /*@__PURE__*/ (function () { - function ScanOperator(accumulator, seed, hasSeed) { - if (hasSeed === void 0) { - hasSeed = false; - } - this.accumulator = accumulator; - this.seed = seed; - this.hasSeed = hasSeed; - } - ScanOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new ScanSubscriber(subscriber, this.accumulator, this.seed, this.hasSeed)); - }; - return ScanOperator; -}()); -var ScanSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ScanSubscriber, _super); - function ScanSubscriber(destination, accumulator, _seed, hasSeed) { - var _this = _super.call(this, destination) || this; - _this.accumulator = accumulator; - _this._seed = _seed; - _this.hasSeed = hasSeed; - _this.index = 0; - return _this; - } - Object.defineProperty(ScanSubscriber.prototype, "seed", { - get: function () { - return this._seed; - }, - set: function (value) { - this.hasSeed = true; - this._seed = value; - }, - enumerable: true, - configurable: true - }); - ScanSubscriber.prototype._next = function (value) { - if (!this.hasSeed) { - this.seed = value; - this.destination.next(value); - } - else { - return this._tryNext(value); - } - }; - ScanSubscriber.prototype._tryNext = function (value) { - var index = this.index++; - var result; - try { - result = this.accumulator(this.seed, value, index); - } - catch (err) { - this.destination.error(err); - } - this.seed = result; - this.destination.next(result); - }; - return ScanSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=scan.js.map -/***/ }), -/* 277 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "merge", function() { return merge; }); -/* harmony import */ var _observable_merge__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(278); -/** PURE_IMPORTS_START _observable_merge PURE_IMPORTS_END */ -function merge() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i] = arguments[_i]; - } - return function (source) { return source.lift.call(_observable_merge__WEBPACK_IMPORTED_MODULE_0__["merge"].apply(void 0, [source].concat(observables))); }; -} -//# sourceMappingURL=merge.js.map -/***/ }), -/* 278 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "merge", function() { return merge; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(193); -/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(206); -/* harmony import */ var _operators_mergeAll__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(229); -/* harmony import */ var _fromArray__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(215); -/** PURE_IMPORTS_START _Observable,_util_isScheduler,_operators_mergeAll,_fromArray PURE_IMPORTS_END */ -function merge() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i] = arguments[_i]; - } - var concurrent = Number.POSITIVE_INFINITY; - var scheduler = null; - var last = observables[observables.length - 1]; - if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_1__["isScheduler"])(last)) { - scheduler = observables.pop(); - if (observables.length > 1 && typeof observables[observables.length - 1] === 'number') { - concurrent = observables.pop(); - } - } - else if (typeof last === 'number') { - concurrent = observables.pop(); - } - if (scheduler === null && observables.length === 1 && observables[0] instanceof _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"]) { - return observables[0]; - } - return Object(_operators_mergeAll__WEBPACK_IMPORTED_MODULE_2__["mergeAll"])(concurrent)(Object(_fromArray__WEBPACK_IMPORTED_MODULE_3__["fromArray"])(observables, scheduler)); -} -//# sourceMappingURL=merge.js.map -/***/ }), -/* 279 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mergeMapTo", function() { return mergeMapTo; }); -/* harmony import */ var _mergeMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(230); -/** PURE_IMPORTS_START _mergeMap PURE_IMPORTS_END */ -function mergeMapTo(innerObservable, resultSelector, concurrent) { - if (concurrent === void 0) { - concurrent = Number.POSITIVE_INFINITY; - } - if (typeof resultSelector === 'function') { - return Object(_mergeMap__WEBPACK_IMPORTED_MODULE_0__["mergeMap"])(function () { return innerObservable; }, resultSelector, concurrent); - } - if (typeof resultSelector === 'number') { - concurrent = resultSelector; - } - return Object(_mergeMap__WEBPACK_IMPORTED_MODULE_0__["mergeMap"])(function () { return innerObservable; }, concurrent); -} -//# sourceMappingURL=mergeMapTo.js.map + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +//# sourceMappingURL=index.js.map /***/ }), -/* 280 */ +/* 271 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mergeScan", function() { return mergeScan; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MergeScanOperator", function() { return MergeScanOperator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MergeScanSubscriber", function() { return MergeScanSubscriber; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "audit", function() { return audit; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(182); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(171); -/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(183); -/** PURE_IMPORTS_START tslib,_util_subscribeToResult,_OuterSubscriber,_InnerSubscriber PURE_IMPORTS_END */ - +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(230); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function mergeScan(accumulator, seed, concurrent) { - if (concurrent === void 0) { - concurrent = Number.POSITIVE_INFINITY; - } - return function (source) { return source.lift(new MergeScanOperator(accumulator, seed, concurrent)); }; +function audit(durationSelector) { + return function auditOperatorFunction(source) { + return source.lift(new AuditOperator(durationSelector)); + }; } -var MergeScanOperator = /*@__PURE__*/ (function () { - function MergeScanOperator(accumulator, seed, concurrent) { - this.accumulator = accumulator; - this.seed = seed; - this.concurrent = concurrent; +var AuditOperator = /*@__PURE__*/ (function () { + function AuditOperator(durationSelector) { + this.durationSelector = durationSelector; } - MergeScanOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new MergeScanSubscriber(subscriber, this.accumulator, this.seed, this.concurrent)); + AuditOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new AuditSubscriber(subscriber, this.durationSelector)); }; - return MergeScanOperator; + return AuditOperator; }()); - -var MergeScanSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](MergeScanSubscriber, _super); - function MergeScanSubscriber(destination, accumulator, acc, concurrent) { +var AuditSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AuditSubscriber, _super); + function AuditSubscriber(destination, durationSelector) { var _this = _super.call(this, destination) || this; - _this.accumulator = accumulator; - _this.acc = acc; - _this.concurrent = concurrent; + _this.durationSelector = durationSelector; _this.hasValue = false; - _this.hasCompleted = false; - _this.buffer = []; - _this.active = 0; - _this.index = 0; return _this; } - MergeScanSubscriber.prototype._next = function (value) { - if (this.active < this.concurrent) { - var index = this.index++; - var destination = this.destination; - var ish = void 0; + AuditSubscriber.prototype._next = function (value) { + this.value = value; + this.hasValue = true; + if (!this.throttled) { + var duration = void 0; try { - var accumulator = this.accumulator; - ish = accumulator(this.acc, value, index); + var durationSelector = this.durationSelector; + duration = durationSelector(value); } - catch (e) { - return destination.error(e); + catch (err) { + return this.destination.error(err); } - this.active++; - this._innerSub(ish, value, index); - } - else { - this.buffer.push(value); - } - }; - MergeScanSubscriber.prototype._innerSub = function (ish, value, index) { - var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_3__["InnerSubscriber"](this, undefined, undefined); - var destination = this.destination; - destination.add(innerSubscriber); - Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_1__["subscribeToResult"])(this, ish, value, index, innerSubscriber); - }; - MergeScanSubscriber.prototype._complete = function () { - this.hasCompleted = true; - if (this.active === 0 && this.buffer.length === 0) { - if (this.hasValue === false) { - this.destination.next(this.acc); + var innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, duration); + if (!innerSubscription || innerSubscription.closed) { + this.clearThrottle(); + } + else { + this.add(this.throttled = innerSubscription); } - this.destination.complete(); } - this.unsubscribe(); - }; - MergeScanSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - var destination = this.destination; - this.acc = innerValue; - this.hasValue = true; - destination.next(innerValue); }; - MergeScanSubscriber.prototype.notifyComplete = function (innerSub) { - var buffer = this.buffer; - var destination = this.destination; - destination.remove(innerSub); - this.active--; - if (buffer.length > 0) { - this._next(buffer.shift()); + AuditSubscriber.prototype.clearThrottle = function () { + var _a = this, value = _a.value, hasValue = _a.hasValue, throttled = _a.throttled; + if (throttled) { + this.remove(throttled); + this.throttled = null; + throttled.unsubscribe(); } - else if (this.active === 0 && this.hasCompleted) { - if (this.hasValue === false) { - this.destination.next(this.acc); - } - this.destination.complete(); + if (hasValue) { + this.value = null; + this.hasValue = false; + this.destination.next(value); } }; - return MergeScanSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); - -//# sourceMappingURL=mergeScan.js.map + AuditSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex) { + this.clearThrottle(); + }; + AuditSubscriber.prototype.notifyComplete = function () { + this.clearThrottle(); + }; + return AuditSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=audit.js.map /***/ }), -/* 281 */ +/* 272 */ /***/ (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__(275); -/** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "auditTime", function() { return auditTime; }); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(215); +/* harmony import */ var _audit__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(271); +/* harmony import */ var _observable_timer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(267); +/** PURE_IMPORTS_START _scheduler_async,_audit,_observable_timer PURE_IMPORTS_END */ -function min(comparer) { - var min = (typeof comparer === 'function') - ? function (x, y) { return comparer(x, y) < 0 ? x : y; } - : function (x, y) { return x < y ? x : y; }; - return Object(_reduce__WEBPACK_IMPORTED_MODULE_0__["reduce"])(min); -} -//# sourceMappingURL=min.js.map -/***/ }), -/* 282 */ +function auditTime(duration, scheduler) { + if (scheduler === void 0) { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_0__["async"]; + } + return Object(_audit__WEBPACK_IMPORTED_MODULE_1__["audit"])(function () { return Object(_observable_timer__WEBPACK_IMPORTED_MODULE_2__["timer"])(duration, scheduler); }); +} +//# sourceMappingURL=auditTime.js.map + + +/***/ }), +/* 273 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "multicast", function() { return multicast; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MulticastOperator", function() { return MulticastOperator; }); -/* harmony import */ var _observable_ConnectableObservable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(283); -/** PURE_IMPORTS_START _observable_ConnectableObservable PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "buffer", function() { return buffer; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(230); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function multicast(subjectOrSubjectFactory, selector) { - return function multicastOperatorFunction(source) { - var subjectFactory; - if (typeof subjectOrSubjectFactory === 'function') { - subjectFactory = subjectOrSubjectFactory; - } - else { - subjectFactory = function subjectFactory() { - return subjectOrSubjectFactory; - }; - } - if (typeof selector === 'function') { - return source.lift(new MulticastOperator(subjectFactory, selector)); - } - var connectable = Object.create(source, _observable_ConnectableObservable__WEBPACK_IMPORTED_MODULE_0__["connectableObservableDescriptor"]); - connectable.source = source; - connectable.subjectFactory = subjectFactory; - return connectable; + + +function buffer(closingNotifier) { + return function bufferOperatorFunction(source) { + return source.lift(new BufferOperator(closingNotifier)); }; } -var MulticastOperator = /*@__PURE__*/ (function () { - function MulticastOperator(subjectFactory, selector) { - this.subjectFactory = subjectFactory; - this.selector = selector; +var BufferOperator = /*@__PURE__*/ (function () { + function BufferOperator(closingNotifier) { + this.closingNotifier = closingNotifier; } - MulticastOperator.prototype.call = function (subscriber, source) { - var selector = this.selector; - var subject = this.subjectFactory(); - var subscription = selector(subject).subscribe(subscriber); - subscription.add(source.subscribe(subject)); - return subscription; + BufferOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new BufferSubscriber(subscriber, this.closingNotifier)); }; - return MulticastOperator; + return BufferOperator; }()); - -//# sourceMappingURL=multicast.js.map +var BufferSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferSubscriber, _super); + function BufferSubscriber(destination, closingNotifier) { + var _this = _super.call(this, destination) || this; + _this.buffer = []; + _this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(_this, closingNotifier)); + return _this; + } + BufferSubscriber.prototype._next = function (value) { + this.buffer.push(value); + }; + BufferSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + var buffer = this.buffer; + this.buffer = []; + this.destination.next(buffer); + }; + return BufferSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=buffer.js.map /***/ }), -/* 283 */ +/* 274 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ConnectableObservable", function() { return ConnectableObservable; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "connectableObservableDescriptor", function() { return connectableObservableDescriptor; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bufferCount", function() { return bufferCount; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(265); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(193); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(172); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(177); -/* harmony import */ var _operators_refCount__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(284); -/** PURE_IMPORTS_START tslib,_Subject,_Observable,_Subscriber,_Subscription,_operators_refCount PURE_IMPORTS_END */ - - - - +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -var ConnectableObservable = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ConnectableObservable, _super); - function ConnectableObservable(source, subjectFactory) { - var _this = _super.call(this) || this; - _this.source = source; - _this.subjectFactory = subjectFactory; - _this._refCount = 0; - _this._isComplete = false; - return _this; +function bufferCount(bufferSize, startBufferEvery) { + if (startBufferEvery === void 0) { + startBufferEvery = null; } - ConnectableObservable.prototype._subscribe = function (subscriber) { - return this.getSubject().subscribe(subscriber); + return function bufferCountOperatorFunction(source) { + return source.lift(new BufferCountOperator(bufferSize, startBufferEvery)); }; - ConnectableObservable.prototype.getSubject = function () { - var subject = this._subject; - if (!subject || subject.isStopped) { - this._subject = this.subjectFactory(); +} +var BufferCountOperator = /*@__PURE__*/ (function () { + function BufferCountOperator(bufferSize, startBufferEvery) { + this.bufferSize = bufferSize; + this.startBufferEvery = startBufferEvery; + if (!startBufferEvery || bufferSize === startBufferEvery) { + this.subscriberClass = BufferCountSubscriber; } - return this._subject; - }; - ConnectableObservable.prototype.connect = function () { - var connection = this._connection; - if (!connection) { - this._isComplete = false; - connection = this._connection = new _Subscription__WEBPACK_IMPORTED_MODULE_4__["Subscription"](); - connection.add(this.source - .subscribe(new ConnectableSubscriber(this.getSubject(), this))); - if (connection.closed) { - this._connection = null; - connection = _Subscription__WEBPACK_IMPORTED_MODULE_4__["Subscription"].EMPTY; - } + else { + this.subscriberClass = BufferSkipCountSubscriber; } - return connection; - }; - ConnectableObservable.prototype.refCount = function () { - return Object(_operators_refCount__WEBPACK_IMPORTED_MODULE_5__["refCount"])()(this); - }; - return ConnectableObservable; -}(_Observable__WEBPACK_IMPORTED_MODULE_2__["Observable"])); - -var connectableObservableDescriptor = /*@__PURE__*/ (function () { - var connectableProto = ConnectableObservable.prototype; - return { - operator: { value: null }, - _refCount: { value: 0, writable: true }, - _subject: { value: null, writable: true }, - _connection: { value: null, writable: true }, - _subscribe: { value: connectableProto._subscribe }, - _isComplete: { value: connectableProto._isComplete, writable: true }, - getSubject: { value: connectableProto.getSubject }, - connect: { value: connectableProto.connect }, - refCount: { value: connectableProto.refCount } + } + BufferCountOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new this.subscriberClass(subscriber, this.bufferSize, this.startBufferEvery)); }; -})(); -var ConnectableSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ConnectableSubscriber, _super); - function ConnectableSubscriber(destination, connectable) { + return BufferCountOperator; +}()); +var BufferCountSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferCountSubscriber, _super); + function BufferCountSubscriber(destination, bufferSize) { var _this = _super.call(this, destination) || this; - _this.connectable = connectable; + _this.bufferSize = bufferSize; + _this.buffer = []; return _this; } - ConnectableSubscriber.prototype._error = function (err) { - this._unsubscribe(); - _super.prototype._error.call(this, err); - }; - ConnectableSubscriber.prototype._complete = function () { - this.connectable._isComplete = true; - this._unsubscribe(); - _super.prototype._complete.call(this); - }; - ConnectableSubscriber.prototype._unsubscribe = function () { - var connectable = this.connectable; - if (connectable) { - this.connectable = null; - var connection = connectable._connection; - connectable._refCount = 0; - connectable._subject = null; - connectable._connection = null; - if (connection) { - connection.unsubscribe(); - } + BufferCountSubscriber.prototype._next = function (value) { + var buffer = this.buffer; + buffer.push(value); + if (buffer.length == this.bufferSize) { + this.destination.next(buffer); + this.buffer = []; } }; - return ConnectableSubscriber; -}(_Subject__WEBPACK_IMPORTED_MODULE_1__["SubjectSubscriber"])); -var RefCountOperator = /*@__PURE__*/ (function () { - function RefCountOperator(connectable) { - this.connectable = connectable; - } - RefCountOperator.prototype.call = function (subscriber, source) { - var connectable = this.connectable; - connectable._refCount++; - var refCounter = new RefCountSubscriber(subscriber, connectable); - var subscription = source.subscribe(refCounter); - if (!refCounter.closed) { - refCounter.connection = connectable.connect(); + BufferCountSubscriber.prototype._complete = function () { + var buffer = this.buffer; + if (buffer.length > 0) { + this.destination.next(buffer); } - return subscription; + _super.prototype._complete.call(this); }; - return RefCountOperator; -}()); -var RefCountSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RefCountSubscriber, _super); - function RefCountSubscriber(destination, connectable) { + return BufferCountSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +var BufferSkipCountSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferSkipCountSubscriber, _super); + function BufferSkipCountSubscriber(destination, bufferSize, startBufferEvery) { var _this = _super.call(this, destination) || this; - _this.connectable = connectable; + _this.bufferSize = bufferSize; + _this.startBufferEvery = startBufferEvery; + _this.buffers = []; + _this.count = 0; return _this; } - RefCountSubscriber.prototype._unsubscribe = function () { - var connectable = this.connectable; - if (!connectable) { - this.connection = null; - return; - } - this.connectable = null; - var refCount = connectable._refCount; - if (refCount <= 0) { - this.connection = null; - return; + BufferSkipCountSubscriber.prototype._next = function (value) { + var _a = this, bufferSize = _a.bufferSize, startBufferEvery = _a.startBufferEvery, buffers = _a.buffers, count = _a.count; + this.count++; + if (count % startBufferEvery === 0) { + buffers.push([]); } - connectable._refCount = refCount - 1; - if (refCount > 1) { - this.connection = null; - return; + for (var i = buffers.length; i--;) { + var buffer = buffers[i]; + buffer.push(value); + if (buffer.length === bufferSize) { + buffers.splice(i, 1); + this.destination.next(buffer); + } } - var connection = this.connection; - var sharedConnection = connectable._connection; - this.connection = null; - if (sharedConnection && (!connection || sharedConnection === connection)) { - sharedConnection.unsubscribe(); + }; + BufferSkipCountSubscriber.prototype._complete = function () { + var _a = this, buffers = _a.buffers, destination = _a.destination; + while (buffers.length > 0) { + var buffer = buffers.shift(); + if (buffer.length > 0) { + destination.next(buffer); + } } + _super.prototype._complete.call(this); }; - return RefCountSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_3__["Subscriber"])); -//# sourceMappingURL=ConnectableObservable.js.map + return BufferSkipCountSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=bufferCount.js.map /***/ }), -/* 284 */ +/* 275 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "refCount", function() { return refCount; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bufferTime", function() { return bufferTime; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(215); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(172); +/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(205); +/** PURE_IMPORTS_START tslib,_scheduler_async,_Subscriber,_util_isScheduler PURE_IMPORTS_END */ -function refCount() { - return function refCountOperatorFunction(source) { - return source.lift(new RefCountOperator(source)); + + +function bufferTime(bufferTimeSpan) { + var length = arguments.length; + var scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; + if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_3__["isScheduler"])(arguments[arguments.length - 1])) { + scheduler = arguments[arguments.length - 1]; + length--; + } + var bufferCreationInterval = null; + if (length >= 2) { + bufferCreationInterval = arguments[1]; + } + var maxBufferSize = Number.POSITIVE_INFINITY; + if (length >= 3) { + maxBufferSize = arguments[2]; + } + return function bufferTimeOperatorFunction(source) { + return source.lift(new BufferTimeOperator(bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler)); }; } -var RefCountOperator = /*@__PURE__*/ (function () { - function RefCountOperator(connectable) { - this.connectable = connectable; +var BufferTimeOperator = /*@__PURE__*/ (function () { + function BufferTimeOperator(bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler) { + this.bufferTimeSpan = bufferTimeSpan; + this.bufferCreationInterval = bufferCreationInterval; + this.maxBufferSize = maxBufferSize; + this.scheduler = scheduler; } - RefCountOperator.prototype.call = function (subscriber, source) { - var connectable = this.connectable; - connectable._refCount++; - var refCounter = new RefCountSubscriber(subscriber, connectable); - var subscription = source.subscribe(refCounter); - if (!refCounter.closed) { - refCounter.connection = connectable.connect(); - } - return subscription; + BufferTimeOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new BufferTimeSubscriber(subscriber, this.bufferTimeSpan, this.bufferCreationInterval, this.maxBufferSize, this.scheduler)); }; - return RefCountOperator; + return BufferTimeOperator; }()); -var RefCountSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RefCountSubscriber, _super); - function RefCountSubscriber(destination, connectable) { +var Context = /*@__PURE__*/ (function () { + function Context() { + this.buffer = []; + } + return Context; +}()); +var BufferTimeSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferTimeSubscriber, _super); + function BufferTimeSubscriber(destination, bufferTimeSpan, bufferCreationInterval, maxBufferSize, scheduler) { var _this = _super.call(this, destination) || this; - _this.connectable = connectable; + _this.bufferTimeSpan = bufferTimeSpan; + _this.bufferCreationInterval = bufferCreationInterval; + _this.maxBufferSize = maxBufferSize; + _this.scheduler = scheduler; + _this.contexts = []; + var context = _this.openContext(); + _this.timespanOnly = bufferCreationInterval == null || bufferCreationInterval < 0; + if (_this.timespanOnly) { + var timeSpanOnlyState = { subscriber: _this, context: context, bufferTimeSpan: bufferTimeSpan }; + _this.add(context.closeAction = scheduler.schedule(dispatchBufferTimeSpanOnly, bufferTimeSpan, timeSpanOnlyState)); + } + else { + var closeState = { subscriber: _this, context: context }; + var creationState = { bufferTimeSpan: bufferTimeSpan, bufferCreationInterval: bufferCreationInterval, subscriber: _this, scheduler: scheduler }; + _this.add(context.closeAction = scheduler.schedule(dispatchBufferClose, bufferTimeSpan, closeState)); + _this.add(scheduler.schedule(dispatchBufferCreation, bufferCreationInterval, creationState)); + } return _this; } - RefCountSubscriber.prototype._unsubscribe = function () { - var connectable = this.connectable; - if (!connectable) { - this.connection = null; - return; + BufferTimeSubscriber.prototype._next = function (value) { + var contexts = this.contexts; + var len = contexts.length; + var filledBufferContext; + for (var i = 0; i < len; i++) { + var context_1 = contexts[i]; + var buffer = context_1.buffer; + buffer.push(value); + if (buffer.length == this.maxBufferSize) { + filledBufferContext = context_1; + } } - this.connectable = null; - var refCount = connectable._refCount; - if (refCount <= 0) { - this.connection = null; - return; + if (filledBufferContext) { + this.onBufferFull(filledBufferContext); } - connectable._refCount = refCount - 1; - if (refCount > 1) { - this.connection = null; - return; + }; + BufferTimeSubscriber.prototype._error = function (err) { + this.contexts.length = 0; + _super.prototype._error.call(this, err); + }; + BufferTimeSubscriber.prototype._complete = function () { + var _a = this, contexts = _a.contexts, destination = _a.destination; + while (contexts.length > 0) { + var context_2 = contexts.shift(); + destination.next(context_2.buffer); } - var connection = this.connection; - var sharedConnection = connectable._connection; - this.connection = null; - if (sharedConnection && (!connection || sharedConnection === connection)) { - sharedConnection.unsubscribe(); + _super.prototype._complete.call(this); + }; + BufferTimeSubscriber.prototype._unsubscribe = function () { + this.contexts = null; + }; + BufferTimeSubscriber.prototype.onBufferFull = function (context) { + this.closeContext(context); + var closeAction = context.closeAction; + closeAction.unsubscribe(); + this.remove(closeAction); + if (!this.closed && this.timespanOnly) { + context = this.openContext(); + var bufferTimeSpan = this.bufferTimeSpan; + var timeSpanOnlyState = { subscriber: this, context: context, bufferTimeSpan: bufferTimeSpan }; + this.add(context.closeAction = this.scheduler.schedule(dispatchBufferTimeSpanOnly, bufferTimeSpan, timeSpanOnlyState)); } }; - return RefCountSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=refCount.js.map + BufferTimeSubscriber.prototype.openContext = function () { + var context = new Context(); + this.contexts.push(context); + return context; + }; + BufferTimeSubscriber.prototype.closeContext = function (context) { + this.destination.next(context.buffer); + var contexts = this.contexts; + var spliceIndex = contexts ? contexts.indexOf(context) : -1; + if (spliceIndex >= 0) { + contexts.splice(contexts.indexOf(context), 1); + } + }; + return BufferTimeSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_2__["Subscriber"])); +function dispatchBufferTimeSpanOnly(state) { + var subscriber = state.subscriber; + var prevContext = state.context; + if (prevContext) { + subscriber.closeContext(prevContext); + } + if (!subscriber.closed) { + state.context = subscriber.openContext(); + state.context.closeAction = this.schedule(state, state.bufferTimeSpan); + } +} +function dispatchBufferCreation(state) { + var bufferCreationInterval = state.bufferCreationInterval, bufferTimeSpan = state.bufferTimeSpan, subscriber = state.subscriber, scheduler = state.scheduler; + var context = subscriber.openContext(); + var action = this; + if (!subscriber.closed) { + subscriber.add(context.closeAction = scheduler.schedule(dispatchBufferClose, bufferTimeSpan, { subscriber: subscriber, context: context })); + action.schedule(state, bufferCreationInterval); + } +} +function dispatchBufferClose(arg) { + var subscriber = arg.subscriber, context = arg.context; + subscriber.closeContext(context); +} +//# sourceMappingURL=bufferTime.js.map /***/ }), -/* 285 */ +/* 276 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "observeOn", function() { return observeOn; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ObserveOnOperator", function() { return ObserveOnOperator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ObserveOnSubscriber", function() { return ObserveOnSubscriber; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ObserveOnMessage", function() { return ObserveOnMessage; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bufferToggle", function() { return bufferToggle; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _Notification__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(241); -/** PURE_IMPORTS_START tslib,_Subscriber,_Notification PURE_IMPORTS_END */ +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(177); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(230); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(229); +/** PURE_IMPORTS_START tslib,_Subscription,_util_subscribeToResult,_OuterSubscriber PURE_IMPORTS_END */ -function observeOn(scheduler, delay) { - if (delay === void 0) { - delay = 0; - } - return function observeOnOperatorFunction(source) { - return source.lift(new ObserveOnOperator(scheduler, delay)); + +function bufferToggle(openings, closingSelector) { + return function bufferToggleOperatorFunction(source) { + return source.lift(new BufferToggleOperator(openings, closingSelector)); }; } -var ObserveOnOperator = /*@__PURE__*/ (function () { - function ObserveOnOperator(scheduler, delay) { - if (delay === void 0) { - delay = 0; - } - this.scheduler = scheduler; - this.delay = delay; +var BufferToggleOperator = /*@__PURE__*/ (function () { + function BufferToggleOperator(openings, closingSelector) { + this.openings = openings; + this.closingSelector = closingSelector; } - ObserveOnOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new ObserveOnSubscriber(subscriber, this.scheduler, this.delay)); + BufferToggleOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new BufferToggleSubscriber(subscriber, this.openings, this.closingSelector)); }; - return ObserveOnOperator; + return BufferToggleOperator; }()); - -var ObserveOnSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ObserveOnSubscriber, _super); - function ObserveOnSubscriber(destination, scheduler, delay) { - if (delay === void 0) { - delay = 0; - } +var BufferToggleSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferToggleSubscriber, _super); + function BufferToggleSubscriber(destination, openings, closingSelector) { var _this = _super.call(this, destination) || this; - _this.scheduler = scheduler; - _this.delay = delay; - return _this; - } - ObserveOnSubscriber.dispatch = function (arg) { - var notification = arg.notification, destination = arg.destination; - notification.observe(destination); - this.unsubscribe(); + _this.openings = openings; + _this.closingSelector = closingSelector; + _this.contexts = []; + _this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(_this, openings)); + return _this; + } + BufferToggleSubscriber.prototype._next = function (value) { + var contexts = this.contexts; + var len = contexts.length; + for (var i = 0; i < len; i++) { + contexts[i].buffer.push(value); + } }; - ObserveOnSubscriber.prototype.scheduleMessage = function (notification) { - var destination = this.destination; - destination.add(this.scheduler.schedule(ObserveOnSubscriber.dispatch, this.delay, new ObserveOnMessage(notification, this.destination))); + BufferToggleSubscriber.prototype._error = function (err) { + var contexts = this.contexts; + while (contexts.length > 0) { + var context_1 = contexts.shift(); + context_1.subscription.unsubscribe(); + context_1.buffer = null; + context_1.subscription = null; + } + this.contexts = null; + _super.prototype._error.call(this, err); }; - ObserveOnSubscriber.prototype._next = function (value) { - this.scheduleMessage(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createNext(value)); + BufferToggleSubscriber.prototype._complete = function () { + var contexts = this.contexts; + while (contexts.length > 0) { + var context_2 = contexts.shift(); + this.destination.next(context_2.buffer); + context_2.subscription.unsubscribe(); + context_2.buffer = null; + context_2.subscription = null; + } + this.contexts = null; + _super.prototype._complete.call(this); }; - ObserveOnSubscriber.prototype._error = function (err) { - this.scheduleMessage(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createError(err)); - this.unsubscribe(); + BufferToggleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + outerValue ? this.closeBuffer(outerValue) : this.openBuffer(innerValue); }; - ObserveOnSubscriber.prototype._complete = function () { - this.scheduleMessage(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createComplete()); - this.unsubscribe(); + BufferToggleSubscriber.prototype.notifyComplete = function (innerSub) { + this.closeBuffer(innerSub.context); }; - return ObserveOnSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); - -var ObserveOnMessage = /*@__PURE__*/ (function () { - function ObserveOnMessage(notification, destination) { - this.notification = notification; - this.destination = destination; - } - return ObserveOnMessage; -}()); - -//# sourceMappingURL=observeOn.js.map + BufferToggleSubscriber.prototype.openBuffer = function (value) { + try { + var closingSelector = this.closingSelector; + var closingNotifier = closingSelector.call(this, value); + if (closingNotifier) { + this.trySubscribe(closingNotifier); + } + } + catch (err) { + this._error(err); + } + }; + BufferToggleSubscriber.prototype.closeBuffer = function (context) { + var contexts = this.contexts; + if (contexts && context) { + var buffer = context.buffer, subscription = context.subscription; + this.destination.next(buffer); + contexts.splice(contexts.indexOf(context), 1); + this.remove(subscription); + subscription.unsubscribe(); + } + }; + BufferToggleSubscriber.prototype.trySubscribe = function (closingNotifier) { + var contexts = this.contexts; + var buffer = []; + var subscription = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); + var context = { buffer: buffer, subscription: subscription }; + contexts.push(context); + var innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, closingNotifier, context); + if (!innerSubscription || innerSubscription.closed) { + this.closeBuffer(context); + } + else { + innerSubscription.context = context; + this.add(innerSubscription); + subscription.add(innerSubscription); + } + }; + return BufferToggleSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); +//# sourceMappingURL=bufferToggle.js.map /***/ }), -/* 286 */ +/* 277 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "onErrorResumeNext", function() { return onErrorResumeNext; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "onErrorResumeNextStatic", function() { return onErrorResumeNextStatic; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bufferWhen", function() { return bufferWhen; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _observable_from__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(218); -/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(178); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(171); -/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(183); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(182); -/** PURE_IMPORTS_START tslib,_observable_from,_util_isArray,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - - +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(177); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(229); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(230); +/** PURE_IMPORTS_START tslib,_Subscription,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function onErrorResumeNext() { - var nextSources = []; - for (var _i = 0; _i < arguments.length; _i++) { - nextSources[_i] = arguments[_i]; - } - if (nextSources.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_2__["isArray"])(nextSources[0])) { - nextSources = nextSources[0]; - } - return function (source) { return source.lift(new OnErrorResumeNextOperator(nextSources)); }; -} -function onErrorResumeNextStatic() { - var nextSources = []; - for (var _i = 0; _i < arguments.length; _i++) { - nextSources[_i] = arguments[_i]; - } - var source = null; - if (nextSources.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_2__["isArray"])(nextSources[0])) { - nextSources = nextSources[0]; - } - source = nextSources.shift(); - return Object(_observable_from__WEBPACK_IMPORTED_MODULE_1__["from"])(source, null).lift(new OnErrorResumeNextOperator(nextSources)); +function bufferWhen(closingSelector) { + return function (source) { + return source.lift(new BufferWhenOperator(closingSelector)); + }; } -var OnErrorResumeNextOperator = /*@__PURE__*/ (function () { - function OnErrorResumeNextOperator(nextSources) { - this.nextSources = nextSources; +var BufferWhenOperator = /*@__PURE__*/ (function () { + function BufferWhenOperator(closingSelector) { + this.closingSelector = closingSelector; } - OnErrorResumeNextOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new OnErrorResumeNextSubscriber(subscriber, this.nextSources)); + BufferWhenOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new BufferWhenSubscriber(subscriber, this.closingSelector)); }; - return OnErrorResumeNextOperator; + return BufferWhenOperator; }()); -var OnErrorResumeNextSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](OnErrorResumeNextSubscriber, _super); - function OnErrorResumeNextSubscriber(destination, nextSources) { +var BufferWhenSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BufferWhenSubscriber, _super); + function BufferWhenSubscriber(destination, closingSelector) { var _this = _super.call(this, destination) || this; - _this.destination = destination; - _this.nextSources = nextSources; + _this.closingSelector = closingSelector; + _this.subscribing = false; + _this.openBuffer(); return _this; } - OnErrorResumeNextSubscriber.prototype.notifyError = function (error, innerSub) { - this.subscribeToNextSource(); + BufferWhenSubscriber.prototype._next = function (value) { + this.buffer.push(value); }; - OnErrorResumeNextSubscriber.prototype.notifyComplete = function (innerSub) { - this.subscribeToNextSource(); + BufferWhenSubscriber.prototype._complete = function () { + var buffer = this.buffer; + if (buffer) { + this.destination.next(buffer); + } + _super.prototype._complete.call(this); }; - OnErrorResumeNextSubscriber.prototype._error = function (err) { - this.subscribeToNextSource(); - this.unsubscribe(); + BufferWhenSubscriber.prototype._unsubscribe = function () { + this.buffer = null; + this.subscribing = false; }; - OnErrorResumeNextSubscriber.prototype._complete = function () { - this.subscribeToNextSource(); - this.unsubscribe(); + BufferWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.openBuffer(); }; - OnErrorResumeNextSubscriber.prototype.subscribeToNextSource = function () { - var next = this.nextSources.shift(); - if (!!next) { - var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_4__["InnerSubscriber"](this, undefined, undefined); - var destination = this.destination; - destination.add(innerSubscriber); - Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_5__["subscribeToResult"])(this, next, undefined, undefined, innerSubscriber); + BufferWhenSubscriber.prototype.notifyComplete = function () { + if (this.subscribing) { + this.complete(); } else { - this.destination.complete(); + this.openBuffer(); } }; - return OnErrorResumeNextSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); -//# sourceMappingURL=onErrorResumeNext.js.map + BufferWhenSubscriber.prototype.openBuffer = function () { + var closingSubscription = this.closingSubscription; + if (closingSubscription) { + this.remove(closingSubscription); + closingSubscription.unsubscribe(); + } + var buffer = this.buffer; + if (this.buffer) { + this.destination.next(buffer); + } + this.buffer = []; + var closingNotifier; + try { + var closingSelector = this.closingSelector; + closingNotifier = closingSelector(); + } + catch (err) { + return this.error(err); + } + closingSubscription = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); + this.closingSubscription = closingSubscription; + this.add(closingSubscription); + this.subscribing = true; + closingSubscription.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, closingNotifier)); + this.subscribing = false; + }; + return BufferWhenSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); +//# sourceMappingURL=bufferWhen.js.map /***/ }), -/* 287 */ +/* 278 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pairwise", function() { return pairwise; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "catchError", function() { return catchError; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); +/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(231); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(230); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function pairwise() { - return function (source) { return source.lift(new PairwiseOperator()); }; + + +function catchError(selector) { + return function catchErrorOperatorFunction(source) { + var operator = new CatchOperator(selector); + var caught = source.lift(operator); + return (operator.caught = caught); + }; } -var PairwiseOperator = /*@__PURE__*/ (function () { - function PairwiseOperator() { +var CatchOperator = /*@__PURE__*/ (function () { + function CatchOperator(selector) { + this.selector = selector; } - PairwiseOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new PairwiseSubscriber(subscriber)); + CatchOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new CatchSubscriber(subscriber, this.selector, this.caught)); }; - return PairwiseOperator; + return CatchOperator; }()); -var PairwiseSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](PairwiseSubscriber, _super); - function PairwiseSubscriber(destination) { +var CatchSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](CatchSubscriber, _super); + function CatchSubscriber(destination, selector, caught) { var _this = _super.call(this, destination) || this; - _this.hasPrev = false; + _this.selector = selector; + _this.caught = caught; return _this; } - PairwiseSubscriber.prototype._next = function (value) { - var pair; - if (this.hasPrev) { - pair = [this.prev, value]; - } - else { - this.hasPrev = true; - } - this.prev = value; - if (pair) { - this.destination.next(pair); + CatchSubscriber.prototype.error = function (err) { + if (!this.isStopped) { + var result = void 0; + try { + result = this.selector(err, this.caught); + } + catch (err2) { + _super.prototype.error.call(this, err2); + return; + } + this._unsubscribeAndRecycle(); + var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__["InnerSubscriber"](this, undefined, undefined); + this.add(innerSubscriber); + Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, result, undefined, undefined, innerSubscriber); } }; - return PairwiseSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=pairwise.js.map + return CatchSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=catchError.js.map /***/ }), -/* 288 */ +/* 279 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "partition", function() { return partition; }); -/* harmony import */ var _util_not__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(289); -/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(251); -/** PURE_IMPORTS_START _util_not,_filter PURE_IMPORTS_END */ - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "combineAll", function() { return combineAll; }); +/* harmony import */ var _observable_combineLatest__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(228); +/** PURE_IMPORTS_START _observable_combineLatest PURE_IMPORTS_END */ -function partition(predicate, thisArg) { - return function (source) { - return [ - Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(predicate, thisArg)(source), - Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(Object(_util_not__WEBPACK_IMPORTED_MODULE_0__["not"])(predicate, thisArg))(source) - ]; - }; +function combineAll(project) { + return function (source) { return source.lift(new _observable_combineLatest__WEBPACK_IMPORTED_MODULE_0__["CombineLatestOperator"](project)); }; } -//# sourceMappingURL=partition.js.map +//# sourceMappingURL=combineAll.js.map /***/ }), -/* 289 */ +/* 280 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "not", function() { return not; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -function not(pred, thisArg) { - function notPred() { - return !(notPred.pred.apply(notPred.thisArg, arguments)); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "combineLatest", function() { return combineLatest; }); +/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(178); +/* harmony import */ var _observable_combineLatest__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(228); +/* harmony import */ var _observable_from__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(243); +/** PURE_IMPORTS_START _util_isArray,_observable_combineLatest,_observable_from PURE_IMPORTS_END */ + + + +var none = {}; +function combineLatest() { + var observables = []; + for (var _i = 0; _i < arguments.length; _i++) { + observables[_i] = arguments[_i]; } - notPred.pred = pred; - notPred.thisArg = thisArg; - return notPred; + var project = null; + if (typeof observables[observables.length - 1] === 'function') { + project = observables.pop(); + } + if (observables.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_0__["isArray"])(observables[0])) { + observables = observables[0].slice(); + } + return function (source) { return source.lift.call(Object(_observable_from__WEBPACK_IMPORTED_MODULE_2__["from"])([source].concat(observables)), new _observable_combineLatest__WEBPACK_IMPORTED_MODULE_1__["CombineLatestOperator"](project)); }; } -//# sourceMappingURL=not.js.map +//# sourceMappingURL=combineLatest.js.map /***/ }), -/* 290 */ +/* 281 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pluck", function() { return pluck; }); -/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(231); -/** PURE_IMPORTS_START _map PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concat", function() { return concat; }); +/* harmony import */ var _observable_concat__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(239); +/** PURE_IMPORTS_START _observable_concat PURE_IMPORTS_END */ -function pluck() { - var properties = []; +function concat() { + var observables = []; for (var _i = 0; _i < arguments.length; _i++) { - properties[_i] = arguments[_i]; - } - var length = properties.length; - if (length === 0) { - throw new Error('list of properties cannot be empty.'); + observables[_i] = arguments[_i]; } - return function (source) { return Object(_map__WEBPACK_IMPORTED_MODULE_0__["map"])(plucker(properties, length))(source); }; -} -function plucker(props, length) { - var mapper = function (x) { - var currentProp = x; - for (var i = 0; i < length; i++) { - var p = currentProp[props[i]]; - if (typeof p !== 'undefined') { - currentProp = p; - } - else { - return undefined; - } - } - return currentProp; - }; - return mapper; + return function (source) { return source.lift.call(_observable_concat__WEBPACK_IMPORTED_MODULE_0__["concat"].apply(void 0, [source].concat(observables))); }; } -//# sourceMappingURL=pluck.js.map +//# sourceMappingURL=concat.js.map /***/ }), -/* 291 */ +/* 282 */ /***/ (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__(265); -/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(282); -/** PURE_IMPORTS_START _Subject,_multicast PURE_IMPORTS_END */ - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concatMap", function() { return concatMap; }); +/* harmony import */ var _mergeMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(242); +/** PURE_IMPORTS_START _mergeMap PURE_IMPORTS_END */ -function publish(selector) { - return selector ? - Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(function () { return new _Subject__WEBPACK_IMPORTED_MODULE_0__["Subject"](); }, selector) : - Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(new _Subject__WEBPACK_IMPORTED_MODULE_0__["Subject"]()); +function concatMap(project, resultSelector) { + return Object(_mergeMap__WEBPACK_IMPORTED_MODULE_0__["mergeMap"])(project, resultSelector, 1); } -//# sourceMappingURL=publish.js.map +//# sourceMappingURL=concatMap.js.map /***/ }), -/* 292 */ +/* 283 */ /***/ (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__(293); -/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(282); -/** PURE_IMPORTS_START _BehaviorSubject,_multicast PURE_IMPORTS_END */ - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "concatMapTo", function() { return concatMapTo; }); +/* harmony import */ var _concatMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(282); +/** PURE_IMPORTS_START _concatMap PURE_IMPORTS_END */ -function publishBehavior(value) { - return function (source) { return Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(new _BehaviorSubject__WEBPACK_IMPORTED_MODULE_0__["BehaviorSubject"](value))(source); }; +function concatMapTo(innerObservable, resultSelector) { + return Object(_concatMap__WEBPACK_IMPORTED_MODULE_0__["concatMap"])(function () { return innerObservable; }, resultSelector); } -//# sourceMappingURL=publishBehavior.js.map +//# sourceMappingURL=concatMapTo.js.map /***/ }), -/* 293 */ +/* 284 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "BehaviorSubject", function() { return BehaviorSubject; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "count", function() { return count; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(265); -/* harmony import */ var _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(266); -/** PURE_IMPORTS_START tslib,_Subject,_util_ObjectUnsubscribedError PURE_IMPORTS_END */ - +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -var BehaviorSubject = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](BehaviorSubject, _super); - function BehaviorSubject(_value) { - var _this = _super.call(this) || this; - _this._value = _value; +function count(predicate) { + return function (source) { return source.lift(new CountOperator(predicate, source)); }; +} +var CountOperator = /*@__PURE__*/ (function () { + function CountOperator(predicate, source) { + this.predicate = predicate; + this.source = source; + } + CountOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new CountSubscriber(subscriber, this.predicate, this.source)); + }; + return CountOperator; +}()); +var CountSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](CountSubscriber, _super); + function CountSubscriber(destination, predicate, source) { + var _this = _super.call(this, destination) || this; + _this.predicate = predicate; + _this.source = source; + _this.count = 0; + _this.index = 0; return _this; } - Object.defineProperty(BehaviorSubject.prototype, "value", { - get: function () { - return this.getValue(); - }, - enumerable: true, - configurable: true - }); - BehaviorSubject.prototype._subscribe = function (subscriber) { - var subscription = _super.prototype._subscribe.call(this, subscriber); - if (subscription && !subscription.closed) { - subscriber.next(this._value); + CountSubscriber.prototype._next = function (value) { + if (this.predicate) { + this._tryPredicate(value); + } + else { + this.count++; } - return subscription; }; - BehaviorSubject.prototype.getValue = function () { - if (this.hasError) { - throw this.thrownError; + CountSubscriber.prototype._tryPredicate = function (value) { + var result; + try { + result = this.predicate(value, this.index++, this.source); } - else if (this.closed) { - throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_2__["ObjectUnsubscribedError"](); + catch (err) { + this.destination.error(err); + return; } - else { - return this._value; + if (result) { + this.count++; } }; - BehaviorSubject.prototype.next = function (value) { - _super.prototype.next.call(this, this._value = value); + CountSubscriber.prototype._complete = function () { + this.destination.next(this.count); + this.destination.complete(); }; - return BehaviorSubject; -}(_Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"])); - -//# sourceMappingURL=BehaviorSubject.js.map + return CountSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=count.js.map /***/ }), -/* 294 */ +/* 285 */ /***/ (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__(295); -/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(282); -/** PURE_IMPORTS_START _AsyncSubject,_multicast PURE_IMPORTS_END */ - - -function publishLast() { - return function (source) { return Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(new _AsyncSubject__WEBPACK_IMPORTED_MODULE_0__["AsyncSubject"]())(source); }; -} -//# sourceMappingURL=publishLast.js.map +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "debounce", function() { return debounce; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(230); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -/***/ }), -/* 295 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AsyncSubject", function() { return AsyncSubject; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(265); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(177); -/** PURE_IMPORTS_START tslib,_Subject,_Subscription PURE_IMPORTS_END */ - - - -var AsyncSubject = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AsyncSubject, _super); - function AsyncSubject() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this.value = null; - _this.hasNext = false; - _this.hasCompleted = false; +function debounce(durationSelector) { + return function (source) { return source.lift(new DebounceOperator(durationSelector)); }; +} +var DebounceOperator = /*@__PURE__*/ (function () { + function DebounceOperator(durationSelector) { + this.durationSelector = durationSelector; + } + DebounceOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new DebounceSubscriber(subscriber, this.durationSelector)); + }; + return DebounceOperator; +}()); +var DebounceSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DebounceSubscriber, _super); + function DebounceSubscriber(destination, durationSelector) { + var _this = _super.call(this, destination) || this; + _this.durationSelector = durationSelector; + _this.hasValue = false; + _this.durationSubscription = null; return _this; } - AsyncSubject.prototype._subscribe = function (subscriber) { - if (this.hasError) { - subscriber.error(this.thrownError); - return _Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"].EMPTY; + DebounceSubscriber.prototype._next = function (value) { + try { + var result = this.durationSelector.call(this, value); + if (result) { + this._tryNext(value, result); + } } - else if (this.hasCompleted && this.hasNext) { - subscriber.next(this.value); - subscriber.complete(); - return _Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"].EMPTY; + catch (err) { + this.destination.error(err); } - return _super.prototype._subscribe.call(this, subscriber); }; - AsyncSubject.prototype.next = function (value) { - if (!this.hasCompleted) { - this.value = value; - this.hasNext = true; - } + DebounceSubscriber.prototype._complete = function () { + this.emitValue(); + this.destination.complete(); }; - AsyncSubject.prototype.error = function (error) { - if (!this.hasCompleted) { - _super.prototype.error.call(this, error); + DebounceSubscriber.prototype._tryNext = function (value, duration) { + var subscription = this.durationSubscription; + this.value = value; + this.hasValue = true; + if (subscription) { + subscription.unsubscribe(); + this.remove(subscription); + } + subscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, duration); + if (subscription && !subscription.closed) { + this.add(this.durationSubscription = subscription); } }; - AsyncSubject.prototype.complete = function () { - this.hasCompleted = true; - if (this.hasNext) { - _super.prototype.next.call(this, this.value); + DebounceSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.emitValue(); + }; + DebounceSubscriber.prototype.notifyComplete = function () { + this.emitValue(); + }; + DebounceSubscriber.prototype.emitValue = function () { + if (this.hasValue) { + var value = this.value; + var subscription = this.durationSubscription; + if (subscription) { + this.durationSubscription = null; + subscription.unsubscribe(); + this.remove(subscription); + } + this.value = null; + this.hasValue = false; + _super.prototype._next.call(this, value); } - _super.prototype.complete.call(this); }; - return AsyncSubject; -}(_Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"])); - -//# sourceMappingURL=AsyncSubject.js.map - - -/***/ }), -/* 296 */ -/***/ (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__(297); -/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(282); -/** PURE_IMPORTS_START _ReplaySubject,_multicast PURE_IMPORTS_END */ - - -function publishReplay(bufferSize, windowTime, selectorOrScheduler, scheduler) { - if (selectorOrScheduler && typeof selectorOrScheduler !== 'function') { - scheduler = selectorOrScheduler; - } - var selector = typeof selectorOrScheduler === 'function' ? selectorOrScheduler : undefined; - var subject = new _ReplaySubject__WEBPACK_IMPORTED_MODULE_0__["ReplaySubject"](bufferSize, windowTime, scheduler); - return function (source) { return Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(function () { return subject; }, selector)(source); }; -} -//# sourceMappingURL=publishReplay.js.map + return DebounceSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=debounce.js.map /***/ }), -/* 297 */ +/* 286 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ReplaySubject", function() { return ReplaySubject; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "debounceTime", function() { return debounceTime; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(265); -/* harmony import */ var _scheduler_queue__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(298); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(177); -/* harmony import */ var _operators_observeOn__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(285); -/* harmony import */ var _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(266); -/* harmony import */ var _SubjectSubscription__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(267); -/** PURE_IMPORTS_START tslib,_Subject,_scheduler_queue,_Subscription,_operators_observeOn,_util_ObjectUnsubscribedError,_SubjectSubscription PURE_IMPORTS_END */ - - - - +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(215); +/** PURE_IMPORTS_START tslib,_Subscriber,_scheduler_async PURE_IMPORTS_END */ -var ReplaySubject = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ReplaySubject, _super); - function ReplaySubject(bufferSize, windowTime, scheduler) { - if (bufferSize === void 0) { - bufferSize = Number.POSITIVE_INFINITY; - } - if (windowTime === void 0) { - windowTime = Number.POSITIVE_INFINITY; - } - var _this = _super.call(this) || this; +function debounceTime(dueTime, scheduler) { + if (scheduler === void 0) { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_2__["async"]; + } + return function (source) { return source.lift(new DebounceTimeOperator(dueTime, scheduler)); }; +} +var DebounceTimeOperator = /*@__PURE__*/ (function () { + function DebounceTimeOperator(dueTime, scheduler) { + this.dueTime = dueTime; + this.scheduler = scheduler; + } + DebounceTimeOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new DebounceTimeSubscriber(subscriber, this.dueTime, this.scheduler)); + }; + return DebounceTimeOperator; +}()); +var DebounceTimeSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DebounceTimeSubscriber, _super); + function DebounceTimeSubscriber(destination, dueTime, scheduler) { + var _this = _super.call(this, destination) || this; + _this.dueTime = dueTime; _this.scheduler = scheduler; - _this._events = []; - _this._infiniteTimeWindow = false; - _this._bufferSize = bufferSize < 1 ? 1 : bufferSize; - _this._windowTime = windowTime < 1 ? 1 : windowTime; - if (windowTime === Number.POSITIVE_INFINITY) { - _this._infiniteTimeWindow = true; - _this.next = _this.nextInfiniteTimeWindow; - } - else { - _this.next = _this.nextTimeWindow; - } + _this.debouncedSubscription = null; + _this.lastValue = null; + _this.hasValue = false; return _this; } - ReplaySubject.prototype.nextInfiniteTimeWindow = function (value) { - var _events = this._events; - _events.push(value); - if (_events.length > this._bufferSize) { - _events.shift(); - } - _super.prototype.next.call(this, value); + DebounceTimeSubscriber.prototype._next = function (value) { + this.clearDebounce(); + this.lastValue = value; + this.hasValue = true; + this.add(this.debouncedSubscription = this.scheduler.schedule(dispatchNext, this.dueTime, this)); }; - ReplaySubject.prototype.nextTimeWindow = function (value) { - this._events.push(new ReplayEvent(this._getNow(), value)); - this._trimBufferThenGetEvents(); - _super.prototype.next.call(this, value); + DebounceTimeSubscriber.prototype._complete = function () { + this.debouncedNext(); + this.destination.complete(); }; - ReplaySubject.prototype._subscribe = function (subscriber) { - var _infiniteTimeWindow = this._infiniteTimeWindow; - var _events = _infiniteTimeWindow ? this._events : this._trimBufferThenGetEvents(); - var scheduler = this.scheduler; - var len = _events.length; - var subscription; - if (this.closed) { - throw new _util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_5__["ObjectUnsubscribedError"](); - } - else if (this.isStopped || this.hasError) { - subscription = _Subscription__WEBPACK_IMPORTED_MODULE_3__["Subscription"].EMPTY; - } - else { - this.observers.push(subscriber); - subscription = new _SubjectSubscription__WEBPACK_IMPORTED_MODULE_6__["SubjectSubscription"](this, subscriber); - } - if (scheduler) { - subscriber.add(subscriber = new _operators_observeOn__WEBPACK_IMPORTED_MODULE_4__["ObserveOnSubscriber"](subscriber, scheduler)); - } - if (_infiniteTimeWindow) { - for (var i = 0; i < len && !subscriber.closed; i++) { - subscriber.next(_events[i]); - } - } - else { - for (var i = 0; i < len && !subscriber.closed; i++) { - subscriber.next(_events[i].value); - } - } - if (this.hasError) { - subscriber.error(this.thrownError); - } - else if (this.isStopped) { - subscriber.complete(); + DebounceTimeSubscriber.prototype.debouncedNext = function () { + this.clearDebounce(); + if (this.hasValue) { + var lastValue = this.lastValue; + this.lastValue = null; + this.hasValue = false; + this.destination.next(lastValue); } - return subscription; - }; - ReplaySubject.prototype._getNow = function () { - return (this.scheduler || _scheduler_queue__WEBPACK_IMPORTED_MODULE_2__["queue"]).now(); }; - ReplaySubject.prototype._trimBufferThenGetEvents = function () { - var now = this._getNow(); - var _bufferSize = this._bufferSize; - var _windowTime = this._windowTime; - var _events = this._events; - var eventsCount = _events.length; - var spliceCount = 0; - while (spliceCount < eventsCount) { - if ((now - _events[spliceCount].time) < _windowTime) { - break; - } - spliceCount++; - } - if (eventsCount > _bufferSize) { - spliceCount = Math.max(spliceCount, eventsCount - _bufferSize); - } - if (spliceCount > 0) { - _events.splice(0, spliceCount); + DebounceTimeSubscriber.prototype.clearDebounce = function () { + var debouncedSubscription = this.debouncedSubscription; + if (debouncedSubscription !== null) { + this.remove(debouncedSubscription); + debouncedSubscription.unsubscribe(); + this.debouncedSubscription = null; } - return _events; }; - return ReplaySubject; -}(_Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"])); - -var ReplayEvent = /*@__PURE__*/ (function () { - function ReplayEvent(time, value) { - this.time = time; - this.value = value; - } - return ReplayEvent; -}()); -//# sourceMappingURL=ReplaySubject.js.map + return DebounceTimeSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +function dispatchNext(subscriber) { + subscriber.debouncedNext(); +} +//# sourceMappingURL=debounceTime.js.map /***/ }), -/* 298 */ +/* 287 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "queue", function() { return queue; }); -/* harmony import */ var _QueueAction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(299); -/* harmony import */ var _QueueScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(300); -/** PURE_IMPORTS_START _QueueAction,_QueueScheduler PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultIfEmpty", function() { return defaultIfEmpty; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -var queue = /*@__PURE__*/ new _QueueScheduler__WEBPACK_IMPORTED_MODULE_1__["QueueScheduler"](_QueueAction__WEBPACK_IMPORTED_MODULE_0__["QueueAction"]); -//# sourceMappingURL=queue.js.map +function defaultIfEmpty(defaultValue) { + if (defaultValue === void 0) { + defaultValue = null; + } + return function (source) { return source.lift(new DefaultIfEmptyOperator(defaultValue)); }; +} +var DefaultIfEmptyOperator = /*@__PURE__*/ (function () { + function DefaultIfEmptyOperator(defaultValue) { + this.defaultValue = defaultValue; + } + DefaultIfEmptyOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new DefaultIfEmptySubscriber(subscriber, this.defaultValue)); + }; + return DefaultIfEmptyOperator; +}()); +var DefaultIfEmptySubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DefaultIfEmptySubscriber, _super); + function DefaultIfEmptySubscriber(destination, defaultValue) { + var _this = _super.call(this, destination) || this; + _this.defaultValue = defaultValue; + _this.isEmpty = true; + return _this; + } + DefaultIfEmptySubscriber.prototype._next = function (value) { + this.isEmpty = false; + this.destination.next(value); + }; + DefaultIfEmptySubscriber.prototype._complete = function () { + if (this.isEmpty) { + this.destination.next(this.defaultValue); + } + this.destination.complete(); + }; + return DefaultIfEmptySubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=defaultIfEmpty.js.map /***/ }), -/* 299 */ +/* 288 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QueueAction", function() { return QueueAction; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "delay", function() { return delay; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _AsyncAction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(200); -/** PURE_IMPORTS_START tslib,_AsyncAction PURE_IMPORTS_END */ +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(215); +/* harmony import */ var _util_isDate__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(289); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(172); +/* harmony import */ var _Notification__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(202); +/** PURE_IMPORTS_START tslib,_scheduler_async,_util_isDate,_Subscriber,_Notification PURE_IMPORTS_END */ -var QueueAction = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](QueueAction, _super); - function QueueAction(scheduler, work) { - var _this = _super.call(this, scheduler, work) || this; + + + +function delay(delay, scheduler) { + if (scheduler === void 0) { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; + } + var absoluteDelay = Object(_util_isDate__WEBPACK_IMPORTED_MODULE_2__["isDate"])(delay); + var delayFor = absoluteDelay ? (+delay - scheduler.now()) : Math.abs(delay); + return function (source) { return source.lift(new DelayOperator(delayFor, scheduler)); }; +} +var DelayOperator = /*@__PURE__*/ (function () { + function DelayOperator(delay, scheduler) { + this.delay = delay; + this.scheduler = scheduler; + } + DelayOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new DelaySubscriber(subscriber, this.delay, this.scheduler)); + }; + return DelayOperator; +}()); +var DelaySubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DelaySubscriber, _super); + function DelaySubscriber(destination, delay, scheduler) { + var _this = _super.call(this, destination) || this; + _this.delay = delay; _this.scheduler = scheduler; - _this.work = work; + _this.queue = []; + _this.active = false; + _this.errored = false; return _this; } - QueueAction.prototype.schedule = function (state, delay) { - if (delay === void 0) { - delay = 0; + DelaySubscriber.dispatch = function (state) { + var source = state.source; + var queue = source.queue; + var scheduler = state.scheduler; + var destination = state.destination; + while (queue.length > 0 && (queue[0].time - scheduler.now()) <= 0) { + queue.shift().notification.observe(destination); } - if (delay > 0) { - return _super.prototype.schedule.call(this, state, delay); + if (queue.length > 0) { + var delay_1 = Math.max(0, queue[0].time - scheduler.now()); + this.schedule(state, delay_1); + } + else { + this.unsubscribe(); + source.active = false; } - this.delay = delay; - this.state = state; - this.scheduler.flush(this); - return this; }; - QueueAction.prototype.execute = function (state, delay) { - return (delay > 0 || this.closed) ? - _super.prototype.execute.call(this, state, delay) : - this._execute(state, delay); + DelaySubscriber.prototype._schedule = function (scheduler) { + this.active = true; + var destination = this.destination; + destination.add(scheduler.schedule(DelaySubscriber.dispatch, this.delay, { + source: this, destination: this.destination, scheduler: scheduler + })); }; - QueueAction.prototype.requestAsyncId = function (scheduler, id, delay) { - if (delay === void 0) { - delay = 0; + DelaySubscriber.prototype.scheduleNotification = function (notification) { + if (this.errored === true) { + return; } - if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) { - return _super.prototype.requestAsyncId.call(this, scheduler, id, delay); + var scheduler = this.scheduler; + var message = new DelayMessage(scheduler.now() + this.delay, notification); + this.queue.push(message); + if (this.active === false) { + this._schedule(scheduler); } - return scheduler.flush(this); }; - return QueueAction; -}(_AsyncAction__WEBPACK_IMPORTED_MODULE_1__["AsyncAction"])); - -//# sourceMappingURL=QueueAction.js.map - - -/***/ }), -/* 300 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "QueueScheduler", function() { return QueueScheduler; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(202); -/** PURE_IMPORTS_START tslib,_AsyncScheduler PURE_IMPORTS_END */ - - -var QueueScheduler = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](QueueScheduler, _super); - function QueueScheduler() { - return _super !== null && _super.apply(this, arguments) || this; + DelaySubscriber.prototype._next = function (value) { + this.scheduleNotification(_Notification__WEBPACK_IMPORTED_MODULE_4__["Notification"].createNext(value)); + }; + DelaySubscriber.prototype._error = function (err) { + this.errored = true; + this.queue = []; + this.destination.error(err); + this.unsubscribe(); + }; + DelaySubscriber.prototype._complete = function () { + this.scheduleNotification(_Notification__WEBPACK_IMPORTED_MODULE_4__["Notification"].createComplete()); + this.unsubscribe(); + }; + return DelaySubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_3__["Subscriber"])); +var DelayMessage = /*@__PURE__*/ (function () { + function DelayMessage(time, notification) { + this.time = time; + this.notification = notification; } - return QueueScheduler; -}(_AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__["AsyncScheduler"])); - -//# sourceMappingURL=QueueScheduler.js.map + return DelayMessage; +}()); +//# sourceMappingURL=delay.js.map /***/ }), -/* 301 */ +/* 289 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "race", function() { return race; }); -/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(178); -/* harmony import */ var _observable_race__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(302); -/** PURE_IMPORTS_START _util_isArray,_observable_race PURE_IMPORTS_END */ - - -function race() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i] = arguments[_i]; - } - return function raceOperatorFunction(source) { - if (observables.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_0__["isArray"])(observables[0])) { - observables = observables[0]; - } - return source.lift.call(_observable_race__WEBPACK_IMPORTED_MODULE_1__["race"].apply(void 0, [source].concat(observables))); - }; +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isDate", function() { return isDate; }); +/** PURE_IMPORTS_START PURE_IMPORTS_END */ +function isDate(value) { + return value instanceof Date && !isNaN(+value); } -//# sourceMappingURL=race.js.map +//# sourceMappingURL=isDate.js.map /***/ }), -/* 302 */ +/* 290 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "race", function() { return race; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RaceOperator", function() { return RaceOperator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "RaceSubscriber", function() { return RaceSubscriber; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "delayWhen", function() { return delayWhen; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(178); -/* harmony import */ var _fromArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(215); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(171); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(182); -/** PURE_IMPORTS_START tslib,_util_isArray,_fromArray,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(170); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(229); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(230); +/** PURE_IMPORTS_START tslib,_Subscriber,_Observable,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function race() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i] = arguments[_i]; +function delayWhen(delayDurationSelector, subscriptionDelay) { + if (subscriptionDelay) { + return function (source) { + return new SubscriptionDelayObservable(source, subscriptionDelay) + .lift(new DelayWhenOperator(delayDurationSelector)); + }; } - if (observables.length === 1) { - if (Object(_util_isArray__WEBPACK_IMPORTED_MODULE_1__["isArray"])(observables[0])) { - observables = observables[0]; - } - else { - return observables[0]; - } - } - return Object(_fromArray__WEBPACK_IMPORTED_MODULE_2__["fromArray"])(observables, undefined).lift(new RaceOperator()); + return function (source) { return source.lift(new DelayWhenOperator(delayDurationSelector)); }; } -var RaceOperator = /*@__PURE__*/ (function () { - function RaceOperator() { +var DelayWhenOperator = /*@__PURE__*/ (function () { + function DelayWhenOperator(delayDurationSelector) { + this.delayDurationSelector = delayDurationSelector; } - RaceOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new RaceSubscriber(subscriber)); + DelayWhenOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new DelayWhenSubscriber(subscriber, this.delayDurationSelector)); }; - return RaceOperator; + return DelayWhenOperator; }()); - -var RaceSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RaceSubscriber, _super); - function RaceSubscriber(destination) { +var DelayWhenSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DelayWhenSubscriber, _super); + function DelayWhenSubscriber(destination, delayDurationSelector) { var _this = _super.call(this, destination) || this; - _this.hasFirst = false; - _this.observables = []; - _this.subscriptions = []; + _this.delayDurationSelector = delayDurationSelector; + _this.completed = false; + _this.delayNotifierSubscriptions = []; + _this.index = 0; return _this; } - RaceSubscriber.prototype._next = function (observable) { - this.observables.push(observable); + DelayWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.destination.next(outerValue); + this.removeSubscription(innerSub); + this.tryComplete(); }; - RaceSubscriber.prototype._complete = function () { - var observables = this.observables; - var len = observables.length; - if (len === 0) { - this.destination.complete(); + DelayWhenSubscriber.prototype.notifyError = function (error, innerSub) { + this._error(error); + }; + DelayWhenSubscriber.prototype.notifyComplete = function (innerSub) { + var value = this.removeSubscription(innerSub); + if (value) { + this.destination.next(value); } - else { - for (var i = 0; i < len && !this.hasFirst; i++) { - var observable = observables[i]; - var subscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["subscribeToResult"])(this, observable, observable, i); - if (this.subscriptions) { - this.subscriptions.push(subscription); - } - this.add(subscription); + this.tryComplete(); + }; + DelayWhenSubscriber.prototype._next = function (value) { + var index = this.index++; + try { + var delayNotifier = this.delayDurationSelector(value, index); + if (delayNotifier) { + this.tryDelay(delayNotifier, value); } - this.observables = null; + } + catch (err) { + this.destination.error(err); } }; - RaceSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - if (!this.hasFirst) { - this.hasFirst = true; - for (var i = 0; i < this.subscriptions.length; i++) { - if (i !== outerIndex) { - var subscription = this.subscriptions[i]; - subscription.unsubscribe(); - this.remove(subscription); - } - } - this.subscriptions = null; + DelayWhenSubscriber.prototype._complete = function () { + this.completed = true; + this.tryComplete(); + this.unsubscribe(); + }; + DelayWhenSubscriber.prototype.removeSubscription = function (subscription) { + subscription.unsubscribe(); + var subscriptionIdx = this.delayNotifierSubscriptions.indexOf(subscription); + if (subscriptionIdx !== -1) { + this.delayNotifierSubscriptions.splice(subscriptionIdx, 1); } - this.destination.next(innerValue); + return subscription.outerValue; }; - return RaceSubscriber; + DelayWhenSubscriber.prototype.tryDelay = function (delayNotifier, value) { + var notifierSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["subscribeToResult"])(this, delayNotifier, value); + if (notifierSubscription && !notifierSubscription.closed) { + var destination = this.destination; + destination.add(notifierSubscription); + this.delayNotifierSubscriptions.push(notifierSubscription); + } + }; + DelayWhenSubscriber.prototype.tryComplete = function () { + if (this.completed && this.delayNotifierSubscriptions.length === 0) { + this.destination.complete(); + } + }; + return DelayWhenSubscriber; }(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); - -//# sourceMappingURL=race.js.map +var SubscriptionDelayObservable = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SubscriptionDelayObservable, _super); + function SubscriptionDelayObservable(source, subscriptionDelay) { + var _this = _super.call(this) || this; + _this.source = source; + _this.subscriptionDelay = subscriptionDelay; + return _this; + } + SubscriptionDelayObservable.prototype._subscribe = function (subscriber) { + this.subscriptionDelay.subscribe(new SubscriptionDelaySubscriber(subscriber, this.source)); + }; + return SubscriptionDelayObservable; +}(_Observable__WEBPACK_IMPORTED_MODULE_2__["Observable"])); +var SubscriptionDelaySubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SubscriptionDelaySubscriber, _super); + function SubscriptionDelaySubscriber(parent, source) { + var _this = _super.call(this) || this; + _this.parent = parent; + _this.source = source; + _this.sourceSubscribed = false; + return _this; + } + SubscriptionDelaySubscriber.prototype._next = function (unused) { + this.subscribeToSource(); + }; + SubscriptionDelaySubscriber.prototype._error = function (err) { + this.unsubscribe(); + this.parent.error(err); + }; + SubscriptionDelaySubscriber.prototype._complete = function () { + this.unsubscribe(); + this.subscribeToSource(); + }; + SubscriptionDelaySubscriber.prototype.subscribeToSource = function () { + if (!this.sourceSubscribed) { + this.sourceSubscribed = true; + this.unsubscribe(); + this.source.subscribe(this.parent); + } + }; + return SubscriptionDelaySubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=delayWhen.js.map /***/ }), -/* 303 */ +/* 291 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "repeat", function() { return repeat; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dematerialize", function() { return dematerialize; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); /* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _observable_empty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(242); -/** PURE_IMPORTS_START tslib,_Subscriber,_observable_empty PURE_IMPORTS_END */ - +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function repeat(count) { - if (count === void 0) { - count = -1; - } - return function (source) { - if (count === 0) { - return Object(_observable_empty__WEBPACK_IMPORTED_MODULE_2__["empty"])(); - } - else if (count < 0) { - return source.lift(new RepeatOperator(-1, source)); - } - else { - return source.lift(new RepeatOperator(count - 1, source)); - } +function dematerialize() { + return function dematerializeOperatorFunction(source) { + return source.lift(new DeMaterializeOperator()); }; } -var RepeatOperator = /*@__PURE__*/ (function () { - function RepeatOperator(count, source) { - this.count = count; - this.source = source; +var DeMaterializeOperator = /*@__PURE__*/ (function () { + function DeMaterializeOperator() { } - RepeatOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new RepeatSubscriber(subscriber, this.count, this.source)); + DeMaterializeOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new DeMaterializeSubscriber(subscriber)); }; - return RepeatOperator; + return DeMaterializeOperator; }()); -var RepeatSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RepeatSubscriber, _super); - function RepeatSubscriber(destination, count, source) { - var _this = _super.call(this, destination) || this; - _this.count = count; - _this.source = source; - return _this; +var DeMaterializeSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DeMaterializeSubscriber, _super); + function DeMaterializeSubscriber(destination) { + return _super.call(this, destination) || this; } - RepeatSubscriber.prototype.complete = function () { - if (!this.isStopped) { - var _a = this, source = _a.source, count = _a.count; - if (count === 0) { - return _super.prototype.complete.call(this); - } - else if (count > -1) { - this.count = count - 1; - } - source.subscribe(this._unsubscribeAndRecycle()); - } + DeMaterializeSubscriber.prototype._next = function (value) { + value.observe(this.destination); }; - return RepeatSubscriber; + return DeMaterializeSubscriber; }(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=repeat.js.map +//# sourceMappingURL=dematerialize.js.map /***/ }), -/* 304 */ +/* 292 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "repeatWhen", function() { return repeatWhen; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "distinct", function() { return distinct; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "DistinctSubscriber", function() { return DistinctSubscriber; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(265); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(171); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(182); -/** PURE_IMPORTS_START tslib,_Subject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(230); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function repeatWhen(notifier) { - return function (source) { return source.lift(new RepeatWhenOperator(notifier)); }; +function distinct(keySelector, flushes) { + return function (source) { return source.lift(new DistinctOperator(keySelector, flushes)); }; } -var RepeatWhenOperator = /*@__PURE__*/ (function () { - function RepeatWhenOperator(notifier) { - this.notifier = notifier; +var DistinctOperator = /*@__PURE__*/ (function () { + function DistinctOperator(keySelector, flushes) { + this.keySelector = keySelector; + this.flushes = flushes; } - RepeatWhenOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new RepeatWhenSubscriber(subscriber, this.notifier, source)); + DistinctOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new DistinctSubscriber(subscriber, this.keySelector, this.flushes)); }; - return RepeatWhenOperator; + return DistinctOperator; }()); -var RepeatWhenSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RepeatWhenSubscriber, _super); - function RepeatWhenSubscriber(destination, notifier, source) { +var DistinctSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DistinctSubscriber, _super); + function DistinctSubscriber(destination, keySelector, flushes) { var _this = _super.call(this, destination) || this; - _this.notifier = notifier; - _this.source = source; - _this.sourceIsBeingSubscribedTo = true; + _this.keySelector = keySelector; + _this.values = new Set(); + if (flushes) { + _this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(_this, flushes)); + } return _this; } - RepeatWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.sourceIsBeingSubscribedTo = true; - this.source.subscribe(this); - }; - RepeatWhenSubscriber.prototype.notifyComplete = function (innerSub) { - if (this.sourceIsBeingSubscribedTo === false) { - return _super.prototype.complete.call(this); - } + DistinctSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.values.clear(); }; - RepeatWhenSubscriber.prototype.complete = function () { - this.sourceIsBeingSubscribedTo = false; - if (!this.isStopped) { - if (!this.retries) { - this.subscribeToRetries(); - } - if (!this.retriesSubscription || this.retriesSubscription.closed) { - return _super.prototype.complete.call(this); - } - this._unsubscribeAndRecycle(); - this.notifications.next(); - } + DistinctSubscriber.prototype.notifyError = function (error, innerSub) { + this._error(error); }; - RepeatWhenSubscriber.prototype._unsubscribe = function () { - var _a = this, notifications = _a.notifications, retriesSubscription = _a.retriesSubscription; - if (notifications) { - notifications.unsubscribe(); - this.notifications = null; + DistinctSubscriber.prototype._next = function (value) { + if (this.keySelector) { + this._useKeySelector(value); } - if (retriesSubscription) { - retriesSubscription.unsubscribe(); - this.retriesSubscription = null; + else { + this._finalizeNext(value, value); } - this.retries = null; - }; - RepeatWhenSubscriber.prototype._unsubscribeAndRecycle = function () { - var _unsubscribe = this._unsubscribe; - this._unsubscribe = null; - _super.prototype._unsubscribeAndRecycle.call(this); - this._unsubscribe = _unsubscribe; - return this; }; - RepeatWhenSubscriber.prototype.subscribeToRetries = function () { - this.notifications = new _Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"](); - var retries; + DistinctSubscriber.prototype._useKeySelector = function (value) { + var key; + var destination = this.destination; try { - var notifier = this.notifier; - retries = notifier(this.notifications); + key = this.keySelector(value); } - catch (e) { - return _super.prototype.complete.call(this); + catch (err) { + destination.error(err); + return; } - this.retries = retries; - this.retriesSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, retries); + this._finalizeNext(key, value); }; - return RepeatWhenSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); -//# sourceMappingURL=repeatWhen.js.map + DistinctSubscriber.prototype._finalizeNext = function (key, value) { + var values = this.values; + if (!values.has(key)) { + values.add(key); + this.destination.next(value); + } + }; + return DistinctSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); + +//# sourceMappingURL=distinct.js.map /***/ }), -/* 305 */ +/* 293 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "retry", function() { return retry; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "distinctUntilChanged", function() { return distinctUntilChanged; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); /* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); /** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function retry(count) { - if (count === void 0) { - count = -1; - } - return function (source) { return source.lift(new RetryOperator(count, source)); }; +function distinctUntilChanged(compare, keySelector) { + return function (source) { return source.lift(new DistinctUntilChangedOperator(compare, keySelector)); }; } -var RetryOperator = /*@__PURE__*/ (function () { - function RetryOperator(count, source) { - this.count = count; - this.source = source; +var DistinctUntilChangedOperator = /*@__PURE__*/ (function () { + function DistinctUntilChangedOperator(compare, keySelector) { + this.compare = compare; + this.keySelector = keySelector; } - RetryOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new RetrySubscriber(subscriber, this.count, this.source)); + DistinctUntilChangedOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new DistinctUntilChangedSubscriber(subscriber, this.compare, this.keySelector)); }; - return RetryOperator; + return DistinctUntilChangedOperator; }()); -var RetrySubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RetrySubscriber, _super); - function RetrySubscriber(destination, count, source) { +var DistinctUntilChangedSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](DistinctUntilChangedSubscriber, _super); + function DistinctUntilChangedSubscriber(destination, compare, keySelector) { var _this = _super.call(this, destination) || this; - _this.count = count; - _this.source = source; + _this.keySelector = keySelector; + _this.hasKey = false; + if (typeof compare === 'function') { + _this.compare = compare; + } return _this; } - RetrySubscriber.prototype.error = function (err) { - if (!this.isStopped) { - var _a = this, source = _a.source, count = _a.count; - if (count === 0) { - return _super.prototype.error.call(this, err); + DistinctUntilChangedSubscriber.prototype.compare = function (x, y) { + return x === y; + }; + DistinctUntilChangedSubscriber.prototype._next = function (value) { + var key; + try { + var keySelector = this.keySelector; + key = keySelector ? keySelector(value) : value; + } + catch (err) { + return this.destination.error(err); + } + var result = false; + if (this.hasKey) { + try { + var compare = this.compare; + result = compare(this.key, key); } - else if (count > -1) { - this.count = count - 1; + catch (err) { + return this.destination.error(err); } - source.subscribe(this._unsubscribeAndRecycle()); + } + else { + this.hasKey = true; + } + if (!result) { + this.key = key; + this.destination.next(value); } }; - return RetrySubscriber; + return DistinctUntilChangedSubscriber; }(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=retry.js.map +//# sourceMappingURL=distinctUntilChanged.js.map /***/ }), -/* 306 */ +/* 294 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "retryWhen", function() { return retryWhen; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(265); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(171); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(182); -/** PURE_IMPORTS_START tslib,_Subject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "distinctUntilKeyChanged", function() { return distinctUntilKeyChanged; }); +/* harmony import */ var _distinctUntilChanged__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(293); +/** PURE_IMPORTS_START _distinctUntilChanged PURE_IMPORTS_END */ + +function distinctUntilKeyChanged(key, compare) { + return Object(_distinctUntilChanged__WEBPACK_IMPORTED_MODULE_0__["distinctUntilChanged"])(function (x, y) { return compare ? compare(x[key], y[key]) : x[key] === y[key]; }); +} +//# sourceMappingURL=distinctUntilKeyChanged.js.map +/***/ }), +/* 295 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__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__(222); +/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(264); +/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(296); +/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(287); +/* harmony import */ var _take__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(297); +/** PURE_IMPORTS_START _util_ArgumentOutOfRangeError,_filter,_throwIfEmpty,_defaultIfEmpty,_take PURE_IMPORTS_END */ -function retryWhen(notifier) { - return function (source) { return source.lift(new RetryWhenOperator(notifier, source)); }; -} -var RetryWhenOperator = /*@__PURE__*/ (function () { - function RetryWhenOperator(notifier, source) { - this.notifier = notifier; - this.source = source; - } - RetryWhenOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new RetryWhenSubscriber(subscriber, this.notifier, this.source)); - }; - return RetryWhenOperator; -}()); -var RetryWhenSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RetryWhenSubscriber, _super); - function RetryWhenSubscriber(destination, notifier, source) { - var _this = _super.call(this, destination) || this; - _this.notifier = notifier; - _this.source = source; - return _this; + + + + +function elementAt(index, defaultValue) { + if (index < 0) { + throw new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_0__["ArgumentOutOfRangeError"](); } - RetryWhenSubscriber.prototype.error = function (err) { - if (!this.isStopped) { - var errors = this.errors; - var retries = this.retries; - var retriesSubscription = this.retriesSubscription; - if (!retries) { - errors = new _Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"](); - try { - var notifier = this.notifier; - retries = notifier(errors); - } - catch (e) { - return _super.prototype.error.call(this, e); - } - retriesSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, retries); - } - else { - this.errors = null; - this.retriesSubscription = null; - } - this._unsubscribeAndRecycle(); - this.errors = errors; - this.retries = retries; - this.retriesSubscription = retriesSubscription; - errors.next(err); - } - }; - RetryWhenSubscriber.prototype._unsubscribe = function () { - var _a = this, errors = _a.errors, retriesSubscription = _a.retriesSubscription; - if (errors) { - errors.unsubscribe(); - this.errors = null; - } - if (retriesSubscription) { - retriesSubscription.unsubscribe(); - this.retriesSubscription = null; - } - this.retries = null; - }; - RetryWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - var _unsubscribe = this._unsubscribe; - this._unsubscribe = null; - this._unsubscribeAndRecycle(); - this._unsubscribe = _unsubscribe; - this.source.subscribe(this); + var hasDefaultValue = arguments.length >= 2; + return function (source) { + return source.pipe(Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(function (v, i) { return i === index; }), Object(_take__WEBPACK_IMPORTED_MODULE_4__["take"])(1), hasDefaultValue + ? Object(_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__["defaultIfEmpty"])(defaultValue) + : Object(_throwIfEmpty__WEBPACK_IMPORTED_MODULE_2__["throwIfEmpty"])(function () { return new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_0__["ArgumentOutOfRangeError"](); })); }; - return RetryWhenSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); -//# sourceMappingURL=retryWhen.js.map +} +//# sourceMappingURL=elementAt.js.map /***/ }), -/* 307 */ +/* 296 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sample", function() { return sample; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "throwIfEmpty", function() { return throwIfEmpty; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(171); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(182); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ +/* harmony import */ var _util_EmptyError__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(223); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(172); +/** PURE_IMPORTS_START tslib,_util_EmptyError,_Subscriber PURE_IMPORTS_END */ -function sample(notifier) { - return function (source) { return source.lift(new SampleOperator(notifier)); }; -} -var SampleOperator = /*@__PURE__*/ (function () { - function SampleOperator(notifier) { - this.notifier = notifier; - } - SampleOperator.prototype.call = function (subscriber, source) { - var sampleSubscriber = new SampleSubscriber(subscriber); - var subscription = source.subscribe(sampleSubscriber); - subscription.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(sampleSubscriber, this.notifier)); - return subscription; - }; - return SampleOperator; -}()); -var SampleSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SampleSubscriber, _super); - function SampleSubscriber() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this.hasValue = false; - return _this; +function throwIfEmpty(errorFactory) { + if (errorFactory === void 0) { + errorFactory = defaultErrorFactory; } - SampleSubscriber.prototype._next = function (value) { - this.value = value; - this.hasValue = true; - }; - SampleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.emitValue(); - }; - SampleSubscriber.prototype.notifyComplete = function () { - this.emitValue(); - }; - SampleSubscriber.prototype.emitValue = function () { - if (this.hasValue) { - this.hasValue = false; - this.destination.next(this.value); - } + return function (source) { + return source.lift(new ThrowIfEmptyOperator(errorFactory)); }; - return SampleSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=sample.js.map - - -/***/ }), -/* 308 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sampleTime", function() { return sampleTime; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(199); -/** PURE_IMPORTS_START tslib,_Subscriber,_scheduler_async PURE_IMPORTS_END */ - - - -function sampleTime(period, scheduler) { - if (scheduler === void 0) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_2__["async"]; - } - return function (source) { return source.lift(new SampleTimeOperator(period, scheduler)); }; } -var SampleTimeOperator = /*@__PURE__*/ (function () { - function SampleTimeOperator(period, scheduler) { - this.period = period; - this.scheduler = scheduler; +var ThrowIfEmptyOperator = /*@__PURE__*/ (function () { + function ThrowIfEmptyOperator(errorFactory) { + this.errorFactory = errorFactory; } - SampleTimeOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new SampleTimeSubscriber(subscriber, this.period, this.scheduler)); + ThrowIfEmptyOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new ThrowIfEmptySubscriber(subscriber, this.errorFactory)); }; - return SampleTimeOperator; + return ThrowIfEmptyOperator; }()); -var SampleTimeSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SampleTimeSubscriber, _super); - function SampleTimeSubscriber(destination, period, scheduler) { +var ThrowIfEmptySubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ThrowIfEmptySubscriber, _super); + function ThrowIfEmptySubscriber(destination, errorFactory) { var _this = _super.call(this, destination) || this; - _this.period = period; - _this.scheduler = scheduler; + _this.errorFactory = errorFactory; _this.hasValue = false; - _this.add(scheduler.schedule(dispatchNotification, period, { subscriber: _this, period: period })); return _this; } - SampleTimeSubscriber.prototype._next = function (value) { - this.lastValue = value; + ThrowIfEmptySubscriber.prototype._next = function (value) { this.hasValue = true; + this.destination.next(value); }; - SampleTimeSubscriber.prototype.notifyNext = function () { - if (this.hasValue) { - this.hasValue = false; - this.destination.next(this.lastValue); + ThrowIfEmptySubscriber.prototype._complete = function () { + if (!this.hasValue) { + var err = void 0; + try { + err = this.errorFactory(); + } + catch (e) { + err = e; + } + this.destination.error(err); + } + else { + return this.destination.complete(); } }; - return SampleTimeSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -function dispatchNotification(state) { - var subscriber = state.subscriber, period = state.period; - subscriber.notifyNext(); - this.schedule(state, period); + return ThrowIfEmptySubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_2__["Subscriber"])); +function defaultErrorFactory() { + return new _util_EmptyError__WEBPACK_IMPORTED_MODULE_1__["EmptyError"](); } -//# sourceMappingURL=sampleTime.js.map +//# sourceMappingURL=throwIfEmpty.js.map /***/ }), -/* 309 */ +/* 297 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sequenceEqual", function() { return sequenceEqual; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SequenceEqualOperator", function() { return SequenceEqualOperator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SequenceEqualSubscriber", function() { return SequenceEqualSubscriber; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "take", function() { return take; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); /* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ +/* harmony import */ var _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(222); +/* harmony import */ var _observable_empty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(203); +/** PURE_IMPORTS_START tslib,_Subscriber,_util_ArgumentOutOfRangeError,_observable_empty PURE_IMPORTS_END */ -function sequenceEqual(compareTo, comparator) { - return function (source) { return source.lift(new SequenceEqualOperator(compareTo, comparator)); }; -} -var SequenceEqualOperator = /*@__PURE__*/ (function () { - function SequenceEqualOperator(compareTo, comparator) { - this.compareTo = compareTo; - this.comparator = comparator; - } - SequenceEqualOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new SequenceEqualSubscriber(subscriber, this.compareTo, this.comparator)); - }; - return SequenceEqualOperator; -}()); -var SequenceEqualSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SequenceEqualSubscriber, _super); - function SequenceEqualSubscriber(destination, compareTo, comparator) { - var _this = _super.call(this, destination) || this; - _this.compareTo = compareTo; - _this.comparator = comparator; - _this._a = []; - _this._b = []; - _this._oneComplete = false; - _this.destination.add(compareTo.subscribe(new SequenceEqualCompareToSubscriber(destination, _this))); - return _this; - } - SequenceEqualSubscriber.prototype._next = function (value) { - if (this._oneComplete && this._b.length === 0) { - this.emit(false); - } - else { - this._a.push(value); - this.checkValues(); - } - }; - SequenceEqualSubscriber.prototype._complete = function () { - if (this._oneComplete) { - this.emit(this._a.length === 0 && this._b.length === 0); - } - else { - this._oneComplete = true; - } - this.unsubscribe(); - }; - SequenceEqualSubscriber.prototype.checkValues = function () { - var _c = this, _a = _c._a, _b = _c._b, comparator = _c.comparator; - while (_a.length > 0 && _b.length > 0) { - var a = _a.shift(); - var b = _b.shift(); - var areEqual = false; - try { - areEqual = comparator ? comparator(a, b) : a === b; - } - catch (e) { - this.destination.error(e); - } - if (!areEqual) { - this.emit(false); - } - } - }; - SequenceEqualSubscriber.prototype.emit = function (value) { - var destination = this.destination; - destination.next(value); - destination.complete(); - }; - SequenceEqualSubscriber.prototype.nextB = function (value) { - if (this._oneComplete && this._a.length === 0) { - this.emit(false); + +function take(count) { + return function (source) { + if (count === 0) { + return Object(_observable_empty__WEBPACK_IMPORTED_MODULE_3__["empty"])(); } else { - this._b.push(value); - this.checkValues(); + return source.lift(new TakeOperator(count)); } }; - SequenceEqualSubscriber.prototype.completeB = function () { - if (this._oneComplete) { - this.emit(this._a.length === 0 && this._b.length === 0); - } - else { - this._oneComplete = true; +} +var TakeOperator = /*@__PURE__*/ (function () { + function TakeOperator(total) { + this.total = total; + if (this.total < 0) { + throw new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__["ArgumentOutOfRangeError"]; } + } + TakeOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new TakeSubscriber(subscriber, this.total)); }; - return SequenceEqualSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); - -var SequenceEqualCompareToSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SequenceEqualCompareToSubscriber, _super); - function SequenceEqualCompareToSubscriber(destination, parent) { + return TakeOperator; +}()); +var TakeSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TakeSubscriber, _super); + function TakeSubscriber(destination, total) { var _this = _super.call(this, destination) || this; - _this.parent = parent; + _this.total = total; + _this.count = 0; return _this; } - SequenceEqualCompareToSubscriber.prototype._next = function (value) { - this.parent.nextB(value); - }; - SequenceEqualCompareToSubscriber.prototype._error = function (err) { - this.parent.error(err); - this.unsubscribe(); - }; - SequenceEqualCompareToSubscriber.prototype._complete = function () { - this.parent.completeB(); - this.unsubscribe(); + TakeSubscriber.prototype._next = function (value) { + var total = this.total; + var count = ++this.count; + if (count <= total) { + this.destination.next(value); + if (count === total) { + this.destination.complete(); + this.unsubscribe(); + } + } }; - return SequenceEqualCompareToSubscriber; + return TakeSubscriber; }(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=sequenceEqual.js.map +//# sourceMappingURL=take.js.map /***/ }), -/* 310 */ +/* 298 */ /***/ (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__(282); -/* harmony import */ var _refCount__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(284); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(265); -/** PURE_IMPORTS_START _multicast,_refCount,_Subject PURE_IMPORTS_END */ - - - -function shareSubjectFactory() { - return new _Subject__WEBPACK_IMPORTED_MODULE_2__["Subject"](); -} -function share() { - return function (source) { return Object(_refCount__WEBPACK_IMPORTED_MODULE_1__["refCount"])()(Object(_multicast__WEBPACK_IMPORTED_MODULE_0__["multicast"])(shareSubjectFactory)(source)); }; -} -//# sourceMappingURL=share.js.map - - -/***/ }), -/* 311 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "endWith", function() { return endWith; }); +/* harmony import */ var _observable_concat__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(239); +/* harmony import */ var _observable_of__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(204); +/** PURE_IMPORTS_START _observable_concat,_observable_of PURE_IMPORTS_END */ -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "shareReplay", function() { return shareReplay; }); -/* harmony import */ var _ReplaySubject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(297); -/** PURE_IMPORTS_START _ReplaySubject PURE_IMPORTS_END */ -function shareReplay(configOrBufferSize, windowTime, scheduler) { - var config; - if (configOrBufferSize && typeof configOrBufferSize === 'object') { - config = configOrBufferSize; - } - else { - config = { - bufferSize: configOrBufferSize, - windowTime: windowTime, - refCount: false, - scheduler: scheduler - }; +function endWith() { + var array = []; + for (var _i = 0; _i < arguments.length; _i++) { + array[_i] = arguments[_i]; } - return function (source) { return source.lift(shareReplayOperator(config)); }; -} -function shareReplayOperator(_a) { - var _b = _a.bufferSize, bufferSize = _b === void 0 ? Number.POSITIVE_INFINITY : _b, _c = _a.windowTime, windowTime = _c === void 0 ? Number.POSITIVE_INFINITY : _c, useRefCount = _a.refCount, scheduler = _a.scheduler; - var subject; - var refCount = 0; - var subscription; - var hasError = false; - var isComplete = false; - return function shareReplayOperation(source) { - refCount++; - if (!subject || hasError) { - hasError = false; - subject = new _ReplaySubject__WEBPACK_IMPORTED_MODULE_0__["ReplaySubject"](bufferSize, windowTime, scheduler); - subscription = source.subscribe({ - next: function (value) { subject.next(value); }, - error: function (err) { - hasError = true; - subject.error(err); - }, - complete: function () { - isComplete = true; - subject.complete(); - }, - }); - } - var innerSub = subject.subscribe(this); - this.add(function () { - refCount--; - innerSub.unsubscribe(); - if (subscription && !isComplete && useRefCount && refCount === 0) { - subscription.unsubscribe(); - subscription = undefined; - subject = undefined; - } - }); - }; + return function (source) { return Object(_observable_concat__WEBPACK_IMPORTED_MODULE_0__["concat"])(source, _observable_of__WEBPACK_IMPORTED_MODULE_1__["of"].apply(void 0, array)); }; } -//# sourceMappingURL=shareReplay.js.map +//# sourceMappingURL=endWith.js.map /***/ }), -/* 312 */ +/* 299 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "single", function() { return single; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "every", function() { return every; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); /* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _util_EmptyError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(253); -/** PURE_IMPORTS_START tslib,_Subscriber,_util_EmptyError PURE_IMPORTS_END */ - +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function single(predicate) { - return function (source) { return source.lift(new SingleOperator(predicate, source)); }; +function every(predicate, thisArg) { + return function (source) { return source.lift(new EveryOperator(predicate, thisArg, source)); }; } -var SingleOperator = /*@__PURE__*/ (function () { - function SingleOperator(predicate, source) { +var EveryOperator = /*@__PURE__*/ (function () { + function EveryOperator(predicate, thisArg, source) { this.predicate = predicate; + this.thisArg = thisArg; this.source = source; } - SingleOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new SingleSubscriber(subscriber, this.predicate, this.source)); + EveryOperator.prototype.call = function (observer, source) { + return source.subscribe(new EverySubscriber(observer, this.predicate, this.thisArg, this.source)); }; - return SingleOperator; + return EveryOperator; }()); -var SingleSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SingleSubscriber, _super); - function SingleSubscriber(destination, predicate, source) { +var EverySubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](EverySubscriber, _super); + function EverySubscriber(destination, predicate, thisArg, source) { var _this = _super.call(this, destination) || this; _this.predicate = predicate; + _this.thisArg = thisArg; _this.source = source; - _this.seenValue = false; _this.index = 0; + _this.thisArg = thisArg || _this; return _this; } - SingleSubscriber.prototype.applySingleValue = function (value) { - if (this.seenValue) { - this.destination.error('Sequence contains more than one element'); - } - else { - this.seenValue = true; - this.singleValue = value; - } - }; - SingleSubscriber.prototype._next = function (value) { - var index = this.index++; - if (this.predicate) { - this.tryNext(value, index); - } - else { - this.applySingleValue(value); - } + EverySubscriber.prototype.notifyComplete = function (everyValueMatch) { + this.destination.next(everyValueMatch); + this.destination.complete(); }; - SingleSubscriber.prototype.tryNext = function (value, index) { + EverySubscriber.prototype._next = function (value) { + var result = false; try { - if (this.predicate(value, index, this.source)) { - this.applySingleValue(value); - } + result = this.predicate.call(this.thisArg, value, this.index++, this.source); } catch (err) { this.destination.error(err); + return; } - }; - SingleSubscriber.prototype._complete = function () { - var destination = this.destination; - if (this.index > 0) { - destination.next(this.seenValue ? this.singleValue : undefined); - destination.complete(); - } - else { - destination.error(new _util_EmptyError__WEBPACK_IMPORTED_MODULE_2__["EmptyError"]); + if (!result) { + this.notifyComplete(false); } }; - return SingleSubscriber; + EverySubscriber.prototype._complete = function () { + this.notifyComplete(true); + }; + return EverySubscriber; }(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=single.js.map +//# sourceMappingURL=every.js.map /***/ }), -/* 313 */ +/* 300 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "skip", function() { return skip; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "exhaust", function() { return exhaust; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(230); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function skip(count) { - return function (source) { return source.lift(new SkipOperator(count)); }; + +function exhaust() { + return function (source) { return source.lift(new SwitchFirstOperator()); }; } -var SkipOperator = /*@__PURE__*/ (function () { - function SkipOperator(total) { - this.total = total; +var SwitchFirstOperator = /*@__PURE__*/ (function () { + function SwitchFirstOperator() { } - SkipOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new SkipSubscriber(subscriber, this.total)); + SwitchFirstOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new SwitchFirstSubscriber(subscriber)); }; - return SkipOperator; + return SwitchFirstOperator; }()); -var SkipSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SkipSubscriber, _super); - function SkipSubscriber(destination, total) { +var SwitchFirstSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SwitchFirstSubscriber, _super); + function SwitchFirstSubscriber(destination) { var _this = _super.call(this, destination) || this; - _this.total = total; - _this.count = 0; + _this.hasCompleted = false; + _this.hasSubscription = false; return _this; } - SkipSubscriber.prototype._next = function (x) { - if (++this.count > this.total) { - this.destination.next(x); + SwitchFirstSubscriber.prototype._next = function (value) { + if (!this.hasSubscription) { + this.hasSubscription = true; + this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, value)); } }; - return SkipSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=skip.js.map + SwitchFirstSubscriber.prototype._complete = function () { + this.hasCompleted = true; + if (!this.hasSubscription) { + this.destination.complete(); + } + }; + SwitchFirstSubscriber.prototype.notifyComplete = function (innerSub) { + this.remove(innerSub); + this.hasSubscription = false; + if (this.hasCompleted) { + this.destination.complete(); + } + }; + return SwitchFirstSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=exhaust.js.map /***/ }), -/* 314 */ +/* 301 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "skipLast", function() { return skipLast; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "exhaustMap", function() { return exhaustMap; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(250); -/** PURE_IMPORTS_START tslib,_Subscriber,_util_ArgumentOutOfRangeError PURE_IMPORTS_END */ +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); +/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(231); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(230); +/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(226); +/* harmony import */ var _observable_from__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(243); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult,_map,_observable_from PURE_IMPORTS_END */ -function skipLast(count) { - return function (source) { return source.lift(new SkipLastOperator(count)); }; -} -var SkipLastOperator = /*@__PURE__*/ (function () { - function SkipLastOperator(_skipCount) { - this._skipCount = _skipCount; - if (this._skipCount < 0) { - throw new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__["ArgumentOutOfRangeError"]; - } + + + +function exhaustMap(project, resultSelector) { + if (resultSelector) { + return function (source) { return source.pipe(exhaustMap(function (a, i) { return Object(_observable_from__WEBPACK_IMPORTED_MODULE_5__["from"])(project(a, i)).pipe(Object(_map__WEBPACK_IMPORTED_MODULE_4__["map"])(function (b, ii) { return resultSelector(a, b, i, ii); })); })); }; } - SkipLastOperator.prototype.call = function (subscriber, source) { - if (this._skipCount === 0) { - return source.subscribe(new _Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"](subscriber)); - } - else { - return source.subscribe(new SkipLastSubscriber(subscriber, this._skipCount)); - } + return function (source) { + return source.lift(new ExhaustMapOperator(project)); }; - return SkipLastOperator; -}()); -var SkipLastSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SkipLastSubscriber, _super); - function SkipLastSubscriber(destination, _skipCount) { +} +var ExhaustMapOperator = /*@__PURE__*/ (function () { + function ExhaustMapOperator(project) { + this.project = project; + } + ExhaustMapOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new ExhaustMapSubscriber(subscriber, this.project)); + }; + return ExhaustMapOperator; +}()); +var ExhaustMapSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ExhaustMapSubscriber, _super); + function ExhaustMapSubscriber(destination, project) { var _this = _super.call(this, destination) || this; - _this._skipCount = _skipCount; - _this._count = 0; - _this._ring = new Array(_skipCount); + _this.project = project; + _this.hasSubscription = false; + _this.hasCompleted = false; + _this.index = 0; return _this; } - SkipLastSubscriber.prototype._next = function (value) { - var skipCount = this._skipCount; - var count = this._count++; - if (count < skipCount) { - this._ring[count] = value; + ExhaustMapSubscriber.prototype._next = function (value) { + if (!this.hasSubscription) { + this.tryNext(value); } - else { - var currentIndex = count % skipCount; - var ring = this._ring; - var oldValue = ring[currentIndex]; - ring[currentIndex] = value; - this.destination.next(oldValue); + }; + ExhaustMapSubscriber.prototype.tryNext = function (value) { + var result; + var index = this.index++; + try { + result = this.project(value, index); + } + catch (err) { + this.destination.error(err); + return; } + this.hasSubscription = true; + this._innerSub(result, value, index); }; - return SkipLastSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=skipLast.js.map + ExhaustMapSubscriber.prototype._innerSub = function (result, value, index) { + var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__["InnerSubscriber"](this, undefined, undefined); + var destination = this.destination; + destination.add(innerSubscriber); + Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, result, value, index, innerSubscriber); + }; + ExhaustMapSubscriber.prototype._complete = function () { + this.hasCompleted = true; + if (!this.hasSubscription) { + this.destination.complete(); + } + this.unsubscribe(); + }; + ExhaustMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.destination.next(innerValue); + }; + ExhaustMapSubscriber.prototype.notifyError = function (err) { + this.destination.error(err); + }; + ExhaustMapSubscriber.prototype.notifyComplete = function (innerSub) { + var destination = this.destination; + destination.remove(innerSub); + this.hasSubscription = false; + if (this.hasCompleted) { + this.destination.complete(); + } + }; + return ExhaustMapSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=exhaustMap.js.map /***/ }), -/* 315 */ +/* 302 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "skipUntil", function() { return skipUntil; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "expand", function() { return expand; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ExpandOperator", function() { return ExpandOperator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ExpandSubscriber", function() { return ExpandSubscriber; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(171); -/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(183); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(182); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(230); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function skipUntil(notifier) { - return function (source) { return source.lift(new SkipUntilOperator(notifier)); }; +function expand(project, concurrent, scheduler) { + if (concurrent === void 0) { + concurrent = Number.POSITIVE_INFINITY; + } + if (scheduler === void 0) { + scheduler = undefined; + } + concurrent = (concurrent || 0) < 1 ? Number.POSITIVE_INFINITY : concurrent; + return function (source) { return source.lift(new ExpandOperator(project, concurrent, scheduler)); }; } -var SkipUntilOperator = /*@__PURE__*/ (function () { - function SkipUntilOperator(notifier) { - this.notifier = notifier; +var ExpandOperator = /*@__PURE__*/ (function () { + function ExpandOperator(project, concurrent, scheduler) { + this.project = project; + this.concurrent = concurrent; + this.scheduler = scheduler; } - SkipUntilOperator.prototype.call = function (destination, source) { - return source.subscribe(new SkipUntilSubscriber(destination, this.notifier)); + ExpandOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new ExpandSubscriber(subscriber, this.project, this.concurrent, this.scheduler)); }; - return SkipUntilOperator; + return ExpandOperator; }()); -var SkipUntilSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SkipUntilSubscriber, _super); - function SkipUntilSubscriber(destination, notifier) { + +var ExpandSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ExpandSubscriber, _super); + function ExpandSubscriber(destination, project, concurrent, scheduler) { var _this = _super.call(this, destination) || this; - _this.hasValue = false; - var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__["InnerSubscriber"](_this, undefined, undefined); - _this.add(innerSubscriber); - _this.innerSubscription = innerSubscriber; - Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(_this, notifier, undefined, undefined, innerSubscriber); + _this.project = project; + _this.concurrent = concurrent; + _this.scheduler = scheduler; + _this.index = 0; + _this.active = 0; + _this.hasCompleted = false; + if (concurrent < Number.POSITIVE_INFINITY) { + _this.buffer = []; + } return _this; } - SkipUntilSubscriber.prototype._next = function (value) { - if (this.hasValue) { - _super.prototype._next.call(this, value); + ExpandSubscriber.dispatch = function (arg) { + var subscriber = arg.subscriber, result = arg.result, value = arg.value, index = arg.index; + subscriber.subscribeToProjection(result, value, index); + }; + ExpandSubscriber.prototype._next = function (value) { + var destination = this.destination; + if (destination.closed) { + this._complete(); + return; + } + var index = this.index++; + if (this.active < this.concurrent) { + destination.next(value); + try { + var project = this.project; + var result = project(value, index); + if (!this.scheduler) { + this.subscribeToProjection(result, value, index); + } + else { + var state = { subscriber: this, result: result, value: value, index: index }; + var destination_1 = this.destination; + destination_1.add(this.scheduler.schedule(ExpandSubscriber.dispatch, 0, state)); + } + } + catch (e) { + destination.error(e); + } + } + else { + this.buffer.push(value); } }; - SkipUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.hasValue = true; - if (this.innerSubscription) { - this.innerSubscription.unsubscribe(); + ExpandSubscriber.prototype.subscribeToProjection = function (result, value, index) { + this.active++; + var destination = this.destination; + destination.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, result, value, index)); + }; + ExpandSubscriber.prototype._complete = function () { + this.hasCompleted = true; + if (this.hasCompleted && this.active === 0) { + this.destination.complete(); } + this.unsubscribe(); }; - SkipUntilSubscriber.prototype.notifyComplete = function () { + ExpandSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this._next(innerValue); }; - return SkipUntilSubscriber; + ExpandSubscriber.prototype.notifyComplete = function (innerSub) { + var buffer = this.buffer; + var destination = this.destination; + destination.remove(innerSub); + this.active--; + if (buffer && buffer.length > 0) { + this._next(buffer.shift()); + } + if (this.hasCompleted && this.active === 0) { + this.destination.complete(); + } + }; + return ExpandSubscriber; }(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=skipUntil.js.map + +//# sourceMappingURL=expand.js.map /***/ }), -/* 316 */ +/* 303 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "skipWhile", function() { return skipWhile; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "finalize", function() { return finalize; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(177); +/** PURE_IMPORTS_START tslib,_Subscriber,_Subscription PURE_IMPORTS_END */ + + + +function finalize(callback) { + return function (source) { return source.lift(new FinallyOperator(callback)); }; +} +var FinallyOperator = /*@__PURE__*/ (function () { + function FinallyOperator(callback) { + this.callback = callback; + } + FinallyOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new FinallySubscriber(subscriber, this.callback)); + }; + return FinallyOperator; +}()); +var FinallySubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](FinallySubscriber, _super); + function FinallySubscriber(destination, callback) { + var _this = _super.call(this, destination) || this; + _this.add(new _Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"](callback)); + return _this; + } + return FinallySubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=finalize.js.map + + +/***/ }), +/* 304 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "find", function() { return find; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FindValueOperator", function() { return FindValueOperator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "FindValueSubscriber", function() { return FindValueSubscriber; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); /* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); /** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function skipWhile(predicate) { - return function (source) { return source.lift(new SkipWhileOperator(predicate)); }; +function find(predicate, thisArg) { + if (typeof predicate !== 'function') { + throw new TypeError('predicate is not a function'); + } + return function (source) { return source.lift(new FindValueOperator(predicate, source, false, thisArg)); }; } -var SkipWhileOperator = /*@__PURE__*/ (function () { - function SkipWhileOperator(predicate) { +var FindValueOperator = /*@__PURE__*/ (function () { + function FindValueOperator(predicate, source, yieldIndex, thisArg) { this.predicate = predicate; + this.source = source; + this.yieldIndex = yieldIndex; + this.thisArg = thisArg; } - SkipWhileOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new SkipWhileSubscriber(subscriber, this.predicate)); + FindValueOperator.prototype.call = function (observer, source) { + return source.subscribe(new FindValueSubscriber(observer, this.predicate, this.source, this.yieldIndex, this.thisArg)); }; - return SkipWhileOperator; + return FindValueOperator; }()); -var SkipWhileSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SkipWhileSubscriber, _super); - function SkipWhileSubscriber(destination, predicate) { + +var FindValueSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](FindValueSubscriber, _super); + function FindValueSubscriber(destination, predicate, source, yieldIndex, thisArg) { var _this = _super.call(this, destination) || this; _this.predicate = predicate; - _this.skipping = true; + _this.source = source; + _this.yieldIndex = yieldIndex; + _this.thisArg = thisArg; _this.index = 0; return _this; } - SkipWhileSubscriber.prototype._next = function (value) { + FindValueSubscriber.prototype.notifyComplete = function (value) { var destination = this.destination; - if (this.skipping) { - this.tryCallPredicate(value); - } - if (!this.skipping) { - destination.next(value); - } + destination.next(value); + destination.complete(); + this.unsubscribe(); }; - SkipWhileSubscriber.prototype.tryCallPredicate = function (value) { + FindValueSubscriber.prototype._next = function (value) { + var _a = this, predicate = _a.predicate, thisArg = _a.thisArg; + var index = this.index++; try { - var result = this.predicate(value, this.index++); - this.skipping = Boolean(result); + var result = predicate.call(thisArg || this, value, index, this.source); + if (result) { + this.notifyComplete(this.yieldIndex ? index : value); + } } catch (err) { this.destination.error(err); } }; - return SkipWhileSubscriber; + FindValueSubscriber.prototype._complete = function () { + this.notifyComplete(this.yieldIndex ? -1 : undefined); + }; + return FindValueSubscriber; }(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=skipWhile.js.map + +//# sourceMappingURL=find.js.map /***/ }), -/* 317 */ +/* 305 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "startWith", function() { return startWith; }); -/* harmony import */ var _observable_concat__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(226); -/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(206); -/** PURE_IMPORTS_START _observable_concat,_util_isScheduler PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "findIndex", function() { return findIndex; }); +/* harmony import */ var _operators_find__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(304); +/** PURE_IMPORTS_START _operators_find PURE_IMPORTS_END */ +function findIndex(predicate, thisArg) { + return function (source) { return source.lift(new _operators_find__WEBPACK_IMPORTED_MODULE_0__["FindValueOperator"](predicate, source, true, thisArg)); }; +} +//# sourceMappingURL=findIndex.js.map -function startWith() { - var array = []; - for (var _i = 0; _i < arguments.length; _i++) { - array[_i] = arguments[_i]; - } - var scheduler = array[array.length - 1]; - if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_1__["isScheduler"])(scheduler)) { - array.pop(); - return function (source) { return Object(_observable_concat__WEBPACK_IMPORTED_MODULE_0__["concat"])(array, source, scheduler); }; - } - else { - return function (source) { return Object(_observable_concat__WEBPACK_IMPORTED_MODULE_0__["concat"])(array, source); }; - } + +/***/ }), +/* 306 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__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__(223); +/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(264); +/* harmony import */ var _take__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(297); +/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(287); +/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(296); +/* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(220); +/** PURE_IMPORTS_START _util_EmptyError,_filter,_take,_defaultIfEmpty,_throwIfEmpty,_util_identity PURE_IMPORTS_END */ + + + + + + +function first(predicate, defaultValue) { + var hasDefaultValue = arguments.length >= 2; + return function (source) { return source.pipe(predicate ? Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(function (v, i) { return predicate(v, i, source); }) : _util_identity__WEBPACK_IMPORTED_MODULE_5__["identity"], Object(_take__WEBPACK_IMPORTED_MODULE_2__["take"])(1), hasDefaultValue ? Object(_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_3__["defaultIfEmpty"])(defaultValue) : Object(_throwIfEmpty__WEBPACK_IMPORTED_MODULE_4__["throwIfEmpty"])(function () { return new _util_EmptyError__WEBPACK_IMPORTED_MODULE_0__["EmptyError"](); })); }; } -//# sourceMappingURL=startWith.js.map +//# sourceMappingURL=first.js.map /***/ }), -/* 318 */ +/* 307 */ /***/ (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__(319); -/** PURE_IMPORTS_START _observable_SubscribeOnObservable PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ignoreElements", function() { return ignoreElements; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function subscribeOn(scheduler, delay) { - if (delay === void 0) { - delay = 0; - } - return function subscribeOnOperatorFunction(source) { - return source.lift(new SubscribeOnOperator(scheduler, delay)); + +function ignoreElements() { + return function ignoreElementsOperatorFunction(source) { + return source.lift(new IgnoreElementsOperator()); }; } -var SubscribeOnOperator = /*@__PURE__*/ (function () { - function SubscribeOnOperator(scheduler, delay) { - this.scheduler = scheduler; - this.delay = delay; +var IgnoreElementsOperator = /*@__PURE__*/ (function () { + function IgnoreElementsOperator() { } - SubscribeOnOperator.prototype.call = function (subscriber, source) { - return new _observable_SubscribeOnObservable__WEBPACK_IMPORTED_MODULE_0__["SubscribeOnObservable"](source, this.delay, this.scheduler).subscribe(subscriber); + IgnoreElementsOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new IgnoreElementsSubscriber(subscriber)); }; - return SubscribeOnOperator; + return IgnoreElementsOperator; }()); -//# sourceMappingURL=subscribeOn.js.map +var IgnoreElementsSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](IgnoreElementsSubscriber, _super); + function IgnoreElementsSubscriber() { + return _super !== null && _super.apply(this, arguments) || this; + } + IgnoreElementsSubscriber.prototype._next = function (unused) { + }; + return IgnoreElementsSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=ignoreElements.js.map /***/ }), -/* 319 */ +/* 308 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SubscribeOnObservable", function() { return SubscribeOnObservable; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isEmpty", function() { return isEmpty; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(193); -/* harmony import */ var _scheduler_asap__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(320); -/* harmony import */ var _util_isNumeric__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(205); -/** PURE_IMPORTS_START tslib,_Observable,_scheduler_asap,_util_isNumeric PURE_IMPORTS_END */ - - +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -var SubscribeOnObservable = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SubscribeOnObservable, _super); - function SubscribeOnObservable(source, delayTime, scheduler) { - if (delayTime === void 0) { - delayTime = 0; - } - if (scheduler === void 0) { - scheduler = _scheduler_asap__WEBPACK_IMPORTED_MODULE_2__["asap"]; - } - var _this = _super.call(this) || this; - _this.source = source; - _this.delayTime = delayTime; - _this.scheduler = scheduler; - if (!Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_3__["isNumeric"])(delayTime) || delayTime < 0) { - _this.delayTime = 0; - } - if (!scheduler || typeof scheduler.schedule !== 'function') { - _this.scheduler = _scheduler_asap__WEBPACK_IMPORTED_MODULE_2__["asap"]; - } - return _this; +function isEmpty() { + return function (source) { return source.lift(new IsEmptyOperator()); }; +} +var IsEmptyOperator = /*@__PURE__*/ (function () { + function IsEmptyOperator() { } - SubscribeOnObservable.create = function (source, delay, scheduler) { - if (delay === void 0) { - delay = 0; - } - if (scheduler === void 0) { - scheduler = _scheduler_asap__WEBPACK_IMPORTED_MODULE_2__["asap"]; - } - return new SubscribeOnObservable(source, delay, scheduler); + IsEmptyOperator.prototype.call = function (observer, source) { + return source.subscribe(new IsEmptySubscriber(observer)); }; - SubscribeOnObservable.dispatch = function (arg) { - var source = arg.source, subscriber = arg.subscriber; - return this.add(source.subscribe(subscriber)); + return IsEmptyOperator; +}()); +var IsEmptySubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](IsEmptySubscriber, _super); + function IsEmptySubscriber(destination) { + return _super.call(this, destination) || this; + } + IsEmptySubscriber.prototype.notifyComplete = function (isEmpty) { + var destination = this.destination; + destination.next(isEmpty); + destination.complete(); }; - SubscribeOnObservable.prototype._subscribe = function (subscriber) { - var delay = this.delayTime; - var source = this.source; - var scheduler = this.scheduler; - return scheduler.schedule(SubscribeOnObservable.dispatch, delay, { - source: source, subscriber: subscriber - }); + IsEmptySubscriber.prototype._next = function (value) { + this.notifyComplete(false); }; - return SubscribeOnObservable; -}(_Observable__WEBPACK_IMPORTED_MODULE_1__["Observable"])); - -//# sourceMappingURL=SubscribeOnObservable.js.map + IsEmptySubscriber.prototype._complete = function () { + this.notifyComplete(true); + }; + return IsEmptySubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=isEmpty.js.map /***/ }), -/* 320 */ +/* 309 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "asap", function() { return asap; }); -/* harmony import */ var _AsapAction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(321); -/* harmony import */ var _AsapScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(323); -/** PURE_IMPORTS_START _AsapAction,_AsapScheduler PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "last", function() { return last; }); +/* harmony import */ var _util_EmptyError__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(223); +/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(264); +/* harmony import */ var _takeLast__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(310); +/* harmony import */ var _throwIfEmpty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(296); +/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(287); +/* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(220); +/** PURE_IMPORTS_START _util_EmptyError,_filter,_takeLast,_throwIfEmpty,_defaultIfEmpty,_util_identity PURE_IMPORTS_END */ -var asap = /*@__PURE__*/ new _AsapScheduler__WEBPACK_IMPORTED_MODULE_1__["AsapScheduler"](_AsapAction__WEBPACK_IMPORTED_MODULE_0__["AsapAction"]); -//# sourceMappingURL=asap.js.map + + + + +function last(predicate, defaultValue) { + var hasDefaultValue = arguments.length >= 2; + return function (source) { return source.pipe(predicate ? Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(function (v, i) { return predicate(v, i, source); }) : _util_identity__WEBPACK_IMPORTED_MODULE_5__["identity"], Object(_takeLast__WEBPACK_IMPORTED_MODULE_2__["takeLast"])(1), hasDefaultValue ? Object(_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_4__["defaultIfEmpty"])(defaultValue) : Object(_throwIfEmpty__WEBPACK_IMPORTED_MODULE_3__["throwIfEmpty"])(function () { return new _util_EmptyError__WEBPACK_IMPORTED_MODULE_0__["EmptyError"](); })); }; +} +//# sourceMappingURL=last.js.map /***/ }), -/* 321 */ +/* 310 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AsapAction", function() { return AsapAction; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "takeLast", function() { return takeLast; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _util_Immediate__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(322); -/* harmony import */ var _AsyncAction__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(200); -/** PURE_IMPORTS_START tslib,_util_Immediate,_AsyncAction PURE_IMPORTS_END */ +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); +/* harmony import */ var _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(222); +/* harmony import */ var _observable_empty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(203); +/** PURE_IMPORTS_START tslib,_Subscriber,_util_ArgumentOutOfRangeError,_observable_empty PURE_IMPORTS_END */ -var AsapAction = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AsapAction, _super); - function AsapAction(scheduler, work) { - var _this = _super.call(this, scheduler, work) || this; - _this.scheduler = scheduler; - _this.work = work; - return _this; - } - AsapAction.prototype.requestAsyncId = function (scheduler, id, delay) { - if (delay === void 0) { - delay = 0; + +function takeLast(count) { + return function takeLastOperatorFunction(source) { + if (count === 0) { + return Object(_observable_empty__WEBPACK_IMPORTED_MODULE_3__["empty"])(); } - if (delay !== null && delay > 0) { - return _super.prototype.requestAsyncId.call(this, scheduler, id, delay); + else { + return source.lift(new TakeLastOperator(count)); } - scheduler.actions.push(this); - return scheduler.scheduled || (scheduler.scheduled = _util_Immediate__WEBPACK_IMPORTED_MODULE_1__["Immediate"].setImmediate(scheduler.flush.bind(scheduler, null))); }; - AsapAction.prototype.recycleAsyncId = function (scheduler, id, delay) { - if (delay === void 0) { - delay = 0; +} +var TakeLastOperator = /*@__PURE__*/ (function () { + function TakeLastOperator(total) { + this.total = total; + if (this.total < 0) { + throw new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__["ArgumentOutOfRangeError"]; } - if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) { - return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay); + } + TakeLastOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new TakeLastSubscriber(subscriber, this.total)); + }; + return TakeLastOperator; +}()); +var TakeLastSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TakeLastSubscriber, _super); + function TakeLastSubscriber(destination, total) { + var _this = _super.call(this, destination) || this; + _this.total = total; + _this.ring = new Array(); + _this.count = 0; + return _this; + } + TakeLastSubscriber.prototype._next = function (value) { + var ring = this.ring; + var total = this.total; + var count = this.count++; + if (ring.length < total) { + ring.push(value); } - if (scheduler.actions.length === 0) { - _util_Immediate__WEBPACK_IMPORTED_MODULE_1__["Immediate"].clearImmediate(id); - scheduler.scheduled = undefined; + else { + var index = count % total; + ring[index] = value; } - return undefined; }; - return AsapAction; -}(_AsyncAction__WEBPACK_IMPORTED_MODULE_2__["AsyncAction"])); - -//# sourceMappingURL=AsapAction.js.map + TakeLastSubscriber.prototype._complete = function () { + var destination = this.destination; + var count = this.count; + if (count > 0) { + var total = this.count >= this.total ? this.total : this.count; + var ring = this.ring; + for (var i = 0; i < total; i++) { + var idx = (count++) % total; + destination.next(ring[idx]); + } + } + destination.complete(); + }; + return TakeLastSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=takeLast.js.map /***/ }), -/* 322 */ +/* 311 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Immediate", function() { return Immediate; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -var nextHandle = 1; -var tasksByHandle = {}; -function runIfPresent(handle) { - var cb = tasksByHandle[handle]; - if (cb) { - cb(); - } +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mapTo", function() { return mapTo; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ + + +function mapTo(value) { + return function (source) { return source.lift(new MapToOperator(value)); }; } -var Immediate = { - setImmediate: function (cb) { - var handle = nextHandle++; - tasksByHandle[handle] = cb; - Promise.resolve().then(function () { return runIfPresent(handle); }); - return handle; - }, - clearImmediate: function (handle) { - delete tasksByHandle[handle]; - }, -}; -//# sourceMappingURL=Immediate.js.map +var MapToOperator = /*@__PURE__*/ (function () { + function MapToOperator(value) { + this.value = value; + } + MapToOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new MapToSubscriber(subscriber, this.value)); + }; + return MapToOperator; +}()); +var MapToSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](MapToSubscriber, _super); + function MapToSubscriber(destination, value) { + var _this = _super.call(this, destination) || this; + _this.value = value; + return _this; + } + MapToSubscriber.prototype._next = function (x) { + this.destination.next(this.value); + }; + return MapToSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=mapTo.js.map /***/ }), -/* 323 */ +/* 312 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AsapScheduler", function() { return AsapScheduler; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "materialize", function() { return materialize; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(202); -/** PURE_IMPORTS_START tslib,_AsyncScheduler PURE_IMPORTS_END */ +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); +/* harmony import */ var _Notification__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(202); +/** PURE_IMPORTS_START tslib,_Subscriber,_Notification PURE_IMPORTS_END */ -var AsapScheduler = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AsapScheduler, _super); - function AsapScheduler() { - return _super !== null && _super.apply(this, arguments) || this; + +function materialize() { + return function materializeOperatorFunction(source) { + return source.lift(new MaterializeOperator()); + }; +} +var MaterializeOperator = /*@__PURE__*/ (function () { + function MaterializeOperator() { } - AsapScheduler.prototype.flush = function (action) { - this.active = true; - this.scheduled = undefined; - var actions = this.actions; - var error; - var index = -1; - var count = actions.length; - action = action || actions.shift(); - do { - if (error = action.execute(action.state, action.delay)) { - break; - } - } while (++index < count && (action = actions.shift())); - this.active = false; - if (error) { - while (++index < count && (action = actions.shift())) { - action.unsubscribe(); - } - throw error; - } + MaterializeOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new MaterializeSubscriber(subscriber)); }; - return AsapScheduler; -}(_AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__["AsyncScheduler"])); - -//# sourceMappingURL=AsapScheduler.js.map + return MaterializeOperator; +}()); +var MaterializeSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](MaterializeSubscriber, _super); + function MaterializeSubscriber(destination) { + return _super.call(this, destination) || this; + } + MaterializeSubscriber.prototype._next = function (value) { + this.destination.next(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createNext(value)); + }; + MaterializeSubscriber.prototype._error = function (err) { + var destination = this.destination; + destination.next(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createError(err)); + destination.complete(); + }; + MaterializeSubscriber.prototype._complete = function () { + var destination = this.destination; + destination.next(_Notification__WEBPACK_IMPORTED_MODULE_2__["Notification"].createComplete()); + destination.complete(); + }; + return MaterializeSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=materialize.js.map /***/ }), -/* 324 */ +/* 313 */ /***/ (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__(325); -/* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(232); -/** PURE_IMPORTS_START _switchMap,_util_identity PURE_IMPORTS_END */ - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "max", function() { return max; }); +/* harmony import */ var _reduce__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(314); +/** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */ -function switchAll() { - return Object(_switchMap__WEBPACK_IMPORTED_MODULE_0__["switchMap"])(_util_identity__WEBPACK_IMPORTED_MODULE_1__["identity"]); +function max(comparer) { + var max = (typeof comparer === 'function') + ? function (x, y) { return comparer(x, y) > 0 ? x : y; } + : function (x, y) { return x > y ? x : y; }; + return Object(_reduce__WEBPACK_IMPORTED_MODULE_0__["reduce"])(max); } -//# sourceMappingURL=switchAll.js.map +//# sourceMappingURL=max.js.map /***/ }), -/* 325 */ +/* 314 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "switchMap", function() { return switchMap; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(171); -/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(183); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(182); -/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(231); -/* harmony import */ var _observable_from__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(218); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult,_map,_observable_from PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "reduce", function() { return reduce; }); +/* harmony import */ var _scan__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(315); +/* harmony import */ var _takeLast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(310); +/* harmony import */ var _defaultIfEmpty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(287); +/* harmony import */ var _util_pipe__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(184); +/** PURE_IMPORTS_START _scan,_takeLast,_defaultIfEmpty,_util_pipe PURE_IMPORTS_END */ + +function reduce(accumulator, seed) { + if (arguments.length >= 2) { + return function reduceOperatorFunctionWithSeed(source) { + return Object(_util_pipe__WEBPACK_IMPORTED_MODULE_3__["pipe"])(Object(_scan__WEBPACK_IMPORTED_MODULE_0__["scan"])(accumulator, seed), Object(_takeLast__WEBPACK_IMPORTED_MODULE_1__["takeLast"])(1), Object(_defaultIfEmpty__WEBPACK_IMPORTED_MODULE_2__["defaultIfEmpty"])(seed))(source); + }; + } + return function reduceOperatorFunction(source) { + return Object(_util_pipe__WEBPACK_IMPORTED_MODULE_3__["pipe"])(Object(_scan__WEBPACK_IMPORTED_MODULE_0__["scan"])(function (acc, value, index) { return accumulator(acc, value, index + 1); }), Object(_takeLast__WEBPACK_IMPORTED_MODULE_1__["takeLast"])(1))(source); + }; +} +//# sourceMappingURL=reduce.js.map +/***/ }), +/* 315 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -function switchMap(project, resultSelector) { - if (typeof resultSelector === 'function') { - return function (source) { return source.pipe(switchMap(function (a, i) { return Object(_observable_from__WEBPACK_IMPORTED_MODULE_5__["from"])(project(a, i)).pipe(Object(_map__WEBPACK_IMPORTED_MODULE_4__["map"])(function (b, ii) { return resultSelector(a, b, i, ii); })); })); }; +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "scan", function() { return scan; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ + + +function scan(accumulator, seed) { + var hasSeed = false; + if (arguments.length >= 2) { + hasSeed = true; } - return function (source) { return source.lift(new SwitchMapOperator(project)); }; + return function scanOperatorFunction(source) { + return source.lift(new ScanOperator(accumulator, seed, hasSeed)); + }; } -var SwitchMapOperator = /*@__PURE__*/ (function () { - function SwitchMapOperator(project) { - this.project = project; +var ScanOperator = /*@__PURE__*/ (function () { + function ScanOperator(accumulator, seed, hasSeed) { + if (hasSeed === void 0) { + hasSeed = false; + } + this.accumulator = accumulator; + this.seed = seed; + this.hasSeed = hasSeed; } - SwitchMapOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new SwitchMapSubscriber(subscriber, this.project)); + ScanOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new ScanSubscriber(subscriber, this.accumulator, this.seed, this.hasSeed)); }; - return SwitchMapOperator; + return ScanOperator; }()); -var SwitchMapSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SwitchMapSubscriber, _super); - function SwitchMapSubscriber(destination, project) { +var ScanSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ScanSubscriber, _super); + function ScanSubscriber(destination, accumulator, _seed, hasSeed) { var _this = _super.call(this, destination) || this; - _this.project = project; + _this.accumulator = accumulator; + _this._seed = _seed; + _this.hasSeed = hasSeed; _this.index = 0; return _this; } - SwitchMapSubscriber.prototype._next = function (value) { - var result; - var index = this.index++; - try { - result = this.project(value, index); - } - catch (error) { - this.destination.error(error); - return; + Object.defineProperty(ScanSubscriber.prototype, "seed", { + get: function () { + return this._seed; + }, + set: function (value) { + this.hasSeed = true; + this._seed = value; + }, + enumerable: true, + configurable: true + }); + ScanSubscriber.prototype._next = function (value) { + if (!this.hasSeed) { + this.seed = value; + this.destination.next(value); } - this._innerSub(result, value, index); - }; - SwitchMapSubscriber.prototype._innerSub = function (result, value, index) { - var innerSubscription = this.innerSubscription; - if (innerSubscription) { - innerSubscription.unsubscribe(); + else { + return this._tryNext(value); } - var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__["InnerSubscriber"](this, undefined, undefined); - var destination = this.destination; - destination.add(innerSubscriber); - this.innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, result, value, index, innerSubscriber); }; - SwitchMapSubscriber.prototype._complete = function () { - var innerSubscription = this.innerSubscription; - if (!innerSubscription || innerSubscription.closed) { - _super.prototype._complete.call(this); + ScanSubscriber.prototype._tryNext = function (value) { + var index = this.index++; + var result; + try { + result = this.accumulator(this.seed, value, index); } - this.unsubscribe(); - }; - SwitchMapSubscriber.prototype._unsubscribe = function () { - this.innerSubscription = null; - }; - SwitchMapSubscriber.prototype.notifyComplete = function (innerSub) { - var destination = this.destination; - destination.remove(innerSub); - this.innerSubscription = null; - if (this.isStopped) { - _super.prototype._complete.call(this); + catch (err) { + this.destination.error(err); } + this.seed = result; + this.destination.next(result); }; - SwitchMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.destination.next(innerValue); - }; - return SwitchMapSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=switchMap.js.map + return ScanSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=scan.js.map /***/ }), -/* 326 */ +/* 316 */ /***/ (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__(325); -/** PURE_IMPORTS_START _switchMap PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "merge", function() { return merge; }); +/* harmony import */ var _observable_merge__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(258); +/** PURE_IMPORTS_START _observable_merge PURE_IMPORTS_END */ -function switchMapTo(innerObservable, resultSelector) { - return resultSelector ? Object(_switchMap__WEBPACK_IMPORTED_MODULE_0__["switchMap"])(function () { return innerObservable; }, resultSelector) : Object(_switchMap__WEBPACK_IMPORTED_MODULE_0__["switchMap"])(function () { return innerObservable; }); +function merge() { + var observables = []; + for (var _i = 0; _i < arguments.length; _i++) { + observables[_i] = arguments[_i]; + } + return function (source) { return source.lift.call(_observable_merge__WEBPACK_IMPORTED_MODULE_0__["merge"].apply(void 0, [source].concat(observables))); }; } -//# sourceMappingURL=switchMapTo.js.map +//# sourceMappingURL=merge.js.map /***/ }), -/* 327 */ +/* 317 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "takeUntil", function() { return takeUntil; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(171); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(182); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mergeMapTo", function() { return mergeMapTo; }); +/* harmony import */ var _mergeMap__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(242); +/** PURE_IMPORTS_START _mergeMap PURE_IMPORTS_END */ -function takeUntil(notifier) { - return function (source) { return source.lift(new TakeUntilOperator(notifier)); }; -} -var TakeUntilOperator = /*@__PURE__*/ (function () { - function TakeUntilOperator(notifier) { - this.notifier = notifier; +function mergeMapTo(innerObservable, resultSelector, concurrent) { + if (concurrent === void 0) { + concurrent = Number.POSITIVE_INFINITY; } - TakeUntilOperator.prototype.call = function (subscriber, source) { - var takeUntilSubscriber = new TakeUntilSubscriber(subscriber); - var notifierSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(takeUntilSubscriber, this.notifier); - if (notifierSubscription && !takeUntilSubscriber.seenValue) { - takeUntilSubscriber.add(notifierSubscription); - return source.subscribe(takeUntilSubscriber); - } - return takeUntilSubscriber; - }; - return TakeUntilOperator; -}()); -var TakeUntilSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TakeUntilSubscriber, _super); - function TakeUntilSubscriber(destination) { - var _this = _super.call(this, destination) || this; - _this.seenValue = false; - return _this; + if (typeof resultSelector === 'function') { + return Object(_mergeMap__WEBPACK_IMPORTED_MODULE_0__["mergeMap"])(function () { return innerObservable; }, resultSelector, concurrent); } - TakeUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.seenValue = true; - this.complete(); - }; - TakeUntilSubscriber.prototype.notifyComplete = function () { - }; - return TakeUntilSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=takeUntil.js.map + if (typeof resultSelector === 'number') { + concurrent = resultSelector; + } + return Object(_mergeMap__WEBPACK_IMPORTED_MODULE_0__["mergeMap"])(function () { return innerObservable; }, concurrent); +} +//# sourceMappingURL=mergeMapTo.js.map /***/ }), -/* 328 */ +/* 318 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "takeWhile", function() { return takeWhile; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "mergeScan", function() { return mergeScan; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MergeScanOperator", function() { return MergeScanOperator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MergeScanSubscriber", function() { return MergeScanSubscriber; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(230); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(229); +/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(231); +/** PURE_IMPORTS_START tslib,_util_subscribeToResult,_OuterSubscriber,_InnerSubscriber PURE_IMPORTS_END */ -function takeWhile(predicate, inclusive) { - if (inclusive === void 0) { - inclusive = false; + + +function mergeScan(accumulator, seed, concurrent) { + if (concurrent === void 0) { + concurrent = Number.POSITIVE_INFINITY; } - return function (source) { - return source.lift(new TakeWhileOperator(predicate, inclusive)); - }; + return function (source) { return source.lift(new MergeScanOperator(accumulator, seed, concurrent)); }; } -var TakeWhileOperator = /*@__PURE__*/ (function () { - function TakeWhileOperator(predicate, inclusive) { - this.predicate = predicate; - this.inclusive = inclusive; +var MergeScanOperator = /*@__PURE__*/ (function () { + function MergeScanOperator(accumulator, seed, concurrent) { + this.accumulator = accumulator; + this.seed = seed; + this.concurrent = concurrent; } - TakeWhileOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new TakeWhileSubscriber(subscriber, this.predicate, this.inclusive)); + MergeScanOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new MergeScanSubscriber(subscriber, this.accumulator, this.seed, this.concurrent)); }; - return TakeWhileOperator; + return MergeScanOperator; }()); -var TakeWhileSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TakeWhileSubscriber, _super); - function TakeWhileSubscriber(destination, predicate, inclusive) { + +var MergeScanSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](MergeScanSubscriber, _super); + function MergeScanSubscriber(destination, accumulator, acc, concurrent) { var _this = _super.call(this, destination) || this; - _this.predicate = predicate; - _this.inclusive = inclusive; + _this.accumulator = accumulator; + _this.acc = acc; + _this.concurrent = concurrent; + _this.hasValue = false; + _this.hasCompleted = false; + _this.buffer = []; + _this.active = 0; _this.index = 0; return _this; } - TakeWhileSubscriber.prototype._next = function (value) { - var destination = this.destination; - var result; - try { - result = this.predicate(value, this.index++); + MergeScanSubscriber.prototype._next = function (value) { + if (this.active < this.concurrent) { + var index = this.index++; + var destination = this.destination; + var ish = void 0; + try { + var accumulator = this.accumulator; + ish = accumulator(this.acc, value, index); + } + catch (e) { + return destination.error(e); + } + this.active++; + this._innerSub(ish, value, index); } - catch (err) { - destination.error(err); - return; + else { + this.buffer.push(value); } - this.nextOrComplete(value, result); }; - TakeWhileSubscriber.prototype.nextOrComplete = function (value, predicateResult) { + MergeScanSubscriber.prototype._innerSub = function (ish, value, index) { + var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_3__["InnerSubscriber"](this, undefined, undefined); var destination = this.destination; - if (Boolean(predicateResult)) { - destination.next(value); - } - else { - if (this.inclusive) { - destination.next(value); + destination.add(innerSubscriber); + Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_1__["subscribeToResult"])(this, ish, value, index, innerSubscriber); + }; + MergeScanSubscriber.prototype._complete = function () { + this.hasCompleted = true; + if (this.active === 0 && this.buffer.length === 0) { + if (this.hasValue === false) { + this.destination.next(this.acc); } - destination.complete(); + this.destination.complete(); } + this.unsubscribe(); }; - return TakeWhileSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=takeWhile.js.map - - -/***/ }), -/* 329 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tap", function() { return tap; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _util_noop__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(197); -/* harmony import */ var _util_isFunction__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(173); -/** PURE_IMPORTS_START tslib,_Subscriber,_util_noop,_util_isFunction PURE_IMPORTS_END */ + MergeScanSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + var destination = this.destination; + this.acc = innerValue; + this.hasValue = true; + destination.next(innerValue); + }; + MergeScanSubscriber.prototype.notifyComplete = function (innerSub) { + var buffer = this.buffer; + var destination = this.destination; + destination.remove(innerSub); + this.active--; + if (buffer.length > 0) { + this._next(buffer.shift()); + } + else if (this.active === 0 && this.hasCompleted) { + if (this.hasValue === false) { + this.destination.next(this.acc); + } + this.destination.complete(); + } + }; + return MergeScanSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); +//# sourceMappingURL=mergeScan.js.map +/***/ }), +/* 319 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -function tap(nextOrObserver, error, complete) { - return function tapOperatorFunction(source) { - return source.lift(new DoOperator(nextOrObserver, error, complete)); - }; +"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__(314); +/** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */ + +function min(comparer) { + var min = (typeof comparer === 'function') + ? function (x, y) { return comparer(x, y) < 0 ? x : y; } + : function (x, y) { return x < y ? x : y; }; + return Object(_reduce__WEBPACK_IMPORTED_MODULE_0__["reduce"])(min); } -var DoOperator = /*@__PURE__*/ (function () { - function DoOperator(nextOrObserver, error, complete) { - this.nextOrObserver = nextOrObserver; - this.error = error; - this.complete = complete; - } - DoOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new TapSubscriber(subscriber, this.nextOrObserver, this.error, this.complete)); - }; - return DoOperator; -}()); -var TapSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TapSubscriber, _super); - function TapSubscriber(destination, observerOrNext, error, complete) { - var _this = _super.call(this, destination) || this; - _this._tapNext = _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; - _this._tapError = _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; - _this._tapComplete = _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; - _this._tapError = error || _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; - _this._tapComplete = complete || _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; - if (Object(_util_isFunction__WEBPACK_IMPORTED_MODULE_3__["isFunction"])(observerOrNext)) { - _this._context = _this; - _this._tapNext = observerOrNext; - } - else if (observerOrNext) { - _this._context = observerOrNext; - _this._tapNext = observerOrNext.next || _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; - _this._tapError = observerOrNext.error || _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; - _this._tapComplete = observerOrNext.complete || _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; - } - return _this; - } - TapSubscriber.prototype._next = function (value) { - try { - this._tapNext.call(this._context, value); - } - catch (err) { - this.destination.error(err); - return; +//# sourceMappingURL=min.js.map + + +/***/ }), +/* 320 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "multicast", function() { return multicast; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "MulticastOperator", function() { return MulticastOperator; }); +/* harmony import */ var _observable_ConnectableObservable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(186); +/** PURE_IMPORTS_START _observable_ConnectableObservable PURE_IMPORTS_END */ + +function multicast(subjectOrSubjectFactory, selector) { + return function multicastOperatorFunction(source) { + var subjectFactory; + if (typeof subjectOrSubjectFactory === 'function') { + subjectFactory = subjectOrSubjectFactory; } - this.destination.next(value); - }; - TapSubscriber.prototype._error = function (err) { - try { - this._tapError.call(this._context, err); + else { + subjectFactory = function subjectFactory() { + return subjectOrSubjectFactory; + }; } - catch (err) { - this.destination.error(err); - return; + if (typeof selector === 'function') { + return source.lift(new MulticastOperator(subjectFactory, selector)); } - this.destination.error(err); + var connectable = Object.create(source, _observable_ConnectableObservable__WEBPACK_IMPORTED_MODULE_0__["connectableObservableDescriptor"]); + connectable.source = source; + connectable.subjectFactory = subjectFactory; + return connectable; }; - TapSubscriber.prototype._complete = function () { - try { - this._tapComplete.call(this._context); - } - catch (err) { - this.destination.error(err); - return; - } - return this.destination.complete(); +} +var MulticastOperator = /*@__PURE__*/ (function () { + function MulticastOperator(subjectFactory, selector) { + this.subjectFactory = subjectFactory; + this.selector = selector; + } + MulticastOperator.prototype.call = function (subscriber, source) { + var selector = this.selector; + var subject = this.subjectFactory(); + var subscription = selector(subject).subscribe(subscriber); + subscription.add(source.subscribe(subject)); + return subscription; }; - return TapSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=tap.js.map + return MulticastOperator; +}()); + +//# sourceMappingURL=multicast.js.map /***/ }), -/* 330 */ +/* 321 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultThrottleConfig", function() { return defaultThrottleConfig; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "throttle", function() { return throttle; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "onErrorResumeNext", function() { return onErrorResumeNext; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "onErrorResumeNextStatic", function() { return onErrorResumeNextStatic; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(171); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(182); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ +/* harmony import */ var _observable_from__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(243); +/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(178); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(229); +/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(231); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(230); +/** PURE_IMPORTS_START tslib,_observable_from,_util_isArray,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -var defaultThrottleConfig = { - leading: true, - trailing: false -}; -function throttle(durationSelector, config) { - if (config === void 0) { - config = defaultThrottleConfig; + + + +function onErrorResumeNext() { + var nextSources = []; + for (var _i = 0; _i < arguments.length; _i++) { + nextSources[_i] = arguments[_i]; } - return function (source) { return source.lift(new ThrottleOperator(durationSelector, config.leading, config.trailing)); }; + if (nextSources.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_2__["isArray"])(nextSources[0])) { + nextSources = nextSources[0]; + } + return function (source) { return source.lift(new OnErrorResumeNextOperator(nextSources)); }; } -var ThrottleOperator = /*@__PURE__*/ (function () { - function ThrottleOperator(durationSelector, leading, trailing) { - this.durationSelector = durationSelector; - this.leading = leading; - this.trailing = trailing; +function onErrorResumeNextStatic() { + var nextSources = []; + for (var _i = 0; _i < arguments.length; _i++) { + nextSources[_i] = arguments[_i]; } - ThrottleOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new ThrottleSubscriber(subscriber, this.durationSelector, this.leading, this.trailing)); + var source = null; + if (nextSources.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_2__["isArray"])(nextSources[0])) { + nextSources = nextSources[0]; + } + source = nextSources.shift(); + return Object(_observable_from__WEBPACK_IMPORTED_MODULE_1__["from"])(source, null).lift(new OnErrorResumeNextOperator(nextSources)); +} +var OnErrorResumeNextOperator = /*@__PURE__*/ (function () { + function OnErrorResumeNextOperator(nextSources) { + this.nextSources = nextSources; + } + OnErrorResumeNextOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new OnErrorResumeNextSubscriber(subscriber, this.nextSources)); }; - return ThrottleOperator; + return OnErrorResumeNextOperator; }()); -var ThrottleSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ThrottleSubscriber, _super); - function ThrottleSubscriber(destination, durationSelector, _leading, _trailing) { +var OnErrorResumeNextSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](OnErrorResumeNextSubscriber, _super); + function OnErrorResumeNextSubscriber(destination, nextSources) { var _this = _super.call(this, destination) || this; _this.destination = destination; - _this.durationSelector = durationSelector; - _this._leading = _leading; - _this._trailing = _trailing; - _this._hasValue = false; + _this.nextSources = nextSources; return _this; } - ThrottleSubscriber.prototype._next = function (value) { - this._hasValue = true; - this._sendValue = value; - if (!this._throttled) { - if (this._leading) { - this.send(); - } - else { - this.throttle(value); - } - } + OnErrorResumeNextSubscriber.prototype.notifyError = function (error, innerSub) { + this.subscribeToNextSource(); }; - ThrottleSubscriber.prototype.send = function () { - var _a = this, _hasValue = _a._hasValue, _sendValue = _a._sendValue; - if (_hasValue) { - this.destination.next(_sendValue); - this.throttle(_sendValue); - } - this._hasValue = false; - this._sendValue = null; + OnErrorResumeNextSubscriber.prototype.notifyComplete = function (innerSub) { + this.subscribeToNextSource(); }; - ThrottleSubscriber.prototype.throttle = function (value) { - var duration = this.tryDurationSelector(value); - if (!!duration) { - this.add(this._throttled = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, duration)); - } + OnErrorResumeNextSubscriber.prototype._error = function (err) { + this.subscribeToNextSource(); + this.unsubscribe(); }; - ThrottleSubscriber.prototype.tryDurationSelector = function (value) { - try { - return this.durationSelector(value); - } - catch (err) { - this.destination.error(err); - return null; - } + OnErrorResumeNextSubscriber.prototype._complete = function () { + this.subscribeToNextSource(); + this.unsubscribe(); }; - ThrottleSubscriber.prototype.throttlingDone = function () { - var _a = this, _throttled = _a._throttled, _trailing = _a._trailing; - if (_throttled) { - _throttled.unsubscribe(); + OnErrorResumeNextSubscriber.prototype.subscribeToNextSource = function () { + var next = this.nextSources.shift(); + if (!!next) { + var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_4__["InnerSubscriber"](this, undefined, undefined); + var destination = this.destination; + destination.add(innerSubscriber); + Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_5__["subscribeToResult"])(this, next, undefined, undefined, innerSubscriber); } - this._throttled = null; - if (_trailing) { - this.send(); + else { + this.destination.complete(); } }; - ThrottleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.throttlingDone(); - }; - ThrottleSubscriber.prototype.notifyComplete = function () { - this.throttlingDone(); - }; - return ThrottleSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=throttle.js.map + return OnErrorResumeNextSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); +//# sourceMappingURL=onErrorResumeNext.js.map /***/ }), -/* 331 */ +/* 322 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "throttleTime", function() { return throttleTime; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pairwise", function() { return pairwise; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); /* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(199); -/* harmony import */ var _throttle__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(330); -/** PURE_IMPORTS_START tslib,_Subscriber,_scheduler_async,_throttle PURE_IMPORTS_END */ - - +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function throttleTime(duration, scheduler, config) { - if (scheduler === void 0) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_2__["async"]; - } - if (config === void 0) { - config = _throttle__WEBPACK_IMPORTED_MODULE_3__["defaultThrottleConfig"]; - } - return function (source) { return source.lift(new ThrottleTimeOperator(duration, scheduler, config.leading, config.trailing)); }; +function pairwise() { + return function (source) { return source.lift(new PairwiseOperator()); }; } -var ThrottleTimeOperator = /*@__PURE__*/ (function () { - function ThrottleTimeOperator(duration, scheduler, leading, trailing) { - this.duration = duration; - this.scheduler = scheduler; - this.leading = leading; - this.trailing = trailing; +var PairwiseOperator = /*@__PURE__*/ (function () { + function PairwiseOperator() { } - ThrottleTimeOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new ThrottleTimeSubscriber(subscriber, this.duration, this.scheduler, this.leading, this.trailing)); + PairwiseOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new PairwiseSubscriber(subscriber)); }; - return ThrottleTimeOperator; + return PairwiseOperator; }()); -var ThrottleTimeSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ThrottleTimeSubscriber, _super); - function ThrottleTimeSubscriber(destination, duration, scheduler, leading, trailing) { +var PairwiseSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](PairwiseSubscriber, _super); + function PairwiseSubscriber(destination) { var _this = _super.call(this, destination) || this; - _this.duration = duration; - _this.scheduler = scheduler; - _this.leading = leading; - _this.trailing = trailing; - _this._hasTrailingValue = false; - _this._trailingValue = null; + _this.hasPrev = false; return _this; } - ThrottleTimeSubscriber.prototype._next = function (value) { - if (this.throttled) { - if (this.trailing) { - this._trailingValue = value; - this._hasTrailingValue = true; - } - } - else { - this.add(this.throttled = this.scheduler.schedule(dispatchNext, this.duration, { subscriber: this })); - if (this.leading) { - this.destination.next(value); - } - else if (this.trailing) { - this._trailingValue = value; - this._hasTrailingValue = true; - } - } - }; - ThrottleTimeSubscriber.prototype._complete = function () { - if (this._hasTrailingValue) { - this.destination.next(this._trailingValue); - this.destination.complete(); + PairwiseSubscriber.prototype._next = function (value) { + var pair; + if (this.hasPrev) { + pair = [this.prev, value]; } else { - this.destination.complete(); + this.hasPrev = true; } - }; - ThrottleTimeSubscriber.prototype.clearThrottle = function () { - var throttled = this.throttled; - if (throttled) { - if (this.trailing && this._hasTrailingValue) { - this.destination.next(this._trailingValue); - this._trailingValue = null; - this._hasTrailingValue = false; - } - throttled.unsubscribe(); - this.remove(throttled); - this.throttled = null; + this.prev = value; + if (pair) { + this.destination.next(pair); } }; - return ThrottleTimeSubscriber; + return PairwiseSubscriber; }(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -function dispatchNext(arg) { - var subscriber = arg.subscriber; - subscriber.clearThrottle(); -} -//# sourceMappingURL=throttleTime.js.map +//# sourceMappingURL=pairwise.js.map /***/ }), -/* 332 */ +/* 323 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __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__(199); -/* harmony import */ var _scan__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(276); -/* harmony import */ var _observable_defer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(333); -/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(231); -/** PURE_IMPORTS_START _scheduler_async,_scan,_observable_defer,_map PURE_IMPORTS_END */ - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "partition", function() { return partition; }); +/* harmony import */ var _util_not__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(263); +/* harmony import */ var _filter__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(264); +/** PURE_IMPORTS_START _util_not,_filter PURE_IMPORTS_END */ -function timeInterval(scheduler) { - if (scheduler === void 0) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_0__["async"]; - } +function partition(predicate, thisArg) { return function (source) { - return Object(_observable_defer__WEBPACK_IMPORTED_MODULE_2__["defer"])(function () { - return source.pipe(Object(_scan__WEBPACK_IMPORTED_MODULE_1__["scan"])(function (_a, value) { - var current = _a.current; - return ({ value: value, current: scheduler.now(), last: current }); - }, { current: scheduler.now(), value: undefined, last: undefined }), Object(_map__WEBPACK_IMPORTED_MODULE_3__["map"])(function (_a) { - var current = _a.current, last = _a.last, value = _a.value; - return new TimeInterval(value, current - last); - })); - }); + return [ + Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(predicate, thisArg)(source), + Object(_filter__WEBPACK_IMPORTED_MODULE_1__["filter"])(Object(_util_not__WEBPACK_IMPORTED_MODULE_0__["not"])(predicate, thisArg))(source) + ]; }; } -var TimeInterval = /*@__PURE__*/ (function () { - function TimeInterval(value, interval) { - this.value = value; - this.interval = interval; - } - return TimeInterval; -}()); - -//# sourceMappingURL=timeInterval.js.map +//# sourceMappingURL=partition.js.map /***/ }), -/* 333 */ +/* 324 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defer", function() { return defer; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(193); -/* harmony import */ var _from__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(218); -/* harmony import */ var _empty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(242); -/** PURE_IMPORTS_START _Observable,_from,_empty PURE_IMPORTS_END */ - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pluck", function() { return pluck; }); +/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(226); +/** PURE_IMPORTS_START _map PURE_IMPORTS_END */ -function defer(observableFactory) { - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var input; - try { - input = observableFactory(); - } - catch (err) { - subscriber.error(err); - return undefined; +function pluck() { + var properties = []; + for (var _i = 0; _i < arguments.length; _i++) { + properties[_i] = arguments[_i]; + } + var length = properties.length; + if (length === 0) { + throw new Error('list of properties cannot be empty.'); + } + return function (source) { return Object(_map__WEBPACK_IMPORTED_MODULE_0__["map"])(plucker(properties, length))(source); }; +} +function plucker(props, length) { + var mapper = function (x) { + var currentProp = x; + for (var i = 0; i < length; i++) { + var p = currentProp[props[i]]; + if (typeof p !== 'undefined') { + currentProp = p; + } + else { + return undefined; + } } - var source = input ? Object(_from__WEBPACK_IMPORTED_MODULE_1__["from"])(input) : Object(_empty__WEBPACK_IMPORTED_MODULE_2__["empty"])(); - return source.subscribe(subscriber); - }); + return currentProp; + }; + return mapper; } -//# sourceMappingURL=defer.js.map +//# sourceMappingURL=pluck.js.map /***/ }), -/* 334 */ +/* 325 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __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__(199); -/* harmony import */ var _util_TimeoutError__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(335); -/* harmony import */ var _timeoutWith__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(336); -/* harmony import */ var _observable_throwError__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(243); -/** PURE_IMPORTS_START _scheduler_async,_util_TimeoutError,_timeoutWith,_observable_throwError PURE_IMPORTS_END */ - - +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "publish", function() { return publish; }); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(187); +/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(320); +/** PURE_IMPORTS_START _Subject,_multicast PURE_IMPORTS_END */ -function timeout(due, scheduler) { - if (scheduler === void 0) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_0__["async"]; - } - return Object(_timeoutWith__WEBPACK_IMPORTED_MODULE_2__["timeoutWith"])(due, Object(_observable_throwError__WEBPACK_IMPORTED_MODULE_3__["throwError"])(new _util_TimeoutError__WEBPACK_IMPORTED_MODULE_1__["TimeoutError"]()), scheduler); +function publish(selector) { + return selector ? + Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(function () { return new _Subject__WEBPACK_IMPORTED_MODULE_0__["Subject"](); }, selector) : + Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(new _Subject__WEBPACK_IMPORTED_MODULE_0__["Subject"]()); } -//# sourceMappingURL=timeout.js.map +//# sourceMappingURL=publish.js.map /***/ }), -/* 335 */ +/* 326 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "TimeoutError", function() { return TimeoutError; }); -/** PURE_IMPORTS_START PURE_IMPORTS_END */ -var TimeoutErrorImpl = /*@__PURE__*/ (function () { - function TimeoutErrorImpl() { - Error.call(this); - this.message = 'Timeout has occurred'; - this.name = 'TimeoutError'; - return this; - } - TimeoutErrorImpl.prototype = /*@__PURE__*/ Object.create(Error.prototype); - return TimeoutErrorImpl; -})(); -var TimeoutError = TimeoutErrorImpl; -//# sourceMappingURL=TimeoutError.js.map +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "publishBehavior", function() { return publishBehavior; }); +/* harmony import */ var _BehaviorSubject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(192); +/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(320); +/** PURE_IMPORTS_START _BehaviorSubject,_multicast PURE_IMPORTS_END */ + + +function publishBehavior(value) { + return function (source) { return Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(new _BehaviorSubject__WEBPACK_IMPORTED_MODULE_0__["BehaviorSubject"](value))(source); }; +} +//# sourceMappingURL=publishBehavior.js.map /***/ }), -/* 336 */ +/* 327 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __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__(36); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(199); -/* harmony import */ var _util_isDate__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(240); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(171); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(182); -/** PURE_IMPORTS_START tslib,_scheduler_async,_util_isDate,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "publishLast", function() { return publishLast; }); +/* harmony import */ var _AsyncSubject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(210); +/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(320); +/** PURE_IMPORTS_START _AsyncSubject,_multicast PURE_IMPORTS_END */ +function publishLast() { + return function (source) { return Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(new _AsyncSubject__WEBPACK_IMPORTED_MODULE_0__["AsyncSubject"]())(source); }; +} +//# sourceMappingURL=publishLast.js.map +/***/ }), +/* 328 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -function timeoutWith(due, withObservable, scheduler) { - if (scheduler === void 0) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; +"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__(193); +/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(320); +/** PURE_IMPORTS_START _ReplaySubject,_multicast PURE_IMPORTS_END */ + + +function publishReplay(bufferSize, windowTime, selectorOrScheduler, scheduler) { + if (selectorOrScheduler && typeof selectorOrScheduler !== 'function') { + scheduler = selectorOrScheduler; } - return function (source) { - var absoluteTimeout = Object(_util_isDate__WEBPACK_IMPORTED_MODULE_2__["isDate"])(due); - var waitFor = absoluteTimeout ? (+due - scheduler.now()) : Math.abs(due); - return source.lift(new TimeoutWithOperator(waitFor, absoluteTimeout, withObservable, scheduler)); - }; + var selector = typeof selectorOrScheduler === 'function' ? selectorOrScheduler : undefined; + var subject = new _ReplaySubject__WEBPACK_IMPORTED_MODULE_0__["ReplaySubject"](bufferSize, windowTime, scheduler); + return function (source) { return Object(_multicast__WEBPACK_IMPORTED_MODULE_1__["multicast"])(function () { return subject; }, selector)(source); }; } -var TimeoutWithOperator = /*@__PURE__*/ (function () { - function TimeoutWithOperator(waitFor, absoluteTimeout, withObservable, scheduler) { - this.waitFor = waitFor; - this.absoluteTimeout = absoluteTimeout; - this.withObservable = withObservable; - this.scheduler = scheduler; - } - TimeoutWithOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new TimeoutWithSubscriber(subscriber, this.absoluteTimeout, this.waitFor, this.withObservable, this.scheduler)); - }; - return TimeoutWithOperator; -}()); -var TimeoutWithSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TimeoutWithSubscriber, _super); - function TimeoutWithSubscriber(destination, absoluteTimeout, waitFor, withObservable, scheduler) { - var _this = _super.call(this, destination) || this; - _this.absoluteTimeout = absoluteTimeout; - _this.waitFor = waitFor; - _this.withObservable = withObservable; - _this.scheduler = scheduler; - _this.action = null; - _this.scheduleTimeout(); - return _this; - } - TimeoutWithSubscriber.dispatchTimeout = function (subscriber) { - var withObservable = subscriber.withObservable; - subscriber._unsubscribeAndRecycle(); - subscriber.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["subscribeToResult"])(subscriber, withObservable)); - }; - TimeoutWithSubscriber.prototype.scheduleTimeout = function () { - var action = this.action; - if (action) { - this.action = action.schedule(this, this.waitFor); - } - else { - this.add(this.action = this.scheduler.schedule(TimeoutWithSubscriber.dispatchTimeout, this.waitFor, this)); - } - }; - TimeoutWithSubscriber.prototype._next = function (value) { - if (!this.absoluteTimeout) { - this.scheduleTimeout(); - } - _super.prototype._next.call(this, value); - }; - TimeoutWithSubscriber.prototype._unsubscribe = function () { - this.action = null; - this.scheduler = null; - this.withObservable = null; - }; - return TimeoutWithSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); -//# sourceMappingURL=timeoutWith.js.map +//# sourceMappingURL=publishReplay.js.map /***/ }), -/* 337 */ +/* 329 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timestamp", function() { return timestamp; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Timestamp", function() { return Timestamp; }); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(199); -/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(231); -/** PURE_IMPORTS_START _scheduler_async,_map PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "race", function() { return race; }); +/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(178); +/* harmony import */ var _observable_race__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(265); +/** PURE_IMPORTS_START _util_isArray,_observable_race PURE_IMPORTS_END */ -function timestamp(scheduler) { - if (scheduler === void 0) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_0__["async"]; +function race() { + var observables = []; + for (var _i = 0; _i < arguments.length; _i++) { + observables[_i] = arguments[_i]; } - return Object(_map__WEBPACK_IMPORTED_MODULE_1__["map"])(function (value) { return new Timestamp(value, scheduler.now()); }); + return function raceOperatorFunction(source) { + if (observables.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_0__["isArray"])(observables[0])) { + observables = observables[0]; + } + return source.lift.call(_observable_race__WEBPACK_IMPORTED_MODULE_1__["race"].apply(void 0, [source].concat(observables))); + }; } -var Timestamp = /*@__PURE__*/ (function () { - function Timestamp(value, timestamp) { - this.value = value; - this.timestamp = timestamp; - } - return Timestamp; -}()); - -//# sourceMappingURL=timestamp.js.map +//# sourceMappingURL=race.js.map /***/ }), -/* 338 */ +/* 330 */ /***/ (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__(275); -/** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "repeat", function() { return repeat; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); +/* harmony import */ var _observable_empty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(203); +/** PURE_IMPORTS_START tslib,_Subscriber,_observable_empty PURE_IMPORTS_END */ -function toArrayReducer(arr, item, index) { - if (index === 0) { - return [item]; + + +function repeat(count) { + if (count === void 0) { + count = -1; } - arr.push(item); - return arr; -} -function toArray() { - return Object(_reduce__WEBPACK_IMPORTED_MODULE_0__["reduce"])(toArrayReducer, []); + return function (source) { + if (count === 0) { + return Object(_observable_empty__WEBPACK_IMPORTED_MODULE_2__["empty"])(); + } + else if (count < 0) { + return source.lift(new RepeatOperator(-1, source)); + } + else { + return source.lift(new RepeatOperator(count - 1, source)); + } + }; } -//# sourceMappingURL=toArray.js.map +var RepeatOperator = /*@__PURE__*/ (function () { + function RepeatOperator(count, source) { + this.count = count; + this.source = source; + } + RepeatOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new RepeatSubscriber(subscriber, this.count, this.source)); + }; + return RepeatOperator; +}()); +var RepeatSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RepeatSubscriber, _super); + function RepeatSubscriber(destination, count, source) { + var _this = _super.call(this, destination) || this; + _this.count = count; + _this.source = source; + return _this; + } + RepeatSubscriber.prototype.complete = function () { + if (!this.isStopped) { + var _a = this, source = _a.source, count = _a.count; + if (count === 0) { + return _super.prototype.complete.call(this); + } + else if (count > -1) { + this.count = count - 1; + } + source.subscribe(this._unsubscribeAndRecycle()); + } + }; + return RepeatSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=repeat.js.map /***/ }), -/* 339 */ +/* 331 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "window", function() { return window; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "repeatWhen", function() { return repeatWhen; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(265); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(171); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(182); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(187); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(229); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(230); /** PURE_IMPORTS_START tslib,_Subject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function window(windowBoundaries) { - return function windowOperatorFunction(source) { - return source.lift(new WindowOperator(windowBoundaries)); - }; +function repeatWhen(notifier) { + return function (source) { return source.lift(new RepeatWhenOperator(notifier)); }; } -var WindowOperator = /*@__PURE__*/ (function () { - function WindowOperator(windowBoundaries) { - this.windowBoundaries = windowBoundaries; +var RepeatWhenOperator = /*@__PURE__*/ (function () { + function RepeatWhenOperator(notifier) { + this.notifier = notifier; } - WindowOperator.prototype.call = function (subscriber, source) { - var windowSubscriber = new WindowSubscriber(subscriber); - var sourceSubscription = source.subscribe(windowSubscriber); - if (!sourceSubscription.closed) { - windowSubscriber.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(windowSubscriber, this.windowBoundaries)); - } - return sourceSubscription; + RepeatWhenOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new RepeatWhenSubscriber(subscriber, this.notifier, source)); }; - return WindowOperator; + return RepeatWhenOperator; }()); -var WindowSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WindowSubscriber, _super); - function WindowSubscriber(destination) { +var RepeatWhenSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RepeatWhenSubscriber, _super); + function RepeatWhenSubscriber(destination, notifier, source) { var _this = _super.call(this, destination) || this; - _this.window = new _Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"](); - destination.next(_this.window); + _this.notifier = notifier; + _this.source = source; + _this.sourceIsBeingSubscribedTo = true; return _this; } - WindowSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.openWindow(); - }; - WindowSubscriber.prototype.notifyError = function (error, innerSub) { - this._error(error); - }; - WindowSubscriber.prototype.notifyComplete = function (innerSub) { - this._complete(); + RepeatWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.sourceIsBeingSubscribedTo = true; + this.source.subscribe(this); }; - WindowSubscriber.prototype._next = function (value) { - this.window.next(value); + RepeatWhenSubscriber.prototype.notifyComplete = function (innerSub) { + if (this.sourceIsBeingSubscribedTo === false) { + return _super.prototype.complete.call(this); + } }; - WindowSubscriber.prototype._error = function (err) { - this.window.error(err); - this.destination.error(err); + RepeatWhenSubscriber.prototype.complete = function () { + this.sourceIsBeingSubscribedTo = false; + if (!this.isStopped) { + if (!this.retries) { + this.subscribeToRetries(); + } + if (!this.retriesSubscription || this.retriesSubscription.closed) { + return _super.prototype.complete.call(this); + } + this._unsubscribeAndRecycle(); + this.notifications.next(); + } }; - WindowSubscriber.prototype._complete = function () { - this.window.complete(); - this.destination.complete(); + RepeatWhenSubscriber.prototype._unsubscribe = function () { + var _a = this, notifications = _a.notifications, retriesSubscription = _a.retriesSubscription; + if (notifications) { + notifications.unsubscribe(); + this.notifications = null; + } + if (retriesSubscription) { + retriesSubscription.unsubscribe(); + this.retriesSubscription = null; + } + this.retries = null; }; - WindowSubscriber.prototype._unsubscribe = function () { - this.window = null; + RepeatWhenSubscriber.prototype._unsubscribeAndRecycle = function () { + var _unsubscribe = this._unsubscribe; + this._unsubscribe = null; + _super.prototype._unsubscribeAndRecycle.call(this); + this._unsubscribe = _unsubscribe; + return this; }; - WindowSubscriber.prototype.openWindow = function () { - var prevWindow = this.window; - if (prevWindow) { - prevWindow.complete(); + RepeatWhenSubscriber.prototype.subscribeToRetries = function () { + this.notifications = new _Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"](); + var retries; + try { + var notifier = this.notifier; + retries = notifier(this.notifications); } - var destination = this.destination; - var newWindow = this.window = new _Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"](); - destination.next(newWindow); + catch (e) { + return _super.prototype.complete.call(this); + } + this.retries = retries; + this.retriesSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, retries); }; - return WindowSubscriber; + return RepeatWhenSubscriber; }(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); -//# sourceMappingURL=window.js.map +//# sourceMappingURL=repeatWhen.js.map /***/ }), -/* 340 */ +/* 332 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "windowCount", function() { return windowCount; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "retry", function() { return retry; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); /* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(265); -/** PURE_IMPORTS_START tslib,_Subscriber,_Subject PURE_IMPORTS_END */ - +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function windowCount(windowSize, startWindowEvery) { - if (startWindowEvery === void 0) { - startWindowEvery = 0; +function retry(count) { + if (count === void 0) { + count = -1; } - return function windowCountOperatorFunction(source) { - return source.lift(new WindowCountOperator(windowSize, startWindowEvery)); - }; + return function (source) { return source.lift(new RetryOperator(count, source)); }; } -var WindowCountOperator = /*@__PURE__*/ (function () { - function WindowCountOperator(windowSize, startWindowEvery) { - this.windowSize = windowSize; - this.startWindowEvery = startWindowEvery; +var RetryOperator = /*@__PURE__*/ (function () { + function RetryOperator(count, source) { + this.count = count; + this.source = source; } - WindowCountOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new WindowCountSubscriber(subscriber, this.windowSize, this.startWindowEvery)); + RetryOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new RetrySubscriber(subscriber, this.count, this.source)); }; - return WindowCountOperator; + return RetryOperator; }()); -var WindowCountSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WindowCountSubscriber, _super); - function WindowCountSubscriber(destination, windowSize, startWindowEvery) { +var RetrySubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RetrySubscriber, _super); + function RetrySubscriber(destination, count, source) { var _this = _super.call(this, destination) || this; - _this.destination = destination; - _this.windowSize = windowSize; - _this.startWindowEvery = startWindowEvery; - _this.windows = [new _Subject__WEBPACK_IMPORTED_MODULE_2__["Subject"]()]; - _this.count = 0; - destination.next(_this.windows[0]); + _this.count = count; + _this.source = source; return _this; } - WindowCountSubscriber.prototype._next = function (value) { - var startWindowEvery = (this.startWindowEvery > 0) ? this.startWindowEvery : this.windowSize; - var destination = this.destination; - var windowSize = this.windowSize; - var windows = this.windows; - var len = windows.length; - for (var i = 0; i < len && !this.closed; i++) { - windows[i].next(value); - } - var c = this.count - windowSize + 1; - if (c >= 0 && c % startWindowEvery === 0 && !this.closed) { - windows.shift().complete(); - } - if (++this.count % startWindowEvery === 0 && !this.closed) { - var window_1 = new _Subject__WEBPACK_IMPORTED_MODULE_2__["Subject"](); - windows.push(window_1); - destination.next(window_1); - } - }; - WindowCountSubscriber.prototype._error = function (err) { - var windows = this.windows; - if (windows) { - while (windows.length > 0 && !this.closed) { - windows.shift().error(err); + RetrySubscriber.prototype.error = function (err) { + if (!this.isStopped) { + var _a = this, source = _a.source, count = _a.count; + if (count === 0) { + return _super.prototype.error.call(this, err); } - } - this.destination.error(err); - }; - WindowCountSubscriber.prototype._complete = function () { - var windows = this.windows; - if (windows) { - while (windows.length > 0 && !this.closed) { - windows.shift().complete(); + else if (count > -1) { + this.count = count - 1; } + source.subscribe(this._unsubscribeAndRecycle()); } - this.destination.complete(); - }; - WindowCountSubscriber.prototype._unsubscribe = function () { - this.count = 0; - this.windows = null; }; - return WindowCountSubscriber; + return RetrySubscriber; }(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); -//# sourceMappingURL=windowCount.js.map +//# sourceMappingURL=retry.js.map /***/ }), -/* 341 */ +/* 333 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "windowTime", function() { return windowTime; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "retryWhen", function() { return retryWhen; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(265); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(199); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(172); -/* harmony import */ var _util_isNumeric__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(205); -/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(206); -/** PURE_IMPORTS_START tslib,_Subject,_scheduler_async,_Subscriber,_util_isNumeric,_util_isScheduler PURE_IMPORTS_END */ - - +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(187); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(229); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(230); +/** PURE_IMPORTS_START tslib,_Subject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function windowTime(windowTimeSpan) { - var scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_2__["async"]; - var windowCreationInterval = null; - var maxWindowSize = Number.POSITIVE_INFINITY; - if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_5__["isScheduler"])(arguments[3])) { - scheduler = arguments[3]; - } - if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_5__["isScheduler"])(arguments[2])) { - scheduler = arguments[2]; - } - else if (Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_4__["isNumeric"])(arguments[2])) { - maxWindowSize = arguments[2]; - } - if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_5__["isScheduler"])(arguments[1])) { - scheduler = arguments[1]; - } - else if (Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_4__["isNumeric"])(arguments[1])) { - windowCreationInterval = arguments[1]; - } - return function windowTimeOperatorFunction(source) { - return source.lift(new WindowTimeOperator(windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler)); - }; +function retryWhen(notifier) { + return function (source) { return source.lift(new RetryWhenOperator(notifier, source)); }; } -var WindowTimeOperator = /*@__PURE__*/ (function () { - function WindowTimeOperator(windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler) { - this.windowTimeSpan = windowTimeSpan; - this.windowCreationInterval = windowCreationInterval; - this.maxWindowSize = maxWindowSize; - this.scheduler = scheduler; +var RetryWhenOperator = /*@__PURE__*/ (function () { + function RetryWhenOperator(notifier, source) { + this.notifier = notifier; + this.source = source; } - WindowTimeOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new WindowTimeSubscriber(subscriber, this.windowTimeSpan, this.windowCreationInterval, this.maxWindowSize, this.scheduler)); + RetryWhenOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new RetryWhenSubscriber(subscriber, this.notifier, this.source)); }; - return WindowTimeOperator; + return RetryWhenOperator; }()); -var CountedSubject = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](CountedSubject, _super); - function CountedSubject() { - var _this = _super !== null && _super.apply(this, arguments) || this; - _this._numberOfNextedValues = 0; - return _this; - } - CountedSubject.prototype.next = function (value) { - this._numberOfNextedValues++; - _super.prototype.next.call(this, value); - }; - Object.defineProperty(CountedSubject.prototype, "numberOfNextedValues", { - get: function () { - return this._numberOfNextedValues; - }, - enumerable: true, - configurable: true - }); - return CountedSubject; -}(_Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"])); -var WindowTimeSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WindowTimeSubscriber, _super); - function WindowTimeSubscriber(destination, windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler) { +var RetryWhenSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](RetryWhenSubscriber, _super); + function RetryWhenSubscriber(destination, notifier, source) { var _this = _super.call(this, destination) || this; - _this.destination = destination; - _this.windowTimeSpan = windowTimeSpan; - _this.windowCreationInterval = windowCreationInterval; - _this.maxWindowSize = maxWindowSize; - _this.scheduler = scheduler; - _this.windows = []; - var window = _this.openWindow(); - if (windowCreationInterval !== null && windowCreationInterval >= 0) { - var closeState = { subscriber: _this, window: window, context: null }; - var creationState = { windowTimeSpan: windowTimeSpan, windowCreationInterval: windowCreationInterval, subscriber: _this, scheduler: scheduler }; - _this.add(scheduler.schedule(dispatchWindowClose, windowTimeSpan, closeState)); - _this.add(scheduler.schedule(dispatchWindowCreation, windowCreationInterval, creationState)); - } - else { - var timeSpanOnlyState = { subscriber: _this, window: window, windowTimeSpan: windowTimeSpan }; - _this.add(scheduler.schedule(dispatchWindowTimeSpanOnly, windowTimeSpan, timeSpanOnlyState)); - } + _this.notifier = notifier; + _this.source = source; return _this; } - WindowTimeSubscriber.prototype._next = function (value) { - var windows = this.windows; - var len = windows.length; - for (var i = 0; i < len; i++) { - var window_1 = windows[i]; - if (!window_1.closed) { - window_1.next(value); - if (window_1.numberOfNextedValues >= this.maxWindowSize) { - this.closeWindow(window_1); + RetryWhenSubscriber.prototype.error = function (err) { + if (!this.isStopped) { + var errors = this.errors; + var retries = this.retries; + var retriesSubscription = this.retriesSubscription; + if (!retries) { + errors = new _Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"](); + try { + var notifier = this.notifier; + retries = notifier(errors); + } + catch (e) { + return _super.prototype.error.call(this, e); } + retriesSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, retries); } - } - }; - WindowTimeSubscriber.prototype._error = function (err) { - var windows = this.windows; - while (windows.length > 0) { - windows.shift().error(err); - } - this.destination.error(err); - }; - WindowTimeSubscriber.prototype._complete = function () { - var windows = this.windows; - while (windows.length > 0) { - var window_2 = windows.shift(); - if (!window_2.closed) { - window_2.complete(); + else { + this.errors = null; + this.retriesSubscription = null; } + this._unsubscribeAndRecycle(); + this.errors = errors; + this.retries = retries; + this.retriesSubscription = retriesSubscription; + errors.next(err); } - this.destination.complete(); }; - WindowTimeSubscriber.prototype.openWindow = function () { - var window = new CountedSubject(); - this.windows.push(window); - var destination = this.destination; - destination.next(window); - return window; + RetryWhenSubscriber.prototype._unsubscribe = function () { + var _a = this, errors = _a.errors, retriesSubscription = _a.retriesSubscription; + if (errors) { + errors.unsubscribe(); + this.errors = null; + } + if (retriesSubscription) { + retriesSubscription.unsubscribe(); + this.retriesSubscription = null; + } + this.retries = null; }; - WindowTimeSubscriber.prototype.closeWindow = function (window) { - window.complete(); - var windows = this.windows; - windows.splice(windows.indexOf(window), 1); + RetryWhenSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + var _unsubscribe = this._unsubscribe; + this._unsubscribe = null; + this._unsubscribeAndRecycle(); + this._unsubscribe = _unsubscribe; + this.source.subscribe(this); }; - return WindowTimeSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_3__["Subscriber"])); -function dispatchWindowTimeSpanOnly(state) { - var subscriber = state.subscriber, windowTimeSpan = state.windowTimeSpan, window = state.window; - if (window) { - subscriber.closeWindow(window); - } - state.window = subscriber.openWindow(); - this.schedule(state, windowTimeSpan); -} -function dispatchWindowCreation(state) { - var windowTimeSpan = state.windowTimeSpan, subscriber = state.subscriber, scheduler = state.scheduler, windowCreationInterval = state.windowCreationInterval; - var window = subscriber.openWindow(); - var action = this; - var context = { action: action, subscription: null }; - var timeSpanState = { subscriber: subscriber, window: window, context: context }; - context.subscription = scheduler.schedule(dispatchWindowClose, windowTimeSpan, timeSpanState); - action.add(context.subscription); - action.schedule(state, windowCreationInterval); -} -function dispatchWindowClose(state) { - var subscriber = state.subscriber, window = state.window, context = state.context; - if (context && context.action && context.subscription) { - context.action.remove(context.subscription); - } - subscriber.closeWindow(window); -} -//# sourceMappingURL=windowTime.js.map + return RetryWhenSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); +//# sourceMappingURL=retryWhen.js.map /***/ }), -/* 342 */ +/* 334 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "windowToggle", function() { return windowToggle; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sample", function() { return sample; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(265); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(177); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(171); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(182); -/** PURE_IMPORTS_START tslib,_Subject,_Subscription,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - - +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(230); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -function windowToggle(openings, closingSelector) { - return function (source) { return source.lift(new WindowToggleOperator(openings, closingSelector)); }; +function sample(notifier) { + return function (source) { return source.lift(new SampleOperator(notifier)); }; } -var WindowToggleOperator = /*@__PURE__*/ (function () { - function WindowToggleOperator(openings, closingSelector) { - this.openings = openings; - this.closingSelector = closingSelector; +var SampleOperator = /*@__PURE__*/ (function () { + function SampleOperator(notifier) { + this.notifier = notifier; } - WindowToggleOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new WindowToggleSubscriber(subscriber, this.openings, this.closingSelector)); + SampleOperator.prototype.call = function (subscriber, source) { + var sampleSubscriber = new SampleSubscriber(subscriber); + var subscription = source.subscribe(sampleSubscriber); + subscription.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(sampleSubscriber, this.notifier)); + return subscription; }; - return WindowToggleOperator; + return SampleOperator; }()); -var WindowToggleSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WindowToggleSubscriber, _super); - function WindowToggleSubscriber(destination, openings, closingSelector) { - var _this = _super.call(this, destination) || this; - _this.openings = openings; - _this.closingSelector = closingSelector; - _this.contexts = []; - _this.add(_this.openSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["subscribeToResult"])(_this, openings, openings)); +var SampleSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SampleSubscriber, _super); + function SampleSubscriber() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this.hasValue = false; return _this; } - WindowToggleSubscriber.prototype._next = function (value) { - var contexts = this.contexts; - if (contexts) { - var len = contexts.length; - for (var i = 0; i < len; i++) { - contexts[i].window.next(value); - } - } - }; - WindowToggleSubscriber.prototype._error = function (err) { - var contexts = this.contexts; - this.contexts = null; - if (contexts) { - var len = contexts.length; - var index = -1; - while (++index < len) { - var context_1 = contexts[index]; - context_1.window.error(err); - context_1.subscription.unsubscribe(); - } - } - _super.prototype._error.call(this, err); - }; - WindowToggleSubscriber.prototype._complete = function () { - var contexts = this.contexts; - this.contexts = null; - if (contexts) { - var len = contexts.length; - var index = -1; - while (++index < len) { - var context_2 = contexts[index]; - context_2.window.complete(); - context_2.subscription.unsubscribe(); - } - } - _super.prototype._complete.call(this); - }; - WindowToggleSubscriber.prototype._unsubscribe = function () { - var contexts = this.contexts; - this.contexts = null; - if (contexts) { - var len = contexts.length; - var index = -1; - while (++index < len) { - var context_3 = contexts[index]; - context_3.window.unsubscribe(); - context_3.subscription.unsubscribe(); - } - } - }; - WindowToggleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - if (outerValue === this.openings) { - var closingNotifier = void 0; - try { - var closingSelector = this.closingSelector; - closingNotifier = closingSelector(innerValue); - } - catch (e) { - return this.error(e); - } - var window_1 = new _Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"](); - var subscription = new _Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"](); - var context_4 = { window: window_1, subscription: subscription }; - this.contexts.push(context_4); - var innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["subscribeToResult"])(this, closingNotifier, context_4); - if (innerSubscription.closed) { - this.closeWindow(this.contexts.length - 1); - } - else { - innerSubscription.context = context_4; - subscription.add(innerSubscription); - } - this.destination.next(window_1); - } - else { - this.closeWindow(this.contexts.indexOf(outerValue)); - } + SampleSubscriber.prototype._next = function (value) { + this.value = value; + this.hasValue = true; }; - WindowToggleSubscriber.prototype.notifyError = function (err) { - this.error(err); + SampleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.emitValue(); }; - WindowToggleSubscriber.prototype.notifyComplete = function (inner) { - if (inner !== this.openSubscription) { - this.closeWindow(this.contexts.indexOf(inner.context)); - } + SampleSubscriber.prototype.notifyComplete = function () { + this.emitValue(); }; - WindowToggleSubscriber.prototype.closeWindow = function (index) { - if (index === -1) { - return; + SampleSubscriber.prototype.emitValue = function () { + if (this.hasValue) { + this.hasValue = false; + this.destination.next(this.value); } - var contexts = this.contexts; - var context = contexts[index]; - var window = context.window, subscription = context.subscription; - contexts.splice(index, 1); - window.complete(); - subscription.unsubscribe(); }; - return WindowToggleSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); -//# sourceMappingURL=windowToggle.js.map + return SampleSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=sample.js.map /***/ }), -/* 343 */ +/* 335 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "windowWhen", function() { return windowWhen; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sampleTime", function() { return sampleTime; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(265); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(171); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(182); -/** PURE_IMPORTS_START tslib,_Subject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(215); +/** PURE_IMPORTS_START tslib,_Subscriber,_scheduler_async PURE_IMPORTS_END */ -function windowWhen(closingSelector) { - return function windowWhenOperatorFunction(source) { - return source.lift(new WindowOperator(closingSelector)); - }; +function sampleTime(period, scheduler) { + if (scheduler === void 0) { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_2__["async"]; + } + return function (source) { return source.lift(new SampleTimeOperator(period, scheduler)); }; } -var WindowOperator = /*@__PURE__*/ (function () { - function WindowOperator(closingSelector) { - this.closingSelector = closingSelector; +var SampleTimeOperator = /*@__PURE__*/ (function () { + function SampleTimeOperator(period, scheduler) { + this.period = period; + this.scheduler = scheduler; } - WindowOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new WindowSubscriber(subscriber, this.closingSelector)); + SampleTimeOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new SampleTimeSubscriber(subscriber, this.period, this.scheduler)); }; - return WindowOperator; + return SampleTimeOperator; }()); -var WindowSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WindowSubscriber, _super); - function WindowSubscriber(destination, closingSelector) { +var SampleTimeSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SampleTimeSubscriber, _super); + function SampleTimeSubscriber(destination, period, scheduler) { var _this = _super.call(this, destination) || this; - _this.destination = destination; - _this.closingSelector = closingSelector; - _this.openWindow(); + _this.period = period; + _this.scheduler = scheduler; + _this.hasValue = false; + _this.add(scheduler.schedule(dispatchNotification, period, { subscriber: _this, period: period })); return _this; } - WindowSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.openWindow(innerSub); - }; - WindowSubscriber.prototype.notifyError = function (error, innerSub) { - this._error(error); - }; - WindowSubscriber.prototype.notifyComplete = function (innerSub) { - this.openWindow(innerSub); - }; - WindowSubscriber.prototype._next = function (value) { - this.window.next(value); - }; - WindowSubscriber.prototype._error = function (err) { - this.window.error(err); - this.destination.error(err); - this.unsubscribeClosingNotification(); - }; - WindowSubscriber.prototype._complete = function () { - this.window.complete(); - this.destination.complete(); - this.unsubscribeClosingNotification(); - }; - WindowSubscriber.prototype.unsubscribeClosingNotification = function () { - if (this.closingNotification) { - this.closingNotification.unsubscribe(); - } + SampleTimeSubscriber.prototype._next = function (value) { + this.lastValue = value; + this.hasValue = true; }; - WindowSubscriber.prototype.openWindow = function (innerSub) { - if (innerSub === void 0) { - innerSub = null; - } - if (innerSub) { - this.remove(innerSub); - innerSub.unsubscribe(); - } - var prevWindow = this.window; - if (prevWindow) { - prevWindow.complete(); - } - var window = this.window = new _Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"](); - this.destination.next(window); - var closingNotifier; - try { - var closingSelector = this.closingSelector; - closingNotifier = closingSelector(); - } - catch (e) { - this.destination.error(e); - this.window.error(e); - return; + SampleTimeSubscriber.prototype.notifyNext = function () { + if (this.hasValue) { + this.hasValue = false; + this.destination.next(this.lastValue); } - this.add(this.closingNotification = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, closingNotifier)); }; - return WindowSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); -//# sourceMappingURL=windowWhen.js.map + return SampleTimeSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +function dispatchNotification(state) { + var subscriber = state.subscriber, period = state.period; + subscriber.notifyNext(); + this.schedule(state, period); +} +//# sourceMappingURL=sampleTime.js.map /***/ }), -/* 344 */ +/* 336 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "withLatestFrom", function() { return withLatestFrom; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "sequenceEqual", function() { return sequenceEqual; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SequenceEqualOperator", function() { return SequenceEqualOperator; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SequenceEqualSubscriber", function() { return SequenceEqualSubscriber; }); /* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(171); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(182); -/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ -function withLatestFrom() { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } - return function (source) { - var project; - if (typeof args[args.length - 1] === 'function') { - project = args.pop(); - } - var observables = args; - return source.lift(new WithLatestFromOperator(observables, project)); - }; +function sequenceEqual(compareTo, comparator) { + return function (source) { return source.lift(new SequenceEqualOperator(compareTo, comparator)); }; } -var WithLatestFromOperator = /*@__PURE__*/ (function () { - function WithLatestFromOperator(observables, project) { - this.observables = observables; - this.project = project; +var SequenceEqualOperator = /*@__PURE__*/ (function () { + function SequenceEqualOperator(compareTo, comparator) { + this.compareTo = compareTo; + this.comparator = comparator; } - WithLatestFromOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new WithLatestFromSubscriber(subscriber, this.observables, this.project)); + SequenceEqualOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new SequenceEqualSubscriber(subscriber, this.compareTo, this.comparator)); }; - return WithLatestFromOperator; + return SequenceEqualOperator; }()); -var WithLatestFromSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WithLatestFromSubscriber, _super); - function WithLatestFromSubscriber(destination, observables, project) { + +var SequenceEqualSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SequenceEqualSubscriber, _super); + function SequenceEqualSubscriber(destination, compareTo, comparator) { var _this = _super.call(this, destination) || this; - _this.observables = observables; - _this.project = project; - _this.toRespond = []; - var len = observables.length; - _this.values = new Array(len); - for (var i = 0; i < len; i++) { - _this.toRespond.push(i); - } - for (var i = 0; i < len; i++) { - var observable = observables[i]; - _this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(_this, observable, observable, i)); - } + _this.compareTo = compareTo; + _this.comparator = comparator; + _this._a = []; + _this._b = []; + _this._oneComplete = false; + _this.destination.add(compareTo.subscribe(new SequenceEqualCompareToSubscriber(destination, _this))); return _this; } - WithLatestFromSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.values[outerIndex] = innerValue; - var toRespond = this.toRespond; - if (toRespond.length > 0) { - var found = toRespond.indexOf(outerIndex); - if (found !== -1) { - toRespond.splice(found, 1); - } + SequenceEqualSubscriber.prototype._next = function (value) { + if (this._oneComplete && this._b.length === 0) { + this.emit(false); + } + else { + this._a.push(value); + this.checkValues(); } }; - WithLatestFromSubscriber.prototype.notifyComplete = function () { + SequenceEqualSubscriber.prototype._complete = function () { + if (this._oneComplete) { + this.emit(this._a.length === 0 && this._b.length === 0); + } + else { + this._oneComplete = true; + } + this.unsubscribe(); }; - WithLatestFromSubscriber.prototype._next = function (value) { - if (this.toRespond.length === 0) { - var args = [value].concat(this.values); - if (this.project) { - this._tryProject(args); + SequenceEqualSubscriber.prototype.checkValues = function () { + var _c = this, _a = _c._a, _b = _c._b, comparator = _c.comparator; + while (_a.length > 0 && _b.length > 0) { + var a = _a.shift(); + var b = _b.shift(); + var areEqual = false; + try { + areEqual = comparator ? comparator(a, b) : a === b; } - else { - this.destination.next(args); + catch (e) { + this.destination.error(e); + } + if (!areEqual) { + this.emit(false); } } }; - WithLatestFromSubscriber.prototype._tryProject = function (args) { - var result; - try { - result = this.project.apply(this, args); + SequenceEqualSubscriber.prototype.emit = function (value) { + var destination = this.destination; + destination.next(value); + destination.complete(); + }; + SequenceEqualSubscriber.prototype.nextB = function (value) { + if (this._oneComplete && this._a.length === 0) { + this.emit(false); } - catch (err) { - this.destination.error(err); - return; + else { + this._b.push(value); + this.checkValues(); } - this.destination.next(result); }; - return WithLatestFromSubscriber; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); -//# sourceMappingURL=withLatestFrom.js.map + SequenceEqualSubscriber.prototype.completeB = function () { + if (this._oneComplete) { + this.emit(this._a.length === 0 && this._b.length === 0); + } + else { + this._oneComplete = true; + } + }; + return SequenceEqualSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); + +var SequenceEqualCompareToSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SequenceEqualCompareToSubscriber, _super); + function SequenceEqualCompareToSubscriber(destination, parent) { + var _this = _super.call(this, destination) || this; + _this.parent = parent; + return _this; + } + SequenceEqualCompareToSubscriber.prototype._next = function (value) { + this.parent.nextB(value); + }; + SequenceEqualCompareToSubscriber.prototype._error = function (err) { + this.parent.error(err); + this.unsubscribe(); + }; + SequenceEqualCompareToSubscriber.prototype._complete = function () { + this.parent.completeB(); + this.unsubscribe(); + }; + return SequenceEqualCompareToSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=sequenceEqual.js.map /***/ }), -/* 345 */ +/* 337 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "zip", function() { return zip; }); -/* harmony import */ var _observable_zip__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(346); -/** PURE_IMPORTS_START _observable_zip PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "share", function() { return share; }); +/* harmony import */ var _multicast__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(320); +/* harmony import */ var _refCount__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(190); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(187); +/** PURE_IMPORTS_START _multicast,_refCount,_Subject PURE_IMPORTS_END */ -function zip() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i] = arguments[_i]; - } - return function zipOperatorFunction(source) { - return source.lift.call(_observable_zip__WEBPACK_IMPORTED_MODULE_0__["zip"].apply(void 0, [source].concat(observables))); - }; + + +function shareSubjectFactory() { + return new _Subject__WEBPACK_IMPORTED_MODULE_2__["Subject"](); } -//# sourceMappingURL=zip.js.map +function share() { + return function (source) { return Object(_refCount__WEBPACK_IMPORTED_MODULE_1__["refCount"])()(Object(_multicast__WEBPACK_IMPORTED_MODULE_0__["multicast"])(shareSubjectFactory)(source)); }; +} +//# sourceMappingURL=share.js.map /***/ }), -/* 346 */ +/* 338 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "zip", function() { return zip; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ZipOperator", function() { return ZipOperator; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "ZipSubscriber", function() { return ZipSubscriber; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _fromArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(215); -/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(178); -/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(172); -/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(171); -/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(182); -/* harmony import */ var _internal_symbol_iterator__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(188); -/** PURE_IMPORTS_START tslib,_fromArray,_util_isArray,_Subscriber,_OuterSubscriber,_util_subscribeToResult,_.._internal_symbol_iterator PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "shareReplay", function() { return shareReplay; }); +/* harmony import */ var _ReplaySubject__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(193); +/** PURE_IMPORTS_START _ReplaySubject PURE_IMPORTS_END */ +function shareReplay(configOrBufferSize, windowTime, scheduler) { + var config; + if (configOrBufferSize && typeof configOrBufferSize === 'object') { + config = configOrBufferSize; + } + else { + config = { + bufferSize: configOrBufferSize, + windowTime: windowTime, + refCount: false, + scheduler: scheduler + }; + } + return function (source) { return source.lift(shareReplayOperator(config)); }; +} +function shareReplayOperator(_a) { + var _b = _a.bufferSize, bufferSize = _b === void 0 ? Number.POSITIVE_INFINITY : _b, _c = _a.windowTime, windowTime = _c === void 0 ? Number.POSITIVE_INFINITY : _c, useRefCount = _a.refCount, scheduler = _a.scheduler; + var subject; + var refCount = 0; + var subscription; + var hasError = false; + var isComplete = false; + return function shareReplayOperation(source) { + refCount++; + if (!subject || hasError) { + hasError = false; + subject = new _ReplaySubject__WEBPACK_IMPORTED_MODULE_0__["ReplaySubject"](bufferSize, windowTime, scheduler); + subscription = source.subscribe({ + next: function (value) { subject.next(value); }, + error: function (err) { + hasError = true; + subject.error(err); + }, + complete: function () { + isComplete = true; + subject.complete(); + }, + }); + } + var innerSub = subject.subscribe(this); + this.add(function () { + refCount--; + innerSub.unsubscribe(); + if (subscription && !isComplete && useRefCount && refCount === 0) { + subscription.unsubscribe(); + subscription = undefined; + subject = undefined; + } + }); + }; +} +//# sourceMappingURL=shareReplay.js.map +/***/ }), +/* 339 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "single", function() { return single; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); +/* harmony import */ var _util_EmptyError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(223); +/** PURE_IMPORTS_START tslib,_Subscriber,_util_EmptyError PURE_IMPORTS_END */ -function zip() { - var observables = []; - for (var _i = 0; _i < arguments.length; _i++) { - observables[_i] = arguments[_i]; - } - var resultSelector = observables[observables.length - 1]; - if (typeof resultSelector === 'function') { - observables.pop(); - } - return Object(_fromArray__WEBPACK_IMPORTED_MODULE_1__["fromArray"])(observables, undefined).lift(new ZipOperator(resultSelector)); +function single(predicate) { + return function (source) { return source.lift(new SingleOperator(predicate, source)); }; } -var ZipOperator = /*@__PURE__*/ (function () { - function ZipOperator(resultSelector) { - this.resultSelector = resultSelector; +var SingleOperator = /*@__PURE__*/ (function () { + function SingleOperator(predicate, source) { + this.predicate = predicate; + this.source = source; } - ZipOperator.prototype.call = function (subscriber, source) { - return source.subscribe(new ZipSubscriber(subscriber, this.resultSelector)); + SingleOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new SingleSubscriber(subscriber, this.predicate, this.source)); }; - return ZipOperator; + return SingleOperator; }()); - -var ZipSubscriber = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ZipSubscriber, _super); - function ZipSubscriber(destination, resultSelector, values) { - if (values === void 0) { - values = Object.create(null); - } +var SingleSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SingleSubscriber, _super); + function SingleSubscriber(destination, predicate, source) { var _this = _super.call(this, destination) || this; - _this.iterators = []; - _this.active = 0; - _this.resultSelector = (typeof resultSelector === 'function') ? resultSelector : null; - _this.values = values; + _this.predicate = predicate; + _this.source = source; + _this.seenValue = false; + _this.index = 0; return _this; } - ZipSubscriber.prototype._next = function (value) { - var iterators = this.iterators; - if (Object(_util_isArray__WEBPACK_IMPORTED_MODULE_2__["isArray"])(value)) { - iterators.push(new StaticArrayIterator(value)); - } - else if (typeof value[_internal_symbol_iterator__WEBPACK_IMPORTED_MODULE_6__["iterator"]] === 'function') { - iterators.push(new StaticIterator(value[_internal_symbol_iterator__WEBPACK_IMPORTED_MODULE_6__["iterator"]]())); + SingleSubscriber.prototype.applySingleValue = function (value) { + if (this.seenValue) { + this.destination.error('Sequence contains more than one element'); } else { - iterators.push(new ZipBufferIterator(this.destination, this, value)); + this.seenValue = true; + this.singleValue = value; } }; - ZipSubscriber.prototype._complete = function () { - var iterators = this.iterators; - var len = iterators.length; - this.unsubscribe(); - if (len === 0) { - this.destination.complete(); - return; + SingleSubscriber.prototype._next = function (value) { + var index = this.index++; + if (this.predicate) { + this.tryNext(value, index); } - this.active = len; - for (var i = 0; i < len; i++) { - var iterator = iterators[i]; - if (iterator.stillUnsubscribed) { - var destination = this.destination; - destination.add(iterator.subscribe(iterator, i)); - } - else { - this.active--; - } + else { + this.applySingleValue(value); } }; - ZipSubscriber.prototype.notifyInactive = function () { - this.active--; - if (this.active === 0) { - this.destination.complete(); + SingleSubscriber.prototype.tryNext = function (value, index) { + try { + if (this.predicate(value, index, this.source)) { + this.applySingleValue(value); + } + } + catch (err) { + this.destination.error(err); } }; - ZipSubscriber.prototype.checkIterators = function () { - var iterators = this.iterators; - var len = iterators.length; + SingleSubscriber.prototype._complete = function () { var destination = this.destination; - for (var i = 0; i < len; i++) { - var iterator = iterators[i]; - if (typeof iterator.hasValue === 'function' && !iterator.hasValue()) { - return; - } + if (this.index > 0) { + destination.next(this.seenValue ? this.singleValue : undefined); + destination.complete(); } - var shouldComplete = false; - var args = []; - for (var i = 0; i < len; i++) { - var iterator = iterators[i]; - var result = iterator.next(); - if (iterator.hasCompleted()) { - shouldComplete = true; - } - if (result.done) { - destination.complete(); - return; - } - args.push(result.value); + else { + destination.error(new _util_EmptyError__WEBPACK_IMPORTED_MODULE_2__["EmptyError"]); } - if (this.resultSelector) { - this._tryresultSelector(args); + }; + return SingleSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=single.js.map + + +/***/ }), +/* 340 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "skip", function() { return skip; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ + + +function skip(count) { + return function (source) { return source.lift(new SkipOperator(count)); }; +} +var SkipOperator = /*@__PURE__*/ (function () { + function SkipOperator(total) { + this.total = total; + } + SkipOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new SkipSubscriber(subscriber, this.total)); + }; + return SkipOperator; +}()); +var SkipSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SkipSubscriber, _super); + function SkipSubscriber(destination, total) { + var _this = _super.call(this, destination) || this; + _this.total = total; + _this.count = 0; + return _this; + } + SkipSubscriber.prototype._next = function (x) { + if (++this.count > this.total) { + this.destination.next(x); } - else { - destination.next(args); + }; + return SkipSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=skip.js.map + + +/***/ }), +/* 341 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "skipLast", function() { return skipLast; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); +/* harmony import */ var _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(222); +/** PURE_IMPORTS_START tslib,_Subscriber,_util_ArgumentOutOfRangeError PURE_IMPORTS_END */ + + + +function skipLast(count) { + return function (source) { return source.lift(new SkipLastOperator(count)); }; +} +var SkipLastOperator = /*@__PURE__*/ (function () { + function SkipLastOperator(_skipCount) { + this._skipCount = _skipCount; + if (this._skipCount < 0) { + throw new _util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_2__["ArgumentOutOfRangeError"]; } - if (shouldComplete) { - destination.complete(); + } + SkipLastOperator.prototype.call = function (subscriber, source) { + if (this._skipCount === 0) { + return source.subscribe(new _Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"](subscriber)); + } + else { + return source.subscribe(new SkipLastSubscriber(subscriber, this._skipCount)); } }; - ZipSubscriber.prototype._tryresultSelector = function (args) { - var result; - try { - result = this.resultSelector.apply(this, args); + return SkipLastOperator; +}()); +var SkipLastSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SkipLastSubscriber, _super); + function SkipLastSubscriber(destination, _skipCount) { + var _this = _super.call(this, destination) || this; + _this._skipCount = _skipCount; + _this._count = 0; + _this._ring = new Array(_skipCount); + return _this; + } + SkipLastSubscriber.prototype._next = function (value) { + var skipCount = this._skipCount; + var count = this._count++; + if (count < skipCount) { + this._ring[count] = value; } - catch (err) { - this.destination.error(err); - return; + else { + var currentIndex = count % skipCount; + var ring = this._ring; + var oldValue = ring[currentIndex]; + ring[currentIndex] = value; + this.destination.next(oldValue); } - this.destination.next(result); }; - return ZipSubscriber; -}(_Subscriber__WEBPACK_IMPORTED_MODULE_3__["Subscriber"])); + return SkipLastSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=skipLast.js.map -var StaticIterator = /*@__PURE__*/ (function () { - function StaticIterator(iterator) { - this.iterator = iterator; - this.nextResult = iterator.next(); + +/***/ }), +/* 342 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "skipUntil", function() { return skipUntil; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); +/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(231); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(230); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ + + + + +function skipUntil(notifier) { + return function (source) { return source.lift(new SkipUntilOperator(notifier)); }; +} +var SkipUntilOperator = /*@__PURE__*/ (function () { + function SkipUntilOperator(notifier) { + this.notifier = notifier; } - StaticIterator.prototype.hasValue = function () { - return true; - }; - StaticIterator.prototype.next = function () { - var result = this.nextResult; - this.nextResult = this.iterator.next(); - return result; - }; - StaticIterator.prototype.hasCompleted = function () { - var nextResult = this.nextResult; - return nextResult && nextResult.done; + SkipUntilOperator.prototype.call = function (destination, source) { + return source.subscribe(new SkipUntilSubscriber(destination, this.notifier)); }; - return StaticIterator; + return SkipUntilOperator; }()); -var StaticArrayIterator = /*@__PURE__*/ (function () { - function StaticArrayIterator(array) { - this.array = array; - this.index = 0; - this.length = 0; - this.length = array.length; +var SkipUntilSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SkipUntilSubscriber, _super); + function SkipUntilSubscriber(destination, notifier) { + var _this = _super.call(this, destination) || this; + _this.hasValue = false; + var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__["InnerSubscriber"](_this, undefined, undefined); + _this.add(innerSubscriber); + _this.innerSubscription = innerSubscriber; + Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(_this, notifier, undefined, undefined, innerSubscriber); + return _this; } - StaticArrayIterator.prototype[_internal_symbol_iterator__WEBPACK_IMPORTED_MODULE_6__["iterator"]] = function () { - return this; + SkipUntilSubscriber.prototype._next = function (value) { + if (this.hasValue) { + _super.prototype._next.call(this, value); + } }; - StaticArrayIterator.prototype.next = function (value) { - var i = this.index++; - var array = this.array; - return i < this.length ? { value: array[i], done: false } : { value: null, done: true }; + SkipUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.hasValue = true; + if (this.innerSubscription) { + this.innerSubscription.unsubscribe(); + } }; - StaticArrayIterator.prototype.hasValue = function () { - return this.array.length > this.index; + SkipUntilSubscriber.prototype.notifyComplete = function () { }; - StaticArrayIterator.prototype.hasCompleted = function () { - return this.array.length === this.index; + return SkipUntilSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=skipUntil.js.map + + +/***/ }), +/* 343 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { + +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "skipWhile", function() { return skipWhile; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ + + +function skipWhile(predicate) { + return function (source) { return source.lift(new SkipWhileOperator(predicate)); }; +} +var SkipWhileOperator = /*@__PURE__*/ (function () { + function SkipWhileOperator(predicate) { + this.predicate = predicate; + } + SkipWhileOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new SkipWhileSubscriber(subscriber, this.predicate)); }; - return StaticArrayIterator; + return SkipWhileOperator; }()); -var ZipBufferIterator = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ZipBufferIterator, _super); - function ZipBufferIterator(destination, parent, observable) { +var SkipWhileSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SkipWhileSubscriber, _super); + function SkipWhileSubscriber(destination, predicate) { var _this = _super.call(this, destination) || this; - _this.parent = parent; - _this.observable = observable; - _this.stillUnsubscribed = true; - _this.buffer = []; - _this.isComplete = false; + _this.predicate = predicate; + _this.skipping = true; + _this.index = 0; return _this; } - ZipBufferIterator.prototype[_internal_symbol_iterator__WEBPACK_IMPORTED_MODULE_6__["iterator"]] = function () { - return this; - }; - ZipBufferIterator.prototype.next = function () { - var buffer = this.buffer; - if (buffer.length === 0 && this.isComplete) { - return { value: null, done: true }; + SkipWhileSubscriber.prototype._next = function (value) { + var destination = this.destination; + if (this.skipping) { + this.tryCallPredicate(value); } - else { - return { value: buffer.shift(), done: false }; + if (!this.skipping) { + destination.next(value); } }; - ZipBufferIterator.prototype.hasValue = function () { - return this.buffer.length > 0; - }; - ZipBufferIterator.prototype.hasCompleted = function () { - return this.buffer.length === 0 && this.isComplete; - }; - ZipBufferIterator.prototype.notifyComplete = function () { - if (this.buffer.length > 0) { - this.isComplete = true; - this.parent.notifyInactive(); + SkipWhileSubscriber.prototype.tryCallPredicate = function (value) { + try { + var result = this.predicate(value, this.index++); + this.skipping = Boolean(result); } - else { - this.destination.complete(); + catch (err) { + this.destination.error(err); } }; - ZipBufferIterator.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { - this.buffer.push(innerValue); - this.parent.checkIterators(); - }; - ZipBufferIterator.prototype.subscribe = function (value, index) { - return Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_5__["subscribeToResult"])(this, this.observable, this, index); - }; - return ZipBufferIterator; -}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_4__["OuterSubscriber"])); -//# sourceMappingURL=zip.js.map + return SkipWhileSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=skipWhile.js.map /***/ }), -/* 347 */ +/* 344 */ /***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; __webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "zipAll", function() { return zipAll; }); -/* harmony import */ var _observable_zip__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(346); -/** PURE_IMPORTS_START _observable_zip PURE_IMPORTS_END */ +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "startWith", function() { return startWith; }); +/* harmony import */ var _observable_concat__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(239); +/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(205); +/** PURE_IMPORTS_START _observable_concat,_util_isScheduler PURE_IMPORTS_END */ -function zipAll(project) { - return function (source) { return source.lift(new _observable_zip__WEBPACK_IMPORTED_MODULE_0__["ZipOperator"](project)); }; + +function startWith() { + var array = []; + for (var _i = 0; _i < arguments.length; _i++) { + array[_i] = arguments[_i]; + } + var scheduler = array[array.length - 1]; + if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_1__["isScheduler"])(scheduler)) { + array.pop(); + return function (source) { return Object(_observable_concat__WEBPACK_IMPORTED_MODULE_0__["concat"])(array, source, scheduler); }; + } + else { + return function (source) { return Object(_observable_concat__WEBPACK_IMPORTED_MODULE_0__["concat"])(array, source); }; + } } -//# sourceMappingURL=zipAll.js.map +//# sourceMappingURL=startWith.js.map /***/ }), -/* 348 */ -/***/ (function(module, exports, __webpack_require__) { +/* 345 */ +/***/ (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__(346); +/** PURE_IMPORTS_START _observable_SubscribeOnObservable PURE_IMPORTS_END */ +function subscribeOn(scheduler, delay) { + if (delay === void 0) { + delay = 0; + } + return function subscribeOnOperatorFunction(source) { + return source.lift(new SubscribeOnOperator(scheduler, delay)); + }; +} +var SubscribeOnOperator = /*@__PURE__*/ (function () { + function SubscribeOnOperator(scheduler, delay) { + this.scheduler = scheduler; + this.delay = delay; + } + SubscribeOnOperator.prototype.call = function (subscriber, source) { + return new _observable_SubscribeOnObservable__WEBPACK_IMPORTED_MODULE_0__["SubscribeOnObservable"](source, this.delay, this.scheduler).subscribe(subscriber); + }; + return SubscribeOnOperator; +}()); +//# sourceMappingURL=subscribeOn.js.map -const callbacks = new Set(); -let called = false; - -function exit(exit, signal) { - if (called) { - return; - } - called = true; +/***/ }), +/* 346 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - for (const callback of callbacks) { - callback(); - } +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "SubscribeOnObservable", function() { return SubscribeOnObservable; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); +/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(170); +/* harmony import */ var _scheduler_asap__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(211); +/* harmony import */ var _util_isNumeric__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(257); +/** PURE_IMPORTS_START tslib,_Observable,_scheduler_asap,_util_isNumeric PURE_IMPORTS_END */ - if (exit === true) { - process.exit(128 + signal); // eslint-disable-line unicorn/no-process-exit - } -} -module.exports = callback => { - callbacks.add(callback); - if (callbacks.size === 1) { - process.once('exit', exit); - process.once('SIGINT', exit.bind(null, true, 2)); - process.once('SIGTERM', exit.bind(null, true, 15)); - // PM2 Cluster shutdown message. Caught to support async handlers with pm2, needed because - // explicitly calling process.exit() doesn't trigger the beforeExit event, and the exit - // event cannot support async handlers, since the event loop is never called after it. - process.on('message', message => { - if (message === 'shutdown') { - exit(true, -128); - } - }); - } +var SubscribeOnObservable = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SubscribeOnObservable, _super); + function SubscribeOnObservable(source, delayTime, scheduler) { + if (delayTime === void 0) { + delayTime = 0; + } + if (scheduler === void 0) { + scheduler = _scheduler_asap__WEBPACK_IMPORTED_MODULE_2__["asap"]; + } + var _this = _super.call(this) || this; + _this.source = source; + _this.delayTime = delayTime; + _this.scheduler = scheduler; + if (!Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_3__["isNumeric"])(delayTime) || delayTime < 0) { + _this.delayTime = 0; + } + if (!scheduler || typeof scheduler.schedule !== 'function') { + _this.scheduler = _scheduler_asap__WEBPACK_IMPORTED_MODULE_2__["asap"]; + } + return _this; + } + SubscribeOnObservable.create = function (source, delay, scheduler) { + if (delay === void 0) { + delay = 0; + } + if (scheduler === void 0) { + scheduler = _scheduler_asap__WEBPACK_IMPORTED_MODULE_2__["asap"]; + } + return new SubscribeOnObservable(source, delay, scheduler); + }; + SubscribeOnObservable.dispatch = function (arg) { + var source = arg.source, subscriber = arg.subscriber; + return this.add(source.subscribe(subscriber)); + }; + SubscribeOnObservable.prototype._subscribe = function (subscriber) { + var delay = this.delayTime; + var source = this.source; + var scheduler = this.scheduler; + return scheduler.schedule(SubscribeOnObservable.dispatch, delay, { + source: source, subscriber: subscriber + }); + }; + return SubscribeOnObservable; +}(_Observable__WEBPACK_IMPORTED_MODULE_1__["Observable"])); - return () => { - callbacks.delete(callback); - }; -}; +//# sourceMappingURL=SubscribeOnObservable.js.map /***/ }), -/* 349 */ -/***/ (function(module, exports, __webpack_require__) { +/* 347 */ +/***/ (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__(348); +/* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(220); +/** PURE_IMPORTS_START _switchMap,_util_identity PURE_IMPORTS_END */ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const $isCliError = Symbol('isCliError'); -function createCliError(message) { - const error = new Error(message); - error[$isCliError] = true; - return error; -} -exports.createCliError = createCliError; -function isCliError(error) { - return error && !!error[$isCliError]; + +function switchAll() { + return Object(_switchMap__WEBPACK_IMPORTED_MODULE_0__["switchMap"])(_util_identity__WEBPACK_IMPORTED_MODULE_1__["identity"]); } -exports.isCliError = isCliError; +//# sourceMappingURL=switchAll.js.map /***/ }), -/* 350 */ -/***/ (function(module, exports, __webpack_require__) { +/* 348 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "switchMap", function() { return switchMap; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); +/* harmony import */ var _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(231); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(230); +/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(226); +/* harmony import */ var _observable_from__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(243); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_InnerSubscriber,_util_subscribeToResult,_map,_observable_from PURE_IMPORTS_END */ -/* - * Licensed to Elasticsearch B.V. under one or more contributor - * license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright - * ownership. Elasticsearch B.V. licenses this file to you under - * the Apache License, Version 2.0 (the "License"); you may - * not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -Object.defineProperty(exports, "__esModule", { value: true }); -const tslib_1 = __webpack_require__(36); -const execa_1 = tslib_1.__importDefault(__webpack_require__(351)); -const fs_1 = __webpack_require__(23); -const Rx = tslib_1.__importStar(__webpack_require__(391)); -const operators_1 = __webpack_require__(169); -const chalk_1 = tslib_1.__importDefault(__webpack_require__(2)); -const tree_kill_1 = tslib_1.__importDefault(__webpack_require__(411)); -const util_1 = __webpack_require__(29); -const treeKillAsync = util_1.promisify((...args) => tree_kill_1.default(...args)); -const observe_lines_1 = __webpack_require__(412); -const errors_1 = __webpack_require__(349); -const SECOND = 1000; -const STOP_TIMEOUT = 30 * SECOND; -async function withTimeout(attempt, ms, onTimeout) { - const TIMEOUT = Symbol('timeout'); - try { - await Promise.race([ - attempt(), - new Promise((_, reject) => setTimeout(() => reject(TIMEOUT), ms)), - ]); - } - catch (error) { - if (error === TIMEOUT) { - await onTimeout(); - } - else { - throw error; - } + + + + + +function switchMap(project, resultSelector) { + if (typeof resultSelector === 'function') { + return function (source) { return source.pipe(switchMap(function (a, i) { return Object(_observable_from__WEBPACK_IMPORTED_MODULE_5__["from"])(project(a, i)).pipe(Object(_map__WEBPACK_IMPORTED_MODULE_4__["map"])(function (b, ii) { return resultSelector(a, b, i, ii); })); })); }; } + return function (source) { return source.lift(new SwitchMapOperator(project)); }; } -function startProc(name, options, log) { - const { cmd, args, cwd, env, stdin } = options; - log.info('[%s] > %s', name, cmd, args.join(' ')); - // spawn fails with ENOENT when either the - // cmd or cwd don't exist, so we check for the cwd - // ahead of time so that the error is less ambiguous - try { - if (!fs_1.statSync(cwd).isDirectory()) { - throw new Error(`cwd "${cwd}" exists but is not a directory`); - } - } - catch (err) { - if (err.code === 'ENOENT') { - throw new Error(`cwd "${cwd}" does not exist`); - } - } - const childProcess = execa_1.default(cmd, args, { - cwd, - env, - stdio: ['pipe', 'pipe', 'pipe'], - preferLocal: true, - }); - if (stdin) { - childProcess.stdin.end(stdin, 'utf8'); +var SwitchMapOperator = /*@__PURE__*/ (function () { + function SwitchMapOperator(project) { + this.project = project; } - else { - childProcess.stdin.end(); + SwitchMapOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new SwitchMapSubscriber(subscriber, this.project)); + }; + return SwitchMapOperator; +}()); +var SwitchMapSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](SwitchMapSubscriber, _super); + function SwitchMapSubscriber(destination, project) { + var _this = _super.call(this, destination) || this; + _this.project = project; + _this.index = 0; + return _this; } - let stopCalled = false; - const outcome$ = Rx.race( - // observe first exit event - Rx.fromEvent(childProcess, 'exit').pipe(operators_1.take(1), operators_1.map(([code]) => { - if (stopCalled) { - return null; - } - // JVM exits with 143 on SIGTERM and 130 on SIGINT, dont' treat then as errors - if (code > 0 && !(code === 143 || code === 130)) { - throw errors_1.createCliError(`[${name}] exited with code ${code}`); + SwitchMapSubscriber.prototype._next = function (value) { + var result; + var index = this.index++; + try { + result = this.project(value, index); } - return code; - })), - // observe first error event - Rx.fromEvent(childProcess, 'error').pipe(operators_1.take(1), operators_1.mergeMap(err => Rx.throwError(err)))).pipe(operators_1.share()); - const lines$ = Rx.merge(observe_lines_1.observeLines(childProcess.stdout), observe_lines_1.observeLines(childProcess.stderr)).pipe(operators_1.tap(line => log.write(` ${chalk_1.default.gray('proc')} [${chalk_1.default.gray(name)}] ${line}`)), operators_1.share()); - const outcomePromise = Rx.merge(lines$.pipe(operators_1.ignoreElements()), outcome$).toPromise(); - async function stop(signal) { - if (stopCalled) { + catch (error) { + this.destination.error(error); return; } - stopCalled = true; - await withTimeout(async () => { - log.debug(`Sending "${signal}" to proc "${name}"`); - await treeKillAsync(childProcess.pid, signal); - await outcomePromise; - }, STOP_TIMEOUT, async () => { - log.warning(`Proc "${name}" was sent "${signal}" didn't emit the "exit" or "error" events after ${STOP_TIMEOUT} ms, sending SIGKILL`); - await treeKillAsync(childProcess.pid, 'SIGKILL'); - }); - await withTimeout(async () => { - try { - await outcomePromise; - } - catch (error) { - // ignore - } - }, STOP_TIMEOUT, async () => { - throw new Error(`Proc "${name}" was stopped but never emitted either the "exit" or "error" event after ${STOP_TIMEOUT} ms`); - }); - } - return { - name, - lines$, - outcome$, - outcomePromise, - stop, + this._innerSub(result, value, index); }; -} -exports.startProc = startProc; + SwitchMapSubscriber.prototype._innerSub = function (result, value, index) { + var innerSubscription = this.innerSubscription; + if (innerSubscription) { + innerSubscription.unsubscribe(); + } + var innerSubscriber = new _InnerSubscriber__WEBPACK_IMPORTED_MODULE_2__["InnerSubscriber"](this, undefined, undefined); + var destination = this.destination; + destination.add(innerSubscriber); + this.innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, result, value, index, innerSubscriber); + }; + SwitchMapSubscriber.prototype._complete = function () { + var innerSubscription = this.innerSubscription; + if (!innerSubscription || innerSubscription.closed) { + _super.prototype._complete.call(this); + } + this.unsubscribe(); + }; + SwitchMapSubscriber.prototype._unsubscribe = function () { + this.innerSubscription = null; + }; + SwitchMapSubscriber.prototype.notifyComplete = function (innerSub) { + var destination = this.destination; + destination.remove(innerSub); + this.innerSubscription = null; + if (this.isStopped) { + _super.prototype._complete.call(this); + } + }; + SwitchMapSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.destination.next(innerValue); + }; + return SwitchMapSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=switchMap.js.map /***/ }), -/* 351 */ -/***/ (function(module, exports, __webpack_require__) { +/* 349 */ +/***/ (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__(348); +/** PURE_IMPORTS_START _switchMap PURE_IMPORTS_END */ -const path = __webpack_require__(16); -const childProcess = __webpack_require__(352); -const crossSpawn = __webpack_require__(353); -const stripFinalNewline = __webpack_require__(366); -const npmRunPath = __webpack_require__(367); -const onetime = __webpack_require__(368); -const makeError = __webpack_require__(370); -const normalizeStdio = __webpack_require__(375); -const {spawnedKill, spawnedCancel, setupTimeout, setExitHandler} = __webpack_require__(376); -const {handleInput, getSpawnedResult, makeAllStream, validateInputSync} = __webpack_require__(380); -const {mergePromise, getSpawnedPromise} = __webpack_require__(389); -const {joinCommand, parseCommand} = __webpack_require__(390); +function switchMapTo(innerObservable, resultSelector) { + return resultSelector ? Object(_switchMap__WEBPACK_IMPORTED_MODULE_0__["switchMap"])(function () { return innerObservable; }, resultSelector) : Object(_switchMap__WEBPACK_IMPORTED_MODULE_0__["switchMap"])(function () { return innerObservable; }); +} +//# sourceMappingURL=switchMapTo.js.map -const DEFAULT_MAX_BUFFER = 1000 * 1000 * 100; -const getEnv = ({env: envOption, extendEnv, preferLocal, localDir, execPath}) => { - const env = extendEnv ? {...process.env, ...envOption} : envOption; +/***/ }), +/* 350 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - if (preferLocal) { - return npmRunPath.env({env, cwd: localDir, execPath}); - } +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "takeUntil", function() { return takeUntil; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(230); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - return env; -}; -const handleArgs = (file, args, options = {}) => { - const parsed = crossSpawn._parse(file, args, options); - file = parsed.command; - args = parsed.args; - options = parsed.options; - options = { - maxBuffer: DEFAULT_MAX_BUFFER, - buffer: true, - stripFinalNewline: true, - extendEnv: true, - preferLocal: false, - localDir: options.cwd || process.cwd(), - execPath: process.execPath, - encoding: 'utf8', - reject: true, - cleanup: true, - all: false, - windowsHide: true, - ...options - }; +function takeUntil(notifier) { + return function (source) { return source.lift(new TakeUntilOperator(notifier)); }; +} +var TakeUntilOperator = /*@__PURE__*/ (function () { + function TakeUntilOperator(notifier) { + this.notifier = notifier; + } + TakeUntilOperator.prototype.call = function (subscriber, source) { + var takeUntilSubscriber = new TakeUntilSubscriber(subscriber); + var notifierSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(takeUntilSubscriber, this.notifier); + if (notifierSubscription && !takeUntilSubscriber.seenValue) { + takeUntilSubscriber.add(notifierSubscription); + return source.subscribe(takeUntilSubscriber); + } + return takeUntilSubscriber; + }; + return TakeUntilOperator; +}()); +var TakeUntilSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TakeUntilSubscriber, _super); + function TakeUntilSubscriber(destination) { + var _this = _super.call(this, destination) || this; + _this.seenValue = false; + return _this; + } + TakeUntilSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.seenValue = true; + this.complete(); + }; + TakeUntilSubscriber.prototype.notifyComplete = function () { + }; + return TakeUntilSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=takeUntil.js.map - options.env = getEnv(options); - options.stdio = normalizeStdio(options); +/***/ }), +/* 351 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - if (process.platform === 'win32' && path.basename(file, '.exe') === 'cmd') { - // #116 - args.unshift('/q'); - } +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "takeWhile", function() { return takeWhile; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); +/** PURE_IMPORTS_START tslib,_Subscriber PURE_IMPORTS_END */ - return {file, args, options, parsed}; -}; -const handleOutput = (options, value, error) => { - if (typeof value !== 'string' && !Buffer.isBuffer(value)) { - // When `execa.sync()` errors, we normalize it to '' to mimic `execa()` - return error === undefined ? undefined : ''; - } +function takeWhile(predicate, inclusive) { + if (inclusive === void 0) { + inclusive = false; + } + return function (source) { + return source.lift(new TakeWhileOperator(predicate, inclusive)); + }; +} +var TakeWhileOperator = /*@__PURE__*/ (function () { + function TakeWhileOperator(predicate, inclusive) { + this.predicate = predicate; + this.inclusive = inclusive; + } + TakeWhileOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new TakeWhileSubscriber(subscriber, this.predicate, this.inclusive)); + }; + return TakeWhileOperator; +}()); +var TakeWhileSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TakeWhileSubscriber, _super); + function TakeWhileSubscriber(destination, predicate, inclusive) { + var _this = _super.call(this, destination) || this; + _this.predicate = predicate; + _this.inclusive = inclusive; + _this.index = 0; + return _this; + } + TakeWhileSubscriber.prototype._next = function (value) { + var destination = this.destination; + var result; + try { + result = this.predicate(value, this.index++); + } + catch (err) { + destination.error(err); + return; + } + this.nextOrComplete(value, result); + }; + TakeWhileSubscriber.prototype.nextOrComplete = function (value, predicateResult) { + var destination = this.destination; + if (Boolean(predicateResult)) { + destination.next(value); + } + else { + if (this.inclusive) { + destination.next(value); + } + destination.complete(); + } + }; + return TakeWhileSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=takeWhile.js.map - if (options.stripFinalNewline) { - return stripFinalNewline(value); - } - return value; -}; +/***/ }), +/* 352 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -const execa = (file, args, options) => { - const parsed = handleArgs(file, args, options); - const command = joinCommand(file, args); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "tap", function() { return tap; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); +/* harmony import */ var _util_noop__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(185); +/* harmony import */ var _util_isFunction__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(173); +/** PURE_IMPORTS_START tslib,_Subscriber,_util_noop,_util_isFunction PURE_IMPORTS_END */ - let spawned; - try { - spawned = childProcess.spawn(parsed.file, parsed.args, parsed.options); - } catch (error) { - // Ensure the returned error is always both a promise and a child process - const dummySpawned = new childProcess.ChildProcess(); - const errorPromise = Promise.reject(makeError({ - error, - stdout: '', - stderr: '', - all: '', - command, - parsed, - timedOut: false, - isCanceled: false, - killed: false - })); - return mergePromise(dummySpawned, errorPromise); - } - const spawnedPromise = getSpawnedPromise(spawned); - const timedPromise = setupTimeout(spawned, parsed.options, spawnedPromise); - const processDone = setExitHandler(spawned, parsed.options, timedPromise); - - const context = {isCanceled: false}; - - spawned.kill = spawnedKill.bind(null, spawned.kill.bind(spawned)); - spawned.cancel = spawnedCancel.bind(null, spawned, context); - - const handlePromise = async () => { - const [{error, exitCode, signal, timedOut}, stdoutResult, stderrResult, allResult] = await getSpawnedResult(spawned, parsed.options, processDone); - const stdout = handleOutput(parsed.options, stdoutResult); - const stderr = handleOutput(parsed.options, stderrResult); - const all = handleOutput(parsed.options, allResult); - - if (error || exitCode !== 0 || signal !== null) { - const returnedError = makeError({ - error, - exitCode, - signal, - stdout, - stderr, - all, - command, - parsed, - timedOut, - isCanceled: context.isCanceled, - killed: spawned.killed - }); - if (!parsed.options.reject) { - return returnedError; - } - throw returnedError; - } +function tap(nextOrObserver, error, complete) { + return function tapOperatorFunction(source) { + return source.lift(new DoOperator(nextOrObserver, error, complete)); + }; +} +var DoOperator = /*@__PURE__*/ (function () { + function DoOperator(nextOrObserver, error, complete) { + this.nextOrObserver = nextOrObserver; + this.error = error; + this.complete = complete; + } + DoOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new TapSubscriber(subscriber, this.nextOrObserver, this.error, this.complete)); + }; + return DoOperator; +}()); +var TapSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TapSubscriber, _super); + function TapSubscriber(destination, observerOrNext, error, complete) { + var _this = _super.call(this, destination) || this; + _this._tapNext = _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; + _this._tapError = _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; + _this._tapComplete = _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; + _this._tapError = error || _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; + _this._tapComplete = complete || _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; + if (Object(_util_isFunction__WEBPACK_IMPORTED_MODULE_3__["isFunction"])(observerOrNext)) { + _this._context = _this; + _this._tapNext = observerOrNext; + } + else if (observerOrNext) { + _this._context = observerOrNext; + _this._tapNext = observerOrNext.next || _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; + _this._tapError = observerOrNext.error || _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; + _this._tapComplete = observerOrNext.complete || _util_noop__WEBPACK_IMPORTED_MODULE_2__["noop"]; + } + return _this; + } + TapSubscriber.prototype._next = function (value) { + try { + this._tapNext.call(this._context, value); + } + catch (err) { + this.destination.error(err); + return; + } + this.destination.next(value); + }; + TapSubscriber.prototype._error = function (err) { + try { + this._tapError.call(this._context, err); + } + catch (err) { + this.destination.error(err); + return; + } + this.destination.error(err); + }; + TapSubscriber.prototype._complete = function () { + try { + this._tapComplete.call(this._context); + } + catch (err) { + this.destination.error(err); + return; + } + return this.destination.complete(); + }; + return TapSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=tap.js.map - return { - command, - exitCode: 0, - stdout, - stderr, - all, - failed: false, - timedOut: false, - isCanceled: false, - killed: false - }; - }; - const handlePromiseOnce = onetime(handlePromise); +/***/ }), +/* 353 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - crossSpawn._enoent.hookChildProcess(spawned, parsed.parsed); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "defaultThrottleConfig", function() { return defaultThrottleConfig; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "throttle", function() { return throttle; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(230); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ - handleInput(spawned, parsed.options.input); - spawned.all = makeAllStream(spawned, parsed.options); - return mergePromise(spawned, handlePromiseOnce); +var defaultThrottleConfig = { + leading: true, + trailing: false }; +function throttle(durationSelector, config) { + if (config === void 0) { + config = defaultThrottleConfig; + } + return function (source) { return source.lift(new ThrottleOperator(durationSelector, config.leading, config.trailing)); }; +} +var ThrottleOperator = /*@__PURE__*/ (function () { + function ThrottleOperator(durationSelector, leading, trailing) { + this.durationSelector = durationSelector; + this.leading = leading; + this.trailing = trailing; + } + ThrottleOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new ThrottleSubscriber(subscriber, this.durationSelector, this.leading, this.trailing)); + }; + return ThrottleOperator; +}()); +var ThrottleSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ThrottleSubscriber, _super); + function ThrottleSubscriber(destination, durationSelector, _leading, _trailing) { + var _this = _super.call(this, destination) || this; + _this.destination = destination; + _this.durationSelector = durationSelector; + _this._leading = _leading; + _this._trailing = _trailing; + _this._hasValue = false; + return _this; + } + ThrottleSubscriber.prototype._next = function (value) { + this._hasValue = true; + this._sendValue = value; + if (!this._throttled) { + if (this._leading) { + this.send(); + } + else { + this.throttle(value); + } + } + }; + ThrottleSubscriber.prototype.send = function () { + var _a = this, _hasValue = _a._hasValue, _sendValue = _a._sendValue; + if (_hasValue) { + this.destination.next(_sendValue); + this.throttle(_sendValue); + } + this._hasValue = false; + this._sendValue = null; + }; + ThrottleSubscriber.prototype.throttle = function (value) { + var duration = this.tryDurationSelector(value); + if (!!duration) { + this.add(this._throttled = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(this, duration)); + } + }; + ThrottleSubscriber.prototype.tryDurationSelector = function (value) { + try { + return this.durationSelector(value); + } + catch (err) { + this.destination.error(err); + return null; + } + }; + ThrottleSubscriber.prototype.throttlingDone = function () { + var _a = this, _throttled = _a._throttled, _trailing = _a._trailing; + if (_throttled) { + _throttled.unsubscribe(); + } + this._throttled = null; + if (_trailing) { + this.send(); + } + }; + ThrottleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.throttlingDone(); + }; + ThrottleSubscriber.prototype.notifyComplete = function () { + this.throttlingDone(); + }; + return ThrottleSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=throttle.js.map -module.exports = execa; - -module.exports.sync = (file, args, options) => { - const parsed = handleArgs(file, args, options); - const command = joinCommand(file, args); - - validateInputSync(parsed.options); - let result; - try { - result = childProcess.spawnSync(parsed.file, parsed.args, parsed.options); - } catch (error) { - throw makeError({ - error, - stdout: '', - stderr: '', - all: '', - command, - parsed, - timedOut: false, - isCanceled: false, - killed: false - }); - } +/***/ }), +/* 354 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - const stdout = handleOutput(parsed.options, result.stdout, result.error); - const stderr = handleOutput(parsed.options, result.stderr, result.error); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "throttleTime", function() { return throttleTime; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(215); +/* harmony import */ var _throttle__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(353); +/** PURE_IMPORTS_START tslib,_Subscriber,_scheduler_async,_throttle PURE_IMPORTS_END */ - if (result.error || result.status !== 0 || result.signal !== null) { - const error = makeError({ - stdout, - stderr, - error: result.error, - signal: result.signal, - exitCode: result.status, - command, - parsed, - timedOut: result.error && result.error.code === 'ETIMEDOUT', - isCanceled: false, - killed: result.signal !== null - }); - if (!parsed.options.reject) { - return error; - } - throw error; - } - return { - command, - exitCode: 0, - stdout, - stderr, - failed: false, - timedOut: false, - isCanceled: false, - killed: false - }; -}; +function throttleTime(duration, scheduler, config) { + if (scheduler === void 0) { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_2__["async"]; + } + if (config === void 0) { + config = _throttle__WEBPACK_IMPORTED_MODULE_3__["defaultThrottleConfig"]; + } + return function (source) { return source.lift(new ThrottleTimeOperator(duration, scheduler, config.leading, config.trailing)); }; +} +var ThrottleTimeOperator = /*@__PURE__*/ (function () { + function ThrottleTimeOperator(duration, scheduler, leading, trailing) { + this.duration = duration; + this.scheduler = scheduler; + this.leading = leading; + this.trailing = trailing; + } + ThrottleTimeOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new ThrottleTimeSubscriber(subscriber, this.duration, this.scheduler, this.leading, this.trailing)); + }; + return ThrottleTimeOperator; +}()); +var ThrottleTimeSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](ThrottleTimeSubscriber, _super); + function ThrottleTimeSubscriber(destination, duration, scheduler, leading, trailing) { + var _this = _super.call(this, destination) || this; + _this.duration = duration; + _this.scheduler = scheduler; + _this.leading = leading; + _this.trailing = trailing; + _this._hasTrailingValue = false; + _this._trailingValue = null; + return _this; + } + ThrottleTimeSubscriber.prototype._next = function (value) { + if (this.throttled) { + if (this.trailing) { + this._trailingValue = value; + this._hasTrailingValue = true; + } + } + else { + this.add(this.throttled = this.scheduler.schedule(dispatchNext, this.duration, { subscriber: this })); + if (this.leading) { + this.destination.next(value); + } + else if (this.trailing) { + this._trailingValue = value; + this._hasTrailingValue = true; + } + } + }; + ThrottleTimeSubscriber.prototype._complete = function () { + if (this._hasTrailingValue) { + this.destination.next(this._trailingValue); + this.destination.complete(); + } + else { + this.destination.complete(); + } + }; + ThrottleTimeSubscriber.prototype.clearThrottle = function () { + var throttled = this.throttled; + if (throttled) { + if (this.trailing && this._hasTrailingValue) { + this.destination.next(this._trailingValue); + this._trailingValue = null; + this._hasTrailingValue = false; + } + throttled.unsubscribe(); + this.remove(throttled); + this.throttled = null; + } + }; + return ThrottleTimeSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +function dispatchNext(arg) { + var subscriber = arg.subscriber; + subscriber.clearThrottle(); +} +//# sourceMappingURL=throttleTime.js.map -module.exports.command = (command, options) => { - const [file, ...args] = parseCommand(command); - return execa(file, args, options); -}; -module.exports.commandSync = (command, options) => { - const [file, ...args] = parseCommand(command); - return execa.sync(file, args, options); -}; +/***/ }), +/* 355 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -module.exports.node = (scriptPath, args, options = {}) => { - if (args && !Array.isArray(args) && typeof args === 'object') { - options = args; - args = []; - } +"use strict"; +__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__(215); +/* harmony import */ var _scan__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(315); +/* harmony import */ var _observable_defer__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(250); +/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(226); +/** PURE_IMPORTS_START _scheduler_async,_scan,_observable_defer,_map PURE_IMPORTS_END */ - const stdio = normalizeStdio.node(options); - const {nodePath = process.execPath, nodeOptions = process.execArgv} = options; - return execa( - nodePath, - [ - ...nodeOptions, - scriptPath, - ...(Array.isArray(args) ? args : []) - ], - { - ...options, - stdin: undefined, - stdout: undefined, - stderr: undefined, - stdio, - shell: false - } - ); -}; +function timeInterval(scheduler) { + if (scheduler === void 0) { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_0__["async"]; + } + return function (source) { + return Object(_observable_defer__WEBPACK_IMPORTED_MODULE_2__["defer"])(function () { + return source.pipe(Object(_scan__WEBPACK_IMPORTED_MODULE_1__["scan"])(function (_a, value) { + var current = _a.current; + return ({ value: value, current: scheduler.now(), last: current }); + }, { current: scheduler.now(), value: undefined, last: undefined }), Object(_map__WEBPACK_IMPORTED_MODULE_3__["map"])(function (_a) { + var current = _a.current, last = _a.last, value = _a.value; + return new TimeInterval(value, current - last); + })); + }); + }; +} +var TimeInterval = /*@__PURE__*/ (function () { + function TimeInterval(value, interval) { + this.value = value; + this.interval = interval; + } + return TimeInterval; +}()); -/***/ }), -/* 352 */ -/***/ (function(module, exports) { +//# sourceMappingURL=timeInterval.js.map -module.exports = require("child_process"); /***/ }), -/* 353 */ -/***/ (function(module, exports, __webpack_require__) { +/* 356 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; +__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__(215); +/* harmony import */ var _util_TimeoutError__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(224); +/* harmony import */ var _timeoutWith__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(357); +/* harmony import */ var _observable_throwError__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(209); +/** PURE_IMPORTS_START _scheduler_async,_util_TimeoutError,_timeoutWith,_observable_throwError PURE_IMPORTS_END */ -const cp = __webpack_require__(352); -const parse = __webpack_require__(354); -const enoent = __webpack_require__(365); - -function spawn(command, args, options) { - // Parse the arguments - const parsed = parse(command, args, options); - - // Spawn the child process - const spawned = cp.spawn(parsed.command, parsed.args, parsed.options); - - // Hook into child process "exit" event to emit an error if the command - // does not exists, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16 - enoent.hookChildProcess(spawned, parsed); - - return spawned; -} - -function spawnSync(command, args, options) { - // Parse the arguments - const parsed = parse(command, args, options); - - // Spawn the child process - const result = cp.spawnSync(parsed.command, parsed.args, parsed.options); - // Analyze if the command does not exist, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16 - result.error = result.error || enoent.verifyENOENTSync(result.status, parsed); - return result; +function timeout(due, scheduler) { + if (scheduler === void 0) { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_0__["async"]; + } + return Object(_timeoutWith__WEBPACK_IMPORTED_MODULE_2__["timeoutWith"])(due, Object(_observable_throwError__WEBPACK_IMPORTED_MODULE_3__["throwError"])(new _util_TimeoutError__WEBPACK_IMPORTED_MODULE_1__["TimeoutError"]()), scheduler); } - -module.exports = spawn; -module.exports.spawn = spawn; -module.exports.sync = spawnSync; - -module.exports._parse = parse; -module.exports._enoent = enoent; +//# sourceMappingURL=timeout.js.map /***/ }), -/* 354 */ -/***/ (function(module, exports, __webpack_require__) { +/* 357 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; +__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__(36); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(215); +/* harmony import */ var _util_isDate__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(289); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(229); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(230); +/** PURE_IMPORTS_START tslib,_scheduler_async,_util_isDate,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -const path = __webpack_require__(16); -const resolveCommand = __webpack_require__(355); -const escape = __webpack_require__(361); -const readShebang = __webpack_require__(362); - -const isWin = process.platform === 'win32'; -const isExecutableRegExp = /\.(?:com|exe)$/i; -const isCmdShimRegExp = /node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i; - -function detectShebang(parsed) { - parsed.file = resolveCommand(parsed); - const shebang = parsed.file && readShebang(parsed.file); - if (shebang) { - parsed.args.unshift(parsed.file); - parsed.command = shebang; - return resolveCommand(parsed); +function timeoutWith(due, withObservable, scheduler) { + if (scheduler === void 0) { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; } - - return parsed.file; + return function (source) { + var absoluteTimeout = Object(_util_isDate__WEBPACK_IMPORTED_MODULE_2__["isDate"])(due); + var waitFor = absoluteTimeout ? (+due - scheduler.now()) : Math.abs(due); + return source.lift(new TimeoutWithOperator(waitFor, absoluteTimeout, withObservable, scheduler)); + }; } - -function parseNonShell(parsed) { - if (!isWin) { - return parsed; +var TimeoutWithOperator = /*@__PURE__*/ (function () { + function TimeoutWithOperator(waitFor, absoluteTimeout, withObservable, scheduler) { + this.waitFor = waitFor; + this.absoluteTimeout = absoluteTimeout; + this.withObservable = withObservable; + this.scheduler = scheduler; } + TimeoutWithOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new TimeoutWithSubscriber(subscriber, this.absoluteTimeout, this.waitFor, this.withObservable, this.scheduler)); + }; + return TimeoutWithOperator; +}()); +var TimeoutWithSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](TimeoutWithSubscriber, _super); + function TimeoutWithSubscriber(destination, absoluteTimeout, waitFor, withObservable, scheduler) { + var _this = _super.call(this, destination) || this; + _this.absoluteTimeout = absoluteTimeout; + _this.waitFor = waitFor; + _this.withObservable = withObservable; + _this.scheduler = scheduler; + _this.action = null; + _this.scheduleTimeout(); + return _this; + } + TimeoutWithSubscriber.dispatchTimeout = function (subscriber) { + var withObservable = subscriber.withObservable; + subscriber._unsubscribeAndRecycle(); + subscriber.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["subscribeToResult"])(subscriber, withObservable)); + }; + TimeoutWithSubscriber.prototype.scheduleTimeout = function () { + var action = this.action; + if (action) { + this.action = action.schedule(this, this.waitFor); + } + else { + this.add(this.action = this.scheduler.schedule(TimeoutWithSubscriber.dispatchTimeout, this.waitFor, this)); + } + }; + TimeoutWithSubscriber.prototype._next = function (value) { + if (!this.absoluteTimeout) { + this.scheduleTimeout(); + } + _super.prototype._next.call(this, value); + }; + TimeoutWithSubscriber.prototype._unsubscribe = function () { + this.action = null; + this.scheduler = null; + this.withObservable = null; + }; + return TimeoutWithSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); +//# sourceMappingURL=timeoutWith.js.map - // Detect & add support for shebangs - const commandFile = detectShebang(parsed); - - // We don't need a shell if the command filename is an executable - const needsShell = !isExecutableRegExp.test(commandFile); - - // If a shell is required, use cmd.exe and take care of escaping everything correctly - // Note that `forceShell` is an hidden option used only in tests - if (parsed.options.forceShell || needsShell) { - // Need to double escape meta chars if the command is a cmd-shim located in `node_modules/.bin/` - // The cmd-shim simply calls execute the package bin file with NodeJS, proxying any argument - // Because the escape of metachars with ^ gets interpreted when the cmd.exe is first called, - // we need to double escape them - const needsDoubleEscapeMetaChars = isCmdShimRegExp.test(commandFile); - // Normalize posix paths into OS compatible paths (e.g.: foo/bar -> foo\bar) - // This is necessary otherwise it will always fail with ENOENT in those cases - parsed.command = path.normalize(parsed.command); +/***/ }), +/* 358 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - // Escape command & arguments - parsed.command = escape.command(parsed.command); - parsed.args = parsed.args.map((arg) => escape.argument(arg, needsDoubleEscapeMetaChars)); +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "timestamp", function() { return timestamp; }); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "Timestamp", function() { return Timestamp; }); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(215); +/* harmony import */ var _map__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(226); +/** PURE_IMPORTS_START _scheduler_async,_map PURE_IMPORTS_END */ - const shellCommand = [parsed.command].concat(parsed.args).join(' '); - parsed.args = ['/d', '/s', '/c', `"${shellCommand}"`]; - parsed.command = process.env.comspec || 'cmd.exe'; - parsed.options.windowsVerbatimArguments = true; // Tell node's spawn that the arguments are already escaped +function timestamp(scheduler) { + if (scheduler === void 0) { + scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_0__["async"]; } - - return parsed; + return Object(_map__WEBPACK_IMPORTED_MODULE_1__["map"])(function (value) { return new Timestamp(value, scheduler.now()); }); } - -function parse(command, args, options) { - // Normalize arguments, similar to nodejs - if (args && !Array.isArray(args)) { - options = args; - args = null; +var Timestamp = /*@__PURE__*/ (function () { + function Timestamp(value, timestamp) { + this.value = value; + this.timestamp = timestamp; } + return Timestamp; +}()); - args = args ? args.slice(0) : []; // Clone array to avoid changing the original - options = Object.assign({}, options); // Clone object to avoid changing the original - - // Build our parsed object - const parsed = { - command, - args, - options, - file: undefined, - original: { - command, - args, - }, - }; - - // Delegate further parsing to shell or non-shell - return options.shell ? parsed : parseNonShell(parsed); -} - -module.exports = parse; +//# sourceMappingURL=timestamp.js.map /***/ }), -/* 355 */ -/***/ (function(module, exports, __webpack_require__) { +/* 359 */ +/***/ (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__(314); +/** PURE_IMPORTS_START _reduce PURE_IMPORTS_END */ - -const path = __webpack_require__(16); -const which = __webpack_require__(356); -const pathKey = __webpack_require__(360)(); - -function resolveCommandAttempt(parsed, withoutPathExt) { - const cwd = process.cwd(); - const hasCustomCwd = parsed.options.cwd != null; - // Worker threads do not have process.chdir() - const shouldSwitchCwd = hasCustomCwd && process.chdir !== undefined; - - // If a custom `cwd` was specified, we need to change the process cwd - // because `which` will do stat calls but does not support a custom cwd - if (shouldSwitchCwd) { - try { - process.chdir(parsed.options.cwd); - } catch (err) { - /* Empty */ - } - } - - let resolved; - - try { - resolved = which.sync(parsed.command, { - path: (parsed.options.env || process.env)[pathKey], - pathExt: withoutPathExt ? path.delimiter : undefined, - }); - } catch (e) { - /* Empty */ - } finally { - if (shouldSwitchCwd) { - process.chdir(cwd); - } - } - - // If we successfully resolved, ensure that an absolute path is returned - // Note that when a custom `cwd` was used, we need to resolve to an absolute path based on it - if (resolved) { - resolved = path.resolve(hasCustomCwd ? parsed.options.cwd : '', resolved); +function toArrayReducer(arr, item, index) { + if (index === 0) { + return [item]; } - - return resolved; + arr.push(item); + return arr; } - -function resolveCommand(parsed) { - return resolveCommandAttempt(parsed) || resolveCommandAttempt(parsed, true); +function toArray() { + return Object(_reduce__WEBPACK_IMPORTED_MODULE_0__["reduce"])(toArrayReducer, []); } - -module.exports = resolveCommand; +//# sourceMappingURL=toArray.js.map /***/ }), -/* 356 */ -/***/ (function(module, exports, __webpack_require__) { - -const isWindows = process.platform === 'win32' || - process.env.OSTYPE === 'cygwin' || - process.env.OSTYPE === 'msys' - -const path = __webpack_require__(16) -const COLON = isWindows ? ';' : ':' -const isexe = __webpack_require__(357) +/* 360 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -const getNotFoundError = (cmd) => - Object.assign(new Error(`not found: ${cmd}`), { code: 'ENOENT' }) +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "window", function() { return window; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(187); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(229); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(230); +/** PURE_IMPORTS_START tslib,_Subject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -const getPathInfo = (cmd, opt) => { - const colon = opt.colon || COLON - // If it has a slash, then we don't bother searching the pathenv. - // just check the file itself, and that's it. - const pathEnv = cmd.match(/\//) || isWindows && cmd.match(/\\/) ? [''] - : ( - [ - // windows always checks the cwd first - ...(isWindows ? [process.cwd()] : []), - ...(opt.path || process.env.PATH || - /* istanbul ignore next: very unusual */ '').split(colon), - ] - ) - const pathExtExe = isWindows - ? opt.pathExt || process.env.PATHEXT || '.EXE;.CMD;.BAT;.COM' - : '' - const pathExt = isWindows ? pathExtExe.split(colon) : [''] - if (isWindows) { - if (cmd.indexOf('.') !== -1 && pathExt[0] !== '') - pathExt.unshift('') - } - return { - pathEnv, - pathExt, - pathExtExe, - } +function window(windowBoundaries) { + return function windowOperatorFunction(source) { + return source.lift(new WindowOperator(windowBoundaries)); + }; } +var WindowOperator = /*@__PURE__*/ (function () { + function WindowOperator(windowBoundaries) { + this.windowBoundaries = windowBoundaries; + } + WindowOperator.prototype.call = function (subscriber, source) { + var windowSubscriber = new WindowSubscriber(subscriber); + var sourceSubscription = source.subscribe(windowSubscriber); + if (!sourceSubscription.closed) { + windowSubscriber.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(windowSubscriber, this.windowBoundaries)); + } + return sourceSubscription; + }; + return WindowOperator; +}()); +var WindowSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WindowSubscriber, _super); + function WindowSubscriber(destination) { + var _this = _super.call(this, destination) || this; + _this.window = new _Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"](); + destination.next(_this.window); + return _this; + } + WindowSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.openWindow(); + }; + WindowSubscriber.prototype.notifyError = function (error, innerSub) { + this._error(error); + }; + WindowSubscriber.prototype.notifyComplete = function (innerSub) { + this._complete(); + }; + WindowSubscriber.prototype._next = function (value) { + this.window.next(value); + }; + WindowSubscriber.prototype._error = function (err) { + this.window.error(err); + this.destination.error(err); + }; + WindowSubscriber.prototype._complete = function () { + this.window.complete(); + this.destination.complete(); + }; + WindowSubscriber.prototype._unsubscribe = function () { + this.window = null; + }; + WindowSubscriber.prototype.openWindow = function () { + var prevWindow = this.window; + if (prevWindow) { + prevWindow.complete(); + } + var destination = this.destination; + var newWindow = this.window = new _Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"](); + destination.next(newWindow); + }; + return WindowSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); +//# sourceMappingURL=window.js.map -const which = (cmd, opt, cb) => { - if (typeof opt === 'function') { - cb = opt - opt = {} - } - if (!opt) - opt = {} - - const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt) - const found = [] - - const step = i => new Promise((resolve, reject) => { - if (i === pathEnv.length) - return opt.all && found.length ? resolve(found) - : reject(getNotFoundError(cmd)) - const ppRaw = pathEnv[i] - const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw +/***/ }), +/* 361 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { - const pCmd = path.join(pathPart, cmd) - const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd - : pCmd +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "windowCount", function() { return windowCount; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(172); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(187); +/** PURE_IMPORTS_START tslib,_Subscriber,_Subject PURE_IMPORTS_END */ - resolve(subStep(p, i, 0)) - }) - const subStep = (p, i, ii) => new Promise((resolve, reject) => { - if (ii === pathExt.length) - return resolve(step(i + 1)) - const ext = pathExt[ii] - isexe(p + ext, { pathExt: pathExtExe }, (er, is) => { - if (!er && is) { - if (opt.all) - found.push(p + ext) - else - return resolve(p + ext) - } - return resolve(subStep(p, i, ii + 1)) - }) - }) - return cb ? step(0).then(res => cb(null, res), cb) : step(0) +function windowCount(windowSize, startWindowEvery) { + if (startWindowEvery === void 0) { + startWindowEvery = 0; + } + return function windowCountOperatorFunction(source) { + return source.lift(new WindowCountOperator(windowSize, startWindowEvery)); + }; } - -const whichSync = (cmd, opt) => { - opt = opt || {} - - const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt) - const found = [] - - for (let i = 0; i < pathEnv.length; i ++) { - const ppRaw = pathEnv[i] - const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw - - const pCmd = path.join(pathPart, cmd) - const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd - : pCmd - - for (let j = 0; j < pathExt.length; j ++) { - const cur = p + pathExt[j] - try { - const is = isexe.sync(cur, { pathExt: pathExtExe }) - if (is) { - if (opt.all) - found.push(cur) - else - return cur - } - } catch (ex) {} +var WindowCountOperator = /*@__PURE__*/ (function () { + function WindowCountOperator(windowSize, startWindowEvery) { + this.windowSize = windowSize; + this.startWindowEvery = startWindowEvery; } - } - - if (opt.all && found.length) - return found + WindowCountOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new WindowCountSubscriber(subscriber, this.windowSize, this.startWindowEvery)); + }; + return WindowCountOperator; +}()); +var WindowCountSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WindowCountSubscriber, _super); + function WindowCountSubscriber(destination, windowSize, startWindowEvery) { + var _this = _super.call(this, destination) || this; + _this.destination = destination; + _this.windowSize = windowSize; + _this.startWindowEvery = startWindowEvery; + _this.windows = [new _Subject__WEBPACK_IMPORTED_MODULE_2__["Subject"]()]; + _this.count = 0; + destination.next(_this.windows[0]); + return _this; + } + WindowCountSubscriber.prototype._next = function (value) { + var startWindowEvery = (this.startWindowEvery > 0) ? this.startWindowEvery : this.windowSize; + var destination = this.destination; + var windowSize = this.windowSize; + var windows = this.windows; + var len = windows.length; + for (var i = 0; i < len && !this.closed; i++) { + windows[i].next(value); + } + var c = this.count - windowSize + 1; + if (c >= 0 && c % startWindowEvery === 0 && !this.closed) { + windows.shift().complete(); + } + if (++this.count % startWindowEvery === 0 && !this.closed) { + var window_1 = new _Subject__WEBPACK_IMPORTED_MODULE_2__["Subject"](); + windows.push(window_1); + destination.next(window_1); + } + }; + WindowCountSubscriber.prototype._error = function (err) { + var windows = this.windows; + if (windows) { + while (windows.length > 0 && !this.closed) { + windows.shift().error(err); + } + } + this.destination.error(err); + }; + WindowCountSubscriber.prototype._complete = function () { + var windows = this.windows; + if (windows) { + while (windows.length > 0 && !this.closed) { + windows.shift().complete(); + } + } + this.destination.complete(); + }; + WindowCountSubscriber.prototype._unsubscribe = function () { + this.count = 0; + this.windows = null; + }; + return WindowCountSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_1__["Subscriber"])); +//# sourceMappingURL=windowCount.js.map - if (opt.nothrow) - return null - throw getNotFoundError(cmd) -} +/***/ }), +/* 362 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { -module.exports = which -which.sync = whichSync +"use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "windowTime", function() { return windowTime; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(187); +/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(215); +/* harmony import */ var _Subscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(172); +/* harmony import */ var _util_isNumeric__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(257); +/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(205); +/** PURE_IMPORTS_START tslib,_Subject,_scheduler_async,_Subscriber,_util_isNumeric,_util_isScheduler PURE_IMPORTS_END */ -/***/ }), -/* 357 */ -/***/ (function(module, exports, __webpack_require__) { -var fs = __webpack_require__(23) -var core -if (process.platform === 'win32' || global.TESTING_WINDOWS) { - core = __webpack_require__(358) -} else { - core = __webpack_require__(359) -} -module.exports = isexe -isexe.sync = sync -function isexe (path, options, cb) { - if (typeof options === 'function') { - cb = options - options = {} - } - if (!cb) { - if (typeof Promise !== 'function') { - throw new TypeError('callback not provided') +function windowTime(windowTimeSpan) { + var scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_2__["async"]; + var windowCreationInterval = null; + var maxWindowSize = Number.POSITIVE_INFINITY; + if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_5__["isScheduler"])(arguments[3])) { + scheduler = arguments[3]; } - - return new Promise(function (resolve, reject) { - isexe(path, options || {}, function (er, is) { - if (er) { - reject(er) - } else { - resolve(is) - } - }) - }) - } - - core(path, options || {}, function (er, is) { - // ignore EACCES because that just means we aren't allowed to run it - if (er) { - if (er.code === 'EACCES' || options && options.ignoreErrors) { - er = null - is = false - } + if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_5__["isScheduler"])(arguments[2])) { + scheduler = arguments[2]; } - cb(er, is) - }) -} - -function sync (path, options) { - // my kingdom for a filtered catch - try { - return core.sync(path, options || {}) - } catch (er) { - if (options && options.ignoreErrors || er.code === 'EACCES') { - return false - } else { - throw er + else if (Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_4__["isNumeric"])(arguments[2])) { + maxWindowSize = arguments[2]; } - } -} - - -/***/ }), -/* 358 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = isexe -isexe.sync = sync - -var fs = __webpack_require__(23) - -function checkPathExt (path, options) { - var pathext = options.pathExt !== undefined ? - options.pathExt : process.env.PATHEXT - - if (!pathext) { - return true - } - - pathext = pathext.split(';') - if (pathext.indexOf('') !== -1) { - return true - } - for (var i = 0; i < pathext.length; i++) { - var p = pathext[i].toLowerCase() - if (p && path.substr(-p.length).toLowerCase() === p) { - return true + if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_5__["isScheduler"])(arguments[1])) { + scheduler = arguments[1]; } - } - return false -} - -function checkStat (stat, path, options) { - if (!stat.isSymbolicLink() && !stat.isFile()) { - return false - } - return checkPathExt(path, options) -} - -function isexe (path, options, cb) { - fs.stat(path, function (er, stat) { - cb(er, er ? false : checkStat(stat, path, options)) - }) -} - -function sync (path, options) { - return checkStat(fs.statSync(path), path, options) -} - - -/***/ }), -/* 359 */ -/***/ (function(module, exports, __webpack_require__) { - -module.exports = isexe -isexe.sync = sync - -var fs = __webpack_require__(23) - -function isexe (path, options, cb) { - fs.stat(path, function (er, stat) { - cb(er, er ? false : checkStat(stat, options)) - }) + else if (Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_4__["isNumeric"])(arguments[1])) { + windowCreationInterval = arguments[1]; + } + return function windowTimeOperatorFunction(source) { + return source.lift(new WindowTimeOperator(windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler)); + }; } - -function sync (path, options) { - return checkStat(fs.statSync(path), options) +var WindowTimeOperator = /*@__PURE__*/ (function () { + function WindowTimeOperator(windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler) { + this.windowTimeSpan = windowTimeSpan; + this.windowCreationInterval = windowCreationInterval; + this.maxWindowSize = maxWindowSize; + this.scheduler = scheduler; + } + WindowTimeOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new WindowTimeSubscriber(subscriber, this.windowTimeSpan, this.windowCreationInterval, this.maxWindowSize, this.scheduler)); + }; + return WindowTimeOperator; +}()); +var CountedSubject = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](CountedSubject, _super); + function CountedSubject() { + var _this = _super !== null && _super.apply(this, arguments) || this; + _this._numberOfNextedValues = 0; + return _this; + } + CountedSubject.prototype.next = function (value) { + this._numberOfNextedValues++; + _super.prototype.next.call(this, value); + }; + Object.defineProperty(CountedSubject.prototype, "numberOfNextedValues", { + get: function () { + return this._numberOfNextedValues; + }, + enumerable: true, + configurable: true + }); + return CountedSubject; +}(_Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"])); +var WindowTimeSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WindowTimeSubscriber, _super); + function WindowTimeSubscriber(destination, windowTimeSpan, windowCreationInterval, maxWindowSize, scheduler) { + var _this = _super.call(this, destination) || this; + _this.destination = destination; + _this.windowTimeSpan = windowTimeSpan; + _this.windowCreationInterval = windowCreationInterval; + _this.maxWindowSize = maxWindowSize; + _this.scheduler = scheduler; + _this.windows = []; + var window = _this.openWindow(); + if (windowCreationInterval !== null && windowCreationInterval >= 0) { + var closeState = { subscriber: _this, window: window, context: null }; + var creationState = { windowTimeSpan: windowTimeSpan, windowCreationInterval: windowCreationInterval, subscriber: _this, scheduler: scheduler }; + _this.add(scheduler.schedule(dispatchWindowClose, windowTimeSpan, closeState)); + _this.add(scheduler.schedule(dispatchWindowCreation, windowCreationInterval, creationState)); + } + else { + var timeSpanOnlyState = { subscriber: _this, window: window, windowTimeSpan: windowTimeSpan }; + _this.add(scheduler.schedule(dispatchWindowTimeSpanOnly, windowTimeSpan, timeSpanOnlyState)); + } + return _this; + } + WindowTimeSubscriber.prototype._next = function (value) { + var windows = this.windows; + var len = windows.length; + for (var i = 0; i < len; i++) { + var window_1 = windows[i]; + if (!window_1.closed) { + window_1.next(value); + if (window_1.numberOfNextedValues >= this.maxWindowSize) { + this.closeWindow(window_1); + } + } + } + }; + WindowTimeSubscriber.prototype._error = function (err) { + var windows = this.windows; + while (windows.length > 0) { + windows.shift().error(err); + } + this.destination.error(err); + }; + WindowTimeSubscriber.prototype._complete = function () { + var windows = this.windows; + while (windows.length > 0) { + var window_2 = windows.shift(); + if (!window_2.closed) { + window_2.complete(); + } + } + this.destination.complete(); + }; + WindowTimeSubscriber.prototype.openWindow = function () { + var window = new CountedSubject(); + this.windows.push(window); + var destination = this.destination; + destination.next(window); + return window; + }; + WindowTimeSubscriber.prototype.closeWindow = function (window) { + window.complete(); + var windows = this.windows; + windows.splice(windows.indexOf(window), 1); + }; + return WindowTimeSubscriber; +}(_Subscriber__WEBPACK_IMPORTED_MODULE_3__["Subscriber"])); +function dispatchWindowTimeSpanOnly(state) { + var subscriber = state.subscriber, windowTimeSpan = state.windowTimeSpan, window = state.window; + if (window) { + subscriber.closeWindow(window); + } + state.window = subscriber.openWindow(); + this.schedule(state, windowTimeSpan); } - -function checkStat (stat, options) { - return stat.isFile() && checkMode(stat, options) +function dispatchWindowCreation(state) { + var windowTimeSpan = state.windowTimeSpan, subscriber = state.subscriber, scheduler = state.scheduler, windowCreationInterval = state.windowCreationInterval; + var window = subscriber.openWindow(); + var action = this; + var context = { action: action, subscription: null }; + var timeSpanState = { subscriber: subscriber, window: window, context: context }; + context.subscription = scheduler.schedule(dispatchWindowClose, windowTimeSpan, timeSpanState); + action.add(context.subscription); + action.schedule(state, windowCreationInterval); } - -function checkMode (stat, options) { - var mod = stat.mode - var uid = stat.uid - var gid = stat.gid - - var myUid = options.uid !== undefined ? - options.uid : process.getuid && process.getuid() - var myGid = options.gid !== undefined ? - options.gid : process.getgid && process.getgid() - - var u = parseInt('100', 8) - var g = parseInt('010', 8) - var o = parseInt('001', 8) - var ug = u | g - - var ret = (mod & o) || - (mod & g) && gid === myGid || - (mod & u) && uid === myUid || - (mod & ug) && myUid === 0 - - return ret +function dispatchWindowClose(state) { + var subscriber = state.subscriber, window = state.window, context = state.context; + if (context && context.action && context.subscription) { + context.action.remove(context.subscription); + } + subscriber.closeWindow(window); } +//# sourceMappingURL=windowTime.js.map /***/ }), -/* 360 */ -/***/ (function(module, exports, __webpack_require__) { +/* 363 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "windowToggle", function() { return windowToggle; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(187); +/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(177); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(229); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(230); +/** PURE_IMPORTS_START tslib,_Subject,_Subscription,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -const pathKey = (options = {}) => { - const environment = options.env || process.env; - const platform = options.platform || process.platform; - if (platform !== 'win32') { - return 'PATH'; - } - return Object.keys(environment).find(key => key.toUpperCase() === 'PATH') || 'Path'; -}; -module.exports = pathKey; -// TODO: Remove this for the next major release -module.exports.default = pathKey; +function windowToggle(openings, closingSelector) { + return function (source) { return source.lift(new WindowToggleOperator(openings, closingSelector)); }; +} +var WindowToggleOperator = /*@__PURE__*/ (function () { + function WindowToggleOperator(openings, closingSelector) { + this.openings = openings; + this.closingSelector = closingSelector; + } + WindowToggleOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new WindowToggleSubscriber(subscriber, this.openings, this.closingSelector)); + }; + return WindowToggleOperator; +}()); +var WindowToggleSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WindowToggleSubscriber, _super); + function WindowToggleSubscriber(destination, openings, closingSelector) { + var _this = _super.call(this, destination) || this; + _this.openings = openings; + _this.closingSelector = closingSelector; + _this.contexts = []; + _this.add(_this.openSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["subscribeToResult"])(_this, openings, openings)); + return _this; + } + WindowToggleSubscriber.prototype._next = function (value) { + var contexts = this.contexts; + if (contexts) { + var len = contexts.length; + for (var i = 0; i < len; i++) { + contexts[i].window.next(value); + } + } + }; + WindowToggleSubscriber.prototype._error = function (err) { + var contexts = this.contexts; + this.contexts = null; + if (contexts) { + var len = contexts.length; + var index = -1; + while (++index < len) { + var context_1 = contexts[index]; + context_1.window.error(err); + context_1.subscription.unsubscribe(); + } + } + _super.prototype._error.call(this, err); + }; + WindowToggleSubscriber.prototype._complete = function () { + var contexts = this.contexts; + this.contexts = null; + if (contexts) { + var len = contexts.length; + var index = -1; + while (++index < len) { + var context_2 = contexts[index]; + context_2.window.complete(); + context_2.subscription.unsubscribe(); + } + } + _super.prototype._complete.call(this); + }; + WindowToggleSubscriber.prototype._unsubscribe = function () { + var contexts = this.contexts; + this.contexts = null; + if (contexts) { + var len = contexts.length; + var index = -1; + while (++index < len) { + var context_3 = contexts[index]; + context_3.window.unsubscribe(); + context_3.subscription.unsubscribe(); + } + } + }; + WindowToggleSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + if (outerValue === this.openings) { + var closingNotifier = void 0; + try { + var closingSelector = this.closingSelector; + closingNotifier = closingSelector(innerValue); + } + catch (e) { + return this.error(e); + } + var window_1 = new _Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"](); + var subscription = new _Subscription__WEBPACK_IMPORTED_MODULE_2__["Subscription"](); + var context_4 = { window: window_1, subscription: subscription }; + this.contexts.push(context_4); + var innerSubscription = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_4__["subscribeToResult"])(this, closingNotifier, context_4); + if (innerSubscription.closed) { + this.closeWindow(this.contexts.length - 1); + } + else { + innerSubscription.context = context_4; + subscription.add(innerSubscription); + } + this.destination.next(window_1); + } + else { + this.closeWindow(this.contexts.indexOf(outerValue)); + } + }; + WindowToggleSubscriber.prototype.notifyError = function (err) { + this.error(err); + }; + WindowToggleSubscriber.prototype.notifyComplete = function (inner) { + if (inner !== this.openSubscription) { + this.closeWindow(this.contexts.indexOf(inner.context)); + } + }; + WindowToggleSubscriber.prototype.closeWindow = function (index) { + if (index === -1) { + return; + } + var contexts = this.contexts; + var context = contexts[index]; + var window = context.window, subscription = context.subscription; + contexts.splice(index, 1); + window.complete(); + subscription.unsubscribe(); + }; + return WindowToggleSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_3__["OuterSubscriber"])); +//# sourceMappingURL=windowToggle.js.map /***/ }), -/* 361 */ -/***/ (function(module, exports, __webpack_require__) { +/* 364 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "windowWhen", function() { return windowWhen; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); +/* harmony import */ var _Subject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(187); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(229); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(230); +/** PURE_IMPORTS_START tslib,_Subject,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -// See http://www.robvanderwoude.com/escapechars.php -const metaCharsRegExp = /([()\][%!^"`<>&|;, *?])/g; -function escapeCommand(arg) { - // Escape meta chars - arg = arg.replace(metaCharsRegExp, '^$1'); - return arg; +function windowWhen(closingSelector) { + return function windowWhenOperatorFunction(source) { + return source.lift(new WindowOperator(closingSelector)); + }; } - -function escapeArgument(arg, doubleEscapeMetaChars) { - // Convert to string - arg = `${arg}`; - - // Algorithm below is based on https://qntm.org/cmd - - // Sequence of backslashes followed by a double quote: - // double up all the backslashes and escape the double quote - arg = arg.replace(/(\\*)"/g, '$1$1\\"'); - - // Sequence of backslashes followed by the end of the string - // (which will become a double quote later): - // double up all the backslashes - arg = arg.replace(/(\\*)$/, '$1$1'); - - // All other backslashes occur literally - - // Quote the whole thing: - arg = `"${arg}"`; - - // Escape meta chars - arg = arg.replace(metaCharsRegExp, '^$1'); - - // Double escape meta chars if necessary - if (doubleEscapeMetaChars) { - arg = arg.replace(metaCharsRegExp, '^$1'); +var WindowOperator = /*@__PURE__*/ (function () { + function WindowOperator(closingSelector) { + this.closingSelector = closingSelector; } - - return arg; -} - -module.exports.command = escapeCommand; -module.exports.argument = escapeArgument; + WindowOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new WindowSubscriber(subscriber, this.closingSelector)); + }; + return WindowOperator; +}()); +var WindowSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WindowSubscriber, _super); + function WindowSubscriber(destination, closingSelector) { + var _this = _super.call(this, destination) || this; + _this.destination = destination; + _this.closingSelector = closingSelector; + _this.openWindow(); + return _this; + } + WindowSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.openWindow(innerSub); + }; + WindowSubscriber.prototype.notifyError = function (error, innerSub) { + this._error(error); + }; + WindowSubscriber.prototype.notifyComplete = function (innerSub) { + this.openWindow(innerSub); + }; + WindowSubscriber.prototype._next = function (value) { + this.window.next(value); + }; + WindowSubscriber.prototype._error = function (err) { + this.window.error(err); + this.destination.error(err); + this.unsubscribeClosingNotification(); + }; + WindowSubscriber.prototype._complete = function () { + this.window.complete(); + this.destination.complete(); + this.unsubscribeClosingNotification(); + }; + WindowSubscriber.prototype.unsubscribeClosingNotification = function () { + if (this.closingNotification) { + this.closingNotification.unsubscribe(); + } + }; + WindowSubscriber.prototype.openWindow = function (innerSub) { + if (innerSub === void 0) { + innerSub = null; + } + if (innerSub) { + this.remove(innerSub); + innerSub.unsubscribe(); + } + var prevWindow = this.window; + if (prevWindow) { + prevWindow.complete(); + } + var window = this.window = new _Subject__WEBPACK_IMPORTED_MODULE_1__["Subject"](); + this.destination.next(window); + var closingNotifier; + try { + var closingSelector = this.closingSelector; + closingNotifier = closingSelector(); + } + catch (e) { + this.destination.error(e); + this.window.error(e); + return; + } + this.add(this.closingNotification = Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_3__["subscribeToResult"])(this, closingNotifier)); + }; + return WindowSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_2__["OuterSubscriber"])); +//# sourceMappingURL=windowWhen.js.map /***/ }), -/* 362 */ -/***/ (function(module, exports, __webpack_require__) { +/* 365 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "withLatestFrom", function() { return withLatestFrom; }); +/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); +/* harmony import */ var _OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(229); +/* harmony import */ var _util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(230); +/** PURE_IMPORTS_START tslib,_OuterSubscriber,_util_subscribeToResult PURE_IMPORTS_END */ -const fs = __webpack_require__(23); -const shebangCommand = __webpack_require__(363); - -function readShebang(command) { - // Read the first 150 bytes from the file - const size = 150; - const buffer = Buffer.alloc(size); - let fd; - - try { - fd = fs.openSync(command, 'r'); - fs.readSync(fd, buffer, 0, size, 0); - fs.closeSync(fd); - } catch (e) { /* Empty */ } - - // Attempt to extract shebang (null is returned if not a shebang) - return shebangCommand(buffer.toString()); +function withLatestFrom() { + var args = []; + for (var _i = 0; _i < arguments.length; _i++) { + args[_i] = arguments[_i]; + } + return function (source) { + var project; + if (typeof args[args.length - 1] === 'function') { + project = args.pop(); + } + var observables = args; + return source.lift(new WithLatestFromOperator(observables, project)); + }; } - -module.exports = readShebang; +var WithLatestFromOperator = /*@__PURE__*/ (function () { + function WithLatestFromOperator(observables, project) { + this.observables = observables; + this.project = project; + } + WithLatestFromOperator.prototype.call = function (subscriber, source) { + return source.subscribe(new WithLatestFromSubscriber(subscriber, this.observables, this.project)); + }; + return WithLatestFromOperator; +}()); +var WithLatestFromSubscriber = /*@__PURE__*/ (function (_super) { + tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](WithLatestFromSubscriber, _super); + function WithLatestFromSubscriber(destination, observables, project) { + var _this = _super.call(this, destination) || this; + _this.observables = observables; + _this.project = project; + _this.toRespond = []; + var len = observables.length; + _this.values = new Array(len); + for (var i = 0; i < len; i++) { + _this.toRespond.push(i); + } + for (var i = 0; i < len; i++) { + var observable = observables[i]; + _this.add(Object(_util_subscribeToResult__WEBPACK_IMPORTED_MODULE_2__["subscribeToResult"])(_this, observable, observable, i)); + } + return _this; + } + WithLatestFromSubscriber.prototype.notifyNext = function (outerValue, innerValue, outerIndex, innerIndex, innerSub) { + this.values[outerIndex] = innerValue; + var toRespond = this.toRespond; + if (toRespond.length > 0) { + var found = toRespond.indexOf(outerIndex); + if (found !== -1) { + toRespond.splice(found, 1); + } + } + }; + WithLatestFromSubscriber.prototype.notifyComplete = function () { + }; + WithLatestFromSubscriber.prototype._next = function (value) { + if (this.toRespond.length === 0) { + var args = [value].concat(this.values); + if (this.project) { + this._tryProject(args); + } + else { + this.destination.next(args); + } + } + }; + WithLatestFromSubscriber.prototype._tryProject = function (args) { + var result; + try { + result = this.project.apply(this, args); + } + catch (err) { + this.destination.error(err); + return; + } + this.destination.next(result); + }; + return WithLatestFromSubscriber; +}(_OuterSubscriber__WEBPACK_IMPORTED_MODULE_1__["OuterSubscriber"])); +//# sourceMappingURL=withLatestFrom.js.map /***/ }), -/* 363 */ -/***/ (function(module, exports, __webpack_require__) { +/* 366 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "zip", function() { return zip; }); +/* harmony import */ var _observable_zip__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(269); +/** PURE_IMPORTS_START _observable_zip PURE_IMPORTS_END */ -const shebangRegex = __webpack_require__(364); - -module.exports = (string = '') => { - const match = string.match(shebangRegex); - - if (!match) { - return null; - } - - const [path, argument] = match[0].replace(/#! ?/, '').split(' '); - const binary = path.split('/').pop(); - - if (binary === 'env') { - return argument; - } - - return argument ? `${binary} ${argument}` : binary; -}; +function zip() { + var observables = []; + for (var _i = 0; _i < arguments.length; _i++) { + observables[_i] = arguments[_i]; + } + return function zipOperatorFunction(source) { + return source.lift.call(_observable_zip__WEBPACK_IMPORTED_MODULE_0__["zip"].apply(void 0, [source].concat(observables))); + }; +} +//# sourceMappingURL=zip.js.map /***/ }), -/* 364 */ -/***/ (function(module, exports, __webpack_require__) { +/* 367 */ +/***/ (function(module, __webpack_exports__, __webpack_require__) { "use strict"; +__webpack_require__.r(__webpack_exports__); +/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "zipAll", function() { return zipAll; }); +/* harmony import */ var _observable_zip__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(269); +/** PURE_IMPORTS_START _observable_zip PURE_IMPORTS_END */ -module.exports = /^#!(.*)/; +function zipAll(project) { + return function (source) { return source.lift(new _observable_zip__WEBPACK_IMPORTED_MODULE_0__["ZipOperator"](project)); }; +} +//# sourceMappingURL=zipAll.js.map /***/ }), -/* 365 */ +/* 368 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const isWin = process.platform === 'win32'; - -function notFoundError(original, syscall) { - return Object.assign(new Error(`${syscall} ${original.command} ENOENT`), { - code: 'ENOENT', - errno: 'ENOENT', - syscall: `${syscall} ${original.command}`, - path: original.command, - spawnargs: original.args, - }); -} - -function hookChildProcess(cp, parsed) { - if (!isWin) { - return; - } +const callbacks = new Set(); +let called = false; - const originalEmit = cp.emit; +function exit(exit, signal) { + if (called) { + return; + } - cp.emit = function (name, arg1) { - // If emitting "exit" event and exit code is 1, we need to check if - // the command exists and emit an "error" instead - // See https://github.com/IndigoUnited/node-cross-spawn/issues/16 - if (name === 'exit') { - const err = verifyENOENT(arg1, parsed, 'spawn'); + called = true; - if (err) { - return originalEmit.call(cp, 'error', err); - } - } + for (const callback of callbacks) { + callback(); + } - return originalEmit.apply(cp, arguments); // eslint-disable-line prefer-rest-params - }; + if (exit === true) { + process.exit(128 + signal); // eslint-disable-line unicorn/no-process-exit + } } -function verifyENOENT(status, parsed) { - if (isWin && status === 1 && !parsed.file) { - return notFoundError(parsed.original, 'spawn'); - } - - return null; -} +module.exports = callback => { + callbacks.add(callback); -function verifyENOENTSync(status, parsed) { - if (isWin && status === 1 && !parsed.file) { - return notFoundError(parsed.original, 'spawnSync'); - } + if (callbacks.size === 1) { + process.once('exit', exit); + process.once('SIGINT', exit.bind(null, true, 2)); + process.once('SIGTERM', exit.bind(null, true, 15)); - return null; -} + // PM2 Cluster shutdown message. Caught to support async handlers with pm2, needed because + // explicitly calling process.exit() doesn't trigger the beforeExit event, and the exit + // event cannot support async handlers, since the event loop is never called after it. + process.on('message', message => { + if (message === 'shutdown') { + exit(true, -128); + } + }); + } -module.exports = { - hookChildProcess, - verifyENOENT, - verifyENOENTSync, - notFoundError, + return () => { + callbacks.delete(callback); + }; }; /***/ }), -/* 366 */ +/* 369 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const $isCliError = Symbol('isCliError'); +function createCliError(message) { + const error = new Error(message); + error[$isCliError] = true; + return error; +} +exports.createCliError = createCliError; +function isCliError(error) { + return error && !!error[$isCliError]; +} +exports.isCliError = isCliError; -module.exports = input => { - const LF = typeof input === 'string' ? '\n' : '\n'.charCodeAt(); - const CR = typeof input === 'string' ? '\r' : '\r'.charCodeAt(); - if (input[input.length - 1] === LF) { - input = input.slice(0, input.length - 1); - } +/***/ }), +/* 370 */ +/***/ (function(module, exports, __webpack_require__) { - if (input[input.length - 1] === CR) { - input = input.slice(0, input.length - 1); - } +"use strict"; - return input; -}; +/* + * Licensed to Elasticsearch B.V. under one or more contributor + * license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright + * ownership. Elasticsearch B.V. licenses this file to you under + * the Apache License, Version 2.0 (the "License"); you may + * not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +Object.defineProperty(exports, "__esModule", { value: true }); +const tslib_1 = __webpack_require__(36); +const execa_1 = tslib_1.__importDefault(__webpack_require__(371)); +const fs_1 = __webpack_require__(23); +const Rx = tslib_1.__importStar(__webpack_require__(169)); +const operators_1 = __webpack_require__(270); +const chalk_1 = tslib_1.__importDefault(__webpack_require__(2)); +const tree_kill_1 = tslib_1.__importDefault(__webpack_require__(411)); +const util_1 = __webpack_require__(29); +const treeKillAsync = util_1.promisify((...args) => tree_kill_1.default(...args)); +const observe_lines_1 = __webpack_require__(412); +const errors_1 = __webpack_require__(369); +const SECOND = 1000; +const STOP_TIMEOUT = 30 * SECOND; +async function withTimeout(attempt, ms, onTimeout) { + const TIMEOUT = Symbol('timeout'); + try { + await Promise.race([ + attempt(), + new Promise((_, reject) => setTimeout(() => reject(TIMEOUT), ms)), + ]); + } + catch (error) { + if (error === TIMEOUT) { + await onTimeout(); + } + else { + throw error; + } + } +} +function startProc(name, options, log) { + const { cmd, args, cwd, env, stdin } = options; + log.info('[%s] > %s', name, cmd, args.join(' ')); + // spawn fails with ENOENT when either the + // cmd or cwd don't exist, so we check for the cwd + // ahead of time so that the error is less ambiguous + try { + if (!fs_1.statSync(cwd).isDirectory()) { + throw new Error(`cwd "${cwd}" exists but is not a directory`); + } + } + catch (err) { + if (err.code === 'ENOENT') { + throw new Error(`cwd "${cwd}" does not exist`); + } + } + const childProcess = execa_1.default(cmd, args, { + cwd, + env, + stdio: ['pipe', 'pipe', 'pipe'], + preferLocal: true, + }); + if (stdin) { + childProcess.stdin.end(stdin, 'utf8'); + } + else { + childProcess.stdin.end(); + } + let stopCalled = false; + const outcome$ = Rx.race( + // observe first exit event + Rx.fromEvent(childProcess, 'exit').pipe(operators_1.take(1), operators_1.map(([code]) => { + if (stopCalled) { + return null; + } + // JVM exits with 143 on SIGTERM and 130 on SIGINT, dont' treat then as errors + if (code > 0 && !(code === 143 || code === 130)) { + throw errors_1.createCliError(`[${name}] exited with code ${code}`); + } + return code; + })), + // observe first error event + Rx.fromEvent(childProcess, 'error').pipe(operators_1.take(1), operators_1.mergeMap(err => Rx.throwError(err)))).pipe(operators_1.share()); + const lines$ = Rx.merge(observe_lines_1.observeLines(childProcess.stdout), observe_lines_1.observeLines(childProcess.stderr)).pipe(operators_1.tap(line => log.write(` ${chalk_1.default.gray('proc')} [${chalk_1.default.gray(name)}] ${line}`)), operators_1.share()); + const outcomePromise = Rx.merge(lines$.pipe(operators_1.ignoreElements()), outcome$).toPromise(); + async function stop(signal) { + if (stopCalled) { + return; + } + stopCalled = true; + await withTimeout(async () => { + log.debug(`Sending "${signal}" to proc "${name}"`); + await treeKillAsync(childProcess.pid, signal); + await outcomePromise; + }, STOP_TIMEOUT, async () => { + log.warning(`Proc "${name}" was sent "${signal}" didn't emit the "exit" or "error" events after ${STOP_TIMEOUT} ms, sending SIGKILL`); + await treeKillAsync(childProcess.pid, 'SIGKILL'); + }); + await withTimeout(async () => { + try { + await outcomePromise; + } + catch (error) { + // ignore + } + }, STOP_TIMEOUT, async () => { + throw new Error(`Proc "${name}" was stopped but never emitted either the "exit" or "error" event after ${STOP_TIMEOUT} ms`); + }); + } + return { + name, + lines$, + outcome$, + outcomePromise, + stop, + }; +} +exports.startProc = startProc; /***/ }), -/* 367 */ +/* 371 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; const path = __webpack_require__(16); -const pathKey = __webpack_require__(360); +const childProcess = __webpack_require__(372); +const crossSpawn = __webpack_require__(373); +const stripFinalNewline = __webpack_require__(386); +const npmRunPath = __webpack_require__(387); +const onetime = __webpack_require__(388); +const makeError = __webpack_require__(390); +const normalizeStdio = __webpack_require__(395); +const {spawnedKill, spawnedCancel, setupTimeout, setExitHandler} = __webpack_require__(396); +const {handleInput, getSpawnedResult, makeAllStream, validateInputSync} = __webpack_require__(400); +const {mergePromise, getSpawnedPromise} = __webpack_require__(409); +const {joinCommand, parseCommand} = __webpack_require__(410); -const npmRunPath = options => { - options = { - cwd: process.cwd(), - path: process.env[pathKey()], - execPath: process.execPath, - ...options - }; +const DEFAULT_MAX_BUFFER = 1000 * 1000 * 100; - let previous; - let cwdPath = path.resolve(options.cwd); - const result = []; +const getEnv = ({env: envOption, extendEnv, preferLocal, localDir, execPath}) => { + const env = extendEnv ? {...process.env, ...envOption} : envOption; - while (previous !== cwdPath) { - result.push(path.join(cwdPath, 'node_modules/.bin')); - previous = cwdPath; - cwdPath = path.resolve(cwdPath, '..'); + if (preferLocal) { + return npmRunPath.env({env, cwd: localDir, execPath}); } - // Ensure the running `node` binary is used - const execPathDir = path.resolve(options.cwd, options.execPath, '..'); - result.unshift(execPathDir); - - return result.concat(options.path).join(path.delimiter); + return env; }; -module.exports = npmRunPath; -// TODO: Remove this for the next major release -module.exports.default = npmRunPath; +const handleArgs = (file, args, options = {}) => { + const parsed = crossSpawn._parse(file, args, options); + file = parsed.command; + args = parsed.args; + options = parsed.options; -module.exports.env = options => { options = { - env: process.env, + maxBuffer: DEFAULT_MAX_BUFFER, + buffer: true, + stripFinalNewline: true, + extendEnv: true, + preferLocal: false, + localDir: options.cwd || process.cwd(), + execPath: process.execPath, + encoding: 'utf8', + reject: true, + cleanup: true, + all: false, + windowsHide: true, ...options }; - const env = {...options.env}; - const path = pathKey({env}); + options.env = getEnv(options); - options.path = env[path]; - env[path] = module.exports(options); + options.stdio = normalizeStdio(options); - return env; -}; + if (process.platform === 'win32' && path.basename(file, '.exe') === 'cmd') { + // #116 + args.unshift('/q'); + } + return {file, args, options, parsed}; +}; -/***/ }), -/* 368 */ -/***/ (function(module, exports, __webpack_require__) { +const handleOutput = (options, value, error) => { + if (typeof value !== 'string' && !Buffer.isBuffer(value)) { + // When `execa.sync()` errors, we normalize it to '' to mimic `execa()` + return error === undefined ? undefined : ''; + } -"use strict"; + if (options.stripFinalNewline) { + return stripFinalNewline(value); + } -const mimicFn = __webpack_require__(369); + return value; +}; -const calledFunctions = new WeakMap(); +const execa = (file, args, options) => { + const parsed = handleArgs(file, args, options); + const command = joinCommand(file, args); -const oneTime = (fn, options = {}) => { - if (typeof fn !== 'function') { - throw new TypeError('Expected a function'); + let spawned; + try { + spawned = childProcess.spawn(parsed.file, parsed.args, parsed.options); + } catch (error) { + // Ensure the returned error is always both a promise and a child process + const dummySpawned = new childProcess.ChildProcess(); + const errorPromise = Promise.reject(makeError({ + error, + stdout: '', + stderr: '', + all: '', + command, + parsed, + timedOut: false, + isCanceled: false, + killed: false + })); + return mergePromise(dummySpawned, errorPromise); } - let ret; - let isCalled = false; - let callCount = 0; - const functionName = fn.displayName || fn.name || ''; + const spawnedPromise = getSpawnedPromise(spawned); + const timedPromise = setupTimeout(spawned, parsed.options, spawnedPromise); + const processDone = setExitHandler(spawned, parsed.options, timedPromise); - const onetime = function (...args) { - calledFunctions.set(onetime, ++callCount); + const context = {isCanceled: false}; - if (isCalled) { - if (options.throw === true) { - throw new Error(`Function \`${functionName}\` can only be called once`); - } + spawned.kill = spawnedKill.bind(null, spawned.kill.bind(spawned)); + spawned.cancel = spawnedCancel.bind(null, spawned, context); - return ret; - } + const handlePromise = async () => { + const [{error, exitCode, signal, timedOut}, stdoutResult, stderrResult, allResult] = await getSpawnedResult(spawned, parsed.options, processDone); + const stdout = handleOutput(parsed.options, stdoutResult); + const stderr = handleOutput(parsed.options, stderrResult); + const all = handleOutput(parsed.options, allResult); - isCalled = true; - ret = fn.apply(this, args); - fn = null; + if (error || exitCode !== 0 || signal !== null) { + const returnedError = makeError({ + error, + exitCode, + signal, + stdout, + stderr, + all, + command, + parsed, + timedOut, + isCanceled: context.isCanceled, + killed: spawned.killed + }); - return ret; + if (!parsed.options.reject) { + return returnedError; + } + + throw returnedError; + } + + return { + command, + exitCode: 0, + stdout, + stderr, + all, + failed: false, + timedOut: false, + isCanceled: false, + killed: false + }; }; - mimicFn(onetime, fn); - calledFunctions.set(onetime, callCount); + const handlePromiseOnce = onetime(handlePromise); - return onetime; -}; + crossSpawn._enoent.hookChildProcess(spawned, parsed.parsed); -module.exports = oneTime; -// TODO: Remove this for the next major release -module.exports.default = oneTime; + handleInput(spawned, parsed.options.input); -module.exports.callCount = fn => { - if (!calledFunctions.has(fn)) { - throw new Error(`The given function \`${fn.name}\` is not wrapped by the \`onetime\` package`); - } + spawned.all = makeAllStream(spawned, parsed.options); - return calledFunctions.get(fn); + return mergePromise(spawned, handlePromiseOnce); }; +module.exports = execa; -/***/ }), -/* 369 */ -/***/ (function(module, exports, __webpack_require__) { +module.exports.sync = (file, args, options) => { + const parsed = handleArgs(file, args, options); + const command = joinCommand(file, args); -"use strict"; + validateInputSync(parsed.options); + + let result; + try { + result = childProcess.spawnSync(parsed.file, parsed.args, parsed.options); + } catch (error) { + throw makeError({ + error, + stdout: '', + stderr: '', + all: '', + command, + parsed, + timedOut: false, + isCanceled: false, + killed: false + }); + } + const stdout = handleOutput(parsed.options, result.stdout, result.error); + const stderr = handleOutput(parsed.options, result.stderr, result.error); -const mimicFn = (to, from) => { - for (const prop of Reflect.ownKeys(from)) { - Object.defineProperty(to, prop, Object.getOwnPropertyDescriptor(from, prop)); + if (result.error || result.status !== 0 || result.signal !== null) { + const error = makeError({ + stdout, + stderr, + error: result.error, + signal: result.signal, + exitCode: result.status, + command, + parsed, + timedOut: result.error && result.error.code === 'ETIMEDOUT', + isCanceled: false, + killed: result.signal !== null + }); + + if (!parsed.options.reject) { + return error; + } + + throw error; } - return to; + return { + command, + exitCode: 0, + stdout, + stderr, + failed: false, + timedOut: false, + isCanceled: false, + killed: false + }; }; -module.exports = mimicFn; -// TODO: Remove this for the next major release -module.exports.default = mimicFn; +module.exports.command = (command, options) => { + const [file, ...args] = parseCommand(command); + return execa(file, args, options); +}; +module.exports.commandSync = (command, options) => { + const [file, ...args] = parseCommand(command); + return execa.sync(file, args, options); +}; -/***/ }), -/* 370 */ -/***/ (function(module, exports, __webpack_require__) { +module.exports.node = (scriptPath, args, options = {}) => { + if (args && !Array.isArray(args) && typeof args === 'object') { + options = args; + args = []; + } -"use strict"; + const stdio = normalizeStdio.node(options); -const {signalsByName} = __webpack_require__(371); + const {nodePath = process.execPath, nodeOptions = process.execArgv} = options; -const getErrorPrefix = ({timedOut, timeout, errorCode, signal, signalDescription, exitCode, isCanceled}) => { - if (timedOut) { - return `timed out after ${timeout} milliseconds`; - } + return execa( + nodePath, + [ + ...nodeOptions, + scriptPath, + ...(Array.isArray(args) ? args : []) + ], + { + ...options, + stdin: undefined, + stdout: undefined, + stderr: undefined, + stdio, + shell: false + } + ); +}; - if (isCanceled) { - return 'was canceled'; - } - if (errorCode !== undefined) { - return `failed with ${errorCode}`; - } +/***/ }), +/* 372 */ +/***/ (function(module, exports) { - if (signal !== undefined) { - return `was killed with ${signal} (${signalDescription})`; - } +module.exports = require("child_process"); - if (exitCode !== undefined) { - return `failed with exit code ${exitCode}`; - } +/***/ }), +/* 373 */ +/***/ (function(module, exports, __webpack_require__) { - return 'failed'; -}; +"use strict"; -const makeError = ({ - stdout, - stderr, - all, - error, - signal, - exitCode, - command, - timedOut, - isCanceled, - killed, - parsed: {options: {timeout}} -}) => { - // `signal` and `exitCode` emitted on `spawned.on('exit')` event can be `null`. - // We normalize them to `undefined` - exitCode = exitCode === null ? undefined : exitCode; - signal = signal === null ? undefined : signal; - const signalDescription = signal === undefined ? undefined : signalsByName[signal].description; - const errorCode = error && error.code; +const cp = __webpack_require__(372); +const parse = __webpack_require__(374); +const enoent = __webpack_require__(385); - const prefix = getErrorPrefix({timedOut, timeout, errorCode, signal, signalDescription, exitCode, isCanceled}); - const execaMessage = `Command ${prefix}: ${command}`; - const shortMessage = error instanceof Error ? `${execaMessage}\n${error.message}` : execaMessage; - const message = [shortMessage, stderr, stdout].filter(Boolean).join('\n'); +function spawn(command, args, options) { + // Parse the arguments + const parsed = parse(command, args, options); - if (error instanceof Error) { - error.originalMessage = error.message; - error.message = message; - } else { - error = new Error(message); - } + // Spawn the child process + const spawned = cp.spawn(parsed.command, parsed.args, parsed.options); - error.shortMessage = shortMessage; - error.command = command; - error.exitCode = exitCode; - error.signal = signal; - error.signalDescription = signalDescription; - error.stdout = stdout; - error.stderr = stderr; + // Hook into child process "exit" event to emit an error if the command + // does not exists, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16 + enoent.hookChildProcess(spawned, parsed); - if (all !== undefined) { - error.all = all; - } + return spawned; +} - if ('bufferedData' in error) { - delete error.bufferedData; - } +function spawnSync(command, args, options) { + // Parse the arguments + const parsed = parse(command, args, options); - error.failed = true; - error.timedOut = Boolean(timedOut); - error.isCanceled = isCanceled; - error.killed = killed && !timedOut; + // Spawn the child process + const result = cp.spawnSync(parsed.command, parsed.args, parsed.options); - return error; -}; + // Analyze if the command does not exist, see: https://github.com/IndigoUnited/node-cross-spawn/issues/16 + result.error = result.error || enoent.verifyENOENTSync(result.status, parsed); -module.exports = makeError; + return result; +} + +module.exports = spawn; +module.exports.spawn = spawn; +module.exports.sync = spawnSync; + +module.exports._parse = parse; +module.exports._enoent = enoent; /***/ }), -/* 371 */ +/* 374 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -Object.defineProperty(exports,"__esModule",{value:true});exports.signalsByNumber=exports.signalsByName=void 0;var _os=__webpack_require__(11); -var _signals=__webpack_require__(372); -var _realtime=__webpack_require__(374); +const path = __webpack_require__(16); +const resolveCommand = __webpack_require__(375); +const escape = __webpack_require__(381); +const readShebang = __webpack_require__(382); +const isWin = process.platform === 'win32'; +const isExecutableRegExp = /\.(?:com|exe)$/i; +const isCmdShimRegExp = /node_modules[\\/].bin[\\/][^\\/]+\.cmd$/i; -const getSignalsByName=function(){ -const signals=(0,_signals.getSignals)(); -return signals.reduce(getSignalByName,{}); -}; +function detectShebang(parsed) { + parsed.file = resolveCommand(parsed); -const getSignalByName=function( -signalByNameMemo, -{name,number,description,supported,action,forced,standard}) -{ -return{ -...signalByNameMemo, -[name]:{name,number,description,supported,action,forced,standard}}; + const shebang = parsed.file && readShebang(parsed.file); -}; + if (shebang) { + parsed.args.unshift(parsed.file); + parsed.command = shebang; -const signalsByName=getSignalsByName();exports.signalsByName=signalsByName; + return resolveCommand(parsed); + } + return parsed.file; +} +function parseNonShell(parsed) { + if (!isWin) { + return parsed; + } + // Detect & add support for shebangs + const commandFile = detectShebang(parsed); -const getSignalsByNumber=function(){ -const signals=(0,_signals.getSignals)(); -const length=_realtime.SIGRTMAX+1; -const signalsA=Array.from({length},(value,number)=> -getSignalByNumber(number,signals)); + // We don't need a shell if the command filename is an executable + const needsShell = !isExecutableRegExp.test(commandFile); -return Object.assign({},...signalsA); -}; + // If a shell is required, use cmd.exe and take care of escaping everything correctly + // Note that `forceShell` is an hidden option used only in tests + if (parsed.options.forceShell || needsShell) { + // Need to double escape meta chars if the command is a cmd-shim located in `node_modules/.bin/` + // The cmd-shim simply calls execute the package bin file with NodeJS, proxying any argument + // Because the escape of metachars with ^ gets interpreted when the cmd.exe is first called, + // we need to double escape them + const needsDoubleEscapeMetaChars = isCmdShimRegExp.test(commandFile); -const getSignalByNumber=function(number,signals){ -const signal=findSignalByNumber(number,signals); + // Normalize posix paths into OS compatible paths (e.g.: foo/bar -> foo\bar) + // This is necessary otherwise it will always fail with ENOENT in those cases + parsed.command = path.normalize(parsed.command); -if(signal===undefined){ -return{}; -} + // Escape command & arguments + parsed.command = escape.command(parsed.command); + parsed.args = parsed.args.map((arg) => escape.argument(arg, needsDoubleEscapeMetaChars)); -const{name,description,supported,action,forced,standard}=signal; -return{ -[number]:{ -name, -number, -description, -supported, -action, -forced, -standard}}; + const shellCommand = [parsed.command].concat(parsed.args).join(' '); + parsed.args = ['/d', '/s', '/c', `"${shellCommand}"`]; + parsed.command = process.env.comspec || 'cmd.exe'; + parsed.options.windowsVerbatimArguments = true; // Tell node's spawn that the arguments are already escaped + } -}; + return parsed; +} +function parse(command, args, options) { + // Normalize arguments, similar to nodejs + if (args && !Array.isArray(args)) { + options = args; + args = null; + } + args = args ? args.slice(0) : []; // Clone array to avoid changing the original + options = Object.assign({}, options); // Clone object to avoid changing the original -const findSignalByNumber=function(number,signals){ -const signal=signals.find(({name})=>_os.constants.signals[name]===number); + // Build our parsed object + const parsed = { + command, + args, + options, + file: undefined, + original: { + command, + args, + }, + }; -if(signal!==undefined){ -return signal; + // Delegate further parsing to shell or non-shell + return options.shell ? parsed : parseNonShell(parsed); } -return signals.find(signalA=>signalA.number===number); -}; +module.exports = parse; -const signalsByNumber=getSignalsByNumber();exports.signalsByNumber=signalsByNumber; -//# sourceMappingURL=main.js.map /***/ }), -/* 372 */ +/* 375 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -Object.defineProperty(exports,"__esModule",{value:true});exports.getSignals=void 0;var _os=__webpack_require__(11); -var _core=__webpack_require__(373); -var _realtime=__webpack_require__(374); +const path = __webpack_require__(16); +const which = __webpack_require__(376); +const pathKey = __webpack_require__(380)(); +function resolveCommandAttempt(parsed, withoutPathExt) { + const cwd = process.cwd(); + const hasCustomCwd = parsed.options.cwd != null; + // Worker threads do not have process.chdir() + const shouldSwitchCwd = hasCustomCwd && process.chdir !== undefined; -const getSignals=function(){ -const realtimeSignals=(0,_realtime.getRealtimeSignals)(); -const signals=[..._core.SIGNALS,...realtimeSignals].map(normalizeSignal); -return signals; -};exports.getSignals=getSignals; + // If a custom `cwd` was specified, we need to change the process cwd + // because `which` will do stat calls but does not support a custom cwd + if (shouldSwitchCwd) { + try { + process.chdir(parsed.options.cwd); + } catch (err) { + /* Empty */ + } + } + let resolved; + try { + resolved = which.sync(parsed.command, { + path: (parsed.options.env || process.env)[pathKey], + pathExt: withoutPathExt ? path.delimiter : undefined, + }); + } catch (e) { + /* Empty */ + } finally { + if (shouldSwitchCwd) { + process.chdir(cwd); + } + } + // If we successfully resolved, ensure that an absolute path is returned + // Note that when a custom `cwd` was used, we need to resolve to an absolute path based on it + if (resolved) { + resolved = path.resolve(hasCustomCwd ? parsed.options.cwd : '', resolved); + } + return resolved; +} +function resolveCommand(parsed) { + return resolveCommandAttempt(parsed) || resolveCommandAttempt(parsed, true); +} +module.exports = resolveCommand; -const normalizeSignal=function({ -name, -number:defaultNumber, -description, -action, -forced=false, -standard}) -{ -const{ -signals:{[name]:constantSignal}}= -_os.constants; -const supported=constantSignal!==undefined; -const number=supported?constantSignal:defaultNumber; -return{name,number,description,supported,action,forced,standard}; -}; -//# sourceMappingURL=signals.js.map /***/ }), -/* 373 */ +/* 376 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; -Object.defineProperty(exports,"__esModule",{value:true});exports.SIGNALS=void 0; - -const SIGNALS=[ -{ -name:"SIGHUP", -number:1, -action:"terminate", -description:"Terminal closed", -standard:"posix"}, +const isWindows = process.platform === 'win32' || + process.env.OSTYPE === 'cygwin' || + process.env.OSTYPE === 'msys' -{ -name:"SIGINT", -number:2, -action:"terminate", -description:"User interruption with CTRL-C", -standard:"ansi"}, +const path = __webpack_require__(16) +const COLON = isWindows ? ';' : ':' +const isexe = __webpack_require__(377) -{ -name:"SIGQUIT", -number:3, -action:"core", -description:"User interruption with CTRL-\\", -standard:"posix"}, +const getNotFoundError = (cmd) => + Object.assign(new Error(`not found: ${cmd}`), { code: 'ENOENT' }) -{ -name:"SIGILL", -number:4, -action:"core", -description:"Invalid machine instruction", -standard:"ansi"}, +const getPathInfo = (cmd, opt) => { + const colon = opt.colon || COLON -{ -name:"SIGTRAP", -number:5, -action:"core", -description:"Debugger breakpoint", -standard:"posix"}, + // If it has a slash, then we don't bother searching the pathenv. + // just check the file itself, and that's it. + const pathEnv = cmd.match(/\//) || isWindows && cmd.match(/\\/) ? [''] + : ( + [ + // windows always checks the cwd first + ...(isWindows ? [process.cwd()] : []), + ...(opt.path || process.env.PATH || + /* istanbul ignore next: very unusual */ '').split(colon), + ] + ) + const pathExtExe = isWindows + ? opt.pathExt || process.env.PATHEXT || '.EXE;.CMD;.BAT;.COM' + : '' + const pathExt = isWindows ? pathExtExe.split(colon) : [''] -{ -name:"SIGABRT", -number:6, -action:"core", -description:"Aborted", -standard:"ansi"}, + if (isWindows) { + if (cmd.indexOf('.') !== -1 && pathExt[0] !== '') + pathExt.unshift('') + } -{ -name:"SIGIOT", -number:6, -action:"core", -description:"Aborted", -standard:"bsd"}, + return { + pathEnv, + pathExt, + pathExtExe, + } +} -{ -name:"SIGBUS", -number:7, -action:"core", -description: -"Bus error due to misaligned, non-existing address or paging error", -standard:"bsd"}, +const which = (cmd, opt, cb) => { + if (typeof opt === 'function') { + cb = opt + opt = {} + } + if (!opt) + opt = {} -{ -name:"SIGEMT", -number:7, -action:"terminate", -description:"Command should be emulated but is not implemented", -standard:"other"}, + const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt) + const found = [] -{ -name:"SIGFPE", -number:8, -action:"core", -description:"Floating point arithmetic error", -standard:"ansi"}, + const step = i => new Promise((resolve, reject) => { + if (i === pathEnv.length) + return opt.all && found.length ? resolve(found) + : reject(getNotFoundError(cmd)) -{ -name:"SIGKILL", -number:9, -action:"terminate", -description:"Forced termination", -standard:"posix", -forced:true}, + const ppRaw = pathEnv[i] + const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw -{ -name:"SIGUSR1", -number:10, -action:"terminate", -description:"Application-specific signal", -standard:"posix"}, + const pCmd = path.join(pathPart, cmd) + const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd + : pCmd -{ -name:"SIGSEGV", -number:11, -action:"core", -description:"Segmentation fault", -standard:"ansi"}, + resolve(subStep(p, i, 0)) + }) -{ -name:"SIGUSR2", -number:12, -action:"terminate", -description:"Application-specific signal", -standard:"posix"}, + const subStep = (p, i, ii) => new Promise((resolve, reject) => { + if (ii === pathExt.length) + return resolve(step(i + 1)) + const ext = pathExt[ii] + isexe(p + ext, { pathExt: pathExtExe }, (er, is) => { + if (!er && is) { + if (opt.all) + found.push(p + ext) + else + return resolve(p + ext) + } + return resolve(subStep(p, i, ii + 1)) + }) + }) -{ -name:"SIGPIPE", -number:13, -action:"terminate", -description:"Broken pipe or socket", -standard:"posix"}, + return cb ? step(0).then(res => cb(null, res), cb) : step(0) +} -{ -name:"SIGALRM", -number:14, -action:"terminate", -description:"Timeout or timer", -standard:"posix"}, +const whichSync = (cmd, opt) => { + opt = opt || {} -{ -name:"SIGTERM", -number:15, -action:"terminate", -description:"Termination", -standard:"ansi"}, + const { pathEnv, pathExt, pathExtExe } = getPathInfo(cmd, opt) + const found = [] -{ -name:"SIGSTKFLT", -number:16, -action:"terminate", -description:"Stack is empty or overflowed", -standard:"other"}, + for (let i = 0; i < pathEnv.length; i ++) { + const ppRaw = pathEnv[i] + const pathPart = /^".*"$/.test(ppRaw) ? ppRaw.slice(1, -1) : ppRaw -{ -name:"SIGCHLD", -number:17, -action:"ignore", -description:"Child process terminated, paused or unpaused", -standard:"posix"}, + const pCmd = path.join(pathPart, cmd) + const p = !pathPart && /^\.[\\\/]/.test(cmd) ? cmd.slice(0, 2) + pCmd + : pCmd -{ -name:"SIGCLD", -number:17, -action:"ignore", -description:"Child process terminated, paused or unpaused", -standard:"other"}, + for (let j = 0; j < pathExt.length; j ++) { + const cur = p + pathExt[j] + try { + const is = isexe.sync(cur, { pathExt: pathExtExe }) + if (is) { + if (opt.all) + found.push(cur) + else + return cur + } + } catch (ex) {} + } + } -{ -name:"SIGCONT", -number:18, -action:"unpause", -description:"Unpaused", -standard:"posix", -forced:true}, + if (opt.all && found.length) + return found -{ -name:"SIGSTOP", -number:19, -action:"pause", -description:"Paused", -standard:"posix", -forced:true}, + if (opt.nothrow) + return null -{ -name:"SIGTSTP", -number:20, -action:"pause", -description:"Paused using CTRL-Z or \"suspend\"", -standard:"posix"}, + throw getNotFoundError(cmd) +} -{ -name:"SIGTTIN", -number:21, -action:"pause", -description:"Background process cannot read terminal input", -standard:"posix"}, +module.exports = which +which.sync = whichSync -{ -name:"SIGBREAK", -number:21, -action:"terminate", -description:"User interruption with CTRL-BREAK", -standard:"other"}, -{ -name:"SIGTTOU", -number:22, -action:"pause", -description:"Background process cannot write to terminal output", -standard:"posix"}, +/***/ }), +/* 377 */ +/***/ (function(module, exports, __webpack_require__) { -{ -name:"SIGURG", -number:23, -action:"ignore", -description:"Socket received out-of-band data", -standard:"bsd"}, +var fs = __webpack_require__(23) +var core +if (process.platform === 'win32' || global.TESTING_WINDOWS) { + core = __webpack_require__(378) +} else { + core = __webpack_require__(379) +} -{ -name:"SIGXCPU", -number:24, -action:"core", -description:"Process timed out", -standard:"bsd"}, +module.exports = isexe +isexe.sync = sync -{ -name:"SIGXFSZ", -number:25, -action:"core", -description:"File too big", -standard:"bsd"}, +function isexe (path, options, cb) { + if (typeof options === 'function') { + cb = options + options = {} + } -{ -name:"SIGVTALRM", -number:26, -action:"terminate", -description:"Timeout or timer", -standard:"bsd"}, + if (!cb) { + if (typeof Promise !== 'function') { + throw new TypeError('callback not provided') + } -{ -name:"SIGPROF", -number:27, -action:"terminate", -description:"Timeout or timer", -standard:"bsd"}, + return new Promise(function (resolve, reject) { + isexe(path, options || {}, function (er, is) { + if (er) { + reject(er) + } else { + resolve(is) + } + }) + }) + } -{ -name:"SIGWINCH", -number:28, -action:"ignore", -description:"Terminal window size changed", -standard:"bsd"}, + core(path, options || {}, function (er, is) { + // ignore EACCES because that just means we aren't allowed to run it + if (er) { + if (er.code === 'EACCES' || options && options.ignoreErrors) { + er = null + is = false + } + } + cb(er, is) + }) +} -{ -name:"SIGIO", -number:29, -action:"terminate", -description:"I/O is available", -standard:"other"}, +function sync (path, options) { + // my kingdom for a filtered catch + try { + return core.sync(path, options || {}) + } catch (er) { + if (options && options.ignoreErrors || er.code === 'EACCES') { + return false + } else { + throw er + } + } +} -{ -name:"SIGPOLL", -number:29, -action:"terminate", -description:"Watched event", -standard:"other"}, -{ -name:"SIGINFO", -number:29, -action:"ignore", -description:"Request for process information", -standard:"other"}, +/***/ }), +/* 378 */ +/***/ (function(module, exports, __webpack_require__) { -{ -name:"SIGPWR", -number:30, -action:"terminate", -description:"Device running out of power", -standard:"systemv"}, +module.exports = isexe +isexe.sync = sync -{ -name:"SIGSYS", -number:31, -action:"core", -description:"Invalid system call", -standard:"other"}, +var fs = __webpack_require__(23) -{ -name:"SIGUNUSED", -number:31, -action:"terminate", -description:"Invalid system call", -standard:"other"}];exports.SIGNALS=SIGNALS; -//# sourceMappingURL=core.js.map +function checkPathExt (path, options) { + var pathext = options.pathExt !== undefined ? + options.pathExt : process.env.PATHEXT -/***/ }), -/* 374 */ -/***/ (function(module, exports, __webpack_require__) { + if (!pathext) { + return true + } -"use strict"; -Object.defineProperty(exports,"__esModule",{value:true});exports.SIGRTMAX=exports.getRealtimeSignals=void 0; -const getRealtimeSignals=function(){ -const length=SIGRTMAX-SIGRTMIN+1; -return Array.from({length},getRealtimeSignal); -};exports.getRealtimeSignals=getRealtimeSignals; + pathext = pathext.split(';') + if (pathext.indexOf('') !== -1) { + return true + } + for (var i = 0; i < pathext.length; i++) { + var p = pathext[i].toLowerCase() + if (p && path.substr(-p.length).toLowerCase() === p) { + return true + } + } + return false +} -const getRealtimeSignal=function(value,index){ -return{ -name:`SIGRT${index+1}`, -number:SIGRTMIN+index, -action:"terminate", -description:"Application-specific signal (realtime)", -standard:"posix"}; +function checkStat (stat, path, options) { + if (!stat.isSymbolicLink() && !stat.isFile()) { + return false + } + return checkPathExt(path, options) +} -}; +function isexe (path, options, cb) { + fs.stat(path, function (er, stat) { + cb(er, er ? false : checkStat(stat, path, options)) + }) +} + +function sync (path, options) { + return checkStat(fs.statSync(path), path, options) +} -const SIGRTMIN=34; -const SIGRTMAX=64;exports.SIGRTMAX=SIGRTMAX; -//# sourceMappingURL=realtime.js.map /***/ }), -/* 375 */ +/* 379 */ /***/ (function(module, exports, __webpack_require__) { -"use strict"; +module.exports = isexe +isexe.sync = sync -const aliases = ['stdin', 'stdout', 'stderr']; +var fs = __webpack_require__(23) -const hasAlias = opts => aliases.some(alias => opts[alias] !== undefined); +function isexe (path, options, cb) { + fs.stat(path, function (er, stat) { + cb(er, er ? false : checkStat(stat, options)) + }) +} -const normalizeStdio = opts => { - if (!opts) { - return; - } +function sync (path, options) { + return checkStat(fs.statSync(path), options) +} - const {stdio} = opts; +function checkStat (stat, options) { + return stat.isFile() && checkMode(stat, options) +} - if (stdio === undefined) { - return aliases.map(alias => opts[alias]); - } +function checkMode (stat, options) { + var mod = stat.mode + var uid = stat.uid + var gid = stat.gid - if (hasAlias(opts)) { - throw new Error(`It's not possible to provide \`stdio\` in combination with one of ${aliases.map(alias => `\`${alias}\``).join(', ')}`); - } + var myUid = options.uid !== undefined ? + options.uid : process.getuid && process.getuid() + var myGid = options.gid !== undefined ? + options.gid : process.getgid && process.getgid() - if (typeof stdio === 'string') { - return stdio; - } + var u = parseInt('100', 8) + var g = parseInt('010', 8) + var o = parseInt('001', 8) + var ug = u | g - if (!Array.isArray(stdio)) { - throw new TypeError(`Expected \`stdio\` to be of type \`string\` or \`Array\`, got \`${typeof stdio}\``); - } + var ret = (mod & o) || + (mod & g) && gid === myGid || + (mod & u) && uid === myUid || + (mod & ug) && myUid === 0 - const length = Math.max(stdio.length, aliases.length); - return Array.from({length}, (value, index) => stdio[index]); -}; + return ret +} -module.exports = normalizeStdio; -// `ipc` is pushed unless it is already present -module.exports.node = opts => { - const stdio = normalizeStdio(opts); +/***/ }), +/* 380 */ +/***/ (function(module, exports, __webpack_require__) { - if (stdio === 'ipc') { - return 'ipc'; - } +"use strict"; - if (stdio === undefined || typeof stdio === 'string') { - return [stdio, stdio, stdio, 'ipc']; - } - if (stdio.includes('ipc')) { - return stdio; +const pathKey = (options = {}) => { + const environment = options.env || process.env; + const platform = options.platform || process.platform; + + if (platform !== 'win32') { + return 'PATH'; } - return [...stdio, 'ipc']; + return Object.keys(environment).find(key => key.toUpperCase() === 'PATH') || 'Path'; }; +module.exports = pathKey; +// TODO: Remove this for the next major release +module.exports.default = pathKey; + /***/ }), -/* 376 */ +/* 381 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const os = __webpack_require__(11); -const onExit = __webpack_require__(377); -const DEFAULT_FORCE_KILL_TIMEOUT = 1000 * 5; +// See http://www.robvanderwoude.com/escapechars.php +const metaCharsRegExp = /([()\][%!^"`<>&|;, *?])/g; -// Monkey-patches `childProcess.kill()` to add `forceKillAfterTimeout` behavior -const spawnedKill = (kill, signal = 'SIGTERM', options = {}) => { - const killResult = kill(signal); - setKillTimeout(kill, signal, options, killResult); - return killResult; -}; +function escapeCommand(arg) { + // Escape meta chars + arg = arg.replace(metaCharsRegExp, '^$1'); -const setKillTimeout = (kill, signal, options, killResult) => { - if (!shouldForceKill(signal, options, killResult)) { - return; - } + return arg; +} - const timeout = getForceKillAfterTimeout(options); - const t = setTimeout(() => { - kill('SIGKILL'); - }, timeout); +function escapeArgument(arg, doubleEscapeMetaChars) { + // Convert to string + arg = `${arg}`; - // Guarded because there's no `.unref()` when `execa` is used in the renderer - // process in Electron. This cannot be tested since we don't run tests in - // Electron. - // istanbul ignore else - if (t.unref) { - t.unref(); - } -}; + // Algorithm below is based on https://qntm.org/cmd -const shouldForceKill = (signal, {forceKillAfterTimeout}, killResult) => { - return isSigterm(signal) && forceKillAfterTimeout !== false && killResult; -}; + // Sequence of backslashes followed by a double quote: + // double up all the backslashes and escape the double quote + arg = arg.replace(/(\\*)"/g, '$1$1\\"'); -const isSigterm = signal => { - return signal === os.constants.signals.SIGTERM || - (typeof signal === 'string' && signal.toUpperCase() === 'SIGTERM'); -}; + // Sequence of backslashes followed by the end of the string + // (which will become a double quote later): + // double up all the backslashes + arg = arg.replace(/(\\*)$/, '$1$1'); -const getForceKillAfterTimeout = ({forceKillAfterTimeout = true}) => { - if (forceKillAfterTimeout === true) { - return DEFAULT_FORCE_KILL_TIMEOUT; - } + // All other backslashes occur literally - if (!Number.isInteger(forceKillAfterTimeout) || forceKillAfterTimeout < 0) { - throw new TypeError(`Expected the \`forceKillAfterTimeout\` option to be a non-negative integer, got \`${forceKillAfterTimeout}\` (${typeof forceKillAfterTimeout})`); - } + // Quote the whole thing: + arg = `"${arg}"`; - return forceKillAfterTimeout; -}; + // Escape meta chars + arg = arg.replace(metaCharsRegExp, '^$1'); -// `childProcess.cancel()` -const spawnedCancel = (spawned, context) => { - const killResult = spawned.kill(); + // Double escape meta chars if necessary + if (doubleEscapeMetaChars) { + arg = arg.replace(metaCharsRegExp, '^$1'); + } - if (killResult) { - context.isCanceled = true; - } -}; + return arg; +} -const timeoutKill = (spawned, signal, reject) => { - spawned.kill(signal); - reject(Object.assign(new Error('Timed out'), {timedOut: true, signal})); -}; +module.exports.command = escapeCommand; +module.exports.argument = escapeArgument; -// `timeout` option handling -const setupTimeout = (spawned, {timeout, killSignal = 'SIGTERM'}, spawnedPromise) => { - if (timeout === 0 || timeout === undefined) { - return spawnedPromise; - } - if (!Number.isInteger(timeout) || timeout < 0) { - throw new TypeError(`Expected the \`timeout\` option to be a non-negative integer, got \`${timeout}\` (${typeof timeout})`); - } +/***/ }), +/* 382 */ +/***/ (function(module, exports, __webpack_require__) { - let timeoutId; - const timeoutPromise = new Promise((resolve, reject) => { - timeoutId = setTimeout(() => { - timeoutKill(spawned, killSignal, reject); - }, timeout); - }); +"use strict"; - const safeSpawnedPromise = spawnedPromise.finally(() => { - clearTimeout(timeoutId); - }); - return Promise.race([timeoutPromise, safeSpawnedPromise]); -}; +const fs = __webpack_require__(23); +const shebangCommand = __webpack_require__(383); -// `cleanup` option handling -const setExitHandler = async (spawned, {cleanup, detached}, timedPromise) => { - if (!cleanup || detached) { - return timedPromise; - } +function readShebang(command) { + // Read the first 150 bytes from the file + const size = 150; + const buffer = Buffer.alloc(size); - const removeExitHandler = onExit(() => { - spawned.kill(); - }); + let fd; - return timedPromise.finally(() => { - removeExitHandler(); - }); -}; + try { + fd = fs.openSync(command, 'r'); + fs.readSync(fd, buffer, 0, size, 0); + fs.closeSync(fd); + } catch (e) { /* Empty */ } -module.exports = { - spawnedKill, - spawnedCancel, - setupTimeout, - setExitHandler -}; + // Attempt to extract shebang (null is returned if not a shebang) + return shebangCommand(buffer.toString()); +} + +module.exports = readShebang; /***/ }), -/* 377 */ +/* 383 */ /***/ (function(module, exports, __webpack_require__) { -// Note: since nyc uses this module to output coverage, any lines -// that are in the direct sync flow of nyc's outputCoverage are -// ignored, since we can never get coverage for them. -var assert = __webpack_require__(30) -var signals = __webpack_require__(378) - -var EE = __webpack_require__(379) -/* istanbul ignore if */ -if (typeof EE !== 'function') { - EE = EE.EventEmitter -} - -var emitter -if (process.__signal_exit_emitter__) { - emitter = process.__signal_exit_emitter__ -} else { - emitter = process.__signal_exit_emitter__ = new EE() - emitter.count = 0 - emitter.emitted = {} -} - -// Because this emitter is a global, we have to check to see if a -// previous version of this library failed to enable infinite listeners. -// I know what you're about to say. But literally everything about -// signal-exit is a compromise with evil. Get used to it. -if (!emitter.infinite) { - emitter.setMaxListeners(Infinity) - emitter.infinite = true -} - -module.exports = function (cb, opts) { - assert.equal(typeof cb, 'function', 'a callback must be provided for exit handler') +"use strict"; - if (loaded === false) { - load() - } +const shebangRegex = __webpack_require__(384); - var ev = 'exit' - if (opts && opts.alwaysLast) { - ev = 'afterexit' - } +module.exports = (string = '') => { + const match = string.match(shebangRegex); - var remove = function () { - emitter.removeListener(ev, cb) - if (emitter.listeners('exit').length === 0 && - emitter.listeners('afterexit').length === 0) { - unload() - } - } - emitter.on(ev, cb) + if (!match) { + return null; + } - return remove -} + const [path, argument] = match[0].replace(/#! ?/, '').split(' '); + const binary = path.split('/').pop(); -module.exports.unload = unload -function unload () { - if (!loaded) { - return - } - loaded = false + if (binary === 'env') { + return argument; + } - signals.forEach(function (sig) { - try { - process.removeListener(sig, sigListeners[sig]) - } catch (er) {} - }) - process.emit = originalProcessEmit - process.reallyExit = originalProcessReallyExit - emitter.count -= 1 -} + return argument ? `${binary} ${argument}` : binary; +}; -function emit (event, code, signal) { - if (emitter.emitted[event]) { - return - } - emitter.emitted[event] = true - emitter.emit(event, code, signal) -} -// { : , ... } -var sigListeners = {} -signals.forEach(function (sig) { - sigListeners[sig] = function listener () { - // If there are no other listeners, an exit is coming! - // Simplest way: remove us and then re-send the signal. - // We know that this will kill the process, so we can - // safely emit now. - var listeners = process.listeners(sig) - if (listeners.length === emitter.count) { - unload() - emit('exit', null, sig) - /* istanbul ignore next */ - emit('afterexit', null, sig) - /* istanbul ignore next */ - process.kill(process.pid, sig) - } - } -}) +/***/ }), +/* 384 */ +/***/ (function(module, exports, __webpack_require__) { -module.exports.signals = function () { - return signals -} +"use strict"; -module.exports.load = load +module.exports = /^#!(.*)/; -var loaded = false -function load () { - if (loaded) { - return - } - loaded = true +/***/ }), +/* 385 */ +/***/ (function(module, exports, __webpack_require__) { - // This is the number of onSignalExit's that are in play. - // It's important so that we can count the correct number of - // listeners on signals, and don't wait for the other one to - // handle it instead of us. - emitter.count += 1 +"use strict"; - signals = signals.filter(function (sig) { - try { - process.on(sig, sigListeners[sig]) - return true - } catch (er) { - return false - } - }) - process.emit = processEmit - process.reallyExit = processReallyExit -} +const isWin = process.platform === 'win32'; -var originalProcessReallyExit = process.reallyExit -function processReallyExit (code) { - process.exitCode = code || 0 - emit('exit', process.exitCode, null) - /* istanbul ignore next */ - emit('afterexit', process.exitCode, null) - /* istanbul ignore next */ - originalProcessReallyExit.call(process, process.exitCode) +function notFoundError(original, syscall) { + return Object.assign(new Error(`${syscall} ${original.command} ENOENT`), { + code: 'ENOENT', + errno: 'ENOENT', + syscall: `${syscall} ${original.command}`, + path: original.command, + spawnargs: original.args, + }); } -var originalProcessEmit = process.emit -function processEmit (ev, arg) { - if (ev === 'exit') { - if (arg !== undefined) { - process.exitCode = arg +function hookChildProcess(cp, parsed) { + if (!isWin) { + return; } - var ret = originalProcessEmit.apply(this, arguments) - emit('exit', process.exitCode, null) - /* istanbul ignore next */ - emit('afterexit', process.exitCode, null) - return ret - } else { - return originalProcessEmit.apply(this, arguments) - } -} + const originalEmit = cp.emit; -/***/ }), -/* 378 */ -/***/ (function(module, exports) { + cp.emit = function (name, arg1) { + // If emitting "exit" event and exit code is 1, we need to check if + // the command exists and emit an "error" instead + // See https://github.com/IndigoUnited/node-cross-spawn/issues/16 + if (name === 'exit') { + const err = verifyENOENT(arg1, parsed, 'spawn'); -// This is not the set of all possible signals. -// -// It IS, however, the set of all signals that trigger -// an exit on either Linux or BSD systems. Linux is a -// superset of the signal names supported on BSD, and -// the unknown signals just fail to register, so we can -// catch that easily enough. -// -// Don't bother with SIGKILL. It's uncatchable, which -// means that we can't fire any callbacks anyway. -// -// If a user does happen to register a handler on a non- -// fatal signal like SIGWINCH or something, and then -// exit, it'll end up firing `process.emit('exit')`, so -// the handler will be fired anyway. -// -// SIGBUS, SIGFPE, SIGSEGV and SIGILL, when not raised -// artificially, inherently leave the process in a -// state from which it is not safe to try and enter JS -// listeners. -module.exports = [ - 'SIGABRT', - 'SIGALRM', - 'SIGHUP', - 'SIGINT', - 'SIGTERM' -] + if (err) { + return originalEmit.call(cp, 'error', err); + } + } -if (process.platform !== 'win32') { - module.exports.push( - 'SIGVTALRM', - 'SIGXCPU', - 'SIGXFSZ', - 'SIGUSR2', - 'SIGTRAP', - 'SIGSYS', - 'SIGQUIT', - 'SIGIOT' - // should detect profiler and enable/disable accordingly. - // see #21 - // 'SIGPROF' - ) + return originalEmit.apply(cp, arguments); // eslint-disable-line prefer-rest-params + }; } -if (process.platform === 'linux') { - module.exports.push( - 'SIGIO', - 'SIGPOLL', - 'SIGPWR', - 'SIGSTKFLT', - 'SIGUNUSED' - ) +function verifyENOENT(status, parsed) { + if (isWin && status === 1 && !parsed.file) { + return notFoundError(parsed.original, 'spawn'); + } + + return null; } +function verifyENOENTSync(status, parsed) { + if (isWin && status === 1 && !parsed.file) { + return notFoundError(parsed.original, 'spawnSync'); + } -/***/ }), -/* 379 */ -/***/ (function(module, exports) { + return null; +} + +module.exports = { + hookChildProcess, + verifyENOENT, + verifyENOENTSync, + notFoundError, +}; -module.exports = require("events"); /***/ }), -/* 380 */ +/* 386 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; -const isStream = __webpack_require__(381); -const getStream = __webpack_require__(382); -const mergeStream = __webpack_require__(388); -// `input` option -const handleInput = (spawned, input) => { - // Checking for stdin is workaround for https://github.com/nodejs/node/issues/26852 - // TODO: Remove `|| spawned.stdin === undefined` once we drop support for Node.js <=12.2.0 - if (input === undefined || spawned.stdin === undefined) { - return; - } +module.exports = input => { + const LF = typeof input === 'string' ? '\n' : '\n'.charCodeAt(); + const CR = typeof input === 'string' ? '\r' : '\r'.charCodeAt(); - if (isStream(input)) { - input.pipe(spawned.stdin); - } else { - spawned.stdin.end(input); + if (input[input.length - 1] === LF) { + input = input.slice(0, input.length - 1); } -}; -// `all` interleaves `stdout` and `stderr` -const makeAllStream = (spawned, {all}) => { - if (!all || (!spawned.stdout && !spawned.stderr)) { - return; + if (input[input.length - 1] === CR) { + input = input.slice(0, input.length - 1); } - const mixed = mergeStream(); + return input; +}; - if (spawned.stdout) { - mixed.add(spawned.stdout); - } - if (spawned.stderr) { - mixed.add(spawned.stderr); - } +/***/ }), +/* 387 */ +/***/ (function(module, exports, __webpack_require__) { - return mixed; -}; +"use strict"; -// On failure, `result.stdout|stderr|all` should contain the currently buffered stream -const getBufferedData = async (stream, streamPromise) => { - if (!stream) { - return; - } +const path = __webpack_require__(16); +const pathKey = __webpack_require__(380); - stream.destroy(); +const npmRunPath = options => { + options = { + cwd: process.cwd(), + path: process.env[pathKey()], + execPath: process.execPath, + ...options + }; - try { - return await streamPromise; - } catch (error) { - return error.bufferedData; - } -}; + let previous; + let cwdPath = path.resolve(options.cwd); + const result = []; -const getStreamPromise = (stream, {encoding, buffer, maxBuffer}) => { - if (!stream || !buffer) { - return; + while (previous !== cwdPath) { + result.push(path.join(cwdPath, 'node_modules/.bin')); + previous = cwdPath; + cwdPath = path.resolve(cwdPath, '..'); } - if (encoding) { - return getStream(stream, {encoding, maxBuffer}); - } + // Ensure the running `node` binary is used + const execPathDir = path.resolve(options.cwd, options.execPath, '..'); + result.unshift(execPathDir); - return getStream.buffer(stream, {maxBuffer}); + return result.concat(options.path).join(path.delimiter); }; -// Retrieve result of child process: exit code, signal, error, streams (stdout/stderr/all) -const getSpawnedResult = async ({stdout, stderr, all}, {encoding, buffer, maxBuffer}, processDone) => { - const stdoutPromise = getStreamPromise(stdout, {encoding, buffer, maxBuffer}); - const stderrPromise = getStreamPromise(stderr, {encoding, buffer, maxBuffer}); - const allPromise = getStreamPromise(all, {encoding, buffer, maxBuffer: maxBuffer * 2}); +module.exports = npmRunPath; +// TODO: Remove this for the next major release +module.exports.default = npmRunPath; - try { - return await Promise.all([processDone, stdoutPromise, stderrPromise, allPromise]); - } catch (error) { - return Promise.all([ - {error, signal: error.signal, timedOut: error.timedOut}, - getBufferedData(stdout, stdoutPromise), - getBufferedData(stderr, stderrPromise), - getBufferedData(all, allPromise) - ]); - } -}; +module.exports.env = options => { + options = { + env: process.env, + ...options + }; -const validateInputSync = ({input}) => { - if (isStream(input)) { - throw new TypeError('The `input` option cannot be a stream in sync mode'); - } -}; + const env = {...options.env}; + const path = pathKey({env}); -module.exports = { - handleInput, - makeAllStream, - getSpawnedResult, - validateInputSync -}; + options.path = env[path]; + env[path] = module.exports(options); + return env; +}; /***/ }), -/* 381 */ +/* 388 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +const mimicFn = __webpack_require__(389); -const isStream = stream => - stream !== null && - typeof stream === 'object' && - typeof stream.pipe === 'function'; - -isStream.writable = stream => - isStream(stream) && - stream.writable !== false && - typeof stream._write === 'function' && - typeof stream._writableState === 'object'; +const calledFunctions = new WeakMap(); -isStream.readable = stream => - isStream(stream) && - stream.readable !== false && - typeof stream._read === 'function' && - typeof stream._readableState === 'object'; +const oneTime = (fn, options = {}) => { + if (typeof fn !== 'function') { + throw new TypeError('Expected a function'); + } -isStream.duplex = stream => - isStream.writable(stream) && - isStream.readable(stream); + let ret; + let isCalled = false; + let callCount = 0; + const functionName = fn.displayName || fn.name || ''; -isStream.transform = stream => - isStream.duplex(stream) && - typeof stream._transform === 'function' && - typeof stream._transformState === 'object'; + const onetime = function (...args) { + calledFunctions.set(onetime, ++callCount); -module.exports = isStream; + if (isCalled) { + if (options.throw === true) { + throw new Error(`Function \`${functionName}\` can only be called once`); + } + return ret; + } -/***/ }), -/* 382 */ -/***/ (function(module, exports, __webpack_require__) { + isCalled = true; + ret = fn.apply(this, args); + fn = null; -"use strict"; + return ret; + }; -const pump = __webpack_require__(383); -const bufferStream = __webpack_require__(387); + mimicFn(onetime, fn); + calledFunctions.set(onetime, callCount); -class MaxBufferError extends Error { - constructor() { - super('maxBuffer exceeded'); - this.name = 'MaxBufferError'; - } -} + return onetime; +}; -async function getStream(inputStream, options) { - if (!inputStream) { - return Promise.reject(new Error('Expected a stream')); - } +module.exports = oneTime; +// TODO: Remove this for the next major release +module.exports.default = oneTime; - options = { - maxBuffer: Infinity, - ...options - }; +module.exports.callCount = fn => { + if (!calledFunctions.has(fn)) { + throw new Error(`The given function \`${fn.name}\` is not wrapped by the \`onetime\` package`); + } - const {maxBuffer} = options; + return calledFunctions.get(fn); +}; - let stream; - await new Promise((resolve, reject) => { - const rejectPromise = error => { - if (error) { // A null check - error.bufferedData = stream.getBufferedValue(); - } - reject(error); - }; +/***/ }), +/* 389 */ +/***/ (function(module, exports, __webpack_require__) { - stream = pump(inputStream, bufferStream(options), error => { - if (error) { - rejectPromise(error); - return; - } +"use strict"; - resolve(); - }); - stream.on('data', () => { - if (stream.getBufferedLength() > maxBuffer) { - rejectPromise(new MaxBufferError()); - } - }); - }); +const mimicFn = (to, from) => { + for (const prop of Reflect.ownKeys(from)) { + Object.defineProperty(to, prop, Object.getOwnPropertyDescriptor(from, prop)); + } - return stream.getBufferedValue(); -} + return to; +}; -module.exports = getStream; +module.exports = mimicFn; // TODO: Remove this for the next major release -module.exports.default = getStream; -module.exports.buffer = (stream, options) => getStream(stream, {...options, encoding: 'buffer'}); -module.exports.array = (stream, options) => getStream(stream, {...options, array: true}); -module.exports.MaxBufferError = MaxBufferError; +module.exports.default = mimicFn; /***/ }), -/* 383 */ +/* 390 */ /***/ (function(module, exports, __webpack_require__) { -var once = __webpack_require__(384) -var eos = __webpack_require__(386) -var fs = __webpack_require__(23) // we only need fs to get the ReadStream and WriteStream prototypes - -var noop = function () {} -var ancient = /^v?\.0/.test(process.version) +"use strict"; -var isFn = function (fn) { - return typeof fn === 'function' -} +const {signalsByName} = __webpack_require__(391); -var isFS = function (stream) { - if (!ancient) return false // newer node version do not need to care about fs is a special way - if (!fs) return false // browser - return (stream instanceof (fs.ReadStream || noop) || stream instanceof (fs.WriteStream || noop)) && isFn(stream.close) -} +const getErrorPrefix = ({timedOut, timeout, errorCode, signal, signalDescription, exitCode, isCanceled}) => { + if (timedOut) { + return `timed out after ${timeout} milliseconds`; + } -var isRequest = function (stream) { - return stream.setHeader && isFn(stream.abort) -} + if (isCanceled) { + return 'was canceled'; + } -var destroyer = function (stream, reading, writing, callback) { - callback = once(callback) + if (errorCode !== undefined) { + return `failed with ${errorCode}`; + } - var closed = false - stream.on('close', function () { - closed = true - }) + if (signal !== undefined) { + return `was killed with ${signal} (${signalDescription})`; + } - eos(stream, {readable: reading, writable: writing}, function (err) { - if (err) return callback(err) - closed = true - callback() - }) + if (exitCode !== undefined) { + return `failed with exit code ${exitCode}`; + } - var destroyed = false - return function (err) { - if (closed) return - if (destroyed) return - destroyed = true + return 'failed'; +}; - if (isFS(stream)) return stream.close(noop) // use close for fs streams to avoid fd leaks - if (isRequest(stream)) return stream.abort() // request.destroy just do .end - .abort is what we want +const makeError = ({ + stdout, + stderr, + all, + error, + signal, + exitCode, + command, + timedOut, + isCanceled, + killed, + parsed: {options: {timeout}} +}) => { + // `signal` and `exitCode` emitted on `spawned.on('exit')` event can be `null`. + // We normalize them to `undefined` + exitCode = exitCode === null ? undefined : exitCode; + signal = signal === null ? undefined : signal; + const signalDescription = signal === undefined ? undefined : signalsByName[signal].description; - if (isFn(stream.destroy)) return stream.destroy() + const errorCode = error && error.code; - callback(err || new Error('stream was destroyed')) - } -} + const prefix = getErrorPrefix({timedOut, timeout, errorCode, signal, signalDescription, exitCode, isCanceled}); + const execaMessage = `Command ${prefix}: ${command}`; + const shortMessage = error instanceof Error ? `${execaMessage}\n${error.message}` : execaMessage; + const message = [shortMessage, stderr, stdout].filter(Boolean).join('\n'); -var call = function (fn) { - fn() -} + if (error instanceof Error) { + error.originalMessage = error.message; + error.message = message; + } else { + error = new Error(message); + } -var pipe = function (from, to) { - return from.pipe(to) -} + error.shortMessage = shortMessage; + error.command = command; + error.exitCode = exitCode; + error.signal = signal; + error.signalDescription = signalDescription; + error.stdout = stdout; + error.stderr = stderr; -var pump = function () { - var streams = Array.prototype.slice.call(arguments) - var callback = isFn(streams[streams.length - 1] || noop) && streams.pop() || noop + if (all !== undefined) { + error.all = all; + } - if (Array.isArray(streams[0])) streams = streams[0] - if (streams.length < 2) throw new Error('pump requires two streams per minimum') + if ('bufferedData' in error) { + delete error.bufferedData; + } - var error - var destroys = streams.map(function (stream, i) { - var reading = i < streams.length - 1 - var writing = i > 0 - return destroyer(stream, reading, writing, function (err) { - if (!error) error = err - if (err) destroys.forEach(call) - if (reading) return - destroys.forEach(call) - callback(error) - }) - }) + error.failed = true; + error.timedOut = Boolean(timedOut); + error.isCanceled = isCanceled; + error.killed = killed && !timedOut; - return streams.reduce(pipe) -} + return error; +}; -module.exports = pump +module.exports = makeError; /***/ }), -/* 384 */ +/* 391 */ /***/ (function(module, exports, __webpack_require__) { -var wrappy = __webpack_require__(385) -module.exports = wrappy(once) -module.exports.strict = wrappy(onceStrict) - -once.proto = once(function () { - Object.defineProperty(Function.prototype, 'once', { - value: function () { - return once(this) - }, - configurable: true - }) - - Object.defineProperty(Function.prototype, 'onceStrict', { - value: function () { - return onceStrict(this) - }, - configurable: true - }) -}) - -function once (fn) { - var f = function () { - if (f.called) return f.value - f.called = true - return f.value = fn.apply(this, arguments) - } - f.called = false - return f -} - -function onceStrict (fn) { - var f = function () { - if (f.called) - throw new Error(f.onceError) - f.called = true - return f.value = fn.apply(this, arguments) - } - var name = fn.name || 'Function wrapped with `once`' - f.onceError = name + " shouldn't be called more than once" - f.called = false - return f -} - +"use strict"; +Object.defineProperty(exports,"__esModule",{value:true});exports.signalsByNumber=exports.signalsByName=void 0;var _os=__webpack_require__(11); -/***/ }), -/* 385 */ -/***/ (function(module, exports) { +var _signals=__webpack_require__(392); +var _realtime=__webpack_require__(394); -// Returns a wrapper function that returns a wrapped callback -// The wrapper function should do some stuff, and return a -// presumably different callback function. -// This makes sure that own properties are retained, so that -// decorations and such are not lost along the way. -module.exports = wrappy -function wrappy (fn, cb) { - if (fn && cb) return wrappy(fn)(cb) - if (typeof fn !== 'function') - throw new TypeError('need wrapper function') - Object.keys(fn).forEach(function (k) { - wrapper[k] = fn[k] - }) +const getSignalsByName=function(){ +const signals=(0,_signals.getSignals)(); +return signals.reduce(getSignalByName,{}); +}; - return wrapper +const getSignalByName=function( +signalByNameMemo, +{name,number,description,supported,action,forced,standard}) +{ +return{ +...signalByNameMemo, +[name]:{name,number,description,supported,action,forced,standard}}; - function wrapper() { - var args = new Array(arguments.length) - for (var i = 0; i < args.length; i++) { - args[i] = arguments[i] - } - var ret = fn.apply(this, args) - var cb = args[args.length-1] - if (typeof ret === 'function' && ret !== cb) { - Object.keys(cb).forEach(function (k) { - ret[k] = cb[k] - }) - } - return ret - } -} +}; +const signalsByName=getSignalsByName();exports.signalsByName=signalsByName; -/***/ }), -/* 386 */ -/***/ (function(module, exports, __webpack_require__) { -var once = __webpack_require__(384); -var noop = function() {}; -var isRequest = function(stream) { - return stream.setHeader && typeof stream.abort === 'function'; -}; +const getSignalsByNumber=function(){ +const signals=(0,_signals.getSignals)(); +const length=_realtime.SIGRTMAX+1; +const signalsA=Array.from({length},(value,number)=> +getSignalByNumber(number,signals)); -var isChildProcess = function(stream) { - return stream.stdio && Array.isArray(stream.stdio) && stream.stdio.length === 3 +return Object.assign({},...signalsA); }; -var eos = function(stream, opts, callback) { - if (typeof opts === 'function') return eos(stream, null, opts); - if (!opts) opts = {}; - - callback = once(callback || noop); - - var ws = stream._writableState; - var rs = stream._readableState; - var readable = opts.readable || (opts.readable !== false && stream.readable); - var writable = opts.writable || (opts.writable !== false && stream.writable); - - var onlegacyfinish = function() { - if (!stream.writable) onfinish(); - }; - - var onfinish = function() { - writable = false; - if (!readable) callback.call(stream); - }; +const getSignalByNumber=function(number,signals){ +const signal=findSignalByNumber(number,signals); - var onend = function() { - readable = false; - if (!writable) callback.call(stream); - }; +if(signal===undefined){ +return{}; +} - var onexit = function(exitCode) { - callback.call(stream, exitCode ? new Error('exited with error code: ' + exitCode) : null); - }; +const{name,description,supported,action,forced,standard}=signal; +return{ +[number]:{ +name, +number, +description, +supported, +action, +forced, +standard}}; - var onerror = function(err) { - callback.call(stream, err); - }; - var onclose = function() { - if (readable && !(rs && rs.ended)) return callback.call(stream, new Error('premature close')); - if (writable && !(ws && ws.ended)) return callback.call(stream, new Error('premature close')); - }; +}; - var onrequest = function() { - stream.req.on('finish', onfinish); - }; - if (isRequest(stream)) { - stream.on('complete', onfinish); - stream.on('abort', onclose); - if (stream.req) onrequest(); - else stream.on('request', onrequest); - } else if (writable && !ws) { // legacy streams - stream.on('end', onlegacyfinish); - stream.on('close', onlegacyfinish); - } - if (isChildProcess(stream)) stream.on('exit', onexit); +const findSignalByNumber=function(number,signals){ +const signal=signals.find(({name})=>_os.constants.signals[name]===number); - stream.on('end', onend); - stream.on('finish', onfinish); - if (opts.error !== false) stream.on('error', onerror); - stream.on('close', onclose); +if(signal!==undefined){ +return signal; +} - return function() { - stream.removeListener('complete', onfinish); - stream.removeListener('abort', onclose); - stream.removeListener('request', onrequest); - if (stream.req) stream.req.removeListener('finish', onfinish); - stream.removeListener('end', onlegacyfinish); - stream.removeListener('close', onlegacyfinish); - stream.removeListener('finish', onfinish); - stream.removeListener('exit', onexit); - stream.removeListener('end', onend); - stream.removeListener('error', onerror); - stream.removeListener('close', onclose); - }; +return signals.find(signalA=>signalA.number===number); }; -module.exports = eos; - +const signalsByNumber=getSignalsByNumber();exports.signalsByNumber=signalsByNumber; +//# sourceMappingURL=main.js.map /***/ }), -/* 387 */ +/* 392 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +Object.defineProperty(exports,"__esModule",{value:true});exports.getSignals=void 0;var _os=__webpack_require__(11); -const {PassThrough: PassThroughStream} = __webpack_require__(27); - -module.exports = options => { - options = {...options}; - - const {array} = options; - let {encoding} = options; - const isBuffer = encoding === 'buffer'; - let objectMode = false; - - if (array) { - objectMode = !(encoding || isBuffer); - } else { - encoding = encoding || 'utf8'; - } +var _core=__webpack_require__(393); +var _realtime=__webpack_require__(394); - if (isBuffer) { - encoding = null; - } - const stream = new PassThroughStream({objectMode}); - if (encoding) { - stream.setEncoding(encoding); - } +const getSignals=function(){ +const realtimeSignals=(0,_realtime.getRealtimeSignals)(); +const signals=[..._core.SIGNALS,...realtimeSignals].map(normalizeSignal); +return signals; +};exports.getSignals=getSignals; - let length = 0; - const chunks = []; - stream.on('data', chunk => { - chunks.push(chunk); - if (objectMode) { - length = chunks.length; - } else { - length += chunk.length; - } - }); - stream.getBufferedValue = () => { - if (array) { - return chunks; - } - return isBuffer ? Buffer.concat(chunks, length) : chunks.join(''); - }; - stream.getBufferedLength = () => length; - return stream; +const normalizeSignal=function({ +name, +number:defaultNumber, +description, +action, +forced=false, +standard}) +{ +const{ +signals:{[name]:constantSignal}}= +_os.constants; +const supported=constantSignal!==undefined; +const number=supported?constantSignal:defaultNumber; +return{name,number,description,supported,action,forced,standard}; }; - +//# sourceMappingURL=signals.js.map /***/ }), -/* 388 */ +/* 393 */ /***/ (function(module, exports, __webpack_require__) { "use strict"; +Object.defineProperty(exports,"__esModule",{value:true});exports.SIGNALS=void 0; +const SIGNALS=[ +{ +name:"SIGHUP", +number:1, +action:"terminate", +description:"Terminal closed", +standard:"posix"}, -const { PassThrough } = __webpack_require__(27); - -module.exports = function (/*streams...*/) { - var sources = [] - var output = new PassThrough({objectMode: true}) - - output.setMaxListeners(0) +{ +name:"SIGINT", +number:2, +action:"terminate", +description:"User interruption with CTRL-C", +standard:"ansi"}, - output.add = add - output.isEmpty = isEmpty +{ +name:"SIGQUIT", +number:3, +action:"core", +description:"User interruption with CTRL-\\", +standard:"posix"}, - output.on('unpipe', remove) +{ +name:"SIGILL", +number:4, +action:"core", +description:"Invalid machine instruction", +standard:"ansi"}, - Array.prototype.slice.call(arguments).forEach(add) +{ +name:"SIGTRAP", +number:5, +action:"core", +description:"Debugger breakpoint", +standard:"posix"}, - return output +{ +name:"SIGABRT", +number:6, +action:"core", +description:"Aborted", +standard:"ansi"}, - function add (source) { - if (Array.isArray(source)) { - source.forEach(add) - return this - } +{ +name:"SIGIOT", +number:6, +action:"core", +description:"Aborted", +standard:"bsd"}, - sources.push(source); - source.once('end', remove.bind(null, source)) - source.once('error', output.emit.bind(output, 'error')) - source.pipe(output, {end: false}) - return this - } +{ +name:"SIGBUS", +number:7, +action:"core", +description: +"Bus error due to misaligned, non-existing address or paging error", +standard:"bsd"}, - function isEmpty () { - return sources.length == 0; - } +{ +name:"SIGEMT", +number:7, +action:"terminate", +description:"Command should be emulated but is not implemented", +standard:"other"}, - function remove (source) { - sources = sources.filter(function (it) { return it !== source }) - if (!sources.length && output.readable) { output.end() } - } -} +{ +name:"SIGFPE", +number:8, +action:"core", +description:"Floating point arithmetic error", +standard:"ansi"}, +{ +name:"SIGKILL", +number:9, +action:"terminate", +description:"Forced termination", +standard:"posix", +forced:true}, -/***/ }), -/* 389 */ -/***/ (function(module, exports, __webpack_require__) { +{ +name:"SIGUSR1", +number:10, +action:"terminate", +description:"Application-specific signal", +standard:"posix"}, -"use strict"; +{ +name:"SIGSEGV", +number:11, +action:"core", +description:"Segmentation fault", +standard:"ansi"}, -const mergePromiseProperty = (spawned, promise, property) => { - // Starting the main `promise` is deferred to avoid consuming streams - const value = typeof promise === 'function' ? - (...args) => promise()[property](...args) : - promise[property].bind(promise); +{ +name:"SIGUSR2", +number:12, +action:"terminate", +description:"Application-specific signal", +standard:"posix"}, - Object.defineProperty(spawned, property, { - value, - writable: true, - enumerable: false, - configurable: true - }); -}; +{ +name:"SIGPIPE", +number:13, +action:"terminate", +description:"Broken pipe or socket", +standard:"posix"}, -// The return value is a mixin of `childProcess` and `Promise` -const mergePromise = (spawned, promise) => { - mergePromiseProperty(spawned, promise, 'then'); - mergePromiseProperty(spawned, promise, 'catch'); - mergePromiseProperty(spawned, promise, 'finally'); - return spawned; -}; +{ +name:"SIGALRM", +number:14, +action:"terminate", +description:"Timeout or timer", +standard:"posix"}, -// Use promises instead of `child_process` events -const getSpawnedPromise = spawned => { - return new Promise((resolve, reject) => { - spawned.on('exit', (exitCode, signal) => { - resolve({exitCode, signal}); - }); +{ +name:"SIGTERM", +number:15, +action:"terminate", +description:"Termination", +standard:"ansi"}, - spawned.on('error', error => { - reject(error); - }); +{ +name:"SIGSTKFLT", +number:16, +action:"terminate", +description:"Stack is empty or overflowed", +standard:"other"}, - if (spawned.stdin) { - spawned.stdin.on('error', error => { - reject(error); - }); - } - }); -}; +{ +name:"SIGCHLD", +number:17, +action:"ignore", +description:"Child process terminated, paused or unpaused", +standard:"posix"}, -module.exports = { - mergePromise, - getSpawnedPromise -}; +{ +name:"SIGCLD", +number:17, +action:"ignore", +description:"Child process terminated, paused or unpaused", +standard:"other"}, +{ +name:"SIGCONT", +number:18, +action:"unpause", +description:"Unpaused", +standard:"posix", +forced:true}, +{ +name:"SIGSTOP", +number:19, +action:"pause", +description:"Paused", +standard:"posix", +forced:true}, -/***/ }), -/* 390 */ -/***/ (function(module, exports, __webpack_require__) { +{ +name:"SIGTSTP", +number:20, +action:"pause", +description:"Paused using CTRL-Z or \"suspend\"", +standard:"posix"}, -"use strict"; +{ +name:"SIGTTIN", +number:21, +action:"pause", +description:"Background process cannot read terminal input", +standard:"posix"}, -const SPACES_REGEXP = / +/g; +{ +name:"SIGBREAK", +number:21, +action:"terminate", +description:"User interruption with CTRL-BREAK", +standard:"other"}, -const joinCommand = (file, args = []) => { - if (!Array.isArray(args)) { - return file; - } +{ +name:"SIGTTOU", +number:22, +action:"pause", +description:"Background process cannot write to terminal output", +standard:"posix"}, - return [file, ...args].join(' '); -}; +{ +name:"SIGURG", +number:23, +action:"ignore", +description:"Socket received out-of-band data", +standard:"bsd"}, -// Allow spaces to be escaped by a backslash if not meant as a delimiter -const handleEscaping = (tokens, token, index) => { - if (index === 0) { - return [token]; - } +{ +name:"SIGXCPU", +number:24, +action:"core", +description:"Process timed out", +standard:"bsd"}, - const previousToken = tokens[tokens.length - 1]; +{ +name:"SIGXFSZ", +number:25, +action:"core", +description:"File too big", +standard:"bsd"}, - if (previousToken.endsWith('\\')) { - return [...tokens.slice(0, -1), `${previousToken.slice(0, -1)} ${token}`]; - } +{ +name:"SIGVTALRM", +number:26, +action:"terminate", +description:"Timeout or timer", +standard:"bsd"}, - return [...tokens, token]; -}; +{ +name:"SIGPROF", +number:27, +action:"terminate", +description:"Timeout or timer", +standard:"bsd"}, -// Handle `execa.command()` -const parseCommand = command => { - return command - .trim() - .split(SPACES_REGEXP) - .reduce(handleEscaping, []); -}; +{ +name:"SIGWINCH", +number:28, +action:"ignore", +description:"Terminal window size changed", +standard:"bsd"}, -module.exports = { - joinCommand, - parseCommand -}; +{ +name:"SIGIO", +number:29, +action:"terminate", +description:"I/O is available", +standard:"other"}, +{ +name:"SIGPOLL", +number:29, +action:"terminate", +description:"Watched event", +standard:"other"}, -/***/ }), -/* 391 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +{ +name:"SIGINFO", +number:29, +action:"ignore", +description:"Request for process information", +standard:"other"}, -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony import */ var _internal_Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(193); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Observable", function() { return _internal_Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"]; }); +{ +name:"SIGPWR", +number:30, +action:"terminate", +description:"Device running out of power", +standard:"systemv"}, -/* harmony import */ var _internal_observable_ConnectableObservable__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(283); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ConnectableObservable", function() { return _internal_observable_ConnectableObservable__WEBPACK_IMPORTED_MODULE_1__["ConnectableObservable"]; }); +{ +name:"SIGSYS", +number:31, +action:"core", +description:"Invalid system call", +standard:"other"}, -/* harmony import */ var _internal_operators_groupBy__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(264); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "GroupedObservable", function() { return _internal_operators_groupBy__WEBPACK_IMPORTED_MODULE_2__["GroupedObservable"]; }); +{ +name:"SIGUNUSED", +number:31, +action:"terminate", +description:"Invalid system call", +standard:"other"}];exports.SIGNALS=SIGNALS; +//# sourceMappingURL=core.js.map -/* harmony import */ var _internal_symbol_observable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(190); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "observable", function() { return _internal_symbol_observable__WEBPACK_IMPORTED_MODULE_3__["observable"]; }); +/***/ }), +/* 394 */ +/***/ (function(module, exports, __webpack_require__) { -/* harmony import */ var _internal_Subject__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(265); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Subject", function() { return _internal_Subject__WEBPACK_IMPORTED_MODULE_4__["Subject"]; }); +"use strict"; +Object.defineProperty(exports,"__esModule",{value:true});exports.SIGRTMAX=exports.getRealtimeSignals=void 0; +const getRealtimeSignals=function(){ +const length=SIGRTMAX-SIGRTMIN+1; +return Array.from({length},getRealtimeSignal); +};exports.getRealtimeSignals=getRealtimeSignals; -/* harmony import */ var _internal_BehaviorSubject__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(293); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "BehaviorSubject", function() { return _internal_BehaviorSubject__WEBPACK_IMPORTED_MODULE_5__["BehaviorSubject"]; }); +const getRealtimeSignal=function(value,index){ +return{ +name:`SIGRT${index+1}`, +number:SIGRTMIN+index, +action:"terminate", +description:"Application-specific signal (realtime)", +standard:"posix"}; -/* harmony import */ var _internal_ReplaySubject__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(297); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ReplaySubject", function() { return _internal_ReplaySubject__WEBPACK_IMPORTED_MODULE_6__["ReplaySubject"]; }); - -/* harmony import */ var _internal_AsyncSubject__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(295); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "AsyncSubject", function() { return _internal_AsyncSubject__WEBPACK_IMPORTED_MODULE_7__["AsyncSubject"]; }); - -/* harmony import */ var _internal_scheduler_asap__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(320); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "asapScheduler", function() { return _internal_scheduler_asap__WEBPACK_IMPORTED_MODULE_8__["asap"]; }); - -/* harmony import */ var _internal_scheduler_async__WEBPACK_IMPORTED_MODULE_9__ = __webpack_require__(199); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "asyncScheduler", function() { return _internal_scheduler_async__WEBPACK_IMPORTED_MODULE_9__["async"]; }); - -/* harmony import */ var _internal_scheduler_queue__WEBPACK_IMPORTED_MODULE_10__ = __webpack_require__(298); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "queueScheduler", function() { return _internal_scheduler_queue__WEBPACK_IMPORTED_MODULE_10__["queue"]; }); - -/* harmony import */ var _internal_scheduler_animationFrame__WEBPACK_IMPORTED_MODULE_11__ = __webpack_require__(392); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "animationFrameScheduler", function() { return _internal_scheduler_animationFrame__WEBPACK_IMPORTED_MODULE_11__["animationFrame"]; }); - -/* harmony import */ var _internal_scheduler_VirtualTimeScheduler__WEBPACK_IMPORTED_MODULE_12__ = __webpack_require__(395); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "VirtualTimeScheduler", function() { return _internal_scheduler_VirtualTimeScheduler__WEBPACK_IMPORTED_MODULE_12__["VirtualTimeScheduler"]; }); - -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "VirtualAction", function() { return _internal_scheduler_VirtualTimeScheduler__WEBPACK_IMPORTED_MODULE_12__["VirtualAction"]; }); - -/* harmony import */ var _internal_Scheduler__WEBPACK_IMPORTED_MODULE_13__ = __webpack_require__(203); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Scheduler", function() { return _internal_Scheduler__WEBPACK_IMPORTED_MODULE_13__["Scheduler"]; }); - -/* harmony import */ var _internal_Subscription__WEBPACK_IMPORTED_MODULE_14__ = __webpack_require__(177); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Subscription", function() { return _internal_Subscription__WEBPACK_IMPORTED_MODULE_14__["Subscription"]; }); - -/* harmony import */ var _internal_Subscriber__WEBPACK_IMPORTED_MODULE_15__ = __webpack_require__(172); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Subscriber", function() { return _internal_Subscriber__WEBPACK_IMPORTED_MODULE_15__["Subscriber"]; }); - -/* harmony import */ var _internal_Notification__WEBPACK_IMPORTED_MODULE_16__ = __webpack_require__(241); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "Notification", function() { return _internal_Notification__WEBPACK_IMPORTED_MODULE_16__["Notification"]; }); - -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "NotificationKind", function() { return _internal_Notification__WEBPACK_IMPORTED_MODULE_16__["NotificationKind"]; }); - -/* harmony import */ var _internal_util_pipe__WEBPACK_IMPORTED_MODULE_17__ = __webpack_require__(196); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pipe", function() { return _internal_util_pipe__WEBPACK_IMPORTED_MODULE_17__["pipe"]; }); - -/* harmony import */ var _internal_util_noop__WEBPACK_IMPORTED_MODULE_18__ = __webpack_require__(197); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "noop", function() { return _internal_util_noop__WEBPACK_IMPORTED_MODULE_18__["noop"]; }); - -/* harmony import */ var _internal_util_identity__WEBPACK_IMPORTED_MODULE_19__ = __webpack_require__(232); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "identity", function() { return _internal_util_identity__WEBPACK_IMPORTED_MODULE_19__["identity"]; }); - -/* harmony import */ var _internal_util_isObservable__WEBPACK_IMPORTED_MODULE_20__ = __webpack_require__(396); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "isObservable", function() { return _internal_util_isObservable__WEBPACK_IMPORTED_MODULE_20__["isObservable"]; }); - -/* harmony import */ var _internal_util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_21__ = __webpack_require__(250); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ArgumentOutOfRangeError", function() { return _internal_util_ArgumentOutOfRangeError__WEBPACK_IMPORTED_MODULE_21__["ArgumentOutOfRangeError"]; }); - -/* harmony import */ var _internal_util_EmptyError__WEBPACK_IMPORTED_MODULE_22__ = __webpack_require__(253); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "EmptyError", function() { return _internal_util_EmptyError__WEBPACK_IMPORTED_MODULE_22__["EmptyError"]; }); - -/* harmony import */ var _internal_util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_23__ = __webpack_require__(266); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "ObjectUnsubscribedError", function() { return _internal_util_ObjectUnsubscribedError__WEBPACK_IMPORTED_MODULE_23__["ObjectUnsubscribedError"]; }); - -/* harmony import */ var _internal_util_UnsubscriptionError__WEBPACK_IMPORTED_MODULE_24__ = __webpack_require__(180); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "UnsubscriptionError", function() { return _internal_util_UnsubscriptionError__WEBPACK_IMPORTED_MODULE_24__["UnsubscriptionError"]; }); - -/* harmony import */ var _internal_util_TimeoutError__WEBPACK_IMPORTED_MODULE_25__ = __webpack_require__(335); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "TimeoutError", function() { return _internal_util_TimeoutError__WEBPACK_IMPORTED_MODULE_25__["TimeoutError"]; }); - -/* harmony import */ var _internal_observable_bindCallback__WEBPACK_IMPORTED_MODULE_26__ = __webpack_require__(397); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bindCallback", function() { return _internal_observable_bindCallback__WEBPACK_IMPORTED_MODULE_26__["bindCallback"]; }); - -/* harmony import */ var _internal_observable_bindNodeCallback__WEBPACK_IMPORTED_MODULE_27__ = __webpack_require__(398); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "bindNodeCallback", function() { return _internal_observable_bindNodeCallback__WEBPACK_IMPORTED_MODULE_27__["bindNodeCallback"]; }); - -/* harmony import */ var _internal_observable_combineLatest__WEBPACK_IMPORTED_MODULE_28__ = __webpack_require__(214); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "combineLatest", function() { return _internal_observable_combineLatest__WEBPACK_IMPORTED_MODULE_28__["combineLatest"]; }); - -/* harmony import */ var _internal_observable_concat__WEBPACK_IMPORTED_MODULE_29__ = __webpack_require__(226); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "concat", function() { return _internal_observable_concat__WEBPACK_IMPORTED_MODULE_29__["concat"]; }); - -/* harmony import */ var _internal_observable_defer__WEBPACK_IMPORTED_MODULE_30__ = __webpack_require__(333); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "defer", function() { return _internal_observable_defer__WEBPACK_IMPORTED_MODULE_30__["defer"]; }); - -/* harmony import */ var _internal_observable_empty__WEBPACK_IMPORTED_MODULE_31__ = __webpack_require__(242); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "empty", function() { return _internal_observable_empty__WEBPACK_IMPORTED_MODULE_31__["empty"]; }); - -/* harmony import */ var _internal_observable_forkJoin__WEBPACK_IMPORTED_MODULE_32__ = __webpack_require__(399); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "forkJoin", function() { return _internal_observable_forkJoin__WEBPACK_IMPORTED_MODULE_32__["forkJoin"]; }); - -/* harmony import */ var _internal_observable_from__WEBPACK_IMPORTED_MODULE_33__ = __webpack_require__(218); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "from", function() { return _internal_observable_from__WEBPACK_IMPORTED_MODULE_33__["from"]; }); - -/* harmony import */ var _internal_observable_fromEvent__WEBPACK_IMPORTED_MODULE_34__ = __webpack_require__(400); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fromEvent", function() { return _internal_observable_fromEvent__WEBPACK_IMPORTED_MODULE_34__["fromEvent"]; }); - -/* harmony import */ var _internal_observable_fromEventPattern__WEBPACK_IMPORTED_MODULE_35__ = __webpack_require__(401); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "fromEventPattern", function() { return _internal_observable_fromEventPattern__WEBPACK_IMPORTED_MODULE_35__["fromEventPattern"]; }); - -/* harmony import */ var _internal_observable_generate__WEBPACK_IMPORTED_MODULE_36__ = __webpack_require__(402); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "generate", function() { return _internal_observable_generate__WEBPACK_IMPORTED_MODULE_36__["generate"]; }); - -/* harmony import */ var _internal_observable_iif__WEBPACK_IMPORTED_MODULE_37__ = __webpack_require__(403); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "iif", function() { return _internal_observable_iif__WEBPACK_IMPORTED_MODULE_37__["iif"]; }); - -/* harmony import */ var _internal_observable_interval__WEBPACK_IMPORTED_MODULE_38__ = __webpack_require__(404); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "interval", function() { return _internal_observable_interval__WEBPACK_IMPORTED_MODULE_38__["interval"]; }); - -/* harmony import */ var _internal_observable_merge__WEBPACK_IMPORTED_MODULE_39__ = __webpack_require__(278); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "merge", function() { return _internal_observable_merge__WEBPACK_IMPORTED_MODULE_39__["merge"]; }); - -/* harmony import */ var _internal_observable_never__WEBPACK_IMPORTED_MODULE_40__ = __webpack_require__(405); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "never", function() { return _internal_observable_never__WEBPACK_IMPORTED_MODULE_40__["never"]; }); - -/* harmony import */ var _internal_observable_of__WEBPACK_IMPORTED_MODULE_41__ = __webpack_require__(227); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "of", function() { return _internal_observable_of__WEBPACK_IMPORTED_MODULE_41__["of"]; }); - -/* harmony import */ var _internal_observable_onErrorResumeNext__WEBPACK_IMPORTED_MODULE_42__ = __webpack_require__(406); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "onErrorResumeNext", function() { return _internal_observable_onErrorResumeNext__WEBPACK_IMPORTED_MODULE_42__["onErrorResumeNext"]; }); - -/* harmony import */ var _internal_observable_pairs__WEBPACK_IMPORTED_MODULE_43__ = __webpack_require__(407); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "pairs", function() { return _internal_observable_pairs__WEBPACK_IMPORTED_MODULE_43__["pairs"]; }); - -/* harmony import */ var _internal_observable_partition__WEBPACK_IMPORTED_MODULE_44__ = __webpack_require__(408); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "partition", function() { return _internal_observable_partition__WEBPACK_IMPORTED_MODULE_44__["partition"]; }); - -/* harmony import */ var _internal_observable_race__WEBPACK_IMPORTED_MODULE_45__ = __webpack_require__(302); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "race", function() { return _internal_observable_race__WEBPACK_IMPORTED_MODULE_45__["race"]; }); - -/* harmony import */ var _internal_observable_range__WEBPACK_IMPORTED_MODULE_46__ = __webpack_require__(409); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "range", function() { return _internal_observable_range__WEBPACK_IMPORTED_MODULE_46__["range"]; }); - -/* harmony import */ var _internal_observable_throwError__WEBPACK_IMPORTED_MODULE_47__ = __webpack_require__(243); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "throwError", function() { return _internal_observable_throwError__WEBPACK_IMPORTED_MODULE_47__["throwError"]; }); - -/* harmony import */ var _internal_observable_timer__WEBPACK_IMPORTED_MODULE_48__ = __webpack_require__(204); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "timer", function() { return _internal_observable_timer__WEBPACK_IMPORTED_MODULE_48__["timer"]; }); - -/* harmony import */ var _internal_observable_using__WEBPACK_IMPORTED_MODULE_49__ = __webpack_require__(410); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "using", function() { return _internal_observable_using__WEBPACK_IMPORTED_MODULE_49__["using"]; }); - -/* harmony import */ var _internal_observable_zip__WEBPACK_IMPORTED_MODULE_50__ = __webpack_require__(346); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "zip", function() { return _internal_observable_zip__WEBPACK_IMPORTED_MODULE_50__["zip"]; }); - -/* harmony import */ var _internal_scheduled_scheduled__WEBPACK_IMPORTED_MODULE_51__ = __webpack_require__(219); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "scheduled", function() { return _internal_scheduled_scheduled__WEBPACK_IMPORTED_MODULE_51__["scheduled"]; }); - -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "EMPTY", function() { return _internal_observable_empty__WEBPACK_IMPORTED_MODULE_31__["EMPTY"]; }); - -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "NEVER", function() { return _internal_observable_never__WEBPACK_IMPORTED_MODULE_40__["NEVER"]; }); - -/* harmony import */ var _internal_config__WEBPACK_IMPORTED_MODULE_52__ = __webpack_require__(175); -/* harmony reexport (safe) */ __webpack_require__.d(__webpack_exports__, "config", function() { return _internal_config__WEBPACK_IMPORTED_MODULE_52__["config"]; }); - -/** PURE_IMPORTS_START PURE_IMPORTS_END */ +}; +const SIGRTMIN=34; +const SIGRTMAX=64;exports.SIGRTMAX=SIGRTMAX; +//# sourceMappingURL=realtime.js.map +/***/ }), +/* 395 */ +/***/ (function(module, exports, __webpack_require__) { +"use strict"; +const aliases = ['stdin', 'stdout', 'stderr']; +const hasAlias = opts => aliases.some(alias => opts[alias] !== undefined); +const normalizeStdio = opts => { + if (!opts) { + return; + } + const {stdio} = opts; + if (stdio === undefined) { + return aliases.map(alias => opts[alias]); + } + if (hasAlias(opts)) { + throw new Error(`It's not possible to provide \`stdio\` in combination with one of ${aliases.map(alias => `\`${alias}\``).join(', ')}`); + } + if (typeof stdio === 'string') { + return stdio; + } + if (!Array.isArray(stdio)) { + throw new TypeError(`Expected \`stdio\` to be of type \`string\` or \`Array\`, got \`${typeof stdio}\``); + } + const length = Math.max(stdio.length, aliases.length); + return Array.from({length}, (value, index) => stdio[index]); +}; +module.exports = normalizeStdio; +// `ipc` is pushed unless it is already present +module.exports.node = opts => { + const stdio = normalizeStdio(opts); + if (stdio === 'ipc') { + return 'ipc'; + } + if (stdio === undefined || typeof stdio === 'string') { + return [stdio, stdio, stdio, 'ipc']; + } + if (stdio.includes('ipc')) { + return stdio; + } + return [...stdio, 'ipc']; +}; +/***/ }), +/* 396 */ +/***/ (function(module, exports, __webpack_require__) { +"use strict"; +const os = __webpack_require__(11); +const onExit = __webpack_require__(397); +const DEFAULT_FORCE_KILL_TIMEOUT = 1000 * 5; +// Monkey-patches `childProcess.kill()` to add `forceKillAfterTimeout` behavior +const spawnedKill = (kill, signal = 'SIGTERM', options = {}) => { + const killResult = kill(signal); + setKillTimeout(kill, signal, options, killResult); + return killResult; +}; +const setKillTimeout = (kill, signal, options, killResult) => { + if (!shouldForceKill(signal, options, killResult)) { + return; + } + const timeout = getForceKillAfterTimeout(options); + const t = setTimeout(() => { + kill('SIGKILL'); + }, timeout); + // Guarded because there's no `.unref()` when `execa` is used in the renderer + // process in Electron. This cannot be tested since we don't run tests in + // Electron. + // istanbul ignore else + if (t.unref) { + t.unref(); + } +}; +const shouldForceKill = (signal, {forceKillAfterTimeout}, killResult) => { + return isSigterm(signal) && forceKillAfterTimeout !== false && killResult; +}; +const isSigterm = signal => { + return signal === os.constants.signals.SIGTERM || + (typeof signal === 'string' && signal.toUpperCase() === 'SIGTERM'); +}; +const getForceKillAfterTimeout = ({forceKillAfterTimeout = true}) => { + if (forceKillAfterTimeout === true) { + return DEFAULT_FORCE_KILL_TIMEOUT; + } + if (!Number.isInteger(forceKillAfterTimeout) || forceKillAfterTimeout < 0) { + throw new TypeError(`Expected the \`forceKillAfterTimeout\` option to be a non-negative integer, got \`${forceKillAfterTimeout}\` (${typeof forceKillAfterTimeout})`); + } + return forceKillAfterTimeout; +}; +// `childProcess.cancel()` +const spawnedCancel = (spawned, context) => { + const killResult = spawned.kill(); + if (killResult) { + context.isCanceled = true; + } +}; +const timeoutKill = (spawned, signal, reject) => { + spawned.kill(signal); + reject(Object.assign(new Error('Timed out'), {timedOut: true, signal})); +}; +// `timeout` option handling +const setupTimeout = (spawned, {timeout, killSignal = 'SIGTERM'}, spawnedPromise) => { + if (timeout === 0 || timeout === undefined) { + return spawnedPromise; + } + if (!Number.isInteger(timeout) || timeout < 0) { + throw new TypeError(`Expected the \`timeout\` option to be a non-negative integer, got \`${timeout}\` (${typeof timeout})`); + } + let timeoutId; + const timeoutPromise = new Promise((resolve, reject) => { + timeoutId = setTimeout(() => { + timeoutKill(spawned, killSignal, reject); + }, timeout); + }); + const safeSpawnedPromise = spawnedPromise.finally(() => { + clearTimeout(timeoutId); + }); + return Promise.race([timeoutPromise, safeSpawnedPromise]); +}; +// `cleanup` option handling +const setExitHandler = async (spawned, {cleanup, detached}, timedPromise) => { + if (!cleanup || detached) { + return timedPromise; + } + const removeExitHandler = onExit(() => { + spawned.kill(); + }); + return timedPromise.finally(() => { + removeExitHandler(); + }); +}; +module.exports = { + spawnedKill, + spawnedCancel, + setupTimeout, + setExitHandler +}; +/***/ }), +/* 397 */ +/***/ (function(module, exports, __webpack_require__) { +// Note: since nyc uses this module to output coverage, any lines +// that are in the direct sync flow of nyc's outputCoverage are +// ignored, since we can never get coverage for them. +var assert = __webpack_require__(30) +var signals = __webpack_require__(398) +var EE = __webpack_require__(399) +/* istanbul ignore if */ +if (typeof EE !== 'function') { + EE = EE.EventEmitter +} +var emitter +if (process.__signal_exit_emitter__) { + emitter = process.__signal_exit_emitter__ +} else { + emitter = process.__signal_exit_emitter__ = new EE() + emitter.count = 0 + emitter.emitted = {} +} +// Because this emitter is a global, we have to check to see if a +// previous version of this library failed to enable infinite listeners. +// I know what you're about to say. But literally everything about +// signal-exit is a compromise with evil. Get used to it. +if (!emitter.infinite) { + emitter.setMaxListeners(Infinity) + emitter.infinite = true +} +module.exports = function (cb, opts) { + assert.equal(typeof cb, 'function', 'a callback must be provided for exit handler') + if (loaded === false) { + load() + } + var ev = 'exit' + if (opts && opts.alwaysLast) { + ev = 'afterexit' + } + var remove = function () { + emitter.removeListener(ev, cb) + if (emitter.listeners('exit').length === 0 && + emitter.listeners('afterexit').length === 0) { + unload() + } + } + emitter.on(ev, cb) -//# sourceMappingURL=index.js.map + return remove +} +module.exports.unload = unload +function unload () { + if (!loaded) { + return + } + loaded = false -/***/ }), -/* 392 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + signals.forEach(function (sig) { + try { + process.removeListener(sig, sigListeners[sig]) + } catch (er) {} + }) + process.emit = originalProcessEmit + process.reallyExit = originalProcessReallyExit + emitter.count -= 1 +} -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "animationFrame", function() { return animationFrame; }); -/* harmony import */ var _AnimationFrameAction__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(393); -/* harmony import */ var _AnimationFrameScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(394); -/** PURE_IMPORTS_START _AnimationFrameAction,_AnimationFrameScheduler PURE_IMPORTS_END */ +function emit (event, code, signal) { + if (emitter.emitted[event]) { + return + } + emitter.emitted[event] = true + emitter.emit(event, code, signal) +} +// { : , ... } +var sigListeners = {} +signals.forEach(function (sig) { + sigListeners[sig] = function listener () { + // If there are no other listeners, an exit is coming! + // Simplest way: remove us and then re-send the signal. + // We know that this will kill the process, so we can + // safely emit now. + var listeners = process.listeners(sig) + if (listeners.length === emitter.count) { + unload() + emit('exit', null, sig) + /* istanbul ignore next */ + emit('afterexit', null, sig) + /* istanbul ignore next */ + process.kill(process.pid, sig) + } + } +}) -var animationFrame = /*@__PURE__*/ new _AnimationFrameScheduler__WEBPACK_IMPORTED_MODULE_1__["AnimationFrameScheduler"](_AnimationFrameAction__WEBPACK_IMPORTED_MODULE_0__["AnimationFrameAction"]); -//# sourceMappingURL=animationFrame.js.map +module.exports.signals = function () { + return signals +} +module.exports.load = load -/***/ }), -/* 393 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +var loaded = false -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AnimationFrameAction", function() { return AnimationFrameAction; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _AsyncAction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(200); -/** PURE_IMPORTS_START tslib,_AsyncAction PURE_IMPORTS_END */ +function load () { + if (loaded) { + return + } + loaded = true + // This is the number of onSignalExit's that are in play. + // It's important so that we can count the correct number of + // listeners on signals, and don't wait for the other one to + // handle it instead of us. + emitter.count += 1 -var AnimationFrameAction = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AnimationFrameAction, _super); - function AnimationFrameAction(scheduler, work) { - var _this = _super.call(this, scheduler, work) || this; - _this.scheduler = scheduler; - _this.work = work; - return _this; + signals = signals.filter(function (sig) { + try { + process.on(sig, sigListeners[sig]) + return true + } catch (er) { + return false } - AnimationFrameAction.prototype.requestAsyncId = function (scheduler, id, delay) { - if (delay === void 0) { - delay = 0; - } - if (delay !== null && delay > 0) { - return _super.prototype.requestAsyncId.call(this, scheduler, id, delay); - } - scheduler.actions.push(this); - return scheduler.scheduled || (scheduler.scheduled = requestAnimationFrame(function () { return scheduler.flush(null); })); - }; - AnimationFrameAction.prototype.recycleAsyncId = function (scheduler, id, delay) { - if (delay === void 0) { - delay = 0; - } - if ((delay !== null && delay > 0) || (delay === null && this.delay > 0)) { - return _super.prototype.recycleAsyncId.call(this, scheduler, id, delay); - } - if (scheduler.actions.length === 0) { - cancelAnimationFrame(id); - scheduler.scheduled = undefined; - } - return undefined; - }; - return AnimationFrameAction; -}(_AsyncAction__WEBPACK_IMPORTED_MODULE_1__["AsyncAction"])); - -//# sourceMappingURL=AnimationFrameAction.js.map - - -/***/ }), -/* 394 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + }) -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "AnimationFrameScheduler", function() { return AnimationFrameScheduler; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(202); -/** PURE_IMPORTS_START tslib,_AsyncScheduler PURE_IMPORTS_END */ + process.emit = processEmit + process.reallyExit = processReallyExit +} +var originalProcessReallyExit = process.reallyExit +function processReallyExit (code) { + process.exitCode = code || 0 + emit('exit', process.exitCode, null) + /* istanbul ignore next */ + emit('afterexit', process.exitCode, null) + /* istanbul ignore next */ + originalProcessReallyExit.call(process, process.exitCode) +} -var AnimationFrameScheduler = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](AnimationFrameScheduler, _super); - function AnimationFrameScheduler() { - return _super !== null && _super.apply(this, arguments) || this; +var originalProcessEmit = process.emit +function processEmit (ev, arg) { + if (ev === 'exit') { + if (arg !== undefined) { + process.exitCode = arg } - AnimationFrameScheduler.prototype.flush = function (action) { - this.active = true; - this.scheduled = undefined; - var actions = this.actions; - var error; - var index = -1; - var count = actions.length; - action = action || actions.shift(); - do { - if (error = action.execute(action.state, action.delay)) { - break; - } - } while (++index < count && (action = actions.shift())); - this.active = false; - if (error) { - while (++index < count && (action = actions.shift())) { - action.unsubscribe(); - } - throw error; - } - }; - return AnimationFrameScheduler; -}(_AsyncScheduler__WEBPACK_IMPORTED_MODULE_1__["AsyncScheduler"])); - -//# sourceMappingURL=AnimationFrameScheduler.js.map + var ret = originalProcessEmit.apply(this, arguments) + emit('exit', process.exitCode, null) + /* istanbul ignore next */ + emit('afterexit', process.exitCode, null) + return ret + } else { + return originalProcessEmit.apply(this, arguments) + } +} /***/ }), -/* 395 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VirtualTimeScheduler", function() { return VirtualTimeScheduler; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "VirtualAction", function() { return VirtualAction; }); -/* harmony import */ var tslib__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(36); -/* harmony import */ var _AsyncAction__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(200); -/* harmony import */ var _AsyncScheduler__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(202); -/** PURE_IMPORTS_START tslib,_AsyncAction,_AsyncScheduler PURE_IMPORTS_END */ - - +/* 398 */ +/***/ (function(module, exports) { -var VirtualTimeScheduler = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](VirtualTimeScheduler, _super); - function VirtualTimeScheduler(SchedulerAction, maxFrames) { - if (SchedulerAction === void 0) { - SchedulerAction = VirtualAction; - } - if (maxFrames === void 0) { - maxFrames = Number.POSITIVE_INFINITY; - } - var _this = _super.call(this, SchedulerAction, function () { return _this.frame; }) || this; - _this.maxFrames = maxFrames; - _this.frame = 0; - _this.index = -1; - return _this; - } - VirtualTimeScheduler.prototype.flush = function () { - var _a = this, actions = _a.actions, maxFrames = _a.maxFrames; - var error, action; - while ((action = actions[0]) && action.delay <= maxFrames) { - actions.shift(); - this.frame = action.delay; - if (error = action.execute(action.state, action.delay)) { - break; - } - } - if (error) { - while (action = actions.shift()) { - action.unsubscribe(); - } - throw error; - } - }; - VirtualTimeScheduler.frameTimeFactor = 10; - return VirtualTimeScheduler; -}(_AsyncScheduler__WEBPACK_IMPORTED_MODULE_2__["AsyncScheduler"])); +// This is not the set of all possible signals. +// +// It IS, however, the set of all signals that trigger +// an exit on either Linux or BSD systems. Linux is a +// superset of the signal names supported on BSD, and +// the unknown signals just fail to register, so we can +// catch that easily enough. +// +// Don't bother with SIGKILL. It's uncatchable, which +// means that we can't fire any callbacks anyway. +// +// If a user does happen to register a handler on a non- +// fatal signal like SIGWINCH or something, and then +// exit, it'll end up firing `process.emit('exit')`, so +// the handler will be fired anyway. +// +// SIGBUS, SIGFPE, SIGSEGV and SIGILL, when not raised +// artificially, inherently leave the process in a +// state from which it is not safe to try and enter JS +// listeners. +module.exports = [ + 'SIGABRT', + 'SIGALRM', + 'SIGHUP', + 'SIGINT', + 'SIGTERM' +] -var VirtualAction = /*@__PURE__*/ (function (_super) { - tslib__WEBPACK_IMPORTED_MODULE_0__["__extends"](VirtualAction, _super); - function VirtualAction(scheduler, work, index) { - if (index === void 0) { - index = scheduler.index += 1; - } - var _this = _super.call(this, scheduler, work) || this; - _this.scheduler = scheduler; - _this.work = work; - _this.index = index; - _this.active = true; - _this.index = scheduler.index = index; - return _this; - } - VirtualAction.prototype.schedule = function (state, delay) { - if (delay === void 0) { - delay = 0; - } - if (!this.id) { - return _super.prototype.schedule.call(this, state, delay); - } - this.active = false; - var action = new VirtualAction(this.scheduler, this.work); - this.add(action); - return action.schedule(state, delay); - }; - VirtualAction.prototype.requestAsyncId = function (scheduler, id, delay) { - if (delay === void 0) { - delay = 0; - } - this.delay = scheduler.frame + delay; - var actions = scheduler.actions; - actions.push(this); - actions.sort(VirtualAction.sortActions); - return true; - }; - VirtualAction.prototype.recycleAsyncId = function (scheduler, id, delay) { - if (delay === void 0) { - delay = 0; - } - return undefined; - }; - VirtualAction.prototype._execute = function (state, delay) { - if (this.active === true) { - return _super.prototype._execute.call(this, state, delay); - } - }; - VirtualAction.sortActions = function (a, b) { - if (a.delay === b.delay) { - if (a.index === b.index) { - return 0; - } - else if (a.index > b.index) { - return 1; - } - else { - return -1; - } - } - else if (a.delay > b.delay) { - return 1; - } - else { - return -1; - } - }; - return VirtualAction; -}(_AsyncAction__WEBPACK_IMPORTED_MODULE_1__["AsyncAction"])); +if (process.platform !== 'win32') { + module.exports.push( + 'SIGVTALRM', + 'SIGXCPU', + 'SIGXFSZ', + 'SIGUSR2', + 'SIGTRAP', + 'SIGSYS', + 'SIGQUIT', + 'SIGIOT' + // should detect profiler and enable/disable accordingly. + // see #21 + // 'SIGPROF' + ) +} -//# sourceMappingURL=VirtualTimeScheduler.js.map +if (process.platform === 'linux') { + module.exports.push( + 'SIGIO', + 'SIGPOLL', + 'SIGPWR', + 'SIGSTKFLT', + 'SIGUNUSED' + ) +} /***/ }), -/* 396 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { - -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "isObservable", function() { return isObservable; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(193); -/** PURE_IMPORTS_START _Observable PURE_IMPORTS_END */ - -function isObservable(obj) { - return !!obj && (obj instanceof _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"] || (typeof obj.lift === 'function' && typeof obj.subscribe === 'function')); -} -//# sourceMappingURL=isObservable.js.map +/* 399 */ +/***/ (function(module, exports) { +module.exports = require("events"); /***/ }), -/* 397 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 400 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bindCallback", function() { return bindCallback; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(193); -/* harmony import */ var _AsyncSubject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(295); -/* harmony import */ var _operators_map__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(231); -/* harmony import */ var _util_canReportError__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(194); -/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(178); -/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(206); -/** PURE_IMPORTS_START _Observable,_AsyncSubject,_operators_map,_util_canReportError,_util_isArray,_util_isScheduler PURE_IMPORTS_END */ - - - +const isStream = __webpack_require__(401); +const getStream = __webpack_require__(402); +const mergeStream = __webpack_require__(408); +// `input` option +const handleInput = (spawned, input) => { + // Checking for stdin is workaround for https://github.com/nodejs/node/issues/26852 + // TODO: Remove `|| spawned.stdin === undefined` once we drop support for Node.js <=12.2.0 + if (input === undefined || spawned.stdin === undefined) { + return; + } -function bindCallback(callbackFunc, resultSelector, scheduler) { - if (resultSelector) { - if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_5__["isScheduler"])(resultSelector)) { - scheduler = resultSelector; - } - else { - return function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } - return bindCallback(callbackFunc, scheduler).apply(void 0, args).pipe(Object(_operators_map__WEBPACK_IMPORTED_MODULE_2__["map"])(function (args) { return Object(_util_isArray__WEBPACK_IMPORTED_MODULE_4__["isArray"])(args) ? resultSelector.apply(void 0, args) : resultSelector(args); })); - }; - } - } - return function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } - var context = this; - var subject; - var params = { - context: context, - subject: subject, - callbackFunc: callbackFunc, - scheduler: scheduler, - }; - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - if (!scheduler) { - if (!subject) { - subject = new _AsyncSubject__WEBPACK_IMPORTED_MODULE_1__["AsyncSubject"](); - var handler = function () { - var innerArgs = []; - for (var _i = 0; _i < arguments.length; _i++) { - innerArgs[_i] = arguments[_i]; - } - subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs); - subject.complete(); - }; - try { - callbackFunc.apply(context, args.concat([handler])); - } - catch (err) { - if (Object(_util_canReportError__WEBPACK_IMPORTED_MODULE_3__["canReportError"])(subject)) { - subject.error(err); - } - else { - console.warn(err); - } - } - } - return subject.subscribe(subscriber); - } - else { - var state = { - args: args, subscriber: subscriber, params: params, - }; - return scheduler.schedule(dispatch, 0, state); - } - }); - }; -} -function dispatch(state) { - var _this = this; - var self = this; - var args = state.args, subscriber = state.subscriber, params = state.params; - var callbackFunc = params.callbackFunc, context = params.context, scheduler = params.scheduler; - var subject = params.subject; - if (!subject) { - subject = params.subject = new _AsyncSubject__WEBPACK_IMPORTED_MODULE_1__["AsyncSubject"](); - var handler = function () { - var innerArgs = []; - for (var _i = 0; _i < arguments.length; _i++) { - innerArgs[_i] = arguments[_i]; - } - var value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs; - _this.add(scheduler.schedule(dispatchNext, 0, { value: value, subject: subject })); - }; - try { - callbackFunc.apply(context, args.concat([handler])); - } - catch (err) { - subject.error(err); - } - } - this.add(subject.subscribe(subscriber)); -} -function dispatchNext(state) { - var value = state.value, subject = state.subject; - subject.next(value); - subject.complete(); -} -function dispatchError(state) { - var err = state.err, subject = state.subject; - subject.error(err); -} -//# sourceMappingURL=bindCallback.js.map + if (isStream(input)) { + input.pipe(spawned.stdin); + } else { + spawned.stdin.end(input); + } +}; +// `all` interleaves `stdout` and `stderr` +const makeAllStream = (spawned, {all}) => { + if (!all || (!spawned.stdout && !spawned.stderr)) { + return; + } -/***/ }), -/* 398 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + const mixed = mergeStream(); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "bindNodeCallback", function() { return bindNodeCallback; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(193); -/* harmony import */ var _AsyncSubject__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(295); -/* harmony import */ var _operators_map__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(231); -/* harmony import */ var _util_canReportError__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(194); -/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(206); -/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(178); -/** PURE_IMPORTS_START _Observable,_AsyncSubject,_operators_map,_util_canReportError,_util_isScheduler,_util_isArray PURE_IMPORTS_END */ + if (spawned.stdout) { + mixed.add(spawned.stdout); + } + if (spawned.stderr) { + mixed.add(spawned.stderr); + } + return mixed; +}; +// On failure, `result.stdout|stderr|all` should contain the currently buffered stream +const getBufferedData = async (stream, streamPromise) => { + if (!stream) { + return; + } + stream.destroy(); + try { + return await streamPromise; + } catch (error) { + return error.bufferedData; + } +}; + +const getStreamPromise = (stream, {encoding, buffer, maxBuffer}) => { + if (!stream || !buffer) { + return; + } + + if (encoding) { + return getStream(stream, {encoding, maxBuffer}); + } + + return getStream.buffer(stream, {maxBuffer}); +}; + +// Retrieve result of child process: exit code, signal, error, streams (stdout/stderr/all) +const getSpawnedResult = async ({stdout, stderr, all}, {encoding, buffer, maxBuffer}, processDone) => { + const stdoutPromise = getStreamPromise(stdout, {encoding, buffer, maxBuffer}); + const stderrPromise = getStreamPromise(stderr, {encoding, buffer, maxBuffer}); + const allPromise = getStreamPromise(all, {encoding, buffer, maxBuffer: maxBuffer * 2}); + + try { + return await Promise.all([processDone, stdoutPromise, stderrPromise, allPromise]); + } catch (error) { + return Promise.all([ + {error, signal: error.signal, timedOut: error.timedOut}, + getBufferedData(stdout, stdoutPromise), + getBufferedData(stderr, stderrPromise), + getBufferedData(all, allPromise) + ]); + } +}; + +const validateInputSync = ({input}) => { + if (isStream(input)) { + throw new TypeError('The `input` option cannot be a stream in sync mode'); + } +}; + +module.exports = { + handleInput, + makeAllStream, + getSpawnedResult, + validateInputSync +}; -function bindNodeCallback(callbackFunc, resultSelector, scheduler) { - if (resultSelector) { - if (Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_4__["isScheduler"])(resultSelector)) { - scheduler = resultSelector; - } - else { - return function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } - return bindNodeCallback(callbackFunc, scheduler).apply(void 0, args).pipe(Object(_operators_map__WEBPACK_IMPORTED_MODULE_2__["map"])(function (args) { return Object(_util_isArray__WEBPACK_IMPORTED_MODULE_5__["isArray"])(args) ? resultSelector.apply(void 0, args) : resultSelector(args); })); - }; - } - } - return function () { - var args = []; - for (var _i = 0; _i < arguments.length; _i++) { - args[_i] = arguments[_i]; - } - var params = { - subject: undefined, - args: args, - callbackFunc: callbackFunc, - scheduler: scheduler, - context: this, - }; - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var context = params.context; - var subject = params.subject; - if (!scheduler) { - if (!subject) { - subject = params.subject = new _AsyncSubject__WEBPACK_IMPORTED_MODULE_1__["AsyncSubject"](); - var handler = function () { - var innerArgs = []; - for (var _i = 0; _i < arguments.length; _i++) { - innerArgs[_i] = arguments[_i]; - } - var err = innerArgs.shift(); - if (err) { - subject.error(err); - return; - } - subject.next(innerArgs.length <= 1 ? innerArgs[0] : innerArgs); - subject.complete(); - }; - try { - callbackFunc.apply(context, args.concat([handler])); - } - catch (err) { - if (Object(_util_canReportError__WEBPACK_IMPORTED_MODULE_3__["canReportError"])(subject)) { - subject.error(err); - } - else { - console.warn(err); - } - } - } - return subject.subscribe(subscriber); - } - else { - return scheduler.schedule(dispatch, 0, { params: params, subscriber: subscriber, context: context }); - } - }); - }; -} -function dispatch(state) { - var _this = this; - var params = state.params, subscriber = state.subscriber, context = state.context; - var callbackFunc = params.callbackFunc, args = params.args, scheduler = params.scheduler; - var subject = params.subject; - if (!subject) { - subject = params.subject = new _AsyncSubject__WEBPACK_IMPORTED_MODULE_1__["AsyncSubject"](); - var handler = function () { - var innerArgs = []; - for (var _i = 0; _i < arguments.length; _i++) { - innerArgs[_i] = arguments[_i]; - } - var err = innerArgs.shift(); - if (err) { - _this.add(scheduler.schedule(dispatchError, 0, { err: err, subject: subject })); - } - else { - var value = innerArgs.length <= 1 ? innerArgs[0] : innerArgs; - _this.add(scheduler.schedule(dispatchNext, 0, { value: value, subject: subject })); - } - }; - try { - callbackFunc.apply(context, args.concat([handler])); - } - catch (err) { - this.add(scheduler.schedule(dispatchError, 0, { err: err, subject: subject })); - } - } - this.add(subject.subscribe(subscriber)); -} -function dispatchNext(arg) { - var value = arg.value, subject = arg.subject; - subject.next(value); - subject.complete(); -} -function dispatchError(arg) { - var err = arg.err, subject = arg.subject; - subject.error(err); -} -//# sourceMappingURL=bindNodeCallback.js.map /***/ }), -/* 399 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 401 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "forkJoin", function() { return forkJoin; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(193); -/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(178); -/* harmony import */ var _operators_map__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(231); -/* harmony import */ var _util_isObject__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(179); -/* harmony import */ var _from__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(218); -/** PURE_IMPORTS_START _Observable,_util_isArray,_operators_map,_util_isObject,_from PURE_IMPORTS_END */ +const isStream = stream => + stream !== null && + typeof stream === 'object' && + typeof stream.pipe === 'function'; +isStream.writable = stream => + isStream(stream) && + stream.writable !== false && + typeof stream._write === 'function' && + typeof stream._writableState === 'object'; +isStream.readable = stream => + isStream(stream) && + stream.readable !== false && + typeof stream._read === 'function' && + typeof stream._readableState === 'object'; -function forkJoin() { - var sources = []; - for (var _i = 0; _i < arguments.length; _i++) { - sources[_i] = arguments[_i]; - } - if (sources.length === 1) { - var first_1 = sources[0]; - if (Object(_util_isArray__WEBPACK_IMPORTED_MODULE_1__["isArray"])(first_1)) { - return forkJoinInternal(first_1, null); - } - if (Object(_util_isObject__WEBPACK_IMPORTED_MODULE_3__["isObject"])(first_1) && Object.getPrototypeOf(first_1) === Object.prototype) { - var keys = Object.keys(first_1); - return forkJoinInternal(keys.map(function (key) { return first_1[key]; }), keys); - } - } - if (typeof sources[sources.length - 1] === 'function') { - var resultSelector_1 = sources.pop(); - sources = (sources.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_1__["isArray"])(sources[0])) ? sources[0] : sources; - return forkJoinInternal(sources, null).pipe(Object(_operators_map__WEBPACK_IMPORTED_MODULE_2__["map"])(function (args) { return resultSelector_1.apply(void 0, args); })); - } - return forkJoinInternal(sources, null); -} -function forkJoinInternal(sources, keys) { - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var len = sources.length; - if (len === 0) { - subscriber.complete(); - return; - } - var values = new Array(len); - var completed = 0; - var emitted = 0; - var _loop_1 = function (i) { - var source = Object(_from__WEBPACK_IMPORTED_MODULE_4__["from"])(sources[i]); - var hasValue = false; - subscriber.add(source.subscribe({ - next: function (value) { - if (!hasValue) { - hasValue = true; - emitted++; - } - values[i] = value; - }, - error: function (err) { return subscriber.error(err); }, - complete: function () { - completed++; - if (completed === len || !hasValue) { - if (emitted === len) { - subscriber.next(keys ? - keys.reduce(function (result, key, i) { return (result[key] = values[i], result); }, {}) : - values); - } - subscriber.complete(); - } - } - })); - }; - for (var i = 0; i < len; i++) { - _loop_1(i); - } - }); -} -//# sourceMappingURL=forkJoin.js.map +isStream.duplex = stream => + isStream.writable(stream) && + isStream.readable(stream); + +isStream.transform = stream => + isStream.duplex(stream) && + typeof stream._transform === 'function' && + typeof stream._transformState === 'object'; + +module.exports = isStream; /***/ }), -/* 400 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 402 */ +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fromEvent", function() { return fromEvent; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(193); -/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(178); -/* harmony import */ var _util_isFunction__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(173); -/* harmony import */ var _operators_map__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(231); -/** PURE_IMPORTS_START _Observable,_util_isArray,_util_isFunction,_operators_map PURE_IMPORTS_END */ +const pump = __webpack_require__(403); +const bufferStream = __webpack_require__(407); +class MaxBufferError extends Error { + constructor() { + super('maxBuffer exceeded'); + this.name = 'MaxBufferError'; + } +} +async function getStream(inputStream, options) { + if (!inputStream) { + return Promise.reject(new Error('Expected a stream')); + } -var toString = /*@__PURE__*/ (function () { return Object.prototype.toString; })(); -function fromEvent(target, eventName, options, resultSelector) { - if (Object(_util_isFunction__WEBPACK_IMPORTED_MODULE_2__["isFunction"])(options)) { - resultSelector = options; - options = undefined; - } - if (resultSelector) { - return fromEvent(target, eventName, options).pipe(Object(_operators_map__WEBPACK_IMPORTED_MODULE_3__["map"])(function (args) { return Object(_util_isArray__WEBPACK_IMPORTED_MODULE_1__["isArray"])(args) ? resultSelector.apply(void 0, args) : resultSelector(args); })); - } - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - function handler(e) { - if (arguments.length > 1) { - subscriber.next(Array.prototype.slice.call(arguments)); - } - else { - subscriber.next(e); - } - } - setupSubscription(target, eventName, handler, subscriber, options); - }); -} -function setupSubscription(sourceObj, eventName, handler, subscriber, options) { - var unsubscribe; - if (isEventTarget(sourceObj)) { - var source_1 = sourceObj; - sourceObj.addEventListener(eventName, handler, options); - unsubscribe = function () { return source_1.removeEventListener(eventName, handler, options); }; - } - else if (isJQueryStyleEventEmitter(sourceObj)) { - var source_2 = sourceObj; - sourceObj.on(eventName, handler); - unsubscribe = function () { return source_2.off(eventName, handler); }; - } - else if (isNodeStyleEventEmitter(sourceObj)) { - var source_3 = sourceObj; - sourceObj.addListener(eventName, handler); - unsubscribe = function () { return source_3.removeListener(eventName, handler); }; - } - else if (sourceObj && sourceObj.length) { - for (var i = 0, len = sourceObj.length; i < len; i++) { - setupSubscription(sourceObj[i], eventName, handler, subscriber, options); - } - } - else { - throw new TypeError('Invalid event target'); - } - subscriber.add(unsubscribe); + options = { + maxBuffer: Infinity, + ...options + }; + + const {maxBuffer} = options; + + let stream; + await new Promise((resolve, reject) => { + const rejectPromise = error => { + if (error) { // A null check + error.bufferedData = stream.getBufferedValue(); + } + + reject(error); + }; + + stream = pump(inputStream, bufferStream(options), error => { + if (error) { + rejectPromise(error); + return; + } + + resolve(); + }); + + stream.on('data', () => { + if (stream.getBufferedLength() > maxBuffer) { + rejectPromise(new MaxBufferError()); + } + }); + }); + + return stream.getBufferedValue(); } -function isNodeStyleEventEmitter(sourceObj) { - return sourceObj && typeof sourceObj.addListener === 'function' && typeof sourceObj.removeListener === 'function'; + +module.exports = getStream; +// TODO: Remove this for the next major release +module.exports.default = getStream; +module.exports.buffer = (stream, options) => getStream(stream, {...options, encoding: 'buffer'}); +module.exports.array = (stream, options) => getStream(stream, {...options, array: true}); +module.exports.MaxBufferError = MaxBufferError; + + +/***/ }), +/* 403 */ +/***/ (function(module, exports, __webpack_require__) { + +var once = __webpack_require__(404) +var eos = __webpack_require__(406) +var fs = __webpack_require__(23) // we only need fs to get the ReadStream and WriteStream prototypes + +var noop = function () {} +var ancient = /^v?\.0/.test(process.version) + +var isFn = function (fn) { + return typeof fn === 'function' } -function isJQueryStyleEventEmitter(sourceObj) { - return sourceObj && typeof sourceObj.on === 'function' && typeof sourceObj.off === 'function'; + +var isFS = function (stream) { + if (!ancient) return false // newer node version do not need to care about fs is a special way + if (!fs) return false // browser + return (stream instanceof (fs.ReadStream || noop) || stream instanceof (fs.WriteStream || noop)) && isFn(stream.close) } -function isEventTarget(sourceObj) { - return sourceObj && typeof sourceObj.addEventListener === 'function' && typeof sourceObj.removeEventListener === 'function'; + +var isRequest = function (stream) { + return stream.setHeader && isFn(stream.abort) } -//# sourceMappingURL=fromEvent.js.map +var destroyer = function (stream, reading, writing, callback) { + callback = once(callback) -/***/ }), -/* 401 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + var closed = false + stream.on('close', function () { + closed = true + }) -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "fromEventPattern", function() { return fromEventPattern; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(193); -/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(178); -/* harmony import */ var _util_isFunction__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(173); -/* harmony import */ var _operators_map__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(231); -/** PURE_IMPORTS_START _Observable,_util_isArray,_util_isFunction,_operators_map PURE_IMPORTS_END */ + eos(stream, {readable: reading, writable: writing}, function (err) { + if (err) return callback(err) + closed = true + callback() + }) + var destroyed = false + return function (err) { + if (closed) return + if (destroyed) return + destroyed = true + if (isFS(stream)) return stream.close(noop) // use close for fs streams to avoid fd leaks + if (isRequest(stream)) return stream.abort() // request.destroy just do .end - .abort is what we want + if (isFn(stream.destroy)) return stream.destroy() -function fromEventPattern(addHandler, removeHandler, resultSelector) { - if (resultSelector) { - return fromEventPattern(addHandler, removeHandler).pipe(Object(_operators_map__WEBPACK_IMPORTED_MODULE_3__["map"])(function (args) { return Object(_util_isArray__WEBPACK_IMPORTED_MODULE_1__["isArray"])(args) ? resultSelector.apply(void 0, args) : resultSelector(args); })); - } - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var handler = function () { - var e = []; - for (var _i = 0; _i < arguments.length; _i++) { - e[_i] = arguments[_i]; - } - return subscriber.next(e.length === 1 ? e[0] : e); - }; - var retValue; - try { - retValue = addHandler(handler); - } - catch (err) { - subscriber.error(err); - return undefined; - } - if (!Object(_util_isFunction__WEBPACK_IMPORTED_MODULE_2__["isFunction"])(removeHandler)) { - return undefined; - } - return function () { return removeHandler(handler, retValue); }; - }); + callback(err || new Error('stream was destroyed')) + } } -//# sourceMappingURL=fromEventPattern.js.map +var call = function (fn) { + fn() +} -/***/ }), -/* 402 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +var pipe = function (from, to) { + return from.pipe(to) +} -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "generate", function() { return generate; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(193); -/* harmony import */ var _util_identity__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(232); -/* harmony import */ var _util_isScheduler__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(206); -/** PURE_IMPORTS_START _Observable,_util_identity,_util_isScheduler PURE_IMPORTS_END */ +var pump = function () { + var streams = Array.prototype.slice.call(arguments) + var callback = isFn(streams[streams.length - 1] || noop) && streams.pop() || noop + if (Array.isArray(streams[0])) streams = streams[0] + if (streams.length < 2) throw new Error('pump requires two streams per minimum') + var error + var destroys = streams.map(function (stream, i) { + var reading = i < streams.length - 1 + var writing = i > 0 + return destroyer(stream, reading, writing, function (err) { + if (!error) error = err + if (err) destroys.forEach(call) + if (reading) return + destroys.forEach(call) + callback(error) + }) + }) -function generate(initialStateOrOptions, condition, iterate, resultSelectorOrObservable, scheduler) { - var resultSelector; - var initialState; - if (arguments.length == 1) { - var options = initialStateOrOptions; - initialState = options.initialState; - condition = options.condition; - iterate = options.iterate; - resultSelector = options.resultSelector || _util_identity__WEBPACK_IMPORTED_MODULE_1__["identity"]; - scheduler = options.scheduler; - } - else if (resultSelectorOrObservable === undefined || Object(_util_isScheduler__WEBPACK_IMPORTED_MODULE_2__["isScheduler"])(resultSelectorOrObservable)) { - initialState = initialStateOrOptions; - resultSelector = _util_identity__WEBPACK_IMPORTED_MODULE_1__["identity"]; - scheduler = resultSelectorOrObservable; - } - else { - initialState = initialStateOrOptions; - resultSelector = resultSelectorOrObservable; - } - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var state = initialState; - if (scheduler) { - return scheduler.schedule(dispatch, 0, { - subscriber: subscriber, - iterate: iterate, - condition: condition, - resultSelector: resultSelector, - state: state - }); - } - do { - if (condition) { - var conditionResult = void 0; - try { - conditionResult = condition(state); - } - catch (err) { - subscriber.error(err); - return undefined; - } - if (!conditionResult) { - subscriber.complete(); - break; - } - } - var value = void 0; - try { - value = resultSelector(state); - } - catch (err) { - subscriber.error(err); - return undefined; - } - subscriber.next(value); - if (subscriber.closed) { - break; - } - try { - state = iterate(state); - } - catch (err) { - subscriber.error(err); - return undefined; - } - } while (true); - return undefined; - }); + return streams.reduce(pipe) } -function dispatch(state) { - var subscriber = state.subscriber, condition = state.condition; - if (subscriber.closed) { - return undefined; - } - if (state.needIterate) { - try { - state.state = state.iterate(state.state); - } - catch (err) { - subscriber.error(err); - return undefined; - } - } - else { - state.needIterate = true; - } - if (condition) { - var conditionResult = void 0; - try { - conditionResult = condition(state.state); - } - catch (err) { - subscriber.error(err); - return undefined; - } - if (!conditionResult) { - subscriber.complete(); - return undefined; - } - if (subscriber.closed) { - return undefined; - } - } - var value; - try { - value = state.resultSelector(state.state); - } - catch (err) { - subscriber.error(err); - return undefined; - } - if (subscriber.closed) { - return undefined; - } - subscriber.next(value); - if (subscriber.closed) { - return undefined; - } - return this.schedule(state); + +module.exports = pump + + +/***/ }), +/* 404 */ +/***/ (function(module, exports, __webpack_require__) { + +var wrappy = __webpack_require__(405) +module.exports = wrappy(once) +module.exports.strict = wrappy(onceStrict) + +once.proto = once(function () { + Object.defineProperty(Function.prototype, 'once', { + value: function () { + return once(this) + }, + configurable: true + }) + + Object.defineProperty(Function.prototype, 'onceStrict', { + value: function () { + return onceStrict(this) + }, + configurable: true + }) +}) + +function once (fn) { + var f = function () { + if (f.called) return f.value + f.called = true + return f.value = fn.apply(this, arguments) + } + f.called = false + return f +} + +function onceStrict (fn) { + var f = function () { + if (f.called) + throw new Error(f.onceError) + f.called = true + return f.value = fn.apply(this, arguments) + } + var name = fn.name || 'Function wrapped with `once`' + f.onceError = name + " shouldn't be called more than once" + f.called = false + return f } -//# sourceMappingURL=generate.js.map /***/ }), -/* 403 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 405 */ +/***/ (function(module, exports) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "iif", function() { return iif; }); -/* harmony import */ var _defer__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(333); -/* harmony import */ var _empty__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(242); -/** PURE_IMPORTS_START _defer,_empty PURE_IMPORTS_END */ +// Returns a wrapper function that returns a wrapped callback +// The wrapper function should do some stuff, and return a +// presumably different callback function. +// This makes sure that own properties are retained, so that +// decorations and such are not lost along the way. +module.exports = wrappy +function wrappy (fn, cb) { + if (fn && cb) return wrappy(fn)(cb) + if (typeof fn !== 'function') + throw new TypeError('need wrapper function') -function iif(condition, trueResult, falseResult) { - if (trueResult === void 0) { - trueResult = _empty__WEBPACK_IMPORTED_MODULE_1__["EMPTY"]; + Object.keys(fn).forEach(function (k) { + wrapper[k] = fn[k] + }) + + return wrapper + + function wrapper() { + var args = new Array(arguments.length) + for (var i = 0; i < args.length; i++) { + args[i] = arguments[i] } - if (falseResult === void 0) { - falseResult = _empty__WEBPACK_IMPORTED_MODULE_1__["EMPTY"]; + var ret = fn.apply(this, args) + var cb = args[args.length-1] + if (typeof ret === 'function' && ret !== cb) { + Object.keys(cb).forEach(function (k) { + ret[k] = cb[k] + }) } - return Object(_defer__WEBPACK_IMPORTED_MODULE_0__["defer"])(function () { return condition() ? trueResult : falseResult; }); + return ret + } } -//# sourceMappingURL=iif.js.map /***/ }), -/* 404 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/* 406 */ +/***/ (function(module, exports, __webpack_require__) { -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "interval", function() { return interval; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(193); -/* harmony import */ var _scheduler_async__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(199); -/* harmony import */ var _util_isNumeric__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(205); -/** PURE_IMPORTS_START _Observable,_scheduler_async,_util_isNumeric PURE_IMPORTS_END */ +var once = __webpack_require__(404); +var noop = function() {}; +var isRequest = function(stream) { + return stream.setHeader && typeof stream.abort === 'function'; +}; -function interval(period, scheduler) { - if (period === void 0) { - period = 0; - } - if (scheduler === void 0) { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; - } - if (!Object(_util_isNumeric__WEBPACK_IMPORTED_MODULE_2__["isNumeric"])(period) || period < 0) { - period = 0; - } - if (!scheduler || typeof scheduler.schedule !== 'function') { - scheduler = _scheduler_async__WEBPACK_IMPORTED_MODULE_1__["async"]; - } - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - subscriber.add(scheduler.schedule(dispatch, period, { subscriber: subscriber, counter: 0, period: period })); - return subscriber; - }); -} -function dispatch(state) { - var subscriber = state.subscriber, counter = state.counter, period = state.period; - subscriber.next(counter); - this.schedule({ subscriber: subscriber, counter: counter + 1, period: period }, period); -} -//# sourceMappingURL=interval.js.map +var isChildProcess = function(stream) { + return stream.stdio && Array.isArray(stream.stdio) && stream.stdio.length === 3 +}; +var eos = function(stream, opts, callback) { + if (typeof opts === 'function') return eos(stream, null, opts); + if (!opts) opts = {}; -/***/ }), -/* 405 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + callback = once(callback || noop); -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "NEVER", function() { return NEVER; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "never", function() { return never; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(193); -/* harmony import */ var _util_noop__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(197); -/** PURE_IMPORTS_START _Observable,_util_noop PURE_IMPORTS_END */ + var ws = stream._writableState; + var rs = stream._readableState; + var readable = opts.readable || (opts.readable !== false && stream.readable); + var writable = opts.writable || (opts.writable !== false && stream.writable); + var onlegacyfinish = function() { + if (!stream.writable) onfinish(); + }; -var NEVER = /*@__PURE__*/ new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](_util_noop__WEBPACK_IMPORTED_MODULE_1__["noop"]); -function never() { - return NEVER; -} -//# sourceMappingURL=never.js.map + var onfinish = function() { + writable = false; + if (!readable) callback.call(stream); + }; + + var onend = function() { + readable = false; + if (!writable) callback.call(stream); + }; + var onexit = function(exitCode) { + callback.call(stream, exitCode ? new Error('exited with error code: ' + exitCode) : null); + }; -/***/ }), -/* 406 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { + var onerror = function(err) { + callback.call(stream, err); + }; -"use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "onErrorResumeNext", function() { return onErrorResumeNext; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(193); -/* harmony import */ var _from__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(218); -/* harmony import */ var _util_isArray__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(178); -/* harmony import */ var _empty__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(242); -/** PURE_IMPORTS_START _Observable,_from,_util_isArray,_empty PURE_IMPORTS_END */ + var onclose = function() { + if (readable && !(rs && rs.ended)) return callback.call(stream, new Error('premature close')); + if (writable && !(ws && ws.ended)) return callback.call(stream, new Error('premature close')); + }; + + var onrequest = function() { + stream.req.on('finish', onfinish); + }; + if (isRequest(stream)) { + stream.on('complete', onfinish); + stream.on('abort', onclose); + if (stream.req) onrequest(); + else stream.on('request', onrequest); + } else if (writable && !ws) { // legacy streams + stream.on('end', onlegacyfinish); + stream.on('close', onlegacyfinish); + } + if (isChildProcess(stream)) stream.on('exit', onexit); + stream.on('end', onend); + stream.on('finish', onfinish); + if (opts.error !== false) stream.on('error', onerror); + stream.on('close', onclose); -function onErrorResumeNext() { - var sources = []; - for (var _i = 0; _i < arguments.length; _i++) { - sources[_i] = arguments[_i]; - } - if (sources.length === 0) { - return _empty__WEBPACK_IMPORTED_MODULE_3__["EMPTY"]; - } - var first = sources[0], remainder = sources.slice(1); - if (sources.length === 1 && Object(_util_isArray__WEBPACK_IMPORTED_MODULE_2__["isArray"])(first)) { - return onErrorResumeNext.apply(void 0, first); - } - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var subNext = function () { return subscriber.add(onErrorResumeNext.apply(void 0, remainder).subscribe(subscriber)); }; - return Object(_from__WEBPACK_IMPORTED_MODULE_1__["from"])(first).subscribe({ - next: function (value) { subscriber.next(value); }, - error: subNext, - complete: subNext, - }); - }); -} -//# sourceMappingURL=onErrorResumeNext.js.map + return function() { + stream.removeListener('complete', onfinish); + stream.removeListener('abort', onclose); + stream.removeListener('request', onrequest); + if (stream.req) stream.req.removeListener('finish', onfinish); + stream.removeListener('end', onlegacyfinish); + stream.removeListener('close', onlegacyfinish); + stream.removeListener('finish', onfinish); + stream.removeListener('exit', onexit); + stream.removeListener('end', onend); + stream.removeListener('error', onerror); + stream.removeListener('close', onclose); + }; +}; + +module.exports = eos; /***/ }), /* 407 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "pairs", function() { return pairs; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dispatch", function() { return dispatch; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(193); -/* harmony import */ var _Subscription__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(177); -/** PURE_IMPORTS_START _Observable,_Subscription PURE_IMPORTS_END */ +const {PassThrough: PassThroughStream} = __webpack_require__(27); -function pairs(obj, scheduler) { - if (!scheduler) { - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var keys = Object.keys(obj); - for (var i = 0; i < keys.length && !subscriber.closed; i++) { - var key = keys[i]; - if (obj.hasOwnProperty(key)) { - subscriber.next([key, obj[key]]); - } - } - subscriber.complete(); - }); - } - else { - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var keys = Object.keys(obj); - var subscription = new _Subscription__WEBPACK_IMPORTED_MODULE_1__["Subscription"](); - subscription.add(scheduler.schedule(dispatch, 0, { keys: keys, index: 0, subscriber: subscriber, subscription: subscription, obj: obj })); - return subscription; - }); - } -} -function dispatch(state) { - var keys = state.keys, index = state.index, subscriber = state.subscriber, subscription = state.subscription, obj = state.obj; - if (!subscriber.closed) { - if (index < keys.length) { - var key = keys[index]; - subscriber.next([key, obj[key]]); - subscription.add(this.schedule({ keys: keys, index: index + 1, subscriber: subscriber, subscription: subscription, obj: obj })); - } - else { - subscriber.complete(); - } - } -} -//# sourceMappingURL=pairs.js.map +module.exports = options => { + options = {...options}; + + const {array} = options; + let {encoding} = options; + const isBuffer = encoding === 'buffer'; + let objectMode = false; + + if (array) { + objectMode = !(encoding || isBuffer); + } else { + encoding = encoding || 'utf8'; + } + + if (isBuffer) { + encoding = null; + } + + const stream = new PassThroughStream({objectMode}); + + if (encoding) { + stream.setEncoding(encoding); + } + + let length = 0; + const chunks = []; + + stream.on('data', chunk => { + chunks.push(chunk); + + if (objectMode) { + length = chunks.length; + } else { + length += chunk.length; + } + }); + + stream.getBufferedValue = () => { + if (array) { + return chunks; + } + + return isBuffer ? Buffer.concat(chunks, length) : chunks.join(''); + }; + + stream.getBufferedLength = () => length; + + return stream; +}; /***/ }), /* 408 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "partition", function() { return partition; }); -/* harmony import */ var _util_not__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(289); -/* harmony import */ var _util_subscribeTo__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(184); -/* harmony import */ var _operators_filter__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(251); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(193); -/** PURE_IMPORTS_START _util_not,_util_subscribeTo,_operators_filter,_Observable PURE_IMPORTS_END */ +const { PassThrough } = __webpack_require__(27); + +module.exports = function (/*streams...*/) { + var sources = [] + var output = new PassThrough({objectMode: true}) + output.setMaxListeners(0) -function partition(source, predicate, thisArg) { - return [ - Object(_operators_filter__WEBPACK_IMPORTED_MODULE_2__["filter"])(predicate, thisArg)(new _Observable__WEBPACK_IMPORTED_MODULE_3__["Observable"](Object(_util_subscribeTo__WEBPACK_IMPORTED_MODULE_1__["subscribeTo"])(source))), - Object(_operators_filter__WEBPACK_IMPORTED_MODULE_2__["filter"])(Object(_util_not__WEBPACK_IMPORTED_MODULE_0__["not"])(predicate, thisArg))(new _Observable__WEBPACK_IMPORTED_MODULE_3__["Observable"](Object(_util_subscribeTo__WEBPACK_IMPORTED_MODULE_1__["subscribeTo"])(source))) - ]; + output.add = add + output.isEmpty = isEmpty + + output.on('unpipe', remove) + + Array.prototype.slice.call(arguments).forEach(add) + + return output + + function add (source) { + if (Array.isArray(source)) { + source.forEach(add) + return this + } + + sources.push(source); + source.once('end', remove.bind(null, source)) + source.once('error', output.emit.bind(output, 'error')) + source.pipe(output, {end: false}) + return this + } + + function isEmpty () { + return sources.length == 0; + } + + function remove (source) { + sources = sources.filter(function (it) { return it !== source }) + if (!sources.length && output.readable) { output.end() } + } } -//# sourceMappingURL=partition.js.map /***/ }), /* 409 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "range", function() { return range; }); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "dispatch", function() { return dispatch; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(193); -/** PURE_IMPORTS_START _Observable PURE_IMPORTS_END */ -function range(start, count, scheduler) { - if (start === void 0) { - start = 0; - } - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - if (count === undefined) { - count = start; - start = 0; - } - var index = 0; - var current = start; - if (scheduler) { - return scheduler.schedule(dispatch, 0, { - index: index, count: count, start: start, subscriber: subscriber - }); - } - else { - do { - if (index++ >= count) { - subscriber.complete(); - break; - } - subscriber.next(current++); - if (subscriber.closed) { - break; - } - } while (true); - } - return undefined; - }); -} -function dispatch(state) { - var start = state.start, index = state.index, count = state.count, subscriber = state.subscriber; - if (index >= count) { - subscriber.complete(); - return; - } - subscriber.next(start); - if (subscriber.closed) { - return; - } - state.index = index + 1; - state.start = start + 1; - this.schedule(state); -} -//# sourceMappingURL=range.js.map +const mergePromiseProperty = (spawned, promise, property) => { + // Starting the main `promise` is deferred to avoid consuming streams + const value = typeof promise === 'function' ? + (...args) => promise()[property](...args) : + promise[property].bind(promise); + + Object.defineProperty(spawned, property, { + value, + writable: true, + enumerable: false, + configurable: true + }); +}; + +// The return value is a mixin of `childProcess` and `Promise` +const mergePromise = (spawned, promise) => { + mergePromiseProperty(spawned, promise, 'then'); + mergePromiseProperty(spawned, promise, 'catch'); + mergePromiseProperty(spawned, promise, 'finally'); + return spawned; +}; + +// Use promises instead of `child_process` events +const getSpawnedPromise = spawned => { + return new Promise((resolve, reject) => { + spawned.on('exit', (exitCode, signal) => { + resolve({exitCode, signal}); + }); + + spawned.on('error', error => { + reject(error); + }); + + if (spawned.stdin) { + spawned.stdin.on('error', error => { + reject(error); + }); + } + }); +}; + +module.exports = { + mergePromise, + getSpawnedPromise +}; + /***/ }), /* 410 */ -/***/ (function(module, __webpack_exports__, __webpack_require__) { +/***/ (function(module, exports, __webpack_require__) { "use strict"; -__webpack_require__.r(__webpack_exports__); -/* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "using", function() { return using; }); -/* harmony import */ var _Observable__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(193); -/* harmony import */ var _from__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(218); -/* harmony import */ var _empty__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(242); -/** PURE_IMPORTS_START _Observable,_from,_empty PURE_IMPORTS_END */ +const SPACES_REGEXP = / +/g; +const joinCommand = (file, args = []) => { + if (!Array.isArray(args)) { + return file; + } -function using(resourceFactory, observableFactory) { - return new _Observable__WEBPACK_IMPORTED_MODULE_0__["Observable"](function (subscriber) { - var resource; - try { - resource = resourceFactory(); - } - catch (err) { - subscriber.error(err); - return undefined; - } - var result; - try { - result = observableFactory(resource); - } - catch (err) { - subscriber.error(err); - return undefined; - } - var source = result ? Object(_from__WEBPACK_IMPORTED_MODULE_1__["from"])(result) : _empty__WEBPACK_IMPORTED_MODULE_2__["EMPTY"]; - var subscription = source.subscribe(subscriber); - return function () { - subscription.unsubscribe(); - if (resource) { - resource.unsubscribe(); - } - }; - }); -} -//# sourceMappingURL=using.js.map + return [file, ...args].join(' '); +}; + +// Allow spaces to be escaped by a backslash if not meant as a delimiter +const handleEscaping = (tokens, token, index) => { + if (index === 0) { + return [token]; + } + + const previousToken = tokens[tokens.length - 1]; + + if (previousToken.endsWith('\\')) { + return [...tokens.slice(0, -1), `${previousToken.slice(0, -1)} ${token}`]; + } + + return [...tokens, token]; +}; + +// Handle `execa.command()` +const parseCommand = command => { + return command + .trim() + .split(SPACES_REGEXP) + .reduce(handleEscaping, []); +}; + +module.exports = { + joinCommand, + parseCommand +}; /***/ }), @@ -36357,7 +36363,7 @@ function using(resourceFactory, observableFactory) { "use strict"; -var childProcess = __webpack_require__(352); +var childProcess = __webpack_require__(372); var spawn = childProcess.spawn; var exec = childProcess.exec; @@ -36501,8 +36507,8 @@ function buildProcessTree (parentPid, tree, pidsToProcess, spawnChildProcessesLi */ Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = __webpack_require__(36); -const Rx = tslib_1.__importStar(__webpack_require__(391)); -const operators_1 = __webpack_require__(169); +const Rx = tslib_1.__importStar(__webpack_require__(169)); +const operators_1 = __webpack_require__(270); const SEP = /\r?\n/; const observe_readable_1 = __webpack_require__(413); /** @@ -36570,8 +36576,8 @@ exports.observeLines = observeLines; */ Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = __webpack_require__(36); -const Rx = tslib_1.__importStar(__webpack_require__(391)); -const operators_1 = __webpack_require__(169); +const Rx = tslib_1.__importStar(__webpack_require__(169)); +const operators_1 = __webpack_require__(270); /** * Produces an Observable from a ReadableSteam that: * - completes on the first "end" event @@ -36645,7 +36651,7 @@ exports.ToolingLogCollectingWriter = tooling_log_collecting_writer_1.ToolingLogC */ Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = __webpack_require__(36); -const Rx = tslib_1.__importStar(__webpack_require__(391)); +const Rx = tslib_1.__importStar(__webpack_require__(169)); const tooling_log_text_writer_1 = __webpack_require__(416); class ToolingLog { constructor(writerConfig) { @@ -39453,7 +39459,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); const tslib_1 = __webpack_require__(36); const util_1 = __webpack_require__(29); // @ts-ignore @types are outdated and module is super simple -const exit_hook_1 = tslib_1.__importDefault(__webpack_require__(348)); +const exit_hook_1 = tslib_1.__importDefault(__webpack_require__(368)); const tooling_log_1 = __webpack_require__(414); const fail_1 = __webpack_require__(446); const flags_1 = __webpack_require__(447); @@ -44319,7 +44325,7 @@ var rp = __webpack_require__(504) var minimatch = __webpack_require__(506) var Minimatch = minimatch.Minimatch var inherits = __webpack_require__(510) -var EE = __webpack_require__(379).EventEmitter +var EE = __webpack_require__(399).EventEmitter var path = __webpack_require__(16) var assert = __webpack_require__(30) var isAbsolute = __webpack_require__(512) @@ -44334,7 +44340,7 @@ var util = __webpack_require__(29) var childrenIgnored = common.childrenIgnored var isIgnored = common.isIgnored -var once = __webpack_require__(384) +var once = __webpack_require__(404) function glob (pattern, options, cb) { if (typeof options === 'function') cb = options, options = {} @@ -47483,9 +47489,9 @@ function childrenIgnored (self, path) { /* 515 */ /***/ (function(module, exports, __webpack_require__) { -var wrappy = __webpack_require__(385) +var wrappy = __webpack_require__(405) var reqs = Object.create(null) -var once = __webpack_require__(384) +var once = __webpack_require__(404) module.exports = wrappy(inflight) @@ -53616,7 +53622,7 @@ module.exports._cleanupOnExit = cleanupOnExit var fs = __webpack_require__(552) var MurmurHash3 = __webpack_require__(556) -var onExit = __webpack_require__(377) +var onExit = __webpack_require__(397) var path = __webpack_require__(16) var activeFiles = {} @@ -55267,7 +55273,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "spawnStreaming", function() { return spawnStreaming; }); /* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(2); /* harmony import */ var chalk__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(chalk__WEBPACK_IMPORTED_MODULE_0__); -/* harmony import */ var execa__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(351); +/* harmony import */ var execa__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(371); /* harmony import */ var execa__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(execa__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var log_symbols__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(565); /* harmony import */ var log_symbols__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(log_symbols__WEBPACK_IMPORTED_MODULE_2__); @@ -56988,7 +56994,7 @@ __webpack_require__.r(__webpack_exports__); /* harmony import */ var crypto__WEBPACK_IMPORTED_MODULE_1___default = /*#__PURE__*/__webpack_require__.n(crypto__WEBPACK_IMPORTED_MODULE_1__); /* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(29); /* harmony import */ var util__WEBPACK_IMPORTED_MODULE_2___default = /*#__PURE__*/__webpack_require__.n(util__WEBPACK_IMPORTED_MODULE_2__); -/* harmony import */ var execa__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(351); +/* harmony import */ var execa__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(371); /* harmony import */ var execa__WEBPACK_IMPORTED_MODULE_3___default = /*#__PURE__*/__webpack_require__.n(execa__WEBPACK_IMPORTED_MODULE_3__); /* harmony import */ var _yarn_lock__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(582); /* @@ -59784,7 +59790,7 @@ exports.f = __webpack_require__(33) ? Object.defineProperty : function definePro /* 54 */ /***/ (function(module, exports) { -module.exports = __webpack_require__(379); +module.exports = __webpack_require__(399); /***/ }), /* 55 */ @@ -68254,7 +68260,7 @@ var rp = __webpack_require__(504) var minimatch = __webpack_require__(506) var Minimatch = minimatch.Minimatch var inherits = __webpack_require__(592) -var EE = __webpack_require__(379).EventEmitter +var EE = __webpack_require__(399).EventEmitter var path = __webpack_require__(16) var assert = __webpack_require__(30) var isAbsolute = __webpack_require__(512) @@ -68269,7 +68275,7 @@ var util = __webpack_require__(29) var childrenIgnored = common.childrenIgnored var isIgnored = common.isIgnored -var once = __webpack_require__(384) +var once = __webpack_require__(404) function glob (pattern, options, cb) { if (typeof options === 'function') cb = options, options = {} @@ -74366,7 +74372,7 @@ function callSuccessCallback(callback, entries) { "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); -const events_1 = __webpack_require__(379); +const events_1 = __webpack_require__(399); const fsScandir = __webpack_require__(635); const fastq = __webpack_require__(644); const common = __webpack_require__(646); @@ -78154,7 +78160,7 @@ exports.toggle = (force, stream) => { "use strict"; const onetime = __webpack_require__(682); -const signalExit = __webpack_require__(377); +const signalExit = __webpack_require__(397); module.exports = onetime(() => { signalExit(() => { @@ -78402,8 +78408,8 @@ const WatchCommand = { "use strict"; __webpack_require__.r(__webpack_exports__); /* harmony export (binding) */ __webpack_require__.d(__webpack_exports__, "waitUntilWatchIsReady", function() { return waitUntilWatchIsReady; }); -/* harmony import */ var rxjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(391); -/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(169); +/* harmony import */ var rxjs__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(169); +/* harmony import */ var rxjs_operators__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(270); /* * Licensed to Elasticsearch B.V. under one or more contributor * license agreements. See the NOTICE file distributed with @@ -79570,7 +79576,7 @@ async function copyToBuild(project, kibanaRoot, buildRoot) { "use strict"; -const EventEmitter = __webpack_require__(379); +const EventEmitter = __webpack_require__(399); const path = __webpack_require__(16); const os = __webpack_require__(11); const pAll = __webpack_require__(708); @@ -80107,7 +80113,7 @@ var rp = __webpack_require__(504) var minimatch = __webpack_require__(506) var Minimatch = minimatch.Minimatch var inherits = __webpack_require__(715) -var EE = __webpack_require__(379).EventEmitter +var EE = __webpack_require__(399).EventEmitter var path = __webpack_require__(16) var assert = __webpack_require__(30) var isAbsolute = __webpack_require__(512) @@ -80122,7 +80128,7 @@ var util = __webpack_require__(29) var childrenIgnored = common.childrenIgnored var isIgnored = common.isIgnored -var once = __webpack_require__(384) +var once = __webpack_require__(404) function glob (pattern, options, cb) { if (typeof options === 'function') cb = options, options = {} @@ -104781,7 +104787,7 @@ function readdirSync (dir, options, internalOptions) { const Readable = __webpack_require__(27).Readable; -const EventEmitter = __webpack_require__(379).EventEmitter; +const EventEmitter = __webpack_require__(399).EventEmitter; const path = __webpack_require__(16); const normalizeOptions = __webpack_require__(894); const stat = __webpack_require__(896); @@ -110030,7 +110036,7 @@ function coerce (version, options) { "use strict"; -const EventEmitter = __webpack_require__(379); +const EventEmitter = __webpack_require__(399); const written = new WeakMap(); From 4966b2695a811e83c45513f7ab3761b30d29d63b Mon Sep 17 00:00:00 2001 From: Candace Park <56409205+parkiino@users.noreply.github.com> Date: Mon, 11 May 2020 14:56:05 -0400 Subject: [PATCH 080/102] Fixes #65661 failing endpoint host details policy response test (#66060) * Fixed failing endpoint host details policy response test #65661 --- .../plugins/endpoint/common/generate_data.ts | 24 ++++++++++++------- .../endpoint/view/hosts/index.test.tsx | 24 +++++++++++++++---- 2 files changed, 35 insertions(+), 13 deletions(-) diff --git a/x-pack/plugins/endpoint/common/generate_data.ts b/x-pack/plugins/endpoint/common/generate_data.ts index ff8add42a5085..1d5ea46dcc08b 100644 --- a/x-pack/plugins/endpoint/common/generate_data.ts +++ b/x-pack/plugins/endpoint/common/generate_data.ts @@ -536,8 +536,14 @@ export class EndpointDocGenerator { /** * Generates a Host Policy response message */ - public generatePolicyResponse(ts = new Date().getTime()): HostPolicyResponse { + public generatePolicyResponse( + ts = new Date().getTime(), + allStatus?: HostPolicyResponseActionStatus + ): HostPolicyResponse { const policyVersion = this.seededUUIDv4(); + const status = () => { + return allStatus || this.randomHostPolicyResponseActionStatus(); + }; return { '@timestamp': ts, agent: { @@ -588,7 +594,7 @@ export class EndpointDocGenerator { status: HostPolicyResponseActionStatus.success, }, detect_image_load_events: { - message: 'Successfuly started image load event reporting', + message: 'Successfully started image load event reporting', status: HostPolicyResponseActionStatus.success, }, detect_process_events: { @@ -596,15 +602,15 @@ export class EndpointDocGenerator { status: HostPolicyResponseActionStatus.success, }, download_global_artifacts: { - message: 'Failed to download EXE model', + message: 'Succesfully downloaded global artifacts', status: HostPolicyResponseActionStatus.success, }, load_config: { - message: 'successfully parsed configuration', + message: 'Successfully parsed configuration', status: HostPolicyResponseActionStatus.success, }, load_malware_model: { - message: 'Error deserializing EXE model; no valid malware model installed', + message: 'Successfully loaded malware model', status: HostPolicyResponseActionStatus.success, }, read_elasticsearch_config: { @@ -649,19 +655,19 @@ export class EndpointDocGenerator { configurations: { events: { concerned_actions: ['download_model'], - status: this.randomHostPolicyResponseActionStatus(), + status: status(), }, logging: { concerned_actions: this.randomHostPolicyResponseActions(), - status: this.randomHostPolicyResponseActionStatus(), + status: status(), }, malware: { concerned_actions: this.randomHostPolicyResponseActions(), - status: this.randomHostPolicyResponseActionStatus(), + status: status(), }, streaming: { concerned_actions: this.randomHostPolicyResponseActions(), - status: this.randomHostPolicyResponseActionStatus(), + status: status(), }, }, }, diff --git a/x-pack/plugins/endpoint/public/applications/endpoint/view/hosts/index.test.tsx b/x-pack/plugins/endpoint/public/applications/endpoint/view/hosts/index.test.tsx index aaeff935b32b4..808429ccef0c5 100644 --- a/x-pack/plugins/endpoint/public/applications/endpoint/view/hosts/index.test.tsx +++ b/x-pack/plugins/endpoint/public/applications/endpoint/view/hosts/index.test.tsx @@ -328,8 +328,20 @@ describe('when on the hosts page', () => { expect(statusHealth).not.toBeNull(); expect(message).not.toBeNull(); }); - it('should not show any numbered badges if all actions are succesful', () => { - return renderResult.findByTestId('hostDetailsPolicyResponseAttentionBadge').catch(e => { + it('should not show any numbered badges if all actions are successful', () => { + const policyResponse = docGenerator.generatePolicyResponse( + new Date().getTime(), + HostPolicyResponseActionStatus.success + ); + reactTestingLibrary.act(() => { + store.dispatch({ + type: 'serverReturnedHostPolicyResponse', + payload: { + policy_response: policyResponse, + }, + }); + }); + return renderResult.findAllByTestId('hostDetailsPolicyResponseAttentionBadge').catch(e => { expect(e).not.toBeNull(); }); }); @@ -337,14 +349,18 @@ describe('when on the hosts page', () => { reactTestingLibrary.act(() => { dispatchServerReturnedHostPolicyResponse(HostPolicyResponseActionStatus.failure); }); - const attentionBadge = renderResult.findByTestId('hostDetailsPolicyResponseAttentionBadge'); + const attentionBadge = renderResult.findAllByTestId( + 'hostDetailsPolicyResponseAttentionBadge' + ); expect(attentionBadge).not.toBeNull(); }); it('should show a numbered badge if at least one action has a warning', () => { reactTestingLibrary.act(() => { dispatchServerReturnedHostPolicyResponse(HostPolicyResponseActionStatus.warning); }); - const attentionBadge = renderResult.findByTestId('hostDetailsPolicyResponseAttentionBadge'); + const attentionBadge = renderResult.findAllByTestId( + 'hostDetailsPolicyResponseAttentionBadge' + ); expect(attentionBadge).not.toBeNull(); }); it('should include the back to details link', async () => { From e2d945ff0bacd7cd950b823e0a935429e04cb768 Mon Sep 17 00:00:00 2001 From: Zacqary Adam Xeper Date: Mon, 11 May 2020 14:04:57 -0500 Subject: [PATCH 081/102] [Metrics UI] Add framework for recovery messaging to metric threshold alerts (non-functional) (#65339) --- .../lib/alerting/metric_threshold/messages.ts | 45 ++++++++++++++- .../metric_threshold_executor.test.ts | 55 ++++++++++++++++++- 2 files changed, 98 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/messages.ts b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/messages.ts index 4878574e39d16..4add0ee9af5d3 100644 --- a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/messages.ts +++ b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/messages.ts @@ -24,7 +24,6 @@ export const stateToAlertMessage = { [AlertStates.ERROR]: i18n.translate('xpack.infra.metrics.alerting.threshold.errorState', { defaultMessage: 'ERROR', }), - // TODO: Implement recovered message state [AlertStates.OK]: i18n.translate('xpack.infra.metrics.alerting.threshold.okState', { defaultMessage: 'OK [Recovered]', }), @@ -62,6 +61,33 @@ const comparatorToI18n = (comparator: Comparator, threshold: number[], currentVa } }; +const recoveredComparatorToI18n = ( + comparator: Comparator, + threshold: number[], + currentValue: number +) => { + const belowText = i18n.translate('xpack.infra.metrics.alerting.threshold.belowRecovery', { + defaultMessage: 'below', + }); + const aboveText = i18n.translate('xpack.infra.metrics.alerting.threshold.aboveRecovery', { + defaultMessage: 'above', + }); + switch (comparator) { + case Comparator.BETWEEN: + return currentValue < threshold[0] ? belowText : aboveText; + case Comparator.OUTSIDE_RANGE: + return i18n.translate('xpack.infra.metrics.alerting.threshold.betweenRecovery', { + defaultMessage: 'between', + }); + case Comparator.GT: + case Comparator.GT_OR_EQ: + return belowText; + case Comparator.LT: + case Comparator.LT_OR_EQ: + return aboveText; + } +}; + const thresholdToI18n = ([a, b]: number[]) => { if (typeof b === 'undefined') return a; return i18n.translate('xpack.infra.metrics.alerting.threshold.thresholdRange', { @@ -87,6 +113,23 @@ export const buildFiredAlertReason: (alertResult: { }, }); +export const buildRecoveredAlertReason: (alertResult: { + metric: string; + comparator: Comparator; + threshold: number[]; + currentValue: number; +}) => string = ({ metric, comparator, threshold, currentValue }) => + i18n.translate('xpack.infra.metrics.alerting.threshold.recoveredAlertReason', { + defaultMessage: + '{metric} is now {comparator} a threshold of {threshold} (current value is {currentValue})', + values: { + metric, + comparator: recoveredComparatorToI18n(comparator, threshold, currentValue), + threshold: thresholdToI18n(threshold), + currentValue, + }, + }); + export const buildNoDataAlertReason: (alertResult: { metric: string; timeSize: number; diff --git a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.test.ts b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.test.ts index ed5efc1473953..19efc88e216ca 100644 --- a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.test.ts +++ b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/metric_threshold_executor.test.ts @@ -20,6 +20,8 @@ interface AlertTestInstance { state: any; } +let persistAlertInstances = false; // eslint-disable-line + describe('The metric threshold alert type', () => { describe('querying the entire infrastructure', () => { const instanceID = 'test-*'; @@ -313,6 +315,50 @@ describe('The metric threshold alert type', () => { expect(getState(instanceID).alertState).toBe(AlertStates.NO_DATA); }); }); + + // describe('querying a metric that later recovers', () => { + // const instanceID = 'test-*'; + // const execute = (threshold: number[]) => + // executor({ + // services, + // params: { + // criteria: [ + // { + // ...baseCriterion, + // comparator: Comparator.GT, + // threshold, + // }, + // ], + // }, + // }); + // beforeAll(() => (persistAlertInstances = true)); + // afterAll(() => (persistAlertInstances = false)); + + // test('sends a recovery alert as soon as the metric recovers', async () => { + // await execute([0.5]); + // expect(mostRecentAction(instanceID).id).toBe(FIRED_ACTIONS.id); + // expect(getState(instanceID).alertState).toBe(AlertStates.ALERT); + // await execute([2]); + // expect(mostRecentAction(instanceID).id).toBe(FIRED_ACTIONS.id); + // expect(getState(instanceID).alertState).toBe(AlertStates.OK); + // }); + // test('does not continue to send a recovery alert if the metric is still OK', async () => { + // await execute([2]); + // expect(mostRecentAction(instanceID)).toBe(undefined); + // expect(getState(instanceID).alertState).toBe(AlertStates.OK); + // await execute([2]); + // expect(mostRecentAction(instanceID)).toBe(undefined); + // expect(getState(instanceID).alertState).toBe(AlertStates.OK); + // }); + // test('sends a recovery alert again once the metric alerts and recovers again', async () => { + // await execute([0.5]); + // expect(mostRecentAction(instanceID).id).toBe(FIRED_ACTIONS.id); + // expect(getState(instanceID).alertState).toBe(AlertStates.ALERT); + // await execute([2]); + // expect(mostRecentAction(instanceID).id).toBe(FIRED_ACTIONS.id); + // expect(getState(instanceID).alertState).toBe(AlertStates.OK); + // }); + // }); }); const createMockStaticConfiguration = (sources: any) => ({ @@ -397,12 +443,19 @@ services.savedObjectsClient.get.mockImplementation(async (type: string, sourceId const alertInstances = new Map(); services.alertInstanceFactory.mockImplementation((instanceID: string) => { - const alertInstance: AlertTestInstance = { + const newAlertInstance: AlertTestInstance = { instance: alertsMock.createAlertInstanceFactory(), actionQueue: [], state: {}, }; + const alertInstance: AlertTestInstance = persistAlertInstances + ? alertInstances.get(instanceID) || newAlertInstance + : newAlertInstance; alertInstances.set(instanceID, alertInstance); + + alertInstance.instance.getState.mockImplementation(() => { + return alertInstance.state; + }); alertInstance.instance.replaceState.mockImplementation((newState: any) => { alertInstance.state = newState; return alertInstance.instance; From f4d27b283876405aaa3713f3907ce3c31a467d66 Mon Sep 17 00:00:00 2001 From: Tim Sullivan Date: Mon, 11 May 2020 12:49:19 -0700 Subject: [PATCH 082/102] [Reporting/Test] Add Functional test for download CSV (#65401) * [Reporting/Test] Add Functional test for download CSV * add todo * add fs.existsSync check to find download * debug * handle timeout * validate toast * different way of getting repo_root --- test/functional/services/find.ts | 2 +- .../apps/dashboard/reporting/download_csv.ts | 68 ++++++++++ .../apps/dashboard/reporting/index.ts | 122 +---------------- .../apps/dashboard/reporting/screenshots.ts | 127 ++++++++++++++++++ .../functional/page_objects/reporting_page.ts | 5 +- 5 files changed, 203 insertions(+), 121 deletions(-) create mode 100644 x-pack/test/functional/apps/dashboard/reporting/download_csv.ts create mode 100644 x-pack/test/functional/apps/dashboard/reporting/screenshots.ts diff --git a/test/functional/services/find.ts b/test/functional/services/find.ts index bdcc5ba95e9fb..09fc32115f683 100644 --- a/test/functional/services/find.ts +++ b/test/functional/services/find.ts @@ -198,7 +198,7 @@ export async function FindProvider({ getService }: FtrProviderContext) { if (isDisplayed) { return descendant; } else { - throw new Error('Element is not displayed'); + throw new Error(`Element "${selector}" is not displayed`); } } diff --git a/x-pack/test/functional/apps/dashboard/reporting/download_csv.ts b/x-pack/test/functional/apps/dashboard/reporting/download_csv.ts new file mode 100644 index 0000000000000..b66f9d2baeb36 --- /dev/null +++ b/x-pack/test/functional/apps/dashboard/reporting/download_csv.ts @@ -0,0 +1,68 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { REPO_ROOT } from '@kbn/dev-utils'; +import expect from '@kbn/expect'; +import fs from 'fs'; +import path from 'path'; +import * as Rx from 'rxjs'; +import { filter, first, map, timeout } from 'rxjs/operators'; +import { FtrProviderContext } from '../../../ftr_provider_context'; + +const csvPath = path.resolve(REPO_ROOT, 'target/functional-tests/downloads/Ecommerce Data.csv'); + +export default function({ getService, getPageObjects }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const browser = getService('browser'); + const dashboardPanelActions = getService('dashboardPanelActions'); + const log = getService('log'); + const testSubjects = getService('testSubjects'); + const PageObjects = getPageObjects(['reporting', 'common', 'dashboard']); + + describe('Reporting Download CSV', () => { + before('initialize tests', async () => { + log.debug('ReportingPage:initTests'); + await esArchiver.loadIfNeeded('reporting/ecommerce'); + await esArchiver.loadIfNeeded('reporting/ecommerce_kibana'); + await browser.setWindowSize(1600, 850); + }); + + after('clean up archives and previous file download', async () => { + await esArchiver.unload('reporting/ecommerce'); + await esArchiver.unload('reporting/ecommerce_kibana'); + try { + fs.unlinkSync(csvPath); + } catch (e) { + // nothing to worry + } + }); + + it('Downloads a CSV export of a saved search panel', async function() { + await PageObjects.common.navigateToApp('dashboard'); + await PageObjects.dashboard.loadSavedDashboard('Ecom Dashboard'); + const savedSearchPanel = await testSubjects.find('embeddablePanelHeading-EcommerceData'); + await dashboardPanelActions.toggleContextMenu(savedSearchPanel); + + await testSubjects.existOrFail('embeddablePanelAction-downloadCsvReport'); // wait for the full panel to display or else the test runner could click the wrong option! + await testSubjects.click('embeddablePanelAction-downloadCsvReport'); + await testSubjects.existOrFail('csvDownloadStarted'); // validate toast panel + + // check every 100ms for the file to exist in the download dir + // just wait up to 5 seconds + const success$ = Rx.interval(100).pipe( + map(() => fs.existsSync(csvPath)), + filter(value => value === true), + first(), + timeout(5000) + ); + + const fileExists = await success$.toPromise(); + expect(fileExists).to.be(true); + + // no need to validate download contents, API Integration tests do that some different variations + }); + }); +} diff --git a/x-pack/test/functional/apps/dashboard/reporting/index.ts b/x-pack/test/functional/apps/dashboard/reporting/index.ts index 796e15b4e270f..1dc2a958e3dd5 100644 --- a/x-pack/test/functional/apps/dashboard/reporting/index.ts +++ b/x-pack/test/functional/apps/dashboard/reporting/index.ts @@ -3,125 +3,11 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ - -import expect from '@kbn/expect'; -import fs from 'fs'; -import path from 'path'; -import { promisify } from 'util'; import { FtrProviderContext } from '../../../ftr_provider_context'; -import { checkIfPngsMatch } from './lib/compare_pngs'; - -const writeFileAsync = promisify(fs.writeFile); -const mkdirAsync = promisify(fs.mkdir); - -const REPORTS_FOLDER = path.resolve(__dirname, 'reports'); - -export default function({ getService, getPageObjects }: FtrProviderContext) { - const esArchiver = getService('esArchiver'); - const browser = getService('browser'); - const log = getService('log'); - const config = getService('config'); - const PageObjects = getPageObjects(['reporting', 'common', 'dashboard']); - - describe('Reporting', () => { - before('initialize tests', async () => { - log.debug('ReportingPage:initTests'); - await esArchiver.loadIfNeeded('reporting/ecommerce'); - await esArchiver.loadIfNeeded('reporting/ecommerce_kibana'); - await browser.setWindowSize(1600, 850); - }); - after('clean up archives', async () => { - await esArchiver.unload('reporting/ecommerce'); - await esArchiver.unload('reporting/ecommerce_kibana'); - }); - - describe('Print PDF button', () => { - it('is not available if new', async () => { - await PageObjects.common.navigateToApp('dashboard'); - await PageObjects.dashboard.clickNewDashboard(); - await PageObjects.reporting.openPdfReportingPanel(); - expect(await PageObjects.reporting.isGenerateReportButtonDisabled()).to.be('true'); - }); - - it('becomes available when saved', async () => { - await PageObjects.dashboard.saveDashboard('My PDF Dashboard'); - await PageObjects.reporting.openPdfReportingPanel(); - expect(await PageObjects.reporting.isGenerateReportButtonDisabled()).to.be(null); - }); - }); - - describe('Print Layout', () => { - it('downloads a PDF file', async function() { - // Generating and then comparing reports can take longer than the default 60s timeout because the comparePngs - // function is taking about 15 seconds per comparison in jenkins. - this.timeout(300000); - await PageObjects.common.navigateToApp('dashboard'); - await PageObjects.dashboard.loadSavedDashboard('Ecom Dashboard'); - await PageObjects.reporting.openPdfReportingPanel(); - await PageObjects.reporting.checkUsePrintLayout(); - await PageObjects.reporting.clickGenerateReportButton(); - - const url = await PageObjects.reporting.getReportURL(60000); - const res = await PageObjects.reporting.getResponse(url); - - expect(res.statusCode).to.equal(200); - expect(res.headers['content-type']).to.equal('application/pdf'); - }); - }); - - describe('Print PNG button', () => { - it('is not available if new', async () => { - await PageObjects.common.navigateToApp('dashboard'); - await PageObjects.dashboard.clickNewDashboard(); - await PageObjects.reporting.openPngReportingPanel(); - expect(await PageObjects.reporting.isGenerateReportButtonDisabled()).to.be('true'); - }); - - it('becomes available when saved', async () => { - await PageObjects.dashboard.saveDashboard('My PNG Dash'); - await PageObjects.reporting.openPngReportingPanel(); - expect(await PageObjects.reporting.isGenerateReportButtonDisabled()).to.be(null); - }); - }); - - describe('Preserve Layout', () => { - it('matches baseline report', async function() { - const writeSessionReport = async (name: string, rawPdf: Buffer, reportExt: string) => { - const sessionDirectory = path.resolve(REPORTS_FOLDER, 'session'); - await mkdirAsync(sessionDirectory, { recursive: true }); - const sessionReportPath = path.resolve(sessionDirectory, `${name}.${reportExt}`); - await writeFileAsync(sessionReportPath, rawPdf); - return sessionReportPath; - }; - const getBaselineReportPath = (fileName: string, reportExt: string) => { - const baselineFolder = path.resolve(REPORTS_FOLDER, 'baseline'); - const fullPath = path.resolve(baselineFolder, `${fileName}.${reportExt}`); - log.debug(`getBaselineReportPath (${fullPath})`); - return fullPath; - }; - - this.timeout(300000); - - await PageObjects.common.navigateToApp('dashboard'); - await PageObjects.dashboard.loadSavedDashboard('Ecom Dashboard'); - await PageObjects.reporting.openPngReportingPanel(); - await PageObjects.reporting.forceSharedItemsContainerSize({ width: 1405 }); - await PageObjects.reporting.clickGenerateReportButton(); - await PageObjects.reporting.removeForceSharedItemsContainerSize(); - - const url = await PageObjects.reporting.getReportURL(60000); - const reportData = await PageObjects.reporting.getRawPdfReportData(url); - const reportFileName = 'dashboard_preserve_layout'; - const sessionReportPath = await writeSessionReport(reportFileName, reportData, 'png'); - const percentSimilar = await checkIfPngsMatch( - sessionReportPath, - getBaselineReportPath(reportFileName, 'png'), - config.get('screenshots.directory'), - log - ); - expect(percentSimilar).to.be.lessThan(0.1); - }); - }); +export default function({ loadTestFile }: FtrProviderContext) { + describe('Reporting', function() { + loadTestFile(require.resolve('./screenshots')); + loadTestFile(require.resolve('./download_csv')); }); } diff --git a/x-pack/test/functional/apps/dashboard/reporting/screenshots.ts b/x-pack/test/functional/apps/dashboard/reporting/screenshots.ts new file mode 100644 index 0000000000000..2cc1686b8c7ca --- /dev/null +++ b/x-pack/test/functional/apps/dashboard/reporting/screenshots.ts @@ -0,0 +1,127 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; +import fs from 'fs'; +import path from 'path'; +import { promisify } from 'util'; +import { FtrProviderContext } from '../../../ftr_provider_context'; +import { checkIfPngsMatch } from './lib/compare_pngs'; + +const writeFileAsync = promisify(fs.writeFile); +const mkdirAsync = promisify(fs.mkdir); + +const REPORTS_FOLDER = path.resolve(__dirname, 'reports'); + +export default function({ getService, getPageObjects }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const browser = getService('browser'); + const log = getService('log'); + const config = getService('config'); + const PageObjects = getPageObjects(['reporting', 'common', 'dashboard']); + + describe('Screenshots', () => { + before('initialize tests', async () => { + log.debug('ReportingPage:initTests'); + await esArchiver.loadIfNeeded('reporting/ecommerce'); + await esArchiver.loadIfNeeded('reporting/ecommerce_kibana'); + await browser.setWindowSize(1600, 850); + }); + after('clean up archives', async () => { + await esArchiver.unload('reporting/ecommerce'); + await esArchiver.unload('reporting/ecommerce_kibana'); + }); + + describe('Print PDF button', () => { + it('is not available if new', async () => { + await PageObjects.common.navigateToApp('dashboard'); + await PageObjects.dashboard.clickNewDashboard(); + await PageObjects.reporting.openPdfReportingPanel(); + expect(await PageObjects.reporting.isGenerateReportButtonDisabled()).to.be('true'); + }); + + it('becomes available when saved', async () => { + await PageObjects.dashboard.saveDashboard('My PDF Dashboard'); + await PageObjects.reporting.openPdfReportingPanel(); + expect(await PageObjects.reporting.isGenerateReportButtonDisabled()).to.be(null); + }); + }); + + describe('Print Layout', () => { + it('downloads a PDF file', async function() { + // Generating and then comparing reports can take longer than the default 60s timeout because the comparePngs + // function is taking about 15 seconds per comparison in jenkins. + this.timeout(300000); + await PageObjects.common.navigateToApp('dashboard'); + await PageObjects.dashboard.loadSavedDashboard('Ecom Dashboard'); + await PageObjects.reporting.openPdfReportingPanel(); + await PageObjects.reporting.checkUsePrintLayout(); + await PageObjects.reporting.clickGenerateReportButton(); + + const url = await PageObjects.reporting.getReportURL(60000); + const res = await PageObjects.reporting.getResponse(url); + + expect(res.statusCode).to.equal(200); + expect(res.headers['content-type']).to.equal('application/pdf'); + }); + }); + + describe('Print PNG button', () => { + it('is not available if new', async () => { + await PageObjects.common.navigateToApp('dashboard'); + await PageObjects.dashboard.clickNewDashboard(); + await PageObjects.reporting.openPngReportingPanel(); + expect(await PageObjects.reporting.isGenerateReportButtonDisabled()).to.be('true'); + }); + + it('becomes available when saved', async () => { + await PageObjects.dashboard.saveDashboard('My PNG Dash'); + await PageObjects.reporting.openPngReportingPanel(); + expect(await PageObjects.reporting.isGenerateReportButtonDisabled()).to.be(null); + }); + }); + + describe('Preserve Layout', () => { + it('matches baseline report', async function() { + const writeSessionReport = async (name: string, rawPdf: Buffer, reportExt: string) => { + const sessionDirectory = path.resolve(REPORTS_FOLDER, 'session'); + await mkdirAsync(sessionDirectory, { recursive: true }); + const sessionReportPath = path.resolve(sessionDirectory, `${name}.${reportExt}`); + await writeFileAsync(sessionReportPath, rawPdf); + return sessionReportPath; + }; + const getBaselineReportPath = (fileName: string, reportExt: string) => { + const baselineFolder = path.resolve(REPORTS_FOLDER, 'baseline'); + const fullPath = path.resolve(baselineFolder, `${fileName}.${reportExt}`); + log.debug(`getBaselineReportPath (${fullPath})`); + return fullPath; + }; + + this.timeout(300000); + + await PageObjects.common.navigateToApp('dashboard'); + await PageObjects.dashboard.loadSavedDashboard('Ecom Dashboard'); + await PageObjects.reporting.openPngReportingPanel(); + await PageObjects.reporting.forceSharedItemsContainerSize({ width: 1405 }); + await PageObjects.reporting.clickGenerateReportButton(); + await PageObjects.reporting.removeForceSharedItemsContainerSize(); + + const url = await PageObjects.reporting.getReportURL(60000); + const reportData = await PageObjects.reporting.getRawPdfReportData(url); + const reportFileName = 'dashboard_preserve_layout'; + const sessionReportPath = await writeSessionReport(reportFileName, reportData, 'png'); + const percentSimilar = await checkIfPngsMatch( + sessionReportPath, + getBaselineReportPath(reportFileName, 'png'), + config.get('screenshots.directory'), + log + ); + + expect(percentSimilar).to.be.lessThan(0.1); + }); + }); + }); +} diff --git a/x-pack/test/functional/page_objects/reporting_page.ts b/x-pack/test/functional/page_objects/reporting_page.ts index 2c20519a8d214..320171f8c89cd 100644 --- a/x-pack/test/functional/page_objects/reporting_page.ts +++ b/x-pack/test/functional/page_objects/reporting_page.ts @@ -9,10 +9,11 @@ import { FtrProviderContext } from 'test/functional/ftr_provider_context'; import { parse } from 'url'; export function ReportingPageProvider({ getService, getPageObjects }: FtrProviderContext) { - const retry = getService('retry'); + const browser = getService('browser'); const log = getService('log'); + const retry = getService('retry'); const testSubjects = getService('testSubjects'); - const browser = getService('browser'); + const PageObjects = getPageObjects(['common', 'security' as any, 'share', 'timePicker']); // FIXME: Security PageObject is not Typescript class ReportingPage { From 207df60d6cb4447dee58e88adb174d93f44debf9 Mon Sep 17 00:00:00 2001 From: Ryland Herrick Date: Mon, 11 May 2020 14:55:12 -0500 Subject: [PATCH 083/102] [SIEM][Detections] Restrict ML rule modification to ML Admins (#65583) * Move common ML types and functions into siem/common These revolve around capabilities/permissions checks which were previously only used on the client. Now that we have need to make similar checks on the server, we can/should move these up to be shared. * Use ML's Capabilities type in lieu of our own There was already some drift between these types preventing our helpers from being used with the ML services; this will prevent further drift. * Add authorization helpers for ML Some of this responsibility will move to ML services in the near future, but for now we still need to restrict SIEM users from performing certain actions. * Use mlAuthz on our import rule route The tests were a little tricky because the use of spyOn/clear was preventing (rather, clearing the mocks from) the use of jest.mock(). I found a workaround with mockRestore(), which was easy to verify because the mock would throw an error if it wasn't removed, and we'd import multiple rules if a default mock was used. The threading through of ML can go away if/when ML adds their services to the request handler context. * Add mlAuthz checks to remaining rule routes * Remove validateLicenseForRuleType This is now unused and redundant with the mlAuthz module. * Fix failing tests These were missed when the helpers were moved to common/, but are also unneeded. * Cleanup: fixing type errors * Clean up some types from ML A recent upstream refactor in ML added top-level exports; this uses them where possible. * Refactor mlAuthz to defer authz validation until validator is called This prevents us from unnecessarily calling ml services if e.g. we're not dealing with an ML rule. This also adds a failing test for the next-to-be-implemented feature: cashing the async validation for subsequent validator calls. * Cache validation promise The purpose of the `buildMlAuthz` function is to store state (request, license, ml). Since `validateMlAuthz` should be idempotent for the duration of this object's lifecycle, we should cache the result the first time we call it; this is effectively memoization since the arguments do not change. * Make our result caching more explicit Extracts a caching helper function. * Add additional unit tests around some edge cases This is the best form of documentation, thanks Frank! * Remove redundant test setup * Empty messages are invalid If we somehow generate an empty message string, the validation should fail as we were attempting to assign _something_ as a failure message. * Fix validity logic valid: message !== null was the opposite of what I wanted; a validation is valid if it has no message (i.e. it's undefined). * Prevent patching of ML rules by non-ML admins This required refactoring patchRules to accept the rule to be patched, so that we can check its attributes before performing the update. * Fix our update_prepackaged_rules route patchRules no longer does the fetch; we need to perform this ourselves. * Fix update_prepackaged_rules tests This notably synchronizes the entirety of the updates, as our tests were failing due to the asynchronous nature of the updates. * Remove id and ruleId from patchRules parameters Instead of fetching the rule within patchRules, we now pass it in. Co-authored-by: Elastic Machine --- .../empty_ml_capabilities.ts | 15 +- .../has_ml_admin_permissions.test.ts | 2 +- .../has_ml_admin_permissions.ts | 12 +- .../has_ml_user_permissions.test.ts | 2 +- .../has_ml_user_permissions.ts | 4 +- .../helpers.test.ts} | 2 +- .../helpers.ts} | 2 +- .../ml/anomaly/use_anomalies_table_data.ts | 2 +- .../components/ml/api/get_ml_capabilities.ts | 7 +- .../permissions/ml_capabilities_provider.tsx | 6 +- .../ml/tables/anomalies_host_table.tsx | 2 +- .../ml/tables/anomalies_network_table.tsx | 2 +- .../siem/public/components/ml/types.ts | 47 +--- .../components/ml_popover/helpers.test.tsx | 4 - .../ml_popover/hooks/use_siem_jobs.tsx | 2 +- .../ml_popover/jobs_table/job_switch.tsx | 2 +- .../components/ml_popover/ml_popover.test.tsx | 4 - .../components/ml_popover/ml_popover.tsx | 2 +- .../page/hosts/host_overview/index.tsx | 2 +- .../page/network/ip_overview/index.tsx | 2 +- .../detection_engine/rules/all/columns.tsx | 2 +- .../detection_engine/rules/all/index.tsx | 2 +- .../description_step/ml_job_description.tsx | 2 +- .../rules/components/ml_job_select/index.tsx | 2 +- .../components/select_rule_type/index.tsx | 2 +- .../components/step_define_rule/index.tsx | 4 +- .../components/step_define_rule/schema.tsx | 2 +- .../detection_engine/rules/create/helpers.ts | 2 +- .../detection_engine/rules/details/index.tsx | 2 +- .../pages/detection_engine/rules/helpers.tsx | 2 +- .../siem/public/pages/hosts/details/index.tsx | 2 +- .../plugins/siem/public/pages/hosts/hosts.tsx | 2 +- .../siem/public/pages/network/index.tsx | 2 +- .../rules/create_rules_bulk_route.test.ts | 20 +- .../routes/rules/create_rules_bulk_route.ts | 10 +- .../routes/rules/create_rules_route.test.ts | 21 +- .../routes/rules/create_rules_route.ts | 16 +- .../routes/rules/import_rules_route.test.ts | 41 ++- .../routes/rules/import_rules_route.ts | 18 +- .../rules/patch_rules_bulk_route.test.ts | 46 ++- .../routes/rules/patch_rules_bulk_route.ts | 26 +- .../routes/rules/patch_rules_route.test.ts | 43 ++- .../routes/rules/patch_rules_route.ts | 32 ++- .../rules/update_rules_bulk_route.test.ts | 22 +- .../routes/rules/update_rules_bulk_route.ts | 15 +- .../routes/rules/update_rules_route.test.ts | 24 +- .../routes/rules/update_rules_route.ts | 17 +- .../schemas/response/check_type_dependents.ts | 2 +- .../lib/detection_engine/routes/utils.test.ts | 34 --- .../lib/detection_engine/routes/utils.ts | 30 -- .../rules/patch_rules.test.ts | 26 +- .../lib/detection_engine/rules/patch_rules.ts | 5 +- .../lib/detection_engine/rules/types.ts | 6 +- .../rules/update_prepacked_rules.test.ts | 17 +- .../rules/update_prepacked_rules.ts | 120 ++++---- .../signals/signal_rule_alert_type.ts | 2 +- .../server/lib/machine_learning/authz.test.ts | 265 ++++++++++++++++++ .../siem/server/lib/machine_learning/authz.ts | 120 ++++++++ .../server/lib/machine_learning/cache.test.ts | 41 +++ .../siem/server/lib/machine_learning/cache.ts | 24 ++ .../siem/server/lib/machine_learning/mocks.ts | 32 +++ .../lib/machine_learning/validation.test.ts | 36 +++ .../server/lib/machine_learning/validation.ts | 33 +++ x-pack/plugins/siem/server/plugin.ts | 3 +- x-pack/plugins/siem/server/routes/index.ts | 17 +- 65 files changed, 935 insertions(+), 380 deletions(-) rename x-pack/plugins/siem/{public/components/ml => common/machine_learning}/empty_ml_capabilities.ts (76%) rename x-pack/plugins/siem/{public/components/ml/permissions => common/machine_learning}/has_ml_admin_permissions.test.ts (96%) rename x-pack/plugins/siem/{public/components/ml/permissions => common/machine_learning}/has_ml_admin_permissions.ts (79%) rename x-pack/plugins/siem/{public/components/ml/permissions => common/machine_learning}/has_ml_user_permissions.test.ts (94%) rename x-pack/plugins/siem/{public/components/ml/permissions => common/machine_learning}/has_ml_user_permissions.ts (81%) rename x-pack/plugins/siem/common/{detection_engine/ml_helpers.test.ts => machine_learning/helpers.test.ts} (96%) rename x-pack/plugins/siem/common/{detection_engine/ml_helpers.ts => machine_learning/helpers.ts} (95%) create mode 100644 x-pack/plugins/siem/server/lib/machine_learning/authz.test.ts create mode 100644 x-pack/plugins/siem/server/lib/machine_learning/authz.ts create mode 100644 x-pack/plugins/siem/server/lib/machine_learning/cache.test.ts create mode 100644 x-pack/plugins/siem/server/lib/machine_learning/cache.ts create mode 100644 x-pack/plugins/siem/server/lib/machine_learning/mocks.ts create mode 100644 x-pack/plugins/siem/server/lib/machine_learning/validation.test.ts create mode 100644 x-pack/plugins/siem/server/lib/machine_learning/validation.ts diff --git a/x-pack/plugins/siem/public/components/ml/empty_ml_capabilities.ts b/x-pack/plugins/siem/common/machine_learning/empty_ml_capabilities.ts similarity index 76% rename from x-pack/plugins/siem/public/components/ml/empty_ml_capabilities.ts rename to x-pack/plugins/siem/common/machine_learning/empty_ml_capabilities.ts index 9c8610ccd628c..0d6a13c108b04 100644 --- a/x-pack/plugins/siem/public/components/ml/empty_ml_capabilities.ts +++ b/x-pack/plugins/siem/common/machine_learning/empty_ml_capabilities.ts @@ -4,10 +4,14 @@ * you may not use this file except in compliance with the Elastic License. */ -import { MlCapabilities } from './types'; +import { MlCapabilitiesResponse } from '../../../ml/common/types/capabilities'; -export const emptyMlCapabilities: MlCapabilities = { +export const emptyMlCapabilities: MlCapabilitiesResponse = { capabilities: { + canAccessML: false, + canGetAnnotations: false, + canCreateAnnotation: false, + canDeleteAnnotation: false, canGetJobs: false, canCreateJob: false, canDeleteJob: false, @@ -26,11 +30,8 @@ export const emptyMlCapabilities: MlCapabilities = { canCreateFilter: false, canDeleteFilter: false, canFindFileStructure: false, - canGetDataFrame: false, - canDeleteDataFrame: false, - canPreviewDataFrame: false, - canCreateDataFrame: false, - canStartStopDataFrame: false, + canCreateDatafeed: false, + canDeleteDatafeed: false, canGetDataFrameAnalytics: false, canDeleteDataFrameAnalytics: false, canCreateDataFrameAnalytics: false, diff --git a/x-pack/plugins/siem/public/components/ml/permissions/has_ml_admin_permissions.test.ts b/x-pack/plugins/siem/common/machine_learning/has_ml_admin_permissions.test.ts similarity index 96% rename from x-pack/plugins/siem/public/components/ml/permissions/has_ml_admin_permissions.test.ts rename to x-pack/plugins/siem/common/machine_learning/has_ml_admin_permissions.test.ts index ee237b42bede9..9824ce1232cbe 100644 --- a/x-pack/plugins/siem/public/components/ml/permissions/has_ml_admin_permissions.test.ts +++ b/x-pack/plugins/siem/common/machine_learning/has_ml_admin_permissions.test.ts @@ -6,7 +6,7 @@ import { hasMlAdminPermissions } from './has_ml_admin_permissions'; import { cloneDeep } from 'lodash/fp'; -import { emptyMlCapabilities } from '../empty_ml_capabilities'; +import { emptyMlCapabilities } from './empty_ml_capabilities'; describe('has_ml_admin_permissions', () => { let mlCapabilities = cloneDeep(emptyMlCapabilities); diff --git a/x-pack/plugins/siem/public/components/ml/permissions/has_ml_admin_permissions.ts b/x-pack/plugins/siem/common/machine_learning/has_ml_admin_permissions.ts similarity index 79% rename from x-pack/plugins/siem/public/components/ml/permissions/has_ml_admin_permissions.ts rename to x-pack/plugins/siem/common/machine_learning/has_ml_admin_permissions.ts index 6fe142cf8e583..106e9aabbc711 100644 --- a/x-pack/plugins/siem/public/components/ml/permissions/has_ml_admin_permissions.ts +++ b/x-pack/plugins/siem/common/machine_learning/has_ml_admin_permissions.ts @@ -4,21 +4,21 @@ * you may not use this file except in compliance with the Elastic License. */ -import { MlCapabilities } from '../types'; +import { MlCapabilitiesResponse } from '../../../ml/common/types/capabilities'; -export const hasMlAdminPermissions = (capabilities: MlCapabilities): boolean => +export const hasMlAdminPermissions = (capabilities: MlCapabilitiesResponse): boolean => getDataFeedPermissions(capabilities) && getJobPermissions(capabilities) && getFilterPermissions(capabilities) && getCalendarPermissions(capabilities); -const getDataFeedPermissions = ({ capabilities }: MlCapabilities): boolean => +const getDataFeedPermissions = ({ capabilities }: MlCapabilitiesResponse): boolean => capabilities.canGetDatafeeds && capabilities.canStartStopDatafeed && capabilities.canUpdateDatafeed && capabilities.canPreviewDatafeed; -const getJobPermissions = ({ capabilities }: MlCapabilities): boolean => +const getJobPermissions = ({ capabilities }: MlCapabilitiesResponse): boolean => capabilities.canCreateJob && capabilities.canGetJobs && capabilities.canUpdateJob && @@ -27,8 +27,8 @@ const getJobPermissions = ({ capabilities }: MlCapabilities): boolean => capabilities.canCloseJob && capabilities.canForecastJob; -const getFilterPermissions = ({ capabilities }: MlCapabilities) => +const getFilterPermissions = ({ capabilities }: MlCapabilitiesResponse) => capabilities.canGetFilters && capabilities.canCreateFilter && capabilities.canDeleteFilter; -const getCalendarPermissions = ({ capabilities }: MlCapabilities) => +const getCalendarPermissions = ({ capabilities }: MlCapabilitiesResponse) => capabilities.canCreateCalendar && capabilities.canGetCalendars && capabilities.canDeleteCalendar; diff --git a/x-pack/plugins/siem/public/components/ml/permissions/has_ml_user_permissions.test.ts b/x-pack/plugins/siem/common/machine_learning/has_ml_user_permissions.test.ts similarity index 94% rename from x-pack/plugins/siem/public/components/ml/permissions/has_ml_user_permissions.test.ts rename to x-pack/plugins/siem/common/machine_learning/has_ml_user_permissions.test.ts index e3804055f2abb..4d58cda81d71c 100644 --- a/x-pack/plugins/siem/public/components/ml/permissions/has_ml_user_permissions.test.ts +++ b/x-pack/plugins/siem/common/machine_learning/has_ml_user_permissions.test.ts @@ -6,7 +6,7 @@ import { cloneDeep } from 'lodash/fp'; import { hasMlUserPermissions } from './has_ml_user_permissions'; -import { emptyMlCapabilities } from '../empty_ml_capabilities'; +import { emptyMlCapabilities } from './empty_ml_capabilities'; describe('has_ml_user_permissions', () => { let mlCapabilities = cloneDeep(emptyMlCapabilities); diff --git a/x-pack/plugins/siem/public/components/ml/permissions/has_ml_user_permissions.ts b/x-pack/plugins/siem/common/machine_learning/has_ml_user_permissions.ts similarity index 81% rename from x-pack/plugins/siem/public/components/ml/permissions/has_ml_user_permissions.ts rename to x-pack/plugins/siem/common/machine_learning/has_ml_user_permissions.ts index 2d55b7d74f93c..dd746e4737bbc 100644 --- a/x-pack/plugins/siem/public/components/ml/permissions/has_ml_user_permissions.ts +++ b/x-pack/plugins/siem/common/machine_learning/has_ml_user_permissions.ts @@ -4,9 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ -import { MlCapabilities } from '../types'; +import { MlCapabilitiesResponse } from '../../../ml/common/types/capabilities'; -export const hasMlUserPermissions = (capabilities: MlCapabilities): boolean => +export const hasMlUserPermissions = (capabilities: MlCapabilitiesResponse): boolean => capabilities.capabilities.canGetJobs && capabilities.capabilities.canGetDatafeeds && capabilities.capabilities.canGetCalendars; diff --git a/x-pack/plugins/siem/common/detection_engine/ml_helpers.test.ts b/x-pack/plugins/siem/common/machine_learning/helpers.test.ts similarity index 96% rename from x-pack/plugins/siem/common/detection_engine/ml_helpers.test.ts rename to x-pack/plugins/siem/common/machine_learning/helpers.test.ts index ba93b2e4b8a0d..ce343f75933dc 100644 --- a/x-pack/plugins/siem/common/detection_engine/ml_helpers.test.ts +++ b/x-pack/plugins/siem/common/machine_learning/helpers.test.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { isJobStarted, isJobLoading, isJobFailed } from './ml_helpers'; +import { isJobStarted, isJobLoading, isJobFailed } from './helpers'; describe('isJobStarted', () => { test('returns false if only jobState is enabled', () => { diff --git a/x-pack/plugins/siem/common/detection_engine/ml_helpers.ts b/x-pack/plugins/siem/common/machine_learning/helpers.ts similarity index 95% rename from x-pack/plugins/siem/common/detection_engine/ml_helpers.ts rename to x-pack/plugins/siem/common/machine_learning/helpers.ts index e4158d08d448d..fe3eb79a6f610 100644 --- a/x-pack/plugins/siem/common/detection_engine/ml_helpers.ts +++ b/x-pack/plugins/siem/common/machine_learning/helpers.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { RuleType } from './types'; +import { RuleType } from '../detection_engine/types'; // Based on ML Job/Datafeed States from x-pack/legacy/plugins/ml/common/constants/states.js const enabledStates = ['started', 'opened']; diff --git a/x-pack/plugins/siem/public/components/ml/anomaly/use_anomalies_table_data.ts b/x-pack/plugins/siem/public/components/ml/anomaly/use_anomalies_table_data.ts index d64bd3a64e941..67efda67a20a3 100644 --- a/x-pack/plugins/siem/public/components/ml/anomaly/use_anomalies_table_data.ts +++ b/x-pack/plugins/siem/public/components/ml/anomaly/use_anomalies_table_data.ts @@ -9,7 +9,7 @@ import { useState, useEffect } from 'react'; import { DEFAULT_ANOMALY_SCORE } from '../../../../common/constants'; import { anomaliesTableData } from '../api/anomalies_table_data'; import { InfluencerInput, Anomalies, CriteriaFields } from '../types'; -import { hasMlUserPermissions } from '../permissions/has_ml_user_permissions'; +import { hasMlUserPermissions } from '../../../../common/machine_learning/has_ml_user_permissions'; import { useSiemJobs } from '../../ml_popover/hooks/use_siem_jobs'; import { useMlCapabilities } from '../../ml_popover/hooks/use_ml_capabilities'; import { useStateToaster, errorToToaster } from '../../toasters'; diff --git a/x-pack/plugins/siem/public/components/ml/api/get_ml_capabilities.ts b/x-pack/plugins/siem/public/components/ml/api/get_ml_capabilities.ts index e69abc1a86e0e..e6a792e779b0c 100644 --- a/x-pack/plugins/siem/public/components/ml/api/get_ml_capabilities.ts +++ b/x-pack/plugins/siem/public/components/ml/api/get_ml_capabilities.ts @@ -4,8 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ -import { InfluencerInput, MlCapabilities } from '../types'; +import { MlCapabilitiesResponse } from '../../../../../ml/public'; import { KibanaServices } from '../../../lib/kibana'; +import { InfluencerInput } from '../types'; export interface Body { jobIds: string[]; @@ -20,8 +21,8 @@ export interface Body { maxExamples: number; } -export const getMlCapabilities = async (signal: AbortSignal): Promise => { - return KibanaServices.get().http.fetch('/api/ml/ml_capabilities', { +export const getMlCapabilities = async (signal: AbortSignal): Promise => { + return KibanaServices.get().http.fetch('/api/ml/ml_capabilities', { method: 'GET', asSystemRequest: true, signal, diff --git a/x-pack/plugins/siem/public/components/ml/permissions/ml_capabilities_provider.tsx b/x-pack/plugins/siem/public/components/ml/permissions/ml_capabilities_provider.tsx index eee44abb44204..9326c53b6064d 100644 --- a/x-pack/plugins/siem/public/components/ml/permissions/ml_capabilities_provider.tsx +++ b/x-pack/plugins/siem/public/components/ml/permissions/ml_capabilities_provider.tsx @@ -6,14 +6,14 @@ import React, { useState, useEffect } from 'react'; -import { MlCapabilities } from '../types'; +import { MlCapabilitiesResponse } from '../../../../../ml/public'; +import { emptyMlCapabilities } from '../../../../common/machine_learning/empty_ml_capabilities'; import { getMlCapabilities } from '../api/get_ml_capabilities'; -import { emptyMlCapabilities } from '../empty_ml_capabilities'; import { errorToToaster, useStateToaster } from '../../toasters'; import * as i18n from './translations'; -interface MlCapabilitiesProvider extends MlCapabilities { +interface MlCapabilitiesProvider extends MlCapabilitiesResponse { capabilitiesFetched: boolean; } diff --git a/x-pack/plugins/siem/public/components/ml/tables/anomalies_host_table.tsx b/x-pack/plugins/siem/public/components/ml/tables/anomalies_host_table.tsx index 16bde076ef763..3272042732dff 100644 --- a/x-pack/plugins/siem/public/components/ml/tables/anomalies_host_table.tsx +++ b/x-pack/plugins/siem/public/components/ml/tables/anomalies_host_table.tsx @@ -9,13 +9,13 @@ import React from 'react'; import { useAnomaliesTableData } from '../anomaly/use_anomalies_table_data'; import { HeaderSection } from '../../header_section'; +import { hasMlUserPermissions } from '../../../../common/machine_learning/has_ml_user_permissions'; import * as i18n from './translations'; import { getAnomaliesHostTableColumnsCurated } from './get_anomalies_host_table_columns'; import { convertAnomaliesToHosts } from './convert_anomalies_to_hosts'; import { Loader } from '../../loader'; import { getIntervalFromAnomalies } from '../anomaly/get_interval_from_anomalies'; import { AnomaliesHostTableProps } from '../types'; -import { hasMlUserPermissions } from '../permissions/has_ml_user_permissions'; import { useMlCapabilities } from '../../ml_popover/hooks/use_ml_capabilities'; import { BasicTable } from './basic_table'; import { hostEquality } from './host_equality'; diff --git a/x-pack/plugins/siem/public/components/ml/tables/anomalies_network_table.tsx b/x-pack/plugins/siem/public/components/ml/tables/anomalies_network_table.tsx index bba6355f0b8b9..cc3b1196f8432 100644 --- a/x-pack/plugins/siem/public/components/ml/tables/anomalies_network_table.tsx +++ b/x-pack/plugins/siem/public/components/ml/tables/anomalies_network_table.tsx @@ -8,13 +8,13 @@ import React from 'react'; import { useAnomaliesTableData } from '../anomaly/use_anomalies_table_data'; import { HeaderSection } from '../../header_section'; +import { hasMlUserPermissions } from '../../../../common/machine_learning/has_ml_user_permissions'; import * as i18n from './translations'; import { convertAnomaliesToNetwork } from './convert_anomalies_to_network'; import { Loader } from '../../loader'; import { AnomaliesNetworkTableProps } from '../types'; import { getAnomaliesNetworkTableColumnsCurated } from './get_anomalies_network_table_columns'; import { useMlCapabilities } from '../../ml_popover/hooks/use_ml_capabilities'; -import { hasMlUserPermissions } from '../permissions/has_ml_user_permissions'; import { BasicTable } from './basic_table'; import { networkEquality } from './network_equality'; import { getCriteriaFromNetworkType } from '../criteria/get_criteria_from_network_type'; diff --git a/x-pack/plugins/siem/public/components/ml/types.ts b/x-pack/plugins/siem/public/components/ml/types.ts index 953fb9f761ea8..f70c7d3eb034c 100644 --- a/x-pack/plugins/siem/public/components/ml/types.ts +++ b/x-pack/plugins/siem/public/components/ml/types.ts @@ -4,15 +4,12 @@ * you may not use this file except in compliance with the Elastic License. */ +import { Influencer } from '../../../../ml/public'; + import { HostsType } from '../../store/hosts/model'; import { NetworkType } from '../../store/network/model'; import { FlowTarget } from '../../graphql/types'; -export interface Influencer { - influencer_field_name: string; - influencer_field_values: string[]; -} - export interface Source { job_id: string; result_type: string; @@ -35,11 +32,6 @@ export interface Source { influencers: Influencer[]; } -export interface Influencer { - influencer_field_name: string; - influencer_field_values: string[]; -} - export interface CriteriaFields { fieldName: string; fieldValue: string; @@ -100,41 +92,6 @@ export type AnomaliesNetworkTableProps = HostOrNetworkProps & { flowTarget?: FlowTarget; }; -export interface MlCapabilities { - capabilities: { - canGetJobs: boolean; - canCreateJob: boolean; - canDeleteJob: boolean; - canOpenJob: boolean; - canCloseJob: boolean; - canForecastJob: boolean; - canGetDatafeeds: boolean; - canStartStopDatafeed: boolean; - canUpdateJob: boolean; - canUpdateDatafeed: boolean; - canPreviewDatafeed: boolean; - canGetCalendars: boolean; - canCreateCalendar: boolean; - canDeleteCalendar: boolean; - canGetFilters: boolean; - canCreateFilter: boolean; - canDeleteFilter: boolean; - canFindFileStructure: boolean; - canGetDataFrame: boolean; - canDeleteDataFrame: boolean; - canPreviewDataFrame: boolean; - canCreateDataFrame: boolean; - canStartStopDataFrame: boolean; - canGetDataFrameAnalytics: boolean; - canDeleteDataFrameAnalytics: boolean; - canCreateDataFrameAnalytics: boolean; - canStartStopDataFrameAnalytics: boolean; - }; - isPlatinumOrTrialLicense: boolean; - mlFeatureEnabledInSpace: boolean; - upgradeInProgress: boolean; -} - const sourceOrDestination = ['source.ip', 'destination.ip']; export const isDestinationOrSource = (value: string | null): value is DestinationOrSource => diff --git a/x-pack/plugins/siem/public/components/ml_popover/helpers.test.tsx b/x-pack/plugins/siem/public/components/ml_popover/helpers.test.tsx index 26ebfeb91629b..0b8da6be57e1b 100644 --- a/x-pack/plugins/siem/public/components/ml_popover/helpers.test.tsx +++ b/x-pack/plugins/siem/public/components/ml_popover/helpers.test.tsx @@ -7,10 +7,6 @@ import { mockSiemJobs } from './__mocks__/api'; import { filterJobs, getStablePatternTitles, searchFilter } from './helpers'; -jest.mock('../ml/permissions/has_ml_admin_permissions', () => ({ - hasMlAdminPermissions: () => true, -})); - describe('helpers', () => { describe('filterJobs', () => { test('returns all jobs when no filter is suplied', () => { diff --git a/x-pack/plugins/siem/public/components/ml_popover/hooks/use_siem_jobs.tsx b/x-pack/plugins/siem/public/components/ml_popover/hooks/use_siem_jobs.tsx index 7bcbf4afa10cc..98e74208b3dcc 100644 --- a/x-pack/plugins/siem/public/components/ml_popover/hooks/use_siem_jobs.tsx +++ b/x-pack/plugins/siem/public/components/ml_popover/hooks/use_siem_jobs.tsx @@ -9,7 +9,7 @@ import { useEffect, useState } from 'react'; import { DEFAULT_INDEX_KEY } from '../../../../common/constants'; import { checkRecognizer, getJobsSummary, getModules } from '../api'; import { SiemJob } from '../types'; -import { hasMlUserPermissions } from '../../ml/permissions/has_ml_user_permissions'; +import { hasMlUserPermissions } from '../../../../common/machine_learning/has_ml_user_permissions'; import { errorToToaster, useStateToaster } from '../../toasters'; import { useUiSetting$ } from '../../../lib/kibana'; diff --git a/x-pack/plugins/siem/public/components/ml_popover/jobs_table/job_switch.tsx b/x-pack/plugins/siem/public/components/ml_popover/jobs_table/job_switch.tsx index e7b14f2e80bf2..7de2f0fbfbc54 100644 --- a/x-pack/plugins/siem/public/components/ml_popover/jobs_table/job_switch.tsx +++ b/x-pack/plugins/siem/public/components/ml_popover/jobs_table/job_switch.tsx @@ -11,7 +11,7 @@ import { isJobLoading, isJobFailed, isJobStarted, -} from '../../../../common/detection_engine/ml_helpers'; +} from '../../../../common/machine_learning/helpers'; import { SiemJob } from '../types'; const StaticSwitch = styled(EuiSwitch)` diff --git a/x-pack/plugins/siem/public/components/ml_popover/ml_popover.test.tsx b/x-pack/plugins/siem/public/components/ml_popover/ml_popover.test.tsx index 3c93e1c195cd7..cf4ac87bdb5e7 100644 --- a/x-pack/plugins/siem/public/components/ml_popover/ml_popover.test.tsx +++ b/x-pack/plugins/siem/public/components/ml_popover/ml_popover.test.tsx @@ -11,10 +11,6 @@ import { MlPopover } from './ml_popover'; jest.mock('../../lib/kibana'); -jest.mock('../ml/permissions/has_ml_admin_permissions', () => ({ - hasMlAdminPermissions: () => true, -})); - describe('MlPopover', () => { test('shows upgrade popover on mouse click', () => { const wrapper = mountWithIntl(); diff --git a/x-pack/plugins/siem/public/components/ml_popover/ml_popover.tsx b/x-pack/plugins/siem/public/components/ml_popover/ml_popover.tsx index 6ea5cba4b37e4..e7f7770ee87f8 100644 --- a/x-pack/plugins/siem/public/components/ml_popover/ml_popover.tsx +++ b/x-pack/plugins/siem/public/components/ml_popover/ml_popover.tsx @@ -12,7 +12,7 @@ import styled from 'styled-components'; import { useKibana } from '../../lib/kibana'; import { METRIC_TYPE, TELEMETRY_EVENT, track } from '../../lib/telemetry'; -import { hasMlAdminPermissions } from '../ml/permissions/has_ml_admin_permissions'; +import { hasMlAdminPermissions } from '../../../common/machine_learning/has_ml_admin_permissions'; import { errorToToaster, useStateToaster, ActionToaster } from '../toasters'; import { setupMlJob, startDatafeeds, stopDatafeeds } from './api'; import { filterJobs } from './helpers'; diff --git a/x-pack/plugins/siem/public/components/page/hosts/host_overview/index.tsx b/x-pack/plugins/siem/public/components/page/hosts/host_overview/index.tsx index 4d0e6a737d303..223a16fec77a0 100644 --- a/x-pack/plugins/siem/public/components/page/hosts/host_overview/index.tsx +++ b/x-pack/plugins/siem/public/components/page/hosts/host_overview/index.tsx @@ -19,7 +19,7 @@ import { InspectButton, InspectButtonContainer } from '../../../inspect'; import { HostItem } from '../../../../graphql/types'; import { Loader } from '../../../loader'; import { IPDetailsLink } from '../../../links'; -import { hasMlUserPermissions } from '../../../ml/permissions/has_ml_user_permissions'; +import { hasMlUserPermissions } from '../../../../../common/machine_learning/has_ml_user_permissions'; import { useMlCapabilities } from '../../../ml_popover/hooks/use_ml_capabilities'; import { AnomalyScores } from '../../../ml/score/anomaly_scores'; import { Anomalies, NarrowDateRange } from '../../../ml/types'; diff --git a/x-pack/plugins/siem/public/components/page/network/ip_overview/index.tsx b/x-pack/plugins/siem/public/components/page/network/ip_overview/index.tsx index 56b59ca97156f..456deaac0fb15 100644 --- a/x-pack/plugins/siem/public/components/page/network/ip_overview/index.tsx +++ b/x-pack/plugins/siem/public/components/page/network/ip_overview/index.tsx @@ -31,7 +31,7 @@ import { Loader } from '../../../loader'; import { Anomalies, NarrowDateRange } from '../../../ml/types'; import { AnomalyScores } from '../../../ml/score/anomaly_scores'; import { useMlCapabilities } from '../../../ml_popover/hooks/use_ml_capabilities'; -import { hasMlUserPermissions } from '../../../ml/permissions/has_ml_user_permissions'; +import { hasMlUserPermissions } from '../../../../../common/machine_learning/has_ml_user_permissions'; import { InspectButton, InspectButtonContainer } from '../../../inspect'; interface OwnProps { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/all/columns.tsx b/x-pack/plugins/siem/public/pages/detection_engine/rules/all/columns.tsx index 8e79f037d82b0..542a004cb3727 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/all/columns.tsx +++ b/x-pack/plugins/siem/public/pages/detection_engine/rules/all/columns.tsx @@ -19,7 +19,7 @@ import { FormattedRelative } from '@kbn/i18n/react'; import * as H from 'history'; import React, { Dispatch } from 'react'; -import { isMlRule } from '../../../../../common/detection_engine/ml_helpers'; +import { isMlRule } from '../../../../../common/machine_learning/helpers'; import { Rule, RuleStatus } from '../../../../containers/detection_engine/rules'; import { getEmptyTagValue } from '../../../../components/empty_value'; import { FormattedDate } from '../../../../components/formatted_date'; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/all/index.tsx b/x-pack/plugins/siem/public/pages/detection_engine/rules/all/index.tsx index 18ca4d42bd018..d9a2fafd144bc 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/all/index.tsx +++ b/x-pack/plugins/siem/public/pages/detection_engine/rules/all/index.tsx @@ -48,7 +48,7 @@ import { showRulesTable } from './helpers'; import { allRulesReducer, State } from './reducer'; import { RulesTableFilters } from './rules_table_filters/rules_table_filters'; import { useMlCapabilities } from '../../../../components/ml_popover/hooks/use_ml_capabilities'; -import { hasMlAdminPermissions } from '../../../../components/ml/permissions/has_ml_admin_permissions'; +import { hasMlAdminPermissions } from '../../../../../common/machine_learning/has_ml_admin_permissions'; const SORT_FIELD = 'enabled'; const initialState: State = { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/description_step/ml_job_description.tsx b/x-pack/plugins/siem/public/pages/detection_engine/rules/components/description_step/ml_job_description.tsx index 79993c37e549c..33d3dbcba8631 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/description_step/ml_job_description.tsx +++ b/x-pack/plugins/siem/public/pages/detection_engine/rules/components/description_step/ml_job_description.tsx @@ -8,7 +8,7 @@ import React from 'react'; import styled from 'styled-components'; import { EuiBadge, EuiIcon, EuiLink, EuiToolTip } from '@elastic/eui'; -import { isJobStarted } from '../../../../../../common/detection_engine/ml_helpers'; +import { isJobStarted } from '../../../../../../common/machine_learning/helpers'; import { useKibana } from '../../../../../lib/kibana'; import { SiemJob } from '../../../../../components/ml_popover/types'; import { ListItems } from './types'; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/ml_job_select/index.tsx b/x-pack/plugins/siem/public/pages/detection_engine/rules/components/ml_job_select/index.tsx index 4fb9faaea711c..c011c06e86542 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/ml_job_select/index.tsx +++ b/x-pack/plugins/siem/public/pages/detection_engine/rules/components/ml_job_select/index.tsx @@ -17,7 +17,7 @@ import { } from '@elastic/eui'; import styled from 'styled-components'; -import { isJobStarted } from '../../../../../../common/detection_engine/ml_helpers'; +import { isJobStarted } from '../../../../../../common/machine_learning/helpers'; import { FieldHook, getFieldValidityAndErrorMessage } from '../../../../../shared_imports'; import { useSiemJobs } from '../../../../../components/ml_popover/hooks/use_siem_jobs'; import { useKibana } from '../../../../../lib/kibana'; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/select_rule_type/index.tsx b/x-pack/plugins/siem/public/pages/detection_engine/rules/components/select_rule_type/index.tsx index 6f3d299da8d45..dc9a832f820ba 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/select_rule_type/index.tsx +++ b/x-pack/plugins/siem/public/pages/detection_engine/rules/components/select_rule_type/index.tsx @@ -16,7 +16,7 @@ import { EuiText, } from '@elastic/eui'; -import { isMlRule } from '../../../../../../common/detection_engine/ml_helpers'; +import { isMlRule } from '../../../../../../common/machine_learning/helpers'; import { RuleType } from '../../../../../../common/detection_engine/types'; import { FieldHook } from '../../../../../shared_imports'; import { useKibana } from '../../../../../lib/kibana'; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_define_rule/index.tsx b/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_define_rule/index.tsx index b6887badc56be..3517c6fb21e69 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_define_rule/index.tsx +++ b/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_define_rule/index.tsx @@ -10,7 +10,7 @@ import styled from 'styled-components'; import deepEqual from 'fast-deep-equal'; import { DEFAULT_INDEX_KEY } from '../../../../../../common/constants'; -import { isMlRule } from '../../../../../../common/detection_engine/ml_helpers'; +import { isMlRule } from '../../../../../../common/machine_learning/helpers'; import { IIndexPattern } from '../../../../../../../../../src/plugins/data/public'; import { useFetchIndexPatterns } from '../../../../../containers/detection_engine/rules'; import { DEFAULT_TIMELINE_TITLE } from '../../../../../components/timeline/translations'; @@ -38,7 +38,7 @@ import { import { schema } from './schema'; import * as i18n from './translations'; import { filterRuleFieldsForType, RuleFields } from '../../create/helpers'; -import { hasMlAdminPermissions } from '../../../../../components/ml/permissions/has_ml_admin_permissions'; +import { hasMlAdminPermissions } from '../../../../../../common/machine_learning/has_ml_admin_permissions'; const CommonUseField = getUseField({ component: Field }); diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_define_rule/schema.tsx b/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_define_rule/schema.tsx index 8915c5f0a224f..08832c5dfe4f5 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_define_rule/schema.tsx +++ b/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_define_rule/schema.tsx @@ -9,7 +9,7 @@ import { EuiText } from '@elastic/eui'; import { isEmpty } from 'lodash/fp'; import React from 'react'; -import { isMlRule } from '../../../../../../common/detection_engine/ml_helpers'; +import { isMlRule } from '../../../../../../common/machine_learning/helpers'; import { esKuery } from '../../../../../../../../../src/plugins/data/public'; import { FieldValueQueryBar } from '../query_bar'; import { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/create/helpers.ts b/x-pack/plugins/siem/public/pages/detection_engine/rules/create/helpers.ts index 7ad116c313361..b912c182a7c65 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/create/helpers.ts +++ b/x-pack/plugins/siem/public/pages/detection_engine/rules/create/helpers.ts @@ -11,7 +11,7 @@ import deepmerge from 'deepmerge'; import { NOTIFICATION_THROTTLE_NO_ACTIONS } from '../../../../../common/constants'; import { transformAlertToRuleAction } from '../../../../../common/detection_engine/transform_actions'; import { RuleType } from '../../../../../common/detection_engine/types'; -import { isMlRule } from '../../../../../common/detection_engine/ml_helpers'; +import { isMlRule } from '../../../../../common/machine_learning/helpers'; import { NewRule } from '../../../../containers/detection_engine/rules'; import { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/details/index.tsx b/x-pack/plugins/siem/public/pages/detection_engine/rules/details/index.tsx index 3e45c892e23dd..6a43c217e5ff5 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/details/index.tsx +++ b/x-pack/plugins/siem/public/pages/detection_engine/rules/details/index.tsx @@ -69,7 +69,7 @@ import { RuleStatusFailedCallOut } from './status_failed_callout'; import { FailureHistory } from './failure_history'; import { RuleStatus } from '../components/rule_status'; import { useMlCapabilities } from '../../../../components/ml_popover/hooks/use_ml_capabilities'; -import { hasMlAdminPermissions } from '../../../../components/ml/permissions/has_ml_admin_permissions'; +import { hasMlAdminPermissions } from '../../../../../common/machine_learning/has_ml_admin_permissions'; enum RuleDetailTabs { signals = 'signals', diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/helpers.tsx b/x-pack/plugins/siem/public/pages/detection_engine/rules/helpers.tsx index 2ccbffd864070..3dbcf3b2425cc 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/helpers.tsx +++ b/x-pack/plugins/siem/public/pages/detection_engine/rules/helpers.tsx @@ -11,7 +11,7 @@ import memoizeOne from 'memoize-one'; import { useLocation } from 'react-router-dom'; import { RuleAlertAction, RuleType } from '../../../../common/detection_engine/types'; -import { isMlRule } from '../../../../common/detection_engine/ml_helpers'; +import { isMlRule } from '../../../../common/machine_learning/helpers'; import { transformRuleToAlertAction } from '../../../../common/detection_engine/transform_actions'; import { Filter } from '../../../../../../../src/plugins/data/public'; import { Rule } from '../../../containers/detection_engine/rules'; diff --git a/x-pack/plugins/siem/public/pages/hosts/details/index.tsx b/x-pack/plugins/siem/public/pages/hosts/details/index.tsx index 730c93b43709c..afed0fab0ade7 100644 --- a/x-pack/plugins/siem/public/pages/hosts/details/index.tsx +++ b/x-pack/plugins/siem/public/pages/hosts/details/index.tsx @@ -15,7 +15,7 @@ import { HeaderPage } from '../../../components/header_page'; import { LastEventTime } from '../../../components/last_event_time'; import { AnomalyTableProvider } from '../../../components/ml/anomaly/anomaly_table_provider'; import { hostToCriteria } from '../../../components/ml/criteria/host_to_criteria'; -import { hasMlUserPermissions } from '../../../components/ml/permissions/has_ml_user_permissions'; +import { hasMlUserPermissions } from '../../../../common/machine_learning/has_ml_user_permissions'; import { useMlCapabilities } from '../../../components/ml_popover/hooks/use_ml_capabilities'; import { scoreIntervalToDateTime } from '../../../components/ml/score/score_interval_to_datetime'; import { SiemNavigation } from '../../../components/navigation'; diff --git a/x-pack/plugins/siem/public/pages/hosts/hosts.tsx b/x-pack/plugins/siem/public/pages/hosts/hosts.tsx index 2fbbc0d96a1e3..0e29d634d07a6 100644 --- a/x-pack/plugins/siem/public/pages/hosts/hosts.tsx +++ b/x-pack/plugins/siem/public/pages/hosts/hosts.tsx @@ -14,7 +14,7 @@ import { UpdateDateRange } from '../../components/charts/common'; import { FiltersGlobal } from '../../components/filters_global'; import { HeaderPage } from '../../components/header_page'; import { LastEventTime } from '../../components/last_event_time'; -import { hasMlUserPermissions } from '../../components/ml/permissions/has_ml_user_permissions'; +import { hasMlUserPermissions } from '../../../common/machine_learning/has_ml_user_permissions'; import { SiemNavigation } from '../../components/navigation'; import { KpiHostsComponent } from '../../components/page/hosts'; import { manageQuery } from '../../components/page/manage_query'; diff --git a/x-pack/plugins/siem/public/pages/network/index.tsx b/x-pack/plugins/siem/public/pages/network/index.tsx index babc153823b5a..412e51e74059e 100644 --- a/x-pack/plugins/siem/public/pages/network/index.tsx +++ b/x-pack/plugins/siem/public/pages/network/index.tsx @@ -8,7 +8,7 @@ import React, { useMemo } from 'react'; import { Redirect, Route, Switch, RouteComponentProps } from 'react-router-dom'; import { useMlCapabilities } from '../../components/ml_popover/hooks/use_ml_capabilities'; -import { hasMlUserPermissions } from '../../components/ml/permissions/has_ml_user_permissions'; +import { hasMlUserPermissions } from '../../../common/machine_learning/has_ml_user_permissions'; import { FlowTarget } from '../../graphql/types'; import { IPDetails } from './ip_details'; diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.test.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.test.ts index e6facf6f3b7a8..473d183c8a8f2 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.test.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.test.ts @@ -5,6 +5,8 @@ */ import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; +import { mlServicesMock, mlAuthzMock as mockMlAuthzFactory } from '../../../machine_learning/mocks'; +import { buildMlAuthz } from '../../../machine_learning/authz'; import { typicalPayload, getReadBulkRequest, @@ -19,9 +21,12 @@ import { requestContextMock, serverMock, requestMock } from '../__mocks__'; import { createRulesBulkRoute } from './create_rules_bulk_route'; import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; +jest.mock('../../../machine_learning/authz', () => mockMlAuthzFactory.create()); + describe('create_rules_bulk', () => { let server: ReturnType; let { clients, context } = requestContextMock.createTools(); + let ml: ReturnType; beforeAll(() => { setFeatureFlagsForTestsOnly(); @@ -34,12 +39,13 @@ describe('create_rules_bulk', () => { beforeEach(() => { server = serverMock.create(); ({ clients, context } = requestContextMock.createTools()); + ml = mlServicesMock.create(); clients.clusterClient.callAsCurrentUser.mockResolvedValue(getNonEmptyIndex()); // index exists clients.alertsClient.find.mockResolvedValue(getEmptyFindResult()); // no existing rules clients.alertsClient.create.mockResolvedValue(getResult()); // successful creation - createRulesBulkRoute(server.router); + createRulesBulkRoute(server.router, ml); }); describe('status codes', () => { @@ -64,16 +70,20 @@ describe('create_rules_bulk', () => { }); describe('unhappy paths', () => { - it('returns an error object if creating an ML rule with an insufficient license', async () => { - (context.licensing.license.hasAtLeast as jest.Mock).mockReturnValue(false); + it('returns a 403 error object if ML Authz fails', async () => { + (buildMlAuthz as jest.Mock).mockReturnValueOnce({ + validateRuleType: jest + .fn() + .mockResolvedValue({ valid: false, message: 'mocked validation message' }), + }); const response = await server.inject(createBulkMlRuleRequest(), context); expect(response.status).toEqual(200); expect(response.body).toEqual([ { error: { - message: 'Your license does not support machine learning. Please upgrade your license.', - status_code: 400, + message: 'mocked validation message', + status_code: 403, }, rule_id: 'rule-1', }, diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts index cf841a9c88b32..371faccfbe47c 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_bulk_route.ts @@ -8,6 +8,9 @@ import uuid from 'uuid'; import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; +import { SetupPlugins } from '../../../../plugin'; +import { buildMlAuthz } from '../../../machine_learning/authz'; +import { throwHttpError } from '../../../machine_learning/validation'; import { createRules } from '../../rules/create_rules'; import { RuleAlertParamsRest } from '../../types'; import { readRules } from '../../rules/read_rules'; @@ -19,13 +22,12 @@ import { createBulkErrorObject, buildRouteValidation, buildSiemResponse, - validateLicenseForRuleType, } from '../utils'; import { createRulesBulkSchema } from '../schemas/create_rules_bulk_schema'; import { rulesBulkSchema } from '../schemas/response/rules_bulk_schema'; import { updateRulesNotifications } from '../../rules/update_rules_notifications'; -export const createRulesBulkRoute = (router: IRouter) => { +export const createRulesBulkRoute = (router: IRouter, ml: SetupPlugins['ml']) => { router.post( { path: `${DETECTION_ENGINE_RULES_URL}/_bulk_create`, @@ -47,6 +49,8 @@ export const createRulesBulkRoute = (router: IRouter) => { return siemResponse.error({ statusCode: 404 }); } + const mlAuthz = buildMlAuthz({ license: context.licensing.license, ml, request }); + const ruleDefinitions = request.body; const dupes = getDuplicates(ruleDefinitions, 'rule_id'); @@ -89,7 +93,7 @@ export const createRulesBulkRoute = (router: IRouter) => { } = payloadRule; const ruleIdOrUuid = ruleId ?? uuid.v4(); try { - validateLicenseForRuleType({ license: context.licensing.license, ruleType: type }); + throwHttpError(await mlAuthz.validateRuleType(type)); const finalIndex = outputIndex ?? siemClient.getSignalsIndex(); const indexExists = await getIndexExists(clusterClient.callAsCurrentUser, finalIndex); diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.test.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.test.ts index f15f47432f838..afdcda7da251d 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.test.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.test.ts @@ -16,15 +16,19 @@ import { getFindResultWithSingleHit, createMlRuleRequest, } from '../__mocks__/request_responses'; +import { mlServicesMock, mlAuthzMock as mockMlAuthzFactory } from '../../../machine_learning/mocks'; +import { buildMlAuthz } from '../../../machine_learning/authz'; import { requestContextMock, serverMock, requestMock } from '../__mocks__'; import { createRulesRoute } from './create_rules_route'; import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; import { updateRulesNotifications } from '../../rules/update_rules_notifications'; jest.mock('../../rules/update_rules_notifications'); +jest.mock('../../../machine_learning/authz', () => mockMlAuthzFactory.create()); describe('create_rules', () => { let server: ReturnType; let { clients, context } = requestContextMock.createTools(); + let ml: ReturnType; beforeAll(() => { setFeatureFlagsForTestsOnly(); @@ -37,13 +41,14 @@ describe('create_rules', () => { beforeEach(() => { server = serverMock.create(); ({ clients, context } = requestContextMock.createTools()); + ml = mlServicesMock.create(); clients.clusterClient.callAsCurrentUser.mockResolvedValue(getNonEmptyIndex()); // index exists clients.alertsClient.find.mockResolvedValue(getEmptyFindResult()); // no current rules clients.alertsClient.create.mockResolvedValue(getResult()); // creation succeeds clients.savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); // needed to transform - createRulesRoute(server.router); + createRulesRoute(server.router, ml); }); describe('status codes with actionClient and alertClient', () => { @@ -86,14 +91,18 @@ describe('create_rules', () => { expect(response.status).toEqual(200); }); - it('rejects the request if licensing is not platinum', async () => { - (context.licensing.license.hasAtLeast as jest.Mock).mockReturnValue(false); + it('returns a 403 if ML Authz fails', async () => { + (buildMlAuthz as jest.Mock).mockReturnValueOnce({ + validateRuleType: jest + .fn() + .mockResolvedValue({ valid: false, message: 'mocked validation message' }), + }); const response = await server.inject(createMlRuleRequest(), context); - expect(response.status).toEqual(400); + expect(response.status).toEqual(403); expect(response.body).toEqual({ - message: 'Your license does not support machine learning. Please upgrade your license.', - status_code: 400, + message: 'mocked validation message', + status_code: 403, }); }); }); diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts index 6605b5abfcb09..7cbb22221679a 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/create_rules_route.ts @@ -8,22 +8,20 @@ import uuid from 'uuid'; import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; +import { SetupPlugins } from '../../../../plugin'; +import { buildMlAuthz } from '../../../machine_learning/authz'; +import { throwHttpError } from '../../../machine_learning/validation'; import { createRules } from '../../rules/create_rules'; import { readRules } from '../../rules/read_rules'; import { RuleAlertParamsRest } from '../../types'; import { transformValidate } from './validate'; import { getIndexExists } from '../../index/get_index_exists'; import { createRulesSchema } from '../schemas/create_rules_schema'; -import { - buildRouteValidation, - transformError, - buildSiemResponse, - validateLicenseForRuleType, -} from '../utils'; +import { buildRouteValidation, transformError, buildSiemResponse } from '../utils'; import { updateRulesNotifications } from '../../rules/update_rules_notifications'; import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; -export const createRulesRoute = (router: IRouter): void => { +export const createRulesRoute = (router: IRouter, ml: SetupPlugins['ml']): void => { router.post( { path: DETECTION_ENGINE_RULES_URL, @@ -70,7 +68,6 @@ export const createRulesRoute = (router: IRouter): void => { const siemResponse = buildSiemResponse(response); try { - validateLicenseForRuleType({ license: context.licensing.license, ruleType: type }); const alertsClient = context.alerting?.getAlertsClient(); const clusterClient = context.core.elasticsearch.dataClient; const savedObjectsClient = context.core.savedObjects.client; @@ -80,6 +77,9 @@ export const createRulesRoute = (router: IRouter): void => { return siemResponse.error({ statusCode: 404 }); } + const mlAuthz = buildMlAuthz({ license: context.licensing.license, ml, request }); + throwHttpError(await mlAuthz.validateRuleType(type)); + const finalIndex = outputIndex ?? siemClient.getSignalsIndex(); const indexExists = await getIndexExists(clusterClient.callAsCurrentUser, finalIndex); if (!indexExists) { diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.test.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.test.ts index 91685a68a60ae..c33c917c2e987 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.test.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.test.ts @@ -9,8 +9,6 @@ import { ruleIdsToNdJsonString, rulesToNdJsonString, getSimpleRuleWithId, - getSimpleRule, - getSimpleMlRule, } from '../__mocks__/utils'; import { getImportRulesRequest, @@ -22,10 +20,14 @@ import { getNonEmptyIndex, } from '../__mocks__/request_responses'; import { createMockConfig, requestContextMock, serverMock, requestMock } from '../__mocks__'; +import { mlServicesMock, mlAuthzMock as mockMlAuthzFactory } from '../../../machine_learning/mocks'; +import { buildMlAuthz } from '../../../machine_learning/authz'; import { importRulesRoute } from './import_rules_route'; import * as createRulesStreamFromNdJson from '../../rules/create_rules_stream_from_ndjson'; import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; +jest.mock('../../../machine_learning/authz', () => mockMlAuthzFactory.create()); + describe('import_rules_route', () => { beforeAll(() => { setFeatureFlagsForTestsOnly(); @@ -39,25 +41,20 @@ describe('import_rules_route', () => { let server: ReturnType; let request: ReturnType; let { clients, context } = requestContextMock.createTools(); + let ml: ReturnType; beforeEach(() => { - // jest carries state between mocked implementations when using - // spyOn. So now we're doing all three of these. - // https://github.com/facebook/jest/issues/7136#issuecomment-565976599 - jest.resetAllMocks(); - jest.restoreAllMocks(); - jest.clearAllMocks(); - server = serverMock.create(); ({ clients, context } = requestContextMock.createTools()); config = createMockConfig(); const hapiStream = buildHapiStream(ruleIdsToNdJsonString(['rule-1'])); request = getImportRulesRequest(hapiStream); + ml = mlServicesMock.create(); clients.clusterClient.callAsCurrentUser.mockResolvedValue(getNonEmptyIndex()); // index exists clients.alertsClient.find.mockResolvedValue(getEmptyFindResult()); // no extant rules - importRulesRoute(server.router, config); + importRulesRoute(server.router, config, ml); }); describe('status codes', () => { @@ -83,11 +80,12 @@ describe('import_rules_route', () => { }); describe('unhappy paths', () => { - it('returns an error object if creating an ML rule with an insufficient license', async () => { - (context.licensing.license.hasAtLeast as jest.Mock).mockReturnValue(false); - const rules = [getSimpleRule(), getSimpleMlRule('rule-2')]; - const hapiStreamWithMlRule = buildHapiStream(rulesToNdJsonString(rules)); - request = getImportRulesRequest(hapiStreamWithMlRule); + it('returns a 403 error object if ML Authz fails', async () => { + (buildMlAuthz as jest.Mock).mockReturnValueOnce({ + validateRuleType: jest + .fn() + .mockResolvedValue({ valid: false, message: 'mocked validation message' }), + }); const response = await server.inject(request, context); expect(response.status).toEqual(200); @@ -95,20 +93,19 @@ describe('import_rules_route', () => { errors: [ { error: { - message: - 'Your license does not support machine learning. Please upgrade your license.', - status_code: 400, + message: 'mocked validation message', + status_code: 403, }, - rule_id: 'rule-2', + rule_id: 'rule-1', }, ], success: false, - success_count: 1, + success_count: 0, }); }); test('returns error if createPromiseFromStreams throws error', async () => { - jest + const transformMock = jest .spyOn(createRulesStreamFromNdJson, 'createRulesStreamFromNdJson') .mockImplementation(() => { throw new Error('Test error'); @@ -116,6 +113,8 @@ describe('import_rules_route', () => { const response = await server.inject(request, context); expect(response.status).toEqual(500); expect(response.body).toEqual({ message: 'Test error', status_code: 500 }); + + transformMock.mockRestore(); }); test('returns an error if the index does not exist', async () => { diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts index 9ba083ae48086..00010027f106b 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/import_rules_route.ts @@ -11,6 +11,9 @@ import { IRouter } from '../../../../../../../../src/core/server'; import { createPromiseFromStreams } from '../../../../../../../../src/legacy/utils/streams'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { ConfigType } from '../../../../config'; +import { SetupPlugins } from '../../../../plugin'; +import { buildMlAuthz } from '../../../machine_learning/authz'; +import { throwHttpError } from '../../../machine_learning/validation'; import { createRules } from '../../rules/create_rules'; import { ImportRulesRequestParams } from '../../rules/types'; import { readRules } from '../../rules/read_rules'; @@ -24,7 +27,6 @@ import { isImportRegular, transformError, buildSiemResponse, - validateLicenseForRuleType, } from '../utils'; import { ImportRuleAlertRest } from '../../types'; import { patchRules } from '../../rules/patch_rules'; @@ -38,7 +40,7 @@ type PromiseFromStreams = ImportRuleAlertRest | Error; const CHUNK_PARSED_OBJECT_SIZE = 10; -export const importRulesRoute = (router: IRouter, config: ConfigType) => { +export const importRulesRoute = (router: IRouter, config: ConfigType, ml: SetupPlugins['ml']) => { router.post( { path: `${DETECTION_ENGINE_RULES_URL}/_import`, @@ -67,6 +69,8 @@ export const importRulesRoute = (router: IRouter, config: ConfigType) => { return siemResponse.error({ statusCode: 404 }); } + const mlAuthz = buildMlAuthz({ license: context.licensing.license, ml, request }); + const { filename } = request.body.file.hapi; const fileExtension = extname(filename).toLowerCase(); if (fileExtension !== '.ndjson') { @@ -148,10 +152,7 @@ export const importRulesRoute = (router: IRouter, config: ConfigType) => { } = parsedRule; try { - validateLicenseForRuleType({ - license: context.licensing.license, - ruleType: type, - }); + throwHttpError(await mlAuthz.validateRuleType(type)); const rule = await readRules({ alertsClient, ruleId }); if (rule == null) { @@ -207,8 +208,7 @@ export const importRulesRoute = (router: IRouter, config: ConfigType) => { timelineTitle, meta, filters, - id: undefined, - ruleId, + rule, index, interval, maxSignals, @@ -240,7 +240,7 @@ export const importRulesRoute = (router: IRouter, config: ConfigType) => { resolve( createBulkErrorObject({ ruleId, - statusCode: 400, + statusCode: err.statusCode ?? 400, message: err.message, }) ); diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.test.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.test.ts index a1f39936dd674..24b2d5631b3a7 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.test.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.test.ts @@ -5,6 +5,8 @@ */ import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; +import { mlServicesMock, mlAuthzMock as mockMlAuthzFactory } from '../../../machine_learning/mocks'; +import { buildMlAuthz } from '../../../machine_learning/authz'; import { getEmptyFindResult, typicalPayload, @@ -17,9 +19,12 @@ import { serverMock, requestContextMock, requestMock } from '../__mocks__'; import { patchRulesBulkRoute } from './patch_rules_bulk_route'; import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; +jest.mock('../../../machine_learning/authz', () => mockMlAuthzFactory.create()); + describe('patch_rules_bulk', () => { let server: ReturnType; let { clients, context } = requestContextMock.createTools(); + let ml: ReturnType; beforeAll(() => { setFeatureFlagsForTestsOnly(); @@ -32,11 +37,12 @@ describe('patch_rules_bulk', () => { beforeEach(() => { server = serverMock.create(); ({ clients, context } = requestContextMock.createTools()); + ml = mlServicesMock.create(); clients.alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); // rule exists clients.alertsClient.update.mockResolvedValue(getResult()); // update succeeds - patchRulesBulkRoute(server.router); + patchRulesBulkRoute(server.router, ml); }); describe('status codes with actionClient and alertClient', () => { @@ -90,21 +96,51 @@ describe('patch_rules_bulk', () => { expect(response.body).toEqual({ message: 'Not Found', status_code: 404 }); }); - it('rejects patching of an ML rule with an insufficient license', async () => { - (context.licensing.license.hasAtLeast as jest.Mock).mockReturnValue(false); + it('rejects patching a rule to ML if mlAuthz fails', async () => { + (buildMlAuthz as jest.Mock).mockReturnValueOnce({ + validateRuleType: jest + .fn() + .mockResolvedValue({ valid: false, message: 'mocked validation message' }), + }); const request = requestMock.create({ method: 'patch', path: `${DETECTION_ENGINE_RULES_URL}/_bulk_update`, body: [typicalMlRulePayload()], }); + const response = await server.inject(request, context); + expect(response.status).toEqual(200); + expect(response.body).toEqual([ + { + error: { + message: 'mocked validation message', + status_code: 403, + }, + rule_id: 'rule-1', + }, + ]); + }); + + it('rejects patching an existing ML rule if mlAuthz fails', async () => { + (buildMlAuthz as jest.Mock).mockReturnValueOnce({ + validateRuleType: jest + .fn() + .mockResolvedValue({ valid: false, message: 'mocked validation message' }), + }); + const { type, ...payloadWithoutType } = typicalMlRulePayload(); + const request = requestMock.create({ + method: 'patch', + path: `${DETECTION_ENGINE_RULES_URL}/_bulk_update`, + body: [payloadWithoutType], + }); const response = await server.inject(request, context); + expect(response.status).toEqual(200); expect(response.body).toEqual([ { error: { - message: 'Your license does not support machine learning. Please upgrade your license.', - status_code: 400, + message: 'mocked validation message', + status_code: 403, }, rule_id: 'rule-1', }, diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.ts index 201e1f823b4cb..69789fe946622 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_bulk_route.ts @@ -6,13 +6,11 @@ import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; +import { SetupPlugins } from '../../../../plugin'; +import { buildMlAuthz } from '../../../machine_learning/authz'; +import { throwHttpError } from '../../../machine_learning/validation'; import { PatchRuleAlertParamsRest } from '../../rules/types'; -import { - transformBulkError, - buildRouteValidation, - buildSiemResponse, - validateLicenseForRuleType, -} from '../utils'; +import { transformBulkError, buildRouteValidation, buildSiemResponse } from '../utils'; import { getIdBulkError } from './utils'; import { transformValidateBulkError, validate } from './validate'; import { patchRulesBulkSchema } from '../schemas/patch_rules_bulk_schema'; @@ -20,8 +18,9 @@ import { rulesBulkSchema } from '../schemas/response/rules_bulk_schema'; import { patchRules } from '../../rules/patch_rules'; import { updateRulesNotifications } from '../../rules/update_rules_notifications'; import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; +import { readRules } from '../../rules/read_rules'; -export const patchRulesBulkRoute = (router: IRouter) => { +export const patchRulesBulkRoute = (router: IRouter, ml: SetupPlugins['ml']) => { router.patch( { path: `${DETECTION_ENGINE_RULES_URL}/_bulk_update`, @@ -42,6 +41,7 @@ export const patchRulesBulkRoute = (router: IRouter) => { return siemResponse.error({ statusCode: 404 }); } + const mlAuthz = buildMlAuthz({ license: context.licensing.license, ml, request }); const ruleStatusClient = ruleStatusSavedObjectsClientFactory(savedObjectsClient); const rules = await Promise.all( request.body.map(async payloadRule => { @@ -81,10 +81,18 @@ export const patchRulesBulkRoute = (router: IRouter) => { const idOrRuleIdOrUnknown = id ?? ruleId ?? '(unknown id)'; try { if (type) { - validateLicenseForRuleType({ license: context.licensing.license, ruleType: type }); + // reject an unauthorized "promotion" to ML + throwHttpError(await mlAuthz.validateRuleType(type)); + } + + const existingRule = await readRules({ alertsClient, ruleId, id }); + if (existingRule?.params.type) { + // reject an unauthorized modification of an ML rule + throwHttpError(await mlAuthz.validateRuleType(existingRule?.params.type)); } const rule = await patchRules({ + rule: existingRule, alertsClient, description, enabled, @@ -99,8 +107,6 @@ export const patchRulesBulkRoute = (router: IRouter) => { timelineTitle, meta, filters, - id, - ruleId, index, interval, maxSignals, diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_route.test.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_route.test.ts index dbb0a3bb3e1da..9ae7e83ef7989 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_route.test.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_route.test.ts @@ -5,6 +5,8 @@ */ import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; +import { mlServicesMock, mlAuthzMock as mockMlAuthzFactory } from '../../../machine_learning/mocks'; +import { buildMlAuthz } from '../../../machine_learning/authz'; import { getEmptyFindResult, getFindResultStatus, @@ -19,9 +21,12 @@ import { requestContextMock, serverMock, requestMock } from '../__mocks__'; import { patchRulesRoute } from './patch_rules_route'; import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; +jest.mock('../../../machine_learning/authz', () => mockMlAuthzFactory.create()); + describe('patch_rules', () => { let server: ReturnType; let { clients, context } = requestContextMock.createTools(); + let ml: ReturnType; beforeAll(() => { setFeatureFlagsForTestsOnly(); @@ -34,13 +39,14 @@ describe('patch_rules', () => { beforeEach(() => { server = serverMock.create(); ({ clients, context } = requestContextMock.createTools()); + ml = mlServicesMock.create(); clients.alertsClient.get.mockResolvedValue(getResult()); // existing rule clients.alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); // existing rule clients.alertsClient.update.mockResolvedValue(getResult()); // successful update clients.savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); // successful transform - patchRulesRoute(server.router); + patchRulesRoute(server.router, ml); }); describe('status codes with actionClient and alertClient', () => { @@ -112,8 +118,12 @@ describe('patch_rules', () => { ); }); - it('rejects patching a rule to ML if licensing is not platinum', async () => { - (context.licensing.license.hasAtLeast as jest.Mock).mockReturnValue(false); + it('rejects patching a rule to ML if mlAuthz fails', async () => { + (buildMlAuthz as jest.Mock).mockReturnValueOnce({ + validateRuleType: jest + .fn() + .mockResolvedValue({ valid: false, message: 'mocked validation message' }), + }); const request = requestMock.create({ method: 'patch', path: DETECTION_ENGINE_RULES_URL, @@ -121,10 +131,31 @@ describe('patch_rules', () => { }); const response = await server.inject(request, context); - expect(response.status).toEqual(400); + expect(response.status).toEqual(403); + expect(response.body).toEqual({ + message: 'mocked validation message', + status_code: 403, + }); + }); + + it('rejects patching an ML rule if mlAuthz fails', async () => { + (buildMlAuthz as jest.Mock).mockReturnValueOnce({ + validateRuleType: jest + .fn() + .mockResolvedValue({ valid: false, message: 'mocked validation message' }), + }); + const { type, ...payloadWithoutType } = typicalMlRulePayload(); + const request = requestMock.create({ + method: 'patch', + path: DETECTION_ENGINE_RULES_URL, + body: payloadWithoutType, + }); + const response = await server.inject(request, context); + + expect(response.status).toEqual(403); expect(response.body).toEqual({ - message: 'Your license does not support machine learning. Please upgrade your license.', - status_code: 400, + message: 'mocked validation message', + status_code: 403, }); }); }); diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_route.ts index 00ccd3059b38d..ae23e0efc857d 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/patch_rules_route.ts @@ -6,21 +6,20 @@ import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; +import { SetupPlugins } from '../../../../plugin'; +import { buildMlAuthz } from '../../../machine_learning/authz'; +import { throwHttpError } from '../../../machine_learning/validation'; import { patchRules } from '../../rules/patch_rules'; import { PatchRuleAlertParamsRest } from '../../rules/types'; import { patchRulesSchema } from '../schemas/patch_rules_schema'; -import { - buildRouteValidation, - transformError, - buildSiemResponse, - validateLicenseForRuleType, -} from '../utils'; +import { buildRouteValidation, transformError, buildSiemResponse } from '../utils'; import { getIdError } from './utils'; import { transformValidate } from './validate'; import { updateRulesNotifications } from '../../rules/update_rules_notifications'; import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; +import { readRules } from '../../rules/read_rules'; -export const patchRulesRoute = (router: IRouter) => { +export const patchRulesRoute = (router: IRouter, ml: SetupPlugins['ml']) => { router.patch( { path: DETECTION_ENGINE_RULES_URL, @@ -68,10 +67,6 @@ export const patchRulesRoute = (router: IRouter) => { const siemResponse = buildSiemResponse(response); try { - if (type) { - validateLicenseForRuleType({ license: context.licensing.license, ruleType: type }); - } - const alertsClient = context.alerting?.getAlertsClient(); const savedObjectsClient = context.core.savedObjects.client; @@ -79,6 +74,18 @@ export const patchRulesRoute = (router: IRouter) => { return siemResponse.error({ statusCode: 404 }); } + const mlAuthz = buildMlAuthz({ license: context.licensing.license, ml, request }); + if (type) { + // reject an unauthorized "promotion" to ML + throwHttpError(await mlAuthz.validateRuleType(type)); + } + + const existingRule = await readRules({ alertsClient, ruleId, id }); + if (existingRule?.params.type) { + // reject an unauthorized modification of an ML rule + throwHttpError(await mlAuthz.validateRuleType(existingRule?.params.type)); + } + const ruleStatusClient = ruleStatusSavedObjectsClientFactory(savedObjectsClient); const rule = await patchRules({ alertsClient, @@ -95,8 +102,7 @@ export const patchRulesRoute = (router: IRouter) => { timelineTitle, meta, filters, - id, - ruleId, + rule: existingRule, index, interval, maxSignals, diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.test.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.test.ts index 332a47d0c0fc2..e48c72ce9579e 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.test.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.test.ts @@ -4,6 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ +import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; +import { mlServicesMock, mlAuthzMock as mockMlAuthzFactory } from '../../../machine_learning/mocks'; +import { buildMlAuthz } from '../../../machine_learning/authz'; import { getEmptyFindResult, getResult, @@ -16,12 +19,14 @@ import { import { serverMock, requestContextMock, requestMock } from '../__mocks__'; import { updateRulesBulkRoute } from './update_rules_bulk_route'; import { BulkError } from '../utils'; -import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; +jest.mock('../../../machine_learning/authz', () => mockMlAuthzFactory.create()); + describe('update_rules_bulk', () => { let server: ReturnType; let { clients, context } = requestContextMock.createTools(); + let ml: ReturnType; beforeAll(() => { setFeatureFlagsForTestsOnly(); @@ -34,12 +39,13 @@ describe('update_rules_bulk', () => { beforeEach(() => { server = serverMock.create(); ({ clients, context } = requestContextMock.createTools()); + ml = mlServicesMock.create(); clients.alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); clients.alertsClient.update.mockResolvedValue(getResult()); clients.savedObjectsClient.find.mockResolvedValue(getFindResultStatus()); - updateRulesBulkRoute(server.router); + updateRulesBulkRoute(server.router, ml); }); describe('status codes with actionClient and alertClient', () => { @@ -92,8 +98,12 @@ describe('update_rules_bulk', () => { expect(response.body).toEqual(expected); }); - it('returns an error object if creating an ML rule with an insufficient license', async () => { - (context.licensing.license.hasAtLeast as jest.Mock).mockReturnValue(false); + it('returns a 403 error object if mlAuthz fails', async () => { + (buildMlAuthz as jest.Mock).mockReturnValueOnce({ + validateRuleType: jest + .fn() + .mockResolvedValue({ valid: false, message: 'mocked validation message' }), + }); const request = requestMock.create({ method: 'put', path: `${DETECTION_ENGINE_RULES_URL}/_bulk_update`, @@ -105,8 +115,8 @@ describe('update_rules_bulk', () => { expect(response.body).toEqual([ { error: { - message: 'Your license does not support machine learning. Please upgrade your license.', - status_code: 400, + message: 'mocked validation message', + status_code: 403, }, rule_id: 'rule-1', }, diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts index 6d8f2243787e8..11892898d214b 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_bulk_route.ts @@ -6,22 +6,20 @@ import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; +import { SetupPlugins } from '../../../../plugin'; +import { buildMlAuthz } from '../../../machine_learning/authz'; +import { throwHttpError } from '../../../machine_learning/validation'; import { UpdateRuleAlertParamsRest } from '../../rules/types'; import { getIdBulkError } from './utils'; import { transformValidateBulkError, validate } from './validate'; -import { - buildRouteValidation, - transformBulkError, - buildSiemResponse, - validateLicenseForRuleType, -} from '../utils'; +import { buildRouteValidation, transformBulkError, buildSiemResponse } from '../utils'; import { updateRulesBulkSchema } from '../schemas/update_rules_bulk_schema'; import { updateRules } from '../../rules/update_rules'; import { rulesBulkSchema } from '../schemas/response/rules_bulk_schema'; import { updateRulesNotifications } from '../../rules/update_rules_notifications'; import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; -export const updateRulesBulkRoute = (router: IRouter) => { +export const updateRulesBulkRoute = (router: IRouter, ml: SetupPlugins['ml']) => { router.put( { path: `${DETECTION_ENGINE_RULES_URL}/_bulk_update`, @@ -43,6 +41,7 @@ export const updateRulesBulkRoute = (router: IRouter) => { return siemResponse.error({ statusCode: 404 }); } + const mlAuthz = buildMlAuthz({ license: context.licensing.license, ml, request }); const ruleStatusClient = ruleStatusSavedObjectsClientFactory(savedObjectsClient); const rules = await Promise.all( request.body.map(async payloadRule => { @@ -83,7 +82,7 @@ export const updateRulesBulkRoute = (router: IRouter) => { const finalIndex = outputIndex ?? siemClient.getSignalsIndex(); const idOrRuleIdOrUnknown = id ?? ruleId ?? '(unknown id)'; try { - validateLicenseForRuleType({ license: context.licensing.license, ruleType: type }); + throwHttpError(await mlAuthz.validateRuleType(type)); const rule = await updateRules({ alertsClient, diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.test.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.test.ts index 53c52153e84e6..ce25a0204a606 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.test.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.test.ts @@ -4,7 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import { updateRulesRoute } from './update_rules_route'; +import { mlServicesMock, mlAuthzMock as mockMlAuthzFactory } from '../../../machine_learning/mocks'; +import { buildMlAuthz } from '../../../machine_learning/authz'; import { getEmptyFindResult, getResult, @@ -19,11 +20,15 @@ import { requestContextMock, serverMock, requestMock } from '../__mocks__'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../../feature_flags'; import { updateRulesNotifications } from '../../rules/update_rules_notifications'; +import { updateRulesRoute } from './update_rules_route'; + +jest.mock('../../../machine_learning/authz', () => mockMlAuthzFactory.create()); jest.mock('../../rules/update_rules_notifications'); describe('update_rules', () => { let server: ReturnType; let { clients, context } = requestContextMock.createTools(); + let ml: ReturnType; beforeAll(() => { setFeatureFlagsForTestsOnly(); @@ -36,13 +41,14 @@ describe('update_rules', () => { beforeEach(() => { server = serverMock.create(); ({ clients, context } = requestContextMock.createTools()); + ml = mlServicesMock.create(); clients.alertsClient.get.mockResolvedValue(getResult()); // existing rule clients.alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); // rule exists clients.alertsClient.update.mockResolvedValue(getResult()); // successful update clients.savedObjectsClient.find.mockResolvedValue(getFindResultStatusEmpty()); // successful transform - updateRulesRoute(server.router); + updateRulesRoute(server.router, ml); }); describe('status codes with actionClient and alertClient', () => { @@ -106,8 +112,12 @@ describe('update_rules', () => { }); }); - it('rejects the request if licensing is not adequate', async () => { - (context.licensing.license.hasAtLeast as jest.Mock).mockReturnValue(false); + it('returns a 403 if mlAuthz fails', async () => { + (buildMlAuthz as jest.Mock).mockReturnValueOnce({ + validateRuleType: jest + .fn() + .mockResolvedValue({ valid: false, message: 'mocked validation message' }), + }); const request = requestMock.create({ method: 'put', path: DETECTION_ENGINE_RULES_URL, @@ -115,10 +125,10 @@ describe('update_rules', () => { }); const response = await server.inject(request, context); - expect(response.status).toEqual(400); + expect(response.status).toEqual(403); expect(response.body).toEqual({ - message: 'Your license does not support machine learning. Please upgrade your license.', - status_code: 400, + message: 'mocked validation message', + status_code: 403, }); }); }); diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts index bfbeef8be2fea..f15154a09657d 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/rules/update_rules_route.ts @@ -6,21 +6,19 @@ import { IRouter } from '../../../../../../../../src/core/server'; import { DETECTION_ENGINE_RULES_URL } from '../../../../../common/constants'; +import { SetupPlugins } from '../../../../plugin'; +import { buildMlAuthz } from '../../../machine_learning/authz'; +import { throwHttpError } from '../../../machine_learning/validation'; import { UpdateRuleAlertParamsRest } from '../../rules/types'; import { updateRulesSchema } from '../schemas/update_rules_schema'; -import { - buildRouteValidation, - transformError, - buildSiemResponse, - validateLicenseForRuleType, -} from '../utils'; +import { buildRouteValidation, transformError, buildSiemResponse } from '../utils'; import { getIdError } from './utils'; import { transformValidate } from './validate'; import { updateRules } from '../../rules/update_rules'; import { updateRulesNotifications } from '../../rules/update_rules_notifications'; import { ruleStatusSavedObjectsClientFactory } from '../../signals/rule_status_saved_objects_client'; -export const updateRulesRoute = (router: IRouter) => { +export const updateRulesRoute = (router: IRouter, ml: SetupPlugins['ml']) => { router.put( { path: DETECTION_ENGINE_RULES_URL, @@ -69,8 +67,6 @@ export const updateRulesRoute = (router: IRouter) => { const siemResponse = buildSiemResponse(response); try { - validateLicenseForRuleType({ license: context.licensing.license, ruleType: type }); - const alertsClient = context.alerting?.getAlertsClient(); const savedObjectsClient = context.core.savedObjects.client; const siemClient = context.siem?.getSiemClient(); @@ -80,6 +76,9 @@ export const updateRulesRoute = (router: IRouter) => { return siemResponse.error({ statusCode: 404 }); } + const mlAuthz = buildMlAuthz({ license: context.licensing.license, ml, request }); + throwHttpError(await mlAuthz.validateRuleType(type)); + const finalIndex = outputIndex ?? siemClient.getSignalsIndex(); const rule = await updateRules({ alertsClient, diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/response/check_type_dependents.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/response/check_type_dependents.ts index 25e76f367037a..1c1bee58f0c97 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/response/check_type_dependents.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/schemas/response/check_type_dependents.ts @@ -8,7 +8,7 @@ import * as t from 'io-ts'; import { Either, left, fold } from 'fp-ts/lib/Either'; import { pipe } from 'fp-ts/lib/pipeable'; -import { isMlRule } from '../../../../../../common/detection_engine/ml_helpers'; +import { isMlRule } from '../../../../../../common/machine_learning/helpers'; import { dependentRulesSchema, RequiredRulesSchema, diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/utils.test.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/utils.test.ts index 8af5df6056913..fdb1cd148c7fa 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/utils.test.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/utils.test.ts @@ -19,11 +19,9 @@ import { transformImportError, convertToSnakeCase, SiemResponseFactory, - validateLicenseForRuleType, } from './utils'; import { responseMock } from './__mocks__'; import { setFeatureFlagsForTestsOnly, unSetFeatureFlagsForTestsOnly } from '../feature_flags'; -import { licensingMock } from '../../../../../licensing/server/mocks'; describe('utils', () => { beforeAll(() => { @@ -361,36 +359,4 @@ describe('utils', () => { ); }); }); - - describe('validateLicenseForRuleType', () => { - let licenseMock: ReturnType; - - beforeEach(() => { - licenseMock = licensingMock.createLicenseMock(); - }); - - it('throws a BadRequestError if operating on an ML Rule with an insufficient license', () => { - licenseMock.hasAtLeast.mockReturnValue(false); - - expect(() => - validateLicenseForRuleType({ license: licenseMock, ruleType: 'machine_learning' }) - ).toThrowError(BadRequestError); - }); - - it('does not throw if operating on an ML Rule with a sufficient license', () => { - licenseMock.hasAtLeast.mockReturnValue(true); - - expect(() => - validateLicenseForRuleType({ license: licenseMock, ruleType: 'machine_learning' }) - ).not.toThrowError(BadRequestError); - }); - - it('does not throw if operating on a query rule', () => { - licenseMock.hasAtLeast.mockReturnValue(false); - - expect(() => - validateLicenseForRuleType({ license: licenseMock, ruleType: 'query' }) - ).not.toThrowError(BadRequestError); - }); - }); }); diff --git a/x-pack/plugins/siem/server/lib/detection_engine/routes/utils.ts b/x-pack/plugins/siem/server/lib/detection_engine/routes/utils.ts index 52493a9be9b8f..9903840b99c6f 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/routes/utils.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/routes/utils.ts @@ -7,17 +7,12 @@ import Boom from 'boom'; import Joi from 'joi'; import { has, snakeCase } from 'lodash/fp'; -import { i18n } from '@kbn/i18n'; import { RouteValidationFunction, KibanaResponseFactory, CustomHttpResponseOptions, } from '../../../../../../../src/core/server'; -import { ILicense } from '../../../../../licensing/server'; -import { MINIMUM_ML_LICENSE } from '../../../../common/constants'; -import { RuleType } from '../../../../common/detection_engine/types'; -import { isMlRule } from '../../../../common/detection_engine/ml_helpers'; import { BadRequestError } from '../errors/bad_request_error'; export interface OutputError { @@ -294,28 +289,3 @@ export const convertToSnakeCase = >( return { ...acc, [newKey]: obj[item] }; }, {}); }; - -/** - * Checks the current Kibana License against the rule under operation. - * - * @param license ILicense representing the user license - * @param ruleType the type of the current rule - * - * @throws BadRequestError if rule and license are incompatible - */ -export const validateLicenseForRuleType = ({ - license, - ruleType, -}: { - license: ILicense; - ruleType: RuleType; -}): void => { - if (isMlRule(ruleType) && !license.hasAtLeast(MINIMUM_ML_LICENSE)) { - const message = i18n.translate('xpack.siem.licensing.unsupportedMachineLearningMessage', { - defaultMessage: - 'Your license does not support machine learning. Please upgrade your license.', - }); - - throw new BadRequestError(message); - } -}; diff --git a/x-pack/plugins/siem/server/lib/detection_engine/rules/patch_rules.test.ts b/x-pack/plugins/siem/server/lib/detection_engine/rules/patch_rules.test.ts index c551eb164ee07..a42500223012e 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/rules/patch_rules.test.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/rules/patch_rules.test.ts @@ -19,14 +19,14 @@ describe('patchRules', () => { }); it('should call alertsClient.disable is the rule was enabled and enabled is false', async () => { - const rule = getResult(); - alertsClient.get.mockResolvedValue(getResult()); + const existingRule = getResult(); + const params = getResult().params; await patchRules({ alertsClient, savedObjectsClient, - id: '04128c15-0d1b-4716-a4c5-46997ac7f3bd', - ...rule.params, + rule: existingRule, + ...params, enabled: false, interval: '', name: '', @@ -35,23 +35,23 @@ describe('patchRules', () => { expect(alertsClient.disable).toHaveBeenCalledWith( expect.objectContaining({ - id: '04128c15-0d1b-4716-a4c5-46997ac7f3bd', + id: existingRule.id, }) ); }); it('should call alertsClient.enable is the rule was disabled and enabled is true', async () => { - const rule = getResult(); - alertsClient.get.mockResolvedValue({ + const existingRule = { ...getResult(), enabled: false, - }); + }; + const params = getResult().params; await patchRules({ alertsClient, savedObjectsClient, - id: '04128c15-0d1b-4716-a4c5-46997ac7f3bd', - ...rule.params, + rule: existingRule, + ...params, enabled: true, interval: '', name: '', @@ -60,13 +60,13 @@ describe('patchRules', () => { expect(alertsClient.enable).toHaveBeenCalledWith( expect.objectContaining({ - id: '04128c15-0d1b-4716-a4c5-46997ac7f3bd', + id: existingRule.id, }) ); }); it('calls the alertsClient with ML params', async () => { - alertsClient.get.mockResolvedValue(getMlResult()); + const existingRule = getMlResult(); const params = { ...getMlResult().params, anomalyThreshold: 55, @@ -76,7 +76,7 @@ describe('patchRules', () => { await patchRules({ alertsClient, savedObjectsClient, - id: '04128c15-0d1b-4716-a4c5-46997ac7f3bd', + rule: existingRule, ...params, }); diff --git a/x-pack/plugins/siem/server/lib/detection_engine/rules/patch_rules.ts b/x-pack/plugins/siem/server/lib/detection_engine/rules/patch_rules.ts index da5e90ec14b0b..6dfb72532afbb 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/rules/patch_rules.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/rules/patch_rules.ts @@ -6,7 +6,6 @@ import { defaults } from 'lodash/fp'; import { PartialAlert } from '../../../../../alerting/server'; -import { readRules } from './read_rules'; import { PatchRuleParams } from './types'; import { addTags } from './add_tags'; import { calculateVersion, calculateName, calculateInterval } from './utils'; @@ -28,12 +27,11 @@ export const patchRules = async ({ filters, from, immutable, - id, - ruleId, index, interval, maxSignals, riskScore, + rule, name, severity, tags, @@ -47,7 +45,6 @@ export const patchRules = async ({ anomalyThreshold, machineLearningJobId, }: PatchRuleParams): Promise => { - const rule = await readRules({ alertsClient, ruleId, id }); if (rule == null) { return null; } diff --git a/x-pack/plugins/siem/server/lib/detection_engine/rules/types.ts b/x-pack/plugins/siem/server/lib/detection_engine/rules/types.ts index b5dbfc92cf528..217a966478e78 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/rules/types.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/rules/types.ts @@ -14,7 +14,7 @@ import { SavedObjectsClientContract, } from 'kibana/server'; import { AlertsClient, PartialAlert } from '../../../../../alerting/server'; -import { Alert } from '../../../../../alerting/common'; +import { Alert, SanitizedAlert } from '../../../../../alerting/common'; import { SIGNALS_ID } from '../../../../common/constants'; import { RuleAlertParams, RuleTypeParams, RuleAlertParamsRest } from '../types'; @@ -140,8 +140,8 @@ export interface Clients { alertsClient: AlertsClient; } -export type PatchRuleParams = Partial> & { - id: string | undefined | null; +export type PatchRuleParams = Partial> & { + rule: SanitizedAlert | null; savedObjectsClient: SavedObjectsClientContract; } & Clients; diff --git a/x-pack/plugins/siem/server/lib/detection_engine/rules/update_prepacked_rules.test.ts b/x-pack/plugins/siem/server/lib/detection_engine/rules/update_prepacked_rules.test.ts index e8fb4fa96ab51..2d77e9a707f74 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/rules/update_prepacked_rules.test.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/rules/update_prepacked_rules.test.ts @@ -6,7 +6,10 @@ import { savedObjectsClientMock } from '../../../../../../../src/core/server/mocks'; import { alertsClientMock } from '../../../../../alerting/server/mocks'; -import { mockPrepackagedRule } from '../routes/__mocks__/request_responses'; +import { + mockPrepackagedRule, + getFindResultWithSingleHit, +} from '../routes/__mocks__/request_responses'; import { updatePrepackagedRules } from './update_prepacked_rules'; import { patchRules } from './patch_rules'; jest.mock('./patch_rules'); @@ -31,6 +34,7 @@ describe('updatePrepackagedRules', () => { ]; const outputIndex = 'outputIndex'; const prepackagedRule = mockPrepackagedRule(); + alertsClient.find.mockResolvedValue(getFindResultWithSingleHit()); await updatePrepackagedRules( alertsClient, @@ -40,17 +44,8 @@ describe('updatePrepackagedRules', () => { ); expect(patchRules).toHaveBeenCalledWith( - expect.objectContaining({ - ruleId: 'rule-1', - }) - ); - expect(patchRules).not.toHaveBeenCalledWith( - expect.objectContaining({ + expect.not.objectContaining({ enabled: true, - }) - ); - expect(patchRules).not.toHaveBeenCalledWith( - expect.objectContaining({ actions, }) ); diff --git a/x-pack/plugins/siem/server/lib/detection_engine/rules/update_prepacked_rules.ts b/x-pack/plugins/siem/server/lib/detection_engine/rules/update_prepacked_rules.ts index 4c183c51d16ea..618dee26b4812 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/rules/update_prepacked_rules.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/rules/update_prepacked_rules.ts @@ -8,6 +8,7 @@ import { SavedObjectsClientContract } from 'kibana/server'; import { AlertsClient } from '../../../../../alerting/server'; import { patchRules } from './patch_rules'; import { PrepackagedRules } from '../types'; +import { readRules } from './read_rules'; export const updatePrepackagedRules = async ( alertsClient: AlertsClient, @@ -15,63 +16,66 @@ export const updatePrepackagedRules = async ( rules: PrepackagedRules[], outputIndex: string ): Promise => { - await rules.forEach(async rule => { - const { - description, - false_positives: falsePositives, - from, - immutable, - query, - language, - saved_id: savedId, - meta, - filters, - rule_id: ruleId, - index, - interval, - max_signals: maxSignals, - risk_score: riskScore, - name, - severity, - tags, - to, - type, - threat, - references, - version, - note, - } = rule; + await Promise.all( + rules.map(async rule => { + const { + description, + false_positives: falsePositives, + from, + immutable, + query, + language, + saved_id: savedId, + meta, + filters, + rule_id: ruleId, + index, + interval, + max_signals: maxSignals, + risk_score: riskScore, + name, + severity, + tags, + to, + type, + threat, + references, + version, + note, + } = rule; - // Note: we do not pass down enabled as we do not want to suddenly disable - // or enable rules on the user when they were not expecting it if a rule updates - return patchRules({ - alertsClient, - description, - falsePositives, - from, - immutable, - query, - language, - outputIndex, - id: undefined, // We never have an id when updating from pre-packaged rules - savedId, - savedObjectsClient, - meta, - filters, - ruleId, - index, - interval, - maxSignals, - riskScore, - name, - severity, - tags, - to, - type, - threat, - references, - version, - note, - }); - }); + const existingRule = await readRules({ alertsClient, ruleId, id: undefined }); + + // Note: we do not pass down enabled as we do not want to suddenly disable + // or enable rules on the user when they were not expecting it if a rule updates + return patchRules({ + alertsClient, + description, + falsePositives, + from, + immutable, + query, + language, + outputIndex, + rule: existingRule, + savedId, + savedObjectsClient, + meta, + filters, + index, + interval, + maxSignals, + riskScore, + name, + severity, + tags, + to, + type, + threat, + references, + version, + note, + }); + }) + ); }; diff --git a/x-pack/plugins/siem/server/lib/detection_engine/signals/signal_rule_alert_type.ts b/x-pack/plugins/siem/server/lib/detection_engine/signals/signal_rule_alert_type.ts index ca259b3581720..6160f34faef3f 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/signals/signal_rule_alert_type.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/signals/signal_rule_alert_type.ts @@ -8,7 +8,7 @@ import { performance } from 'perf_hooks'; import { Logger, KibanaRequest } from 'src/core/server'; import { SIGNALS_ID, DEFAULT_SEARCH_AFTER_PAGE_SIZE } from '../../../../common/constants'; -import { isJobStarted, isMlRule } from '../../../../common/detection_engine/ml_helpers'; +import { isJobStarted, isMlRule } from '../../../../common/machine_learning/helpers'; import { SetupPlugins } from '../../../plugin'; import { buildEventsSearchQuery } from './build_events_query'; diff --git a/x-pack/plugins/siem/server/lib/machine_learning/authz.test.ts b/x-pack/plugins/siem/server/lib/machine_learning/authz.test.ts new file mode 100644 index 0000000000000..93c3a74c71378 --- /dev/null +++ b/x-pack/plugins/siem/server/lib/machine_learning/authz.test.ts @@ -0,0 +1,265 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { KibanaRequest } from '../../../../../../src/core/server'; +import { httpServerMock } from '../../../../../../src/core/server/mocks'; +import { hasMlAdminPermissions } from '../../../common/machine_learning/has_ml_admin_permissions'; +import { mlServicesMock } from './mocks'; +import { hasMlLicense, isMlAdmin, buildMlAuthz } from './authz'; +import { licensingMock } from '../../../../licensing/server/mocks'; + +jest.mock('../../../common/machine_learning/has_ml_admin_permissions'); + +describe('isMlAdmin', () => { + it('returns true if hasMlAdminPermissions is true', async () => { + const mockMl = mlServicesMock.create(); + const request = httpServerMock.createKibanaRequest(); + (hasMlAdminPermissions as jest.Mock).mockReturnValue(true); + + expect(await isMlAdmin({ ml: mockMl, request })).toEqual(true); + }); + + it('returns false if hasMlAdminPermissions is false', async () => { + const mockMl = mlServicesMock.create(); + const request = httpServerMock.createKibanaRequest(); + (hasMlAdminPermissions as jest.Mock).mockReturnValue(false); + + expect(await isMlAdmin({ ml: mockMl, request })).toEqual(false); + }); +}); + +describe('hasMlLicense', () => { + let licenseMock: ReturnType; + + beforeEach(() => { + licenseMock = licensingMock.createLicenseMock(); + }); + + it('returns false for an insufficient license', () => { + licenseMock.hasAtLeast.mockReturnValue(false); + + expect(hasMlLicense(licenseMock)).toEqual(false); + }); + + it('returns true for a sufficient license', () => { + licenseMock.hasAtLeast.mockReturnValue(true); + + expect(hasMlLicense(licenseMock)).toEqual(true); + }); +}); + +describe('mlAuthz', () => { + let licenseMock: ReturnType; + let mlMock: ReturnType; + let request: KibanaRequest; + + beforeEach(() => { + licenseMock = licensingMock.createLicenseMock(); + mlMock = mlServicesMock.create(); + request = httpServerMock.createKibanaRequest(); + }); + + describe('#validateRuleType', () => { + it('is valid for a non-ML rule when ML plugin is unavailable', async () => { + const mlAuthz = buildMlAuthz({ + license: licenseMock, + ml: undefined, + request, + }); + + const validation = await mlAuthz.validateRuleType('query'); + + expect(validation.valid).toEqual(true); + }); + + it('is invalid for an ML rule when ML plugin is unavailable', async () => { + const mlAuthz = buildMlAuthz({ + license: licenseMock, + ml: undefined, + request, + }); + + const validation = await mlAuthz.validateRuleType('machine_learning'); + + expect(validation.valid).toEqual(false); + expect(validation.message).toEqual( + 'The machine learning plugin is not available. Try enabling the plugin.' + ); + }); + + it('is valid for a non-ML rule when license is insufficient', async () => { + licenseMock.hasAtLeast.mockReturnValue(false); + + const mlAuthz = buildMlAuthz({ + license: licenseMock, + ml: mlMock, + request, + }); + + const validation = await mlAuthz.validateRuleType('query'); + + expect(validation.valid).toEqual(true); + }); + + it('is invalid for an ML rule when license is insufficient', async () => { + licenseMock.hasAtLeast.mockReturnValue(false); + + const mlAuthz = buildMlAuthz({ + license: licenseMock, + ml: mlMock, + request, + }); + + const validation = await mlAuthz.validateRuleType('machine_learning'); + + expect(validation.valid).toEqual(false); + expect(validation.message).toEqual( + 'Your license does not support machine learning. Please upgrade your license.' + ); + }); + + it('is valid for a non-ML rule when not an ML Admin', async () => { + (hasMlAdminPermissions as jest.Mock).mockReturnValue(false); + + const mlAuthz = buildMlAuthz({ + license: licenseMock, + ml: mlMock, + request, + }); + + const validation = await mlAuthz.validateRuleType('query'); + + expect(validation.valid).toEqual(true); + }); + + it('is invalid for an ML rule when not an ML Admin', async () => { + licenseMock.hasAtLeast.mockReturnValue(true); // prevents short-circuit on license check + (hasMlAdminPermissions as jest.Mock).mockReturnValue(false); + + const mlAuthz = buildMlAuthz({ + license: licenseMock, + ml: mlMock, + request, + }); + + const validation = await mlAuthz.validateRuleType('machine_learning'); + + expect(validation.valid).toEqual(false); + expect(validation.message).toEqual( + 'The current user is not a machine learning administrator.' + ); + }); + + it('is valid for an ML rule if ML available, license is sufficient, and an ML Admin', async () => { + licenseMock.hasAtLeast.mockReturnValue(true); + (hasMlAdminPermissions as jest.Mock).mockReturnValue(true); + + const mlAuthz = buildMlAuthz({ + license: licenseMock, + ml: mlMock, + request, + }); + + const validation = await mlAuthz.validateRuleType('machine_learning'); + + expect(validation.valid).toEqual(true); + expect(validation.message).toBeUndefined(); + }); + + it('only calls ml services once for multiple invocations', async () => { + const mockMlCapabilities = jest.fn(); + mlMock.mlSystemProvider.mockImplementation(() => ({ + mlInfo: jest.fn(), + mlSearch: jest.fn(), + mlCapabilities: mockMlCapabilities, + })); + + const mlAuthz = buildMlAuthz({ + license: licenseMock, + ml: mlMock, + request, + }); + + await mlAuthz.validateRuleType('machine_learning'); + await mlAuthz.validateRuleType('machine_learning'); + await mlAuthz.validateRuleType('machine_learning'); + + expect(mockMlCapabilities).toHaveBeenCalledTimes(1); + }); + + it('does not call ml services for non-ML rules', async () => { + const mockMlCapabilities = jest.fn(); + mlMock.mlSystemProvider.mockImplementation(() => ({ + mlInfo: jest.fn(), + mlSearch: jest.fn(), + mlCapabilities: mockMlCapabilities, + })); + + const mlAuthz = buildMlAuthz({ + license: licenseMock, + ml: mlMock, + request, + }); + + await mlAuthz.validateRuleType('query'); + await mlAuthz.validateRuleType('query'); + await mlAuthz.validateRuleType('query'); + + expect(mockMlCapabilities).not.toHaveBeenCalled(); + }); + + it('validates the same cache result per request if permissions change mid-stream', async () => { + licenseMock.hasAtLeast.mockReturnValueOnce(false); + licenseMock.hasAtLeast.mockReturnValueOnce(true); + + const mlAuthz = buildMlAuthz({ + license: licenseMock, + ml: mlMock, + request, + }); + + const validationFirst = await mlAuthz.validateRuleType('machine_learning'); + const validationSecond = await mlAuthz.validateRuleType('machine_learning'); + + expect(validationFirst.valid).toEqual(false); + expect(validationFirst.message).toEqual( + 'Your license does not support machine learning. Please upgrade your license.' + ); + expect(validationSecond.valid).toEqual(false); + expect(validationSecond.message).toEqual( + 'Your license does not support machine learning. Please upgrade your license.' + ); + }); + + it('will invalidate the cache result if the builder is called a second time after a license change', async () => { + licenseMock.hasAtLeast.mockReturnValueOnce(false); + licenseMock.hasAtLeast.mockReturnValueOnce(true); + (hasMlAdminPermissions as jest.Mock).mockReturnValueOnce(true); + + const mlAuthzFirst = buildMlAuthz({ + license: licenseMock, + ml: mlMock, + request, + }); + + const mlAuthzSecond = buildMlAuthz({ + license: licenseMock, + ml: mlMock, + request, + }); + + const validationFirst = await mlAuthzFirst.validateRuleType('machine_learning'); + const validationSecond = await mlAuthzSecond.validateRuleType('machine_learning'); + + expect(validationFirst.valid).toEqual(false); + expect(validationFirst.message).toEqual( + 'Your license does not support machine learning. Please upgrade your license.' + ); + expect(validationSecond.valid).toEqual(true); + expect(validationSecond.message).toBeUndefined(); + }); + }); +}); diff --git a/x-pack/plugins/siem/server/lib/machine_learning/authz.ts b/x-pack/plugins/siem/server/lib/machine_learning/authz.ts new file mode 100644 index 0000000000000..fb74f46244361 --- /dev/null +++ b/x-pack/plugins/siem/server/lib/machine_learning/authz.ts @@ -0,0 +1,120 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { i18n } from '@kbn/i18n'; + +import { KibanaRequest } from '../../../../../../src/core/server/'; +import { ILicense } from '../../../../licensing/server'; +import { MlPluginSetup } from '../../../../ml/server'; +import { SetupPlugins } from '../../plugin'; +import { MINIMUM_ML_LICENSE } from '../../../common/constants'; +import { hasMlAdminPermissions } from '../../../common/machine_learning/has_ml_admin_permissions'; +import { isMlRule } from '../../../common/machine_learning/helpers'; +import { RuleType } from '../../../common/detection_engine/types'; +import { Validation } from './validation'; +import { cache } from './cache'; + +export interface MlAuthz { + validateRuleType: (type: RuleType) => Promise; +} + +/** + * Builds ML authz services + * + * @param license A {@link ILicense} representing the user license + * @param ml {@link MlPluginSetup} ML services to fetch ML capabilities + * @param request A {@link KibanaRequest} representing the authenticated user + * + * @returns A {@link MLAuthz} service object + */ +export const buildMlAuthz = ({ + license, + ml, + request, +}: { + license: ILicense; + ml: SetupPlugins['ml']; + request: KibanaRequest; +}): MlAuthz => { + const cachedValidate = cache(() => validateMlAuthz({ license, ml, request })); + const validateRuleType = async (type: RuleType): Promise => { + if (!isMlRule(type)) { + return { valid: true, message: undefined }; + } else { + return cachedValidate(); + } + }; + + return { validateRuleType }; +}; + +/** + * Validates ML authorization for the current request + * + * @param license A {@link ILicense} representing the user license + * @param ml {@link MlPluginSetup} ML services to fetch ML capabilities + * @param request A {@link KibanaRequest} representing the authenticated user + * + * @returns A {@link Validation} validation + */ +export const validateMlAuthz = async ({ + license, + ml, + request, +}: { + license: ILicense; + ml: SetupPlugins['ml']; + request: KibanaRequest; +}): Promise => { + let message: string | undefined; + + if (ml == null) { + message = i18n.translate('xpack.siem.authz.mlUnavailable', { + defaultMessage: 'The machine learning plugin is not available. Try enabling the plugin.', + }); + } else if (!hasMlLicense(license)) { + message = i18n.translate('xpack.siem.licensing.unsupportedMachineLearningMessage', { + defaultMessage: + 'Your license does not support machine learning. Please upgrade your license.', + }); + } else if (!(await isMlAdmin({ ml, request }))) { + message = i18n.translate('xpack.siem.authz.userIsNotMlAdminMessage', { + defaultMessage: 'The current user is not a machine learning administrator.', + }); + } + + return { + valid: message === undefined, + message, + }; +}; + +/** + * Whether the license allows ML usage + * + * @param license A {@link ILicense} representing the user license + * + */ +export const hasMlLicense = (license: ILicense): boolean => license.hasAtLeast(MINIMUM_ML_LICENSE); + +/** + * Whether the requesting user is an ML Admin + * + * @param request A {@link KibanaRequest} representing the authenticated user + * @param ml {@link MlPluginSetup} ML services to fetch ML capabilities + * + */ +export const isMlAdmin = async ({ + request, + ml, +}: { + request: KibanaRequest; + ml: MlPluginSetup; +}): Promise => { + const scopedMlClient = ml.mlClient.asScoped(request).callAsCurrentUser; + const mlCapabilities = await ml.mlSystemProvider(scopedMlClient, request).mlCapabilities(); + return hasMlAdminPermissions(mlCapabilities); +}; diff --git a/x-pack/plugins/siem/server/lib/machine_learning/cache.test.ts b/x-pack/plugins/siem/server/lib/machine_learning/cache.test.ts new file mode 100644 index 0000000000000..14e4cfe8ebdda --- /dev/null +++ b/x-pack/plugins/siem/server/lib/machine_learning/cache.test.ts @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { cache } from './cache'; + +describe('cache', () => { + it('does not call the function if not invoked', () => { + const fn = jest.fn(); + cache(fn); + + expect(fn).not.toHaveBeenCalled(); + }); + + it('returns the function result', () => { + const fn = jest.fn().mockReturnValue('result'); + const cachedFn = cache(fn); + + expect(cachedFn()).toEqual('result'); + }); + + it('only calls the function once for multiple invocations', () => { + const fn = jest.fn(); + const cachedFn = cache(fn); + + cachedFn(); + cachedFn(); + cachedFn(); + + expect(fn).toHaveBeenCalledTimes(1); + }); + + it('returns the function result on subsequent invocations', () => { + const fn = jest.fn().mockReturnValue('result'); + const cachedFn = cache(fn); + + expect([cachedFn(), cachedFn(), cachedFn()]).toEqual(['result', 'result', 'result']); + }); +}); diff --git a/x-pack/plugins/siem/server/lib/machine_learning/cache.ts b/x-pack/plugins/siem/server/lib/machine_learning/cache.ts new file mode 100644 index 0000000000000..1a7b95f2c5af2 --- /dev/null +++ b/x-pack/plugins/siem/server/lib/machine_learning/cache.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; + * you may not use this file except in compliance with the Elastic License. + */ + +/** + * Caches the result of a function call + * + * @param fn the function to be invoked + * + * @returns A function that will invoke the given function on its first invocation, + * and then simply return the result on subsequent calls + */ +export const cache = (fn: () => T): (() => T) => { + let result: T | null = null; + + return () => { + if (result === null) { + result = fn(); + } + return result; + }; +}; diff --git a/x-pack/plugins/siem/server/lib/machine_learning/mocks.ts b/x-pack/plugins/siem/server/lib/machine_learning/mocks.ts new file mode 100644 index 0000000000000..f044022d6db69 --- /dev/null +++ b/x-pack/plugins/siem/server/lib/machine_learning/mocks.ts @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { MlPluginSetup } from '../../../../ml/server'; +import { elasticsearchServiceMock } from '../../../../../../src/core/server/mocks'; + +const createMockClient = () => elasticsearchServiceMock.createClusterClient(); +const createMockMlSystemProvider = () => + jest.fn(() => ({ + mlCapabilities: jest.fn(), + })); + +export const mlServicesMock = { + create: () => + (({ + mlSystemProvider: createMockMlSystemProvider(), + mlClient: createMockClient(), + } as unknown) as jest.Mocked), +}; + +const mockValidateRuleType = jest.fn().mockResolvedValue({ valid: true, message: undefined }); +const createBuildMlAuthzMock = () => + jest.fn().mockReturnValue({ validateRuleType: mockValidateRuleType }); + +export const mlAuthzMock = { + create: () => ({ + buildMlAuthz: createBuildMlAuthzMock(), + }), +}; diff --git a/x-pack/plugins/siem/server/lib/machine_learning/validation.test.ts b/x-pack/plugins/siem/server/lib/machine_learning/validation.test.ts new file mode 100644 index 0000000000000..effe59c073c59 --- /dev/null +++ b/x-pack/plugins/siem/server/lib/machine_learning/validation.test.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { toHttpError, throwHttpError } from './validation'; + +describe('toHttpError', () => { + it('returns nothing if validation is valid', () => { + expect(toHttpError({ valid: true, message: undefined })).toBeUndefined(); + }); + + it('returns an HTTP error if validation is invalid', () => { + const error = toHttpError({ valid: false, message: 'validation message' }); + expect(error?.statusCode).toEqual(403); + expect(error?.message).toEqual('validation message'); + }); +}); + +describe('throwHttpError', () => { + it('does nothing if validation is valid', () => { + expect(() => throwHttpError({ valid: true, message: undefined })).not.toThrowError(); + }); + + it('throws an error if validation is invalid', () => { + let error; + try { + throwHttpError({ valid: false, message: 'validation failed' }); + } catch (e) { + error = e; + } + expect(error?.statusCode).toEqual(403); + expect(error?.message).toEqual('validation failed'); + }); +}); diff --git a/x-pack/plugins/siem/server/lib/machine_learning/validation.ts b/x-pack/plugins/siem/server/lib/machine_learning/validation.ts new file mode 100644 index 0000000000000..eab85bbb510be --- /dev/null +++ b/x-pack/plugins/siem/server/lib/machine_learning/validation.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; + * you may not use this file except in compliance with the Elastic License. + */ + +export interface Validation { + valid: boolean; + message: string | undefined; +} + +export class HttpAuthzError extends Error { + public readonly statusCode: number; + + constructor(message: string | undefined) { + super(message); + this.name = 'HttpAuthzError'; + this.statusCode = 403; + } +} + +export const toHttpError = (validation: Validation): HttpAuthzError | undefined => { + if (!validation.valid) { + return new HttpAuthzError(validation.message); + } +}; + +export const throwHttpError = (validation: Validation): void => { + const error = toHttpError(validation); + if (error) { + throw error; + } +}; diff --git a/x-pack/plugins/siem/server/plugin.ts b/x-pack/plugins/siem/server/plugin.ts index 3ef4b39bd0979..d296ee94e8958 100644 --- a/x-pack/plugins/siem/server/plugin.ts +++ b/x-pack/plugins/siem/server/plugin.ts @@ -98,7 +98,8 @@ export class Plugin implements IPlugin { // Detection Engine Rule routes that have the REST endpoints of /api/detection_engine/rules // All REST rule creation, deletion, updating, etc...... - createRulesRoute(router); + createRulesRoute(router, ml); readRulesRoute(router); - updateRulesRoute(router); - patchRulesRoute(router); + updateRulesRoute(router, ml); + patchRulesRoute(router, ml); deleteRulesRoute(router); findRulesRoute(router); addPrepackedRulesRoute(router); getPrepackagedRulesStatusRoute(router); - createRulesBulkRoute(router); - updateRulesBulkRoute(router); - patchRulesBulkRoute(router); + createRulesBulkRoute(router, ml); + updateRulesBulkRoute(router, ml); + patchRulesBulkRoute(router, ml); deleteRulesBulkRoute(router); createTimelinesRoute(router, config, security); updateTimelinesRoute(router, config, security); - importRulesRoute(router, config); + importRulesRoute(router, config, ml); exportRulesRoute(router, config); importTimelinesRoute(router, config, security); From 7b5c9c04edc6094b4662b375a6917d270b428191 Mon Sep 17 00:00:00 2001 From: spalger Date: Mon, 11 May 2020 12:58:24 -0700 Subject: [PATCH 084/102] skip flaky suite (#65741) --- .../__jest__/client_integration/mapped_fields.test.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/mapped_fields.test.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/mapped_fields.test.tsx index 8989e85d9f188..57040eaeefbdf 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/mapped_fields.test.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/mapped_fields.test.tsx @@ -10,7 +10,8 @@ import { componentHelpers, MappingsEditorTestBed, DomFields, nextTick } from './ const { setup } = componentHelpers.mappingsEditor; const onChangeHandler = jest.fn(); -describe('Mappings editor: mapped fields', () => { +// FLAKY: https://github.com/elastic/kibana/issues/65741 +describe.skip('Mappings editor: mapped fields', () => { afterEach(() => { onChangeHandler.mockReset(); }); From 56c46ae1de66530ccc8eeaba61ac67e63e023af6 Mon Sep 17 00:00:00 2001 From: orfeas0 Date: Mon, 11 May 2020 23:20:03 +0300 Subject: [PATCH 085/102] Add example of of local plugin installation (#65986) --- docs/user/plugins.asciidoc | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/docs/user/plugins.asciidoc b/docs/user/plugins.asciidoc index 83c1ab1a842bb..a96fe811dc84f 100644 --- a/docs/user/plugins.asciidoc +++ b/docs/user/plugins.asciidoc @@ -33,12 +33,17 @@ $ bin/kibana-plugin install x-pack === Install plugins from an arbitrary URL You can download official Elastic plugins simply by specifying their name. You -can alternatively specify a URL to a specific plugin, as in the following -example: +can alternatively specify a URL or file path to a specific plugin, as in the following +examples: ["source","shell",subs="attributes"] $ bin/kibana-plugin install https://artifacts.elastic.co/downloads/packs/x-pack/x-pack-{version}.zip +or + +["source","shell",subs="attributes"] +$ bin/kibana-plugin install file:///local/path/to/custom_plugin.zip + You can specify URLs that use the HTTP, HTTPS, or `file` protocols. [float] From 20826486784fc2cd154218a773aeef7fafe80fb8 Mon Sep 17 00:00:00 2001 From: Steph Milovic Date: Mon, 11 May 2020 14:27:02 -0600 Subject: [PATCH 086/102] [SIEM] [Cases] Case API tests (#65777) --- .../tests/cases/comments/delete_comment.ts | 76 +++++ .../tests/cases/comments/find_comments.ts | 93 ++++++ .../basic/tests/cases/comments/get_comment.ts | 53 +++ .../tests/cases/comments/patch_comment.ts | 123 +++++++ .../tests/cases/comments/post_comment.ts | 57 ++++ .../basic/tests/cases/delete_cases.ts | 76 +++++ .../basic/tests/cases/find_cases.ts | 158 +++++++++ .../basic/tests/cases/get_case.ts | 52 +++ .../basic/tests/cases/patch_cases.ts | 139 ++++++++ .../basic/tests/cases/post_case.ts | 46 +++ .../basic/tests/cases/push_case.ts | 161 +++++++++ .../tests/cases/reporters/get_reporters.ts | 40 +++ .../basic/tests/cases/status/get_status.ts | 59 ++++ .../basic/tests/cases/tags/get_tags.ts | 43 +++ .../user_actions/get_all_user_actions.ts | 307 ++++++++++++++++++ .../case_api_integration/basic/tests/index.ts | 19 +- .../case_api_integration/common/lib/mock.ts | 50 +++ .../case_api_integration/common/lib/utils.ts | 61 ++-- 18 files changed, 1580 insertions(+), 33 deletions(-) create mode 100644 x-pack/test/case_api_integration/basic/tests/cases/comments/delete_comment.ts create mode 100644 x-pack/test/case_api_integration/basic/tests/cases/comments/find_comments.ts create mode 100644 x-pack/test/case_api_integration/basic/tests/cases/comments/get_comment.ts create mode 100644 x-pack/test/case_api_integration/basic/tests/cases/comments/patch_comment.ts create mode 100644 x-pack/test/case_api_integration/basic/tests/cases/comments/post_comment.ts create mode 100644 x-pack/test/case_api_integration/basic/tests/cases/delete_cases.ts create mode 100644 x-pack/test/case_api_integration/basic/tests/cases/find_cases.ts create mode 100644 x-pack/test/case_api_integration/basic/tests/cases/get_case.ts create mode 100644 x-pack/test/case_api_integration/basic/tests/cases/patch_cases.ts create mode 100644 x-pack/test/case_api_integration/basic/tests/cases/post_case.ts create mode 100644 x-pack/test/case_api_integration/basic/tests/cases/push_case.ts create mode 100644 x-pack/test/case_api_integration/basic/tests/cases/reporters/get_reporters.ts create mode 100644 x-pack/test/case_api_integration/basic/tests/cases/status/get_status.ts create mode 100644 x-pack/test/case_api_integration/basic/tests/cases/tags/get_tags.ts create mode 100644 x-pack/test/case_api_integration/basic/tests/cases/user_actions/get_all_user_actions.ts create mode 100644 x-pack/test/case_api_integration/common/lib/mock.ts diff --git a/x-pack/test/case_api_integration/basic/tests/cases/comments/delete_comment.ts b/x-pack/test/case_api_integration/basic/tests/cases/comments/delete_comment.ts new file mode 100644 index 0000000000000..afae04ae9cf5b --- /dev/null +++ b/x-pack/test/case_api_integration/basic/tests/cases/comments/delete_comment.ts @@ -0,0 +1,76 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../../common/ftr_provider_context'; + +import { CASES_URL } from '../../../../../../plugins/case/common/constants'; +import { postCaseReq, postCommentReq } from '../../../../common/lib/mock'; +import { deleteCases, deleteCasesUserActions, deleteComments } 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'); + + describe('delete_comment', () => { + afterEach(async () => { + await deleteCases(es); + await deleteComments(es); + await deleteCasesUserActions(es); + }); + + it('should delete a comment', async () => { + const { body: postedCase } = await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq) + .expect(200); + + const { body: patchedCase } = await supertest + .post(`${CASES_URL}/${postedCase.id}/comments`) + .set('kbn-xsrf', 'true') + .send(postCommentReq); + + const { body: comment } = await supertest + .delete(`${CASES_URL}/${postedCase.id}/comments/${patchedCase.comments[0].id}`) + .set('kbn-xsrf', 'true') + .send(); + + expect(comment).to.eql({}); + }); + + it('unhappy path - 404s when comment belongs to different case', async () => { + const { body: postedCase } = await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq) + .expect(200); + + const { body: patchedCase } = await supertest + .post(`${CASES_URL}/${postedCase.id}/comments`) + .set('kbn-xsrf', 'true') + .send(postCommentReq); + + const { body } = await supertest + .delete(`${CASES_URL}/fake-id/comments/${patchedCase.comments[0].id}`) + .set('kbn-xsrf', 'true') + .send() + .expect(404); + expect(body.message).to.eql( + `This comment ${patchedCase.comments[0].id} does not exist in fake-id).` + ); + }); + + it('unhappy path - 404s when comment is not there', async () => { + await supertest + .delete(`${CASES_URL}/fake-id/comments/fake-id`) + .set('kbn-xsrf', 'true') + .send() + .expect(404); + }); + }); +}; diff --git a/x-pack/test/case_api_integration/basic/tests/cases/comments/find_comments.ts b/x-pack/test/case_api_integration/basic/tests/cases/comments/find_comments.ts new file mode 100644 index 0000000000000..e5c44de90b5a1 --- /dev/null +++ b/x-pack/test/case_api_integration/basic/tests/cases/comments/find_comments.ts @@ -0,0 +1,93 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../../common/ftr_provider_context'; + +import { CASES_URL } from '../../../../../../plugins/case/common/constants'; +import { postCaseReq, postCommentReq } from '../../../../common/lib/mock'; +import { deleteCases, deleteCasesUserActions, deleteComments } 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'); + + describe('find_comments', () => { + afterEach(async () => { + await deleteCases(es); + await deleteComments(es); + await deleteCasesUserActions(es); + }); + + it('should find all case comment', async () => { + const { body: postedCase } = await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq) + .expect(200); + // post 2 comments + await supertest + .post(`${CASES_URL}/${postedCase.id}/comments`) + .set('kbn-xsrf', 'true') + .send(postCommentReq); + + const { body: patchedCase } = await supertest + .post(`${CASES_URL}/${postedCase.id}/comments`) + .set('kbn-xsrf', 'true') + .send(postCommentReq); + + const { body: caseComments } = await supertest + .get(`${CASES_URL}/${postedCase.id}/comments/_find`) + .set('kbn-xsrf', 'true') + .send(); + + expect(caseComments.comments).to.eql(patchedCase.comments); + }); + + it('should filter case comments', async () => { + const { body: postedCase } = await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq) + .expect(200); + // post 2 comments + await supertest + .post(`${CASES_URL}/${postedCase.id}/comments`) + .set('kbn-xsrf', 'true') + .send(postCommentReq); + + const { body: patchedCase } = await supertest + .post(`${CASES_URL}/${postedCase.id}/comments`) + .set('kbn-xsrf', 'true') + .send({ comment: 'unique' }); + + const { body: caseComments } = await supertest + .get(`${CASES_URL}/${postedCase.id}/comments/_find?search=unique`) + .set('kbn-xsrf', 'true') + .send(); + + expect(caseComments.comments).to.eql([patchedCase.comments[1]]); + }); + + it('unhappy path - 400s when query is bad', async () => { + const { body: postedCase } = await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq) + .expect(200); + await supertest + .post(`${CASES_URL}/${postedCase.id}/comments`) + .set('kbn-xsrf', 'true') + .send(postCommentReq); + await supertest + .get(`${CASES_URL}/${postedCase.id}/comments/_find?perPage=true`) + .set('kbn-xsrf', 'true') + .send() + .expect(400); + }); + }); +}; diff --git a/x-pack/test/case_api_integration/basic/tests/cases/comments/get_comment.ts b/x-pack/test/case_api_integration/basic/tests/cases/comments/get_comment.ts new file mode 100644 index 0000000000000..53da0ef1d2b16 --- /dev/null +++ b/x-pack/test/case_api_integration/basic/tests/cases/comments/get_comment.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../../common/ftr_provider_context'; + +import { CASES_URL } from '../../../../../../plugins/case/common/constants'; +import { postCaseReq, postCommentReq } from '../../../../common/lib/mock'; +import { deleteCases, deleteCasesUserActions, deleteComments } 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'); + + describe('get_comment', () => { + afterEach(async () => { + await deleteCases(es); + await deleteComments(es); + await deleteCasesUserActions(es); + }); + + it('should get a comment', async () => { + const { body: postedCase } = await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq); + + const { body: patchedCase } = await supertest + .post(`${CASES_URL}/${postedCase.id}/comments`) + .set('kbn-xsrf', 'true') + .send(postCommentReq); + + const { body: comment } = await supertest + .get(`${CASES_URL}/${postedCase.id}/comments/${patchedCase.comments[0].id}`) + .set('kbn-xsrf', 'true') + .send() + .expect(200); + + expect(comment).to.eql(patchedCase.comments[0]); + }); + it('unhappy path - 404s when comment is not there', async () => { + await supertest + .get(`${CASES_URL}/fake-id/comments/fake-comment`) + .set('kbn-xsrf', 'true') + .send() + .expect(404); + }); + }); +}; diff --git a/x-pack/test/case_api_integration/basic/tests/cases/comments/patch_comment.ts b/x-pack/test/case_api_integration/basic/tests/cases/comments/patch_comment.ts new file mode 100644 index 0000000000000..73aeeb0fb989a --- /dev/null +++ b/x-pack/test/case_api_integration/basic/tests/cases/comments/patch_comment.ts @@ -0,0 +1,123 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../../common/ftr_provider_context'; + +import { CASES_URL } from '../../../../../../plugins/case/common/constants'; +import { defaultUser, postCaseReq, postCommentReq } from '../../../../common/lib/mock'; +import { deleteCases, deleteCasesUserActions, deleteComments } 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'); + + describe('patch_comment', () => { + afterEach(async () => { + await deleteCases(es); + await deleteComments(es); + await deleteCasesUserActions(es); + }); + + it('should patch a comment', async () => { + const { body: postedCase } = await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq) + .expect(200); + + const { body: patchedCase } = await supertest + .post(`${CASES_URL}/${postedCase.id}/comments`) + .set('kbn-xsrf', 'true') + .send(postCommentReq); + const newComment = 'Well I decided to update my comment. So what? Deal with it.'; + const { body } = await supertest + .patch(`${CASES_URL}/${postedCase.id}/comments`) + .set('kbn-xsrf', 'true') + .send({ + id: patchedCase.comments[0].id, + version: patchedCase.comments[0].version, + comment: newComment, + }); + expect(body.comments[0].comment).to.eql(newComment); + expect(body.updated_by).to.eql(defaultUser); + }); + + it('unhappy path - 404s when comment is not there', async () => { + const { body: postedCase } = await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq); + await supertest + .patch(`${CASES_URL}/${postedCase.id}/comments`) + .set('kbn-xsrf', 'true') + .send({ + id: 'id', + version: 'version', + comment: 'comment', + }) + .expect(404); + }); + + it('unhappy path - 404s when case is not there', async () => { + await supertest + .patch(`${CASES_URL}/fake-id/comments`) + .set('kbn-xsrf', 'true') + .send({ + id: 'id', + version: 'version', + comment: 'comment', + }) + .expect(404); + }); + + it('unhappy path - 400s when patch body is bad', async () => { + const { body: postedCase } = await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq) + .expect(200); + + const { body: patchedCase } = await supertest + .post(`${CASES_URL}/${postedCase.id}/comments`) + .set('kbn-xsrf', 'true') + .send(postCommentReq); + await supertest + .patch(`${CASES_URL}/${postedCase.id}/comments`) + .set('kbn-xsrf', 'true') + .send({ + id: patchedCase.comments[0].id, + version: patchedCase.comments[0].version, + comment: true, + }) + .expect(400); + }); + + it('unhappy path - 409s when conflict', async () => { + const { body: postedCase } = await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq) + .expect(200); + + const { body: patchedCase } = await supertest + .post(`${CASES_URL}/${postedCase.id}/comments`) + .set('kbn-xsrf', 'true') + .send(postCommentReq); + const newComment = 'Well I decided to update my comment. So what? Deal with it.'; + await supertest + .patch(`${CASES_URL}/${postedCase.id}/comments`) + .set('kbn-xsrf', 'true') + .send({ + id: patchedCase.comments[0].id, + version: 'version-mismatch', + comment: newComment, + }) + .expect(409); + }); + }); +}; diff --git a/x-pack/test/case_api_integration/basic/tests/cases/comments/post_comment.ts b/x-pack/test/case_api_integration/basic/tests/cases/comments/post_comment.ts new file mode 100644 index 0000000000000..6e8353f8ea86a --- /dev/null +++ b/x-pack/test/case_api_integration/basic/tests/cases/comments/post_comment.ts @@ -0,0 +1,57 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../../common/ftr_provider_context'; + +import { CASES_URL } from '../../../../../../plugins/case/common/constants'; +import { defaultUser, postCaseReq, postCommentReq } from '../../../../common/lib/mock'; +import { deleteCases, deleteCasesUserActions, deleteComments } 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'); + + describe('post_comment', () => { + afterEach(async () => { + await deleteCases(es); + await deleteComments(es); + await deleteCasesUserActions(es); + }); + + it('should post a comment', async () => { + const { body: postedCase } = await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq) + .expect(200); + + const { body: patchedCase } = await supertest + .post(`${CASES_URL}/${postedCase.id}/comments`) + .set('kbn-xsrf', 'true') + .send(postCommentReq); + expect(patchedCase.comments[0].comment).to.eql(postCommentReq.comment); + expect(patchedCase.updated_by).to.eql(defaultUser); + }); + + it('unhappy path - 400s when post body is bad', async () => { + const { body: postedCase } = await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq) + .expect(200); + + await supertest + .post(`${CASES_URL}/${postedCase.id}/comments`) + .set('kbn-xsrf', 'true') + .send({ + bad: 'comment', + }) + .expect(400); + }); + }); +}; diff --git a/x-pack/test/case_api_integration/basic/tests/cases/delete_cases.ts b/x-pack/test/case_api_integration/basic/tests/cases/delete_cases.ts new file mode 100644 index 0000000000000..aa2465e44c5c1 --- /dev/null +++ b/x-pack/test/case_api_integration/basic/tests/cases/delete_cases.ts @@ -0,0 +1,76 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../common/ftr_provider_context'; + +import { CASES_URL } from '../../../../../plugins/case/common/constants'; +import { postCaseReq, postCommentReq } from '../../../common/lib/mock'; +import { deleteCases, deleteCasesUserActions, deleteComments } 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'); + + describe('delete_cases', () => { + afterEach(async () => { + await deleteCases(es); + await deleteComments(es); + await deleteCasesUserActions(es); + }); + + it('should delete a case', async () => { + const { body: postedCase } = await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq); + + const { body } = await supertest + .delete(`${CASES_URL}?ids=["${postedCase.id}"]`) + .set('kbn-xsrf', 'true') + .send() + .expect(204); + + expect(body).to.eql({}); + }); + + it(`should delete a case's comments when that case gets deleted`, async () => { + const { body: postedCase } = await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq); + + const { body: patchedCase } = await supertest + .post(`${CASES_URL}/${postedCase.id}/comments`) + .set('kbn-xsrf', 'true') + .send(postCommentReq); + + await supertest + .get(`${CASES_URL}/${postedCase.id}/comments/${patchedCase.comments[0].id}`) + .set('kbn-xsrf', 'true') + .send() + .expect(200); + await supertest + .delete(`${CASES_URL}?ids=["${postedCase.id}"]`) + .set('kbn-xsrf', 'true') + .send() + .expect(204); + await supertest + .get(`${CASES_URL}/${postedCase.id}/comments/${patchedCase.comments[0].id}`) + .set('kbn-xsrf', 'true') + .send() + .expect(404); + }); + it('unhappy path - 404s when case is not there', async () => { + await supertest + .delete(`${CASES_URL}?ids=["fake-id"]`) + .set('kbn-xsrf', 'true') + .send() + .expect(404); + }); + }); +}; diff --git a/x-pack/test/case_api_integration/basic/tests/cases/find_cases.ts b/x-pack/test/case_api_integration/basic/tests/cases/find_cases.ts new file mode 100644 index 0000000000000..04d195ea73509 --- /dev/null +++ b/x-pack/test/case_api_integration/basic/tests/cases/find_cases.ts @@ -0,0 +1,158 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../common/ftr_provider_context'; + +import { CASES_URL } from '../../../../../plugins/case/common/constants'; +import { postCaseReq, postCommentReq, findCasesResp } from '../../../common/lib/mock'; +import { deleteCases, deleteComments, deleteCasesUserActions } 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'); + describe('find_cases', () => { + afterEach(async () => { + await deleteCases(es); + await deleteComments(es); + await deleteCasesUserActions(es); + }); + it('should return empty response', async () => { + const { body } = await supertest + .get(`${CASES_URL}/_find`) + .set('kbn-xsrf', 'true') + .send() + .expect(200); + + expect(body).to.eql(findCasesResp); + }); + + it('should return cases', async () => { + const { body: a } = await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq); + const { body: b } = await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq); + const { body: c } = await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq); + const { body } = await supertest + .get(`${CASES_URL}/_find?sortOrder=asc`) + .set('kbn-xsrf', 'true') + .send() + .expect(200); + + expect(body).to.eql({ + ...findCasesResp, + total: 3, + cases: [a, b, c], + count_open_cases: 3, + }); + }); + + it('filters by tags', async () => { + await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq); + const { body: postedCase } = await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send({ ...postCaseReq, tags: ['unique'] }); + const { body } = await supertest + .get(`${CASES_URL}/_find?sortOrder=asc&tags=unique`) + .set('kbn-xsrf', 'true') + .send() + .expect(200); + + expect(body).to.eql({ + ...findCasesResp, + total: 1, + cases: [postedCase], + count_open_cases: 1, + }); + }); + + it('correctly counts comments', async () => { + const { body: postedCase } = await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq); + + // post 2 comments + await supertest + .post(`${CASES_URL}/${postedCase.id}/comments`) + .set('kbn-xsrf', 'true') + .send(postCommentReq); + const { body: patchedCase } = await supertest + .post(`${CASES_URL}/${postedCase.id}/comments`) + .set('kbn-xsrf', 'true') + .send(postCommentReq); + const { body } = await supertest + .get(`${CASES_URL}/_find?sortOrder=asc`) + .set('kbn-xsrf', 'true') + .send() + .expect(200); + + expect(body).to.eql({ + ...findCasesResp, + total: 1, + cases: [ + { + ...patchedCase, + comments: [], + totalComment: 2, + }, + ], + count_open_cases: 1, + }); + }); + + it('correctly counts open/closed', async () => { + await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq); + const { body: postedCase } = await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq); + await supertest + .patch(CASES_URL) + .set('kbn-xsrf', 'true') + .send({ + cases: [ + { + id: postedCase.id, + version: postedCase.version, + status: 'closed', + }, + ], + }) + .expect(200); + const { body } = await supertest + .get(`${CASES_URL}/_find?sortOrder=asc`) + .set('kbn-xsrf', 'true') + .send() + .expect(200); + + expect(body.count_open_cases).to.eql(1); + expect(body.count_closed_cases).to.eql(1); + }); + it('unhappy path - 400s when bad query supplied', async () => { + await supertest + .get(`${CASES_URL}/_find?perPage=true`) + .set('kbn-xsrf', 'true') + .send() + .expect(400); + }); + }); +}; diff --git a/x-pack/test/case_api_integration/basic/tests/cases/get_case.ts b/x-pack/test/case_api_integration/basic/tests/cases/get_case.ts new file mode 100644 index 0000000000000..9aad86126ceaf --- /dev/null +++ b/x-pack/test/case_api_integration/basic/tests/cases/get_case.ts @@ -0,0 +1,52 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../common/ftr_provider_context'; + +import { CASES_URL } from '../../../../../plugins/case/common/constants'; +import { + postCaseReq, + postCaseResp, + removeServerGeneratedPropertiesFromCase, +} from '../../../common/lib/mock'; +import { deleteCases } 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'); + + describe('get_case', () => { + afterEach(async () => { + await deleteCases(es); + }); + + it('should return a case', async () => { + const { body: postedCase } = await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq) + .expect(200); + + const { body } = await supertest + .get(`${CASES_URL}/${postedCase.id}`) + .set('kbn-xsrf', 'true') + .send() + .expect(200); + + const data = removeServerGeneratedPropertiesFromCase(body); + expect(data).to.eql(postCaseResp(postedCase.id)); + }); + it('unhappy path - 404s when case is not there', async () => { + await supertest + .get(`${CASES_URL}/fake-id`) + .set('kbn-xsrf', 'true') + .send() + .expect(404); + }); + }); +}; diff --git a/x-pack/test/case_api_integration/basic/tests/cases/patch_cases.ts b/x-pack/test/case_api_integration/basic/tests/cases/patch_cases.ts new file mode 100644 index 0000000000000..caeaf46cbc953 --- /dev/null +++ b/x-pack/test/case_api_integration/basic/tests/cases/patch_cases.ts @@ -0,0 +1,139 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../common/ftr_provider_context'; + +import { CASES_URL } from '../../../../../plugins/case/common/constants'; +import { + defaultUser, + postCaseReq, + postCaseResp, + removeServerGeneratedPropertiesFromCase, +} from '../../../common/lib/mock'; +import { deleteCases, deleteCasesUserActions } 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'); + + describe('patch_cases', () => { + afterEach(async () => { + await deleteCases(es); + await deleteCasesUserActions(es); + }); + + it('should patch a case', async () => { + const { body: postedCase } = await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq) + .expect(200); + const { body: patchedCases } = await supertest + .patch(CASES_URL) + .set('kbn-xsrf', 'true') + .send({ + cases: [ + { + id: postedCase.id, + version: postedCase.version, + status: 'closed', + }, + ], + }) + .expect(200); + + const data = removeServerGeneratedPropertiesFromCase(patchedCases[0]); + expect(data).to.eql({ + ...postCaseResp(postedCase.id), + closed_by: defaultUser, + status: 'closed', + updated_by: defaultUser, + }); + }); + + it('unhappy path - 404s when case is not there', async () => { + await supertest + .patch(CASES_URL) + .set('kbn-xsrf', 'true') + .send({ + cases: [ + { + id: 'not-real', + version: 'version', + status: 'closed', + }, + ], + }) + .expect(404); + }); + + it('unhappy path - 406s when excess data sent', async () => { + const { body: postedCase } = await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq) + .expect(200); + await supertest + .patch(CASES_URL) + .set('kbn-xsrf', 'true') + .send({ + cases: [ + { + id: postedCase.id, + version: postedCase.version, + badKey: 'closed', + }, + ], + }) + .expect(406); + }); + + it('unhappy path - 400s when bad data sent', async () => { + const { body: postedCase } = await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq) + .expect(200); + await supertest + .patch(CASES_URL) + .set('kbn-xsrf', 'true') + .send({ + cases: [ + { + id: postedCase.id, + version: postedCase.version, + status: true, + }, + ], + }) + .expect(400); + }); + + it('unhappy path - 409s when conflict', async () => { + const { body: postedCase } = await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq) + .expect(200); + + await supertest + .patch(`${CASES_URL}`) + .set('kbn-xsrf', 'true') + .send({ + cases: [ + { + id: postedCase.id, + version: 'version', + status: 'closed', + }, + ], + }) + .expect(409); + }); + }); +}; diff --git a/x-pack/test/case_api_integration/basic/tests/cases/post_case.ts b/x-pack/test/case_api_integration/basic/tests/cases/post_case.ts new file mode 100644 index 0000000000000..ab668c2c32725 --- /dev/null +++ b/x-pack/test/case_api_integration/basic/tests/cases/post_case.ts @@ -0,0 +1,46 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../common/ftr_provider_context'; + +import { CASES_URL } from '../../../../../plugins/case/common/constants'; +import { + postCaseReq, + postCaseResp, + removeServerGeneratedPropertiesFromCase, +} from '../../../common/lib/mock'; +import { deleteCases } 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'); + + describe('post_case', () => { + afterEach(async () => { + await deleteCases(es); + }); + + it('should post a case', async () => { + const { body: postedCase } = await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq) + .expect(200); + + const data = removeServerGeneratedPropertiesFromCase(postedCase); + expect(data).to.eql(postCaseResp(postedCase.id)); + }); + it('unhappy path - 400s when bad query supplied', async () => { + await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send({ ...postCaseReq, badKey: true }) + .expect(400); + }); + }); +}; diff --git a/x-pack/test/case_api_integration/basic/tests/cases/push_case.ts b/x-pack/test/case_api_integration/basic/tests/cases/push_case.ts new file mode 100644 index 0000000000000..848b980dee769 --- /dev/null +++ b/x-pack/test/case_api_integration/basic/tests/cases/push_case.ts @@ -0,0 +1,161 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../common/ftr_provider_context'; + +import { CASE_CONFIGURE_URL, CASES_URL } from '../../../../../plugins/case/common/constants'; +import { postCaseReq, defaultUser, postCommentReq } from '../../../common/lib/mock'; +import { + deleteCases, + deleteCasesUserActions, + deleteComments, + deleteConfiguration, + getConfiguration, +} 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'); + + describe('push_case', () => { + afterEach(async () => { + await deleteCases(es); + await deleteComments(es); + await deleteConfiguration(es); + await deleteCasesUserActions(es); + }); + + it('should push a case', async () => { + const { body: configure } = await supertest + .post(CASE_CONFIGURE_URL) + .set('kbn-xsrf', 'true') + .send(getConfiguration()) + .expect(200); + const { body: postedCase } = await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq) + .expect(200); + + const { body } = await supertest + .post(`${CASES_URL}/${postedCase.id}/_push`) + .set('kbn-xsrf', 'true') + .send({ + connector_id: configure.connector_id, + connector_name: configure.connector_name, + external_id: 'external_id', + external_title: 'external_title', + external_url: 'external_url', + }) + .expect(200); + expect(body.connector_id).to.eql(configure.connector_id); + expect(body.external_service.pushed_by).to.eql(defaultUser); + }); + + it('pushes a comment appropriately', async () => { + const { body: configure } = await supertest + .post(CASE_CONFIGURE_URL) + .set('kbn-xsrf', 'true') + .send(getConfiguration()) + .expect(200); + const { body: postedCase } = await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq) + .expect(200); + + await supertest + .post(`${CASES_URL}/${postedCase.id}/_push`) + .set('kbn-xsrf', 'true') + .send({ + connector_id: configure.connector_id, + connector_name: configure.connector_name, + external_id: 'external_id', + external_title: 'external_title', + external_url: 'external_url', + }) + .expect(200); + + await supertest + .post(`${CASES_URL}/${postedCase.id}/comments`) + .set('kbn-xsrf', 'true') + .send(postCommentReq); + + const { body } = await supertest + .post(`${CASES_URL}/${postedCase.id}/_push`) + .set('kbn-xsrf', 'true') + .send({ + connector_id: configure.connector_id, + connector_name: configure.connector_name, + external_id: 'external_id', + external_title: 'external_title', + external_url: 'external_url', + }) + .expect(200); + expect(body.comments[0].pushed_by).to.eql(defaultUser); + }); + it('unhappy path - 404s when case does not exist', async () => { + await supertest + .post(`${CASES_URL}/fake-id/_push`) + .set('kbn-xsrf', 'true') + .send({ + connector_id: 'connector_id', + connector_name: 'connector_name', + external_id: 'external_id', + external_title: 'external_title', + external_url: 'external_url', + }) + .expect(404); + }); + it('unhappy path - 400s when bad data supplied', async () => { + await supertest + .post(`${CASES_URL}/fake-id/_push`) + .set('kbn-xsrf', 'true') + .send({ + badKey: 'connector_id', + }) + .expect(400); + }); + it('unhappy path = 409s when case is closed', async () => { + const { body: configure } = await supertest + .post(CASE_CONFIGURE_URL) + .set('kbn-xsrf', 'true') + .send(getConfiguration()) + .expect(200); + const { body: postedCase } = await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq) + .expect(200); + await supertest + .patch(CASES_URL) + .set('kbn-xsrf', 'true') + .send({ + cases: [ + { + id: postedCase.id, + version: postedCase.version, + status: 'closed', + }, + ], + }) + .expect(200); + await supertest + .post(`${CASES_URL}/${postedCase.id}/_push`) + .set('kbn-xsrf', 'true') + .send({ + connector_id: configure.connector_id, + connector_name: configure.connector_name, + external_id: 'external_id', + external_title: 'external_title', + external_url: 'external_url', + }) + .expect(409); + }); + }); +}; diff --git a/x-pack/test/case_api_integration/basic/tests/cases/reporters/get_reporters.ts b/x-pack/test/case_api_integration/basic/tests/cases/reporters/get_reporters.ts new file mode 100644 index 0000000000000..a781b928b2b68 --- /dev/null +++ b/x-pack/test/case_api_integration/basic/tests/cases/reporters/get_reporters.ts @@ -0,0 +1,40 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../../common/ftr_provider_context'; + +import { CASES_URL, CASE_REPORTERS_URL } from '../../../../../../plugins/case/common/constants'; +import { defaultUser, postCaseReq } from '../../../../common/lib/mock'; +import { deleteCases } 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'); + + describe('get_reporters', () => { + afterEach(async () => { + await deleteCases(es); + }); + + it('should return reporters', async () => { + await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq) + .expect(200); + + const { body } = await supertest + .get(CASE_REPORTERS_URL) + .set('kbn-xsrf', 'true') + .send() + .expect(200); + + expect(body).to.eql([defaultUser]); + }); + }); +}; diff --git a/x-pack/test/case_api_integration/basic/tests/cases/status/get_status.ts b/x-pack/test/case_api_integration/basic/tests/cases/status/get_status.ts new file mode 100644 index 0000000000000..6552f588bdc19 --- /dev/null +++ b/x-pack/test/case_api_integration/basic/tests/cases/status/get_status.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../../common/ftr_provider_context'; + +import { CASES_URL, CASE_STATUS_URL } from '../../../../../../plugins/case/common/constants'; +import { postCaseReq } from '../../../../common/lib/mock'; +import { deleteCases } 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'); + + describe('get_status', () => { + afterEach(async () => { + await deleteCases(es); + }); + + it('should return case statuses', async () => { + await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq); + const { body: postedCase } = await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq); + await supertest + .patch(CASES_URL) + .set('kbn-xsrf', 'true') + .send({ + cases: [ + { + id: postedCase.id, + version: postedCase.version, + status: 'closed', + }, + ], + }) + .expect(200); + + const { body } = await supertest + .get(CASE_STATUS_URL) + .set('kbn-xsrf', 'true') + .send() + .expect(200); + + expect(body).to.eql({ + count_open_cases: 1, + count_closed_cases: 1, + }); + }); + }); +}; diff --git a/x-pack/test/case_api_integration/basic/tests/cases/tags/get_tags.ts b/x-pack/test/case_api_integration/basic/tests/cases/tags/get_tags.ts new file mode 100644 index 0000000000000..9b769e3c5eef4 --- /dev/null +++ b/x-pack/test/case_api_integration/basic/tests/cases/tags/get_tags.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../../common/ftr_provider_context'; + +import { CASES_URL, CASE_TAGS_URL } from '../../../../../../plugins/case/common/constants'; +import { postCaseReq } from '../../../../common/lib/mock'; +import { deleteCases } 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'); + + describe('get_tags', () => { + afterEach(async () => { + await deleteCases(es); + }); + + it('should return case tags', async () => { + await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq); + await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send({ ...postCaseReq, tags: ['unique'] }); + + const { body } = await supertest + .get(CASE_TAGS_URL) + .set('kbn-xsrf', 'true') + .send() + .expect(200); + + expect(body).to.eql(['defacement', 'unique']); + }); + }); +}; diff --git a/x-pack/test/case_api_integration/basic/tests/cases/user_actions/get_all_user_actions.ts b/x-pack/test/case_api_integration/basic/tests/cases/user_actions/get_all_user_actions.ts new file mode 100644 index 0000000000000..6bbd43eef1439 --- /dev/null +++ b/x-pack/test/case_api_integration/basic/tests/cases/user_actions/get_all_user_actions.ts @@ -0,0 +1,307 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../../../common/ftr_provider_context'; + +import { CASE_CONFIGURE_URL, CASES_URL } from '../../../../../../plugins/case/common/constants'; +import { defaultUser, postCaseReq, postCommentReq } from '../../../../common/lib/mock'; +import { + deleteCases, + deleteCasesUserActions, + deleteComments, + deleteConfiguration, + getConfiguration, +} 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'); + + describe('get_all_user_actions', () => { + afterEach(async () => { + await deleteCases(es); + await deleteComments(es); + await deleteConfiguration(es); + await deleteCasesUserActions(es); + }); + + it(`on new case, user action: 'create' should be called with actionFields: ['description', 'status', 'tags', 'title']`, async () => { + const { body: postedCase } = await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq); + + const { body } = await supertest + .get(`${CASES_URL}/${postedCase.id}/user_actions`) + .set('kbn-xsrf', 'true') + .send() + .expect(200); + expect(body.length).to.eql(1); + + expect(body[0].action_field).to.eql(['description', 'status', 'tags', 'title']); + expect(body[0].action).to.eql('create'); + expect(body[0].old_value).to.eql(null); + expect(body[0].new_value).to.eql(JSON.stringify(postCaseReq)); + }); + + it(`on close case, user action: 'update' should be called with actionFields: ['status']`, async () => { + const { body: postedCase } = await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq); + await supertest + .patch(CASES_URL) + .set('kbn-xsrf', 'true') + .send({ + cases: [ + { + id: postedCase.id, + version: postedCase.version, + status: 'closed', + }, + ], + }) + .expect(200); + + const { body } = await supertest + .get(`${CASES_URL}/${postedCase.id}/user_actions`) + .set('kbn-xsrf', 'true') + .send() + .expect(200); + expect(body.length).to.eql(2); + expect(body[1].action_field).to.eql(['status']); + expect(body[1].action).to.eql('update'); + expect(body[1].old_value).to.eql('open'); + expect(body[1].new_value).to.eql('closed'); + }); + + it(`on update case connector, user action: 'update' should be called with actionFields: ['connector_id']`, async () => { + const { body: postedCase } = await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq); + const newConnectorId = '12345'; + await supertest + .patch(CASES_URL) + .set('kbn-xsrf', 'true') + .send({ + cases: [ + { + id: postedCase.id, + version: postedCase.version, + connector_id: newConnectorId, + }, + ], + }) + .expect(200); + + const { body } = await supertest + .get(`${CASES_URL}/${postedCase.id}/user_actions`) + .set('kbn-xsrf', 'true') + .send() + .expect(200); + expect(body.length).to.eql(2); + expect(body[1].action_field).to.eql(['connector_id']); + expect(body[1].action).to.eql('update'); + expect(body[1].old_value).to.eql('none'); + expect(body[1].new_value).to.eql(newConnectorId); + }); + + it(`on update tags, user action: 'add' and 'delete' should be called with actionFields: ['tags']`, async () => { + const { body: postedCase } = await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq); + await supertest + .patch(CASES_URL) + .set('kbn-xsrf', 'true') + .send({ + cases: [ + { + id: postedCase.id, + version: postedCase.version, + tags: ['cool', 'neat'], + }, + ], + }) + .expect(200); + + const { body } = await supertest + .get(`${CASES_URL}/${postedCase.id}/user_actions`) + .set('kbn-xsrf', 'true') + .send() + .expect(200); + expect(body.length).to.eql(3); + expect(body[1].action_field).to.eql(['tags']); + expect(body[1].action).to.eql('add'); + expect(body[1].old_value).to.eql(null); + expect(body[1].new_value).to.eql('cool, neat'); + expect(body[2].action_field).to.eql(['tags']); + expect(body[2].action).to.eql('delete'); + expect(body[2].old_value).to.eql(null); + expect(body[2].new_value).to.eql('defacement'); + }); + + it(`on update title, user action: 'update' should be called with actionFields: ['title']`, async () => { + const { body: postedCase } = await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq); + const newTitle = 'Such a great title'; + await supertest + .patch(CASES_URL) + .set('kbn-xsrf', 'true') + .send({ + cases: [ + { + id: postedCase.id, + version: postedCase.version, + title: newTitle, + }, + ], + }) + .expect(200); + + const { body } = await supertest + .get(`${CASES_URL}/${postedCase.id}/user_actions`) + .set('kbn-xsrf', 'true') + .send() + .expect(200); + expect(body.length).to.eql(2); + expect(body[1].action_field).to.eql(['title']); + expect(body[1].action).to.eql('update'); + expect(body[1].old_value).to.eql(postCaseReq.title); + expect(body[1].new_value).to.eql(newTitle); + }); + + it(`on update description, user action: 'update' should be called with actionFields: ['description']`, async () => { + const { body: postedCase } = await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq); + const newDesc = 'Such a great description'; + await supertest + .patch(CASES_URL) + .set('kbn-xsrf', 'true') + .send({ + cases: [ + { + id: postedCase.id, + version: postedCase.version, + description: newDesc, + }, + ], + }) + .expect(200); + + const { body } = await supertest + .get(`${CASES_URL}/${postedCase.id}/user_actions`) + .set('kbn-xsrf', 'true') + .send() + .expect(200); + expect(body.length).to.eql(2); + expect(body[1].action_field).to.eql(['description']); + expect(body[1].action).to.eql('update'); + expect(body[1].old_value).to.eql(postCaseReq.description); + expect(body[1].new_value).to.eql(newDesc); + }); + + it(`on new comment, user action: 'create' should be called with actionFields: ['comments']`, async () => { + const { body: postedCase } = await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq); + await supertest + .post(`${CASES_URL}/${postedCase.id}/comments`) + .set('kbn-xsrf', 'true') + .send(postCommentReq); + + const { body } = await supertest + .get(`${CASES_URL}/${postedCase.id}/user_actions`) + .set('kbn-xsrf', 'true') + .send() + .expect(200); + expect(body.length).to.eql(2); + + expect(body[1].action_field).to.eql(['comment']); + expect(body[1].action).to.eql('create'); + expect(body[1].old_value).to.eql(null); + expect(body[1].new_value).to.eql(postCommentReq.comment); + }); + + it(`on update comment, user action: 'update' should be called with actionFields: ['comments']`, async () => { + const { body: postedCase } = await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq); + const { body: patchedCase } = await supertest + .post(`${CASES_URL}/${postedCase.id}/comments`) + .set('kbn-xsrf', 'true') + .send(postCommentReq); + const newComment = 'Well I decided to update my comment. So what? Deal with it.'; + await supertest + .patch(`${CASES_URL}/${postedCase.id}/comments`) + .set('kbn-xsrf', 'true') + .send({ + id: patchedCase.comments[0].id, + version: patchedCase.comments[0].version, + comment: newComment, + }); + + const { body } = await supertest + .get(`${CASES_URL}/${postedCase.id}/user_actions`) + .set('kbn-xsrf', 'true') + .send() + .expect(200); + expect(body.length).to.eql(3); + + expect(body[2].action_field).to.eql(['comment']); + expect(body[2].action).to.eql('update'); + expect(body[2].old_value).to.eql(postCommentReq.comment); + expect(body[2].new_value).to.eql(newComment); + }); + + it(`on new push to service, user action: 'push-to-service' should be called with actionFields: ['pushed']`, async () => { + const { body: configure } = await supertest + .post(CASE_CONFIGURE_URL) + .set('kbn-xsrf', 'true') + .send(getConfiguration()) + .expect(200); + const { body: postedCase } = await supertest + .post(CASES_URL) + .set('kbn-xsrf', 'true') + .send(postCaseReq); + + await supertest + .post(`${CASES_URL}/${postedCase.id}/_push`) + .set('kbn-xsrf', 'true') + .send({ + connector_id: configure.connector_id, + connector_name: configure.connector_name, + external_id: 'external_id', + external_title: 'external_title', + external_url: 'external_url', + }) + .expect(200); + + const { body } = await supertest + .get(`${CASES_URL}/${postedCase.id}/user_actions`) + .set('kbn-xsrf', 'true') + .send() + .expect(200); + expect(body.length).to.eql(2); + + expect(body[1].action_field).to.eql(['pushed']); + expect(body[1].action).to.eql('push-to-service'); + expect(body[1].old_value).to.eql(null); + const newValue = JSON.parse(body[1].new_value); + expect(newValue.connector_id).to.eql(configure.connector_id); + expect(newValue.pushed_by).to.eql(defaultUser); + }); + }); +}; diff --git a/x-pack/test/case_api_integration/basic/tests/index.ts b/x-pack/test/case_api_integration/basic/tests/index.ts index efd5369c019d8..b152a97a28616 100644 --- a/x-pack/test/case_api_integration/basic/tests/index.ts +++ b/x-pack/test/case_api_integration/basic/tests/index.ts @@ -12,9 +12,24 @@ export default ({ loadTestFile }: FtrProviderContext): void => { // Fastest ciGroup for the moment. this.tags('ciGroup2'); + loadTestFile(require.resolve('./cases/comments/delete_comment')); + loadTestFile(require.resolve('./cases/comments/find_comments')); + loadTestFile(require.resolve('./cases/comments/get_comment')); + loadTestFile(require.resolve('./cases/comments/patch_comment')); + loadTestFile(require.resolve('./cases/comments/post_comment')); + loadTestFile(require.resolve('./cases/delete_cases')); + loadTestFile(require.resolve('./cases/find_cases')); + loadTestFile(require.resolve('./cases/get_case')); + loadTestFile(require.resolve('./cases/patch_cases')); + loadTestFile(require.resolve('./cases/post_case')); + loadTestFile(require.resolve('./cases/push_case')); + loadTestFile(require.resolve('./cases/reporters/get_reporters')); + loadTestFile(require.resolve('./cases/status/get_status')); + loadTestFile(require.resolve('./cases/tags/get_tags')); + loadTestFile(require.resolve('./cases/user_actions/get_all_user_actions')); loadTestFile(require.resolve('./configure/get_configure')); - loadTestFile(require.resolve('./configure/post_configure')); - loadTestFile(require.resolve('./configure/patch_configure')); loadTestFile(require.resolve('./configure/get_connectors')); + loadTestFile(require.resolve('./configure/patch_configure')); + loadTestFile(require.resolve('./configure/post_configure')); }); }; diff --git a/x-pack/test/case_api_integration/common/lib/mock.ts b/x-pack/test/case_api_integration/common/lib/mock.ts new file mode 100644 index 0000000000000..728eaf88617e9 --- /dev/null +++ b/x-pack/test/case_api_integration/common/lib/mock.ts @@ -0,0 +1,50 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { + CasePostRequest, + CaseResponse, + CasesFindResponse, +} from '../../../../plugins/case/common/api'; +export const defaultUser = { email: null, full_name: null, username: 'elastic' }; +export const postCaseReq: CasePostRequest = { + description: 'This is a brand new case of a bad meanie defacing data', + title: 'Super Bad Security Issue', + tags: ['defacement'], +}; + +export const postCommentReq: { comment: string } = { + comment: 'This is a cool comment', +}; + +export const postCaseResp = (id: string): Partial => ({ + ...postCaseReq, + id, + comments: [], + totalComment: 0, + connector_id: 'none', + closed_by: null, + created_by: defaultUser, + external_service: null, + status: 'open', + updated_by: null, +}); + +export const removeServerGeneratedPropertiesFromCase = ( + config: Partial +): Partial => { + const { closed_at, created_at, updated_at, version, ...rest } = config; + return rest; +}; + +export const findCasesResp: CasesFindResponse = { + page: 1, + per_page: 20, + total: 0, + cases: [], + count_open_cases: 0, + count_closed_cases: 0, +}; diff --git a/x-pack/test/case_api_integration/common/lib/utils.ts b/x-pack/test/case_api_integration/common/lib/utils.ts index df768ff09b368..4b1dc6ffa5891 100644 --- a/x-pack/test/case_api_integration/common/lib/utils.ts +++ b/x-pack/test/case_api_integration/common/lib/utils.ts @@ -30,6 +30,36 @@ export const removeServerGeneratedPropertiesFromConfigure = ( return rest; }; +export const deleteCasesUserActions = async (es: Client): Promise => { + await es.deleteByQuery({ + index: '.kibana', + q: 'type:cases-user-actions', + wait_for_completion: true, + refresh: true, + body: {}, + }); +}; + +export const deleteCases = async (es: Client): Promise => { + await es.deleteByQuery({ + index: '.kibana', + q: 'type:cases', + wait_for_completion: true, + refresh: true, + body: {}, + }); +}; + +export const deleteComments = async (es: Client): Promise => { + await es.deleteByQuery({ + index: '.kibana', + q: 'type:cases-comments', + wait_for_completion: true, + refresh: true, + body: {}, + }); +}; + export const deleteConfiguration = async (es: Client): Promise => { await es.deleteByQuery({ index: '.kibana', @@ -39,34 +69,3 @@ export const deleteConfiguration = async (es: Client): Promise => { body: {}, }); }; - -export const getConnector = () => ({ - name: 'ServiceNow Connector', - actionTypeId: '.servicenow', - secrets: { - username: 'admin', - password: 'admin', - }, - config: { - apiUrl: 'localhost', - casesConfiguration: { - mapping: [ - { - source: 'title', - target: 'short_description', - actionType: 'overwrite', - }, - { - source: 'description', - target: 'description', - actionType: 'overwrite', - }, - { - source: 'comments', - target: 'comments', - actionType: 'append', - }, - ], - }, - }, -}); From 0c259102ed23878647c1bf0f5f2d4b5f73b6694b Mon Sep 17 00:00:00 2001 From: Kaarina Tungseth Date: Mon, 11 May 2020 15:42:56 -0500 Subject: [PATCH 087/102] [DOCS] Removed saved object options (#66072) Co-authored-by: Elastic Machine --- docs/canvas/canvas-elements.asciidoc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/canvas/canvas-elements.asciidoc b/docs/canvas/canvas-elements.asciidoc index a25460a20eb50..4149039a3f87b 100644 --- a/docs/canvas/canvas-elements.asciidoc +++ b/docs/canvas/canvas-elements.asciidoc @@ -31,7 +31,7 @@ By default, most of the elements you create use demo data until you change the d [[canvas-add-object]] ==== Add a saved object -Add a <>, such as a map or Lens visualization, then customize it to fit your display needs. +Add a <>, then customize it to fit your display needs. . Click *Embed object*. From 4506ca1dffd586e5799cf1cac1cec248ab1e0916 Mon Sep 17 00:00:00 2001 From: Justin Kambic Date: Mon, 11 May 2020 17:15:51 -0400 Subject: [PATCH 088/102] Change default cert age limit value. (#65918) * Change default cert age limit value. * Refresh test snapshot. Co-authored-by: Elastic Machine --- x-pack/plugins/uptime/common/constants/settings_defaults.ts | 2 +- .../uptime/server/lib/alerts/__tests__/status_check.test.ts | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/uptime/common/constants/settings_defaults.ts b/x-pack/plugins/uptime/common/constants/settings_defaults.ts index 82575e875577b..b9e99a54b3b11 100644 --- a/x-pack/plugins/uptime/common/constants/settings_defaults.ts +++ b/x-pack/plugins/uptime/common/constants/settings_defaults.ts @@ -8,6 +8,6 @@ import { DynamicSettings } from '../runtime_types'; export const DYNAMIC_SETTINGS_DEFAULTS: DynamicSettings = { heartbeatIndices: 'heartbeat-8*', - certAgeThreshold: 365, + certAgeThreshold: 730, certExpirationThreshold: 30, }; diff --git a/x-pack/plugins/uptime/server/lib/alerts/__tests__/status_check.test.ts b/x-pack/plugins/uptime/server/lib/alerts/__tests__/status_check.test.ts index a89e5ff62319d..73d104c1d21ae 100644 --- a/x-pack/plugins/uptime/server/lib/alerts/__tests__/status_check.test.ts +++ b/x-pack/plugins/uptime/server/lib/alerts/__tests__/status_check.test.ts @@ -87,7 +87,7 @@ describe('status check alert', () => { Object { "callES": [MockFunction], "dynamicSettings": Object { - "certAgeThreshold": 365, + "certAgeThreshold": 730, "certExpirationThreshold": 30, "heartbeatIndices": "heartbeat-8*", }, @@ -132,7 +132,7 @@ describe('status check alert', () => { Object { "callES": [MockFunction], "dynamicSettings": Object { - "certAgeThreshold": 365, + "certAgeThreshold": 730, "certExpirationThreshold": 30, "heartbeatIndices": "heartbeat-8*", }, From 5b6a99a9ac82c267076aac5769aaa94dd8fe302d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=B8ren=20Louv-Jansen?= Date: Mon, 11 May 2020 23:17:37 +0200 Subject: [PATCH 089/102] [DOCS] APM Agent config: Setting values must be string (#65875) Co-authored-by: Elastic Machine --- docs/apm/api.asciidoc | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/docs/apm/api.asciidoc b/docs/apm/api.asciidoc index 93733f5990a46..b26c7446b91d1 100644 --- a/docs/apm/api.asciidoc +++ b/docs/apm/api.asciidoc @@ -60,7 +60,7 @@ The following Agent configuration APIs are available: ====== `settings`:: -(required) Key/value object with settings and their corresponding value. +(required) Key/value object with option name and option value. `agent_name`:: (optional) The agent name is used by the UI to determine which settings to display. @@ -73,14 +73,14 @@ The following Agent configuration APIs are available: -------------------------------------------------- PUT /api/apm/settings/agent-configuration { - "service" : { - "name" : "frontend", - "environment" : "production" + "service": { + "name": "frontend", + "environment": "production" }, - "settings" : { - "transaction_sample_rate" : 0.4, - "capture_body" : "off", - "transaction_max_spans" : 500 + "settings": { + "transaction_sample_rate": "0.4", + "capture_body": "off", + "transaction_max_spans": "500" }, "agent_name": "nodejs" } @@ -124,7 +124,7 @@ PUT /api/apm/settings/agent-configuration DELETE /api/apm/settings/agent-configuration { "service" : { - "name" : "frontend", + "name": "frontend", "environment": "production" } } @@ -157,9 +157,9 @@ DELETE /api/apm/settings/agent-configuration "environment": "production" }, "settings": { - "transaction_sample_rate": 1, + "transaction_sample_rate": "1", "capture_body": "off", - "transaction_max_spans": 200 + "transaction_max_spans": "200" }, "@timestamp": 1581934104843, "applied_by_agent": false, @@ -171,9 +171,9 @@ DELETE /api/apm/settings/agent-configuration "name": "opbeans-go" }, "settings": { - "transaction_sample_rate": 1, + "transaction_sample_rate": "1", "capture_body": "off", - "transaction_max_spans": 300 + "transaction_max_spans": "300" }, "@timestamp": 1581934111727, "applied_by_agent": false, @@ -185,7 +185,7 @@ DELETE /api/apm/settings/agent-configuration "name": "frontend" }, "settings": { - "transaction_sample_rate": 1, + "transaction_sample_rate": "1", }, "@timestamp": 1582031336265, "applied_by_agent": false, @@ -250,7 +250,7 @@ GET /api/apm/settings/agent-configuration "name": "frontend" }, "settings": { - "transaction_sample_rate": 1, + "transaction_sample_rate": "1", }, "@timestamp": 1582031336265, "applied_by_agent": false, @@ -266,9 +266,9 @@ GET /api/apm/settings/agent-configuration -------------------------------------------------- POST /api/apm/settings/agent-configuration/search { - "etag" : "1e58c178efeebae15c25c539da740d21dee422fc", + "etag": "1e58c178efeebae15c25c539da740d21dee422fc", "service" : { - "name" : "frontend", + "name": "frontend", "environment": "production" } } From 480c1527c835b7f040e9ae969dc7335e1bf4916a Mon Sep 17 00:00:00 2001 From: gchaps <33642766+gchaps@users.noreply.github.com> Date: Mon, 11 May 2020 14:19:50 -0700 Subject: [PATCH 090/102] [DOCS] Improves formatting in action types (#65932) * [DOCS] Fixes formatting in action types * [DOCS] Updates preconfigured connectors and alerts --- docs/user/alerting/action-types.asciidoc | 6 +- .../user/alerting/action-types/email.asciidoc | 45 +++++--- .../user/alerting/action-types/index.asciidoc | 22 ++-- .../alerting/action-types/pagerduty.asciidoc | 15 +-- .../pre-configured-connectors.asciidoc | 99 ++++++++---------- .../user/alerting/action-types/slack.asciidoc | 8 +- .../alerting/action-types/webhook.asciidoc | 43 +++++--- ...ert-pre-configured-connectors-dropdown.png | Bin 92273 -> 76704 bytes .../alert-pre-configured-slack-connector.png | Bin 146428 -> 62511 bytes ...pre-configured-action-type-select-type.png | Bin 104497 -> 84001 bytes .../pre-configured-connectors-view-screen.png | Bin 94078 -> 49182 bytes 11 files changed, 140 insertions(+), 98 deletions(-) rename docs/user/alerting/{ => action-types}/pre-configured-connectors.asciidoc (55%) diff --git a/docs/user/alerting/action-types.asciidoc b/docs/user/alerting/action-types.asciidoc index 09878b3059ac8..e8dcf689df8e4 100644 --- a/docs/user/alerting/action-types.asciidoc +++ b/docs/user/alerting/action-types.asciidoc @@ -41,9 +41,9 @@ see https://www.elastic.co/subscriptions[the subscription page]. [float] [[create-connectors]] -=== Preconfigured connectors and action types +=== Preconfigured actions and connectors -For out-of-the-box and standardized connectors, you can <> +For out-of-the-box and standardized connectors, you can <> before {kib} starts. If you preconfigure a connector, you can also <>. @@ -54,4 +54,4 @@ include::action-types/pagerduty.asciidoc[] include::action-types/server-log.asciidoc[] include::action-types/slack.asciidoc[] include::action-types/webhook.asciidoc[] -include::pre-configured-connectors.asciidoc[] +include::action-types/pre-configured-connectors.asciidoc[] diff --git a/docs/user/alerting/action-types/email.asciidoc b/docs/user/alerting/action-types/email.asciidoc index 81b4e210961f6..4fb8a816d1ec9 100644 --- a/docs/user/alerting/action-types/email.asciidoc +++ b/docs/user/alerting/action-types/email.asciidoc @@ -28,27 +28,46 @@ Password:: password for 'login' type authentication. name: preconfigured-email-action-type actionTypeId: .email config: - from: testsender@test.com <1.1> - host: validhostname <1.2> - port: 8080 <1.3> - secure: false <1.4> + from: testsender@test.com + host: validhostname + port: 8080 + secure: false secrets: - user: testuser <2.1> - password: passwordkeystorevalue <2.2> + user: testuser + password: passwordkeystorevalue -- `config` defines the action type specific to the configuration and contains the following properties: -<1.1> `from:` is an email address and correspond to *Sender*. -<1.2> `host:` is a string and correspond to *Host*. -<1.3> `port:` is a number and correspond to *Port*. -<1.4> `secure:` is a boolean and correspond to *Secure*. +[cols="2*<"] +|=== -`secrets` defines action type sensitive configuration: +| `from` +| An email address that corresponds to *Sender*. -<2.1> `user:` is a string and correspond to *User*. -<2.2> `password:` is a string and correspond to *Password*. Should be stored in the <>. +| `host` +| A string that corresponds to *Host*. +| `port` +| A number that corresponds to *Port*. + +| `secure` +| A boolean that corresponds to *Secure*. + +|=== + +`secrets` defines sensitive information for the action type: + +[cols="2*<"] +|=== + +| `user` +| A string that corresponds to *User*. + +| `password` +| A string that corresponds to *Password*. Should be stored in the <>. + +|=== [[email-action-configuration]] ==== Action configuration diff --git a/docs/user/alerting/action-types/index.asciidoc b/docs/user/alerting/action-types/index.asciidoc index c71412210c535..115423086bae3 100644 --- a/docs/user/alerting/action-types/index.asciidoc +++ b/docs/user/alerting/action-types/index.asciidoc @@ -25,16 +25,26 @@ Execution time field:: This field will be automatically set to the time the ale name: action-type-index actionTypeId: .index config: - index: .kibana <1> - refresh: true <2> - executionTimeField: somedate <3> + index: .kibana + refresh: true + executionTimeField: somedate -- `config` defines the action type specific to the configuration and contains the following properties: -<1> `index:` is a string and correspond to *Index*. -<2> `refresh:` is a boolean and correspond to *Refresh*. -<3> `executionTimeField:` is a string and correspond to *Execution time field*. +[cols="2*<"] +|=== + +|`index` +| A string that corresponds to *Index*. + +|`refresh` +| A boolean that corresponds to *Refresh*. + +|`executionTimeField` +| A string that corresponds to *Execution time field*. + +|=== [float] diff --git a/docs/user/alerting/action-types/pagerduty.asciidoc b/docs/user/alerting/action-types/pagerduty.asciidoc index cd51ec2e3301e..0468ab042e57e 100644 --- a/docs/user/alerting/action-types/pagerduty.asciidoc +++ b/docs/user/alerting/action-types/pagerduty.asciidoc @@ -145,18 +145,19 @@ Integration Key:: A 32 character PagerDuty Integration Key for an integration name: preconfigured-pagerduty-action-type actionTypeId: .pagerduty config: - apiUrl: https://test.host <1.1> + apiUrl: https://test.host secrets: - routingKey: testroutingkey <2.1> + routingKey: testroutingkey -- -`config` defines the action type specific to the configuration and contains the following properties: +`config` defines the action type specific to the configuration. +`config` contains +`apiURL`, a string that corresponds to *API URL*. -<1.1> `apiUrl:` is URL string and correspond to *API URL*. +`secrets` defines sensitive information for the action type. +`secrets` contains +`routingKey`, a string that corresponds to *Integration Key*. -`secrets` defines action type sensitive configuration: - -<2.1> `routingKey:` is a string and correspond to *Integration Key*. [float] [[pagerduty-action-configuration]] diff --git a/docs/user/alerting/pre-configured-connectors.asciidoc b/docs/user/alerting/action-types/pre-configured-connectors.asciidoc similarity index 55% rename from docs/user/alerting/pre-configured-connectors.asciidoc rename to docs/user/alerting/action-types/pre-configured-connectors.asciidoc index d5c20d1853d42..b3e401256f27b 100644 --- a/docs/user/alerting/pre-configured-connectors.asciidoc +++ b/docs/user/alerting/action-types/pre-configured-connectors.asciidoc @@ -1,9 +1,9 @@ [role="xpack"] [[pre-configured-action-types-and-connectors]] -== Preconfigured connectors and action types +=== Preconfigured connectors and action types -You can preconfigure an action type or a connector to have all the information it needs prior to startup +You can preconfigure a connector or action type to have all the information it needs prior to startup by adding it to the `kibana.yml` file. Preconfigured connectors offer the following capabilities: @@ -13,15 +13,15 @@ action are predefined, including the connector name and ID. - Appear in all spaces because they are not saved objects. - Cannot be edited or deleted. -Sensitive configuration information, such as credentials, can use the <>. - -A preconfigured action types has only preconfigured connectors. Preconfigured connectors can belong to either the preconfigured action type or to the regular action type. +A preconfigured action type has only preconfigured connectors. Preconfigured +connectors can belong to either the preconfigured action type or to the regular action type. [float] [[preconfigured-connector-example]] -=== Creating a preconfigured connector +==== Preconfigured connectors -The following example shows a valid configuration of two out-of-the box connectors: <> and <>. +This example shows a valid configuration for +two out-of-the box connectors: <> and <>. ```js xpack.actions.preconfigured: @@ -44,7 +44,7 @@ The following example shows a valid configuration of two out-of-the box connecto password: changeme ``` -<1> the key is the action connector identifier, eg `my-slack1` in this example. +<1> The key is the action connector identifier, `my-slack1` in this example. <2> `actionTypeId` is the action type identifier. <3> `name` is the name of the preconfigured connector. <4> `config` is the action type specific to the configuration. @@ -55,74 +55,67 @@ The following example shows a valid configuration of two out-of-the box connecto Sensitive properties, such as passwords, can also be stored in the <>. ============================================== -[float] -[[preconfigured-action-type-example]] -=== Creating a preconfigured action type - -In the `kibana.yml` file: - -. Exclude the action type from `xpack.actions.enabledActionTypes`. -. Add all its preconfigured connectors. - -The following example shows a valid configuration of preconfigured action type with one out-of-the box connector. - -```js - xpack.actions.enabledActionTypes: ['.slack', '.email', '.index'] <1> - xpack.actions.preconfigured: <2> - my-server-log: - actionTypeId: .server-log - name: 'Server log #xyz' -``` - -<1> `enabledActionTypes` should exclude preconfigured action type to prevent creating and deleting connectors. -<2> `preconfigured` is the setting for defining the list of available connectors for the preconfigured action type. - +//// [float] [[managing-pre-configured-connectors]] -=== Managing preconfigured connectors +==== View preconfigured connectors +//// -Preconfigured connectors appear in the connector list, regardless of which space the user is in. -They are tagged as “preconfigured” and cannot be deleted. +In *Management > Alerts and Actions*, preconfigured connectors +appear in the <>, +regardless of which space you are in. +They are tagged as “preconfigured”, and you cannot delete them. [role="screenshot"] image::images/pre-configured-connectors-managing.png[Connectors managing tab with pre-cofigured] -Clicking on a preconfigured connector shows the description, but not any of the configuration. +Clicking a preconfigured connector shows the description, but not the configuration. A message indicates that this is a preconfigured connector. [role="screenshot"] image::images/pre-configured-connectors-view-screen.png[Pre-configured connector view details] -The connector details preview is disabled for preconfigured connectors. +The connector details preview is disabled for preconfigured connectors +of a preconfigured action type. [role="screenshot"] image::images/pre-configured-action-type-managing.png[Connectors managing tab with pre-cofigured] - [float] -[[managing-pre-configured-action-types]] -=== Managing preconfigured action types +[[preconfigured-action-type-example]] +==== Preconfigured action type -Clicking *Create connector* shows the list of available action types. -Disabled action types are not included. +This example shows a preconfigured action type with one out-of-the box connector. -[role="screenshot"] -image::images/pre-configured-action-type-select-type.png[Pre-configured connector create menu] +```js + xpack.actions.enabledActionTypes: ['.slack', '.email', '.index'] <1> + xpack.actions.preconfigured: <2> + my-server-log: + actionTypeId: .server-log + name: 'Server log #xyz' +``` -[float] -[[pre-configured-connector-alert-form]] -=== Alert with a preconfigured connector +<1> `enabledActionTypes` excludes the preconfigured action type to prevent creating and deleting connectors. +<2> `preconfigured` is the setting for defining the list of available connectors for the preconfigured action type. -When attaching an action to an alert, -select from a list of available action types, and -then select the Slack or Webhook type. Those action types were configured previously. -The preconfigured connector is installed and is automatically selected. +[[managing-pre-configured-action-types]] +To attach a preconfigured action to an alert: -[role="screenshot"] -image::images/alert-pre-configured-slack-connector.png[Create alert with selected Slack action type] +. In *Management > Alerts and Actions*, open the *Connectors* tab. -The dropdown is populated with additional preconfigured Slack connectors. -The `preconfigured` label distinguishes them from space-aware connectors that use saved objects. +. Click *Create connector.* +. In the list of available action types, select the preconfigured action type you want. ++ +[role="screenshot"] +image::images/pre-configured-action-type-select-type.png[Pre-configured connector create menu] + +. In *Create alert*, open the connector dropdown, and then select the preconfigured +connector. ++ +The `preconfigured` label distinguishes it from a space-aware connector. ++ [role="screenshot"] image::images/alert-pre-configured-connectors-dropdown.png[Dropdown list with pre-cofigured connectors] + +. Click *Add action*. diff --git a/docs/user/alerting/action-types/slack.asciidoc b/docs/user/alerting/action-types/slack.asciidoc index afa616ba77b3a..5bad8a53f898c 100644 --- a/docs/user/alerting/action-types/slack.asciidoc +++ b/docs/user/alerting/action-types/slack.asciidoc @@ -23,12 +23,12 @@ Webhook URL:: The URL of the incoming webhook. See https://api.slack.com/messa name: preconfigured-slack-action-type actionTypeId: .slack config: - webhookUrl: 'https://hooks.slack.com/services/abcd/efgh/ijklmnopqrstuvwxyz' <1> + webhookUrl: 'https://hooks.slack.com/services/abcd/efgh/ijklmnopqrstuvwxyz' -- -`config` defines the action type specific to the configuration and contains the following properties: - -<1> `webhookUrl:` is URL string and correspond to *Webhook URL*. +`config` defines the action type specific to the configuration. +`config` contains +`webhookUrl`, a string that corresponds to *Webhook URL*. [float] diff --git a/docs/user/alerting/action-types/webhook.asciidoc b/docs/user/alerting/action-types/webhook.asciidoc index 27609652288b5..c91c24430e982 100644 --- a/docs/user/alerting/action-types/webhook.asciidoc +++ b/docs/user/alerting/action-types/webhook.asciidoc @@ -19,7 +19,7 @@ Password:: An optional password. If set, HTTP basic authentication is used. Cur [float] [[Preconfigured-webhook-configuration]] -==== Preconfigured action type +==== Preconfigured action type [source,text] -- @@ -27,25 +27,44 @@ Password:: An optional password. If set, HTTP basic authentication is used. Cur name: preconfigured-webhook-action-type actionTypeId: .webhook config: - url: https://test.host <1.1> - method: POST <1.2> - headers: <1.3> + url: https://test.host + method: POST + headers: testheader: testvalue secrets: - user: testuser <2.1> - password: passwordkeystorevalue <2.2> + user: testuser + password: passwordkeystorevalue -- `config` defines the action type specific to the configuration and contains the following properties: -<1.1> `url:` is URL string and correspond to *URL*. -<1.2> `method:` is a string and correspond to *Method*. -<1.3> `headers:` is Record and correspond to *Headers*. +[cols="2*<"] +|=== -`secrets` defines action type sensitive configuration: +|`url` +| A URL string that corresponds to *URL*. + +|`method` +| A string that corresponds to *Method*. + +|`headers` +|A record that corresponds to *Headers*. + +|=== + +`secrets` defines sensitive information for the action type: + +[cols="2*<"] +|=== + +|`user` +|A string that corresponds to *User*. + +|`password` +|A string that corresponds to *Password*. Should be stored in the <>. + +|=== -<2.1> `user:` is a string and correspond to *User*. -<2.2> `password:` is a string and correspond to *Password*. Should be stored in the <>. [float] [[webhook-action-configuration]] diff --git a/docs/user/alerting/images/alert-pre-configured-connectors-dropdown.png b/docs/user/alerting/images/alert-pre-configured-connectors-dropdown.png index 4e6c713298626f4f733e9e685815af168a95f77d..081688758eb484771277149e4a93fc5f65c8ecac 100644 GIT binary patch literal 76704 zcmeFYWm6?VyDW;kySok!gS*?{4DRkS46tx_cXt@v2Y1)O-F@LK+~M%b?dpi?Xkyl>RD-QBMTqw zcZG+lHA)4dNDY+|4lc?N5An7!Wn|`pSaY^ z)3={L@1VqZNx`Ua_I?Ls=OJGEf`LrB)l*@?W(iNLOOIqz00M(B?CE5Ks?<~J`zF+i zn)?VT3SvaCdpTh7)&jYVm|zz)WtNAx9OQ8iOyT;}5cN=C#O#CM-snnT&QOEmzg%b; z*#1JIoNQm4eFSm%_$Q4_5cQtwsEeVXPn7U>T7O#df3zGN(Y=_i^oe4QQS2pi4s>sh z=Mt38uxF`5R$G|>cSp~5gx3m>53omC<5 z@eJjOMr6|?w+i5i%gVpjr%MhSw&kfbPue$maSn|hSbAEzHLGZqdrgWwmuL?COqChE z0Q%|D$;oH{qg8H)WM|QA#V3<3N2Dw4S+m5@Y1_A@{)DR?IYQRgDr1mT9gWafjP~z+ ze`wJ2@atL;OGqcI?o06~42DCVRuoc7=|LY<5QFEh&y%JjC0sO&62Zf$s3GoPOs29q z9a<~#=yN96UY^U=iV;-AJ_=^I*Feh}zuo8T28fX8#oPD_=w#w%Y+b zR3V5d%u6eoca%k<4n?C3H{$JM~HT%Ge2@4L|tn#L~E!-wXfx zEDF79uc8>#n27E z7??5|sdrf+uR^b@E7HPrL+7s=gseP{u))5Uj#4{JLiQLG9@@7y`NmK0UhQ)6`@Jf6 z0uzU>C(fTkn@@pe3hS_b1vJ58=1l!oAg<+5<4^-e_bI)QSI+%o@e{IN;8Q{KH!0X> za(8#P`1WrVkl^Mg5tz*~ca9G+*c~NUcFwfs=*=RZo(DPDx0wLPWHwgVrC#u*eHeiN zQaFeLBdl<6crxf8!TLCT_l%HgeMqdh$^PthNL4T?MvyB=%|ZG`ELKoqz0OVqdSGdN zu1>f$xhNor-$CyAxT0tnV$yiwY$gFK6jR}ZdofUC1u|F|VZ~(DGBgyTSffa0B&wlR zBHt1eWSDLUf1&ZlW{a=IuaAlsV|v7Ri?Jn#669Ny5%VG4ORZW_W%?_MaLm$Mk?TY= zi!#g*{H9&=Cy{2!U!HZlgI)^)|AA;~lA4Zq6yscn$A~@AYqr8zg~c#pQ|DQQ|1qUm z?^cEQ8jk4r3AG0it$-H-*m# zE)T{K<27d31>42)&fd2D%>qQPNO}J_Cr^+Wrm{>F zrVkyYJWP<2v6bbQm6p|%AudKWV`_k2jUkd!q?R9*Jot5ka)W+@eZ%pKMKaAq{<>sP z87kR2xg?n>*z?F3CN(uRB{gmdkEwo%s2ZVK zP{*=~#Kx!iWIo%9Xbq4V*c{v(;}-3f^$@C9x;`6pTz)6;g5k;Z4)qTH9>gW?RmP>M zn=h!_A=e@L8u=hk92r}UqH9^GSfJQ8C6pu2r{9jH LtmK~Rka8)ynbj`niPW|0 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

?woHd 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 literal 92273 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 E2e9M;vj6}9 literal 146428 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

Snh{Ng41B}KT>M=1! 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 diff --git a/docs/user/alerting/images/pre-configured-action-type-select-type.png b/docs/user/alerting/images/pre-configured-action-type-select-type.png index 29e5a29edc7c0608d06386e1c95bc14899f8c044..91ca831840ce92396f9f411fde108c06593c063a 100644 GIT binary patch literal 84001 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 diff --git a/docs/user/alerting/images/pre-configured-connectors-view-screen.png b/docs/user/alerting/images/pre-configured-connectors-view-screen.png index 43ac44e7536d8f8686054ef1e1d5d92c8e5624e3..9c75f86498bebe37f9263462e2c1b20273409f5a 100644 GIT binary patch delta 46399 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 From 0802ccc262688e5dea904e6cc82d2f48d034b437 Mon Sep 17 00:00:00 2001 From: Nathan L Smith Date: Mon, 11 May 2020 18:26:50 -0500 Subject: [PATCH 091/102] Fix major severity service map ring colors (#66124) Using `||` in the switch statement made it so "major" did not work, and we would get the border width but not the color. Change to splitting case statements. Fixes #66081 --- .../apm/public/components/app/ServiceMap/cytoscapeOptions.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/apm/public/components/app/ServiceMap/cytoscapeOptions.ts b/x-pack/plugins/apm/public/components/app/ServiceMap/cytoscapeOptions.ts index 0cdc7c4eb124d..d3c4654de8164 100644 --- a/x-pack/plugins/apm/public/components/app/ServiceMap/cytoscapeOptions.ts +++ b/x-pack/plugins/apm/public/components/app/ServiceMap/cytoscapeOptions.ts @@ -17,7 +17,8 @@ export const getSeverityColor = (nodeSeverity: string) => { switch (nodeSeverity) { case severity.warning: return theme.euiColorVis0; - case severity.minor || severity.major: + case severity.minor: + case severity.major: return theme.euiColorVis5; case severity.critical: return theme.euiColorVis9; From 6d95b68c7247e8fd6c904fc484824e534186bec0 Mon Sep 17 00:00:00 2001 From: Phillip Burch Date: Mon, 11 May 2020 19:08:02 -0500 Subject: [PATCH 092/102] Cleanup prefill and edit flow. (#66105) --- .../components/expression.tsx | 90 ++++++++++--------- .../infra/server/lib/alerting/common/utils.ts | 5 ++ 2 files changed, 53 insertions(+), 42 deletions(-) diff --git a/x-pack/plugins/infra/public/alerting/metric_threshold/components/expression.tsx b/x-pack/plugins/infra/public/alerting/metric_threshold/components/expression.tsx index 406f9c7602d35..8fdba86f233d4 100644 --- a/x-pack/plugins/infra/public/alerting/metric_threshold/components/expression.tsx +++ b/x-pack/plugins/infra/public/alerting/metric_threshold/components/expression.tsx @@ -74,6 +74,7 @@ export const Expressions: React.FC = props => { fetch: alertsContext.http.fetch, toastWarning: alertsContext.toastNotifications.addWarning, }); + const [timeSize, setTimeSize] = useState(1); const [timeUnit, setTimeUnit] = useState('m'); const derivedIndexPattern = useMemo(() => createDerivedIndexPattern('metrics'), [ @@ -173,52 +174,57 @@ export const Expressions: React.FC = props => { [alertParams.criteria, setAlertParams] ); - useEffect(() => { + const preFillAlertCriteria = useCallback(() => { const md = alertsContext.metadata; - if (md) { - if (md.currentOptions?.metrics) { - setAlertParams( - 'criteria', - md.currentOptions.metrics.map(metric => ({ - metric: metric.field, - comparator: Comparator.GT, - threshold: [], - timeSize, - timeUnit, - aggType: metric.aggregation, - })) - ); - } else { - setAlertParams('criteria', [defaultExpression]); - } + if (md && md.currentOptions?.metrics) { + setAlertParams( + 'criteria', + md.currentOptions.metrics.map(metric => ({ + metric: metric.field, + comparator: Comparator.GT, + threshold: [], + timeSize, + timeUnit, + aggType: metric.aggregation, + })) + ); + } else { + setAlertParams('criteria', [defaultExpression]); + } + }, [alertsContext.metadata, setAlertParams, timeSize, timeUnit]); - if (md.currentOptions) { - if (md.currentOptions.filterQuery) { - setAlertParams('filterQueryText', md.currentOptions.filterQuery); - setAlertParams( - 'filterQuery', - convertKueryToElasticSearchQuery(md.currentOptions.filterQuery, derivedIndexPattern) || - '' - ); - } else if (md.currentOptions.groupBy && md.series) { - const filter = `${md.currentOptions.groupBy}: "${md.series.id}"`; - setAlertParams('filterQueryText', filter); - setAlertParams( - 'filterQuery', - convertKueryToElasticSearchQuery(filter, derivedIndexPattern) || '' - ); - } + const preFillAlertFilter = useCallback(() => { + const md = alertsContext.metadata; + if (md && md.currentOptions?.filterQuery) { + setAlertParams('filterQueryText', md.currentOptions.filterQuery); + setAlertParams( + 'filterQuery', + convertKueryToElasticSearchQuery(md.currentOptions.filterQuery, derivedIndexPattern) || '' + ); + } else if (md && md.currentOptions?.groupBy && md.series) { + const filter = `${md.currentOptions?.groupBy}: "${md.series.id}"`; + setAlertParams('filterQueryText', filter); + setAlertParams( + 'filterQuery', + convertKueryToElasticSearchQuery(filter, derivedIndexPattern) || '' + ); + } + }, [alertsContext.metadata, derivedIndexPattern, setAlertParams]); - setAlertParams('groupBy', md.currentOptions.groupBy); - } - setAlertParams('sourceId', source?.id); + useEffect(() => { + if (alertParams.criteria && alertParams.criteria.length) { + setTimeSize(alertParams.criteria[0].timeSize); + setTimeUnit(alertParams.criteria[0].timeUnit); } else { - if (!alertParams.criteria) { - setAlertParams('criteria', [defaultExpression]); - } - if (!alertParams.sourceId) { - setAlertParams('sourceId', source?.id || 'default'); - } + preFillAlertCriteria(); + } + + if (!alertParams.filterQuery) { + preFillAlertFilter(); + } + + if (!alertParams.sourceId) { + setAlertParams('sourceId', source?.id || 'default'); } }, [alertsContext.metadata, defaultExpression, source]); // eslint-disable-line react-hooks/exhaustive-deps diff --git a/x-pack/plugins/infra/server/lib/alerting/common/utils.ts b/x-pack/plugins/infra/server/lib/alerting/common/utils.ts index a2c5b27c38fd6..5ca65b667ae11 100644 --- a/x-pack/plugins/infra/server/lib/alerting/common/utils.ts +++ b/x-pack/plugins/infra/server/lib/alerting/common/utils.ts @@ -13,6 +13,11 @@ export const oneOfLiterals = (arrayOfLiterals: Readonly) => }); export const validateIsStringElasticsearchJSONFilter = (value: string) => { + if (value === '') { + // Allow clearing the filter. + return; + } + const errorMessage = 'filterQuery must be a valid Elasticsearch filter expressed in JSON'; try { const parsedValue = JSON.parse(value); From b5f5284b5c54c3a9861baa56b3429fe2e95443f1 Mon Sep 17 00:00:00 2001 From: spalger Date: Mon, 11 May 2020 17:11:37 -0700 Subject: [PATCH 093/102] skip flaky suite (#59849) --- .../__jest__/client_integration/template_clone.test.tsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/index_management/__jest__/client_integration/template_clone.test.tsx b/x-pack/plugins/index_management/__jest__/client_integration/template_clone.test.tsx index 17e19bf881dee..fa9d13d1ddd07 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/template_clone.test.tsx +++ b/x-pack/plugins/index_management/__jest__/client_integration/template_clone.test.tsx @@ -42,7 +42,8 @@ jest.mock('@elastic/eui', () => ({ ), })); -describe('', () => { +// FLAKY: https://github.com/elastic/kibana/issues/59849 +describe.skip('', () => { let testBed: TemplateFormTestBed; const { server, httpRequestsMockHelpers } = setupEnvironment(); From bf178dece9b0f70f33d1bd3c89eb972318d7ecfb Mon Sep 17 00:00:00 2001 From: Thomas Neirynck Date: Mon, 11 May 2020 20:40:12 -0400 Subject: [PATCH 094/102] [Maps] Organize layers into subfolders (#65513) --- x-pack/legacy/plugins/maps/public/index.ts | 2 +- .../maps/public/angular/get_initial_layers.js | 22 ++++++------ .../public/{layers => classes}/_index.scss | 0 .../fields/ems_file_field.ts | 0 .../fields/es_agg_field.test.ts | 0 .../fields/es_agg_field.ts | 0 .../fields/es_doc_field.ts | 0 .../{layers => classes}/fields/field.ts | 0 .../fields/kibana_region_field.ts | 0 .../fields/top_term_percentage_field.ts | 0 .../{layers => classes}/joins/inner_join.js | 0 .../joins/inner_join.test.js | 2 +- .../public/{layers => classes}/joins/join.ts | 0 .../blended_vector_layer.ts | 34 +++++++++---------- .../layers/heatmap_layer}/heatmap_layer.js | 8 ++--- .../public/{ => classes}/layers/layer.tsx | 14 ++++---- .../layers/layer_wizard_registry.ts | 2 +- .../layers/load_layer_wizards.ts | 24 ++++++------- .../create_layer_descriptor.test.ts | 2 +- .../observability/create_layer_descriptor.ts | 18 +++++----- .../observability/display_select.tsx | 0 .../solution_layers/observability/index.ts | 0 .../observability/layer_select.tsx | 0 .../observability/metric_select.tsx | 0 .../observability_layer_template.tsx | 0 .../observability_layer_wizard.tsx | 2 +- .../layers/tile_layer}/tile_layer.d.ts | 6 ++-- .../layers/tile_layer}/tile_layer.js | 6 ++-- .../layers/tile_layer}/tile_layer.test.ts | 8 ++--- .../tiled_vector_layer.tsx | 21 +++++++----- .../layers/vector_layer}/vector_layer.d.ts | 16 ++++----- .../layers/vector_layer}/vector_layer.js | 16 ++++----- .../vector_tile_layer}/vector_tile_layer.js | 8 ++--- .../create_client_file_source_editor.js | 0 .../client_file_source/geojson_file_source.js | 0 .../sources/client_file_source/index.js | 0 .../upload_layer_wizard.tsx | 6 ++-- .../ems_file_source/create_source_editor.tsx | 0 .../ems_boundaries_layer_wizard.tsx | 4 +-- .../ems_file_source/ems_file_source.test.tsx | 2 +- .../ems_file_source/ems_file_source.tsx | 0 .../sources/ems_file_source/index.ts | 0 .../ems_file_source/update_source_editor.tsx | 0 .../ems_base_map_layer_wizard.tsx | 4 +-- .../sources/ems_tms_source/ems_tms_source.js | 0 .../ems_tms_source/ems_tms_source.test.js | 0 .../sources/ems_tms_source/index.js | 0 .../ems_tms_source/tile_service_select.js | 0 .../ems_tms_source/update_source_editor.js | 0 .../sources/ems_unavailable_message.ts | 0 .../sources/es_agg_source/es_agg_source.d.ts | 0 .../sources/es_agg_source/es_agg_source.js | 0 .../es_agg_source/es_agg_source.test.ts | 0 .../sources/es_agg_source/index.ts | 0 .../clusters_layer_wizard.tsx | 4 +-- .../es_geo_grid_source/convert_to_geojson.js | 0 .../convert_to_geojson.test.ts | 0 .../create_source_editor.js | 0 .../es_geo_grid_source.d.ts | 0 .../es_geo_grid_source/es_geo_grid_source.js | 0 .../es_geo_grid_source.test.ts | 0 .../es_geo_grid_source/geo_tile_utils.js | 0 .../es_geo_grid_source/geo_tile_utils.test.js | 0 .../heatmap_layer_wizard.tsx | 4 +-- .../sources/es_geo_grid_source/index.js | 0 .../es_geo_grid_source/render_as_select.tsx | 0 .../es_geo_grid_source/resolution_editor.js | 0 .../update_source_editor.js | 0 .../es_pew_pew_source/convert_to_lines.js | 0 .../convert_to_lines.test.ts | 0 .../es_pew_pew_source/create_source_editor.js | 0 .../es_pew_pew_source/es_pew_pew_source.js | 0 .../sources/es_pew_pew_source/index.js | 0 .../point_2_point_layer_wizard.tsx | 4 +-- .../es_pew_pew_source/update_source_editor.js | 0 .../__snapshots__/scaling_form.test.tsx.snap | 0 .../update_source_editor.test.js.snap | 0 .../sources/es_search_source/constants.js | 0 .../es_search_source/create_source_editor.js | 0 .../es_documents_layer_wizard.tsx | 6 ++-- .../es_search_source/es_search_source.d.ts | 0 .../es_search_source/es_search_source.js | 0 .../sources/es_search_source/index.js | 0 .../es_search_source/load_index_settings.js | 0 .../es_search_source/scaling_form.test.tsx | 0 .../sources/es_search_source/scaling_form.tsx | 0 .../es_search_source/update_source_editor.js | 0 .../update_source_editor.test.js | 0 .../sources/es_source/es_source.d.ts | 0 .../sources/es_source/es_source.js | 0 .../sources/es_source/index.ts | 0 .../es_term_source/es_term_source.d.ts | 0 .../sources/es_term_source/es_term_source.js | 0 .../es_term_source/es_term_source.test.js | 2 +- .../sources/es_term_source/index.ts | 0 .../create_source_editor.js | 0 .../sources/kibana_regionmap_source/index.js | 0 .../kibana_regionmap_layer_wizard.tsx | 4 +-- .../kibana_regionmap_source.d.ts | 0 .../kibana_regionmap_source.js | 0 .../create_source_editor.js | 0 .../sources/kibana_tilemap_source/index.js | 0 .../kibana_base_map_layer_wizard.tsx | 4 +-- .../kibana_tilemap_source.js | 0 .../mvt_single_layer_vector_source/index.ts | 0 .../layer_wizard.tsx | 4 +-- .../mvt_single_layer_vector_source.ts | 0 .../mvt_single_layer_vector_source_editor.tsx | 0 .../{layers => classes}/sources/source.ts | 0 .../sources/source_registry.ts | 0 .../sources/tms_source/index.ts | 0 .../sources/tms_source/tms_source.d.ts | 0 .../sources/tms_source/tms_source.js | 0 .../sources/vector_feature_types.ts | 0 .../sources/vector_source/index.ts | 0 .../sources/vector_source/vector_source.d.ts | 0 .../sources/vector_source/vector_source.js | 0 .../sources/wms_source/index.js | 0 .../sources/wms_source/wms_client.js | 0 .../sources/wms_source/wms_client.test.js | 0 .../wms_source/wms_create_source_editor.js | 0 .../sources/wms_source/wms_layer_wizard.tsx | 4 +-- .../sources/wms_source/wms_source.js | 0 .../sources/xyz_tms_source/index.ts | 0 .../sources/xyz_tms_source/layer_wizard.tsx | 4 +-- .../sources/xyz_tms_source/xyz_tms_editor.tsx | 0 .../xyz_tms_source/xyz_tms_source.test.ts | 0 .../sources/xyz_tms_source/xyz_tms_source.ts | 0 .../{layers => classes}/styles/_index.scss | 0 .../{layers => classes}/styles/color_utils.js | 0 .../styles/color_utils.test.js | 0 .../styles/components/_color_gradient.scss | 0 .../styles/components/color_gradient.js | 0 .../components/ranged_style_legend_row.js | 0 .../heatmap_style_editor.test.js.snap | 0 .../heatmap/components/heatmap_constants.js | 0 .../components/heatmap_style_editor.js | 0 .../components/heatmap_style_editor.test.js | 0 .../components/legend/heatmap_legend.js | 0 .../styles/heatmap/heatmap_style.js | 0 .../{layers => classes}/styles/style.ts | 2 +- .../styles/tile/tile_style.ts | 0 .../vector/components/_style_prop_editor.scss | 0 .../vector/components/color/_color_stops.scss | 0 .../components/color/color_map_select.js | 0 .../vector/components/color/color_stops.js | 0 .../color/color_stops_categorical.js | 0 .../components/color/color_stops_ordinal.js | 0 .../components/color/color_stops_utils.js | 0 .../components/color/dynamic_color_form.js | 0 .../color/mb_validated_color_picker.tsx | 0 .../components/color/static_color_form.js | 0 .../color/vector_style_color_editor.js | 0 .../categorical_field_meta_popover.tsx | 0 .../field_meta/field_meta_popover.tsx | 0 .../field_meta/ordinal_field_meta_popover.tsx | 0 .../styles/vector/components/field_select.js | 0 .../components/get_vector_style_label.js | 0 .../components/label/dynamic_label_form.js | 0 .../components/label/static_label_form.js | 0 .../vector_style_label_border_size_editor.js | 0 .../label/vector_style_label_editor.js | 0 .../__snapshots__/vector_icon.test.js.snap | 0 .../vector/components/legend/category.js | 0 .../vector/components/legend/circle_icon.js | 0 .../extract_color_from_style_property.js | 0 .../vector/components/legend/line_icon.js | 0 .../vector/components/legend/polygon_icon.js | 0 .../vector/components/legend/symbol_icon.js | 0 .../vector/components/legend/vector_icon.js | 0 .../components/legend/vector_icon.test.js | 0 .../components/legend/vector_style_legend.js | 0 .../orientation/dynamic_orientation_form.js | 0 .../orientation/orientation_editor.js | 0 .../orientation/static_orientation_form.js | 0 .../components/size/dynamic_size_form.js | 0 .../components/size/size_range_selector.js | 0 .../components/size/static_size_form.js | 0 .../size/vector_style_size_editor.js | 0 .../styles/vector/components/stop_input.js | 0 .../vector/components/style_map_select.js | 0 .../vector/components/style_option_shapes.js | 0 .../vector/components/style_prop_editor.js | 0 .../__snapshots__/icon_select.test.js.snap | 0 .../components/symbol/_icon_select.scss | 0 .../components/symbol/dynamic_icon_form.js | 0 .../components/symbol/icon_map_select.js | 0 .../vector/components/symbol/icon_select.js | 0 .../components/symbol/icon_select.test.js | 0 .../vector/components/symbol/icon_stops.js | 0 .../components/symbol/icon_stops.test.js | 0 .../components/symbol/static_icon_form.js | 0 .../symbol/vector_style_icon_editor.js | 0 .../vector_style_symbolize_as_editor.js | 0 .../vector/components/vector_style_editor.js | 0 .../dynamic_color_property.test.js.snap | 0 .../components/categorical_legend.js | 0 .../properties/components/ordinal_legend.js | 0 .../properties/dynamic_color_property.js | 0 .../properties/dynamic_color_property.test.js | 0 .../properties/dynamic_icon_property.js | 0 .../dynamic_orientation_property.js | 0 .../properties/dynamic_size_property.js | 0 .../properties/dynamic_style_property.d.ts | 0 .../properties/dynamic_style_property.js | 0 .../properties/dynamic_text_property.js | 0 .../properties/label_border_size_property.js | 0 .../properties/static_color_property.js | 0 .../vector/properties/static_icon_property.js | 0 .../properties/static_orientation_property.js | 0 .../vector/properties/static_size_property.js | 0 .../properties/static_style_property.js | 0 .../vector/properties/static_text_property.js | 0 .../vector/properties/style_property.ts | 0 .../properties/symbolize_as_property.js | 0 .../styles/vector/style_meta.ts | 0 .../styles/vector/style_util.js | 0 .../styles/vector/style_util.test.js | 0 .../styles/vector/symbol_utils.js | 0 .../styles/vector/symbol_utils.test.js | 0 .../styles/vector/vector_style.d.ts | 2 +- .../styles/vector/vector_style.js | 0 .../styles/vector/vector_style.test.js | 0 .../styles/vector/vector_style_defaults.ts | 0 .../tooltips/es_agg_tooltip_property.ts | 0 .../tooltips/es_tooltip_property.test.ts | 0 .../tooltips/es_tooltip_property.ts | 0 .../tooltips/join_tooltip_property.ts | 0 .../tooltips/tooltip_property.ts | 0 .../util/assign_feature_ids.test.ts | 0 .../util/assign_feature_ids.ts | 0 .../util/can_skip_fetch.test.js | 0 .../util/can_skip_fetch.ts | 0 .../{layers => classes}/util/data_request.ts | 0 .../util/es_agg_utils.test.ts | 0 .../{layers => classes}/util/es_agg_utils.ts | 0 .../util/is_metric_countable.ts | 0 .../util/is_refresh_only_query.ts | 0 .../util/mb_filter_expressions.ts | 0 .../tooltip_selector.test.tsx | 2 +- .../tooltip_selector/tooltip_selector.tsx | 2 +- .../connected_components/gis_map/index.d.ts | 2 +- .../connected_components/gis_map/view.js | 2 +- .../layer_addpanel/import_editor/view.js | 2 +- .../layer_addpanel/layer_wizard_select.tsx | 2 +- .../spatial_filters_panel.tsx | 2 +- .../fit_to_data/fit_to_data.tsx | 2 +- .../toc_entry_actions_popover.test.tsx | 6 ++-- .../toc_entry_actions_popover.tsx | 2 +- .../maps/public/embeddable/map_embeddable.tsx | 2 +- .../embeddable/map_embeddable_factory.ts | 2 +- x-pack/plugins/maps/public/index.scss | 2 +- .../maps/public/selectors/map_selectors.d.ts | 4 +-- .../maps/public/selectors/map_selectors.js | 18 +++++----- .../public/selectors/map_selectors.test.js | 12 +++---- 255 files changed, 169 insertions(+), 166 deletions(-) rename x-pack/plugins/maps/public/{layers => classes}/_index.scss (100%) rename x-pack/plugins/maps/public/{layers => classes}/fields/ems_file_field.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/fields/es_agg_field.test.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/fields/es_agg_field.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/fields/es_doc_field.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/fields/field.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/fields/kibana_region_field.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/fields/top_term_percentage_field.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/joins/inner_join.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/joins/inner_join.test.js (98%) rename x-pack/plugins/maps/public/{layers => classes}/joins/join.ts (100%) rename x-pack/plugins/maps/public/{layers => classes/layers/blended_vector_layer}/blended_vector_layer.ts (89%) rename x-pack/plugins/maps/public/{layers => classes/layers/heatmap_layer}/heatmap_layer.js (93%) rename x-pack/plugins/maps/public/{ => classes}/layers/layer.tsx (97%) rename x-pack/plugins/maps/public/{ => classes}/layers/layer_wizard_registry.ts (95%) rename x-pack/plugins/maps/public/{ => classes}/layers/load_layer_wizards.ts (68%) rename x-pack/plugins/maps/public/{ => classes}/layers/solution_layers/observability/create_layer_descriptor.test.ts (99%) rename x-pack/plugins/maps/public/{ => classes}/layers/solution_layers/observability/create_layer_descriptor.ts (92%) rename x-pack/plugins/maps/public/{ => classes}/layers/solution_layers/observability/display_select.tsx (100%) rename x-pack/plugins/maps/public/{ => classes}/layers/solution_layers/observability/index.ts (100%) rename x-pack/plugins/maps/public/{ => classes}/layers/solution_layers/observability/layer_select.tsx (100%) rename x-pack/plugins/maps/public/{ => classes}/layers/solution_layers/observability/metric_select.tsx (100%) rename x-pack/plugins/maps/public/{ => classes}/layers/solution_layers/observability/observability_layer_template.tsx (100%) rename x-pack/plugins/maps/public/{ => classes}/layers/solution_layers/observability/observability_layer_wizard.tsx (94%) rename x-pack/plugins/maps/public/{layers => classes/layers/tile_layer}/tile_layer.d.ts (71%) rename x-pack/plugins/maps/public/{layers => classes/layers/tile_layer}/tile_layer.js (95%) rename x-pack/plugins/maps/public/{layers => classes/layers/tile_layer}/tile_layer.test.ts (87%) rename x-pack/plugins/maps/public/{layers => classes/layers/tiled_vector_layer}/tiled_vector_layer.tsx (87%) rename x-pack/plugins/maps/public/{layers => classes/layers/vector_layer}/vector_layer.d.ts (82%) rename x-pack/plugins/maps/public/{layers => classes/layers/vector_layer}/vector_layer.js (98%) rename x-pack/plugins/maps/public/{layers => classes/layers/vector_tile_layer}/vector_tile_layer.js (97%) rename x-pack/plugins/maps/public/{layers => classes}/sources/client_file_source/create_client_file_source_editor.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/client_file_source/geojson_file_source.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/client_file_source/index.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/client_file_source/upload_layer_wizard.tsx (93%) rename x-pack/plugins/maps/public/{layers => classes}/sources/ems_file_source/create_source_editor.tsx (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/ems_file_source/ems_boundaries_layer_wizard.tsx (89%) rename x-pack/plugins/maps/public/{layers => classes}/sources/ems_file_source/ems_file_source.test.tsx (96%) rename x-pack/plugins/maps/public/{layers => classes}/sources/ems_file_source/ems_file_source.tsx (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/ems_file_source/index.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/ems_file_source/update_source_editor.tsx (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/ems_tms_source/ems_base_map_layer_wizard.tsx (87%) rename x-pack/plugins/maps/public/{layers => classes}/sources/ems_tms_source/ems_tms_source.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/ems_tms_source/ems_tms_source.test.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/ems_tms_source/index.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/ems_tms_source/tile_service_select.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/ems_tms_source/update_source_editor.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/ems_unavailable_message.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_agg_source/es_agg_source.d.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_agg_source/es_agg_source.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_agg_source/es_agg_source.test.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_agg_source/index.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_geo_grid_source/clusters_layer_wizard.tsx (95%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_geo_grid_source/convert_to_geojson.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_geo_grid_source/convert_to_geojson.test.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_geo_grid_source/create_source_editor.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_geo_grid_source/es_geo_grid_source.d.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_geo_grid_source/es_geo_grid_source.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_geo_grid_source/es_geo_grid_source.test.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_geo_grid_source/geo_tile_utils.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_geo_grid_source/geo_tile_utils.test.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_geo_grid_source/heatmap_layer_wizard.tsx (90%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_geo_grid_source/index.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_geo_grid_source/render_as_select.tsx (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_geo_grid_source/resolution_editor.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_geo_grid_source/update_source_editor.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_pew_pew_source/convert_to_lines.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_pew_pew_source/convert_to_lines.test.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_pew_pew_source/create_source_editor.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_pew_pew_source/es_pew_pew_source.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_pew_pew_source/index.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_pew_pew_source/point_2_point_layer_wizard.tsx (94%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_pew_pew_source/update_source_editor.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_search_source/__snapshots__/scaling_form.test.tsx.snap (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_search_source/__snapshots__/update_source_editor.test.js.snap (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_search_source/constants.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_search_source/create_source_editor.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_search_source/es_documents_layer_wizard.tsx (85%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_search_source/es_search_source.d.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_search_source/es_search_source.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_search_source/index.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_search_source/load_index_settings.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_search_source/scaling_form.test.tsx (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_search_source/scaling_form.tsx (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_search_source/update_source_editor.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_search_source/update_source_editor.test.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_source/es_source.d.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_source/es_source.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_source/index.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_term_source/es_term_source.d.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_term_source/es_term_source.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_term_source/es_term_source.test.js (98%) rename x-pack/plugins/maps/public/{layers => classes}/sources/es_term_source/index.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/kibana_regionmap_source/create_source_editor.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/kibana_regionmap_source/index.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/kibana_regionmap_source/kibana_regionmap_layer_wizard.tsx (89%) rename x-pack/plugins/maps/public/{layers => classes}/sources/kibana_regionmap_source/kibana_regionmap_source.d.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/kibana_regionmap_source/kibana_regionmap_source.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/kibana_tilemap_source/create_source_editor.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/kibana_tilemap_source/index.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/kibana_tilemap_source/kibana_base_map_layer_wizard.tsx (89%) rename x-pack/plugins/maps/public/{layers => classes}/sources/kibana_tilemap_source/kibana_tilemap_source.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/mvt_single_layer_vector_source/index.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/mvt_single_layer_vector_source/layer_wizard.tsx (87%) rename x-pack/plugins/maps/public/{layers => classes}/sources/mvt_single_layer_vector_source/mvt_single_layer_vector_source.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/mvt_single_layer_vector_source/mvt_single_layer_vector_source_editor.tsx (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/source.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/source_registry.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/tms_source/index.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/tms_source/tms_source.d.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/tms_source/tms_source.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/vector_feature_types.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/vector_source/index.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/vector_source/vector_source.d.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/vector_source/vector_source.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/wms_source/index.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/wms_source/wms_client.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/wms_source/wms_client.test.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/wms_source/wms_create_source_editor.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/wms_source/wms_layer_wizard.tsx (88%) rename x-pack/plugins/maps/public/{layers => classes}/sources/wms_source/wms_source.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/xyz_tms_source/index.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/xyz_tms_source/layer_wizard.tsx (87%) rename x-pack/plugins/maps/public/{layers => classes}/sources/xyz_tms_source/xyz_tms_editor.tsx (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/xyz_tms_source/xyz_tms_source.test.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/sources/xyz_tms_source/xyz_tms_source.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/_index.scss (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/color_utils.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/color_utils.test.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/components/_color_gradient.scss (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/components/color_gradient.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/components/ranged_style_legend_row.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/heatmap/components/__snapshots__/heatmap_style_editor.test.js.snap (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/heatmap/components/heatmap_constants.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/heatmap/components/heatmap_style_editor.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/heatmap/components/heatmap_style_editor.test.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/heatmap/components/legend/heatmap_legend.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/heatmap/heatmap_style.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/style.ts (97%) rename x-pack/plugins/maps/public/{layers => classes}/styles/tile/tile_style.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/_style_prop_editor.scss (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/color/_color_stops.scss (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/color/color_map_select.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/color/color_stops.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/color/color_stops_categorical.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/color/color_stops_ordinal.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/color/color_stops_utils.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/color/dynamic_color_form.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/color/mb_validated_color_picker.tsx (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/color/static_color_form.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/color/vector_style_color_editor.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/field_meta/categorical_field_meta_popover.tsx (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/field_meta/field_meta_popover.tsx (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/field_meta/ordinal_field_meta_popover.tsx (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/field_select.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/get_vector_style_label.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/label/dynamic_label_form.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/label/static_label_form.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/label/vector_style_label_border_size_editor.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/label/vector_style_label_editor.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/legend/__snapshots__/vector_icon.test.js.snap (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/legend/category.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/legend/circle_icon.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/legend/extract_color_from_style_property.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/legend/line_icon.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/legend/polygon_icon.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/legend/symbol_icon.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/legend/vector_icon.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/legend/vector_icon.test.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/legend/vector_style_legend.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/orientation/dynamic_orientation_form.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/orientation/orientation_editor.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/orientation/static_orientation_form.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/size/dynamic_size_form.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/size/size_range_selector.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/size/static_size_form.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/size/vector_style_size_editor.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/stop_input.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/style_map_select.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/style_option_shapes.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/style_prop_editor.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/symbol/__snapshots__/icon_select.test.js.snap (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/symbol/_icon_select.scss (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/symbol/dynamic_icon_form.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/symbol/icon_map_select.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/symbol/icon_select.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/symbol/icon_select.test.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/symbol/icon_stops.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/symbol/icon_stops.test.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/symbol/static_icon_form.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/symbol/vector_style_icon_editor.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/symbol/vector_style_symbolize_as_editor.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/components/vector_style_editor.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/properties/__snapshots__/dynamic_color_property.test.js.snap (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/properties/components/categorical_legend.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/properties/components/ordinal_legend.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/properties/dynamic_color_property.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/properties/dynamic_color_property.test.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/properties/dynamic_icon_property.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/properties/dynamic_orientation_property.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/properties/dynamic_size_property.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/properties/dynamic_style_property.d.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/properties/dynamic_style_property.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/properties/dynamic_text_property.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/properties/label_border_size_property.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/properties/static_color_property.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/properties/static_icon_property.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/properties/static_orientation_property.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/properties/static_size_property.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/properties/static_style_property.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/properties/static_text_property.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/properties/style_property.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/properties/symbolize_as_property.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/style_meta.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/style_util.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/style_util.test.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/symbol_utils.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/symbol_utils.test.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/vector_style.d.ts (94%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/vector_style.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/vector_style.test.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/styles/vector/vector_style_defaults.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/tooltips/es_agg_tooltip_property.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/tooltips/es_tooltip_property.test.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/tooltips/es_tooltip_property.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/tooltips/join_tooltip_property.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/tooltips/tooltip_property.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/util/assign_feature_ids.test.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/util/assign_feature_ids.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/util/can_skip_fetch.test.js (100%) rename x-pack/plugins/maps/public/{layers => classes}/util/can_skip_fetch.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/util/data_request.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/util/es_agg_utils.test.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/util/es_agg_utils.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/util/is_metric_countable.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/util/is_refresh_only_query.ts (100%) rename x-pack/plugins/maps/public/{layers => classes}/util/mb_filter_expressions.ts (100%) diff --git a/x-pack/legacy/plugins/maps/public/index.ts b/x-pack/legacy/plugins/maps/public/index.ts index 98db26859297b..e1532cac858ac 100644 --- a/x-pack/legacy/plugins/maps/public/index.ts +++ b/x-pack/legacy/plugins/maps/public/index.ts @@ -30,5 +30,5 @@ export const plugin = () => { export { RenderTooltipContentParams, ITooltipProperty, -} from '../../../../plugins/maps/public/layers/tooltips/tooltip_property'; +} from '../../../../plugins/maps/public/classes/tooltips/tooltip_property'; export { MapEmbeddable, MapEmbeddableInput } from '../../../../plugins/maps/public/embeddable'; diff --git a/x-pack/plugins/maps/public/angular/get_initial_layers.js b/x-pack/plugins/maps/public/angular/get_initial_layers.js index 09f66740af372..598fd6ce324d0 100644 --- a/x-pack/plugins/maps/public/angular/get_initial_layers.js +++ b/x-pack/plugins/maps/public/angular/get_initial_layers.js @@ -5,17 +5,17 @@ */ import _ from 'lodash'; // Import each layer type, even those not used, to init in registry -import '../layers/sources/wms_source'; -import '../layers/sources/ems_file_source'; -import '../layers/sources/es_search_source'; -import '../layers/sources/es_pew_pew_source'; -import '../layers/sources/kibana_regionmap_source'; -import '../layers/sources/es_geo_grid_source'; -import '../layers/sources/xyz_tms_source'; -import { KibanaTilemapSource } from '../layers/sources/kibana_tilemap_source'; -import { TileLayer } from '../layers/tile_layer'; -import { EMSTMSSource } from '../layers/sources/ems_tms_source'; -import { VectorTileLayer } from '../layers/vector_tile_layer'; +import '../classes/sources/wms_source'; +import '../classes/sources/ems_file_source'; +import '../classes/sources/es_search_source'; +import '../classes/sources/es_pew_pew_source'; +import '../classes/sources/kibana_regionmap_source'; +import '../classes/sources/es_geo_grid_source'; +import '../classes/sources/xyz_tms_source'; +import { KibanaTilemapSource } from '../classes/sources/kibana_tilemap_source'; +import { TileLayer } from '../classes/layers/tile_layer/tile_layer'; +import { EMSTMSSource } from '../classes/sources/ems_tms_source'; +import { VectorTileLayer } from '../classes/layers/vector_tile_layer/vector_tile_layer'; import { getIsEmsEnabled } from '../kibana_services'; import { getKibanaTileMap } from '../meta'; diff --git a/x-pack/plugins/maps/public/layers/_index.scss b/x-pack/plugins/maps/public/classes/_index.scss similarity index 100% rename from x-pack/plugins/maps/public/layers/_index.scss rename to x-pack/plugins/maps/public/classes/_index.scss diff --git a/x-pack/plugins/maps/public/layers/fields/ems_file_field.ts b/x-pack/plugins/maps/public/classes/fields/ems_file_field.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/fields/ems_file_field.ts rename to x-pack/plugins/maps/public/classes/fields/ems_file_field.ts diff --git a/x-pack/plugins/maps/public/layers/fields/es_agg_field.test.ts b/x-pack/plugins/maps/public/classes/fields/es_agg_field.test.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/fields/es_agg_field.test.ts rename to x-pack/plugins/maps/public/classes/fields/es_agg_field.test.ts diff --git a/x-pack/plugins/maps/public/layers/fields/es_agg_field.ts b/x-pack/plugins/maps/public/classes/fields/es_agg_field.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/fields/es_agg_field.ts rename to x-pack/plugins/maps/public/classes/fields/es_agg_field.ts diff --git a/x-pack/plugins/maps/public/layers/fields/es_doc_field.ts b/x-pack/plugins/maps/public/classes/fields/es_doc_field.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/fields/es_doc_field.ts rename to x-pack/plugins/maps/public/classes/fields/es_doc_field.ts diff --git a/x-pack/plugins/maps/public/layers/fields/field.ts b/x-pack/plugins/maps/public/classes/fields/field.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/fields/field.ts rename to x-pack/plugins/maps/public/classes/fields/field.ts diff --git a/x-pack/plugins/maps/public/layers/fields/kibana_region_field.ts b/x-pack/plugins/maps/public/classes/fields/kibana_region_field.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/fields/kibana_region_field.ts rename to x-pack/plugins/maps/public/classes/fields/kibana_region_field.ts diff --git a/x-pack/plugins/maps/public/layers/fields/top_term_percentage_field.ts b/x-pack/plugins/maps/public/classes/fields/top_term_percentage_field.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/fields/top_term_percentage_field.ts rename to x-pack/plugins/maps/public/classes/fields/top_term_percentage_field.ts diff --git a/x-pack/plugins/maps/public/layers/joins/inner_join.js b/x-pack/plugins/maps/public/classes/joins/inner_join.js similarity index 100% rename from x-pack/plugins/maps/public/layers/joins/inner_join.js rename to x-pack/plugins/maps/public/classes/joins/inner_join.js diff --git a/x-pack/plugins/maps/public/layers/joins/inner_join.test.js b/x-pack/plugins/maps/public/classes/joins/inner_join.test.js similarity index 98% rename from x-pack/plugins/maps/public/layers/joins/inner_join.test.js rename to x-pack/plugins/maps/public/classes/joins/inner_join.test.js index f197a67becfae..ca40ab1ea7db7 100644 --- a/x-pack/plugins/maps/public/layers/joins/inner_join.test.js +++ b/x-pack/plugins/maps/public/classes/joins/inner_join.test.js @@ -7,7 +7,7 @@ import { InnerJoin } from './inner_join'; jest.mock('../../kibana_services', () => {}); -jest.mock('../vector_layer', () => {}); +jest.mock('../layers/vector_layer/vector_layer', () => {}); const rightSource = { id: 'd3625663-5b34-4d50-a784-0d743f676a0c', diff --git a/x-pack/plugins/maps/public/layers/joins/join.ts b/x-pack/plugins/maps/public/classes/joins/join.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/joins/join.ts rename to x-pack/plugins/maps/public/classes/joins/join.ts diff --git a/x-pack/plugins/maps/public/layers/blended_vector_layer.ts b/x-pack/plugins/maps/public/classes/layers/blended_vector_layer/blended_vector_layer.ts similarity index 89% rename from x-pack/plugins/maps/public/layers/blended_vector_layer.ts rename to x-pack/plugins/maps/public/classes/layers/blended_vector_layer/blended_vector_layer.ts index adf04b4155659..b5b824c8594c3 100644 --- a/x-pack/plugins/maps/public/layers/blended_vector_layer.ts +++ b/x-pack/plugins/maps/public/classes/layers/blended_vector_layer/blended_vector_layer.ts @@ -5,11 +5,11 @@ */ import { i18n } from '@kbn/i18n'; -import { VectorLayer } from './vector_layer'; -import { IVectorStyle, VectorStyle } from './styles/vector/vector_style'; -import { getDefaultDynamicProperties } from './styles/vector/vector_style_defaults'; -import { IDynamicStyleProperty } from './styles/vector/properties/dynamic_style_property'; -import { IStyleProperty } from './styles/vector/properties/style_property'; +import { VectorLayer } from '../vector_layer/vector_layer'; +import { IVectorStyle, VectorStyle } from '../../styles/vector/vector_style'; +import { getDefaultDynamicProperties } from '../../styles/vector/vector_style_defaults'; +import { IDynamicStyleProperty } from '../../styles/vector/properties/dynamic_style_property'; +import { IStyleProperty } from '../../styles/vector/properties/style_property'; import { SOURCE_TYPES, COUNT_PROP_LABEL, @@ -21,23 +21,23 @@ import { VECTOR_STYLES, LAYER_STYLE_TYPE, FIELD_ORIGIN, -} from '../../common/constants'; -import { ESGeoGridSource } from './sources/es_geo_grid_source/es_geo_grid_source'; -import { canSkipSourceUpdate } from './util/can_skip_fetch'; -import { IVectorLayer } from './vector_layer'; -import { IESSource } from './sources/es_source'; -import { IESAggSource } from './sources/es_agg_source'; -import { ISource } from './sources/source'; -import { SyncContext } from '../actions/map_actions'; -import { DataRequestAbortError } from './util/data_request'; +} from '../../../../common/constants'; +import { ESGeoGridSource } from '../../sources/es_geo_grid_source/es_geo_grid_source'; +import { canSkipSourceUpdate } from '../../util/can_skip_fetch'; +import { IVectorLayer } from '../vector_layer/vector_layer'; +import { IESSource } from '../../sources/es_source'; +import { IESAggSource } from '../../sources/es_agg_source'; +import { ISource } from '../../sources/source'; +import { SyncContext } from '../../../actions/map_actions'; +import { DataRequestAbortError } from '../../util/data_request'; import { VectorStyleDescriptor, SizeDynamicOptions, DynamicStylePropertyOptions, VectorLayerDescriptor, -} from '../../common/descriptor_types'; -import { IStyle } from './styles/style'; -import { IVectorSource } from './sources/vector_source'; +} from '../../../../common/descriptor_types'; +import { IStyle } from '../../styles/style'; +import { IVectorSource } from '../../sources/vector_source'; const ACTIVE_COUNT_DATA_ID = 'ACTIVE_COUNT_DATA_ID'; diff --git a/x-pack/plugins/maps/public/layers/heatmap_layer.js b/x-pack/plugins/maps/public/classes/layers/heatmap_layer/heatmap_layer.js similarity index 93% rename from x-pack/plugins/maps/public/layers/heatmap_layer.js rename to x-pack/plugins/maps/public/classes/layers/heatmap_layer/heatmap_layer.js index 22f7a92c17c51..f6b9bd6280290 100644 --- a/x-pack/plugins/maps/public/layers/heatmap_layer.js +++ b/x-pack/plugins/maps/public/classes/layers/heatmap_layer/heatmap_layer.js @@ -4,10 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ -import { AbstractLayer } from './layer'; -import { VectorLayer } from './vector_layer'; -import { HeatmapStyle } from './styles/heatmap/heatmap_style'; -import { EMPTY_FEATURE_COLLECTION, LAYER_TYPE } from '../../common/constants'; +import { AbstractLayer } from '../layer'; +import { VectorLayer } from '../vector_layer/vector_layer'; +import { HeatmapStyle } from '../../styles/heatmap/heatmap_style'; +import { EMPTY_FEATURE_COLLECTION, LAYER_TYPE } from '../../../../common/constants'; const SCALED_PROPERTY_NAME = '__kbn_heatmap_weight__'; //unique name to store scaled value for weighting diff --git a/x-pack/plugins/maps/public/layers/layer.tsx b/x-pack/plugins/maps/public/classes/layers/layer.tsx similarity index 97% rename from x-pack/plugins/maps/public/layers/layer.tsx rename to x-pack/plugins/maps/public/classes/layers/layer.tsx index 8ecaf4d903251..c46d22ef0bd88 100644 --- a/x-pack/plugins/maps/public/layers/layer.tsx +++ b/x-pack/plugins/maps/public/classes/layers/layer.tsx @@ -12,25 +12,25 @@ import { EuiIcon, EuiLoadingSpinner } from '@elastic/eui'; import uuid from 'uuid/v4'; import { i18n } from '@kbn/i18n'; import { FeatureCollection } from 'geojson'; -import { DataRequest } from './util/data_request'; +import { DataRequest } from '../util/data_request'; import { MAX_ZOOM, MB_SOURCE_ID_LAYER_ID_PREFIX_DELIMITER, MIN_ZOOM, SOURCE_DATA_ID_ORIGIN, -} from '../../common/constants'; +} from '../../../common/constants'; // @ts-ignore // eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { copyPersistentState } from '../reducers/util.js'; +import { copyPersistentState } from '../../reducers/util.js'; import { LayerDescriptor, MapExtent, MapFilters, StyleDescriptor, -} from '../../common/descriptor_types'; -import { Attribution, ImmutableSourceProperty, ISource, SourceEditorArgs } from './sources/source'; -import { SyncContext } from '../actions/map_actions'; -import { IStyle } from './styles/style'; +} from '../../../common/descriptor_types'; +import { Attribution, ImmutableSourceProperty, ISource, SourceEditorArgs } from '../sources/source'; +import { SyncContext } from '../../actions/map_actions'; +import { IStyle } from '../styles/style'; export interface ILayer { getBounds(mapFilters: MapFilters): Promise; diff --git a/x-pack/plugins/maps/public/layers/layer_wizard_registry.ts b/x-pack/plugins/maps/public/classes/layers/layer_wizard_registry.ts similarity index 95% rename from x-pack/plugins/maps/public/layers/layer_wizard_registry.ts rename to x-pack/plugins/maps/public/classes/layers/layer_wizard_registry.ts index f866fc10b1f47..7a2a038c1b286 100644 --- a/x-pack/plugins/maps/public/layers/layer_wizard_registry.ts +++ b/x-pack/plugins/maps/public/classes/layers/layer_wizard_registry.ts @@ -6,7 +6,7 @@ /* eslint-disable @typescript-eslint/consistent-type-definitions */ import { ReactElement } from 'react'; -import { LayerDescriptor } from '../../common/descriptor_types'; +import { LayerDescriptor } from '../../../common/descriptor_types'; export type RenderWizardArguments = { previewLayer: (layerDescriptor: LayerDescriptor | null, isIndexingSource?: boolean) => void; diff --git a/x-pack/plugins/maps/public/layers/load_layer_wizards.ts b/x-pack/plugins/maps/public/classes/layers/load_layer_wizards.ts similarity index 68% rename from x-pack/plugins/maps/public/layers/load_layer_wizards.ts rename to x-pack/plugins/maps/public/classes/layers/load_layer_wizards.ts index 098ff51791d79..590c1a9d6ae44 100644 --- a/x-pack/plugins/maps/public/layers/load_layer_wizards.ts +++ b/x-pack/plugins/maps/public/classes/layers/load_layer_wizards.ts @@ -6,27 +6,27 @@ import { registerLayerWizard } from './layer_wizard_registry'; // @ts-ignore -import { uploadLayerWizardConfig } from './sources/client_file_source'; +import { uploadLayerWizardConfig } from '../sources/client_file_source'; // @ts-ignore -import { esDocumentsLayerWizardConfig } from './sources/es_search_source'; +import { esDocumentsLayerWizardConfig } from '../sources/es_search_source'; // @ts-ignore -import { clustersLayerWizardConfig, heatmapLayerWizardConfig } from './sources/es_geo_grid_source'; +import { clustersLayerWizardConfig, heatmapLayerWizardConfig } from '../sources/es_geo_grid_source'; // @ts-ignore -import { point2PointLayerWizardConfig } from './sources/es_pew_pew_source'; +import { point2PointLayerWizardConfig } from '../sources/es_pew_pew_source'; // @ts-ignore -import { emsBoundariesLayerWizardConfig } from './sources/ems_file_source'; +import { emsBoundariesLayerWizardConfig } from '../sources/ems_file_source'; // @ts-ignore -import { emsBaseMapLayerWizardConfig } from './sources/ems_tms_source'; +import { emsBaseMapLayerWizardConfig } from '../sources/ems_tms_source'; // @ts-ignore -import { kibanaRegionMapLayerWizardConfig } from './sources/kibana_regionmap_source'; +import { kibanaRegionMapLayerWizardConfig } from '../sources/kibana_regionmap_source'; // @ts-ignore -import { kibanaBasemapLayerWizardConfig } from './sources/kibana_tilemap_source'; -import { tmsLayerWizardConfig } from './sources/xyz_tms_source'; +import { kibanaBasemapLayerWizardConfig } from '../sources/kibana_tilemap_source'; +import { tmsLayerWizardConfig } from '../sources/xyz_tms_source'; // @ts-ignore -import { wmsLayerWizardConfig } from './sources/wms_source'; -import { mvtVectorSourceWizardConfig } from './sources/mvt_single_layer_vector_source'; +import { wmsLayerWizardConfig } from '../sources/wms_source'; +import { mvtVectorSourceWizardConfig } from '../sources/mvt_single_layer_vector_source'; import { ObservabilityLayerWizardConfig } from './solution_layers/observability'; -import { getInjectedVarFunc } from '../kibana_services'; +import { getInjectedVarFunc } from '../../kibana_services'; let registered = false; export function registerLayerWizards() { diff --git a/x-pack/plugins/maps/public/layers/solution_layers/observability/create_layer_descriptor.test.ts b/x-pack/plugins/maps/public/classes/layers/solution_layers/observability/create_layer_descriptor.test.ts similarity index 99% rename from x-pack/plugins/maps/public/layers/solution_layers/observability/create_layer_descriptor.test.ts rename to x-pack/plugins/maps/public/classes/layers/solution_layers/observability/create_layer_descriptor.test.ts index 6c0b6cdc39b85..ce079d67c15e4 100644 --- a/x-pack/plugins/maps/public/layers/solution_layers/observability/create_layer_descriptor.test.ts +++ b/x-pack/plugins/maps/public/classes/layers/solution_layers/observability/create_layer_descriptor.test.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -jest.mock('../../../kibana_services', () => { +jest.mock('../../../../kibana_services', () => { const mockUiSettings = { get: () => { return undefined; diff --git a/x-pack/plugins/maps/public/layers/solution_layers/observability/create_layer_descriptor.ts b/x-pack/plugins/maps/public/classes/layers/solution_layers/observability/create_layer_descriptor.ts similarity index 92% rename from x-pack/plugins/maps/public/layers/solution_layers/observability/create_layer_descriptor.ts rename to x-pack/plugins/maps/public/classes/layers/solution_layers/observability/create_layer_descriptor.ts index e2833d5abd0c2..ba019f97b287f 100644 --- a/x-pack/plugins/maps/public/layers/solution_layers/observability/create_layer_descriptor.ts +++ b/x-pack/plugins/maps/public/classes/layers/solution_layers/observability/create_layer_descriptor.ts @@ -13,7 +13,7 @@ import { SizeDynamicOptions, StylePropertyField, VectorStylePropertiesDescriptor, -} from '../../../../common/descriptor_types'; +} from '../../../../../common/descriptor_types'; import { AGG_TYPE, COLOR_MAP_TYPE, @@ -23,20 +23,20 @@ import { SOURCE_TYPES, STYLE_TYPE, VECTOR_STYLES, -} from '../../../../common/constants'; -import { getJoinAggKey, getSourceAggKey } from '../../../../common/get_agg_key'; +} from '../../../../../common/constants'; +import { getJoinAggKey, getSourceAggKey } from '../../../../../common/get_agg_key'; import { OBSERVABILITY_LAYER_TYPE } from './layer_select'; import { OBSERVABILITY_METRIC_TYPE } from './metric_select'; import { DISPLAY } from './display_select'; -import { VectorStyle } from '../../styles/vector/vector_style'; +import { VectorStyle } from '../../../styles/vector/vector_style'; // @ts-ignore -import { EMSFileSource } from '../../sources/ems_file_source'; +import { EMSFileSource } from '../../../sources/ems_file_source'; // @ts-ignore -import { ESGeoGridSource } from '../../sources/es_geo_grid_source'; -import { VectorLayer } from '../../vector_layer'; +import { ESGeoGridSource } from '../../../sources/es_geo_grid_source'; +import { VectorLayer } from '../../vector_layer/vector_layer'; // @ts-ignore -import { HeatmapLayer } from '../../heatmap_layer'; -import { getDefaultDynamicProperties } from '../../styles/vector/vector_style_defaults'; +import { HeatmapLayer } from '../../heatmap_layer/heatmap_layer'; +import { getDefaultDynamicProperties } from '../../../styles/vector/vector_style_defaults'; // redefining APM constant to avoid making maps app depend on APM plugin export const APM_INDEX_PATTERN_ID = 'apm_static_index_pattern_id'; diff --git a/x-pack/plugins/maps/public/layers/solution_layers/observability/display_select.tsx b/x-pack/plugins/maps/public/classes/layers/solution_layers/observability/display_select.tsx similarity index 100% rename from x-pack/plugins/maps/public/layers/solution_layers/observability/display_select.tsx rename to x-pack/plugins/maps/public/classes/layers/solution_layers/observability/display_select.tsx diff --git a/x-pack/plugins/maps/public/layers/solution_layers/observability/index.ts b/x-pack/plugins/maps/public/classes/layers/solution_layers/observability/index.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/solution_layers/observability/index.ts rename to x-pack/plugins/maps/public/classes/layers/solution_layers/observability/index.ts diff --git a/x-pack/plugins/maps/public/layers/solution_layers/observability/layer_select.tsx b/x-pack/plugins/maps/public/classes/layers/solution_layers/observability/layer_select.tsx similarity index 100% rename from x-pack/plugins/maps/public/layers/solution_layers/observability/layer_select.tsx rename to x-pack/plugins/maps/public/classes/layers/solution_layers/observability/layer_select.tsx diff --git a/x-pack/plugins/maps/public/layers/solution_layers/observability/metric_select.tsx b/x-pack/plugins/maps/public/classes/layers/solution_layers/observability/metric_select.tsx similarity index 100% rename from x-pack/plugins/maps/public/layers/solution_layers/observability/metric_select.tsx rename to x-pack/plugins/maps/public/classes/layers/solution_layers/observability/metric_select.tsx diff --git a/x-pack/plugins/maps/public/layers/solution_layers/observability/observability_layer_template.tsx b/x-pack/plugins/maps/public/classes/layers/solution_layers/observability/observability_layer_template.tsx similarity index 100% rename from x-pack/plugins/maps/public/layers/solution_layers/observability/observability_layer_template.tsx rename to x-pack/plugins/maps/public/classes/layers/solution_layers/observability/observability_layer_template.tsx diff --git a/x-pack/plugins/maps/public/layers/solution_layers/observability/observability_layer_wizard.tsx b/x-pack/plugins/maps/public/classes/layers/solution_layers/observability/observability_layer_wizard.tsx similarity index 94% rename from x-pack/plugins/maps/public/layers/solution_layers/observability/observability_layer_wizard.tsx rename to x-pack/plugins/maps/public/classes/layers/solution_layers/observability/observability_layer_wizard.tsx index 3fbb3157ae62a..db97c08596e06 100644 --- a/x-pack/plugins/maps/public/layers/solution_layers/observability/observability_layer_wizard.tsx +++ b/x-pack/plugins/maps/public/classes/layers/solution_layers/observability/observability_layer_wizard.tsx @@ -9,7 +9,7 @@ import { i18n } from '@kbn/i18n'; import { LayerWizard, RenderWizardArguments } from '../../layer_wizard_registry'; import { ObservabilityLayerTemplate } from './observability_layer_template'; import { APM_INDEX_PATTERN_ID } from './create_layer_descriptor'; -import { getIndexPatternService } from '../../../kibana_services'; +import { getIndexPatternService } from '../../../../kibana_services'; export const ObservabilityLayerWizardConfig: LayerWizard = { checkVisibility: async () => { diff --git a/x-pack/plugins/maps/public/layers/tile_layer.d.ts b/x-pack/plugins/maps/public/classes/layers/tile_layer/tile_layer.d.ts similarity index 71% rename from x-pack/plugins/maps/public/layers/tile_layer.d.ts rename to x-pack/plugins/maps/public/classes/layers/tile_layer/tile_layer.d.ts index 8a1ef0f172717..6f719d8abdcb9 100644 --- a/x-pack/plugins/maps/public/layers/tile_layer.d.ts +++ b/x-pack/plugins/maps/public/classes/layers/tile_layer/tile_layer.d.ts @@ -4,9 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ -import { AbstractLayer } from './layer'; -import { ITMSSource } from './sources/tms_source'; -import { LayerDescriptor } from '../../common/descriptor_types'; +import { AbstractLayer } from '../layer'; +import { ITMSSource } from '../../sources/tms_source'; +import { LayerDescriptor } from '../../../../common/descriptor_types'; interface ITileLayerArguments { source: ITMSSource; diff --git a/x-pack/plugins/maps/public/layers/tile_layer.js b/x-pack/plugins/maps/public/classes/layers/tile_layer/tile_layer.js similarity index 95% rename from x-pack/plugins/maps/public/layers/tile_layer.js rename to x-pack/plugins/maps/public/classes/layers/tile_layer/tile_layer.js index baded3c287637..69f5033e3af0f 100644 --- a/x-pack/plugins/maps/public/layers/tile_layer.js +++ b/x-pack/plugins/maps/public/classes/layers/tile_layer/tile_layer.js @@ -4,10 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ -import { AbstractLayer } from './layer'; +import { AbstractLayer } from '../layer'; import _ from 'lodash'; -import { SOURCE_DATA_ID_ORIGIN, LAYER_TYPE, LAYER_STYLE_TYPE } from '../../common/constants'; -import { TileStyle } from './styles/tile/tile_style'; +import { SOURCE_DATA_ID_ORIGIN, LAYER_TYPE, LAYER_STYLE_TYPE } from '../../../../common/constants'; +import { TileStyle } from '../../styles/tile/tile_style'; export class TileLayer extends AbstractLayer { static type = LAYER_TYPE.TILE; diff --git a/x-pack/plugins/maps/public/layers/tile_layer.test.ts b/x-pack/plugins/maps/public/classes/layers/tile_layer/tile_layer.test.ts similarity index 87% rename from x-pack/plugins/maps/public/layers/tile_layer.test.ts rename to x-pack/plugins/maps/public/classes/layers/tile_layer/tile_layer.test.ts index d536b18af4aad..7954d0c59d97f 100644 --- a/x-pack/plugins/maps/public/layers/tile_layer.test.ts +++ b/x-pack/plugins/maps/public/classes/layers/tile_layer/tile_layer.test.ts @@ -6,10 +6,10 @@ // eslint-disable-next-line max-classes-per-file import { ITileLayerArguments, TileLayer } from './tile_layer'; -import { SOURCE_TYPES } from '../../common/constants'; -import { XYZTMSSourceDescriptor } from '../../common/descriptor_types'; -import { ITMSSource, AbstractTMSSource } from './sources/tms_source'; -import { ILayer } from './layer'; +import { SOURCE_TYPES } from '../../../../common/constants'; +import { XYZTMSSourceDescriptor } from '../../../../common/descriptor_types'; +import { ITMSSource, AbstractTMSSource } from '../../sources/tms_source'; +import { ILayer } from '../layer'; const sourceDescriptor: XYZTMSSourceDescriptor = { type: SOURCE_TYPES.EMS_XYZ, diff --git a/x-pack/plugins/maps/public/layers/tiled_vector_layer.tsx b/x-pack/plugins/maps/public/classes/layers/tiled_vector_layer/tiled_vector_layer.tsx similarity index 87% rename from x-pack/plugins/maps/public/layers/tiled_vector_layer.tsx rename to x-pack/plugins/maps/public/classes/layers/tiled_vector_layer/tiled_vector_layer.tsx index 06c5ef579b221..bb4fbe9d01b60 100644 --- a/x-pack/plugins/maps/public/layers/tiled_vector_layer.tsx +++ b/x-pack/plugins/maps/public/classes/layers/tiled_vector_layer/tiled_vector_layer.tsx @@ -6,15 +6,18 @@ import React from 'react'; import { EuiIcon } from '@elastic/eui'; -import { VectorStyle } from './styles/vector/vector_style'; -import { SOURCE_DATA_ID_ORIGIN, LAYER_TYPE } from '../../common/constants'; -import { VectorLayer, VectorLayerArguments } from './vector_layer'; -import { canSkipSourceUpdate } from './util/can_skip_fetch'; -import { ITiledSingleLayerVectorSource } from './sources/vector_source'; -import { SyncContext } from '../actions/map_actions'; -import { ISource } from './sources/source'; -import { VectorLayerDescriptor, VectorSourceRequestMeta } from '../../common/descriptor_types'; -import { MVTSingleLayerVectorSourceConfig } from './sources/mvt_single_layer_vector_source/mvt_single_layer_vector_source_editor'; +import { VectorStyle } from '../../styles/vector/vector_style'; +import { SOURCE_DATA_ID_ORIGIN, LAYER_TYPE } from '../../../../common/constants'; +import { VectorLayer, VectorLayerArguments } from '../vector_layer/vector_layer'; +import { canSkipSourceUpdate } from '../../util/can_skip_fetch'; +import { ITiledSingleLayerVectorSource } from '../../sources/vector_source'; +import { SyncContext } from '../../../actions/map_actions'; +import { ISource } from '../../sources/source'; +import { + VectorLayerDescriptor, + VectorSourceRequestMeta, +} from '../../../../common/descriptor_types'; +import { MVTSingleLayerVectorSourceConfig } from '../../sources/mvt_single_layer_vector_source/mvt_single_layer_vector_source_editor'; export class TiledVectorLayer extends VectorLayer { static type = LAYER_TYPE.TILED_VECTOR; diff --git a/x-pack/plugins/maps/public/layers/vector_layer.d.ts b/x-pack/plugins/maps/public/classes/layers/vector_layer/vector_layer.d.ts similarity index 82% rename from x-pack/plugins/maps/public/layers/vector_layer.d.ts rename to x-pack/plugins/maps/public/classes/layers/vector_layer/vector_layer.d.ts index 710b95b045e71..73785d4cc04e0 100644 --- a/x-pack/plugins/maps/public/layers/vector_layer.d.ts +++ b/x-pack/plugins/maps/public/classes/layers/vector_layer/vector_layer.d.ts @@ -5,18 +5,18 @@ */ /* eslint-disable @typescript-eslint/consistent-type-definitions */ -import { AbstractLayer } from './layer'; -import { IVectorSource } from './sources/vector_source'; +import { AbstractLayer } from '../layer'; +import { IVectorSource } from '../../sources/vector_source'; import { MapFilters, VectorLayerDescriptor, VectorSourceRequestMeta, -} from '../../common/descriptor_types'; -import { ILayer } from './layer'; -import { IJoin } from './joins/join'; -import { IVectorStyle } from './styles/vector/vector_style'; -import { IField } from './fields/field'; -import { SyncContext } from '../actions/map_actions'; +} from '../../../../common/descriptor_types'; +import { ILayer } from '../layer'; +import { IJoin } from '../../joins/join'; +import { IVectorStyle } from '../../styles/vector/vector_style'; +import { IField } from '../../fields/field'; +import { SyncContext } from '../../../actions/map_actions'; export type VectorLayerArguments = { source: IVectorSource; diff --git a/x-pack/plugins/maps/public/layers/vector_layer.js b/x-pack/plugins/maps/public/classes/layers/vector_layer/vector_layer.js similarity index 98% rename from x-pack/plugins/maps/public/layers/vector_layer.js rename to x-pack/plugins/maps/public/classes/layers/vector_layer/vector_layer.js index 74ddf11c6beb4..6c04f7c19ac7d 100644 --- a/x-pack/plugins/maps/public/layers/vector_layer.js +++ b/x-pack/plugins/maps/public/classes/layers/vector_layer/vector_layer.js @@ -6,8 +6,8 @@ import turf from 'turf'; import React from 'react'; -import { AbstractLayer } from './layer'; -import { VectorStyle } from './styles/vector/vector_style'; +import { AbstractLayer } from '../layer'; +import { VectorStyle } from '../../styles/vector/vector_style'; import { FEATURE_ID_PROPERTY_NAME, SOURCE_DATA_ID_ORIGIN, @@ -18,23 +18,23 @@ import { LAYER_TYPE, FIELD_ORIGIN, LAYER_STYLE_TYPE, -} from '../../common/constants'; +} from '../../../../common/constants'; import _ from 'lodash'; -import { JoinTooltipProperty } from './tooltips/join_tooltip_property'; +import { JoinTooltipProperty } from '../../tooltips/join_tooltip_property'; import { EuiIcon } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { DataRequestAbortError } from './util/data_request'; +import { DataRequestAbortError } from '../../util/data_request'; import { canSkipSourceUpdate, canSkipStyleMetaUpdate, canSkipFormattersUpdate, -} from './util/can_skip_fetch'; -import { assignFeatureIds } from './util/assign_feature_ids'; +} from '../../util/can_skip_fetch'; +import { assignFeatureIds } from '../../util/assign_feature_ids'; import { getFillFilterExpression, getLineFilterExpression, getPointFilterExpression, -} from './util/mb_filter_expressions'; +} from '../../util/mb_filter_expressions'; export class VectorLayer extends AbstractLayer { static type = LAYER_TYPE.VECTOR; diff --git a/x-pack/plugins/maps/public/layers/vector_tile_layer.js b/x-pack/plugins/maps/public/classes/layers/vector_tile_layer/vector_tile_layer.js similarity index 97% rename from x-pack/plugins/maps/public/layers/vector_tile_layer.js rename to x-pack/plugins/maps/public/classes/layers/vector_tile_layer/vector_tile_layer.js index fc7812a2c86c7..fe1ff58922162 100644 --- a/x-pack/plugins/maps/public/layers/vector_tile_layer.js +++ b/x-pack/plugins/maps/public/classes/layers/vector_tile_layer/vector_tile_layer.js @@ -4,14 +4,14 @@ * you may not use this file except in compliance with the Elastic License. */ -import { TileLayer } from './tile_layer'; +import { TileLayer } from '../tile_layer/tile_layer'; import _ from 'lodash'; -import { SOURCE_DATA_ID_ORIGIN, LAYER_TYPE, LAYER_STYLE_TYPE } from '../../common/constants'; -import { isRetina } from '../meta'; +import { SOURCE_DATA_ID_ORIGIN, LAYER_TYPE, LAYER_STYLE_TYPE } from '../../../../common/constants'; +import { isRetina } from '../../../meta'; import { addSpriteSheetToMapFromImageData, loadSpriteSheetImageData, -} from '../connected_components/map/mb/utils'; //todo move this implementation +} from '../../../connected_components/map/mb/utils'; //todo move this implementation const MB_STYLE_TYPE_TO_OPACITY = { fill: ['fill-opacity'], diff --git a/x-pack/plugins/maps/public/layers/sources/client_file_source/create_client_file_source_editor.js b/x-pack/plugins/maps/public/classes/sources/client_file_source/create_client_file_source_editor.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/client_file_source/create_client_file_source_editor.js rename to x-pack/plugins/maps/public/classes/sources/client_file_source/create_client_file_source_editor.js diff --git a/x-pack/plugins/maps/public/layers/sources/client_file_source/geojson_file_source.js b/x-pack/plugins/maps/public/classes/sources/client_file_source/geojson_file_source.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/client_file_source/geojson_file_source.js rename to x-pack/plugins/maps/public/classes/sources/client_file_source/geojson_file_source.js diff --git a/x-pack/plugins/maps/public/layers/sources/client_file_source/index.js b/x-pack/plugins/maps/public/classes/sources/client_file_source/index.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/client_file_source/index.js rename to x-pack/plugins/maps/public/classes/sources/client_file_source/index.js diff --git a/x-pack/plugins/maps/public/layers/sources/client_file_source/upload_layer_wizard.tsx b/x-pack/plugins/maps/public/classes/sources/client_file_source/upload_layer_wizard.tsx similarity index 93% rename from x-pack/plugins/maps/public/layers/sources/client_file_source/upload_layer_wizard.tsx rename to x-pack/plugins/maps/public/classes/sources/client_file_source/upload_layer_wizard.tsx index 2f8aa67d74b52..d5ee354914e5c 100644 --- a/x-pack/plugins/maps/public/layers/sources/client_file_source/upload_layer_wizard.tsx +++ b/x-pack/plugins/maps/public/classes/sources/client_file_source/upload_layer_wizard.tsx @@ -13,13 +13,13 @@ import { SCALING_TYPES, } from '../../../../common/constants'; // @ts-ignore -import { ESSearchSource, createDefaultLayerDescriptor } from '../es_search_source'; -import { LayerWizard, RenderWizardArguments } from '../../layer_wizard_registry'; +import { createDefaultLayerDescriptor } from '../es_search_source'; +import { LayerWizard, RenderWizardArguments } from '../../layers/layer_wizard_registry'; // @ts-ignore import { ClientFileCreateSourceEditor } from './create_client_file_source_editor'; // @ts-ignore import { GeojsonFileSource } from './geojson_file_source'; -import { VectorLayer } from '../../vector_layer'; +import { VectorLayer } from '../../layers/vector_layer/vector_layer'; export const uploadLayerWizardConfig: LayerWizard = { description: i18n.translate('xpack.maps.source.geojsonFileDescription', { diff --git a/x-pack/plugins/maps/public/layers/sources/ems_file_source/create_source_editor.tsx b/x-pack/plugins/maps/public/classes/sources/ems_file_source/create_source_editor.tsx similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/ems_file_source/create_source_editor.tsx rename to x-pack/plugins/maps/public/classes/sources/ems_file_source/create_source_editor.tsx diff --git a/x-pack/plugins/maps/public/layers/sources/ems_file_source/ems_boundaries_layer_wizard.tsx b/x-pack/plugins/maps/public/classes/sources/ems_file_source/ems_boundaries_layer_wizard.tsx similarity index 89% rename from x-pack/plugins/maps/public/layers/sources/ems_file_source/ems_boundaries_layer_wizard.tsx rename to x-pack/plugins/maps/public/classes/sources/ems_file_source/ems_boundaries_layer_wizard.tsx index cc7e04a7313ac..4f1edca75b308 100644 --- a/x-pack/plugins/maps/public/layers/sources/ems_file_source/ems_boundaries_layer_wizard.tsx +++ b/x-pack/plugins/maps/public/classes/sources/ems_file_source/ems_boundaries_layer_wizard.tsx @@ -6,8 +6,8 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; -import { VectorLayer } from '../../vector_layer'; -import { LayerWizard, RenderWizardArguments } from '../../layer_wizard_registry'; +import { VectorLayer } from '../../layers/vector_layer/vector_layer'; +import { LayerWizard, RenderWizardArguments } from '../../layers/layer_wizard_registry'; import { EMSFileCreateSourceEditor } from './create_source_editor'; import { EMSFileSource, sourceTitle } from './ems_file_source'; // @ts-ignore diff --git a/x-pack/plugins/maps/public/layers/sources/ems_file_source/ems_file_source.test.tsx b/x-pack/plugins/maps/public/classes/sources/ems_file_source/ems_file_source.test.tsx similarity index 96% rename from x-pack/plugins/maps/public/layers/sources/ems_file_source/ems_file_source.test.tsx rename to x-pack/plugins/maps/public/classes/sources/ems_file_source/ems_file_source.test.tsx index 03e3b2a8f4941..24c111a72ac05 100644 --- a/x-pack/plugins/maps/public/layers/sources/ems_file_source/ems_file_source.test.tsx +++ b/x-pack/plugins/maps/public/classes/sources/ems_file_source/ems_file_source.test.tsx @@ -7,7 +7,7 @@ import { EMSFileSource } from './ems_file_source'; jest.mock('ui/new_platform'); -jest.mock('../../vector_layer', () => {}); +jest.mock('../../layers/vector_layer/vector_layer', () => {}); function makeEMSFileSource(tooltipProperties: string[]) { const emsFileSource = new EMSFileSource({ tooltipProperties }); diff --git a/x-pack/plugins/maps/public/layers/sources/ems_file_source/ems_file_source.tsx b/x-pack/plugins/maps/public/classes/sources/ems_file_source/ems_file_source.tsx similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/ems_file_source/ems_file_source.tsx rename to x-pack/plugins/maps/public/classes/sources/ems_file_source/ems_file_source.tsx diff --git a/x-pack/plugins/maps/public/layers/sources/ems_file_source/index.ts b/x-pack/plugins/maps/public/classes/sources/ems_file_source/index.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/ems_file_source/index.ts rename to x-pack/plugins/maps/public/classes/sources/ems_file_source/index.ts diff --git a/x-pack/plugins/maps/public/layers/sources/ems_file_source/update_source_editor.tsx b/x-pack/plugins/maps/public/classes/sources/ems_file_source/update_source_editor.tsx similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/ems_file_source/update_source_editor.tsx rename to x-pack/plugins/maps/public/classes/sources/ems_file_source/update_source_editor.tsx diff --git a/x-pack/plugins/maps/public/layers/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 similarity index 87% rename from x-pack/plugins/maps/public/layers/sources/ems_tms_source/ems_base_map_layer_wizard.tsx rename to x-pack/plugins/maps/public/classes/sources/ems_tms_source/ems_base_map_layer_wizard.tsx index 391ab5691938d..7a25609c6a5d1 100644 --- a/x-pack/plugins/maps/public/layers/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 @@ -5,11 +5,11 @@ */ import React from 'react'; import { i18n } from '@kbn/i18n'; -import { LayerWizard, RenderWizardArguments } from '../../layer_wizard_registry'; +import { LayerWizard, RenderWizardArguments } from '../../layers/layer_wizard_registry'; // @ts-ignore import { EMSTMSSource, sourceTitle } from './ems_tms_source'; // @ts-ignore -import { VectorTileLayer } from '../../vector_tile_layer'; +import { VectorTileLayer } from '../../layers/vector_tile_layer/vector_tile_layer'; // @ts-ignore import { TileServiceSelect } from './tile_service_select'; import { getIsEmsEnabled } from '../../../kibana_services'; diff --git a/x-pack/plugins/maps/public/layers/sources/ems_tms_source/ems_tms_source.js b/x-pack/plugins/maps/public/classes/sources/ems_tms_source/ems_tms_source.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/ems_tms_source/ems_tms_source.js rename to x-pack/plugins/maps/public/classes/sources/ems_tms_source/ems_tms_source.js diff --git a/x-pack/plugins/maps/public/layers/sources/ems_tms_source/ems_tms_source.test.js b/x-pack/plugins/maps/public/classes/sources/ems_tms_source/ems_tms_source.test.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/ems_tms_source/ems_tms_source.test.js rename to x-pack/plugins/maps/public/classes/sources/ems_tms_source/ems_tms_source.test.js diff --git a/x-pack/plugins/maps/public/layers/sources/ems_tms_source/index.js b/x-pack/plugins/maps/public/classes/sources/ems_tms_source/index.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/ems_tms_source/index.js rename to x-pack/plugins/maps/public/classes/sources/ems_tms_source/index.js diff --git a/x-pack/plugins/maps/public/layers/sources/ems_tms_source/tile_service_select.js b/x-pack/plugins/maps/public/classes/sources/ems_tms_source/tile_service_select.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/ems_tms_source/tile_service_select.js rename to x-pack/plugins/maps/public/classes/sources/ems_tms_source/tile_service_select.js diff --git a/x-pack/plugins/maps/public/layers/sources/ems_tms_source/update_source_editor.js b/x-pack/plugins/maps/public/classes/sources/ems_tms_source/update_source_editor.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/ems_tms_source/update_source_editor.js rename to x-pack/plugins/maps/public/classes/sources/ems_tms_source/update_source_editor.js diff --git a/x-pack/plugins/maps/public/layers/sources/ems_unavailable_message.ts b/x-pack/plugins/maps/public/classes/sources/ems_unavailable_message.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/ems_unavailable_message.ts rename to x-pack/plugins/maps/public/classes/sources/ems_unavailable_message.ts diff --git a/x-pack/plugins/maps/public/layers/sources/es_agg_source/es_agg_source.d.ts b/x-pack/plugins/maps/public/classes/sources/es_agg_source/es_agg_source.d.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/es_agg_source/es_agg_source.d.ts rename to x-pack/plugins/maps/public/classes/sources/es_agg_source/es_agg_source.d.ts diff --git a/x-pack/plugins/maps/public/layers/sources/es_agg_source/es_agg_source.js b/x-pack/plugins/maps/public/classes/sources/es_agg_source/es_agg_source.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/es_agg_source/es_agg_source.js rename to x-pack/plugins/maps/public/classes/sources/es_agg_source/es_agg_source.js diff --git a/x-pack/plugins/maps/public/layers/sources/es_agg_source/es_agg_source.test.ts b/x-pack/plugins/maps/public/classes/sources/es_agg_source/es_agg_source.test.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/es_agg_source/es_agg_source.test.ts rename to x-pack/plugins/maps/public/classes/sources/es_agg_source/es_agg_source.test.ts diff --git a/x-pack/plugins/maps/public/layers/sources/es_agg_source/index.ts b/x-pack/plugins/maps/public/classes/sources/es_agg_source/index.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/es_agg_source/index.ts rename to x-pack/plugins/maps/public/classes/sources/es_agg_source/index.ts diff --git a/x-pack/plugins/maps/public/layers/sources/es_geo_grid_source/clusters_layer_wizard.tsx b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/clusters_layer_wizard.tsx similarity index 95% rename from x-pack/plugins/maps/public/layers/sources/es_geo_grid_source/clusters_layer_wizard.tsx rename to x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/clusters_layer_wizard.tsx index f9092e64833f1..4e75ae8823385 100644 --- a/x-pack/plugins/maps/public/layers/sources/es_geo_grid_source/clusters_layer_wizard.tsx +++ b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/clusters_layer_wizard.tsx @@ -10,8 +10,8 @@ import React from 'react'; import { CreateSourceEditor } from './create_source_editor'; // @ts-ignore import { ESGeoGridSource, clustersTitle } from './es_geo_grid_source'; -import { LayerWizard, RenderWizardArguments } from '../../layer_wizard_registry'; -import { VectorLayer } from '../../vector_layer'; +import { LayerWizard, RenderWizardArguments } from '../../layers/layer_wizard_registry'; +import { VectorLayer } from '../../layers/vector_layer/vector_layer'; import { ESGeoGridSourceDescriptor, ColorDynamicOptions, diff --git a/x-pack/plugins/maps/public/layers/sources/es_geo_grid_source/convert_to_geojson.js b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/convert_to_geojson.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/es_geo_grid_source/convert_to_geojson.js rename to x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/convert_to_geojson.js diff --git a/x-pack/plugins/maps/public/layers/sources/es_geo_grid_source/convert_to_geojson.test.ts b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/convert_to_geojson.test.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/es_geo_grid_source/convert_to_geojson.test.ts rename to x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/convert_to_geojson.test.ts diff --git a/x-pack/plugins/maps/public/layers/sources/es_geo_grid_source/create_source_editor.js b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/create_source_editor.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/es_geo_grid_source/create_source_editor.js rename to x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/create_source_editor.js diff --git a/x-pack/plugins/maps/public/layers/sources/es_geo_grid_source/es_geo_grid_source.d.ts b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.d.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/es_geo_grid_source/es_geo_grid_source.d.ts rename to x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.d.ts diff --git a/x-pack/plugins/maps/public/layers/sources/es_geo_grid_source/es_geo_grid_source.js b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/es_geo_grid_source/es_geo_grid_source.js rename to x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.js diff --git a/x-pack/plugins/maps/public/layers/sources/es_geo_grid_source/es_geo_grid_source.test.ts b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.test.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/es_geo_grid_source/es_geo_grid_source.test.ts rename to x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.test.ts diff --git a/x-pack/plugins/maps/public/layers/sources/es_geo_grid_source/geo_tile_utils.js b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/geo_tile_utils.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/es_geo_grid_source/geo_tile_utils.js rename to x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/geo_tile_utils.js diff --git a/x-pack/plugins/maps/public/layers/sources/es_geo_grid_source/geo_tile_utils.test.js b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/geo_tile_utils.test.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/es_geo_grid_source/geo_tile_utils.test.js rename to x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/geo_tile_utils.test.js diff --git a/x-pack/plugins/maps/public/layers/sources/es_geo_grid_source/heatmap_layer_wizard.tsx b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/heatmap_layer_wizard.tsx similarity index 90% rename from x-pack/plugins/maps/public/layers/sources/es_geo_grid_source/heatmap_layer_wizard.tsx rename to x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/heatmap_layer_wizard.tsx index fee1a81a5c63a..d0e45cb05ca06 100644 --- a/x-pack/plugins/maps/public/layers/sources/es_geo_grid_source/heatmap_layer_wizard.tsx +++ b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/heatmap_layer_wizard.tsx @@ -10,9 +10,9 @@ import React from 'react'; import { CreateSourceEditor } from './create_source_editor'; // @ts-ignore import { ESGeoGridSource, heatmapTitle } from './es_geo_grid_source'; -import { LayerWizard, RenderWizardArguments } from '../../layer_wizard_registry'; +import { LayerWizard, RenderWizardArguments } from '../../layers/layer_wizard_registry'; // @ts-ignore -import { HeatmapLayer } from '../../heatmap_layer'; +import { HeatmapLayer } from '../../layers/heatmap_layer/heatmap_layer'; import { ESGeoGridSourceDescriptor } from '../../../../common/descriptor_types'; import { RENDER_AS } from '../../../../common/constants'; diff --git a/x-pack/plugins/maps/public/layers/sources/es_geo_grid_source/index.js b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/index.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/es_geo_grid_source/index.js rename to x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/index.js diff --git a/x-pack/plugins/maps/public/layers/sources/es_geo_grid_source/render_as_select.tsx b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/render_as_select.tsx similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/es_geo_grid_source/render_as_select.tsx rename to x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/render_as_select.tsx diff --git a/x-pack/plugins/maps/public/layers/sources/es_geo_grid_source/resolution_editor.js b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/resolution_editor.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/es_geo_grid_source/resolution_editor.js rename to x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/resolution_editor.js diff --git a/x-pack/plugins/maps/public/layers/sources/es_geo_grid_source/update_source_editor.js b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/update_source_editor.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/es_geo_grid_source/update_source_editor.js rename to x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/update_source_editor.js diff --git a/x-pack/plugins/maps/public/layers/sources/es_pew_pew_source/convert_to_lines.js b/x-pack/plugins/maps/public/classes/sources/es_pew_pew_source/convert_to_lines.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/es_pew_pew_source/convert_to_lines.js rename to x-pack/plugins/maps/public/classes/sources/es_pew_pew_source/convert_to_lines.js diff --git a/x-pack/plugins/maps/public/layers/sources/es_pew_pew_source/convert_to_lines.test.ts b/x-pack/plugins/maps/public/classes/sources/es_pew_pew_source/convert_to_lines.test.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/es_pew_pew_source/convert_to_lines.test.ts rename to x-pack/plugins/maps/public/classes/sources/es_pew_pew_source/convert_to_lines.test.ts diff --git a/x-pack/plugins/maps/public/layers/sources/es_pew_pew_source/create_source_editor.js b/x-pack/plugins/maps/public/classes/sources/es_pew_pew_source/create_source_editor.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/es_pew_pew_source/create_source_editor.js rename to x-pack/plugins/maps/public/classes/sources/es_pew_pew_source/create_source_editor.js diff --git a/x-pack/plugins/maps/public/layers/sources/es_pew_pew_source/es_pew_pew_source.js b/x-pack/plugins/maps/public/classes/sources/es_pew_pew_source/es_pew_pew_source.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/es_pew_pew_source/es_pew_pew_source.js rename to x-pack/plugins/maps/public/classes/sources/es_pew_pew_source/es_pew_pew_source.js diff --git a/x-pack/plugins/maps/public/layers/sources/es_pew_pew_source/index.js b/x-pack/plugins/maps/public/classes/sources/es_pew_pew_source/index.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/es_pew_pew_source/index.js rename to x-pack/plugins/maps/public/classes/sources/es_pew_pew_source/index.js diff --git a/x-pack/plugins/maps/public/layers/sources/es_pew_pew_source/point_2_point_layer_wizard.tsx b/x-pack/plugins/maps/public/classes/sources/es_pew_pew_source/point_2_point_layer_wizard.tsx similarity index 94% rename from x-pack/plugins/maps/public/layers/sources/es_pew_pew_source/point_2_point_layer_wizard.tsx rename to x-pack/plugins/maps/public/classes/sources/es_pew_pew_source/point_2_point_layer_wizard.tsx index 3ad6d64903d4a..bda1a6650c48a 100644 --- a/x-pack/plugins/maps/public/layers/sources/es_pew_pew_source/point_2_point_layer_wizard.tsx +++ b/x-pack/plugins/maps/public/classes/sources/es_pew_pew_source/point_2_point_layer_wizard.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; import { getDefaultDynamicProperties } from '../../styles/vector/vector_style_defaults'; -import { VectorLayer } from '../../vector_layer'; +import { VectorLayer } from '../../layers/vector_layer/vector_layer'; // @ts-ignore import { ESPewPewSource, sourceTitle } from './es_pew_pew_source'; import { VectorStyle } from '../../styles/vector/vector_style'; @@ -21,7 +21,7 @@ import { import { COLOR_GRADIENTS } from '../../styles/color_utils'; // @ts-ignore import { CreateSourceEditor } from './create_source_editor'; -import { LayerWizard, RenderWizardArguments } from '../../layer_wizard_registry'; +import { LayerWizard, RenderWizardArguments } from '../../layers/layer_wizard_registry'; import { ColorDynamicOptions, SizeDynamicOptions } from '../../../../common/descriptor_types'; export const point2PointLayerWizardConfig: LayerWizard = { diff --git a/x-pack/plugins/maps/public/layers/sources/es_pew_pew_source/update_source_editor.js b/x-pack/plugins/maps/public/classes/sources/es_pew_pew_source/update_source_editor.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/es_pew_pew_source/update_source_editor.js rename to x-pack/plugins/maps/public/classes/sources/es_pew_pew_source/update_source_editor.js diff --git a/x-pack/plugins/maps/public/layers/sources/es_search_source/__snapshots__/scaling_form.test.tsx.snap b/x-pack/plugins/maps/public/classes/sources/es_search_source/__snapshots__/scaling_form.test.tsx.snap similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/es_search_source/__snapshots__/scaling_form.test.tsx.snap rename to x-pack/plugins/maps/public/classes/sources/es_search_source/__snapshots__/scaling_form.test.tsx.snap diff --git a/x-pack/plugins/maps/public/layers/sources/es_search_source/__snapshots__/update_source_editor.test.js.snap b/x-pack/plugins/maps/public/classes/sources/es_search_source/__snapshots__/update_source_editor.test.js.snap similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/es_search_source/__snapshots__/update_source_editor.test.js.snap rename to x-pack/plugins/maps/public/classes/sources/es_search_source/__snapshots__/update_source_editor.test.js.snap diff --git a/x-pack/plugins/maps/public/layers/sources/es_search_source/constants.js b/x-pack/plugins/maps/public/classes/sources/es_search_source/constants.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/es_search_source/constants.js rename to x-pack/plugins/maps/public/classes/sources/es_search_source/constants.js diff --git a/x-pack/plugins/maps/public/layers/sources/es_search_source/create_source_editor.js b/x-pack/plugins/maps/public/classes/sources/es_search_source/create_source_editor.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/es_search_source/create_source_editor.js rename to x-pack/plugins/maps/public/classes/sources/es_search_source/create_source_editor.js diff --git a/x-pack/plugins/maps/public/layers/sources/es_search_source/es_documents_layer_wizard.tsx b/x-pack/plugins/maps/public/classes/sources/es_search_source/es_documents_layer_wizard.tsx similarity index 85% rename from x-pack/plugins/maps/public/layers/sources/es_search_source/es_documents_layer_wizard.tsx rename to x-pack/plugins/maps/public/classes/sources/es_search_source/es_documents_layer_wizard.tsx index 4a775dd78f787..8898735427ccb 100644 --- a/x-pack/plugins/maps/public/layers/sources/es_search_source/es_documents_layer_wizard.tsx +++ b/x-pack/plugins/maps/public/classes/sources/es_search_source/es_documents_layer_wizard.tsx @@ -8,11 +8,11 @@ import { i18n } from '@kbn/i18n'; import React from 'react'; // @ts-ignore import { CreateSourceEditor } from './create_source_editor'; -import { LayerWizard, RenderWizardArguments } from '../../layer_wizard_registry'; +import { LayerWizard, RenderWizardArguments } from '../../layers/layer_wizard_registry'; // @ts-ignore import { ESSearchSource, sourceTitle } from './es_search_source'; -import { BlendedVectorLayer } from '../../blended_vector_layer'; -import { VectorLayer } from '../../vector_layer'; +import { BlendedVectorLayer } from '../../layers/blended_vector_layer/blended_vector_layer'; +import { VectorLayer } from '../../layers/vector_layer/vector_layer'; import { SCALING_TYPES } from '../../../../common/constants'; export function createDefaultLayerDescriptor(sourceConfig: unknown, mapColors: string[]) { diff --git a/x-pack/plugins/maps/public/layers/sources/es_search_source/es_search_source.d.ts b/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.d.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/es_search_source/es_search_source.d.ts rename to x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.d.ts diff --git a/x-pack/plugins/maps/public/layers/sources/es_search_source/es_search_source.js b/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/es_search_source/es_search_source.js rename to x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.js diff --git a/x-pack/plugins/maps/public/layers/sources/es_search_source/index.js b/x-pack/plugins/maps/public/classes/sources/es_search_source/index.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/es_search_source/index.js rename to x-pack/plugins/maps/public/classes/sources/es_search_source/index.js diff --git a/x-pack/plugins/maps/public/layers/sources/es_search_source/load_index_settings.js b/x-pack/plugins/maps/public/classes/sources/es_search_source/load_index_settings.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/es_search_source/load_index_settings.js rename to x-pack/plugins/maps/public/classes/sources/es_search_source/load_index_settings.js diff --git a/x-pack/plugins/maps/public/layers/sources/es_search_source/scaling_form.test.tsx b/x-pack/plugins/maps/public/classes/sources/es_search_source/scaling_form.test.tsx similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/es_search_source/scaling_form.test.tsx rename to x-pack/plugins/maps/public/classes/sources/es_search_source/scaling_form.test.tsx diff --git a/x-pack/plugins/maps/public/layers/sources/es_search_source/scaling_form.tsx b/x-pack/plugins/maps/public/classes/sources/es_search_source/scaling_form.tsx similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/es_search_source/scaling_form.tsx rename to x-pack/plugins/maps/public/classes/sources/es_search_source/scaling_form.tsx diff --git a/x-pack/plugins/maps/public/layers/sources/es_search_source/update_source_editor.js b/x-pack/plugins/maps/public/classes/sources/es_search_source/update_source_editor.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/es_search_source/update_source_editor.js rename to x-pack/plugins/maps/public/classes/sources/es_search_source/update_source_editor.js diff --git a/x-pack/plugins/maps/public/layers/sources/es_search_source/update_source_editor.test.js b/x-pack/plugins/maps/public/classes/sources/es_search_source/update_source_editor.test.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/es_search_source/update_source_editor.test.js rename to x-pack/plugins/maps/public/classes/sources/es_search_source/update_source_editor.test.js diff --git a/x-pack/plugins/maps/public/layers/sources/es_source/es_source.d.ts b/x-pack/plugins/maps/public/classes/sources/es_source/es_source.d.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/es_source/es_source.d.ts rename to x-pack/plugins/maps/public/classes/sources/es_source/es_source.d.ts diff --git a/x-pack/plugins/maps/public/layers/sources/es_source/es_source.js b/x-pack/plugins/maps/public/classes/sources/es_source/es_source.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/es_source/es_source.js rename to x-pack/plugins/maps/public/classes/sources/es_source/es_source.js diff --git a/x-pack/plugins/maps/public/layers/sources/es_source/index.ts b/x-pack/plugins/maps/public/classes/sources/es_source/index.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/es_source/index.ts rename to x-pack/plugins/maps/public/classes/sources/es_source/index.ts diff --git a/x-pack/plugins/maps/public/layers/sources/es_term_source/es_term_source.d.ts b/x-pack/plugins/maps/public/classes/sources/es_term_source/es_term_source.d.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/es_term_source/es_term_source.d.ts rename to x-pack/plugins/maps/public/classes/sources/es_term_source/es_term_source.d.ts diff --git a/x-pack/plugins/maps/public/layers/sources/es_term_source/es_term_source.js b/x-pack/plugins/maps/public/classes/sources/es_term_source/es_term_source.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/es_term_source/es_term_source.js rename to x-pack/plugins/maps/public/classes/sources/es_term_source/es_term_source.js diff --git a/x-pack/plugins/maps/public/layers/sources/es_term_source/es_term_source.test.js b/x-pack/plugins/maps/public/classes/sources/es_term_source/es_term_source.test.js similarity index 98% rename from x-pack/plugins/maps/public/layers/sources/es_term_source/es_term_source.test.js rename to x-pack/plugins/maps/public/classes/sources/es_term_source/es_term_source.test.js index 14eb39180a6b8..f6779206868a5 100644 --- a/x-pack/plugins/maps/public/layers/sources/es_term_source/es_term_source.test.js +++ b/x-pack/plugins/maps/public/classes/sources/es_term_source/es_term_source.test.js @@ -7,7 +7,7 @@ import { ESTermSource, extractPropertiesMap } from './es_term_source'; jest.mock('ui/new_platform'); -jest.mock('../../vector_layer', () => {}); +jest.mock('../../layers/vector_layer/vector_layer', () => {}); const indexPatternTitle = 'myIndex'; const termFieldName = 'myTermField'; diff --git a/x-pack/plugins/maps/public/layers/sources/es_term_source/index.ts b/x-pack/plugins/maps/public/classes/sources/es_term_source/index.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/es_term_source/index.ts rename to x-pack/plugins/maps/public/classes/sources/es_term_source/index.ts diff --git a/x-pack/plugins/maps/public/layers/sources/kibana_regionmap_source/create_source_editor.js b/x-pack/plugins/maps/public/classes/sources/kibana_regionmap_source/create_source_editor.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/kibana_regionmap_source/create_source_editor.js rename to x-pack/plugins/maps/public/classes/sources/kibana_regionmap_source/create_source_editor.js diff --git a/x-pack/plugins/maps/public/layers/sources/kibana_regionmap_source/index.js b/x-pack/plugins/maps/public/classes/sources/kibana_regionmap_source/index.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/kibana_regionmap_source/index.js rename to x-pack/plugins/maps/public/classes/sources/kibana_regionmap_source/index.js diff --git a/x-pack/plugins/maps/public/layers/sources/kibana_regionmap_source/kibana_regionmap_layer_wizard.tsx b/x-pack/plugins/maps/public/classes/sources/kibana_regionmap_source/kibana_regionmap_layer_wizard.tsx similarity index 89% rename from x-pack/plugins/maps/public/layers/sources/kibana_regionmap_source/kibana_regionmap_layer_wizard.tsx rename to x-pack/plugins/maps/public/classes/sources/kibana_regionmap_source/kibana_regionmap_layer_wizard.tsx index a9adec2bda2c8..309cb3abd83b2 100644 --- a/x-pack/plugins/maps/public/layers/sources/kibana_regionmap_source/kibana_regionmap_layer_wizard.tsx +++ b/x-pack/plugins/maps/public/classes/sources/kibana_regionmap_source/kibana_regionmap_layer_wizard.tsx @@ -6,10 +6,10 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; -import { LayerWizard, RenderWizardArguments } from '../../layer_wizard_registry'; +import { LayerWizard, RenderWizardArguments } from '../../layers/layer_wizard_registry'; // @ts-ignore import { KibanaRegionmapSource, sourceTitle } from './kibana_regionmap_source'; -import { VectorLayer } from '../../vector_layer'; +import { VectorLayer } from '../../layers/vector_layer/vector_layer'; // @ts-ignore import { CreateSourceEditor } from './create_source_editor'; // @ts-ignore diff --git a/x-pack/plugins/maps/public/layers/sources/kibana_regionmap_source/kibana_regionmap_source.d.ts b/x-pack/plugins/maps/public/classes/sources/kibana_regionmap_source/kibana_regionmap_source.d.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/kibana_regionmap_source/kibana_regionmap_source.d.ts rename to x-pack/plugins/maps/public/classes/sources/kibana_regionmap_source/kibana_regionmap_source.d.ts diff --git a/x-pack/plugins/maps/public/layers/sources/kibana_regionmap_source/kibana_regionmap_source.js b/x-pack/plugins/maps/public/classes/sources/kibana_regionmap_source/kibana_regionmap_source.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/kibana_regionmap_source/kibana_regionmap_source.js rename to x-pack/plugins/maps/public/classes/sources/kibana_regionmap_source/kibana_regionmap_source.js diff --git a/x-pack/plugins/maps/public/layers/sources/kibana_tilemap_source/create_source_editor.js b/x-pack/plugins/maps/public/classes/sources/kibana_tilemap_source/create_source_editor.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/kibana_tilemap_source/create_source_editor.js rename to x-pack/plugins/maps/public/classes/sources/kibana_tilemap_source/create_source_editor.js diff --git a/x-pack/plugins/maps/public/layers/sources/kibana_tilemap_source/index.js b/x-pack/plugins/maps/public/classes/sources/kibana_tilemap_source/index.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/kibana_tilemap_source/index.js rename to x-pack/plugins/maps/public/classes/sources/kibana_tilemap_source/index.js diff --git a/x-pack/plugins/maps/public/layers/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 similarity index 89% rename from x-pack/plugins/maps/public/layers/sources/kibana_tilemap_source/kibana_base_map_layer_wizard.tsx rename to x-pack/plugins/maps/public/classes/sources/kibana_tilemap_source/kibana_base_map_layer_wizard.tsx index 3b4015641ede9..46513985ed1ab 100644 --- a/x-pack/plugins/maps/public/layers/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 @@ -6,12 +6,12 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; -import { LayerWizard, RenderWizardArguments } from '../../layer_wizard_registry'; +import { LayerWizard, RenderWizardArguments } from '../../layers/layer_wizard_registry'; // @ts-ignore import { CreateSourceEditor } from './create_source_editor'; // @ts-ignore import { KibanaTilemapSource, sourceTitle } from './kibana_tilemap_source'; -import { TileLayer } from '../../tile_layer'; +import { TileLayer } from '../../layers/tile_layer/tile_layer'; // @ts-ignore import { getKibanaTileMap } from '../../../meta'; diff --git a/x-pack/plugins/maps/public/layers/sources/kibana_tilemap_source/kibana_tilemap_source.js b/x-pack/plugins/maps/public/classes/sources/kibana_tilemap_source/kibana_tilemap_source.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/kibana_tilemap_source/kibana_tilemap_source.js rename to x-pack/plugins/maps/public/classes/sources/kibana_tilemap_source/kibana_tilemap_source.js diff --git a/x-pack/plugins/maps/public/layers/sources/mvt_single_layer_vector_source/index.ts b/x-pack/plugins/maps/public/classes/sources/mvt_single_layer_vector_source/index.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/mvt_single_layer_vector_source/index.ts rename to x-pack/plugins/maps/public/classes/sources/mvt_single_layer_vector_source/index.ts diff --git a/x-pack/plugins/maps/public/layers/sources/mvt_single_layer_vector_source/layer_wizard.tsx b/x-pack/plugins/maps/public/classes/sources/mvt_single_layer_vector_source/layer_wizard.tsx similarity index 87% rename from x-pack/plugins/maps/public/layers/sources/mvt_single_layer_vector_source/layer_wizard.tsx rename to x-pack/plugins/maps/public/classes/sources/mvt_single_layer_vector_source/layer_wizard.tsx index c94fec3deac67..86f8108d5e23b 100644 --- a/x-pack/plugins/maps/public/layers/sources/mvt_single_layer_vector_source/layer_wizard.tsx +++ b/x-pack/plugins/maps/public/classes/sources/mvt_single_layer_vector_source/layer_wizard.tsx @@ -11,8 +11,8 @@ import { MVTSingleLayerVectorSourceConfig, } from './mvt_single_layer_vector_source_editor'; import { MVTSingleLayerVectorSource, sourceTitle } from './mvt_single_layer_vector_source'; -import { LayerWizard, RenderWizardArguments } from '../../layer_wizard_registry'; -import { TiledVectorLayer } from '../../tiled_vector_layer'; +import { LayerWizard, RenderWizardArguments } from '../../layers/layer_wizard_registry'; +import { TiledVectorLayer } from '../../layers/tiled_vector_layer/tiled_vector_layer'; export const mvtVectorSourceWizardConfig: LayerWizard = { description: i18n.translate('xpack.maps.source.mvtVectorSourceWizard', { diff --git a/x-pack/plugins/maps/public/layers/sources/mvt_single_layer_vector_source/mvt_single_layer_vector_source.ts b/x-pack/plugins/maps/public/classes/sources/mvt_single_layer_vector_source/mvt_single_layer_vector_source.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/mvt_single_layer_vector_source/mvt_single_layer_vector_source.ts rename to x-pack/plugins/maps/public/classes/sources/mvt_single_layer_vector_source/mvt_single_layer_vector_source.ts diff --git a/x-pack/plugins/maps/public/layers/sources/mvt_single_layer_vector_source/mvt_single_layer_vector_source_editor.tsx b/x-pack/plugins/maps/public/classes/sources/mvt_single_layer_vector_source/mvt_single_layer_vector_source_editor.tsx similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/mvt_single_layer_vector_source/mvt_single_layer_vector_source_editor.tsx rename to x-pack/plugins/maps/public/classes/sources/mvt_single_layer_vector_source/mvt_single_layer_vector_source_editor.tsx diff --git a/x-pack/plugins/maps/public/layers/sources/source.ts b/x-pack/plugins/maps/public/classes/sources/source.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/source.ts rename to x-pack/plugins/maps/public/classes/sources/source.ts diff --git a/x-pack/plugins/maps/public/layers/sources/source_registry.ts b/x-pack/plugins/maps/public/classes/sources/source_registry.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/source_registry.ts rename to x-pack/plugins/maps/public/classes/sources/source_registry.ts diff --git a/x-pack/plugins/maps/public/layers/sources/tms_source/index.ts b/x-pack/plugins/maps/public/classes/sources/tms_source/index.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/tms_source/index.ts rename to x-pack/plugins/maps/public/classes/sources/tms_source/index.ts diff --git a/x-pack/plugins/maps/public/layers/sources/tms_source/tms_source.d.ts b/x-pack/plugins/maps/public/classes/sources/tms_source/tms_source.d.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/tms_source/tms_source.d.ts rename to x-pack/plugins/maps/public/classes/sources/tms_source/tms_source.d.ts diff --git a/x-pack/plugins/maps/public/layers/sources/tms_source/tms_source.js b/x-pack/plugins/maps/public/classes/sources/tms_source/tms_source.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/tms_source/tms_source.js rename to x-pack/plugins/maps/public/classes/sources/tms_source/tms_source.js diff --git a/x-pack/plugins/maps/public/layers/sources/vector_feature_types.ts b/x-pack/plugins/maps/public/classes/sources/vector_feature_types.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/vector_feature_types.ts rename to x-pack/plugins/maps/public/classes/sources/vector_feature_types.ts diff --git a/x-pack/plugins/maps/public/layers/sources/vector_source/index.ts b/x-pack/plugins/maps/public/classes/sources/vector_source/index.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/vector_source/index.ts rename to x-pack/plugins/maps/public/classes/sources/vector_source/index.ts diff --git a/x-pack/plugins/maps/public/layers/sources/vector_source/vector_source.d.ts b/x-pack/plugins/maps/public/classes/sources/vector_source/vector_source.d.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/vector_source/vector_source.d.ts rename to x-pack/plugins/maps/public/classes/sources/vector_source/vector_source.d.ts diff --git a/x-pack/plugins/maps/public/layers/sources/vector_source/vector_source.js b/x-pack/plugins/maps/public/classes/sources/vector_source/vector_source.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/vector_source/vector_source.js rename to x-pack/plugins/maps/public/classes/sources/vector_source/vector_source.js diff --git a/x-pack/plugins/maps/public/layers/sources/wms_source/index.js b/x-pack/plugins/maps/public/classes/sources/wms_source/index.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/wms_source/index.js rename to x-pack/plugins/maps/public/classes/sources/wms_source/index.js diff --git a/x-pack/plugins/maps/public/layers/sources/wms_source/wms_client.js b/x-pack/plugins/maps/public/classes/sources/wms_source/wms_client.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/wms_source/wms_client.js rename to x-pack/plugins/maps/public/classes/sources/wms_source/wms_client.js diff --git a/x-pack/plugins/maps/public/layers/sources/wms_source/wms_client.test.js b/x-pack/plugins/maps/public/classes/sources/wms_source/wms_client.test.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/wms_source/wms_client.test.js rename to x-pack/plugins/maps/public/classes/sources/wms_source/wms_client.test.js diff --git a/x-pack/plugins/maps/public/layers/sources/wms_source/wms_create_source_editor.js b/x-pack/plugins/maps/public/classes/sources/wms_source/wms_create_source_editor.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/wms_source/wms_create_source_editor.js rename to x-pack/plugins/maps/public/classes/sources/wms_source/wms_create_source_editor.js diff --git a/x-pack/plugins/maps/public/layers/sources/wms_source/wms_layer_wizard.tsx b/x-pack/plugins/maps/public/classes/sources/wms_source/wms_layer_wizard.tsx similarity index 88% rename from x-pack/plugins/maps/public/layers/sources/wms_source/wms_layer_wizard.tsx rename to x-pack/plugins/maps/public/classes/sources/wms_source/wms_layer_wizard.tsx index fbf5e25c78b17..9261b8866d115 100644 --- a/x-pack/plugins/maps/public/layers/sources/wms_source/wms_layer_wizard.tsx +++ b/x-pack/plugins/maps/public/classes/sources/wms_source/wms_layer_wizard.tsx @@ -10,8 +10,8 @@ import { i18n } from '@kbn/i18n'; import { WMSCreateSourceEditor } from './wms_create_source_editor'; // @ts-ignore import { sourceTitle, WMSSource } from './wms_source'; -import { LayerWizard, RenderWizardArguments } from '../../layer_wizard_registry'; -import { TileLayer } from '../../tile_layer'; +import { LayerWizard, RenderWizardArguments } from '../../layers/layer_wizard_registry'; +import { TileLayer } from '../../layers/tile_layer/tile_layer'; export const wmsLayerWizardConfig: LayerWizard = { description: i18n.translate('xpack.maps.source.wmsDescription', { diff --git a/x-pack/plugins/maps/public/layers/sources/wms_source/wms_source.js b/x-pack/plugins/maps/public/classes/sources/wms_source/wms_source.js similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/wms_source/wms_source.js rename to x-pack/plugins/maps/public/classes/sources/wms_source/wms_source.js diff --git a/x-pack/plugins/maps/public/layers/sources/xyz_tms_source/index.ts b/x-pack/plugins/maps/public/classes/sources/xyz_tms_source/index.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/xyz_tms_source/index.ts rename to x-pack/plugins/maps/public/classes/sources/xyz_tms_source/index.ts diff --git a/x-pack/plugins/maps/public/layers/sources/xyz_tms_source/layer_wizard.tsx b/x-pack/plugins/maps/public/classes/sources/xyz_tms_source/layer_wizard.tsx similarity index 87% rename from x-pack/plugins/maps/public/layers/sources/xyz_tms_source/layer_wizard.tsx rename to x-pack/plugins/maps/public/classes/sources/xyz_tms_source/layer_wizard.tsx index e970c75fa7adf..574aaa262569f 100644 --- a/x-pack/plugins/maps/public/layers/sources/xyz_tms_source/layer_wizard.tsx +++ b/x-pack/plugins/maps/public/classes/sources/xyz_tms_source/layer_wizard.tsx @@ -8,8 +8,8 @@ import { i18n } from '@kbn/i18n'; import React from 'react'; import { XYZTMSEditor, XYZTMSSourceConfig } from './xyz_tms_editor'; import { XYZTMSSource, sourceTitle } from './xyz_tms_source'; -import { LayerWizard, RenderWizardArguments } from '../../layer_wizard_registry'; -import { TileLayer } from '../../tile_layer'; +import { LayerWizard, RenderWizardArguments } from '../../layers/layer_wizard_registry'; +import { TileLayer } from '../../layers/tile_layer/tile_layer'; export const tmsLayerWizardConfig: LayerWizard = { description: i18n.translate('xpack.maps.source.ems_xyzDescription', { diff --git a/x-pack/plugins/maps/public/layers/sources/xyz_tms_source/xyz_tms_editor.tsx b/x-pack/plugins/maps/public/classes/sources/xyz_tms_source/xyz_tms_editor.tsx similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/xyz_tms_source/xyz_tms_editor.tsx rename to x-pack/plugins/maps/public/classes/sources/xyz_tms_source/xyz_tms_editor.tsx diff --git a/x-pack/plugins/maps/public/layers/sources/xyz_tms_source/xyz_tms_source.test.ts b/x-pack/plugins/maps/public/classes/sources/xyz_tms_source/xyz_tms_source.test.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/xyz_tms_source/xyz_tms_source.test.ts rename to x-pack/plugins/maps/public/classes/sources/xyz_tms_source/xyz_tms_source.test.ts diff --git a/x-pack/plugins/maps/public/layers/sources/xyz_tms_source/xyz_tms_source.ts b/x-pack/plugins/maps/public/classes/sources/xyz_tms_source/xyz_tms_source.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/sources/xyz_tms_source/xyz_tms_source.ts rename to x-pack/plugins/maps/public/classes/sources/xyz_tms_source/xyz_tms_source.ts diff --git a/x-pack/plugins/maps/public/layers/styles/_index.scss b/x-pack/plugins/maps/public/classes/styles/_index.scss similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/_index.scss rename to x-pack/plugins/maps/public/classes/styles/_index.scss diff --git a/x-pack/plugins/maps/public/layers/styles/color_utils.js b/x-pack/plugins/maps/public/classes/styles/color_utils.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/color_utils.js rename to x-pack/plugins/maps/public/classes/styles/color_utils.js diff --git a/x-pack/plugins/maps/public/layers/styles/color_utils.test.js b/x-pack/plugins/maps/public/classes/styles/color_utils.test.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/color_utils.test.js rename to x-pack/plugins/maps/public/classes/styles/color_utils.test.js diff --git a/x-pack/plugins/maps/public/layers/styles/components/_color_gradient.scss b/x-pack/plugins/maps/public/classes/styles/components/_color_gradient.scss similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/components/_color_gradient.scss rename to x-pack/plugins/maps/public/classes/styles/components/_color_gradient.scss diff --git a/x-pack/plugins/maps/public/layers/styles/components/color_gradient.js b/x-pack/plugins/maps/public/classes/styles/components/color_gradient.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/components/color_gradient.js rename to x-pack/plugins/maps/public/classes/styles/components/color_gradient.js diff --git a/x-pack/plugins/maps/public/layers/styles/components/ranged_style_legend_row.js b/x-pack/plugins/maps/public/classes/styles/components/ranged_style_legend_row.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/components/ranged_style_legend_row.js rename to x-pack/plugins/maps/public/classes/styles/components/ranged_style_legend_row.js diff --git a/x-pack/plugins/maps/public/layers/styles/heatmap/components/__snapshots__/heatmap_style_editor.test.js.snap b/x-pack/plugins/maps/public/classes/styles/heatmap/components/__snapshots__/heatmap_style_editor.test.js.snap similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/heatmap/components/__snapshots__/heatmap_style_editor.test.js.snap rename to x-pack/plugins/maps/public/classes/styles/heatmap/components/__snapshots__/heatmap_style_editor.test.js.snap diff --git a/x-pack/plugins/maps/public/layers/styles/heatmap/components/heatmap_constants.js b/x-pack/plugins/maps/public/classes/styles/heatmap/components/heatmap_constants.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/heatmap/components/heatmap_constants.js rename to x-pack/plugins/maps/public/classes/styles/heatmap/components/heatmap_constants.js diff --git a/x-pack/plugins/maps/public/layers/styles/heatmap/components/heatmap_style_editor.js b/x-pack/plugins/maps/public/classes/styles/heatmap/components/heatmap_style_editor.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/heatmap/components/heatmap_style_editor.js rename to x-pack/plugins/maps/public/classes/styles/heatmap/components/heatmap_style_editor.js diff --git a/x-pack/plugins/maps/public/layers/styles/heatmap/components/heatmap_style_editor.test.js b/x-pack/plugins/maps/public/classes/styles/heatmap/components/heatmap_style_editor.test.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/heatmap/components/heatmap_style_editor.test.js rename to x-pack/plugins/maps/public/classes/styles/heatmap/components/heatmap_style_editor.test.js diff --git a/x-pack/plugins/maps/public/layers/styles/heatmap/components/legend/heatmap_legend.js b/x-pack/plugins/maps/public/classes/styles/heatmap/components/legend/heatmap_legend.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/heatmap/components/legend/heatmap_legend.js rename to x-pack/plugins/maps/public/classes/styles/heatmap/components/legend/heatmap_legend.js diff --git a/x-pack/plugins/maps/public/layers/styles/heatmap/heatmap_style.js b/x-pack/plugins/maps/public/classes/styles/heatmap/heatmap_style.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/heatmap/heatmap_style.js rename to x-pack/plugins/maps/public/classes/styles/heatmap/heatmap_style.js diff --git a/x-pack/plugins/maps/public/layers/styles/style.ts b/x-pack/plugins/maps/public/classes/styles/style.ts similarity index 97% rename from x-pack/plugins/maps/public/layers/styles/style.ts rename to x-pack/plugins/maps/public/classes/styles/style.ts index 38fdc36904412..7d39acd504c42 100644 --- a/x-pack/plugins/maps/public/layers/styles/style.ts +++ b/x-pack/plugins/maps/public/classes/styles/style.ts @@ -6,7 +6,7 @@ import { ReactElement } from 'react'; import { StyleDescriptor, StyleMetaDescriptor } from '../../../common/descriptor_types'; -import { ILayer } from '../layer'; +import { ILayer } from '../layers/layer'; import { IField } from '../fields/field'; import { DataRequest } from '../util/data_request'; diff --git a/x-pack/plugins/maps/public/layers/styles/tile/tile_style.ts b/x-pack/plugins/maps/public/classes/styles/tile/tile_style.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/tile/tile_style.ts rename to x-pack/plugins/maps/public/classes/styles/tile/tile_style.ts diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/_style_prop_editor.scss b/x-pack/plugins/maps/public/classes/styles/vector/components/_style_prop_editor.scss similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/_style_prop_editor.scss rename to x-pack/plugins/maps/public/classes/styles/vector/components/_style_prop_editor.scss diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/color/_color_stops.scss b/x-pack/plugins/maps/public/classes/styles/vector/components/color/_color_stops.scss similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/color/_color_stops.scss rename to x-pack/plugins/maps/public/classes/styles/vector/components/color/_color_stops.scss diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/color/color_map_select.js b/x-pack/plugins/maps/public/classes/styles/vector/components/color/color_map_select.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/color/color_map_select.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/color/color_map_select.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/color/color_stops.js b/x-pack/plugins/maps/public/classes/styles/vector/components/color/color_stops.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/color/color_stops.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/color/color_stops.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/color/color_stops_categorical.js b/x-pack/plugins/maps/public/classes/styles/vector/components/color/color_stops_categorical.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/color/color_stops_categorical.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/color/color_stops_categorical.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/color/color_stops_ordinal.js b/x-pack/plugins/maps/public/classes/styles/vector/components/color/color_stops_ordinal.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/color/color_stops_ordinal.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/color/color_stops_ordinal.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/color/color_stops_utils.js b/x-pack/plugins/maps/public/classes/styles/vector/components/color/color_stops_utils.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/color/color_stops_utils.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/color/color_stops_utils.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/color/dynamic_color_form.js b/x-pack/plugins/maps/public/classes/styles/vector/components/color/dynamic_color_form.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/color/dynamic_color_form.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/color/dynamic_color_form.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/color/mb_validated_color_picker.tsx b/x-pack/plugins/maps/public/classes/styles/vector/components/color/mb_validated_color_picker.tsx similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/color/mb_validated_color_picker.tsx rename to x-pack/plugins/maps/public/classes/styles/vector/components/color/mb_validated_color_picker.tsx diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/color/static_color_form.js b/x-pack/plugins/maps/public/classes/styles/vector/components/color/static_color_form.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/color/static_color_form.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/color/static_color_form.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/color/vector_style_color_editor.js b/x-pack/plugins/maps/public/classes/styles/vector/components/color/vector_style_color_editor.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/color/vector_style_color_editor.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/color/vector_style_color_editor.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/field_meta/categorical_field_meta_popover.tsx b/x-pack/plugins/maps/public/classes/styles/vector/components/field_meta/categorical_field_meta_popover.tsx similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/field_meta/categorical_field_meta_popover.tsx rename to x-pack/plugins/maps/public/classes/styles/vector/components/field_meta/categorical_field_meta_popover.tsx diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/field_meta/field_meta_popover.tsx b/x-pack/plugins/maps/public/classes/styles/vector/components/field_meta/field_meta_popover.tsx similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/field_meta/field_meta_popover.tsx rename to x-pack/plugins/maps/public/classes/styles/vector/components/field_meta/field_meta_popover.tsx diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/field_meta/ordinal_field_meta_popover.tsx b/x-pack/plugins/maps/public/classes/styles/vector/components/field_meta/ordinal_field_meta_popover.tsx similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/field_meta/ordinal_field_meta_popover.tsx rename to x-pack/plugins/maps/public/classes/styles/vector/components/field_meta/ordinal_field_meta_popover.tsx diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/field_select.js b/x-pack/plugins/maps/public/classes/styles/vector/components/field_select.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/field_select.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/field_select.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/get_vector_style_label.js b/x-pack/plugins/maps/public/classes/styles/vector/components/get_vector_style_label.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/get_vector_style_label.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/get_vector_style_label.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/label/dynamic_label_form.js b/x-pack/plugins/maps/public/classes/styles/vector/components/label/dynamic_label_form.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/label/dynamic_label_form.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/label/dynamic_label_form.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/label/static_label_form.js b/x-pack/plugins/maps/public/classes/styles/vector/components/label/static_label_form.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/label/static_label_form.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/label/static_label_form.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/label/vector_style_label_border_size_editor.js b/x-pack/plugins/maps/public/classes/styles/vector/components/label/vector_style_label_border_size_editor.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/label/vector_style_label_border_size_editor.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/label/vector_style_label_border_size_editor.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/label/vector_style_label_editor.js b/x-pack/plugins/maps/public/classes/styles/vector/components/label/vector_style_label_editor.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/label/vector_style_label_editor.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/label/vector_style_label_editor.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/legend/__snapshots__/vector_icon.test.js.snap b/x-pack/plugins/maps/public/classes/styles/vector/components/legend/__snapshots__/vector_icon.test.js.snap similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/legend/__snapshots__/vector_icon.test.js.snap rename to x-pack/plugins/maps/public/classes/styles/vector/components/legend/__snapshots__/vector_icon.test.js.snap diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/legend/category.js b/x-pack/plugins/maps/public/classes/styles/vector/components/legend/category.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/legend/category.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/legend/category.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/legend/circle_icon.js b/x-pack/plugins/maps/public/classes/styles/vector/components/legend/circle_icon.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/legend/circle_icon.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/legend/circle_icon.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/legend/extract_color_from_style_property.js b/x-pack/plugins/maps/public/classes/styles/vector/components/legend/extract_color_from_style_property.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/legend/extract_color_from_style_property.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/legend/extract_color_from_style_property.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/legend/line_icon.js b/x-pack/plugins/maps/public/classes/styles/vector/components/legend/line_icon.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/legend/line_icon.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/legend/line_icon.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/legend/polygon_icon.js b/x-pack/plugins/maps/public/classes/styles/vector/components/legend/polygon_icon.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/legend/polygon_icon.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/legend/polygon_icon.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/legend/symbol_icon.js b/x-pack/plugins/maps/public/classes/styles/vector/components/legend/symbol_icon.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/legend/symbol_icon.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/legend/symbol_icon.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/legend/vector_icon.js b/x-pack/plugins/maps/public/classes/styles/vector/components/legend/vector_icon.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/legend/vector_icon.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/legend/vector_icon.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/legend/vector_icon.test.js b/x-pack/plugins/maps/public/classes/styles/vector/components/legend/vector_icon.test.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/legend/vector_icon.test.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/legend/vector_icon.test.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/legend/vector_style_legend.js b/x-pack/plugins/maps/public/classes/styles/vector/components/legend/vector_style_legend.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/legend/vector_style_legend.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/legend/vector_style_legend.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/orientation/dynamic_orientation_form.js b/x-pack/plugins/maps/public/classes/styles/vector/components/orientation/dynamic_orientation_form.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/orientation/dynamic_orientation_form.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/orientation/dynamic_orientation_form.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/orientation/orientation_editor.js b/x-pack/plugins/maps/public/classes/styles/vector/components/orientation/orientation_editor.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/orientation/orientation_editor.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/orientation/orientation_editor.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/orientation/static_orientation_form.js b/x-pack/plugins/maps/public/classes/styles/vector/components/orientation/static_orientation_form.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/orientation/static_orientation_form.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/orientation/static_orientation_form.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/size/dynamic_size_form.js b/x-pack/plugins/maps/public/classes/styles/vector/components/size/dynamic_size_form.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/size/dynamic_size_form.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/size/dynamic_size_form.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/size/size_range_selector.js b/x-pack/plugins/maps/public/classes/styles/vector/components/size/size_range_selector.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/size/size_range_selector.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/size/size_range_selector.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/size/static_size_form.js b/x-pack/plugins/maps/public/classes/styles/vector/components/size/static_size_form.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/size/static_size_form.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/size/static_size_form.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/size/vector_style_size_editor.js b/x-pack/plugins/maps/public/classes/styles/vector/components/size/vector_style_size_editor.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/size/vector_style_size_editor.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/size/vector_style_size_editor.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/stop_input.js b/x-pack/plugins/maps/public/classes/styles/vector/components/stop_input.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/stop_input.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/stop_input.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/style_map_select.js b/x-pack/plugins/maps/public/classes/styles/vector/components/style_map_select.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/style_map_select.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/style_map_select.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/style_option_shapes.js b/x-pack/plugins/maps/public/classes/styles/vector/components/style_option_shapes.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/style_option_shapes.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/style_option_shapes.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/style_prop_editor.js b/x-pack/plugins/maps/public/classes/styles/vector/components/style_prop_editor.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/style_prop_editor.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/style_prop_editor.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/symbol/__snapshots__/icon_select.test.js.snap b/x-pack/plugins/maps/public/classes/styles/vector/components/symbol/__snapshots__/icon_select.test.js.snap similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/symbol/__snapshots__/icon_select.test.js.snap rename to x-pack/plugins/maps/public/classes/styles/vector/components/symbol/__snapshots__/icon_select.test.js.snap diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/symbol/_icon_select.scss b/x-pack/plugins/maps/public/classes/styles/vector/components/symbol/_icon_select.scss similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/symbol/_icon_select.scss rename to x-pack/plugins/maps/public/classes/styles/vector/components/symbol/_icon_select.scss diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/symbol/dynamic_icon_form.js b/x-pack/plugins/maps/public/classes/styles/vector/components/symbol/dynamic_icon_form.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/symbol/dynamic_icon_form.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/symbol/dynamic_icon_form.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/symbol/icon_map_select.js b/x-pack/plugins/maps/public/classes/styles/vector/components/symbol/icon_map_select.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/symbol/icon_map_select.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/symbol/icon_map_select.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/symbol/icon_select.js b/x-pack/plugins/maps/public/classes/styles/vector/components/symbol/icon_select.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/symbol/icon_select.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/symbol/icon_select.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/symbol/icon_select.test.js b/x-pack/plugins/maps/public/classes/styles/vector/components/symbol/icon_select.test.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/symbol/icon_select.test.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/symbol/icon_select.test.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/symbol/icon_stops.js b/x-pack/plugins/maps/public/classes/styles/vector/components/symbol/icon_stops.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/symbol/icon_stops.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/symbol/icon_stops.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/symbol/icon_stops.test.js b/x-pack/plugins/maps/public/classes/styles/vector/components/symbol/icon_stops.test.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/symbol/icon_stops.test.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/symbol/icon_stops.test.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/symbol/static_icon_form.js b/x-pack/plugins/maps/public/classes/styles/vector/components/symbol/static_icon_form.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/symbol/static_icon_form.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/symbol/static_icon_form.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/symbol/vector_style_icon_editor.js b/x-pack/plugins/maps/public/classes/styles/vector/components/symbol/vector_style_icon_editor.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/symbol/vector_style_icon_editor.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/symbol/vector_style_icon_editor.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/symbol/vector_style_symbolize_as_editor.js b/x-pack/plugins/maps/public/classes/styles/vector/components/symbol/vector_style_symbolize_as_editor.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/symbol/vector_style_symbolize_as_editor.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/symbol/vector_style_symbolize_as_editor.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/components/vector_style_editor.js b/x-pack/plugins/maps/public/classes/styles/vector/components/vector_style_editor.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/components/vector_style_editor.js rename to x-pack/plugins/maps/public/classes/styles/vector/components/vector_style_editor.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/properties/__snapshots__/dynamic_color_property.test.js.snap b/x-pack/plugins/maps/public/classes/styles/vector/properties/__snapshots__/dynamic_color_property.test.js.snap similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/properties/__snapshots__/dynamic_color_property.test.js.snap rename to x-pack/plugins/maps/public/classes/styles/vector/properties/__snapshots__/dynamic_color_property.test.js.snap diff --git a/x-pack/plugins/maps/public/layers/styles/vector/properties/components/categorical_legend.js b/x-pack/plugins/maps/public/classes/styles/vector/properties/components/categorical_legend.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/properties/components/categorical_legend.js rename to x-pack/plugins/maps/public/classes/styles/vector/properties/components/categorical_legend.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/properties/components/ordinal_legend.js b/x-pack/plugins/maps/public/classes/styles/vector/properties/components/ordinal_legend.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/properties/components/ordinal_legend.js rename to x-pack/plugins/maps/public/classes/styles/vector/properties/components/ordinal_legend.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/properties/dynamic_color_property.js b/x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_color_property.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/properties/dynamic_color_property.js rename to x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_color_property.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/properties/dynamic_color_property.test.js b/x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_color_property.test.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/properties/dynamic_color_property.test.js rename to x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_color_property.test.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/properties/dynamic_icon_property.js b/x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_icon_property.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/properties/dynamic_icon_property.js rename to x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_icon_property.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/properties/dynamic_orientation_property.js b/x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_orientation_property.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/properties/dynamic_orientation_property.js rename to x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_orientation_property.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/properties/dynamic_size_property.js b/x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_size_property.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/properties/dynamic_size_property.js rename to x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_size_property.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/properties/dynamic_style_property.d.ts b/x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_style_property.d.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/properties/dynamic_style_property.d.ts rename to x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_style_property.d.ts diff --git a/x-pack/plugins/maps/public/layers/styles/vector/properties/dynamic_style_property.js b/x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_style_property.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/properties/dynamic_style_property.js rename to x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_style_property.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/properties/dynamic_text_property.js b/x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_text_property.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/properties/dynamic_text_property.js rename to x-pack/plugins/maps/public/classes/styles/vector/properties/dynamic_text_property.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/properties/label_border_size_property.js b/x-pack/plugins/maps/public/classes/styles/vector/properties/label_border_size_property.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/properties/label_border_size_property.js rename to x-pack/plugins/maps/public/classes/styles/vector/properties/label_border_size_property.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/properties/static_color_property.js b/x-pack/plugins/maps/public/classes/styles/vector/properties/static_color_property.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/properties/static_color_property.js rename to x-pack/plugins/maps/public/classes/styles/vector/properties/static_color_property.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/properties/static_icon_property.js b/x-pack/plugins/maps/public/classes/styles/vector/properties/static_icon_property.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/properties/static_icon_property.js rename to x-pack/plugins/maps/public/classes/styles/vector/properties/static_icon_property.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/properties/static_orientation_property.js b/x-pack/plugins/maps/public/classes/styles/vector/properties/static_orientation_property.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/properties/static_orientation_property.js rename to x-pack/plugins/maps/public/classes/styles/vector/properties/static_orientation_property.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/properties/static_size_property.js b/x-pack/plugins/maps/public/classes/styles/vector/properties/static_size_property.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/properties/static_size_property.js rename to x-pack/plugins/maps/public/classes/styles/vector/properties/static_size_property.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/properties/static_style_property.js b/x-pack/plugins/maps/public/classes/styles/vector/properties/static_style_property.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/properties/static_style_property.js rename to x-pack/plugins/maps/public/classes/styles/vector/properties/static_style_property.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/properties/static_text_property.js b/x-pack/plugins/maps/public/classes/styles/vector/properties/static_text_property.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/properties/static_text_property.js rename to x-pack/plugins/maps/public/classes/styles/vector/properties/static_text_property.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/properties/style_property.ts b/x-pack/plugins/maps/public/classes/styles/vector/properties/style_property.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/properties/style_property.ts rename to x-pack/plugins/maps/public/classes/styles/vector/properties/style_property.ts diff --git a/x-pack/plugins/maps/public/layers/styles/vector/properties/symbolize_as_property.js b/x-pack/plugins/maps/public/classes/styles/vector/properties/symbolize_as_property.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/properties/symbolize_as_property.js rename to x-pack/plugins/maps/public/classes/styles/vector/properties/symbolize_as_property.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/style_meta.ts b/x-pack/plugins/maps/public/classes/styles/vector/style_meta.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/style_meta.ts rename to x-pack/plugins/maps/public/classes/styles/vector/style_meta.ts diff --git a/x-pack/plugins/maps/public/layers/styles/vector/style_util.js b/x-pack/plugins/maps/public/classes/styles/vector/style_util.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/style_util.js rename to x-pack/plugins/maps/public/classes/styles/vector/style_util.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/style_util.test.js b/x-pack/plugins/maps/public/classes/styles/vector/style_util.test.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/style_util.test.js rename to x-pack/plugins/maps/public/classes/styles/vector/style_util.test.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/symbol_utils.js b/x-pack/plugins/maps/public/classes/styles/vector/symbol_utils.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/symbol_utils.js rename to x-pack/plugins/maps/public/classes/styles/vector/symbol_utils.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/symbol_utils.test.js b/x-pack/plugins/maps/public/classes/styles/vector/symbol_utils.test.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/symbol_utils.test.js rename to x-pack/plugins/maps/public/classes/styles/vector/symbol_utils.test.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/vector_style.d.ts b/x-pack/plugins/maps/public/classes/styles/vector/vector_style.d.ts similarity index 94% rename from x-pack/plugins/maps/public/layers/styles/vector/vector_style.d.ts rename to x-pack/plugins/maps/public/classes/styles/vector/vector_style.d.ts index 762322b8e09f9..beea943943994 100644 --- a/x-pack/plugins/maps/public/layers/styles/vector/vector_style.d.ts +++ b/x-pack/plugins/maps/public/classes/styles/vector/vector_style.d.ts @@ -5,7 +5,7 @@ */ import { IStyleProperty } from './properties/style_property'; import { IDynamicStyleProperty } from './properties/dynamic_style_property'; -import { IVectorLayer } from '../../vector_layer'; +import { IVectorLayer } from '../../layers/vector_layer/vector_layer'; import { IVectorSource } from '../../sources/vector_source'; import { AbstractStyle, IStyle } from '../style'; import { diff --git a/x-pack/plugins/maps/public/layers/styles/vector/vector_style.js b/x-pack/plugins/maps/public/classes/styles/vector/vector_style.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/vector_style.js rename to x-pack/plugins/maps/public/classes/styles/vector/vector_style.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/vector_style.test.js b/x-pack/plugins/maps/public/classes/styles/vector/vector_style.test.js similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/vector_style.test.js rename to x-pack/plugins/maps/public/classes/styles/vector/vector_style.test.js diff --git a/x-pack/plugins/maps/public/layers/styles/vector/vector_style_defaults.ts b/x-pack/plugins/maps/public/classes/styles/vector/vector_style_defaults.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/styles/vector/vector_style_defaults.ts rename to x-pack/plugins/maps/public/classes/styles/vector/vector_style_defaults.ts diff --git a/x-pack/plugins/maps/public/layers/tooltips/es_agg_tooltip_property.ts b/x-pack/plugins/maps/public/classes/tooltips/es_agg_tooltip_property.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/tooltips/es_agg_tooltip_property.ts rename to x-pack/plugins/maps/public/classes/tooltips/es_agg_tooltip_property.ts diff --git a/x-pack/plugins/maps/public/layers/tooltips/es_tooltip_property.test.ts b/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.test.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/tooltips/es_tooltip_property.test.ts rename to x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.test.ts diff --git a/x-pack/plugins/maps/public/layers/tooltips/es_tooltip_property.ts b/x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/tooltips/es_tooltip_property.ts rename to x-pack/plugins/maps/public/classes/tooltips/es_tooltip_property.ts diff --git a/x-pack/plugins/maps/public/layers/tooltips/join_tooltip_property.ts b/x-pack/plugins/maps/public/classes/tooltips/join_tooltip_property.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/tooltips/join_tooltip_property.ts rename to x-pack/plugins/maps/public/classes/tooltips/join_tooltip_property.ts diff --git a/x-pack/plugins/maps/public/layers/tooltips/tooltip_property.ts b/x-pack/plugins/maps/public/classes/tooltips/tooltip_property.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/tooltips/tooltip_property.ts rename to x-pack/plugins/maps/public/classes/tooltips/tooltip_property.ts diff --git a/x-pack/plugins/maps/public/layers/util/assign_feature_ids.test.ts b/x-pack/plugins/maps/public/classes/util/assign_feature_ids.test.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/util/assign_feature_ids.test.ts rename to x-pack/plugins/maps/public/classes/util/assign_feature_ids.test.ts diff --git a/x-pack/plugins/maps/public/layers/util/assign_feature_ids.ts b/x-pack/plugins/maps/public/classes/util/assign_feature_ids.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/util/assign_feature_ids.ts rename to x-pack/plugins/maps/public/classes/util/assign_feature_ids.ts diff --git a/x-pack/plugins/maps/public/layers/util/can_skip_fetch.test.js b/x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.js similarity index 100% rename from x-pack/plugins/maps/public/layers/util/can_skip_fetch.test.js rename to x-pack/plugins/maps/public/classes/util/can_skip_fetch.test.js diff --git a/x-pack/plugins/maps/public/layers/util/can_skip_fetch.ts b/x-pack/plugins/maps/public/classes/util/can_skip_fetch.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/util/can_skip_fetch.ts rename to x-pack/plugins/maps/public/classes/util/can_skip_fetch.ts diff --git a/x-pack/plugins/maps/public/layers/util/data_request.ts b/x-pack/plugins/maps/public/classes/util/data_request.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/util/data_request.ts rename to x-pack/plugins/maps/public/classes/util/data_request.ts diff --git a/x-pack/plugins/maps/public/layers/util/es_agg_utils.test.ts b/x-pack/plugins/maps/public/classes/util/es_agg_utils.test.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/util/es_agg_utils.test.ts rename to x-pack/plugins/maps/public/classes/util/es_agg_utils.test.ts diff --git a/x-pack/plugins/maps/public/layers/util/es_agg_utils.ts b/x-pack/plugins/maps/public/classes/util/es_agg_utils.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/util/es_agg_utils.ts rename to x-pack/plugins/maps/public/classes/util/es_agg_utils.ts diff --git a/x-pack/plugins/maps/public/layers/util/is_metric_countable.ts b/x-pack/plugins/maps/public/classes/util/is_metric_countable.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/util/is_metric_countable.ts rename to x-pack/plugins/maps/public/classes/util/is_metric_countable.ts diff --git a/x-pack/plugins/maps/public/layers/util/is_refresh_only_query.ts b/x-pack/plugins/maps/public/classes/util/is_refresh_only_query.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/util/is_refresh_only_query.ts rename to x-pack/plugins/maps/public/classes/util/is_refresh_only_query.ts diff --git a/x-pack/plugins/maps/public/layers/util/mb_filter_expressions.ts b/x-pack/plugins/maps/public/classes/util/mb_filter_expressions.ts similarity index 100% rename from x-pack/plugins/maps/public/layers/util/mb_filter_expressions.ts rename to x-pack/plugins/maps/public/classes/util/mb_filter_expressions.ts diff --git a/x-pack/plugins/maps/public/components/tooltip_selector/tooltip_selector.test.tsx b/x-pack/plugins/maps/public/components/tooltip_selector/tooltip_selector.test.tsx index 10d3f6af63370..f3ac62717519d 100644 --- a/x-pack/plugins/maps/public/components/tooltip_selector/tooltip_selector.test.tsx +++ b/x-pack/plugins/maps/public/components/tooltip_selector/tooltip_selector.test.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { shallow } from 'enzyme'; import { TooltipSelector } from './tooltip_selector'; -import { AbstractField } from '../../layers/fields/field'; +import { AbstractField } from '../../classes/fields/field'; import { FIELD_ORIGIN } from '../../../common/constants'; class MockField extends AbstractField { 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 211276cda904a..34c58c4c8a183 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 @@ -17,7 +17,7 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { AddTooltipFieldPopover, FieldProps } from './add_tooltip_field_popover'; -import { IField } from '../../layers/fields/field'; +import { IField } from '../../classes/fields/field'; // TODO import reorder from EUI once its exposed as service // https://github.com/elastic/eui/issues/2372 diff --git a/x-pack/plugins/maps/public/connected_components/gis_map/index.d.ts b/x-pack/plugins/maps/public/connected_components/gis_map/index.d.ts index 7edc51d9d78b3..3f3fa48b3d769 100644 --- a/x-pack/plugins/maps/public/connected_components/gis_map/index.d.ts +++ b/x-pack/plugins/maps/public/connected_components/gis_map/index.d.ts @@ -7,7 +7,7 @@ import React from 'react'; import { Filter } from 'src/plugins/data/public'; -import { RenderToolTipContent } from '../../layers/tooltips/tooltip_property'; +import { RenderToolTipContent } from '../../classes/tooltips/tooltip_property'; declare const GisMap: React.ComponentType<{ addFilters: ((filters: Filter[]) => void) | null; diff --git a/x-pack/plugins/maps/public/connected_components/gis_map/view.js b/x-pack/plugins/maps/public/connected_components/gis_map/view.js index ca4b062ee7273..0100db0393d06 100644 --- a/x-pack/plugins/maps/public/connected_components/gis_map/view.js +++ b/x-pack/plugins/maps/public/connected_components/gis_map/view.js @@ -22,7 +22,7 @@ import { i18n } from '@kbn/i18n'; import uuid from 'uuid/v4'; import { FLYOUT_STATE } from '../../reducers/ui'; import { MapSettingsPanel } from '../map_settings_panel'; -import { registerLayerWizards } from '../../layers/load_layer_wizards'; +import { registerLayerWizards } from '../../classes/layers/load_layer_wizards'; const RENDER_COMPLETE_EVENT = 'renderComplete'; diff --git a/x-pack/plugins/maps/public/connected_components/layer_addpanel/import_editor/view.js b/x-pack/plugins/maps/public/connected_components/layer_addpanel/import_editor/view.js index 8ebb17ac4fff5..0dca2b8bd002c 100644 --- a/x-pack/plugins/maps/public/connected_components/layer_addpanel/import_editor/view.js +++ b/x-pack/plugins/maps/public/connected_components/layer_addpanel/import_editor/view.js @@ -7,7 +7,7 @@ import React from 'react'; import { EuiPanel } from '@elastic/eui'; -import { uploadLayerWizardConfig } from '../../../layers/sources/client_file_source'; +import { uploadLayerWizardConfig } from '../../../classes/sources/client_file_source'; export const ImportEditor = props => { const editorProperties = getEditorProperties(props); diff --git a/x-pack/plugins/maps/public/connected_components/layer_addpanel/layer_wizard_select.tsx b/x-pack/plugins/maps/public/connected_components/layer_addpanel/layer_wizard_select.tsx index 0359ed2c6269d..80afe5c8f8a36 100644 --- a/x-pack/plugins/maps/public/connected_components/layer_addpanel/layer_wizard_select.tsx +++ b/x-pack/plugins/maps/public/connected_components/layer_addpanel/layer_wizard_select.tsx @@ -7,7 +7,7 @@ import _ from 'lodash'; import React, { Component, Fragment } from 'react'; import { EuiSpacer, EuiCard, EuiIcon } from '@elastic/eui'; -import { getLayerWizards, LayerWizard } from '../../layers/layer_wizard_registry'; +import { getLayerWizards, LayerWizard } from '../../classes/layers/layer_wizard_registry'; interface Props { onSelect: (layerWizard: LayerWizard) => void; diff --git a/x-pack/plugins/maps/public/connected_components/map_settings_panel/spatial_filters_panel.tsx b/x-pack/plugins/maps/public/connected_components/map_settings_panel/spatial_filters_panel.tsx index cae703e982966..e9ed740873e1a 100644 --- a/x-pack/plugins/maps/public/connected_components/map_settings_panel/spatial_filters_panel.tsx +++ b/x-pack/plugins/maps/public/connected_components/map_settings_panel/spatial_filters_panel.tsx @@ -10,7 +10,7 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n/react'; import { MapSettings } from '../../reducers/map'; import { AlphaSlider } from '../../components/alpha_slider'; -import { MbValidatedColorPicker } from '../../layers/styles/vector/components/color/mb_validated_color_picker'; +import { MbValidatedColorPicker } from '../../classes/styles/vector/components/color/mb_validated_color_picker'; interface Props { settings: MapSettings; diff --git a/x-pack/plugins/maps/public/connected_components/toolbar_overlay/fit_to_data/fit_to_data.tsx b/x-pack/plugins/maps/public/connected_components/toolbar_overlay/fit_to_data/fit_to_data.tsx index 0b168badb2f3f..ca75060c4f8df 100644 --- a/x-pack/plugins/maps/public/connected_components/toolbar_overlay/fit_to_data/fit_to_data.tsx +++ b/x-pack/plugins/maps/public/connected_components/toolbar_overlay/fit_to_data/fit_to_data.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { EuiButtonIcon } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { ILayer } from '../../../layers/layer'; +import { ILayer } from '../../../classes/layers/layer'; interface Props { layerList: ILayer[]; diff --git a/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/layer_toc/toc_entry/toc_entry_actions_popover/toc_entry_actions_popover.test.tsx b/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/layer_toc/toc_entry/toc_entry_actions_popover/toc_entry_actions_popover.test.tsx index b873119fd7d13..5eaba5330a3a7 100644 --- a/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/layer_toc/toc_entry/toc_entry_actions_popover/toc_entry_actions_popover.test.tsx +++ b/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/layer_toc/toc_entry/toc_entry_actions_popover/toc_entry_actions_popover.test.tsx @@ -7,9 +7,9 @@ import React from 'react'; import { shallowWithIntl } from 'test_utils/enzyme_helpers'; -import { AbstractLayer, ILayer } from '../../../../../../layers/layer'; -import { AbstractSource, ISource } from '../../../../../../layers/sources/source'; -import { AbstractStyle, IStyle } from '../../../../../../layers/styles/style'; +import { AbstractLayer, ILayer } from '../../../../../../classes/layers/layer'; +import { AbstractSource, ISource } from '../../../../../../classes/sources/source'; +import { AbstractStyle, IStyle } from '../../../../../../classes/styles/style'; import { TOCEntryActionsPopover } from './toc_entry_actions_popover'; diff --git a/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/layer_toc/toc_entry/toc_entry_actions_popover/toc_entry_actions_popover.tsx b/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/layer_toc/toc_entry/toc_entry_actions_popover/toc_entry_actions_popover.tsx index dfc93c29263ee..344e96e511f2e 100644 --- a/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/layer_toc/toc_entry/toc_entry_actions_popover/toc_entry_actions_popover.tsx +++ b/x-pack/plugins/maps/public/connected_components/widget_overlay/layer_control/layer_toc/toc_entry/toc_entry_actions_popover/toc_entry_actions_popover.tsx @@ -8,7 +8,7 @@ import React, { Component, Fragment } from 'react'; import { EuiButtonEmpty, EuiPopover, EuiContextMenu, EuiIcon, EuiToolTip } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { ILayer } from '../../../../../../layers/layer'; +import { ILayer } from '../../../../../../classes/layers/layer'; interface Props { cloneLayer: (layerId: string) => void; diff --git a/x-pack/plugins/maps/public/embeddable/map_embeddable.tsx b/x-pack/plugins/maps/public/embeddable/map_embeddable.tsx index c3937ba4cdcbb..fa255cc73a210 100644 --- a/x-pack/plugins/maps/public/embeddable/map_embeddable.tsx +++ b/x-pack/plugins/maps/public/embeddable/map_embeddable.tsx @@ -51,7 +51,7 @@ import { } from '../reducers/non_serializable_instances'; import { getMapCenter, getMapZoom, getHiddenLayerIds } from '../selectors/map_selectors'; import { MAP_SAVED_OBJECT_TYPE } from '../../common/constants'; -import { RenderToolTipContent } from '../layers/tooltips/tooltip_property'; +import { RenderToolTipContent } from '../classes/tooltips/tooltip_property'; import { getUiActions, getCoreI18n } from '../kibana_services'; import { MapEmbeddableInput, MapEmbeddableConfig } from './types'; diff --git a/x-pack/plugins/maps/public/embeddable/map_embeddable_factory.ts b/x-pack/plugins/maps/public/embeddable/map_embeddable_factory.ts index 7e3a8387bed11..f33885c2a2462 100644 --- a/x-pack/plugins/maps/public/embeddable/map_embeddable_factory.ts +++ b/x-pack/plugins/maps/public/embeddable/map_embeddable_factory.ts @@ -18,7 +18,7 @@ import { createMapPath, MAP_SAVED_OBJECT_TYPE, APP_ICON } from '../../common/con import { MapStore, MapStoreState } from '../reducers/store'; import { MapEmbeddableConfig, MapEmbeddableInput } from './types'; import { MapEmbeddableOutput } from './map_embeddable'; -import { RenderToolTipContent } from '../layers/tooltips/tooltip_property'; +import { RenderToolTipContent } from '../classes/tooltips/tooltip_property'; import { EventHandlers } from '../reducers/non_serializable_instances'; let whenModulesLoadedPromise: Promise; diff --git a/x-pack/plugins/maps/public/index.scss b/x-pack/plugins/maps/public/index.scss index 8b2f6d3cb6156..fe974fa610c03 100644 --- a/x-pack/plugins/maps/public/index.scss +++ b/x-pack/plugins/maps/public/index.scss @@ -14,4 +14,4 @@ @import 'mapbox_hacks'; @import 'connected_components/index'; @import 'components/index'; -@import 'layers/index'; +@import 'classes/index'; diff --git a/x-pack/plugins/maps/public/selectors/map_selectors.d.ts b/x-pack/plugins/maps/public/selectors/map_selectors.d.ts index 9caa151db6d5a..77b5293dfaa09 100644 --- a/x-pack/plugins/maps/public/selectors/map_selectors.d.ts +++ b/x-pack/plugins/maps/public/selectors/map_selectors.d.ts @@ -7,8 +7,8 @@ import { MapCenter } from '../../common/descriptor_types'; import { MapStoreState } from '../reducers/store'; import { MapSettings } from '../reducers/map'; -import { IVectorLayer } from '../layers/vector_layer'; -import { ILayer } from '../layers/layer'; +import { IVectorLayer } from '../classes/layers/vector_layer/vector_layer'; +import { ILayer } from '../classes/layers/layer'; export function getHiddenLayerIds(state: MapStoreState): string[]; diff --git a/x-pack/plugins/maps/public/selectors/map_selectors.js b/x-pack/plugins/maps/public/selectors/map_selectors.js index 38a862973623a..c2933dc3052cc 100644 --- a/x-pack/plugins/maps/public/selectors/map_selectors.js +++ b/x-pack/plugins/maps/public/selectors/map_selectors.js @@ -6,18 +6,18 @@ import { createSelector } from 'reselect'; import _ from 'lodash'; -import { TileLayer } from '../layers/tile_layer'; -import { VectorTileLayer } from '../layers/vector_tile_layer'; -import { VectorLayer } from '../layers/vector_layer'; -import { HeatmapLayer } from '../layers/heatmap_layer'; -import { BlendedVectorLayer } from '../layers/blended_vector_layer'; +import { TileLayer } from '../classes/layers/tile_layer/tile_layer'; +import { VectorTileLayer } from '../classes/layers/vector_tile_layer/vector_tile_layer'; +import { VectorLayer } from '../classes/layers/vector_layer/vector_layer'; +import { HeatmapLayer } from '../classes/layers/heatmap_layer/heatmap_layer'; +import { BlendedVectorLayer } from '../classes/layers/blended_vector_layer/blended_vector_layer'; import { getTimeFilter } from '../kibana_services'; import { getInspectorAdapters } from '../reducers/non_serializable_instances'; -import { TiledVectorLayer } from '../layers/tiled_vector_layer'; +import { TiledVectorLayer } from '../classes/layers/tiled_vector_layer/tiled_vector_layer'; import { copyPersistentState, TRACKED_LAYER_DESCRIPTOR } from '../reducers/util'; -import { InnerJoin } from '../layers/joins/inner_join'; -import { getSourceByType } from '../layers/sources/source_registry'; -import { GeojsonFileSource } from '../layers/sources/client_file_source'; +import { InnerJoin } from '../classes/joins/inner_join'; +import { getSourceByType } from '../classes/sources/source_registry'; +import { GeojsonFileSource } from '../classes/sources/client_file_source'; import { LAYER_TYPE, SOURCE_DATA_ID_ORIGIN, diff --git a/x-pack/plugins/maps/public/selectors/map_selectors.test.js b/x-pack/plugins/maps/public/selectors/map_selectors.test.js index fec16251914ea..b6b192ecd9bca 100644 --- a/x-pack/plugins/maps/public/selectors/map_selectors.test.js +++ b/x-pack/plugins/maps/public/selectors/map_selectors.test.js @@ -4,12 +4,12 @@ * you may not use this file except in compliance with the Elastic License. */ -jest.mock('../layers/vector_layer', () => {}); -jest.mock('../layers/tiled_vector_layer', () => {}); -jest.mock('../layers/blended_vector_layer', () => {}); -jest.mock('../layers/heatmap_layer', () => {}); -jest.mock('../layers/vector_tile_layer', () => {}); -jest.mock('../layers/joins/inner_join', () => {}); +jest.mock('../classes/layers/vector_layer/vector_layer', () => {}); +jest.mock('../classes/layers/tiled_vector_layer/tiled_vector_layer', () => {}); +jest.mock('../classes/layers/blended_vector_layer/blended_vector_layer', () => {}); +jest.mock('../classes/layers/heatmap_layer/heatmap_layer', () => {}); +jest.mock('../classes/layers/vector_tile_layer/vector_tile_layer', () => {}); +jest.mock('../classes/joins/inner_join', () => {}); jest.mock('../reducers/non_serializable_instances', () => ({ getInspectorAdapters: () => { return {}; From 3bb51bb430a7b3de9d1fce4c924cd1d08aa010a6 Mon Sep 17 00:00:00 2001 From: Xavier Mouligneau <189600+XavierM@users.noreply.github.com> Date: Mon, 11 May 2020 22:52:43 -0400 Subject: [PATCH 095/102] [SIEM] [Security] unified code structure phase 0 (#65965) * apply new structure for teh security solutions * fix few imports + store * fix types * update path in test * miss path in api_integration Co-authored-by: Elastic Machine --- .../components/activity_monitor/columns.tsx | 2 +- .../activity_monitor/index.test.tsx | 0 .../components/activity_monitor/index.tsx | 4 +- .../components/activity_monitor/types.ts | 0 .../index.test.tsx | 0 .../detection_engine_header_page/index.tsx | 2 +- .../translations.ts | 0 .../no_api_integration_callout/index.test.tsx | 0 .../no_api_integration_callout/index.tsx | 0 .../translations.ts | 0 .../no_write_signals_callout/index.test.tsx | 0 .../no_write_signals_callout/index.tsx | 0 .../no_write_signals_callout/translations.ts | 0 .../rules}/accordion_title/index.test.tsx | 0 .../rules}/accordion_title/index.tsx | 0 .../rules}/add_item_form/index.test.tsx | 2 +- .../components/rules}/add_item_form/index.tsx | 4 +- .../rules}/all_rules_tables/index.test.tsx | 2 +- .../rules}/all_rules_tables/index.tsx | 10 +- .../anomaly_threshold_slider/index.test.tsx | 2 +- .../rules}/anomaly_threshold_slider/index.tsx | 2 +- .../__snapshots__/index.test.tsx.snap | 0 .../assets/list_tree_icon.svg | 0 .../rules}/description_step/helpers.test.tsx | 4 +- .../rules}/description_step/helpers.tsx | 6 +- .../rules}/description_step/index.test.tsx | 20 +- .../rules}/description_step/index.tsx | 14 +- .../ml_job_description.test.tsx | 2 +- .../description_step/ml_job_description.tsx | 6 +- .../rules}/description_step/translations.tsx | 0 .../rules}/description_step/types.ts | 4 +- .../components/rules}/mitre/helpers.test.tsx | 0 .../components/rules}/mitre/helpers.ts | 2 +- .../components/rules}/mitre/index.test.tsx | 2 +- .../components/rules}/mitre/index.tsx | 6 +- .../components/rules}/mitre/translations.ts | 0 .../rules}/ml_job_select/index.test.tsx | 8 +- .../components/rules}/ml_job_select/index.tsx | 8 +- .../__snapshots__/index.test.tsx.snap | 0 .../rules}/next_step/index.test.tsx | 0 .../components/rules}/next_step/index.tsx | 2 +- .../optional_field_label/index.test.tsx | 0 .../rules}/optional_field_label/index.tsx | 2 +- .../rules}/pick_timeline/index.test.tsx | 2 +- .../components/rules}/pick_timeline/index.tsx | 4 +- .../load_empty_prompt.test.tsx | 0 .../pre_packaged_rules/load_empty_prompt.tsx | 2 +- .../rules}/pre_packaged_rules/translations.ts | 0 .../update_callout.test.tsx | 4 +- .../pre_packaged_rules/update_callout.tsx | 2 +- .../rules}/query_bar/index.test.tsx | 4 +- .../components/rules}/query_bar/index.tsx | 24 +- .../rules}/query_bar/translations.tsx | 0 .../rules}/read_only_callout/index.test.tsx | 0 .../rules}/read_only_callout/index.tsx | 0 .../rules}/read_only_callout/translations.ts | 0 .../rules}/rule_actions_field/index.test.tsx | 6 +- .../rules}/rule_actions_field/index.tsx | 12 +- .../__snapshots__/index.test.tsx.snap | 0 .../rule_actions_overflow/index.test.tsx | 9 +- .../rules}/rule_actions_overflow/index.tsx | 15 +- .../rule_actions_overflow/translations.ts | 0 .../rules}/rule_status/helpers.test.tsx | 0 .../components/rules}/rule_status/helpers.ts | 2 +- .../rules}/rule_status/index.test.tsx | 0 .../components/rules}/rule_status/index.tsx | 9 +- .../rules}/rule_status/translations.ts | 0 .../__snapshots__/index.test.tsx.snap | 0 .../rules}/rule_switch/index.test.tsx | 0 .../components/rules}/rule_switch/index.tsx | 12 +- .../rules}/schedule_item_form/index.test.tsx | 2 +- .../rules}/schedule_item_form/index.tsx | 2 +- .../rules}/schedule_item_form/translations.ts | 0 .../rules}/select_rule_type/index.test.tsx | 4 +- .../rules}/select_rule_type/index.tsx | 8 +- .../rules}/select_rule_type/translations.ts | 0 .../rules}/severity_badge/index.test.tsx | 0 .../rules}/severity_badge/index.tsx | 0 .../rules}/status_icon/index.test.tsx | 4 +- .../components/rules}/status_icon/index.tsx | 4 +- .../rules}/step_about_rule/data.tsx | 0 .../rules}/step_about_rule/default_value.ts | 2 +- .../rules}/step_about_rule/helpers.test.ts | 0 .../rules}/step_about_rule/helpers.ts | 0 .../rules}/step_about_rule/index.test.tsx | 5 +- .../rules}/step_about_rule/index.tsx | 12 +- .../rules}/step_about_rule/schema.tsx | 4 +- .../rules}/step_about_rule/translations.ts | 0 .../step_about_rule_details/index.test.tsx | 12 +- .../rules}/step_about_rule_details/index.tsx | 8 +- .../step_about_rule_details/translations.ts | 0 .../step_content_wrapper/index.test.tsx | 0 .../rules}/step_content_wrapper/index.tsx | 0 .../rules}/step_define_rule/index.test.tsx | 2 +- .../rules}/step_define_rule/index.tsx | 31 ++- .../rules}/step_define_rule/schema.tsx | 6 +- .../rules}/step_define_rule/translations.tsx | 0 .../rules}/step_define_rule/types.ts | 0 .../rules}/step_panel/index.test.tsx | 0 .../components/rules}/step_panel/index.tsx | 2 +- .../rules}/step_rule_actions/index.test.tsx | 2 +- .../rules}/step_rule_actions/index.tsx | 12 +- .../rules}/step_rule_actions/schema.tsx | 2 +- .../rules}/step_rule_actions/translations.tsx | 0 .../rules}/step_schedule_rule/index.test.tsx | 2 +- .../rules}/step_schedule_rule/index.tsx | 10 +- .../rules}/step_schedule_rule/schema.tsx | 2 +- .../step_schedule_rule/translations.tsx | 0 .../throttle_select_field/index.test.tsx | 2 +- .../rules}/throttle_select_field/index.tsx | 4 +- .../components/signals/actions.test.tsx | 6 +- .../components/signals/actions.tsx | 12 +- .../signals/default_config.test.tsx | 6 +- .../components/signals/default_config.tsx | 15 +- .../components/signals/helpers.test.ts | 11 +- .../components/signals/helpers.ts | 6 +- .../components/signals/index.test.tsx | 0 .../components/signals/index.tsx | 24 +- .../signals_filter_group/index.test.tsx | 0 .../signals/signals_filter_group/index.tsx | 0 .../signals_utility_bar/index.test.tsx | 2 +- .../signals/signals_utility_bar/index.tsx | 8 +- .../signals_utility_bar/translations.ts | 0 .../components/signals/translations.ts | 0 .../components/signals/types.ts | 6 +- .../signals_histogram_panel/config.ts | 0 .../signals_histogram_panel/helpers.test.tsx | 0 .../signals_histogram_panel/helpers.tsx | 4 +- .../signals_histogram_panel/index.test.tsx | 4 +- .../signals_histogram_panel/index.tsx | 30 +-- .../signals_histogram.test.tsx | 2 +- .../signals_histogram.tsx | 8 +- .../signals_histogram_panel/translations.ts | 0 .../signals_histogram_panel/types.ts | 2 +- .../components/signals_info/index.tsx | 2 +- .../components/signals_info/query.dsl.ts | 0 .../components/signals_info/types.ts | 0 .../components/user_info/index.test.tsx | 12 +- .../components/user_info/index.tsx | 6 +- .../detection_engine/rules/__mocks__/api.ts | 0 .../detection_engine/rules/api.test.ts | 4 +- .../containers/detection_engine/rules/api.ts | 4 +- .../rules/fetch_index_patterns.test.tsx | 8 +- .../rules/fetch_index_patterns.tsx | 10 +- .../detection_engine/rules/index.ts | 0 .../containers/detection_engine/rules/mock.ts | 0 .../rules/persist_rule.test.tsx | 0 .../detection_engine/rules/persist_rule.tsx | 2 +- .../detection_engine/rules/translations.ts | 0 .../detection_engine/rules/types.ts | 2 +- .../rules/use_pre_packaged_rules.test.tsx | 0 .../rules/use_pre_packaged_rules.tsx | 6 +- .../detection_engine/rules/use_rule.test.tsx | 0 .../detection_engine/rules/use_rule.tsx | 2 +- .../rules/use_rule_status.test.tsx | 2 +- .../rules/use_rule_status.tsx | 2 +- .../detection_engine/rules/use_rules.test.tsx | 0 .../detection_engine/rules/use_rules.tsx | 2 +- .../detection_engine/rules/use_tags.test.tsx | 0 .../detection_engine/rules/use_tags.tsx | 2 +- .../detection_engine/signals/__mocks__/api.ts | 0 .../detection_engine/signals/api.test.ts | 4 +- .../detection_engine/signals/api.ts | 4 +- .../detection_engine/signals/mock.ts | 0 .../detection_engine/signals/translations.ts | 0 .../detection_engine/signals/types.ts | 0 .../signals/use_privilege_user.test.tsx | 0 .../signals/use_privilege_user.tsx | 2 +- .../signals/use_query.test.tsx | 0 .../detection_engine/signals/use_query.tsx | 0 .../signals/use_signal_index.test.tsx | 0 .../signals/use_signal_index.tsx | 4 +- x-pack/plugins/siem/public/alerts/index.ts | 18 ++ .../mitre/mitre_tactics_techniques.ts | 0 .../mitre/types.ts | 0 .../detection_engine.test.tsx | 10 +- .../detection_engine/detection_engine.tsx | 51 +++-- .../detection_engine_empty_page.test.tsx | 2 +- .../detection_engine_empty_page.tsx | 6 +- .../detection_engine_no_signal_index.test.tsx | 2 +- .../detection_engine_no_signal_index.tsx | 4 +- ...ction_engine_user_unauthenticated.test.tsx | 2 +- .../detection_engine_user_unauthenticated.tsx | 4 +- .../pages/detection_engine/index.test.tsx | 2 +- .../pages/detection_engine/index.tsx | 2 +- .../rules/all/__mocks__/mock.ts | 6 +- .../detection_engine/rules/all/actions.tsx | 8 +- .../rules/all/batch_actions.tsx | 4 +- .../rules/all/columns.test.tsx | 0 .../detection_engine/rules/all/columns.tsx | 22 +- .../rules/all/helpers.test.tsx | 2 +- .../detection_engine/rules/all/helpers.ts | 2 +- .../detection_engine/rules/all/index.test.tsx | 8 +- .../detection_engine/rules/all/index.tsx | 22 +- .../detection_engine/rules/all/reducer.ts | 2 +- .../rules_table_filters.test.tsx | 0 .../rules_table_filters.tsx | 4 +- .../tags_filter_popover.test.tsx | 0 .../tags_filter_popover.tsx | 2 +- .../rules/create/helpers.test.ts | 2 +- .../detection_engine/rules/create/helpers.ts | 10 +- .../rules/create/index.test.tsx | 6 +- .../detection_engine/rules/create/index.tsx | 26 +-- .../rules/create/translations.ts | 0 .../rules/details/failure_history.test.tsx | 6 +- .../rules/details/failure_history.tsx | 9 +- .../rules/details/index.test.tsx | 10 +- .../detection_engine/rules/details/index.tsx | 64 +++--- .../details/status_failed_callout.test.tsx | 0 .../rules/details/status_failed_callout.tsx | 2 +- .../rules/details/translations.ts | 0 .../rules/edit/index.test.tsx | 6 +- .../detection_engine/rules/edit/index.tsx | 26 +-- .../rules/edit/translations.ts | 0 .../detection_engine/rules/helpers.test.tsx | 4 +- .../pages/detection_engine/rules/helpers.tsx | 12 +- .../detection_engine/rules/index.test.tsx | 8 +- .../pages/detection_engine/rules/index.tsx | 21 +- .../detection_engine/rules/translations.ts | 0 .../pages/detection_engine/rules/types.ts | 12 +- .../detection_engine/rules/utils.test.ts | 0 .../pages/detection_engine/rules/utils.ts | 7 +- .../pages/detection_engine/translations.ts | 0 .../pages/detection_engine/types.ts | 0 x-pack/plugins/siem/public/alerts/routes.tsx | 20 ++ .../siem/public/{pages => app}/404.tsx | 2 +- x-pack/plugins/siem/public/app/app.tsx | 48 ++-- .../{pages => app}/home/home_navigations.tsx | 4 +- .../siem/public/{pages => app}/home/index.tsx | 68 ++---- .../{pages => app}/home/translations.ts | 0 x-pack/plugins/siem/public/app/index.tsx | 10 +- .../plugins/siem/public/{ => app}/routes.tsx | 11 +- x-pack/plugins/siem/public/app/types.ts | 61 ++++++ .../components/__mock__/form.ts | 4 +- .../components/__mock__/router.ts | 0 .../components/add_comment/index.test.tsx | 20 +- .../components/add_comment/index.tsx | 16 +- .../components/add_comment/schema.tsx | 6 +- .../components/add_comment/translations.ts} | 5 +- .../components/all_cases/actions.tsx | 4 +- .../components/all_cases/columns.test.tsx | 2 +- .../components/all_cases/columns.tsx | 10 +- .../components/all_cases/index.test.tsx | 26 ++- .../components/all_cases/index.tsx | 24 +- .../all_cases/table_filters.test.tsx | 14 +- .../components/all_cases/table_filters.tsx | 8 +- .../components/all_cases/translations.ts | 0 .../components/bulk_actions/index.tsx | 0 .../components/bulk_actions/translations.ts | 0 .../components/callout/helpers.tsx | 0 .../components/callout/index.test.tsx | 2 +- .../components/callout/index.tsx | 0 .../components/callout/translations.ts | 0 .../components/case_header_page/index.tsx | 2 +- .../case_header_page/translations.ts | 0 .../components/case_status/index.tsx | 6 +- .../components/case_view/actions.test.tsx | 8 +- .../components/case_view/actions.tsx | 8 +- .../components/case_view/index.test.tsx | 20 +- .../components/case_view/index.tsx | 28 +-- .../components/case_view/translations.ts | 0 .../configure_cases/__mock__/index.tsx | 15 +- .../configure_cases/button.test.tsx | 2 +- .../components/configure_cases/button.tsx | 2 +- .../configure_cases/closure_options.test.tsx | 2 +- .../configure_cases/closure_options.tsx | 2 +- .../closure_options_radio.test.tsx | 2 +- .../configure_cases/closure_options_radio.tsx | 2 +- .../configure_cases/connectors.test.tsx | 2 +- .../components/configure_cases/connectors.tsx | 2 +- .../connectors_dropdown.test.tsx | 2 +- .../configure_cases/connectors_dropdown.tsx | 4 +- .../configure_cases/field_mapping.test.tsx | 6 +- .../configure_cases/field_mapping.tsx | 8 +- .../field_mapping_row.test.tsx | 4 +- .../configure_cases/field_mapping_row.tsx | 9 +- .../components/configure_cases/index.test.tsx | 22 +- .../components/configure_cases/index.tsx | 23 +- .../configure_cases/mapping.test.tsx | 2 +- .../components/configure_cases/mapping.tsx | 2 +- .../configure_cases/translations.ts | 0 .../components/configure_cases/utils.test.tsx | 2 +- .../components/configure_cases/utils.ts | 2 +- .../components/confirm_delete_case/index.tsx | 0 .../confirm_delete_case/translations.ts | 0 .../components/connector_selector/form.tsx | 4 +- .../components/create/index.test.tsx | 26 +-- .../components/create/index.tsx | 16 +- .../create/optional_field_label/index.tsx | 0 .../components/create/schema.tsx | 4 +- .../components/edit_connector/index.test.tsx | 8 +- .../components/edit_connector/index.tsx | 4 +- .../components/edit_connector/schema.tsx | 2 +- .../components/filter_popover/index.tsx | 0 .../components/open_closed_stats/index.tsx | 0 .../components/property_actions/constants.ts | 0 .../components/property_actions/index.tsx | 0 .../property_actions/translations.ts | 0 .../components/tag_list/index.test.tsx | 16 +- .../components/tag_list/index.tsx | 4 +- .../components/tag_list/schema.tsx | 2 +- .../components/tag_list/translations.ts | 0 .../use_push_to_service/helpers.tsx | 2 +- .../use_push_to_service/index.test.tsx | 18 +- .../components/use_push_to_service/index.tsx | 16 +- .../use_push_to_service/translations.ts | 0 .../user_action_tree/helpers.test.tsx | 4 +- .../components/user_action_tree/helpers.tsx | 4 +- .../user_action_tree/index.test.tsx | 12 +- .../components/user_action_tree/index.tsx | 12 +- .../components/user_action_tree/schema.ts | 2 +- .../user_action_tree/translations.ts | 0 .../user_action_tree/user_action_avatar.tsx | 0 .../user_action_tree/user_action_item.tsx | 0 .../user_action_tree/user_action_markdown.tsx | 10 +- .../user_action_title.test.tsx | 4 +- .../user_action_tree/user_action_title.tsx | 8 +- .../components/user_list/index.test.tsx | 2 +- .../components/user_list/index.tsx | 2 +- .../components/user_list/translations.ts | 0 .../components/wrappers/index.tsx | 0 .../containers}/__mocks__/api.ts | 0 .../case => cases/containers}/api.test.tsx | 4 +- .../case => cases/containers}/api.ts | 2 +- .../containers}/configure/__mocks__/api.ts | 0 .../containers}/configure/api.test.ts | 4 +- .../containers}/configure/api.ts | 2 +- .../containers}/configure/mock.ts | 0 .../containers}/configure/translations.ts | 0 .../containers}/configure/types.ts | 0 .../configure/use_configure.test.tsx | 0 .../containers}/configure/use_configure.tsx | 6 +- .../configure/use_connectors.test.tsx | 0 .../containers}/configure/use_connectors.tsx | 2 +- .../case => cases/containers}/constants.ts | 0 .../case => cases/containers}/mock.ts | 0 .../case => cases/containers}/translations.ts | 0 .../case => cases/containers}/types.ts | 0 .../containers}/use_bulk_update_case.test.tsx | 0 .../containers}/use_bulk_update_case.tsx | 6 +- .../containers}/use_delete_cases.test.tsx | 0 .../containers}/use_delete_cases.tsx | 6 +- .../use_get_action_license.test.tsx | 0 .../containers}/use_get_action_license.tsx | 2 +- .../containers}/use_get_case.test.tsx | 0 .../containers}/use_get_case.tsx | 2 +- .../use_get_case_user_actions.test.tsx | 0 .../containers}/use_get_case_user_actions.tsx | 2 +- .../containers}/use_get_cases.test.tsx | 0 .../containers}/use_get_cases.tsx | 2 +- .../containers}/use_get_cases_status.test.tsx | 0 .../containers}/use_get_cases_status.tsx | 2 +- .../containers}/use_get_reporters.test.tsx | 0 .../containers}/use_get_reporters.tsx | 2 +- .../containers}/use_get_tags.test.tsx | 0 .../containers}/use_get_tags.tsx | 2 +- .../containers}/use_post_case.test.tsx | 0 .../containers}/use_post_case.tsx | 2 +- .../containers}/use_post_comment.test.tsx | 0 .../containers}/use_post_comment.tsx | 2 +- .../use_post_push_to_service.test.tsx | 0 .../containers}/use_post_push_to_service.tsx | 6 +- .../containers}/use_update_case.test.tsx | 0 .../containers}/use_update_case.tsx | 6 +- .../containers}/use_update_comment.test.tsx | 0 .../containers}/use_update_comment.tsx | 2 +- .../case => cases/containers}/utils.ts | 2 +- x-pack/plugins/siem/public/cases/index.ts | 18 ++ .../{pages/case => cases/pages}/case.tsx | 10 +- .../case => cases/pages}/case_details.tsx | 14 +- .../case => cases/pages}/configure_cases.tsx | 18 +- .../case => cases/pages}/create_case.tsx | 16 +- .../{pages/case => cases/pages}/index.tsx | 2 +- .../pages}/saved_object_no_permissions.tsx | 4 +- .../case => cases/pages}/translations.ts | 0 .../{pages/case => cases/pages}/utils.ts | 4 +- x-pack/plugins/siem/public/cases/routes.tsx | 17 ++ .../plugins/siem/public/cases/translations.ts | 205 ++++++++++++++++++ .../__snapshots__/index.test.tsx.snap | 0 .../helpers.test.tsx | 0 .../helpers.ts | 0 .../index.test.tsx | 15 +- .../add_filter_to_global_search_bar/index.tsx | 4 +- .../translations.ts | 0 .../components/alerts_viewer/alerts_table.tsx | 2 +- .../alerts_viewer/default_headers.ts | 8 +- .../alerts_viewer/histogram_configs.ts | 3 +- .../components/alerts_viewer/index.tsx | 2 +- .../components/alerts_viewer/translations.ts | 0 .../components/alerts_viewer/types.ts | 6 +- .../__examples__/index.stories.tsx | 2 +- .../__snapshots__/index.test.tsx.snap | 0 .../autocomplete_field/index.test.tsx | 5 +- .../components/autocomplete_field/index.tsx | 4 +- .../autocomplete_field/suggestion_item.tsx | 4 +- .../__snapshots__/areachart.test.tsx.snap | 0 .../__snapshots__/barchart.test.tsx.snap | 0 .../components/charts/areachart.test.tsx | 0 .../components/charts/areachart.tsx | 0 .../components/charts/barchart.test.tsx | 0 .../components/charts/barchart.tsx | 0 .../charts/chart_place_holder.test.tsx | 0 .../components/charts/chart_place_holder.tsx | 0 .../components/charts/common.test.tsx | 0 .../{ => common}/components/charts/common.tsx | 2 +- .../charts/draggable_legend.test.tsx | 0 .../components/charts/draggable_legend.tsx | 0 .../charts/draggable_legend_item.test.tsx | 0 .../charts/draggable_legend_item.tsx | 0 .../components/charts/translation.ts | 0 .../drag_drop_context_wrapper.test.tsx.snap | 0 .../draggable_wrapper.test.tsx.snap | 0 .../droppable_wrapper.test.tsx.snap | 0 .../drag_and_drop/drag_drop_context.tsx | 0 .../drag_drop_context_wrapper.test.tsx | 0 .../drag_drop_context_wrapper.tsx | 7 +- .../drag_and_drop/draggable_wrapper.test.tsx | 2 +- .../drag_and_drop/draggable_wrapper.tsx | 2 +- .../draggable_wrapper_hover_content.test.tsx | 4 +- .../draggable_wrapper_hover_content.tsx | 4 +- .../drag_and_drop/droppable_wrapper.test.tsx | 0 .../drag_and_drop/droppable_wrapper.tsx | 0 .../components/drag_and_drop/helpers.test.ts | 0 .../components/drag_and_drop/helpers.ts | 11 +- .../drag_and_drop/provider_container.tsx | 2 +- .../components/drag_and_drop/translations.ts | 0 .../__snapshots__/index.test.tsx.snap | 0 .../draggables/field_badge/index.tsx | 0 .../draggables/field_badge/translations.ts | 0 .../components/draggables/index.test.tsx | 0 .../components/draggables/index.tsx | 4 +- .../__snapshots__/index.test.tsx.snap | 0 .../components/empty_page/index.test.tsx | 0 .../components/empty_page/index.tsx | 0 .../__snapshots__/empty_value.test.tsx.snap | 0 .../empty_value/empty_value.test.tsx | 0 .../components/empty_value/index.tsx | 0 .../components/empty_value/translations.ts | 0 .../__snapshots__/index.test.tsx.snap | 0 .../error_toast_dispatcher/index.test.tsx | 6 +- .../error_toast_dispatcher/index.tsx | 0 .../__snapshots__/event_details.test.tsx.snap | 0 .../__snapshots__/json_view.test.tsx.snap | 0 .../components/event_details/columns.tsx | 16 +- .../event_details/event_details.test.tsx | 0 .../event_details/event_details.tsx | 6 +- .../event_fields_browser.test.tsx | 0 .../event_details/event_fields_browser.tsx | 6 +- .../components/event_details/event_id.ts | 0 .../components/event_details/helpers.test.tsx | 0 .../components/event_details/helpers.tsx | 6 +- .../event_details/json_view.test.tsx | 0 .../components/event_details/json_view.tsx | 4 +- .../event_details/stateful_event_details.tsx | 6 +- .../components/event_details/translations.ts | 0 .../components/event_details/types.ts | 2 +- .../events_viewer/default_headers.tsx | 6 +- .../events_viewer/default_model.tsx | 4 +- .../event_details_width_context.tsx | 0 .../events_viewer/events_viewer.test.tsx | 4 +- .../events_viewer/events_viewer.tsx | 34 +-- .../components/events_viewer/index.test.tsx | 4 +- .../components/events_viewer/index.tsx | 17 +- .../components/events_viewer/mock.ts | 2 +- .../components/events_viewer/translations.ts | 0 .../external_link_icon/index.test.tsx | 0 .../components/external_link_icon/index.tsx | 0 .../filters_global.test.tsx.snap | 0 .../filters_global/filters_global.test.tsx | 0 .../filters_global/filters_global.tsx | 0 .../components/filters_global/index.tsx | 0 .../__snapshots__/index.test.tsx.snap | 0 .../components/formatted_bytes/index.test.tsx | 0 .../components/formatted_bytes/index.tsx | 2 +- .../__snapshots__/index.test.tsx.snap | 0 .../components/formatted_date/index.test.tsx | 0 .../components/formatted_date/index.tsx | 0 .../formatted_date/maybe_date.test.ts | 0 .../components/formatted_date/maybe_date.ts | 0 .../__snapshots__/index.test.tsx.snap | 0 .../generic_downloader/index.test.tsx | 0 .../components/generic_downloader/index.tsx | 2 +- .../generic_downloader/translations.ts | 0 .../__snapshots__/index.test.tsx.snap | 0 .../components/header_global/index.test.tsx | 0 .../components/header_global/index.tsx | 4 +- .../components/header_global/translations.ts | 0 .../editable_title.test.tsx.snap | 0 .../__snapshots__/index.test.tsx.snap | 0 .../__snapshots__/title.test.tsx.snap | 0 .../header_page/editable_title.test.tsx | 0 .../components/header_page/editable_title.tsx | 0 .../components/header_page/index.test.tsx | 0 .../components/header_page/index.tsx | 0 .../components/header_page/title.test.tsx | 0 .../components/header_page/title.tsx | 0 .../components/header_page/translations.ts | 0 .../components/header_page/types.ts | 0 .../__snapshots__/index.test.tsx.snap | 0 .../components/header_section/index.test.tsx | 0 .../components/header_section/index.tsx | 0 .../components/help_menu/index.tsx | 0 .../__snapshots__/index.test.tsx.snap | 0 .../import_data_modal/index.test.tsx | 0 .../components/import_data_modal/index.tsx | 5 +- .../import_data_modal/translations.ts | 0 .../components/inspect/index.test.tsx | 7 +- .../{ => common}/components/inspect/index.tsx | 0 .../components/inspect/modal.test.tsx | 0 .../{ => common}/components/inspect/modal.tsx | 0 .../components/inspect/translations.ts | 0 .../components/last_event_time/index.test.tsx | 2 +- .../components/last_event_time/index.tsx | 2 +- .../__snapshots__/index.test.tsx.snap | 0 .../components/link_icon/index.test.tsx | 0 .../components/link_icon/index.tsx | 0 .../components/link_to/helpers.test.ts | 0 .../components/link_to/helpers.ts | 0 .../{ => common}/components/link_to/index.ts | 0 .../components/link_to/link_to.tsx | 8 +- .../components/link_to/redirect_to_case.tsx | 2 +- .../link_to/redirect_to_detection_engine.tsx | 2 +- .../components/link_to/redirect_to_hosts.tsx | 4 +- .../link_to/redirect_to_network.tsx | 4 +- .../link_to/redirect_to_overview.tsx | 2 +- .../link_to/redirect_to_timelines.tsx | 4 +- .../components/link_to/redirect_wrapper.tsx | 0 .../components/links/index.test.tsx | 2 +- .../{ => common}/components/links/index.tsx | 10 +- .../components/links/translations.ts | 2 +- .../loader/__snapshots__/index.test.tsx.snap | 0 .../components/loader/index.test.tsx | 0 .../{ => common}/components/loader/index.tsx | 0 .../localized_date_tooltip/index.test.tsx | 0 .../localized_date_tooltip/index.tsx | 0 .../__snapshots__/index.test.tsx.snap | 0 .../__snapshots__/markdown_hint.test.tsx.snap | 0 .../components/markdown/index.test.tsx | 0 .../components/markdown/index.tsx | 0 .../markdown/markdown_hint.test.tsx | 0 .../components/markdown/markdown_hint.tsx | 0 .../components/markdown/translations.ts | 0 .../components/markdown_editor/constants.ts | 0 .../components/markdown_editor/form.tsx | 2 +- .../components/markdown_editor/index.tsx | 0 .../markdown_editor/translations.ts | 0 .../__snapshots__/index.test.tsx.snap | 0 .../matrix_histogram/index.test.tsx | 2 +- .../components/matrix_histogram/index.tsx | 14 +- .../matrix_histogram/matrix_loader.tsx | 0 .../matrix_histogram/translations.ts | 0 .../components/matrix_histogram/types.ts | 6 +- .../components/matrix_histogram/utils.test.ts | 2 +- .../components/matrix_histogram/utils.ts | 2 +- .../entity_draggable.test.tsx.snap | 0 .../ml/anomaly/anomaly_table_provider.tsx | 0 .../get_interval_from_anomalies.test.ts | 0 .../ml/anomaly/get_interval_from_anomalies.ts | 0 .../components/ml/anomaly/translations.ts | 0 .../anomaly/use_anomalies_table_data.test.ts | 0 .../ml/anomaly/use_anomalies_table_data.ts | 4 +- .../components/ml/api/anomalies_table_data.ts | 0 .../{ => common}/components/ml/api/errors.ts | 0 .../components/ml/api/get_ml_capabilities.ts | 2 +- .../components/ml/api/throw_if_not_ok.test.ts | 0 .../components/ml/api/throw_if_not_ok.ts | 0 .../components/ml/api/translations.ts | 0 .../add_entities_to_kql.test.ts | 0 .../conditional_links/add_entities_to_kql.ts | 0 .../conditional_links/entity_helpers.test.ts | 0 .../ml/conditional_links/entity_helpers.ts | 0 .../ml_host_conditional_container.tsx | 6 +- .../ml_network_conditional_container.tsx | 4 +- .../remove_kql_variables.test.ts | 0 .../conditional_links/remove_kql_variables.ts | 0 .../replace_kql_commas_with_or.test.ts | 0 .../replace_kql_commas_with_or.ts | 0 .../replace_kql_parts.test.ts | 0 .../ml/conditional_links/replace_kql_parts.ts | 0 .../conditional_links/rison_helpers.test.ts | 0 .../ml/conditional_links/rison_helpers.ts | 0 .../get_criteria_from_host_type.test.ts | 2 +- .../criteria/get_criteria_from_host_type.ts | 2 +- .../get_criteria_from_network_type.test.ts | 4 +- .../get_criteria_from_network_type.ts | 4 +- .../ml/criteria/host_to_criteria.test.ts | 2 +- .../ml/criteria/host_to_criteria.ts | 2 +- .../ml/criteria/network_to_criteria.test.ts | 2 +- .../ml/criteria/network_to_criteria.ts | 2 +- .../components/ml/entity_draggable.test.tsx | 0 .../components/ml/entity_draggable.tsx | 4 +- .../components/ml/get_entries.test.ts | 0 .../{ => common}/components/ml/get_entries.ts | 0 .../create_influencers.test.tsx.snap | 0 .../influencers/create_influencers.test.tsx | 0 .../ml/influencers/create_influencers.tsx | 0 .../get_host_name_from_influencers.test.ts | 0 .../get_host_name_from_influencers.ts | 0 .../get_network_from_influencers.test.ts | 0 .../get_network_from_influencers.ts | 0 .../influencers/host_to_influencers.test.ts | 2 +- .../ml/influencers/host_to_influencers.ts | 2 +- .../network_to_influencers.test.ts | 0 .../ml/influencers/network_to_influencers.ts | 0 .../ml/links/create_explorer_link.test.ts | 0 .../ml/links/create_explorer_link.ts | 0 .../ml/links/create_series_link.test.ts | 0 .../components/ml/links/create_series_link.ts | 0 .../public/{ => common}/components/ml/mock.ts | 0 .../permissions/ml_capabilities_provider.tsx | 4 +- .../components/ml/permissions/translations.ts | 0 .../__snapshots__/anomaly_score.test.tsx.snap | 0 .../anomaly_scores.test.tsx.snap | 0 .../create_descriptions_list.test.tsx.snap | 0 .../draggable_score.test.tsx.snap | 0 .../ml/score/anomaly_score.test.tsx | 0 .../components/ml/score/anomaly_score.tsx | 0 .../ml/score/anomaly_scores.test.tsx | 0 .../components/ml/score/anomaly_scores.tsx | 0 .../ml/score/create_description_list.tsx | 2 +- .../score/create_descriptions_list.test.tsx | 0 .../score/create_entities_from_score.test.ts | 0 .../ml/score/create_entities_from_score.ts | 0 .../ml/score/draggable_score.test.tsx | 0 .../components/ml/score/draggable_score.tsx | 4 +- .../ml/score/get_score_string.test.ts | 0 .../ml/score/get_top_severity.test.ts | 0 .../components/ml/score/get_top_severity.ts | 0 .../components/ml/score/score_health.tsx | 0 .../score/score_interval_to_datetime.test.ts | 0 .../ml/score/score_interval_to_datetime.ts | 0 .../components/ml/score/translations.ts | 0 .../ml/tables/anomalies_host_table.tsx | 2 +- .../ml/tables/anomalies_network_table.tsx | 2 +- .../components/ml/tables/basic_table.tsx | 0 .../tables/convert_anomalies_to_hosts.test.ts | 0 .../ml/tables/convert_anomalies_to_hosts.ts | 0 .../convert_anomalies_to_network.test.ts | 0 .../ml/tables/convert_anomalies_to_network.ts | 0 .../ml/tables/create_compound_key.test.ts | 0 .../ml/tables/create_compound_key.ts | 0 .../get_anomalies_host_table_columns.test.tsx | 2 +- .../get_anomalies_host_table_columns.tsx | 2 +- ...t_anomalies_network_table_columns.test.tsx | 2 +- .../get_anomalies_network_table_columns.tsx | 4 +- .../ml/tables/host_equality.test.ts | 2 +- .../components/ml/tables/host_equality.ts | 0 .../ml/tables/network_equality.test.ts | 4 +- .../components/ml/tables/network_equality.ts | 0 .../components/ml/tables/translations.ts | 0 .../{ => common}/components/ml/types.test.ts | 0 .../{ => common}/components/ml/types.ts | 8 +- .../components/ml_popover/__mocks__/api.tsx | 0 .../popover_description.test.tsx.snap | 0 .../upgrade_contents.test.tsx.snap | 0 .../components/ml_popover/api.tsx | 0 .../components/ml_popover/helpers.test.tsx | 0 .../components/ml_popover/helpers.tsx | 0 .../ml_popover/hooks/translations.ts | 0 .../ml_popover/hooks/use_ml_capabilities.tsx | 0 .../ml_popover/hooks/use_siem_jobs.tsx | 4 +- .../hooks/use_siem_jobs_helpers.test.tsx | 0 .../hooks/use_siem_jobs_helpers.tsx | 0 .../__snapshots__/job_switch.test.tsx.snap | 0 .../__snapshots__/jobs_table.test.tsx.snap | 0 .../__snapshots__/showing_count.test.tsx.snap | 0 .../groups_filter_popover.test.tsx.snap | 0 .../jobs_table_filters.test.tsx.snap | 0 .../filters/groups_filter_popover.test.tsx | 0 .../filters/groups_filter_popover.tsx | 0 .../filters/jobs_table_filters.test.tsx | 0 .../jobs_table/filters/jobs_table_filters.tsx | 2 +- .../filters/toggle_selected_group.test.tsx | 0 .../filters/toggle_selected_group.tsx | 0 .../jobs_table/filters/translations.ts | 0 .../ml_popover/jobs_table/job_switch.test.tsx | 0 .../ml_popover/jobs_table/job_switch.tsx | 2 +- .../ml_popover/jobs_table/jobs_table.test.tsx | 0 .../ml_popover/jobs_table/jobs_table.tsx | 0 .../jobs_table/showing_count.test.tsx | 0 .../ml_popover/jobs_table/showing_count.tsx | 0 .../ml_popover/jobs_table/translations.ts | 0 .../components/ml_popover/ml_modules.tsx | 0 .../components/ml_popover/ml_popover.test.tsx | 0 .../components/ml_popover/ml_popover.tsx | 2 +- .../ml_popover/popover_description.test.tsx | 0 .../ml_popover/popover_description.tsx | 0 .../components/ml_popover/translations.ts | 0 .../components/ml_popover/types.ts | 2 +- .../ml_popover/upgrade_contents.test.tsx | 0 .../ml_popover/upgrade_contents.tsx | 0 .../navigation/breadcrumbs/index.test.ts | 4 +- .../navigation/breadcrumbs/index.ts | 19 +- .../components/navigation/helpers.ts | 4 +- .../components/navigation/index.test.tsx | 4 +- .../components/navigation/index.tsx | 0 .../navigation/tab_navigation/index.test.tsx | 8 +- .../navigation/tab_navigation/index.tsx | 0 .../navigation/tab_navigation/types.ts | 6 +- .../components/navigation/types.ts | 6 +- .../navigation/use_get_url_search.tsx | 0 .../components/news_feed/helpers.test.ts | 2 +- .../components/news_feed/helpers.ts | 0 .../components/news_feed/index.tsx | 0 .../components/news_feed/news_feed.tsx | 4 +- .../components/news_feed/news_link/index.tsx | 0 .../components/news_feed/no_news/index.tsx | 0 .../components/news_feed/post/index.tsx | 0 .../components/news_feed/translations.ts | 0 .../components/news_feed/types.ts | 0 .../{ => common}/components/page/index.tsx | 0 .../components/page/manage_query.tsx | 2 +- .../components/page/translations.ts | 0 .../components/page_route/index.tsx | 0 .../components/page_route/pageroute.test.tsx | 0 .../components/page_route/pageroute.tsx | 0 .../__snapshots__/index.test.tsx.snap | 0 .../paginated_table/helpers.test.ts | 0 .../components/paginated_table/helpers.ts | 2 +- .../components/paginated_table/index.mock.tsx | 0 .../components/paginated_table/index.test.tsx | 4 +- .../components/paginated_table/index.tsx | 20 +- .../paginated_table/translations.ts | 0 .../components/panel/index.test.tsx | 0 .../{ => common}/components/panel/index.tsx | 0 .../__snapshots__/index.test.tsx.snap | 0 .../components/progress_inline/index.test.tsx | 0 .../components/progress_inline/index.tsx | 0 .../components/query_bar/index.test.tsx | 4 +- .../components/query_bar/index.tsx | 4 +- .../components/scroll_to_top/index.test.tsx | 0 .../components/scroll_to_top/index.tsx | 0 .../components/search_bar/index.tsx | 4 +- .../components/search_bar/selectors.ts | 2 +- .../__snapshots__/index.test.tsx.snap | 0 .../components/selectable_text/index.test.tsx | 0 .../components/selectable_text/index.tsx | 0 .../components/sidebar_header/index.tsx | 0 .../__snapshots__/index.test.tsx.snap | 0 .../components/stat_items/index.test.tsx | 10 +- .../components/stat_items/index.tsx | 2 +- .../__snapshots__/index.test.tsx.snap | 0 .../components/subtitle/index.test.tsx | 0 .../components/subtitle/index.tsx | 0 .../super_date_picker/index.test.tsx | 8 +- .../components/super_date_picker/index.tsx | 5 +- .../super_date_picker/selectors.test.ts | 0 .../components/super_date_picker/selectors.ts | 0 .../__snapshots__/helpers.test.tsx.snap | 0 .../components/tables/helpers.test.tsx | 0 .../components/tables/helpers.tsx | 4 +- .../modal_all_errors.test.tsx.snap | 0 .../components/toasters/errors.ts | 0 .../components/toasters/index.test.tsx | 0 .../components/toasters/index.tsx | 0 .../toasters/modal_all_errors.test.tsx | 0 .../components/toasters/modal_all_errors.tsx | 0 .../components/toasters/translations.ts | 0 .../components/toasters/utils.test.ts | 0 .../{ => common}/components/toasters/utils.ts | 0 .../components/top_n/helpers.test.tsx | 0 .../{ => common}/components/top_n/helpers.ts | 2 +- .../components/top_n/index.test.tsx | 16 +- .../{ => common}/components/top_n/index.tsx | 13 +- .../components/top_n/top_n.test.tsx | 0 .../{ => common}/components/top_n/top_n.tsx | 8 +- .../components/top_n/translations.ts | 0 .../__snapshots__/index.test.tsx.snap | 0 .../truncatable_text/index.test.tsx | 0 .../components/truncatable_text/index.tsx | 0 .../components/url_state/constants.ts | 0 .../components/url_state/helpers.test.ts | 4 +- .../components/url_state/helpers.ts | 11 +- .../components/url_state/index.test.tsx | 2 +- .../components/url_state/index.tsx | 4 +- .../url_state/index_mocked.test.tsx | 2 +- .../url_state/initialize_redux_by_url.tsx | 6 +- .../url_state/normalize_time_range.test.ts | 0 .../url_state/normalize_time_range.ts | 0 .../components/url_state/test_dependencies.ts | 13 +- .../components/url_state/types.ts | 4 +- .../components/url_state/use_url_state.tsx | 2 +- .../__snapshots__/utility_bar.test.tsx.snap | 0 .../utility_bar_action.test.tsx.snap | 0 .../utility_bar_group.test.tsx.snap | 0 .../utility_bar_section.test.tsx.snap | 0 .../utility_bar_text.test.tsx.snap | 0 .../components/utility_bar/index.ts | 0 .../components/utility_bar/styles.tsx | 0 .../utility_bar/utility_bar.test.tsx | 0 .../components/utility_bar/utility_bar.tsx | 0 .../utility_bar/utility_bar_action.test.tsx | 0 .../utility_bar/utility_bar_action.tsx | 0 .../utility_bar/utility_bar_group.test.tsx | 0 .../utility_bar/utility_bar_group.tsx | 0 .../utility_bar/utility_bar_section.test.tsx | 0 .../utility_bar/utility_bar_section.tsx | 0 .../utility_bar/utility_bar_text.test.tsx | 0 .../utility_bar/utility_bar_text.tsx | 0 .../public/{ => common}/components/utils.ts | 0 .../components/with_hover_actions/index.tsx | 0 .../__snapshots__/index.test.tsx.snap | 0 .../components/wrapper_page/index.test.tsx | 0 .../components/wrapper_page/index.tsx | 0 .../histogram_configs.ts | 2 +- .../anomalies_query_tab_body/index.tsx | 2 +- .../anomalies_query_tab_body/translations.ts | 0 .../anomalies_query_tab_body/types.ts | 10 +- .../anomalies_query_tab_body/utils.ts | 4 +- .../containers/errors/index.test.tsx | 0 .../{ => common}/containers/errors/index.tsx | 0 .../containers/errors/translations.ts | 0 .../events/last_event_time/index.ts | 8 +- .../last_event_time.gql_query.ts | 0 .../containers/events/last_event_time/mock.ts | 4 +- .../containers/global_time/index.tsx | 0 .../{ => common}/containers/helpers.test.ts | 2 +- .../public/{ => common}/containers/helpers.ts | 2 +- .../containers/kuery_autocompletion/index.tsx | 2 +- .../matrix_histogram/index.gql_query.ts | 0 .../matrix_histogram/index.test.tsx | 2 +- .../containers/matrix_histogram/index.ts | 4 +- .../containers/query_template.tsx | 2 +- .../containers/query_template_paginated.tsx | 2 +- .../containers/source/index.gql_query.ts | 0 .../containers/source/index.test.tsx | 0 .../{ => common}/containers/source/index.tsx | 4 +- .../{ => common}/containers/source/mock.ts | 2 +- .../{ => common}/hooks/api/__mock__/api.tsx | 0 .../public/{ => common}/hooks/api/api.tsx | 2 +- .../{ => common}/hooks/api/helpers.test.tsx | 0 .../public/{ => common}/hooks/api/helpers.tsx | 0 .../public/{ => common}/hooks/translations.ts | 0 .../siem/public/{ => common}/hooks/types.ts | 3 +- .../hooks/use_add_to_timeline.tsx | 4 +- .../{ => common}/hooks/use_index_patterns.tsx | 0 .../hooks/use_providers_portal.tsx | 0 .../{ => common}/lib/clipboard/clipboard.tsx | 0 .../lib/clipboard/translations.ts | 0 .../lib/clipboard/with_copy_to_clipboard.tsx | 0 .../{ => common}/lib/compose/helpers.test.ts | 2 +- .../{ => common}/lib/compose/helpers.ts | 0 .../lib/compose/kibana_compose.tsx | 5 +- .../components/connector_flyout/index.tsx | 6 +- .../{ => common}/lib/connectors/config.ts | 0 .../{ => common}/lib/connectors/index.ts | 0 .../lib/connectors/jira/config.ts | 0 .../lib/connectors/jira/flyout.tsx | 0 .../lib/connectors/jira/index.tsx | 2 +- .../{ => common}/lib/connectors/jira/logo.svg | 0 .../lib/connectors/jira/translations.ts | 0 .../{ => common}/lib/connectors/jira/types.ts | 4 +- .../lib/connectors/servicenow/config.ts | 0 .../lib/connectors/servicenow/flyout.tsx | 0 .../lib/connectors/servicenow/index.tsx | 2 +- .../lib/connectors/servicenow/logo.svg | 0 .../lib/connectors/servicenow/translations.ts | 0 .../lib/connectors/servicenow/types.ts | 4 +- .../lib/connectors/translations.ts | 0 .../{ => common}/lib/connectors/types.ts | 13 +- .../{ => common}/lib/connectors/utils.ts | 4 +- .../{ => common}/lib/connectors/validators.ts | 0 .../{ => common}/lib/helpers/index.test.tsx | 0 .../public/{ => common}/lib/helpers/index.tsx | 0 .../{ => common}/lib/helpers/scheduler.ts | 0 .../public/{ => common}/lib/history/index.ts | 0 .../{ => common}/lib/keury/index.test.ts | 0 .../public/{ => common}/lib/keury/index.ts | 4 +- .../lib/kibana/__mocks__/index.ts | 0 .../public/{ => common}/lib/kibana/hooks.ts | 6 +- .../public/{ => common}/lib/kibana/index.ts | 0 .../{ => common}/lib/kibana/kibana_react.ts | 4 +- .../{ => common}/lib/kibana/services.ts | 3 +- .../siem/public/{ => common}/lib/lib.ts | 0 .../public/{ => common}/lib/note/index.ts | 0 .../{ => common}/lib/telemetry/index.ts | 2 +- .../{ => common}/lib/telemetry/middleware.ts | 2 +- .../{ => common}/lib/theme/use_eui_theme.tsx | 2 +- .../public/{ => common}/mock/global_state.ts | 11 +- .../siem/public/{ => common}/mock/header.ts | 6 +- .../public/{ => common}/mock/hook_wrapper.tsx | 0 .../siem/public/{ => common}/mock/index.ts | 0 .../public/{ => common}/mock/index_pattern.ts | 0 .../public/{ => common}/mock/kibana_core.ts | 5 +- .../public/{ => common}/mock/kibana_react.ts | 4 +- .../public/{ => common}/mock/match_media.ts | 0 .../{ => common}/mock/mock_detail_item.ts | 2 +- .../siem/public/{ => common}/mock/mock_ecs.ts | 2 +- .../mock/mock_endgame_ecs_data.ts | 2 +- .../{ => common}/mock/mock_timeline_data.ts | 2 +- .../siem/public/{ => common}/mock/netflow.ts | 4 +- .../siem/public/{ => common}/mock/news.ts | 0 .../siem/public/{ => common}/mock/raw_news.ts | 0 .../{ => common}/mock/test_providers.tsx | 7 +- .../{ => common}/mock/timeline_results.ts | 16 +- .../siem/public/{ => common}/mock/utils.ts | 10 + .../siem/public/{ => common}/store/actions.ts | 3 - .../public/{ => common}/store/app/actions.ts | 0 .../public/{ => common}/store/app/index.ts | 0 .../public/{ => common}/store/app/model.ts | 0 .../public/{ => common}/store/app/reducer.ts | 0 .../{ => common}/store/app/selectors.ts | 0 .../public/{ => common}/store/constants.ts | 0 .../store/drag_and_drop/actions.ts | 2 +- .../{ => common}/store/drag_and_drop/index.ts | 0 .../{ => common}/store/drag_and_drop/model.ts | 2 +- .../store/drag_and_drop/reducer.test.ts | 4 +- .../store/drag_and_drop/reducer.ts | 2 +- .../store/drag_and_drop/selectors.ts | 0 .../siem/public/{ => common}/store/epic.ts | 8 +- .../siem/public/{ => common}/store/index.ts | 0 .../{ => common}/store/inputs/actions.ts | 2 +- .../{ => common}/store/inputs/constants.ts | 0 .../{ => common}/store/inputs/helpers.test.ts | 0 .../{ => common}/store/inputs/helpers.ts | 0 .../public/{ => common}/store/inputs/index.ts | 0 .../public/{ => common}/store/inputs/model.ts | 2 +- .../{ => common}/store/inputs/reducer.ts | 0 .../{ => common}/store/inputs/selectors.ts | 0 .../siem/public/{ => common}/store/model.ts | 2 - .../siem/public/common/store/reducer.ts | 46 ++++ .../public/{ => common}/store/selectors.ts | 3 - .../siem/public/{ => common}/store/store.ts | 12 +- .../siem/public/{ => common}/store/types.ts | 0 .../public/{pages => }/common/translations.ts | 0 .../public/{ => common}/utils/api/index.ts | 0 .../{ => common}/utils/apollo_context.ts | 0 .../utils/default_date_settings.test.ts | 4 +- .../utils/default_date_settings.ts | 2 +- .../utils/kql/use_update_kql.test.tsx | 4 +- .../{ => common}/utils/kql/use_update_kql.tsx | 2 +- .../utils/logo_endpoint/64_color.svg | 0 .../{ => common}/utils/route/helpers.ts | 0 .../{ => common}/utils/route/index.test.tsx | 2 +- .../utils/route/manage_spy_routes.tsx | 0 .../{ => common}/utils/route/spy_routes.tsx | 0 .../public/{ => common}/utils/route/types.ts | 8 +- .../utils/route/use_route_spy.tsx | 0 .../utils/saved_query_services/index.tsx | 2 +- .../utils/timeline/use_show_timeline.tsx | 2 +- .../{ => common}/utils/use_mount_appended.ts | 0 .../{ => common}/utils/validators/index.ts | 0 .../public/components/page/network/index.tsx | 12 - .../__snapshots__/index.test.tsx.snap | 0 .../authentications_table/index.test.tsx | 10 +- .../authentications_table/index.tsx | 27 ++- .../components}/authentications_table/mock.ts | 2 +- .../authentications_table/translations.ts | 0 .../first_last_seen_host/index.test.tsx | 6 +- .../first_last_seen_host/index.tsx | 6 +- .../__snapshots__/index.test.tsx.snap | 0 .../components}/hosts_table/columns.tsx | 22 +- .../components}/hosts_table/index.test.tsx | 18 +- .../components}/hosts_table/index.tsx | 11 +- .../components}/hosts_table/mock.ts | 2 +- .../components}/hosts_table/translations.ts | 0 .../__snapshots__/index.test.tsx.snap | 0 .../components}/kpi_hosts/index.test.tsx | 2 +- .../components}/kpi_hosts/index.tsx | 10 +- .../kpi_hosts/kpi_host_details_mapping.ts | 2 +- .../kpi_hosts/kpi_hosts_mapping.ts | 2 +- .../components}/kpi_hosts/mock.tsx | 0 .../components}/kpi_hosts/translations.ts | 0 .../components}/kpi_hosts/types.ts | 0 .../__snapshots__/index.test.tsx.snap | 0 .../uncommon_process_table/index.test.tsx | 10 +- .../uncommon_process_table/index.tsx | 16 +- .../uncommon_process_table/mock.ts | 2 +- .../uncommon_process_table/translations.ts | 0 .../authentications/index.gql_query.ts | 0 .../containers/authentications/index.tsx | 19 +- .../first_last_seen.gql_query.ts | 0 .../containers/hosts/first_last_seen/index.ts | 10 +- .../containers/hosts/first_last_seen/mock.ts | 4 +- .../containers/hosts/hosts_table.gql_query.ts | 0 .../{ => hosts}/containers/hosts/index.tsx | 19 +- .../hosts/overview/host_overview.gql_query.ts | 0 .../containers/hosts/overview/index.tsx | 12 +- .../kpi_host_details/index.gql_query.tsx | 0 .../containers/kpi_host_details/index.tsx | 12 +- .../containers/kpi_hosts/index.gql_query.ts | 0 .../containers/kpi_hosts/index.tsx | 12 +- .../uncommon_processes/index.gql_query.ts | 0 .../containers/uncommon_processes/index.tsx | 19 +- x-pack/plugins/siem/public/hosts/index.ts | 23 ++ .../pages}/details/details_tabs.test.tsx | 12 +- .../pages}/details/details_tabs.tsx | 12 +- .../pages}/details/helpers.test.ts | 0 .../hosts => hosts/pages}/details/helpers.ts | 2 +- .../hosts => hosts/pages}/details/index.tsx | 49 +++-- .../pages}/details/nav_tabs.test.tsx | 2 +- .../pages}/details/nav_tabs.tsx | 6 +- .../hosts => hosts/pages}/details/types.ts | 10 +- .../hosts => hosts/pages}/details/utils.ts | 12 +- .../hosts => hosts/pages}/hosts.test.tsx | 25 ++- .../{pages/hosts => hosts/pages}/hosts.tsx | 40 ++-- .../pages}/hosts_empty_page.tsx | 7 +- .../hosts => hosts/pages}/hosts_tabs.tsx | 12 +- .../{pages/hosts => hosts/pages}/index.tsx | 6 +- .../hosts => hosts/pages}/nav_tabs.test.tsx | 2 +- .../{pages/hosts => hosts/pages}/nav_tabs.tsx | 4 +- .../navigation/alerts_query_tab_body.tsx | 2 +- .../authentications_query_tab_body.tsx | 14 +- .../navigation/events_query_tab_body.tsx | 10 +- .../navigation/hosts_query_tab_body.tsx | 6 +- .../hosts => hosts/pages}/navigation/index.ts | 0 .../hosts => hosts/pages}/navigation/types.ts | 10 +- .../uncommon_process_query_tab_body.tsx | 6 +- .../hosts => hosts/pages}/translations.ts | 0 .../{pages/hosts => hosts/pages}/types.ts | 8 +- x-pack/plugins/siem/public/hosts/routes.tsx | 18 ++ .../{store/hosts => hosts/store}/actions.ts | 0 .../hosts => hosts/store}/helpers.test.ts | 2 +- .../{store/hosts => hosts/store}/helpers.ts | 2 +- .../{store/hosts => hosts/store}/index.ts | 9 + .../{store/hosts => hosts/store}/model.ts | 0 .../{store/hosts => hosts/store}/reducer.ts | 2 +- .../{store/hosts => hosts/store}/selectors.ts | 2 +- .../arrows/__snapshots__/index.test.tsx.snap | 0 .../components/arrows/helpers.test.ts | 0 .../components/arrows/helpers.ts | 0 .../components/arrows/index.test.tsx | 2 +- .../{ => network}/components/arrows/index.tsx | 0 .../components/direction/direction.test.tsx | 0 .../components/direction/index.tsx | 4 +- .../components/embeddables/__mocks__/mock.ts | 2 +- .../__snapshots__/embeddable.test.tsx.snap | 0 .../embeddable_header.test.tsx.snap | 0 .../__snapshots__/embedded_map.test.tsx.snap | 0 ...ndex_patterns_missing_prompt.test.tsx.snap | 0 .../embeddables/embeddable.test.tsx | 0 .../components/embeddables/embeddable.tsx | 0 .../embeddables/embeddable_header.test.tsx | 2 +- .../embeddables/embeddable_header.tsx | 0 .../embeddables/embedded_map.test.tsx | 6 +- .../components/embeddables/embedded_map.tsx | 23 +- .../embeddables/embedded_map_helpers.test.tsx | 2 +- .../embeddables/embedded_map_helpers.tsx | 10 +- .../index_patterns_missing_prompt.test.tsx | 2 +- .../index_patterns_missing_prompt.tsx | 2 +- .../components/embeddables/map_config.test.ts | 0 .../components/embeddables/map_config.ts | 2 +- .../line_tool_tip_content.test.tsx.snap | 0 .../__snapshots__/map_tool_tip.test.tsx.snap | 0 .../point_tool_tip_content.test.tsx.snap | 0 .../tooltip_footer.test.tsx.snap | 0 .../line_tool_tip_content.test.tsx | 0 .../map_tool_tip/line_tool_tip_content.tsx | 0 .../map_tool_tip/map_tool_tip.test.tsx | 0 .../embeddables/map_tool_tip/map_tool_tip.tsx | 2 +- .../point_tool_tip_content.test.tsx | 10 +- .../map_tool_tip/point_tool_tip_content.tsx | 15 +- .../map_tool_tip/tooltip_footer.test.tsx | 0 .../map_tool_tip/tooltip_footer.tsx | 0 .../components/embeddables/translations.ts | 0 .../components/embeddables/types.ts | 4 +- .../flow_direction_select.test.tsx.snap | 0 .../flow_target_select.test.tsx.snap | 0 .../flow_direction_select.test.tsx | 2 +- .../flow_controls/flow_direction_select.tsx | 2 +- .../flow_controls/flow_target_select.test.tsx | 2 +- .../flow_controls/flow_target_select.tsx | 2 +- .../components/flow_controls/translations.ts | 0 .../index.test.tsx | 4 +- .../flow_target_select_connected/index.tsx | 6 +- .../ip/__snapshots__/index.test.tsx.snap | 0 .../components/ip/index.test.tsx | 4 +- .../{ => network}/components/ip/index.tsx | 2 +- .../__snapshots__/index.test.tsx.snap | 0 .../components}/ip_overview/index.test.tsx | 20 +- .../components}/ip_overview/index.tsx | 28 +-- .../components}/ip_overview/mock.ts | 2 +- .../components}/ip_overview/translations.ts | 0 .../__snapshots__/index.test.tsx.snap | 0 .../components}/kpi_network/index.test.tsx | 9 +- .../components}/kpi_network/index.tsx | 6 +- .../components}/kpi_network/mock.ts | 4 +- .../components}/kpi_network/translations.ts | 0 .../__snapshots__/index.test.tsx.snap | 0 .../is_ptr_included.test.tsx.snap | 0 .../components}/network_dns_table/columns.tsx | 19 +- .../network_dns_table/index.test.tsx | 16 +- .../components}/network_dns_table/index.tsx | 8 +- .../is_ptr_included.test.tsx | 2 +- .../network_dns_table/is_ptr_included.tsx | 0 .../components}/network_dns_table/mock.ts | 2 +- .../network_dns_table/translations.ts | 0 .../__snapshots__/index.test.tsx.snap | 0 .../network_http_table/columns.tsx | 15 +- .../network_http_table/index.test.tsx | 16 +- .../components}/network_http_table/index.tsx | 8 +- .../components}/network_http_table/mock.ts | 2 +- .../network_http_table/translations.ts | 0 .../__snapshots__/index.test.tsx.snap | 0 .../network_top_countries_table/columns.tsx | 23 +- .../index.test.tsx | 14 +- .../network_top_countries_table/index.tsx | 9 +- .../network_top_countries_table/mock.ts | 2 +- .../translations.ts | 0 .../__snapshots__/index.test.tsx.snap | 0 .../network_top_n_flow_table/columns.tsx | 30 ++- .../network_top_n_flow_table/index.test.tsx | 19 +- .../network_top_n_flow_table/index.tsx | 9 +- .../network_top_n_flow_table/mock.ts | 2 +- .../network_top_n_flow_table/translations.ts | 0 .../port/__snapshots__/index.test.tsx.snap | 0 .../components/port/index.test.tsx | 4 +- .../{ => network}/components/port/index.tsx | 8 +- .../__snapshots__/index.test.tsx.snap | 0 .../source_destination/country_flag.tsx | 0 .../source_destination/field_names.ts | 0 .../source_destination/geo_fields.tsx | 2 +- .../source_destination/index.test.tsx | 12 +- .../components/source_destination/index.tsx | 0 .../source_destination/ip_with_port.tsx | 0 .../components/source_destination/label.tsx | 0 .../components/source_destination/network.tsx | 4 +- .../source_destination_arrows.tsx | 4 +- .../source_destination_ip.test.tsx | 12 +- .../source_destination_ip.tsx | 2 +- .../source_destination_with_arrows.tsx | 0 .../source_destination/translations.ts | 0 .../components/source_destination/types.ts | 0 .../__snapshots__/index.test.tsx.snap | 0 .../components}/tls_table/columns.tsx | 13 +- .../components}/tls_table/index.test.tsx | 17 +- .../components}/tls_table/index.tsx | 13 +- .../components}/tls_table/mock.ts | 2 +- .../components}/tls_table/translations.ts | 0 .../__snapshots__/index.test.tsx.snap | 0 .../components}/users_table/columns.tsx | 11 +- .../components}/users_table/index.test.tsx | 18 +- .../components}/users_table/index.tsx | 15 +- .../components}/users_table/mock.ts | 2 +- .../components}/users_table/translations.ts | 0 .../containers/ip_overview/index.gql_query.ts | 0 .../containers/ip_overview/index.tsx | 14 +- .../containers/kpi_network/index.gql_query.ts | 0 .../containers/kpi_network/index.tsx | 12 +- .../containers/network_dns/index.gql_query.ts | 0 .../containers/network_dns/index.tsx | 31 ++- .../network_http/index.gql_query.ts | 0 .../containers/network_http/index.tsx | 18 +- .../network_top_countries/index.gql_query.ts | 0 .../network_top_countries/index.tsx | 18 +- .../network_top_n_flow/index.gql_query.ts | 0 .../containers/network_top_n_flow/index.tsx | 18 +- .../containers/tls/index.gql_query.ts | 0 .../{ => network}/containers/tls/index.tsx | 18 +- .../containers/users/index.gql_query.ts | 0 .../{ => network}/containers/users/index.tsx | 18 +- x-pack/plugins/siem/public/network/index.ts | 23 ++ .../network => network/pages}/index.tsx | 6 +- .../__snapshots__/index.test.tsx.snap | 0 .../pages}/ip_details/index.test.tsx | 26 ++- .../pages}/ip_details/index.tsx | 51 +++-- .../ip_details/network_http_query_table.tsx | 6 +- .../network_top_countries_query_table.tsx | 6 +- .../network_top_n_flow_query_table.tsx | 6 +- .../pages}/ip_details/tls_query_table.tsx | 6 +- .../pages}/ip_details/types.ts | 6 +- .../pages}/ip_details/users_query_table.tsx | 6 +- .../pages}/ip_details/utils.ts | 12 +- .../navigation/alerts_query_tab_body.tsx | 2 +- .../navigation/conditional_flex_group.tsx | 0 .../navigation/countries_query_tab_body.tsx | 8 +- .../pages}/navigation/dns_query_tab_body.tsx | 12 +- .../pages}/navigation/http_query_tab_body.tsx | 8 +- .../pages}/navigation/index.ts | 0 .../pages}/navigation/ips_query_tab_body.tsx | 8 +- .../pages}/navigation/nav_tabs.tsx | 0 .../pages}/navigation/network_routes.tsx | 10 +- .../navigation/network_routes_loading.tsx | 0 .../pages}/navigation/tls_query_tab_body.tsx | 6 +- .../pages}/navigation/types.ts | 8 +- .../pages}/navigation/utils.ts | 0 .../pages}/network.test.tsx | 22 +- .../network => network/pages}/network.tsx | 38 ++-- .../pages}/network_empty_page.tsx | 6 +- .../network => network/pages}/translations.ts | 0 .../{pages/network => network/pages}/types.ts | 4 +- x-pack/plugins/siem/public/network/routes.tsx | 18 ++ .../network => network/store}/actions.ts | 3 +- .../network => network/store}/helpers.test.ts | 2 +- .../network => network/store}/helpers.ts | 2 +- .../{store/network => network/store}/index.ts | 10 + .../{store/network => network/store}/model.ts | 0 .../network => network/store}/reducer.ts | 2 +- .../network => network/store}/selectors.ts | 2 +- .../alerts_by_category/index.test.tsx | 10 +- .../components}/alerts_by_category/index.tsx | 24 +- .../components}/event_counts/index.test.tsx | 6 +- .../components}/event_counts/index.tsx | 14 +- .../events_by_dataset/__mocks__/index.tsx | 0 .../components}/events_by_dataset/index.tsx | 28 +-- .../__snapshots__/index.test.tsx.snap | 0 .../components}/host_overview/index.test.tsx | 4 +- .../components}/host_overview/index.tsx | 36 +-- .../components}/host_overview/mock.ts | 2 +- .../components}/host_overview/translations.ts | 0 .../loading_placeholders/index.tsx | 0 .../components}/overview_empty/index.tsx | 6 +- .../components}/overview_host/index.test.tsx | 24 +- .../components}/overview_host/index.tsx | 25 +-- .../__snapshots__/index.test.tsx.snap | 0 .../overview_host_stats/index.test.tsx | 2 +- .../components}/overview_host_stats/index.tsx | 2 +- .../components}/overview_host_stats/mock.ts | 2 +- .../overview_network/index.test.tsx | 24 +- .../components}/overview_network/index.tsx | 22 +- .../__snapshots__/index.test.tsx.snap | 0 .../overview_network_stats/index.test.tsx | 2 +- .../overview_network_stats/index.tsx | 2 +- .../overview_network_stats/mock.ts | 2 +- .../components/recent_cases/filters/index.tsx | 0 .../components/recent_cases/index.tsx | 13 +- .../recent_cases/no_cases/index.tsx | 6 +- .../components/recent_cases/recent_cases.tsx | 10 +- .../components/recent_cases/translations.ts | 0 .../components/recent_cases/types.ts | 0 .../recent_timelines/counts/index.tsx | 7 +- .../recent_timelines/filters/index.tsx | 0 .../recent_timelines/header/index.tsx | 7 +- .../components/recent_timelines/index.tsx | 24 +- .../recent_timelines/recent_timelines.tsx | 7 +- .../recent_timelines/translations.ts | 0 .../components/recent_timelines/types.ts | 0 .../components}/sidebar/index.tsx | 4 +- .../components}/sidebar/sidebar.tsx | 24 +- .../components}/signals_by_category/index.tsx | 16 +- .../components}/stat_value.tsx | 4 +- .../overview => overview/components}/types.ts | 0 .../overview_host/index.gql_query.ts | 0 .../containers}/overview_host/index.tsx | 10 +- .../overview_network/index.gql_query.ts | 0 .../containers}/overview_network/index.tsx | 10 +- x-pack/plugins/siem/public/overview/index.ts | 18 ++ .../overview => overview/pages}/index.tsx | 0 .../pages}/overview.test.tsx | 12 +- .../overview => overview/pages}/overview.tsx | 31 +-- .../overview => overview/pages}/summary.tsx | 2 +- .../pages}/translations.ts | 0 .../plugins/siem/public/overview/routes.tsx | 15 ++ .../plugins/siem/public/pages/home/types.ts | 26 --- x-pack/plugins/siem/public/plugin.tsx | 63 +++++- x-pack/plugins/siem/public/store/reducer.ts | 47 ---- .../certificate_fingerprint/index.test.tsx | 4 +- .../certificate_fingerprint/index.tsx | 6 +- .../certificate_fingerprint/translations.ts | 0 .../components/duration/index.test.tsx | 4 +- .../components/duration/index.tsx | 2 +- .../edit_data_provider/helpers.test.tsx | 2 +- .../components/edit_data_provider/helpers.tsx | 2 +- .../edit_data_provider/index.test.tsx | 4 +- .../components/edit_data_provider/index.tsx | 2 +- .../edit_data_provider/translations.ts | 0 .../field_renderers.test.tsx.snap | 0 .../field_renderers/field_renderers.test.tsx | 10 +- .../field_renderers/field_renderers.tsx | 26 ++- .../fields_browser/categories_pane.test.tsx | 2 +- .../fields_browser/categories_pane.tsx | 2 +- .../fields_browser/category.test.tsx | 6 +- .../components/fields_browser/category.tsx | 2 +- .../fields_browser/category_columns.test.tsx | 2 +- .../fields_browser/category_columns.tsx | 8 +- .../fields_browser/category_title.test.tsx | 2 +- .../fields_browser/category_title.tsx | 4 +- .../fields_browser/field_browser.test.tsx | 4 +- .../fields_browser/field_browser.tsx | 4 +- .../fields_browser/field_items.test.tsx | 8 +- .../components/fields_browser/field_items.tsx | 28 ++- .../fields_browser/field_name.test.tsx | 6 +- .../components/fields_browser/field_name.tsx | 6 +- .../fields_browser/fields_pane.test.tsx | 6 +- .../components/fields_browser/fields_pane.tsx | 4 +- .../components/fields_browser/header.test.tsx | 4 +- .../components/fields_browser/header.tsx | 8 +- .../fields_browser/helpers.test.tsx | 4 +- .../components/fields_browser/helpers.tsx | 2 +- .../components/fields_browser/index.test.tsx | 6 +- .../components/fields_browser/index.tsx | 6 +- .../components/fields_browser/translations.ts | 0 .../components/fields_browser/types.ts | 4 +- .../flyout/__snapshots__/index.test.tsx.snap | 0 .../components/flyout/button/index.tsx | 7 +- .../components/flyout/button/translations.ts | 0 .../components/flyout/header/index.tsx | 24 +- .../__snapshots__/index.test.tsx.snap | 0 .../header_with_close_button/index.test.tsx | 2 +- .../flyout/header_with_close_button/index.tsx | 0 .../header_with_close_button/translations.ts | 0 .../components/flyout/index.test.tsx | 33 ++- .../components/flyout/index.tsx | 4 +- .../pane/__snapshots__/index.test.tsx.snap | 0 .../components/flyout/pane/index.test.tsx | 2 +- .../components/flyout/pane/index.tsx | 4 +- .../flyout/pane/timeline_resize_handle.tsx | 0 .../components/flyout/pane/translations.ts | 0 .../formatted_duration/helpers.test.ts | 2 +- .../components/formatted_duration/helpers.tsx | 2 +- .../components/formatted_duration/index.tsx | 0 .../formatted_duration/tooltip/index.tsx | 0 .../formatted_duration/translations.ts | 0 .../components/formatted_ip/index.tsx | 20 +- .../components/ja3_fingerprint/index.test.tsx | 4 +- .../components/ja3_fingerprint/index.tsx | 6 +- .../ja3_fingerprint/translations.ts | 0 .../components/lazy_accordion/index.tsx | 0 .../components/loading/index.tsx | 0 .../netflow/__snapshots__/index.test.tsx.snap | 0 .../components/netflow/fingerprints/index.tsx | 0 .../components/netflow/index.test.tsx | 23 +- .../components/netflow/index.tsx | 0 .../duration_event_start_end.tsx | 4 +- .../netflow/netflow_columns/index.tsx | 2 +- .../netflow/netflow_columns/types.ts | 0 .../netflow/netflow_columns/user_process.tsx | 2 +- .../components/netflow/types.ts | 0 .../__snapshots__/index.test.tsx.snap | 0 .../__snapshots__/new_note.test.tsx.snap | 0 .../components/notes/add_note/index.test.tsx | 0 .../components/notes/add_note/index.tsx | 2 +- .../notes/add_note/new_note.test.tsx | 0 .../components/notes/add_note/new_note.tsx | 2 +- .../components/notes/columns.tsx | 0 .../components/notes/helpers.tsx | 4 +- .../components/notes/index.tsx | 2 +- .../note_card_body.test.tsx.snap | 0 .../components/notes/note_card/index.test.tsx | 0 .../components/notes/note_card/index.tsx | 0 .../notes/note_card/note_card_body.test.tsx | 0 .../notes/note_card/note_card_body.tsx | 6 +- .../notes/note_card/note_card_header.test.tsx | 0 .../notes/note_card/note_card_header.tsx | 0 .../notes/note_card/note_created.test.tsx | 0 .../notes/note_card/note_created.tsx | 2 +- .../notes/note_cards/index.test.tsx | 2 +- .../components/notes/note_cards/index.tsx | 2 +- .../components/notes/translations.ts | 0 .../components/open_timeline/constants.ts | 0 .../delete_timeline_modal.test.tsx | 0 .../delete_timeline_modal.tsx | 0 .../delete_timeline_modal/index.test.tsx | 0 .../delete_timeline_modal/index.tsx | 0 .../open_timeline/edit_timeline_actions.tsx | 0 .../edit_timeline_batch_actions.tsx | 0 .../export_timeline/export_timeline.test.tsx | 0 .../export_timeline/export_timeline.tsx | 7 +- .../export_timeline/index.test.tsx | 0 .../open_timeline/export_timeline/index.tsx | 2 +- .../open_timeline/export_timeline/mocks.ts | 0 .../components/open_timeline/helpers.test.ts | 22 +- .../components/open_timeline/helpers.ts | 17 +- .../components/open_timeline/index.test.tsx | 16 +- .../components/open_timeline/index.tsx | 18 +- .../note_previews/index.test.tsx | 2 +- .../open_timeline/note_previews/index.tsx | 0 .../note_previews/note_preview.test.tsx | 2 +- .../note_previews/note_preview.tsx | 6 +- .../open_timeline/open_timeline.test.tsx | 6 +- .../open_timeline/open_timeline.tsx | 6 +- .../open_timeline_modal/index.test.tsx | 16 +- .../open_timeline_modal/index.tsx | 4 +- .../open_timeline_modal_body.test.tsx | 6 +- .../open_timeline_modal_body.tsx | 0 .../open_timeline_modal_button.test.tsx | 6 +- .../open_timeline_modal_button.tsx | 0 .../open_timeline/search_row/index.test.tsx | 0 .../open_timeline/search_row/index.tsx | 0 .../timelines_table/actions_columns.test.tsx | 4 +- .../timelines_table/actions_columns.tsx | 0 .../timelines_table/common_columns.test.tsx | 6 +- .../timelines_table/common_columns.tsx | 4 +- .../timelines_table/common_styles.ts | 0 .../timelines_table/extended_columns.test.tsx | 6 +- .../timelines_table/extended_columns.tsx | 2 +- .../icon_header_columns.test.tsx | 4 +- .../timelines_table/icon_header_columns.tsx | 0 .../timelines_table/index.test.tsx | 4 +- .../open_timeline/timelines_table/index.tsx | 0 .../open_timeline/timelines_table/mocks.ts | 2 +- .../open_timeline/title_row/index.test.tsx | 0 .../open_timeline/title_row/index.tsx | 2 +- .../components/open_timeline/translations.ts | 0 .../components/open_timeline/types.ts | 8 +- .../open_timeline/use_timeline_types.tsx | 9 +- .../__snapshots__/timeline.test.tsx.snap | 0 .../__examples__/index.stories.tsx | 0 .../timeline}/and_or_badge/index.tsx | 0 .../timeline}/and_or_badge/translations.ts | 0 .../timeline/auto_save_warning/index.tsx | 11 +- .../auto_save_warning/translations.ts | 0 .../timeline/body/actions/index.test.tsx | 2 +- .../timeline/body/actions/index.tsx | 6 +- .../__snapshots__/index.test.tsx.snap | 0 .../body/column_headers/actions/index.tsx | 2 +- .../body/column_headers/column_header.tsx | 4 +- .../common/dragging_container.tsx | 0 .../body/column_headers/common/styles.tsx | 0 .../body/column_headers/default_headers.ts | 0 .../column_headers/events_select/helpers.tsx | 2 +- .../column_headers/events_select/index.tsx | 0 .../events_select/translations.ts | 0 .../filter/__snapshots__/index.test.tsx.snap | 0 .../body/column_headers/filter/index.test.tsx | 2 +- .../body/column_headers/filter/index.tsx | 2 +- .../header/__snapshots__/index.test.tsx.snap | 0 .../column_headers/header/header_content.tsx | 4 +- .../body/column_headers/header/helpers.ts | 6 +- .../body/column_headers/header/index.test.tsx | 6 +- .../body/column_headers/header/index.tsx | 2 +- .../__snapshots__/index.test.tsx.snap | 0 .../header_tooltip_content/index.test.tsx | 4 +- .../header_tooltip_content/index.tsx | 4 +- .../body/column_headers/helpers.test.ts | 0 .../timeline/body/column_headers/helpers.ts | 4 +- .../body/column_headers/index.test.tsx | 8 +- .../timeline/body/column_headers/index.tsx | 13 +- .../range_picker/index.test.tsx | 0 .../column_headers/range_picker/index.tsx | 0 .../column_headers/range_picker/ranges.ts | 0 .../range_picker/translations.ts | 0 .../__snapshots__/index.test.tsx.snap | 0 .../column_headers/text_filter/index.test.tsx | 0 .../body/column_headers/text_filter/index.tsx | 0 .../body/column_headers/translations.ts | 0 .../components/timeline/body/column_id.ts | 0 .../components/timeline/body/constants.ts | 0 .../__snapshots__/index.test.tsx.snap | 0 .../body/data_driven_columns/index.test.tsx | 2 +- .../body/data_driven_columns/index.tsx | 4 +- .../body/events/event_column_view.tsx | 6 +- .../components/timeline/body/events/index.tsx | 10 +- .../timeline/body/events/stateful_event.tsx | 16 +- .../components/timeline/body/helpers.test.ts | 2 +- .../components/timeline/body/helpers.ts | 4 +- .../components/timeline/body/index.test.tsx | 14 +- .../components/timeline/body/index.tsx | 8 +- .../body/mini_map/date_ranges.test.ts | 0 .../timeline/body/mini_map/date_ranges.ts | 0 .../__snapshots__/args.test.tsx.snap | 0 .../empty_column_renderer.test.tsx.snap | 0 .../formatted_field.test.tsx.snap | 0 .../get_column_renderer.test.tsx.snap | 0 .../get_row_renderer.test.tsx.snap | 0 .../host_working_dir.test.tsx.snap | 0 .../plain_column_renderer.test.tsx.snap | 0 .../plain_row_renderer.test.tsx.snap | 0 .../process_draggable.test.tsx.snap | 0 .../unknown_column_renderer.test.tsx.snap | 0 .../user_host_working_dir.test.tsx.snap | 0 .../timeline/body/renderers/args.test.tsx | 4 +- .../timeline/body/renderers/args.tsx | 2 +- .../generic_details.test.tsx.snap | 0 .../generic_file_details.test.tsx.snap | 0 .../generic_row_renderer.test.tsx.snap | 0 .../primary_secondary_user_info.test.tsx.snap | 0 ...ession_user_host_working_dir.test.tsx.snap | 0 .../renderers/auditd/generic_details.test.tsx | 8 +- .../body/renderers/auditd/generic_details.tsx | 6 +- .../auditd/generic_file_details.test.tsx | 8 +- .../renderers/auditd/generic_file_details.tsx | 6 +- .../auditd/generic_row_renderer.test.tsx | 12 +- .../renderers/auditd/generic_row_renderer.tsx | 0 .../primary_secondary_user_info.test.tsx | 4 +- .../auditd/primary_secondary_user_info.tsx | 2 +- .../session_user_host_working_dir.test.tsx | 4 +- .../auditd/session_user_host_working_dir.tsx | 2 +- .../body/renderers/auditd/translations.ts | 0 .../body/renderers}/bytes/index.test.tsx | 6 +- .../timeline/body/renderers}/bytes/index.tsx | 4 +- .../body/renderers/column_renderer.ts | 4 +- .../timeline/body/renderers/constants.tsx | 0 .../dns/dns_request_event_details.test.tsx | 8 +- .../dns/dns_request_event_details.tsx | 4 +- .../dns_request_event_details_line.test.tsx | 4 +- .../dns/dns_request_event_details_line.tsx | 2 +- .../body/renderers/dns/translations.ts | 0 .../renderers/empty_column_renderer.test.tsx | 8 +- .../body/renderers/empty_column_renderer.tsx | 13 +- .../endgame_security_event_details.test.tsx | 8 +- .../endgame_security_event_details.tsx | 4 +- ...dgame_security_event_details_line.test.tsx | 4 +- .../endgame_security_event_details_line.tsx | 2 +- .../body/renderers/endgame/helpers.test.tsx | 0 .../body/renderers/endgame/helpers.ts | 0 .../body/renderers/endgame/translations.ts | 0 .../renderers/exit_code_draggable.test.tsx | 4 +- .../body/renderers/exit_code_draggable.tsx | 2 +- .../body/renderers/file_draggable.test.tsx | 4 +- .../body/renderers/file_draggable.tsx | 2 +- .../body/renderers/formatted_field.test.tsx | 8 +- .../body/renderers/formatted_field.tsx | 19 +- .../renderers/formatted_field_helpers.tsx | 12 +- .../renderers/get_column_renderer.test.tsx | 10 +- .../body/renderers/get_column_renderer.ts | 2 +- .../body/renderers/get_row_renderer.test.tsx | 10 +- .../body/renderers/get_row_renderer.ts | 2 +- .../timeline/body/renderers/helpers.test.tsx | 4 +- .../timeline/body/renderers/helpers.tsx | 2 +- .../body/renderers/host_working_dir.test.tsx | 4 +- .../body/renderers/host_working_dir.tsx | 2 +- .../timeline/body/renderers/index.ts | 0 .../timeline/body/renderers/netflow.tsx | 22 +- .../netflow_row_renderer.test.tsx.snap | 0 .../netflow/netflow_row_renderer.test.tsx | 10 +- .../netflow/netflow_row_renderer.tsx | 20 +- .../parent_process_draggable.test.tsx | 4 +- .../renderers/parent_process_draggable.tsx | 2 +- .../body/renderers/parse_query_value.test.ts | 0 .../body/renderers/parse_query_value.ts | 0 .../body/renderers/parse_value.test.ts | 0 .../timeline/body/renderers/parse_value.ts | 0 .../renderers/plain_column_renderer.test.tsx | 8 +- .../body/renderers/plain_column_renderer.tsx | 6 +- .../renderers/plain_row_renderer.test.tsx | 6 +- .../body/renderers/plain_row_renderer.tsx | 0 .../body/renderers/process_draggable.test.tsx | 4 +- .../body/renderers/process_draggable.tsx | 2 +- .../body/renderers/process_hash.test.tsx | 4 +- .../timeline/body/renderers/process_hash.tsx | 2 +- .../timeline/body/renderers/row_renderer.tsx | 4 +- .../suricata_details.test.tsx.snap | 0 .../suricata_row_renderer.test.tsx.snap | 0 .../suricata_signature.test.tsx.snap | 0 .../suricata/suricata_details.test.tsx | 8 +- .../renderers/suricata/suricata_details.tsx | 4 +- .../renderers/suricata/suricata_links.test.ts | 0 .../body/renderers/suricata/suricata_links.ts | 0 .../body/renderers/suricata/suricata_refs.tsx | 2 +- .../suricata/suricata_row_renderer.test.tsx | 10 +- .../suricata/suricata_row_renderer.tsx | 0 .../suricata/suricata_signature.test.tsx | 4 +- .../renderers/suricata/suricata_signature.tsx | 15 +- .../__snapshots__/auth_ssh.test.tsx.snap | 0 .../generic_details.test.tsx.snap | 0 .../generic_file_details.test.tsx.snap | 0 .../generic_row_renderer.test.tsx.snap | 0 .../__snapshots__/package.test.tsx.snap | 0 .../body/renderers/system/auth_ssh.test.tsx | 0 .../body/renderers/system/auth_ssh.tsx | 2 +- .../renderers/system/generic_details.test.tsx | 8 +- .../body/renderers/system/generic_details.tsx | 10 +- .../system/generic_file_details.test.tsx | 8 +- .../renderers/system/generic_file_details.tsx | 10 +- .../system/generic_row_renderer.test.tsx | 14 +- .../renderers/system/generic_row_renderer.tsx | 0 .../body/renderers/system/package.test.tsx | 4 +- .../body/renderers/system/package.tsx | 2 +- .../body/renderers/system/translations.ts | 0 .../timeline/body/renderers/translations.ts | 0 .../unknown_column_renderer.test.tsx | 6 +- .../renderers/unknown_column_renderer.tsx | 2 +- .../renderers/user_host_working_dir.test.tsx | 4 +- .../body/renderers/user_host_working_dir.tsx | 2 +- .../__snapshots__/zeek_details.test.tsx.snap | 0 .../zeek_row_renderer.test.tsx.snap | 0 .../zeek_signature.test.tsx.snap | 0 .../body/renderers/zeek/translations.ts | 0 .../body/renderers/zeek/zeek_details.test.tsx | 6 +- .../body/renderers/zeek/zeek_details.tsx | 4 +- .../renderers/zeek/zeek_row_renderer.test.tsx | 8 +- .../body/renderers/zeek/zeek_row_renderer.tsx | 0 .../renderers/zeek/zeek_signature.test.tsx | 6 +- .../body/renderers/zeek/zeek_signature.tsx | 15 +- .../sort_indicator.test.tsx.snap | 0 .../components/timeline/body/sort/index.ts | 2 +- .../body/sort/sort_indicator.test.tsx | 2 +- .../timeline/body/sort/sort_indicator.tsx | 2 +- .../timeline/body/stateful_body.test.tsx | 2 +- .../timeline/body/stateful_body.tsx | 11 +- .../components/timeline/body/translations.ts | 0 .../data_providers.test.tsx.snap | 0 .../__snapshots__/empty.test.tsx.snap | 0 .../__snapshots__/provider.test.tsx.snap | 0 .../__snapshots__/providers.test.tsx.snap | 0 .../timeline/data_providers/data_provider.ts | 0 .../data_providers/data_providers.test.tsx | 4 +- .../timeline/data_providers/empty.test.tsx | 2 +- .../timeline/data_providers/empty.tsx | 2 +- .../timeline/data_providers/helpers.tsx | 0 .../timeline/data_providers/index.tsx | 6 +- .../mock/mock_data_providers.tsx | 0 .../timeline/data_providers/provider.test.tsx | 2 +- .../timeline/data_providers/provider.tsx | 0 .../data_providers/provider_badge.tsx | 4 +- .../data_providers/provider_item_actions.tsx | 2 +- .../data_providers/provider_item_and.tsx | 95 ++++++++ .../provider_item_and_drag_drop.tsx | 136 ++++++++++++ .../data_providers/provider_item_badge.tsx | 4 +- .../data_providers/providers.test.tsx | 10 +- .../timeline/data_providers/providers.tsx | 6 +- .../timeline/data_providers/translations.ts | 0 .../components/timeline/events.ts | 2 +- .../timeline/expandable_event/index.tsx | 8 +- .../expandable_event/translations.tsx | 0 .../timeline/fetch_kql_timeline.tsx | 10 +- .../footer/__snapshots__/index.test.tsx.snap | 0 .../components/timeline/footer/index.test.tsx | 2 +- .../components/timeline/footer/index.tsx | 2 +- .../timeline/footer/last_updated.tsx | 0 .../components/timeline/footer/mock.ts | 2 +- .../timeline/footer/translations.ts | 0 .../header/__snapshots__/index.test.tsx.snap | 0 .../components/timeline/header/index.test.tsx | 12 +- .../components/timeline/header/index.tsx | 2 +- .../timeline/header/translations.ts | 0 .../components/timeline/helpers.test.tsx | 6 +- .../components/timeline/helpers.tsx | 6 +- .../components/timeline/index.tsx | 12 +- .../insert_timeline_popover/index.test.tsx | 2 +- .../insert_timeline_popover/index.tsx | 2 +- .../use_insert_timeline.tsx | 6 +- .../components/timeline}/pin/index.test.tsx | 0 .../components/timeline}/pin/index.tsx | 2 +- .../timeline/properties/helpers.tsx | 8 +- .../timeline/properties/index.test.tsx | 19 +- .../components/timeline/properties/index.tsx | 6 +- .../timeline/properties/notes_size.ts | 0 .../timeline/properties/properties_left.tsx | 4 +- .../timeline/properties/properties_right.tsx | 4 +- .../components/timeline/properties/styles.tsx | 0 .../timeline/properties/translations.ts | 0 .../timeline/query_bar/index.test.tsx | 16 +- .../components/timeline/query_bar/index.tsx | 16 +- .../components/timeline/refetch_timeline.tsx | 6 +- .../search_or_filter/helpers.test.tsx | 0 .../timeline/search_or_filter/helpers.tsx | 4 +- .../timeline/search_or_filter/index.tsx | 21 +- .../timeline/search_or_filter/pick_events.tsx | 2 +- .../search_or_filter/search_or_filter.tsx | 14 +- .../timeline/search_or_filter/translations.ts | 0 .../timeline/search_super_select/index.tsx | 0 .../timeline/selectable_timeline/index.tsx | 8 +- .../__snapshots__/index.test.tsx.snap | 0 .../timeline}/skeleton_row/index.test.tsx | 2 +- .../timeline}/skeleton_row/index.tsx | 0 .../components/timeline/styles.tsx | 4 +- .../components/timeline/timeline.test.tsx | 14 +- .../components/timeline/timeline.tsx | 12 +- .../components/timeline/timeline_context.tsx | 2 +- .../components/timeline/translations.ts | 0 .../containers}/all/index.gql_query.ts | 0 .../containers}/all/index.tsx | 10 +- .../timeline => timelines/containers}/api.ts | 11 +- .../containers}/delete/persist.gql_query.ts | 0 .../containers}/details/index.gql_query.ts | 0 .../containers}/details/index.tsx | 2 +- .../containers}/favorite/persist.gql_query.ts | 0 .../containers}/index.gql_query.ts | 0 .../containers}/index.tsx | 14 +- .../containers}/notes/persist.gql_query.ts | 0 .../containers}/one/index.gql_query.ts | 0 .../containers}/persist.gql_query.ts | 0 .../pinned_event/persist.gql_query.ts | 0 x-pack/plugins/siem/public/timelines/index.ts | 24 ++ .../timelines => timelines/pages}/index.tsx | 10 +- .../pages}/timelines_page.test.tsx | 13 +- .../pages}/timelines_page.tsx | 15 +- .../pages}/translations.ts | 0 .../plugins/siem/public/timelines/routes.tsx | 15 ++ .../{ => timelines}/store/timeline/actions.ts | 10 +- .../store/timeline/defaults.ts | 9 +- .../store/timeline/epic.test.ts | 11 +- .../{ => timelines}/store/timeline/epic.ts | 18 +- ...c_dispatcher_timeline_persistence_queue.ts | 0 .../store/timeline/epic_favorite.ts | 8 +- .../store/timeline/epic_note.ts | 10 +- .../store/timeline/epic_pinned_event.ts | 8 +- .../{ => timelines}/store/timeline/helpers.ts | 13 +- .../{ => timelines}/store/timeline/index.ts | 10 + .../store/timeline/manage_timeline_id.tsx | 0 .../{ => timelines}/store/timeline/model.ts | 13 +- .../store/timeline/my_epic_timeline_id.ts | 0 .../store/timeline/reducer.test.ts | 14 +- .../{ => timelines}/store/timeline/reducer.ts | 0 .../store/timeline/refetch_queries.ts | 6 +- .../store/timeline/selectors.ts | 4 +- .../{ => timelines}/store/timeline/types.ts | 0 .../apis/siem/authentications.ts | 2 +- .../test/api_integration/apis/siem/hosts.ts | 6 +- .../api_integration/apis/siem/ip_overview.ts | 2 +- .../apis/siem/kpi_host_details.ts | 2 +- .../api_integration/apis/siem/kpi_hosts.ts | 2 +- .../api_integration/apis/siem/kpi_network.ts | 2 +- .../api_integration/apis/siem/network_dns.ts | 2 +- .../apis/siem/network_top_n_flow.ts | 2 +- .../apis/siem/overview_host.ts | 2 +- .../apis/siem/overview_network.ts | 2 +- .../apis/siem/saved_objects/notes.ts | 2 +- .../apis/siem/saved_objects/pinned_events.ts | 2 +- .../apis/siem/saved_objects/timeline.ts | 6 +- .../test/api_integration/apis/siem/sources.ts | 2 +- .../api_integration/apis/siem/timeline.ts | 2 +- .../apis/siem/timeline_details.ts | 2 +- x-pack/test/api_integration/apis/siem/tls.ts | 2 +- .../apis/siem/uncommon_processes.ts | 2 +- .../test/api_integration/apis/siem/users.ts | 2 +- 1698 files changed, 4160 insertions(+), 3026 deletions(-) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/activity_monitor/columns.tsx (96%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/activity_monitor/index.test.tsx (100%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/activity_monitor/index.tsx (98%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/activity_monitor/types.ts (100%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/detection_engine_header_page/index.test.tsx (100%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/detection_engine_header_page/index.tsx (88%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/detection_engine_header_page/translations.ts (100%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/no_api_integration_callout/index.test.tsx (100%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/no_api_integration_callout/index.tsx (100%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/no_api_integration_callout/translations.ts (100%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/no_write_signals_callout/index.test.tsx (100%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/no_write_signals_callout/index.tsx (100%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/no_write_signals_callout/translations.ts (100%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/accordion_title/index.test.tsx (100%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/accordion_title/index.tsx (100%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/add_item_form/index.test.tsx (90%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/add_item_form/index.tsx (98%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/all_rules_tables/index.test.tsx (97%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/all_rules_tables/index.tsx (88%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/anomaly_threshold_slider/index.test.tsx (92%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/anomaly_threshold_slider/index.tsx (95%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/description_step/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/description_step/assets/list_tree_icon.svg (100%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/description_step/helpers.test.tsx (99%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/description_step/helpers.tsx (97%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/description_step/index.test.tsx (95%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/description_step/index.tsx (91%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/description_step/ml_job_description.test.tsx (97%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/description_step/ml_job_description.tsx (92%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/description_step/translations.tsx (100%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/description_step/types.ts (83%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/mitre/helpers.test.tsx (100%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/mitre/helpers.ts (87%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/mitre/index.test.tsx (93%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/mitre/index.tsx (97%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/mitre/translations.ts (100%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/ml_job_select/index.test.tsx (74%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/ml_job_select/index.tsx (94%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/next_step/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/next_step/index.test.tsx (100%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/next_step/index.tsx (92%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/optional_field_label/index.test.tsx (100%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/optional_field_label/index.tsx (84%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/pick_timeline/index.test.tsx (93%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/pick_timeline/index.tsx (93%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/pre_packaged_rules/load_empty_prompt.test.tsx (100%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/pre_packaged_rules/load_empty_prompt.tsx (94%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/pre_packaged_rules/translations.ts (100%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/pre_packaged_rules/update_callout.test.tsx (89%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/pre_packaged_rules/update_callout.tsx (95%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/query_bar/index.test.tsx (90%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/query_bar/index.tsx (90%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/query_bar/translations.tsx (100%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/read_only_callout/index.test.tsx (100%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/read_only_callout/index.tsx (100%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/read_only_callout/translations.ts (100%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/rule_actions_field/index.test.tsx (86%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/rule_actions_field/index.tsx (86%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/rule_actions_overflow/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/rule_actions_overflow/index.test.tsx (97%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/rule_actions_overflow/index.tsx (89%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/rule_actions_overflow/translations.ts (100%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/rule_status/helpers.test.tsx (100%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/rule_status/helpers.ts (85%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/rule_status/index.test.tsx (100%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/rule_status/index.tsx (92%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/rule_status/translations.ts (100%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/rule_switch/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/rule_switch/index.test.tsx (100%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/rule_switch/index.tsx (88%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/schedule_item_form/index.test.tsx (93%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/schedule_item_form/index.tsx (99%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/schedule_item_form/translations.ts (100%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/select_rule_type/index.test.tsx (86%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/select_rule_type/index.tsx (92%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/select_rule_type/translations.ts (100%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/severity_badge/index.test.tsx (100%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/severity_badge/index.tsx (100%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/status_icon/index.test.tsx (85%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/status_icon/index.tsx (87%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/step_about_rule/data.tsx (100%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/step_about_rule/default_value.ts (89%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/step_about_rule/helpers.test.ts (100%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/step_about_rule/helpers.ts (100%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/step_about_rule/index.test.tsx (97%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/step_about_rule/index.tsx (96%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/step_about_rule/schema.tsx (97%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/step_about_rule/translations.ts (100%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/step_about_rule_details/index.test.tsx (92%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/step_about_rule_details/index.tsx (93%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/step_about_rule_details/translations.ts (100%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/step_content_wrapper/index.test.tsx (100%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/step_content_wrapper/index.tsx (100%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/step_define_rule/index.test.tsx (93%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/step_define_rule/index.tsx (89%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/step_define_rule/schema.tsx (96%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/step_define_rule/translations.tsx (100%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/step_define_rule/types.ts (100%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/step_panel/index.test.tsx (100%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/step_panel/index.tsx (91%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/step_rule_actions/index.test.tsx (93%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/step_rule_actions/index.tsx (94%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/step_rule_actions/schema.tsx (93%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/step_rule_actions/translations.tsx (100%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/step_schedule_rule/index.test.tsx (93%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/step_schedule_rule/index.tsx (93%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/step_schedule_rule/schema.tsx (95%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/step_schedule_rule/translations.tsx (100%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/throttle_select_field/index.test.tsx (92%) rename x-pack/plugins/siem/public/{pages/detection_engine/rules/components => alerts/components/rules}/throttle_select_field/index.tsx (91%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/signals/actions.test.tsx (98%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/signals/actions.tsx (93%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/signals/default_config.test.tsx (96%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/signals/default_config.tsx (92%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/signals/helpers.test.ts (96%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/signals/helpers.ts (97%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/signals/index.test.tsx (100%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/signals/index.tsx (92%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/signals/signals_filter_group/index.test.tsx (100%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/signals/signals_filter_group/index.tsx (100%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/signals/signals_utility_bar/index.test.tsx (95%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/signals/signals_utility_bar/index.tsx (94%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/signals/signals_utility_bar/translations.ts (100%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/signals/translations.ts (100%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/signals/types.ts (90%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/signals_histogram_panel/config.ts (100%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/signals_histogram_panel/helpers.test.tsx (100%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/signals_histogram_panel/helpers.tsx (94%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/signals_histogram_panel/index.test.tsx (86%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/signals_histogram_panel/index.tsx (87%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/signals_histogram_panel/signals_histogram.test.tsx (94%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/signals_histogram_panel/signals_histogram.tsx (89%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/signals_histogram_panel/translations.ts (100%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/signals_histogram_panel/types.ts (94%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/signals_info/index.tsx (94%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/signals_info/query.dsl.ts (100%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/signals_info/types.ts (100%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/user_info/index.test.tsx (71%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/components/user_info/index.tsx (96%) rename x-pack/plugins/siem/public/{ => alerts}/containers/detection_engine/rules/__mocks__/api.ts (100%) rename x-pack/plugins/siem/public/{ => alerts}/containers/detection_engine/rules/api.test.ts (99%) rename x-pack/plugins/siem/public/{ => alerts}/containers/detection_engine/rules/api.ts (98%) rename x-pack/plugins/siem/public/{ => alerts}/containers/detection_engine/rules/fetch_index_patterns.test.tsx (98%) rename x-pack/plugins/siem/public/{ => alerts}/containers/detection_engine/rules/fetch_index_patterns.tsx (89%) rename x-pack/plugins/siem/public/{ => alerts}/containers/detection_engine/rules/index.ts (100%) rename x-pack/plugins/siem/public/{ => alerts}/containers/detection_engine/rules/mock.ts (100%) rename x-pack/plugins/siem/public/{ => alerts}/containers/detection_engine/rules/persist_rule.test.tsx (100%) rename x-pack/plugins/siem/public/{ => alerts}/containers/detection_engine/rules/persist_rule.tsx (94%) rename x-pack/plugins/siem/public/{ => alerts}/containers/detection_engine/rules/translations.ts (100%) rename x-pack/plugins/siem/public/{ => alerts}/containers/detection_engine/rules/types.ts (98%) rename x-pack/plugins/siem/public/{ => alerts}/containers/detection_engine/rules/use_pre_packaged_rules.test.tsx (100%) rename x-pack/plugins/siem/public/{ => alerts}/containers/detection_engine/rules/use_pre_packaged_rules.tsx (98%) rename x-pack/plugins/siem/public/{ => alerts}/containers/detection_engine/rules/use_rule.test.tsx (100%) rename x-pack/plugins/siem/public/{ => alerts}/containers/detection_engine/rules/use_rule.tsx (94%) rename x-pack/plugins/siem/public/{ => alerts}/containers/detection_engine/rules/use_rule_status.test.tsx (99%) rename x-pack/plugins/siem/public/{ => alerts}/containers/detection_engine/rules/use_rule_status.tsx (97%) rename x-pack/plugins/siem/public/{ => alerts}/containers/detection_engine/rules/use_rules.test.tsx (100%) rename x-pack/plugins/siem/public/{ => alerts}/containers/detection_engine/rules/use_rules.tsx (97%) rename x-pack/plugins/siem/public/{ => alerts}/containers/detection_engine/rules/use_tags.test.tsx (100%) rename x-pack/plugins/siem/public/{ => alerts}/containers/detection_engine/rules/use_tags.tsx (94%) rename x-pack/plugins/siem/public/{ => alerts}/containers/detection_engine/signals/__mocks__/api.ts (100%) rename x-pack/plugins/siem/public/{ => alerts}/containers/detection_engine/signals/api.test.ts (97%) rename x-pack/plugins/siem/public/{ => alerts}/containers/detection_engine/signals/api.ts (96%) rename x-pack/plugins/siem/public/{ => alerts}/containers/detection_engine/signals/mock.ts (100%) rename x-pack/plugins/siem/public/{ => alerts}/containers/detection_engine/signals/translations.ts (100%) rename x-pack/plugins/siem/public/{ => alerts}/containers/detection_engine/signals/types.ts (100%) rename x-pack/plugins/siem/public/{ => alerts}/containers/detection_engine/signals/use_privilege_user.test.tsx (100%) rename x-pack/plugins/siem/public/{ => alerts}/containers/detection_engine/signals/use_privilege_user.tsx (96%) rename x-pack/plugins/siem/public/{ => alerts}/containers/detection_engine/signals/use_query.test.tsx (100%) rename x-pack/plugins/siem/public/{ => alerts}/containers/detection_engine/signals/use_query.tsx (100%) rename x-pack/plugins/siem/public/{ => alerts}/containers/detection_engine/signals/use_signal_index.test.tsx (100%) rename x-pack/plugins/siem/public/{ => alerts}/containers/detection_engine/signals/use_signal_index.tsx (95%) create mode 100644 x-pack/plugins/siem/public/alerts/index.ts rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/mitre/mitre_tactics_techniques.ts (100%) rename x-pack/plugins/siem/public/{pages/detection_engine => alerts}/mitre/types.ts (100%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/detection_engine.test.tsx (80%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/detection_engine.tsx (80%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/detection_engine_empty_page.test.tsx (93%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/detection_engine_empty_page.tsx (83%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/detection_engine_no_signal_index.test.tsx (93%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/detection_engine_no_signal_index.tsx (88%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/detection_engine_user_unauthenticated.test.tsx (93%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/detection_engine_user_unauthenticated.tsx (88%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/index.test.tsx (93%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/index.tsx (96%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/rules/all/__mocks__/mock.ts (94%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/rules/all/actions.tsx (93%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/rules/all/batch_actions.tsx (97%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/rules/all/columns.test.tsx (100%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/rules/all/columns.tsx (90%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/rules/all/helpers.test.tsx (97%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/rules/all/helpers.ts (94%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/rules/all/index.test.tsx (95%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/rules/all/index.tsx (93%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/rules/all/reducer.ts (98%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/rules/all/rules_table_filters/rules_table_filters.test.tsx (100%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/rules/all/rules_table_filters/rules_table_filters.tsx (95%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/rules/all/rules_table_filters/tags_filter_popover.test.tsx (100%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/rules/all/rules_table_filters/tags_filter_popover.tsx (95%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/rules/create/helpers.test.ts (99%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/rules/create/helpers.ts (93%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/rules/create/index.test.tsx (78%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/rules/create/index.tsx (93%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/rules/create/translations.ts (100%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/rules/details/failure_history.test.tsx (76%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/rules/details/failure_history.tsx (87%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/rules/details/index.test.tsx (78%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/rules/details/index.tsx (84%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/rules/details/status_failed_callout.test.tsx (100%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/rules/details/status_failed_callout.tsx (93%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/rules/details/translations.ts (100%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/rules/edit/index.test.tsx (84%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/rules/edit/index.tsx (92%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/rules/edit/translations.ts (100%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/rules/helpers.test.tsx (98%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/rules/helpers.tsx (93%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/rules/index.test.tsx (71%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/rules/index.tsx (89%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/rules/translations.ts (100%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/rules/types.ts (87%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/rules/utils.test.ts (100%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/rules/utils.ts (90%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/translations.ts (100%) rename x-pack/plugins/siem/public/{ => alerts}/pages/detection_engine/types.ts (100%) create mode 100644 x-pack/plugins/siem/public/alerts/routes.tsx rename x-pack/plugins/siem/public/{pages => app}/404.tsx (90%) rename x-pack/plugins/siem/public/{pages => app}/home/home_navigations.tsx (93%) rename x-pack/plugins/siem/public/{pages => app}/home/index.tsx (56%) rename x-pack/plugins/siem/public/{pages => app}/home/translations.ts (100%) rename x-pack/plugins/siem/public/{ => app}/routes.tsx (69%) create mode 100644 x-pack/plugins/siem/public/app/types.ts rename x-pack/plugins/siem/public/{pages/case => cases}/components/__mock__/form.ts (84%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/__mock__/router.ts (100%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/add_comment/index.test.tsx (85%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/add_comment/index.tsx (83%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/add_comment/schema.tsx (80%) rename x-pack/plugins/siem/public/{components/page/hosts/index.tsx => cases/components/add_comment/translations.ts} (62%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/all_cases/actions.tsx (92%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/all_cases/columns.test.tsx (94%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/all_cases/columns.tsx (94%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/all_cases/index.test.tsx (92%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/all_cases/index.tsx (94%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/all_cases/table_filters.test.tsx (90%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/all_cases/table_filters.tsx (94%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/all_cases/translations.ts (100%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/bulk_actions/index.tsx (100%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/bulk_actions/translations.ts (100%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/callout/helpers.tsx (100%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/callout/index.test.tsx (98%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/callout/index.tsx (100%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/callout/translations.ts (100%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/case_header_page/index.tsx (87%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/case_header_page/translations.ts (100%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/case_status/index.tsx (93%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/case_view/actions.test.tsx (91%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/case_view/actions.tsx (88%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/case_view/index.test.tsx (94%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/case_view/index.tsx (92%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/case_view/translations.ts (100%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/configure_cases/__mock__/index.tsx (70%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/configure_cases/button.test.tsx (98%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/configure_cases/button.tsx (94%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/configure_cases/closure_options.test.tsx (97%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/configure_cases/closure_options.tsx (95%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/configure_cases/closure_options_radio.test.tsx (97%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/configure_cases/closure_options_radio.tsx (95%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/configure_cases/connectors.test.tsx (98%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/configure_cases/connectors.tsx (97%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/configure_cases/connectors_dropdown.test.tsx (97%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/configure_cases/connectors_dropdown.tsx (94%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/configure_cases/field_mapping.test.tsx (93%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/configure_cases/field_mapping.tsx (94%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/configure_cases/field_mapping_row.test.tsx (95%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/configure_cases/field_mapping_row.tsx (92%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/configure_cases/index.test.tsx (97%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/configure_cases/index.tsx (91%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/configure_cases/mapping.test.tsx (99%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/configure_cases/mapping.tsx (95%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/configure_cases/translations.ts (100%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/configure_cases/utils.test.tsx (96%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/configure_cases/utils.ts (95%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/confirm_delete_case/index.tsx (100%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/confirm_delete_case/translations.ts (100%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/connector_selector/form.tsx (94%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/create/index.test.tsx (81%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/create/index.tsx (90%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/create/optional_field_label/index.tsx (100%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/create/schema.tsx (91%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/edit_connector/index.test.tsx (93%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/edit_connector/index.tsx (97%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/edit_connector/schema.tsx (85%) rename x-pack/plugins/siem/public/{ => cases}/components/filter_popover/index.tsx (100%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/open_closed_stats/index.tsx (100%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/property_actions/constants.ts (100%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/property_actions/index.tsx (100%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/property_actions/translations.ts (100%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/tag_list/index.test.tsx (88%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/tag_list/index.tsx (97%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/tag_list/schema.tsx (85%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/tag_list/translations.ts (100%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/use_push_to_service/helpers.tsx (96%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/use_push_to_service/index.test.tsx (89%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/use_push_to_service/index.tsx (89%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/use_push_to_service/translations.ts (100%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/user_action_tree/helpers.test.tsx (96%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/user_action_tree/helpers.tsx (97%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/user_action_tree/index.test.tsx (96%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/user_action_tree/index.tsx (96%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/user_action_tree/schema.ts (96%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/user_action_tree/translations.ts (100%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/user_action_tree/user_action_avatar.tsx (100%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/user_action_tree/user_action_item.tsx (100%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/user_action_tree/user_action_markdown.tsx (87%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/user_action_tree/user_action_title.test.tsx (92%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/user_action_tree/user_action_title.tsx (95%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/user_list/index.test.tsx (97%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/user_list/index.tsx (97%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/user_list/translations.ts (100%) rename x-pack/plugins/siem/public/{pages/case => cases}/components/wrappers/index.tsx (100%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/__mocks__/api.ts (100%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/api.test.tsx (99%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/api.ts (99%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/configure/__mocks__/api.ts (100%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/configure/api.test.ts (97%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/configure/api.ts (97%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/configure/mock.ts (100%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/configure/translations.ts (100%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/configure/types.ts (100%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/configure/use_configure.test.tsx (100%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/configure/use_configure.tsx (98%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/configure/use_connectors.test.tsx (100%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/configure/use_connectors.tsx (95%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/constants.ts (100%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/mock.ts (100%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/translations.ts (100%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/types.ts (100%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/use_bulk_update_case.test.tsx (100%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/use_bulk_update_case.tsx (96%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/use_delete_cases.test.tsx (100%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/use_delete_cases.tsx (97%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/use_get_action_license.test.tsx (100%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/use_get_action_license.tsx (96%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/use_get_case.test.tsx (100%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/use_get_case.tsx (97%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/use_get_case_user_actions.test.tsx (100%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/use_get_case_user_actions.tsx (98%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/use_get_cases.test.tsx (100%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/use_get_cases.tsx (98%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/use_get_cases_status.test.tsx (100%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/use_get_cases_status.tsx (96%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/use_get_reporters.test.tsx (100%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/use_get_reporters.tsx (96%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/use_get_tags.test.tsx (100%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/use_get_tags.tsx (96%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/use_post_case.test.tsx (100%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/use_post_case.tsx (96%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/use_post_comment.test.tsx (100%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/use_post_comment.tsx (96%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/use_post_push_to_service.test.tsx (100%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/use_post_push_to_service.tsx (98%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/use_update_case.test.tsx (100%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/use_update_case.tsx (96%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/use_update_comment.test.tsx (100%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/use_update_comment.tsx (97%) rename x-pack/plugins/siem/public/{containers/case => cases/containers}/utils.ts (98%) create mode 100644 x-pack/plugins/siem/public/cases/index.ts rename x-pack/plugins/siem/public/{pages/case => cases/pages}/case.tsx (74%) rename x-pack/plugins/siem/public/{pages/case => cases/pages}/case_details.tsx (68%) rename x-pack/plugins/siem/public/{pages/case => cases/pages}/configure_cases.tsx (68%) rename x-pack/plugins/siem/public/{pages/case => cases/pages}/create_case.tsx (65%) rename x-pack/plugins/siem/public/{pages/case => cases/pages}/index.tsx (96%) rename x-pack/plugins/siem/public/{pages/case => cases/pages}/saved_object_no_permissions.tsx (88%) rename x-pack/plugins/siem/public/{pages/case => cases/pages}/translations.ts (100%) rename x-pack/plugins/siem/public/{pages/case => cases/pages}/utils.ts (92%) create mode 100644 x-pack/plugins/siem/public/cases/routes.tsx create mode 100644 x-pack/plugins/siem/public/cases/translations.ts rename x-pack/plugins/siem/public/{components/page => common/components}/add_filter_to_global_search_bar/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{components/page => common/components}/add_filter_to_global_search_bar/helpers.test.tsx (100%) rename x-pack/plugins/siem/public/{components/page => common/components}/add_filter_to_global_search_bar/helpers.ts (100%) rename x-pack/plugins/siem/public/{components/page => common/components}/add_filter_to_global_search_bar/index.test.tsx (91%) rename x-pack/plugins/siem/public/{components/page => common/components}/add_filter_to_global_search_bar/index.tsx (95%) rename x-pack/plugins/siem/public/{components/page => common/components}/add_filter_to_global_search_bar/translations.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/alerts_viewer/alerts_table.tsx (96%) rename x-pack/plugins/siem/public/{ => common}/components/alerts_viewer/default_headers.ts (85%) rename x-pack/plugins/siem/public/{ => common}/components/alerts_viewer/histogram_configs.ts (94%) rename x-pack/plugins/siem/public/{ => common}/components/alerts_viewer/index.tsx (96%) rename x-pack/plugins/siem/public/{ => common}/components/alerts_viewer/translations.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/alerts_viewer/types.ts (76%) rename x-pack/plugins/siem/public/{ => common}/components/autocomplete_field/__examples__/index.stories.tsx (94%) rename x-pack/plugins/siem/public/{ => common}/components/autocomplete_field/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/autocomplete_field/index.test.tsx (99%) rename x-pack/plugins/siem/public/{ => common}/components/autocomplete_field/index.tsx (98%) rename x-pack/plugins/siem/public/{ => common}/components/autocomplete_field/suggestion_item.tsx (96%) rename x-pack/plugins/siem/public/{ => common}/components/charts/__snapshots__/areachart.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/charts/__snapshots__/barchart.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/charts/areachart.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/charts/areachart.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/charts/barchart.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/charts/barchart.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/charts/chart_place_holder.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/charts/chart_place_holder.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/charts/common.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/charts/common.tsx (98%) rename x-pack/plugins/siem/public/{ => common}/components/charts/draggable_legend.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/charts/draggable_legend.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/charts/draggable_legend_item.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/charts/draggable_legend_item.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/charts/translation.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/drag_and_drop/__snapshots__/drag_drop_context_wrapper.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/drag_and_drop/__snapshots__/draggable_wrapper.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/drag_and_drop/__snapshots__/droppable_wrapper.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/drag_and_drop/drag_drop_context.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/drag_and_drop/drag_drop_context_wrapper.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/drag_and_drop/drag_drop_context_wrapper.tsx (94%) rename x-pack/plugins/siem/public/{ => common}/components/drag_and_drop/draggable_wrapper.test.tsx (98%) rename x-pack/plugins/siem/public/{ => common}/components/drag_and_drop/draggable_wrapper.tsx (98%) rename x-pack/plugins/siem/public/{ => common}/components/drag_and_drop/draggable_wrapper_hover_content.test.tsx (99%) rename x-pack/plugins/siem/public/{ => common}/components/drag_and_drop/draggable_wrapper_hover_content.tsx (96%) rename x-pack/plugins/siem/public/{ => common}/components/drag_and_drop/droppable_wrapper.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/drag_and_drop/droppable_wrapper.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/drag_and_drop/helpers.test.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/drag_and_drop/helpers.ts (95%) rename x-pack/plugins/siem/public/{ => common}/components/drag_and_drop/provider_container.tsx (97%) rename x-pack/plugins/siem/public/{ => common}/components/drag_and_drop/translations.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/draggables/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/draggables/field_badge/index.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/draggables/field_badge/translations.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/draggables/index.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/draggables/index.tsx (97%) rename x-pack/plugins/siem/public/{ => common}/components/empty_page/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/empty_page/index.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/empty_page/index.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/empty_value/__snapshots__/empty_value.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/empty_value/empty_value.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/empty_value/index.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/empty_value/translations.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/error_toast_dispatcher/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/error_toast_dispatcher/index.test.tsx (78%) rename x-pack/plugins/siem/public/{ => common}/components/error_toast_dispatcher/index.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/event_details/__snapshots__/event_details.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/event_details/__snapshots__/json_view.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/event_details/columns.tsx (89%) rename x-pack/plugins/siem/public/{ => common}/components/event_details/event_details.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/event_details/event_details.tsx (90%) rename x-pack/plugins/siem/public/{ => common}/components/event_details/event_fields_browser.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/event_details/event_fields_browser.tsx (90%) rename x-pack/plugins/siem/public/{ => common}/components/event_details/event_id.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/event_details/helpers.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/event_details/helpers.tsx (93%) rename x-pack/plugins/siem/public/{ => common}/components/event_details/json_view.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/event_details/json_view.tsx (88%) rename x-pack/plugins/siem/public/{ => common}/components/event_details/stateful_event_details.tsx (86%) rename x-pack/plugins/siem/public/{ => common}/components/event_details/translations.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/event_details/types.ts (87%) rename x-pack/plugins/siem/public/{ => common}/components/events_viewer/default_headers.tsx (84%) rename x-pack/plugins/siem/public/{ => common}/components/events_viewer/default_model.tsx (71%) rename x-pack/plugins/siem/public/{ => common}/components/events_viewer/event_details_width_context.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/events_viewer/events_viewer.test.tsx (95%) rename x-pack/plugins/siem/public/{ => common}/components/events_viewer/events_viewer.tsx (86%) rename x-pack/plugins/siem/public/{ => common}/components/events_viewer/index.test.tsx (92%) rename x-pack/plugins/siem/public/{ => common}/components/events_viewer/index.tsx (90%) rename x-pack/plugins/siem/public/{ => common}/components/events_viewer/mock.ts (95%) rename x-pack/plugins/siem/public/{ => common}/components/events_viewer/translations.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/external_link_icon/index.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/external_link_icon/index.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/filters_global/__snapshots__/filters_global.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/filters_global/filters_global.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/filters_global/filters_global.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/filters_global/index.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/formatted_bytes/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/formatted_bytes/index.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/formatted_bytes/index.tsx (93%) rename x-pack/plugins/siem/public/{ => common}/components/formatted_date/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/formatted_date/index.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/formatted_date/index.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/formatted_date/maybe_date.test.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/formatted_date/maybe_date.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/generic_downloader/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/generic_downloader/index.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/generic_downloader/index.tsx (97%) rename x-pack/plugins/siem/public/{ => common}/components/generic_downloader/translations.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/header_global/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/header_global/index.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/header_global/index.tsx (97%) rename x-pack/plugins/siem/public/{ => common}/components/header_global/translations.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/header_page/__snapshots__/editable_title.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/header_page/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/header_page/__snapshots__/title.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/header_page/editable_title.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/header_page/editable_title.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/header_page/index.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/header_page/index.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/header_page/title.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/header_page/title.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/header_page/translations.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/header_page/types.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/header_section/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/header_section/index.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/header_section/index.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/help_menu/index.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/import_data_modal/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/import_data_modal/index.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/import_data_modal/index.tsx (97%) rename x-pack/plugins/siem/public/{ => common}/components/import_data_modal/translations.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/inspect/index.test.tsx (96%) rename x-pack/plugins/siem/public/{ => common}/components/inspect/index.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/inspect/modal.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/inspect/modal.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/inspect/translations.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/last_event_time/index.test.tsx (97%) rename x-pack/plugins/siem/public/{ => common}/components/last_event_time/index.tsx (96%) rename x-pack/plugins/siem/public/{ => common}/components/link_icon/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/link_icon/index.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/link_icon/index.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/link_to/helpers.test.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/link_to/helpers.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/link_to/index.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/link_to/link_to.tsx (94%) rename x-pack/plugins/siem/public/{ => common}/components/link_to/redirect_to_case.tsx (96%) rename x-pack/plugins/siem/public/{ => common}/components/link_to/redirect_to_detection_engine.tsx (97%) rename x-pack/plugins/siem/public/{ => common}/components/link_to/redirect_to_hosts.tsx (94%) rename x-pack/plugins/siem/public/{ => common}/components/link_to/redirect_to_network.tsx (90%) rename x-pack/plugins/siem/public/{ => common}/components/link_to/redirect_to_overview.tsx (92%) rename x-pack/plugins/siem/public/{ => common}/components/link_to/redirect_to_timelines.tsx (89%) rename x-pack/plugins/siem/public/{ => common}/components/link_to/redirect_wrapper.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/links/index.test.tsx (99%) rename x-pack/plugins/siem/public/{ => common}/components/links/index.tsx (96%) rename x-pack/plugins/siem/public/{ => common}/components/links/translations.ts (87%) rename x-pack/plugins/siem/public/{ => common}/components/loader/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/loader/index.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/loader/index.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/localized_date_tooltip/index.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/localized_date_tooltip/index.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/markdown/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/markdown/__snapshots__/markdown_hint.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/markdown/index.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/markdown/index.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/markdown/markdown_hint.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/markdown/markdown_hint.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/markdown/translations.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/markdown_editor/constants.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/markdown_editor/form.tsx (98%) rename x-pack/plugins/siem/public/{ => common}/components/markdown_editor/index.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/markdown_editor/translations.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/matrix_histogram/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/matrix_histogram/index.test.tsx (98%) rename x-pack/plugins/siem/public/{ => common}/components/matrix_histogram/index.tsx (95%) rename x-pack/plugins/siem/public/{ => common}/components/matrix_histogram/matrix_loader.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/matrix_histogram/translations.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/matrix_histogram/types.ts (95%) rename x-pack/plugins/siem/public/{ => common}/components/matrix_histogram/utils.test.ts (98%) rename x-pack/plugins/siem/public/{ => common}/components/matrix_histogram/utils.ts (97%) rename x-pack/plugins/siem/public/{ => common}/components/ml/__snapshots__/entity_draggable.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/anomaly/anomaly_table_provider.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/anomaly/get_interval_from_anomalies.test.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/anomaly/get_interval_from_anomalies.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/anomaly/translations.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/anomaly/use_anomalies_table_data.test.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/anomaly/use_anomalies_table_data.ts (95%) rename x-pack/plugins/siem/public/{ => common}/components/ml/api/anomalies_table_data.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/api/errors.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/api/get_ml_capabilities.ts (92%) rename x-pack/plugins/siem/public/{ => common}/components/ml/api/throw_if_not_ok.test.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/api/throw_if_not_ok.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/api/translations.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/conditional_links/add_entities_to_kql.test.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/conditional_links/add_entities_to_kql.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/conditional_links/entity_helpers.test.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/conditional_links/entity_helpers.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/conditional_links/ml_host_conditional_container.tsx (94%) rename x-pack/plugins/siem/public/{ => common}/components/ml/conditional_links/ml_network_conditional_container.tsx (95%) rename x-pack/plugins/siem/public/{ => common}/components/ml/conditional_links/remove_kql_variables.test.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/conditional_links/remove_kql_variables.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/conditional_links/replace_kql_commas_with_or.test.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/conditional_links/replace_kql_commas_with_or.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/conditional_links/replace_kql_parts.test.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/conditional_links/replace_kql_parts.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/conditional_links/rison_helpers.test.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/conditional_links/rison_helpers.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/criteria/get_criteria_from_host_type.test.ts (94%) rename x-pack/plugins/siem/public/{ => common}/components/ml/criteria/get_criteria_from_host_type.ts (90%) rename x-pack/plugins/siem/public/{ => common}/components/ml/criteria/get_criteria_from_network_type.test.ts (92%) rename x-pack/plugins/siem/public/{ => common}/components/ml/criteria/get_criteria_from_network_type.ts (86%) rename x-pack/plugins/siem/public/{ => common}/components/ml/criteria/host_to_criteria.test.ts (95%) rename x-pack/plugins/siem/public/{ => common}/components/ml/criteria/host_to_criteria.ts (91%) rename x-pack/plugins/siem/public/{ => common}/components/ml/criteria/network_to_criteria.test.ts (95%) rename x-pack/plugins/siem/public/{ => common}/components/ml/criteria/network_to_criteria.ts (91%) rename x-pack/plugins/siem/public/{ => common}/components/ml/entity_draggable.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/entity_draggable.tsx (88%) rename x-pack/plugins/siem/public/{ => common}/components/ml/get_entries.test.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/get_entries.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/influencers/__snapshots__/create_influencers.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/influencers/create_influencers.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/influencers/create_influencers.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/influencers/get_host_name_from_influencers.test.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/influencers/get_host_name_from_influencers.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/influencers/get_network_from_influencers.test.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/influencers/get_network_from_influencers.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/influencers/host_to_influencers.test.ts (95%) rename x-pack/plugins/siem/public/{ => common}/components/ml/influencers/host_to_influencers.ts (92%) rename x-pack/plugins/siem/public/{ => common}/components/ml/influencers/network_to_influencers.test.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/influencers/network_to_influencers.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/links/create_explorer_link.test.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/links/create_explorer_link.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/links/create_series_link.test.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/links/create_series_link.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/mock.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/permissions/ml_capabilities_provider.tsx (92%) rename x-pack/plugins/siem/public/{ => common}/components/ml/permissions/translations.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/score/__snapshots__/anomaly_score.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/score/__snapshots__/anomaly_scores.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/score/__snapshots__/create_descriptions_list.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/score/__snapshots__/draggable_score.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/score/anomaly_score.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/score/anomaly_score.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/score/anomaly_scores.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/score/anomaly_scores.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/score/create_description_list.tsx (97%) rename x-pack/plugins/siem/public/{ => common}/components/ml/score/create_descriptions_list.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/score/create_entities_from_score.test.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/score/create_entities_from_score.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/score/draggable_score.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/score/draggable_score.tsx (89%) rename x-pack/plugins/siem/public/{ => common}/components/ml/score/get_score_string.test.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/score/get_top_severity.test.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/score/get_top_severity.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/score/score_health.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/score/score_interval_to_datetime.test.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/score/score_interval_to_datetime.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/score/translations.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/tables/anomalies_host_table.tsx (96%) rename x-pack/plugins/siem/public/{ => common}/components/ml/tables/anomalies_network_table.tsx (96%) rename x-pack/plugins/siem/public/{ => common}/components/ml/tables/basic_table.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/tables/convert_anomalies_to_hosts.test.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/tables/convert_anomalies_to_hosts.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/tables/convert_anomalies_to_network.test.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/tables/convert_anomalies_to_network.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/tables/create_compound_key.test.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/tables/create_compound_key.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/tables/get_anomalies_host_table_columns.test.tsx (98%) rename x-pack/plugins/siem/public/{ => common}/components/ml/tables/get_anomalies_host_table_columns.tsx (98%) rename x-pack/plugins/siem/public/{ => common}/components/ml/tables/get_anomalies_network_table_columns.test.tsx (98%) rename x-pack/plugins/siem/public/{ => common}/components/ml/tables/get_anomalies_network_table_columns.tsx (97%) rename x-pack/plugins/siem/public/{ => common}/components/ml/tables/host_equality.test.ts (98%) rename x-pack/plugins/siem/public/{ => common}/components/ml/tables/host_equality.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/tables/network_equality.test.ts (97%) rename x-pack/plugins/siem/public/{ => common}/components/ml/tables/network_equality.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/tables/translations.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/types.test.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml/types.ts (91%) rename x-pack/plugins/siem/public/{ => common}/components/ml_popover/__mocks__/api.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml_popover/__snapshots__/popover_description.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml_popover/__snapshots__/upgrade_contents.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml_popover/api.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml_popover/helpers.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml_popover/helpers.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml_popover/hooks/translations.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml_popover/hooks/use_ml_capabilities.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml_popover/hooks/use_siem_jobs.tsx (94%) rename x-pack/plugins/siem/public/{ => common}/components/ml_popover/hooks/use_siem_jobs_helpers.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml_popover/hooks/use_siem_jobs_helpers.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml_popover/jobs_table/__snapshots__/job_switch.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml_popover/jobs_table/__snapshots__/jobs_table.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml_popover/jobs_table/__snapshots__/showing_count.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml_popover/jobs_table/filters/__snapshots__/groups_filter_popover.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml_popover/jobs_table/filters/__snapshots__/jobs_table_filters.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml_popover/jobs_table/filters/groups_filter_popover.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml_popover/jobs_table/filters/groups_filter_popover.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml_popover/jobs_table/filters/jobs_table_filters.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml_popover/jobs_table/filters/jobs_table_filters.tsx (97%) rename x-pack/plugins/siem/public/{ => common}/components/ml_popover/jobs_table/filters/toggle_selected_group.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml_popover/jobs_table/filters/toggle_selected_group.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml_popover/jobs_table/filters/translations.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml_popover/jobs_table/job_switch.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml_popover/jobs_table/job_switch.tsx (97%) rename x-pack/plugins/siem/public/{ => common}/components/ml_popover/jobs_table/jobs_table.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml_popover/jobs_table/jobs_table.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml_popover/jobs_table/showing_count.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml_popover/jobs_table/showing_count.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml_popover/jobs_table/translations.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml_popover/ml_modules.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml_popover/ml_popover.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml_popover/ml_popover.tsx (98%) rename x-pack/plugins/siem/public/{ => common}/components/ml_popover/popover_description.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml_popover/popover_description.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml_popover/translations.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml_popover/types.ts (98%) rename x-pack/plugins/siem/public/{ => common}/components/ml_popover/upgrade_contents.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/ml_popover/upgrade_contents.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/navigation/breadcrumbs/index.test.ts (98%) rename x-pack/plugins/siem/public/{ => common}/components/navigation/breadcrumbs/index.ts (91%) rename x-pack/plugins/siem/public/{ => common}/components/navigation/helpers.ts (93%) rename x-pack/plugins/siem/public/{ => common}/components/navigation/index.test.tsx (98%) rename x-pack/plugins/siem/public/{ => common}/components/navigation/index.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/navigation/tab_navigation/index.test.tsx (95%) rename x-pack/plugins/siem/public/{ => common}/components/navigation/tab_navigation/index.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/navigation/tab_navigation/types.ts (80%) rename x-pack/plugins/siem/public/{ => common}/components/navigation/types.ts (83%) rename x-pack/plugins/siem/public/{ => common}/components/navigation/use_get_url_search.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/news_feed/helpers.test.ts (99%) rename x-pack/plugins/siem/public/{ => common}/components/news_feed/helpers.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/news_feed/index.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/news_feed/news_feed.tsx (86%) rename x-pack/plugins/siem/public/{ => common}/components/news_feed/news_link/index.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/news_feed/no_news/index.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/news_feed/post/index.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/news_feed/translations.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/news_feed/types.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/page/index.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/page/manage_query.tsx (95%) rename x-pack/plugins/siem/public/{ => common}/components/page/translations.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/page_route/index.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/page_route/pageroute.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/page_route/pageroute.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/paginated_table/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/paginated_table/helpers.test.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/paginated_table/helpers.ts (89%) rename x-pack/plugins/siem/public/{ => common}/components/paginated_table/index.mock.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/paginated_table/index.test.tsx (99%) rename x-pack/plugins/siem/public/{ => common}/components/paginated_table/index.tsx (91%) rename x-pack/plugins/siem/public/{ => common}/components/paginated_table/translations.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/panel/index.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/panel/index.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/progress_inline/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/progress_inline/index.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/progress_inline/index.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/query_bar/index.test.tsx (98%) rename x-pack/plugins/siem/public/{ => common}/components/query_bar/index.tsx (96%) rename x-pack/plugins/siem/public/{ => common}/components/scroll_to_top/index.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/scroll_to_top/index.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/search_bar/index.tsx (98%) rename x-pack/plugins/siem/public/{ => common}/components/search_bar/selectors.ts (91%) rename x-pack/plugins/siem/public/{ => common}/components/selectable_text/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/selectable_text/index.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/selectable_text/index.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/sidebar_header/index.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/stat_items/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/stat_items/index.test.tsx (95%) rename x-pack/plugins/siem/public/{ => common}/components/stat_items/index.tsx (99%) rename x-pack/plugins/siem/public/{ => common}/components/subtitle/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/subtitle/index.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/subtitle/index.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/super_date_picker/index.test.tsx (97%) rename x-pack/plugins/siem/public/{ => common}/components/super_date_picker/index.tsx (97%) rename x-pack/plugins/siem/public/{ => common}/components/super_date_picker/selectors.test.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/super_date_picker/selectors.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/tables/__snapshots__/helpers.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/tables/helpers.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/tables/helpers.tsx (97%) rename x-pack/plugins/siem/public/{ => common}/components/toasters/__snapshots__/modal_all_errors.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/toasters/errors.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/toasters/index.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/toasters/index.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/toasters/modal_all_errors.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/toasters/modal_all_errors.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/toasters/translations.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/toasters/utils.test.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/toasters/utils.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/top_n/helpers.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/top_n/helpers.ts (96%) rename x-pack/plugins/siem/public/{ => common}/components/top_n/index.test.tsx (96%) rename x-pack/plugins/siem/public/{ => common}/components/top_n/index.tsx (91%) rename x-pack/plugins/siem/public/{ => common}/components/top_n/top_n.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/top_n/top_n.tsx (93%) rename x-pack/plugins/siem/public/{ => common}/components/top_n/translations.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/truncatable_text/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/truncatable_text/index.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/truncatable_text/index.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/url_state/constants.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/url_state/helpers.test.ts (91%) rename x-pack/plugins/siem/public/{ => common}/components/url_state/helpers.ts (95%) rename x-pack/plugins/siem/public/{ => common}/components/url_state/index.test.tsx (99%) rename x-pack/plugins/siem/public/{ => common}/components/url_state/index.tsx (92%) rename x-pack/plugins/siem/public/{ => common}/components/url_state/index_mocked.test.tsx (99%) rename x-pack/plugins/siem/public/{ => common}/components/url_state/initialize_redux_by_url.tsx (95%) rename x-pack/plugins/siem/public/{ => common}/components/url_state/normalize_time_range.test.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/url_state/normalize_time_range.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/url_state/test_dependencies.ts (95%) rename x-pack/plugins/siem/public/{ => common}/components/url_state/types.ts (96%) rename x-pack/plugins/siem/public/{ => common}/components/url_state/use_url_state.tsx (99%) rename x-pack/plugins/siem/public/{ => common}/components/utility_bar/__snapshots__/utility_bar.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/utility_bar/__snapshots__/utility_bar_action.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/utility_bar/__snapshots__/utility_bar_group.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/utility_bar/__snapshots__/utility_bar_section.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/utility_bar/__snapshots__/utility_bar_text.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/utility_bar/index.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/utility_bar/styles.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/utility_bar/utility_bar.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/utility_bar/utility_bar.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/utility_bar/utility_bar_action.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/utility_bar/utility_bar_action.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/utility_bar/utility_bar_group.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/utility_bar/utility_bar_group.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/utility_bar/utility_bar_section.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/utility_bar/utility_bar_section.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/utility_bar/utility_bar_text.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/utility_bar/utility_bar_text.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/utils.ts (100%) rename x-pack/plugins/siem/public/{ => common}/components/with_hover_actions/index.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/wrapper_page/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => common}/components/wrapper_page/index.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/components/wrapper_page/index.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/containers/anomalies/anomalies_query_tab_body/histogram_configs.ts (94%) rename x-pack/plugins/siem/public/{ => common}/containers/anomalies/anomalies_query_tab_body/index.tsx (96%) rename x-pack/plugins/siem/public/{ => common}/containers/anomalies/anomalies_query_tab_body/translations.ts (100%) rename x-pack/plugins/siem/public/{ => common}/containers/anomalies/anomalies_query_tab_body/types.ts (78%) rename x-pack/plugins/siem/public/{ => common}/containers/anomalies/anomalies_query_tab_body/utils.ts (93%) rename x-pack/plugins/siem/public/{ => common}/containers/errors/index.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/containers/errors/index.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/containers/errors/translations.ts (100%) rename x-pack/plugins/siem/public/{ => common}/containers/events/last_event_time/index.ts (93%) rename x-pack/plugins/siem/public/{ => common}/containers/events/last_event_time/last_event_time.gql_query.ts (100%) rename x-pack/plugins/siem/public/{ => common}/containers/events/last_event_time/mock.ts (93%) rename x-pack/plugins/siem/public/{ => common}/containers/global_time/index.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/containers/helpers.test.ts (94%) rename x-pack/plugins/siem/public/{ => common}/containers/helpers.ts (91%) rename x-pack/plugins/siem/public/{ => common}/containers/kuery_autocompletion/index.tsx (98%) rename x-pack/plugins/siem/public/{ => common}/containers/matrix_histogram/index.gql_query.ts (100%) rename x-pack/plugins/siem/public/{ => common}/containers/matrix_histogram/index.test.tsx (99%) rename x-pack/plugins/siem/public/{ => common}/containers/matrix_histogram/index.ts (97%) rename x-pack/plugins/siem/public/{ => common}/containers/query_template.tsx (98%) rename x-pack/plugins/siem/public/{ => common}/containers/query_template_paginated.tsx (98%) rename x-pack/plugins/siem/public/{ => common}/containers/source/index.gql_query.ts (100%) rename x-pack/plugins/siem/public/{ => common}/containers/source/index.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/containers/source/index.tsx (97%) rename x-pack/plugins/siem/public/{ => common}/containers/source/mock.ts (99%) rename x-pack/plugins/siem/public/{ => common}/hooks/api/__mock__/api.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/hooks/api/api.tsx (94%) rename x-pack/plugins/siem/public/{ => common}/hooks/api/helpers.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/hooks/api/helpers.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/hooks/translations.ts (100%) rename x-pack/plugins/siem/public/{ => common}/hooks/types.ts (80%) rename x-pack/plugins/siem/public/{ => common}/hooks/use_add_to_timeline.tsx (95%) rename x-pack/plugins/siem/public/{ => common}/hooks/use_index_patterns.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/hooks/use_providers_portal.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/lib/clipboard/clipboard.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/lib/clipboard/translations.ts (100%) rename x-pack/plugins/siem/public/{ => common}/lib/clipboard/with_copy_to_clipboard.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/lib/compose/helpers.test.ts (94%) rename x-pack/plugins/siem/public/{ => common}/lib/compose/helpers.ts (100%) rename x-pack/plugins/siem/public/{ => common}/lib/compose/kibana_compose.tsx (83%) rename x-pack/plugins/siem/public/{ => common}/lib/connectors/components/connector_flyout/index.tsx (94%) rename x-pack/plugins/siem/public/{ => common}/lib/connectors/config.ts (100%) rename x-pack/plugins/siem/public/{ => common}/lib/connectors/index.ts (100%) rename x-pack/plugins/siem/public/{ => common}/lib/connectors/jira/config.ts (100%) rename x-pack/plugins/siem/public/{ => common}/lib/connectors/jira/flyout.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/lib/connectors/jira/index.tsx (95%) rename x-pack/plugins/siem/public/{ => common}/lib/connectors/jira/logo.svg (100%) rename x-pack/plugins/siem/public/{ => common}/lib/connectors/jira/translations.ts (100%) rename x-pack/plugins/siem/public/{ => common}/lib/connectors/jira/types.ts (78%) rename x-pack/plugins/siem/public/{ => common}/lib/connectors/servicenow/config.ts (100%) rename x-pack/plugins/siem/public/{ => common}/lib/connectors/servicenow/flyout.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/lib/connectors/servicenow/index.tsx (95%) rename x-pack/plugins/siem/public/{ => common}/lib/connectors/servicenow/logo.svg (100%) rename x-pack/plugins/siem/public/{ => common}/lib/connectors/servicenow/translations.ts (100%) rename x-pack/plugins/siem/public/{ => common}/lib/connectors/servicenow/types.ts (78%) rename x-pack/plugins/siem/public/{ => common}/lib/connectors/translations.ts (100%) rename x-pack/plugins/siem/public/{ => common}/lib/connectors/types.ts (82%) rename x-pack/plugins/siem/public/{ => common}/lib/connectors/utils.ts (93%) rename x-pack/plugins/siem/public/{ => common}/lib/connectors/validators.ts (100%) rename x-pack/plugins/siem/public/{ => common}/lib/helpers/index.test.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/lib/helpers/index.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/lib/helpers/scheduler.ts (100%) rename x-pack/plugins/siem/public/{ => common}/lib/history/index.ts (100%) rename x-pack/plugins/siem/public/{ => common}/lib/keury/index.test.ts (100%) rename x-pack/plugins/siem/public/{ => common}/lib/keury/index.ts (95%) rename x-pack/plugins/siem/public/{ => common}/lib/kibana/__mocks__/index.ts (100%) rename x-pack/plugins/siem/public/{ => common}/lib/kibana/hooks.ts (95%) rename x-pack/plugins/siem/public/{ => common}/lib/kibana/index.ts (100%) rename x-pack/plugins/siem/public/{ => common}/lib/kibana/kibana_react.ts (86%) rename x-pack/plugins/siem/public/{ => common}/lib/kibana/services.ts (89%) rename x-pack/plugins/siem/public/{ => common}/lib/lib.ts (100%) rename x-pack/plugins/siem/public/{ => common}/lib/note/index.ts (100%) rename x-pack/plugins/siem/public/{ => common}/lib/telemetry/index.ts (96%) rename x-pack/plugins/siem/public/{ => common}/lib/telemetry/middleware.ts (91%) rename x-pack/plugins/siem/public/{ => common}/lib/theme/use_eui_theme.tsx (89%) rename x-pack/plugins/siem/public/{ => common}/mock/global_state.ts (95%) rename x-pack/plugins/siem/public/{ => common}/mock/header.ts (94%) rename x-pack/plugins/siem/public/{ => common}/mock/hook_wrapper.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/mock/index.ts (100%) rename x-pack/plugins/siem/public/{ => common}/mock/index_pattern.ts (100%) rename x-pack/plugins/siem/public/{ => common}/mock/kibana_core.ts (66%) rename x-pack/plugins/siem/public/{ => common}/mock/kibana_react.ts (95%) rename x-pack/plugins/siem/public/{ => common}/mock/match_media.ts (100%) rename x-pack/plugins/siem/public/{ => common}/mock/mock_detail_item.ts (98%) rename x-pack/plugins/siem/public/{ => common}/mock/mock_ecs.ts (99%) rename x-pack/plugins/siem/public/{ => common}/mock/mock_endgame_ecs_data.ts (99%) rename x-pack/plugins/siem/public/{ => common}/mock/mock_timeline_data.ts (99%) rename x-pack/plugins/siem/public/{ => common}/mock/netflow.ts (92%) rename x-pack/plugins/siem/public/{ => common}/mock/news.ts (100%) rename x-pack/plugins/siem/public/{ => common}/mock/raw_news.ts (100%) rename x-pack/plugins/siem/public/{ => common}/mock/test_providers.tsx (92%) rename x-pack/plugins/siem/public/{ => common}/mock/timeline_results.ts (99%) rename x-pack/plugins/siem/public/{ => common}/mock/utils.ts (57%) rename x-pack/plugins/siem/public/{ => common}/store/actions.ts (74%) rename x-pack/plugins/siem/public/{ => common}/store/app/actions.ts (100%) rename x-pack/plugins/siem/public/{ => common}/store/app/index.ts (100%) rename x-pack/plugins/siem/public/{ => common}/store/app/model.ts (100%) rename x-pack/plugins/siem/public/{ => common}/store/app/reducer.ts (100%) rename x-pack/plugins/siem/public/{ => common}/store/app/selectors.ts (100%) rename x-pack/plugins/siem/public/{ => common}/store/constants.ts (100%) rename x-pack/plugins/siem/public/{ => common}/store/drag_and_drop/actions.ts (86%) rename x-pack/plugins/siem/public/{ => common}/store/drag_and_drop/index.ts (100%) rename x-pack/plugins/siem/public/{ => common}/store/drag_and_drop/model.ts (79%) rename x-pack/plugins/siem/public/{ => common}/store/drag_and_drop/reducer.test.ts (85%) rename x-pack/plugins/siem/public/{ => common}/store/drag_and_drop/reducer.ts (93%) rename x-pack/plugins/siem/public/{ => common}/store/drag_and_drop/selectors.ts (100%) rename x-pack/plugins/siem/public/{ => common}/store/epic.ts (59%) rename x-pack/plugins/siem/public/{ => common}/store/index.ts (100%) rename x-pack/plugins/siem/public/{ => common}/store/inputs/actions.ts (96%) rename x-pack/plugins/siem/public/{ => common}/store/inputs/constants.ts (100%) rename x-pack/plugins/siem/public/{ => common}/store/inputs/helpers.test.ts (100%) rename x-pack/plugins/siem/public/{ => common}/store/inputs/helpers.ts (100%) rename x-pack/plugins/siem/public/{ => common}/store/inputs/index.ts (100%) rename x-pack/plugins/siem/public/{ => common}/store/inputs/model.ts (96%) rename x-pack/plugins/siem/public/{ => common}/store/inputs/reducer.ts (100%) rename x-pack/plugins/siem/public/{ => common}/store/inputs/selectors.ts (100%) rename x-pack/plugins/siem/public/{ => common}/store/model.ts (83%) create mode 100644 x-pack/plugins/siem/public/common/store/reducer.ts rename x-pack/plugins/siem/public/{ => common}/store/selectors.ts (73%) rename x-pack/plugins/siem/public/{ => common}/store/store.ts (87%) rename x-pack/plugins/siem/public/{ => common}/store/types.ts (100%) rename x-pack/plugins/siem/public/{pages => }/common/translations.ts (100%) rename x-pack/plugins/siem/public/{ => common}/utils/api/index.ts (100%) rename x-pack/plugins/siem/public/{ => common}/utils/apollo_context.ts (100%) rename x-pack/plugins/siem/public/{ => common}/utils/default_date_settings.test.ts (99%) rename x-pack/plugins/siem/public/{ => common}/utils/default_date_settings.ts (98%) rename x-pack/plugins/siem/public/{ => common}/utils/kql/use_update_kql.test.tsx (92%) rename x-pack/plugins/siem/public/{ => common}/utils/kql/use_update_kql.tsx (96%) rename x-pack/plugins/siem/public/{ => common}/utils/logo_endpoint/64_color.svg (100%) rename x-pack/plugins/siem/public/{ => common}/utils/route/helpers.ts (100%) rename x-pack/plugins/siem/public/{ => common}/utils/route/index.test.tsx (98%) rename x-pack/plugins/siem/public/{ => common}/utils/route/manage_spy_routes.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/utils/route/spy_routes.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/utils/route/types.ts (86%) rename x-pack/plugins/siem/public/{ => common}/utils/route/use_route_spy.tsx (100%) rename x-pack/plugins/siem/public/{ => common}/utils/saved_query_services/index.tsx (93%) rename x-pack/plugins/siem/public/{ => common}/utils/timeline/use_show_timeline.tsx (94%) rename x-pack/plugins/siem/public/{ => common}/utils/use_mount_appended.ts (100%) rename x-pack/plugins/siem/public/{ => common}/utils/validators/index.ts (100%) delete mode 100644 x-pack/plugins/siem/public/components/page/network/index.tsx rename x-pack/plugins/siem/public/{components/page/hosts => hosts/components}/authentications_table/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{components/page/hosts => hosts/components}/authentications_table/index.test.tsx (89%) rename x-pack/plugins/siem/public/{components/page/hosts => hosts/components}/authentications_table/index.tsx (90%) rename x-pack/plugins/siem/public/{components/page/hosts => hosts/components}/authentications_table/mock.ts (96%) rename x-pack/plugins/siem/public/{components/page/hosts => hosts/components}/authentications_table/translations.ts (100%) rename x-pack/plugins/siem/public/{components/page/hosts => hosts/components}/first_last_seen_host/index.test.tsx (96%) rename x-pack/plugins/siem/public/{components/page/hosts => hosts/components}/first_last_seen_host/index.tsx (89%) rename x-pack/plugins/siem/public/{components/page/hosts => hosts/components}/hosts_table/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{components/page/hosts => hosts/components}/hosts_table/columns.tsx (79%) rename x-pack/plugins/siem/public/{components/page/hosts => hosts/components}/hosts_table/index.test.tsx (87%) rename x-pack/plugins/siem/public/{components/page/hosts => hosts/components}/hosts_table/index.tsx (94%) rename x-pack/plugins/siem/public/{components/page/hosts => hosts/components}/hosts_table/mock.ts (96%) rename x-pack/plugins/siem/public/{components/page/hosts => hosts/components}/hosts_table/translations.ts (100%) rename x-pack/plugins/siem/public/{components/page/hosts => hosts/components}/kpi_hosts/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{components/page/hosts => hosts/components}/kpi_hosts/index.test.tsx (97%) rename x-pack/plugins/siem/public/{components/page/hosts => hosts/components}/kpi_hosts/index.tsx (87%) rename x-pack/plugins/siem/public/{components/page/hosts => hosts/components}/kpi_hosts/kpi_host_details_mapping.ts (96%) rename x-pack/plugins/siem/public/{components/page/hosts => hosts/components}/kpi_hosts/kpi_hosts_mapping.ts (96%) rename x-pack/plugins/siem/public/{components/page/hosts => hosts/components}/kpi_hosts/mock.tsx (100%) rename x-pack/plugins/siem/public/{components/page/hosts => hosts/components}/kpi_hosts/translations.ts (100%) rename x-pack/plugins/siem/public/{components/page/hosts => hosts/components}/kpi_hosts/types.ts (100%) rename x-pack/plugins/siem/public/{components/page/hosts => hosts/components}/uncommon_process_table/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{components/page/hosts => hosts/components}/uncommon_process_table/index.test.tsx (97%) rename x-pack/plugins/siem/public/{components/page/hosts => hosts/components}/uncommon_process_table/index.tsx (92%) rename x-pack/plugins/siem/public/{components/page/hosts => hosts/components}/uncommon_process_table/mock.ts (97%) rename x-pack/plugins/siem/public/{components/page/hosts => hosts/components}/uncommon_process_table/translations.ts (100%) rename x-pack/plugins/siem/public/{ => hosts}/containers/authentications/index.gql_query.ts (100%) rename x-pack/plugins/siem/public/{ => hosts}/containers/authentications/index.tsx (87%) rename x-pack/plugins/siem/public/{ => hosts}/containers/hosts/first_last_seen/first_last_seen.gql_query.ts (100%) rename x-pack/plugins/siem/public/{ => hosts}/containers/hosts/first_last_seen/index.ts (87%) rename x-pack/plugins/siem/public/{ => hosts}/containers/hosts/first_last_seen/mock.ts (89%) rename x-pack/plugins/siem/public/{ => hosts}/containers/hosts/hosts_table.gql_query.ts (100%) rename x-pack/plugins/siem/public/{ => hosts}/containers/hosts/index.tsx (88%) rename x-pack/plugins/siem/public/{ => hosts}/containers/hosts/overview/host_overview.gql_query.ts (100%) rename x-pack/plugins/siem/public/{ => hosts}/containers/hosts/overview/index.tsx (85%) rename x-pack/plugins/siem/public/{ => hosts}/containers/kpi_host_details/index.gql_query.tsx (100%) rename x-pack/plugins/siem/public/{ => hosts}/containers/kpi_host_details/index.tsx (86%) rename x-pack/plugins/siem/public/{ => hosts}/containers/kpi_hosts/index.gql_query.ts (100%) rename x-pack/plugins/siem/public/{ => hosts}/containers/kpi_hosts/index.tsx (83%) rename x-pack/plugins/siem/public/{ => hosts}/containers/uncommon_processes/index.gql_query.ts (100%) rename x-pack/plugins/siem/public/{ => hosts}/containers/uncommon_processes/index.tsx (87%) create mode 100644 x-pack/plugins/siem/public/hosts/index.ts rename x-pack/plugins/siem/public/{pages/hosts => hosts/pages}/details/details_tabs.test.tsx (92%) rename x-pack/plugins/siem/public/{pages/hosts => hosts/pages}/details/details_tabs.tsx (85%) rename x-pack/plugins/siem/public/{pages/hosts => hosts/pages}/details/helpers.test.ts (100%) rename x-pack/plugins/siem/public/{pages/hosts => hosts/pages}/details/helpers.ts (95%) rename x-pack/plugins/siem/public/{pages/hosts => hosts/pages}/details/index.tsx (81%) rename x-pack/plugins/siem/public/{pages/hosts => hosts/pages}/details/nav_tabs.test.tsx (94%) rename x-pack/plugins/siem/public/{pages/hosts => hosts/pages}/details/nav_tabs.tsx (93%) rename x-pack/plugins/siem/public/{pages/hosts => hosts/pages}/details/types.ts (85%) rename x-pack/plugins/siem/public/{pages/hosts => hosts/pages}/details/utils.ts (83%) rename x-pack/plugins/siem/public/{pages/hosts => hosts/pages}/hosts.test.tsx (88%) rename x-pack/plugins/siem/public/{pages/hosts => hosts/pages}/hosts.tsx (81%) rename x-pack/plugins/siem/public/{pages/hosts => hosts/pages}/hosts_empty_page.tsx (85%) rename x-pack/plugins/siem/public/{pages/hosts => hosts/pages}/hosts_tabs.tsx (84%) rename x-pack/plugins/siem/public/{pages/hosts => hosts/pages}/index.tsx (94%) rename x-pack/plugins/siem/public/{pages/hosts => hosts/pages}/nav_tabs.test.tsx (95%) rename x-pack/plugins/siem/public/{pages/hosts => hosts/pages}/nav_tabs.tsx (95%) rename x-pack/plugins/siem/public/{pages/hosts => hosts/pages}/navigation/alerts_query_tab_body.tsx (95%) rename x-pack/plugins/siem/public/{pages/hosts => hosts/pages}/navigation/authentications_query_tab_body.tsx (86%) rename x-pack/plugins/siem/public/{pages/hosts => hosts/pages}/navigation/events_query_tab_body.tsx (85%) rename x-pack/plugins/siem/public/{pages/hosts => hosts/pages}/navigation/hosts_query_tab_body.tsx (88%) rename x-pack/plugins/siem/public/{pages/hosts => hosts/pages}/navigation/index.ts (100%) rename x-pack/plugins/siem/public/{pages/hosts => hosts/pages}/navigation/types.ts (81%) rename x-pack/plugins/siem/public/{pages/hosts => hosts/pages}/navigation/uncommon_process_query_tab_body.tsx (86%) rename x-pack/plugins/siem/public/{pages/hosts => hosts/pages}/translations.ts (100%) rename x-pack/plugins/siem/public/{pages/hosts => hosts/pages}/types.ts (79%) create mode 100644 x-pack/plugins/siem/public/hosts/routes.tsx rename x-pack/plugins/siem/public/{store/hosts => hosts/store}/actions.ts (100%) rename x-pack/plugins/siem/public/{store/hosts => hosts/store}/helpers.test.ts (97%) rename x-pack/plugins/siem/public/{store/hosts => hosts/store}/helpers.ts (96%) rename x-pack/plugins/siem/public/{store/hosts => hosts/store}/index.ts (68%) rename x-pack/plugins/siem/public/{store/hosts => hosts/store}/model.ts (100%) rename x-pack/plugins/siem/public/{store/hosts => hosts/store}/reducer.ts (99%) rename x-pack/plugins/siem/public/{store/hosts => hosts/store}/selectors.ts (95%) rename x-pack/plugins/siem/public/{ => network}/components/arrows/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => network}/components/arrows/helpers.test.ts (100%) rename x-pack/plugins/siem/public/{ => network}/components/arrows/helpers.ts (100%) rename x-pack/plugins/siem/public/{ => network}/components/arrows/index.test.tsx (95%) rename x-pack/plugins/siem/public/{ => network}/components/arrows/index.tsx (100%) rename x-pack/plugins/siem/public/{ => network}/components/direction/direction.test.tsx (100%) rename x-pack/plugins/siem/public/{ => network}/components/direction/index.tsx (93%) rename x-pack/plugins/siem/public/{ => network}/components/embeddables/__mocks__/mock.ts (99%) rename x-pack/plugins/siem/public/{ => network}/components/embeddables/__snapshots__/embeddable.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => network}/components/embeddables/__snapshots__/embeddable_header.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => network}/components/embeddables/__snapshots__/embedded_map.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => network}/components/embeddables/__snapshots__/index_patterns_missing_prompt.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => network}/components/embeddables/embeddable.test.tsx (100%) rename x-pack/plugins/siem/public/{ => network}/components/embeddables/embeddable.tsx (100%) rename x-pack/plugins/siem/public/{ => network}/components/embeddables/embeddable_header.test.tsx (96%) rename x-pack/plugins/siem/public/{ => network}/components/embeddables/embeddable_header.tsx (100%) rename x-pack/plugins/siem/public/{ => network}/components/embeddables/embedded_map.test.tsx (85%) rename x-pack/plugins/siem/public/{ => network}/components/embeddables/embedded_map.tsx (89%) rename x-pack/plugins/siem/public/{ => network}/components/embeddables/embedded_map_helpers.test.tsx (97%) rename x-pack/plugins/siem/public/{ => network}/components/embeddables/embedded_map_helpers.tsx (92%) rename x-pack/plugins/siem/public/{ => network}/components/embeddables/index_patterns_missing_prompt.test.tsx (93%) rename x-pack/plugins/siem/public/{ => network}/components/embeddables/index_patterns_missing_prompt.tsx (97%) rename x-pack/plugins/siem/public/{ => network}/components/embeddables/map_config.test.ts (100%) rename x-pack/plugins/siem/public/{ => network}/components/embeddables/map_config.ts (99%) rename x-pack/plugins/siem/public/{ => network}/components/embeddables/map_tool_tip/__snapshots__/line_tool_tip_content.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => network}/components/embeddables/map_tool_tip/__snapshots__/map_tool_tip.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => network}/components/embeddables/map_tool_tip/__snapshots__/point_tool_tip_content.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => network}/components/embeddables/map_tool_tip/__snapshots__/tooltip_footer.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => network}/components/embeddables/map_tool_tip/line_tool_tip_content.test.tsx (100%) rename x-pack/plugins/siem/public/{ => network}/components/embeddables/map_tool_tip/line_tool_tip_content.tsx (100%) rename x-pack/plugins/siem/public/{ => network}/components/embeddables/map_tool_tip/map_tool_tip.test.tsx (100%) rename x-pack/plugins/siem/public/{ => network}/components/embeddables/map_tool_tip/map_tool_tip.tsx (98%) rename x-pack/plugins/siem/public/{ => network}/components/embeddables/map_tool_tip/point_tool_tip_content.test.tsx (89%) rename x-pack/plugins/siem/public/{ => network}/components/embeddables/map_tool_tip/point_tool_tip_content.tsx (81%) rename x-pack/plugins/siem/public/{ => network}/components/embeddables/map_tool_tip/tooltip_footer.test.tsx (100%) rename x-pack/plugins/siem/public/{ => network}/components/embeddables/map_tool_tip/tooltip_footer.tsx (100%) rename x-pack/plugins/siem/public/{ => network}/components/embeddables/translations.ts (100%) rename x-pack/plugins/siem/public/{ => network}/components/embeddables/types.ts (88%) rename x-pack/plugins/siem/public/{ => network}/components/flow_controls/__snapshots__/flow_direction_select.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => network}/components/flow_controls/__snapshots__/flow_target_select.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => network}/components/flow_controls/flow_direction_select.test.tsx (96%) rename x-pack/plugins/siem/public/{ => network}/components/flow_controls/flow_direction_select.tsx (95%) rename x-pack/plugins/siem/public/{ => network}/components/flow_controls/flow_target_select.test.tsx (97%) rename x-pack/plugins/siem/public/{ => network}/components/flow_controls/flow_target_select.tsx (96%) rename x-pack/plugins/siem/public/{ => network}/components/flow_controls/translations.ts (100%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/flow_target_select_connected/index.test.tsx (92%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/flow_target_select_connected/index.tsx (88%) rename x-pack/plugins/siem/public/{ => network}/components/ip/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => network}/components/ip/index.test.tsx (90%) rename x-pack/plugins/siem/public/{ => network}/components/ip/index.tsx (89%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/ip_overview/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/ip_overview/index.test.tsx (71%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/ip_overview/index.tsx (80%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/ip_overview/mock.ts (96%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/ip_overview/translations.ts (100%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/kpi_network/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/kpi_network/index.test.tsx (84%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/kpi_network/index.tsx (96%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/kpi_network/mock.ts (97%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/kpi_network/translations.ts (100%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/network_dns_table/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/network_dns_table/__snapshots__/is_ptr_included.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/network_dns_table/columns.tsx (81%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/network_dns_table/index.test.tsx (86%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/network_dns_table/index.tsx (95%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/network_dns_table/is_ptr_included.test.tsx (95%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/network_dns_table/is_ptr_included.tsx (100%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/network_dns_table/mock.ts (98%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/network_dns_table/translations.ts (100%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/network_http_table/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/network_http_table/columns.tsx (88%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/network_http_table/index.test.tsx (86%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/network_http_table/index.tsx (95%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/network_http_table/mock.ts (97%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/network_http_table/translations.ts (100%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/network_top_countries_table/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/network_top_countries_table/columns.tsx (85%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/network_top_countries_table/index.test.tsx (91%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/network_top_countries_table/index.tsx (96%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/network_top_countries_table/mock.ts (94%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/network_top_countries_table/translations.ts (100%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/network_top_n_flow_table/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/network_top_n_flow_table/columns.tsx (87%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/network_top_n_flow_table/index.test.tsx (89%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/network_top_n_flow_table/index.tsx (96%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/network_top_n_flow_table/mock.ts (99%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/network_top_n_flow_table/translations.ts (100%) rename x-pack/plugins/siem/public/{ => network}/components/port/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => network}/components/port/index.test.tsx (92%) rename x-pack/plugins/siem/public/{ => network}/components/port/index.tsx (80%) rename x-pack/plugins/siem/public/{ => network}/components/source_destination/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => network}/components/source_destination/country_flag.tsx (100%) rename x-pack/plugins/siem/public/{ => network}/components/source_destination/field_names.ts (100%) rename x-pack/plugins/siem/public/{ => network}/components/source_destination/geo_fields.tsx (98%) rename x-pack/plugins/siem/public/{ => network}/components/source_destination/index.test.tsx (96%) rename x-pack/plugins/siem/public/{ => network}/components/source_destination/index.tsx (100%) rename x-pack/plugins/siem/public/{ => network}/components/source_destination/ip_with_port.tsx (100%) rename x-pack/plugins/siem/public/{ => network}/components/source_destination/label.tsx (100%) rename x-pack/plugins/siem/public/{ => network}/components/source_destination/network.tsx (96%) rename x-pack/plugins/siem/public/{ => network}/components/source_destination/source_destination_arrows.tsx (98%) rename x-pack/plugins/siem/public/{ => network}/components/source_destination/source_destination_ip.test.tsx (99%) rename x-pack/plugins/siem/public/{ => network}/components/source_destination/source_destination_ip.tsx (98%) rename x-pack/plugins/siem/public/{ => network}/components/source_destination/source_destination_with_arrows.tsx (100%) rename x-pack/plugins/siem/public/{ => network}/components/source_destination/translations.ts (100%) rename x-pack/plugins/siem/public/{ => network}/components/source_destination/types.ts (100%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/tls_table/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/tls_table/columns.tsx (85%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/tls_table/index.test.tsx (85%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/tls_table/index.tsx (93%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/tls_table/mock.ts (96%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/tls_table/translations.ts (100%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/users_table/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/users_table/columns.tsx (86%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/users_table/index.test.tsx (85%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/users_table/index.tsx (92%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/users_table/mock.ts (95%) rename x-pack/plugins/siem/public/{components/page/network => network/components}/users_table/translations.ts (100%) rename x-pack/plugins/siem/public/{ => network}/containers/ip_overview/index.gql_query.ts (100%) rename x-pack/plugins/siem/public/{ => network}/containers/ip_overview/index.tsx (82%) rename x-pack/plugins/siem/public/{ => network}/containers/kpi_network/index.gql_query.ts (100%) rename x-pack/plugins/siem/public/{ => network}/containers/kpi_network/index.tsx (83%) rename x-pack/plugins/siem/public/{ => network}/containers/network_dns/index.gql_query.ts (100%) rename x-pack/plugins/siem/public/{ => network}/containers/network_dns/index.tsx (85%) rename x-pack/plugins/siem/public/{ => network}/containers/network_http/index.gql_query.ts (100%) rename x-pack/plugins/siem/public/{ => network}/containers/network_http/index.tsx (87%) rename x-pack/plugins/siem/public/{ => network}/containers/network_top_countries/index.gql_query.ts (100%) rename x-pack/plugins/siem/public/{ => network}/containers/network_top_countries/index.tsx (88%) rename x-pack/plugins/siem/public/{ => network}/containers/network_top_n_flow/index.gql_query.ts (100%) rename x-pack/plugins/siem/public/{ => network}/containers/network_top_n_flow/index.tsx (88%) rename x-pack/plugins/siem/public/{ => network}/containers/tls/index.gql_query.ts (100%) rename x-pack/plugins/siem/public/{ => network}/containers/tls/index.tsx (87%) rename x-pack/plugins/siem/public/{ => network}/containers/users/index.gql_query.ts (100%) rename x-pack/plugins/siem/public/{ => network}/containers/users/index.tsx (87%) create mode 100644 x-pack/plugins/siem/public/network/index.ts rename x-pack/plugins/siem/public/{pages/network => network/pages}/index.tsx (93%) rename x-pack/plugins/siem/public/{pages/network => network/pages}/ip_details/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{pages/network => network/pages}/ip_details/index.test.tsx (84%) rename x-pack/plugins/siem/public/{pages/network => network/pages}/ip_details/index.tsx (84%) rename x-pack/plugins/siem/public/{pages/network => network/pages}/ip_details/network_http_query_table.tsx (86%) rename x-pack/plugins/siem/public/{pages/network => network/pages}/ip_details/network_top_countries_query_table.tsx (86%) rename x-pack/plugins/siem/public/{pages/network => network/pages}/ip_details/network_top_n_flow_query_table.tsx (86%) rename x-pack/plugins/siem/public/{pages/network => network/pages}/ip_details/tls_query_table.tsx (87%) rename x-pack/plugins/siem/public/{pages/network => network/pages}/ip_details/types.ts (86%) rename x-pack/plugins/siem/public/{pages/network => network/pages}/ip_details/users_query_table.tsx (87%) rename x-pack/plugins/siem/public/{pages/network => network/pages}/ip_details/utils.ts (82%) rename x-pack/plugins/siem/public/{pages/network => network/pages}/navigation/alerts_query_tab_body.tsx (96%) rename x-pack/plugins/siem/public/{pages/network => network/pages}/navigation/conditional_flex_group.tsx (100%) rename x-pack/plugins/siem/public/{pages/network => network/pages}/navigation/countries_query_tab_body.tsx (85%) rename x-pack/plugins/siem/public/{pages/network => network/pages}/navigation/dns_query_tab_body.tsx (88%) rename x-pack/plugins/siem/public/{pages/network => network/pages}/navigation/http_query_tab_body.tsx (84%) rename x-pack/plugins/siem/public/{pages/network => network/pages}/navigation/index.ts (100%) rename x-pack/plugins/siem/public/{pages/network => network/pages}/navigation/ips_query_tab_body.tsx (84%) rename x-pack/plugins/siem/public/{pages/network => network/pages}/navigation/nav_tabs.tsx (100%) rename x-pack/plugins/siem/public/{pages/network => network/pages}/navigation/network_routes.tsx (90%) rename x-pack/plugins/siem/public/{pages/network => network/pages}/navigation/network_routes_loading.tsx (100%) rename x-pack/plugins/siem/public/{pages/network => network/pages}/navigation/tls_query_tab_body.tsx (87%) rename x-pack/plugins/siem/public/{pages/network => network/pages}/navigation/types.ts (89%) rename x-pack/plugins/siem/public/{pages/network => network/pages}/navigation/utils.ts (100%) rename x-pack/plugins/siem/public/{pages/network => network/pages}/network.test.tsx (89%) rename x-pack/plugins/siem/public/{pages/network => network/pages}/network.tsx (83%) rename x-pack/plugins/siem/public/{pages/network => network/pages}/network_empty_page.tsx (85%) rename x-pack/plugins/siem/public/{pages/network => network/pages}/translations.ts (100%) rename x-pack/plugins/siem/public/{pages/network => network/pages}/types.ts (82%) create mode 100644 x-pack/plugins/siem/public/network/routes.tsx rename x-pack/plugins/siem/public/{store/network => network/store}/actions.ts (95%) rename x-pack/plugins/siem/public/{store/network => network/store}/helpers.test.ts (99%) rename x-pack/plugins/siem/public/{store/network => network/store}/helpers.ts (97%) rename x-pack/plugins/siem/public/{store/network => network/store}/index.ts (64%) rename x-pack/plugins/siem/public/{store/network => network/store}/model.ts (100%) rename x-pack/plugins/siem/public/{store/network => network/store}/reducer.ts (99%) rename x-pack/plugins/siem/public/{store/network => network/store}/selectors.ts (98%) rename x-pack/plugins/siem/public/{pages/overview => overview/components}/alerts_by_category/index.test.tsx (92%) rename x-pack/plugins/siem/public/{pages/overview => overview/components}/alerts_by_category/index.tsx (76%) rename x-pack/plugins/siem/public/{pages/overview => overview/components}/event_counts/index.test.tsx (87%) rename x-pack/plugins/siem/public/{pages/overview => overview/components}/event_counts/index.tsx (81%) rename x-pack/plugins/siem/public/{pages/overview => overview/components}/events_by_dataset/__mocks__/index.tsx (100%) rename x-pack/plugins/siem/public/{pages/overview => overview/components}/events_by_dataset/index.tsx (82%) rename x-pack/plugins/siem/public/{components/page/hosts => overview/components}/host_overview/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{components/page/hosts => overview/components}/host_overview/index.test.tsx (89%) rename x-pack/plugins/siem/public/{components/page/hosts => overview/components}/host_overview/index.tsx (81%) rename x-pack/plugins/siem/public/{components/page/hosts => overview/components}/host_overview/mock.ts (96%) rename x-pack/plugins/siem/public/{components/page/hosts => overview/components}/host_overview/translations.ts (100%) rename x-pack/plugins/siem/public/{components/page/overview => overview/components}/loading_placeholders/index.tsx (100%) rename x-pack/plugins/siem/public/{pages/overview => overview/components}/overview_empty/index.tsx (85%) rename x-pack/plugins/siem/public/{components/page/overview => overview/components}/overview_host/index.test.tsx (85%) rename x-pack/plugins/siem/public/{components/page/overview => overview/components}/overview_host/index.tsx (82%) rename x-pack/plugins/siem/public/{components/page/overview => overview/components}/overview_host_stats/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{components/page/overview => overview/components}/overview_host_stats/index.test.tsx (96%) rename x-pack/plugins/siem/public/{components/page/overview => overview/components}/overview_host_stats/index.tsx (99%) rename x-pack/plugins/siem/public/{components/page/overview => overview/components}/overview_host_stats/mock.ts (92%) rename x-pack/plugins/siem/public/{components/page/overview => overview/components}/overview_network/index.test.tsx (84%) rename x-pack/plugins/siem/public/{components/page/overview => overview/components}/overview_network/index.tsx (84%) rename x-pack/plugins/siem/public/{components/page/overview => overview/components}/overview_network_stats/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{components/page/overview => overview/components}/overview_network_stats/index.test.tsx (96%) rename x-pack/plugins/siem/public/{components/page/overview => overview/components}/overview_network_stats/index.tsx (98%) rename x-pack/plugins/siem/public/{components/page/overview => overview/components}/overview_network_stats/mock.ts (89%) rename x-pack/plugins/siem/public/{ => overview}/components/recent_cases/filters/index.tsx (100%) rename x-pack/plugins/siem/public/{ => overview}/components/recent_cases/index.tsx (82%) rename x-pack/plugins/siem/public/{ => overview}/components/recent_cases/no_cases/index.tsx (76%) rename x-pack/plugins/siem/public/{ => overview}/components/recent_cases/recent_cases.tsx (82%) rename x-pack/plugins/siem/public/{ => overview}/components/recent_cases/translations.ts (100%) rename x-pack/plugins/siem/public/{ => overview}/components/recent_cases/types.ts (100%) rename x-pack/plugins/siem/public/{ => overview}/components/recent_timelines/counts/index.tsx (88%) rename x-pack/plugins/siem/public/{ => overview}/components/recent_timelines/filters/index.tsx (100%) rename x-pack/plugins/siem/public/{ => overview}/components/recent_timelines/header/index.tsx (82%) rename x-pack/plugins/siem/public/{ => overview}/components/recent_timelines/index.tsx (81%) rename x-pack/plugins/siem/public/{ => overview}/components/recent_timelines/recent_timelines.tsx (93%) rename x-pack/plugins/siem/public/{ => overview}/components/recent_timelines/translations.ts (100%) rename x-pack/plugins/siem/public/{ => overview}/components/recent_timelines/types.ts (100%) rename x-pack/plugins/siem/public/{pages/overview => overview/components}/sidebar/index.tsx (82%) rename x-pack/plugins/siem/public/{pages/overview => overview/components}/sidebar/sidebar.tsx (78%) rename x-pack/plugins/siem/public/{pages/overview => overview/components}/signals_by_category/index.tsx (80%) rename x-pack/plugins/siem/public/{components/page/overview => overview/components}/stat_value.tsx (94%) rename x-pack/plugins/siem/public/{components/page/overview => overview/components}/types.ts (100%) rename x-pack/plugins/siem/public/{containers/overview => overview/containers}/overview_host/index.gql_query.ts (100%) rename x-pack/plugins/siem/public/{containers/overview => overview/containers}/overview_host/index.tsx (87%) rename x-pack/plugins/siem/public/{containers/overview => overview/containers}/overview_network/index.gql_query.ts (100%) rename x-pack/plugins/siem/public/{containers/overview => overview/containers}/overview_network/index.tsx (88%) create mode 100644 x-pack/plugins/siem/public/overview/index.ts rename x-pack/plugins/siem/public/{pages/overview => overview/pages}/index.tsx (100%) rename x-pack/plugins/siem/public/{pages/overview => overview/pages}/overview.test.tsx (88%) rename x-pack/plugins/siem/public/{pages/overview => overview/pages}/overview.tsx (82%) rename x-pack/plugins/siem/public/{pages/overview => overview/pages}/summary.tsx (98%) rename x-pack/plugins/siem/public/{pages/overview => overview/pages}/translations.ts (100%) create mode 100644 x-pack/plugins/siem/public/overview/routes.tsx delete mode 100644 x-pack/plugins/siem/public/pages/home/types.ts delete mode 100644 x-pack/plugins/siem/public/store/reducer.ts rename x-pack/plugins/siem/public/{ => timelines}/components/certificate_fingerprint/index.test.tsx (94%) rename x-pack/plugins/siem/public/{ => timelines}/components/certificate_fingerprint/index.tsx (89%) rename x-pack/plugins/siem/public/{ => timelines}/components/certificate_fingerprint/translations.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/duration/index.test.tsx (87%) rename x-pack/plugins/siem/public/{ => timelines}/components/duration/index.tsx (93%) rename x-pack/plugins/siem/public/{ => timelines}/components/edit_data_provider/helpers.test.tsx (98%) rename x-pack/plugins/siem/public/{ => timelines}/components/edit_data_provider/helpers.tsx (98%) rename x-pack/plugins/siem/public/{ => timelines}/components/edit_data_provider/index.test.tsx (98%) rename x-pack/plugins/siem/public/{ => timelines}/components/edit_data_provider/index.tsx (99%) rename x-pack/plugins/siem/public/{ => timelines}/components/edit_data_provider/translations.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/field_renderers/__snapshots__/field_renderers.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/field_renderers/field_renderers.test.tsx (97%) rename x-pack/plugins/siem/public/{ => timelines}/components/field_renderers/field_renderers.tsx (92%) rename x-pack/plugins/siem/public/{ => timelines}/components/fields_browser/categories_pane.test.tsx (96%) rename x-pack/plugins/siem/public/{ => timelines}/components/fields_browser/categories_pane.tsx (97%) rename x-pack/plugins/siem/public/{ => timelines}/components/fields_browser/category.test.tsx (94%) rename x-pack/plugins/siem/public/{ => timelines}/components/fields_browser/category.tsx (96%) rename x-pack/plugins/siem/public/{ => timelines}/components/fields_browser/category_columns.test.tsx (98%) rename x-pack/plugins/siem/public/{ => timelines}/components/fields_browser/category_columns.tsx (92%) rename x-pack/plugins/siem/public/{ => timelines}/components/fields_browser/category_title.test.tsx (96%) rename x-pack/plugins/siem/public/{ => timelines}/components/fields_browser/category_title.tsx (93%) rename x-pack/plugins/siem/public/{ => timelines}/components/fields_browser/field_browser.test.tsx (98%) rename x-pack/plugins/siem/public/{ => timelines}/components/fields_browser/field_browser.tsx (98%) rename x-pack/plugins/siem/public/{ => timelines}/components/fields_browser/field_items.test.tsx (97%) rename x-pack/plugins/siem/public/{ => timelines}/components/fields_browser/field_items.tsx (85%) rename x-pack/plugins/siem/public/{ => timelines}/components/fields_browser/field_name.test.tsx (91%) rename x-pack/plugins/siem/public/{ => timelines}/components/fields_browser/field_name.tsx (93%) rename x-pack/plugins/siem/public/{ => timelines}/components/fields_browser/fields_pane.test.tsx (94%) rename x-pack/plugins/siem/public/{ => timelines}/components/fields_browser/fields_pane.tsx (95%) rename x-pack/plugins/siem/public/{ => timelines}/components/fields_browser/header.test.tsx (98%) rename x-pack/plugins/siem/public/{ => timelines}/components/fields_browser/header.tsx (93%) rename x-pack/plugins/siem/public/{ => timelines}/components/fields_browser/helpers.test.tsx (98%) rename x-pack/plugins/siem/public/{ => timelines}/components/fields_browser/helpers.tsx (98%) rename x-pack/plugins/siem/public/{ => timelines}/components/fields_browser/index.test.tsx (97%) rename x-pack/plugins/siem/public/{ => timelines}/components/fields_browser/index.tsx (97%) rename x-pack/plugins/siem/public/{ => timelines}/components/fields_browser/translations.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/fields_browser/types.ts (90%) rename x-pack/plugins/siem/public/{ => timelines}/components/flyout/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/flyout/button/index.tsx (96%) rename x-pack/plugins/siem/public/{ => timelines}/components/flyout/button/translations.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/flyout/header/index.tsx (87%) rename x-pack/plugins/siem/public/{ => timelines}/components/flyout/header_with_close_button/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/flyout/header_with_close_button/index.test.tsx (95%) rename x-pack/plugins/siem/public/{ => timelines}/components/flyout/header_with_close_button/index.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/flyout/header_with_close_button/translations.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/flyout/index.test.tsx (90%) rename x-pack/plugins/siem/public/{ => timelines}/components/flyout/index.tsx (96%) rename x-pack/plugins/siem/public/{ => timelines}/components/flyout/pane/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/flyout/pane/index.test.tsx (97%) rename x-pack/plugins/siem/public/{ => timelines}/components/flyout/pane/index.tsx (94%) rename x-pack/plugins/siem/public/{ => timelines}/components/flyout/pane/timeline_resize_handle.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/flyout/pane/translations.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/formatted_duration/helpers.test.ts (99%) rename x-pack/plugins/siem/public/{ => timelines}/components/formatted_duration/helpers.tsx (98%) rename x-pack/plugins/siem/public/{ => timelines}/components/formatted_duration/index.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/formatted_duration/tooltip/index.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/formatted_duration/translations.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/formatted_ip/index.tsx (86%) rename x-pack/plugins/siem/public/{ => timelines}/components/ja3_fingerprint/index.test.tsx (93%) rename x-pack/plugins/siem/public/{ => timelines}/components/ja3_fingerprint/index.tsx (86%) rename x-pack/plugins/siem/public/{ => timelines}/components/ja3_fingerprint/translations.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/lazy_accordion/index.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/loading/index.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/netflow/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/netflow/fingerprints/index.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/netflow/index.test.tsx (95%) rename x-pack/plugins/siem/public/{ => timelines}/components/netflow/index.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/netflow/netflow_columns/duration_event_start_end.tsx (95%) rename x-pack/plugins/siem/public/{ => timelines}/components/netflow/netflow_columns/index.tsx (97%) rename x-pack/plugins/siem/public/{ => timelines}/components/netflow/netflow_columns/types.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/netflow/netflow_columns/user_process.tsx (96%) rename x-pack/plugins/siem/public/{ => timelines}/components/netflow/types.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/notes/add_note/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/notes/add_note/__snapshots__/new_note.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/notes/add_note/index.test.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/notes/add_note/index.tsx (96%) rename x-pack/plugins/siem/public/{ => timelines}/components/notes/add_note/new_note.test.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/notes/add_note/new_note.tsx (96%) rename x-pack/plugins/siem/public/{ => timelines}/components/notes/columns.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/notes/helpers.tsx (96%) rename x-pack/plugins/siem/public/{ => timelines}/components/notes/index.tsx (97%) rename x-pack/plugins/siem/public/{ => timelines}/components/notes/note_card/__snapshots__/note_card_body.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/notes/note_card/index.test.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/notes/note_card/index.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/notes/note_card/note_card_body.test.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/notes/note_card/note_card_body.tsx (82%) rename x-pack/plugins/siem/public/{ => timelines}/components/notes/note_card/note_card_header.test.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/notes/note_card/note_card_header.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/notes/note_card/note_created.test.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/notes/note_card/note_created.tsx (89%) rename x-pack/plugins/siem/public/{ => timelines}/components/notes/note_cards/index.test.tsx (98%) rename x-pack/plugins/siem/public/{ => timelines}/components/notes/note_cards/index.tsx (98%) rename x-pack/plugins/siem/public/{ => timelines}/components/notes/translations.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/constants.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/delete_timeline_modal/delete_timeline_modal.test.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/delete_timeline_modal/delete_timeline_modal.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/delete_timeline_modal/index.test.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/delete_timeline_modal/index.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/edit_timeline_actions.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/edit_timeline_batch_actions.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/export_timeline/export_timeline.test.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/export_timeline/export_timeline.tsx (90%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/export_timeline/index.test.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/export_timeline/index.tsx (96%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/export_timeline/mocks.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/helpers.test.ts (97%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/helpers.ts (95%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/index.test.tsx (98%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/index.tsx (95%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/note_previews/index.test.tsx (98%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/note_previews/index.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/note_previews/note_preview.test.tsx (98%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/note_previews/note_preview.tsx (90%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/open_timeline.test.tsx (98%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/open_timeline.tsx (97%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/open_timeline_modal/index.test.tsx (83%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/open_timeline_modal/index.tsx (91%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/open_timeline_modal/open_timeline_modal_body.test.tsx (97%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/open_timeline_modal/open_timeline_modal_body.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/open_timeline_modal/open_timeline_modal_button.test.tsx (89%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/open_timeline_modal/open_timeline_modal_button.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/search_row/index.test.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/search_row/index.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/timelines_table/actions_columns.test.tsx (98%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/timelines_table/actions_columns.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/timelines_table/common_columns.test.tsx (98%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/timelines_table/common_columns.tsx (95%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/timelines_table/common_styles.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/timelines_table/extended_columns.test.tsx (92%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/timelines_table/extended_columns.tsx (91%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/timelines_table/icon_header_columns.test.tsx (97%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/timelines_table/icon_header_columns.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/timelines_table/index.test.tsx (98%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/timelines_table/index.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/timelines_table/mocks.ts (97%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/title_row/index.test.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/title_row/index.tsx (95%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/translations.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/types.ts (96%) rename x-pack/plugins/siem/public/{ => timelines}/components/open_timeline/use_timeline_types.tsx (92%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/__snapshots__/timeline.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{components => timelines/components/timeline}/and_or_badge/__examples__/index.stories.tsx (100%) rename x-pack/plugins/siem/public/{components => timelines/components/timeline}/and_or_badge/index.tsx (100%) rename x-pack/plugins/siem/public/{components => timelines/components/timeline}/and_or_badge/translations.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/auto_save_warning/index.tsx (91%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/auto_save_warning/translations.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/actions/index.test.tsx (99%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/actions/index.tsx (97%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/column_headers/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/column_headers/actions/index.tsx (95%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/column_headers/column_header.tsx (95%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/column_headers/common/dragging_container.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/column_headers/common/styles.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/column_headers/default_headers.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/column_headers/events_select/helpers.tsx (98%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/column_headers/events_select/index.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/column_headers/events_select/translations.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/column_headers/filter/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/column_headers/filter/index.test.tsx (95%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/column_headers/filter/index.tsx (92%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/column_headers/header/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/column_headers/header/header_content.tsx (93%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/column_headers/header/helpers.ts (86%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/column_headers/header/index.test.tsx (97%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/column_headers/header/index.tsx (94%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/column_headers/header_tooltip_content/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/column_headers/header_tooltip_content/index.test.tsx (94%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/column_headers/header_tooltip_content/index.tsx (92%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/column_headers/helpers.test.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/column_headers/helpers.ts (90%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/column_headers/index.test.tsx (92%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/column_headers/index.tsx (94%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/column_headers/range_picker/index.test.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/column_headers/range_picker/index.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/column_headers/range_picker/ranges.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/column_headers/range_picker/translations.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/column_headers/text_filter/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/column_headers/text_filter/index.test.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/column_headers/text_filter/index.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/column_headers/translations.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/column_id.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/constants.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/data_driven_columns/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/data_driven_columns/index.test.tsx (94%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/data_driven_columns/index.tsx (92%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/events/event_column_view.tsx (95%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/events/index.tsx (89%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/events/stateful_event.tsx (94%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/helpers.test.ts (99%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/helpers.ts (96%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/index.test.tsx (95%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/index.tsx (95%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/mini_map/date_ranges.test.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/mini_map/date_ranges.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/__snapshots__/args.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/__snapshots__/empty_column_renderer.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/__snapshots__/formatted_field.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/__snapshots__/get_column_renderer.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/__snapshots__/get_row_renderer.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/__snapshots__/host_working_dir.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/__snapshots__/plain_column_renderer.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/__snapshots__/plain_row_renderer.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/__snapshots__/process_draggable.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/__snapshots__/unknown_column_renderer.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/__snapshots__/user_host_working_dir.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/args.test.tsx (95%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/args.tsx (95%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/auditd/__snapshots__/generic_details.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/auditd/__snapshots__/generic_file_details.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/auditd/__snapshots__/generic_row_renderer.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/auditd/__snapshots__/primary_secondary_user_info.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/auditd/__snapshots__/session_user_host_working_dir.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/auditd/generic_details.test.tsx (98%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/auditd/generic_details.tsx (95%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/auditd/generic_file_details.test.tsx (98%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/auditd/generic_file_details.tsx (96%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/auditd/generic_row_renderer.test.tsx (92%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/auditd/generic_row_renderer.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/auditd/primary_secondary_user_info.test.tsx (97%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/auditd/primary_secondary_user_info.tsx (97%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/auditd/session_user_host_working_dir.test.tsx (97%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/auditd/session_user_host_working_dir.tsx (96%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/auditd/translations.ts (100%) rename x-pack/plugins/siem/public/{components => timelines/components/timeline/body/renderers}/bytes/index.test.tsx (74%) rename x-pack/plugins/siem/public/{components => timelines/components/timeline/body/renderers}/bytes/index.tsx (83%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/column_renderer.ts (82%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/constants.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/dns/dns_request_event_details.test.tsx (82%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/dns/dns_request_event_details.tsx (94%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/dns/dns_request_event_details_line.test.tsx (98%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/dns/dns_request_event_details_line.tsx (98%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/dns/translations.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/empty_column_renderer.test.tsx (91%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/empty_column_renderer.tsx (81%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/endgame/endgame_security_event_details.test.tsx (92%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/endgame/endgame_security_event_details.tsx (96%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/endgame/endgame_security_event_details_line.test.tsx (99%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/endgame/endgame_security_event_details_line.tsx (99%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/endgame/helpers.test.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/endgame/helpers.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/endgame/translations.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/exit_code_draggable.test.tsx (95%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/exit_code_draggable.tsx (94%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/file_draggable.test.tsx (95%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/file_draggable.tsx (97%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/formatted_field.test.tsx (96%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/formatted_field.tsx (88%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/formatted_field_helpers.tsx (89%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/get_column_renderer.test.tsx (89%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/get_column_renderer.ts (91%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/get_row_renderer.test.tsx (93%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/get_row_renderer.ts (92%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/helpers.test.tsx (98%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/helpers.tsx (96%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/host_working_dir.test.tsx (94%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/host_working_dir.tsx (94%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/index.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/netflow.tsx (86%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/netflow/__snapshots__/netflow_row_renderer.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/netflow/netflow_row_renderer.test.tsx (91%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/netflow/netflow_row_renderer.tsx (90%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/parent_process_draggable.test.tsx (95%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/parent_process_draggable.tsx (96%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/parse_query_value.test.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/parse_query_value.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/parse_value.test.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/parse_value.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/plain_column_renderer.test.tsx (96%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/plain_column_renderer.tsx (88%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/plain_row_renderer.test.tsx (88%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/plain_row_renderer.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/process_draggable.test.tsx (99%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/process_draggable.tsx (97%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/process_hash.test.tsx (94%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/process_hash.tsx (96%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/row_renderer.tsx (87%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/suricata/__snapshots__/suricata_details.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/suricata/__snapshots__/suricata_row_renderer.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/suricata/__snapshots__/suricata_signature.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/suricata/suricata_details.test.tsx (83%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/suricata/suricata_details.tsx (91%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/suricata/suricata_links.test.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/suricata/suricata_links.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/suricata/suricata_refs.tsx (92%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/suricata/suricata_row_renderer.test.tsx (85%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/suricata/suricata_row_renderer.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/suricata/suricata_signature.test.tsx (93%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/suricata/suricata_signature.tsx (87%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/system/__snapshots__/auth_ssh.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/system/__snapshots__/generic_details.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/system/__snapshots__/generic_file_details.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/system/__snapshots__/generic_row_renderer.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/system/__snapshots__/package.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/system/auth_ssh.test.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/system/auth_ssh.tsx (93%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/system/generic_details.test.tsx (98%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/system/generic_details.tsx (94%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/system/generic_file_details.test.tsx (99%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/system/generic_file_details.tsx (96%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/system/generic_row_renderer.test.tsx (98%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/system/generic_row_renderer.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/system/package.test.tsx (95%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/system/package.tsx (95%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/system/translations.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/translations.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/unknown_column_renderer.test.tsx (91%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/unknown_column_renderer.tsx (83%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/user_host_working_dir.test.tsx (98%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/user_host_working_dir.tsx (96%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/zeek/__snapshots__/zeek_details.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/zeek/__snapshots__/zeek_row_renderer.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/zeek/__snapshots__/zeek_signature.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/zeek/translations.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/zeek/zeek_details.test.tsx (95%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/zeek/zeek_details.tsx (88%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/zeek/zeek_row_renderer.test.tsx (87%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/zeek/zeek_row_renderer.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/zeek/zeek_signature.test.tsx (97%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/renderers/zeek/zeek_signature.tsx (94%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/sort/__snapshots__/sort_indicator.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/sort/index.ts (89%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/sort/sort_indicator.test.tsx (96%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/sort/sort_indicator.tsx (95%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/stateful_body.test.tsx (96%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/stateful_body.tsx (95%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/body/translations.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/data_providers/__snapshots__/data_providers.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/data_providers/__snapshots__/empty.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/data_providers/__snapshots__/provider.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/data_providers/__snapshots__/providers.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/data_providers/data_provider.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/data_providers/data_providers.test.tsx (94%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/data_providers/empty.test.tsx (92%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/data_providers/empty.tsx (98%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/data_providers/helpers.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/data_providers/index.tsx (94%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/data_providers/mock/mock_data_providers.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/data_providers/provider.test.tsx (92%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/data_providers/provider.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/data_providers/provider_badge.tsx (95%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/data_providers/provider_item_actions.tsx (98%) create mode 100644 x-pack/plugins/siem/public/timelines/components/timeline/data_providers/provider_item_and.tsx create mode 100644 x-pack/plugins/siem/public/timelines/components/timeline/data_providers/provider_item_and_drag_drop.tsx rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/data_providers/provider_item_badge.tsx (96%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/data_providers/providers.test.tsx (98%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/data_providers/providers.tsx (98%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/data_providers/translations.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/events.ts (97%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/expandable_event/index.tsx (84%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/expandable_event/translations.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/fetch_kql_timeline.tsx (88%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/footer/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/footer/index.test.tsx (99%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/footer/index.tsx (98%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/footer/last_updated.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/footer/mock.ts (96%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/footer/translations.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/header/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/header/index.test.tsx (87%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/header/index.tsx (97%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/header/translations.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/helpers.test.tsx (99%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/helpers.tsx (96%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/index.tsx (94%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/insert_timeline_popover/index.test.tsx (97%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/insert_timeline_popover/index.tsx (97%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/insert_timeline_popover/use_insert_timeline.tsx (87%) rename x-pack/plugins/siem/public/{components => timelines/components/timeline}/pin/index.test.tsx (100%) rename x-pack/plugins/siem/public/{components => timelines/components/timeline}/pin/index.tsx (93%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/properties/helpers.tsx (97%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/properties/index.test.tsx (96%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/properties/index.tsx (96%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/properties/notes_size.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/properties/properties_left.tsx (97%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/properties/properties_right.tsx (97%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/properties/styles.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/properties/translations.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/query_bar/index.test.tsx (96%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/query_bar/index.tsx (94%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/refetch_timeline.tsx (83%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/search_or_filter/helpers.test.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/search_or_filter/helpers.tsx (95%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/search_or_filter/index.tsx (92%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/search_or_filter/pick_events.tsx (96%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/search_or_filter/search_or_filter.tsx (93%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/search_or_filter/translations.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/search_super_select/index.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/selectable_timeline/index.tsx (97%) rename x-pack/plugins/siem/public/{components => timelines/components/timeline}/skeleton_row/__snapshots__/index.test.tsx.snap (100%) rename x-pack/plugins/siem/public/{components => timelines/components/timeline}/skeleton_row/index.test.tsx (96%) rename x-pack/plugins/siem/public/{components => timelines/components/timeline}/skeleton_row/index.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/styles.tsx (98%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/timeline.test.tsx (96%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/timeline.tsx (95%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/timeline_context.tsx (97%) rename x-pack/plugins/siem/public/{ => timelines}/components/timeline/translations.ts (100%) rename x-pack/plugins/siem/public/{containers/timeline => timelines/containers}/all/index.gql_query.ts (100%) rename x-pack/plugins/siem/public/{containers/timeline => timelines/containers}/all/index.tsx (93%) rename x-pack/plugins/siem/public/{containers/timeline => timelines/containers}/api.ts (90%) rename x-pack/plugins/siem/public/{containers/timeline => timelines/containers}/delete/persist.gql_query.ts (100%) rename x-pack/plugins/siem/public/{containers/timeline => timelines/containers}/details/index.gql_query.ts (100%) rename x-pack/plugins/siem/public/{containers/timeline => timelines/containers}/details/index.tsx (97%) rename x-pack/plugins/siem/public/{containers/timeline => timelines/containers}/favorite/persist.gql_query.ts (100%) rename x-pack/plugins/siem/public/{containers/timeline => timelines/containers}/index.gql_query.ts (100%) rename x-pack/plugins/siem/public/{containers/timeline => timelines/containers}/index.tsx (92%) rename x-pack/plugins/siem/public/{containers/timeline => timelines/containers}/notes/persist.gql_query.ts (100%) rename x-pack/plugins/siem/public/{containers/timeline => timelines/containers}/one/index.gql_query.ts (100%) rename x-pack/plugins/siem/public/{containers/timeline => timelines/containers}/persist.gql_query.ts (100%) rename x-pack/plugins/siem/public/{containers/timeline => timelines/containers}/pinned_event/persist.gql_query.ts (100%) create mode 100644 x-pack/plugins/siem/public/timelines/index.ts rename x-pack/plugins/siem/public/{pages/timelines => timelines/pages}/index.tsx (84%) rename x-pack/plugins/siem/public/{pages/timelines => timelines/pages}/timelines_page.test.tsx (92%) rename x-pack/plugins/siem/public/{pages/timelines => timelines/pages}/timelines_page.tsx (85%) rename x-pack/plugins/siem/public/{pages/timelines => timelines/pages}/translations.ts (100%) create mode 100644 x-pack/plugins/siem/public/timelines/routes.tsx rename x-pack/plugins/siem/public/{ => timelines}/store/timeline/actions.ts (94%) rename x-pack/plugins/siem/public/{ => timelines}/store/timeline/defaults.ts (80%) rename x-pack/plugins/siem/public/{ => timelines}/store/timeline/epic.test.ts (97%) rename x-pack/plugins/siem/public/{ => timelines}/store/timeline/epic.ts (96%) rename x-pack/plugins/siem/public/{ => timelines}/store/timeline/epic_dispatcher_timeline_persistence_queue.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/store/timeline/epic_favorite.ts (95%) rename x-pack/plugins/siem/public/{ => timelines}/store/timeline/epic_note.ts (93%) rename x-pack/plugins/siem/public/{ => timelines}/store/timeline/epic_pinned_event.ts (95%) rename x-pack/plugins/siem/public/{ => timelines}/store/timeline/helpers.ts (98%) rename x-pack/plugins/siem/public/{ => timelines}/store/timeline/index.ts (61%) rename x-pack/plugins/siem/public/{ => timelines}/store/timeline/manage_timeline_id.tsx (100%) rename x-pack/plugins/siem/public/{ => timelines}/store/timeline/model.ts (91%) rename x-pack/plugins/siem/public/{ => timelines}/store/timeline/my_epic_timeline_id.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/store/timeline/reducer.test.ts (99%) rename x-pack/plugins/siem/public/{ => timelines}/store/timeline/reducer.ts (100%) rename x-pack/plugins/siem/public/{ => timelines}/store/timeline/refetch_queries.ts (69%) rename x-pack/plugins/siem/public/{ => timelines}/store/timeline/selectors.ts (95%) rename x-pack/plugins/siem/public/{ => timelines}/store/timeline/types.ts (100%) diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/activity_monitor/columns.tsx b/x-pack/plugins/siem/public/alerts/components/activity_monitor/columns.tsx similarity index 96% rename from x-pack/plugins/siem/public/pages/detection_engine/components/activity_monitor/columns.tsx rename to x-pack/plugins/siem/public/alerts/components/activity_monitor/columns.tsx index 78315d3ba79d4..51a5397637e7c 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/components/activity_monitor/columns.tsx +++ b/x-pack/plugins/siem/public/alerts/components/activity_monitor/columns.tsx @@ -14,7 +14,7 @@ import { EuiTableActionsColumnType, } from '@elastic/eui'; import React from 'react'; -import { getEmptyTagValue } from '../../../../components/empty_value'; +import { getEmptyTagValue } from '../../../common/components/empty_value'; import { ColumnTypes } from './types'; const actions: EuiTableActionsColumnType['actions'] = [ diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/activity_monitor/index.test.tsx b/x-pack/plugins/siem/public/alerts/components/activity_monitor/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/components/activity_monitor/index.test.tsx rename to x-pack/plugins/siem/public/alerts/components/activity_monitor/index.test.tsx diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/activity_monitor/index.tsx b/x-pack/plugins/siem/public/alerts/components/activity_monitor/index.tsx similarity index 98% rename from x-pack/plugins/siem/public/pages/detection_engine/components/activity_monitor/index.tsx rename to x-pack/plugins/siem/public/alerts/components/activity_monitor/index.tsx index 31420ad07cd50..c2b6b0f025e1d 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/components/activity_monitor/index.tsx +++ b/x-pack/plugins/siem/public/alerts/components/activity_monitor/index.tsx @@ -6,14 +6,14 @@ import { EuiBasicTable, EuiPanel, EuiSpacer } from '@elastic/eui'; import React, { useState, useCallback } from 'react'; -import { HeaderSection } from '../../../../components/header_section'; +import { HeaderSection } from '../../../common/components/header_section'; import { UtilityBar, UtilityBarAction, UtilityBarGroup, UtilityBarSection, UtilityBarText, -} from '../../../../components/utility_bar'; +} from '../../../common/components/utility_bar'; import { columns } from './columns'; import { ColumnTypes, PageTypes, SortTypes } from './types'; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/activity_monitor/types.ts b/x-pack/plugins/siem/public/alerts/components/activity_monitor/types.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/components/activity_monitor/types.ts rename to x-pack/plugins/siem/public/alerts/components/activity_monitor/types.ts diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/detection_engine_header_page/index.test.tsx b/x-pack/plugins/siem/public/alerts/components/detection_engine_header_page/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/components/detection_engine_header_page/index.test.tsx rename to x-pack/plugins/siem/public/alerts/components/detection_engine_header_page/index.test.tsx diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/detection_engine_header_page/index.tsx b/x-pack/plugins/siem/public/alerts/components/detection_engine_header_page/index.tsx similarity index 88% rename from x-pack/plugins/siem/public/pages/detection_engine/components/detection_engine_header_page/index.tsx rename to x-pack/plugins/siem/public/alerts/components/detection_engine_header_page/index.tsx index c945073919013..42a5afb600fba 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/components/detection_engine_header_page/index.tsx +++ b/x-pack/plugins/siem/public/alerts/components/detection_engine_header_page/index.tsx @@ -6,7 +6,7 @@ import React from 'react'; -import { HeaderPage, HeaderPageProps } from '../../../../components/header_page'; +import { HeaderPage, HeaderPageProps } from '../../../common/components/header_page'; import * as i18n from './translations'; const DetectionEngineHeaderPageComponent: React.FC = props => ( diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/detection_engine_header_page/translations.ts b/x-pack/plugins/siem/public/alerts/components/detection_engine_header_page/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/components/detection_engine_header_page/translations.ts rename to x-pack/plugins/siem/public/alerts/components/detection_engine_header_page/translations.ts diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/no_api_integration_callout/index.test.tsx b/x-pack/plugins/siem/public/alerts/components/no_api_integration_callout/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/components/no_api_integration_callout/index.test.tsx rename to x-pack/plugins/siem/public/alerts/components/no_api_integration_callout/index.test.tsx diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/no_api_integration_callout/index.tsx b/x-pack/plugins/siem/public/alerts/components/no_api_integration_callout/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/components/no_api_integration_callout/index.tsx rename to x-pack/plugins/siem/public/alerts/components/no_api_integration_callout/index.tsx diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/no_api_integration_callout/translations.ts b/x-pack/plugins/siem/public/alerts/components/no_api_integration_callout/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/components/no_api_integration_callout/translations.ts rename to x-pack/plugins/siem/public/alerts/components/no_api_integration_callout/translations.ts diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/no_write_signals_callout/index.test.tsx b/x-pack/plugins/siem/public/alerts/components/no_write_signals_callout/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/components/no_write_signals_callout/index.test.tsx rename to x-pack/plugins/siem/public/alerts/components/no_write_signals_callout/index.test.tsx diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/no_write_signals_callout/index.tsx b/x-pack/plugins/siem/public/alerts/components/no_write_signals_callout/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/components/no_write_signals_callout/index.tsx rename to x-pack/plugins/siem/public/alerts/components/no_write_signals_callout/index.tsx diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/no_write_signals_callout/translations.ts b/x-pack/plugins/siem/public/alerts/components/no_write_signals_callout/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/components/no_write_signals_callout/translations.ts rename to x-pack/plugins/siem/public/alerts/components/no_write_signals_callout/translations.ts diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/accordion_title/index.test.tsx b/x-pack/plugins/siem/public/alerts/components/rules/accordion_title/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/accordion_title/index.test.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/accordion_title/index.test.tsx diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/accordion_title/index.tsx b/x-pack/plugins/siem/public/alerts/components/rules/accordion_title/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/accordion_title/index.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/accordion_title/index.tsx diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/add_item_form/index.test.tsx b/x-pack/plugins/siem/public/alerts/components/rules/add_item_form/index.test.tsx similarity index 90% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/add_item_form/index.test.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/add_item_form/index.test.tsx index eafa89a33f596..890e66c8767c4 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/add_item_form/index.test.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/add_item_form/index.test.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { shallow } from 'enzyme'; import { AddItem } from './index'; -import { useFormFieldMock } from '../../../../../../public/mock/test_providers'; +import { useFormFieldMock } from '../../../../common/mock/test_providers'; describe('AddItem', () => { it('renders correctly', () => { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/add_item_form/index.tsx b/x-pack/plugins/siem/public/alerts/components/rules/add_item_form/index.tsx similarity index 98% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/add_item_form/index.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/add_item_form/index.tsx index abbaa6d6192ee..d6c18078f8acd 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/add_item_form/index.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/add_item_form/index.tsx @@ -17,8 +17,8 @@ import { isEmpty } from 'lodash/fp'; import React, { ChangeEvent, useCallback, useEffect, useState, useRef } from 'react'; import styled from 'styled-components'; -import * as RuleI18n from '../../translations'; -import { FieldHook, getFieldValidityAndErrorMessage } from '../../../../../shared_imports'; +import * as RuleI18n from '../../../pages/detection_engine/rules/translations'; +import { FieldHook, getFieldValidityAndErrorMessage } from '../../../../shared_imports'; interface AddItemProps { addText: string; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/all_rules_tables/index.test.tsx b/x-pack/plugins/siem/public/alerts/components/rules/all_rules_tables/index.test.tsx similarity index 97% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/all_rules_tables/index.test.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/all_rules_tables/index.test.tsx index 8afb8db0c8d5b..d841af69a7537 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/all_rules_tables/index.test.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/all_rules_tables/index.test.tsx @@ -8,7 +8,7 @@ import React, { useRef } from 'react'; import { shallow } from 'enzyme'; import { AllRulesTables } from './index'; -import { AllRulesTabs } from '../../all'; +import { AllRulesTabs } from '../../../pages/detection_engine/rules/all'; describe('AllRulesTables', () => { it('renders correctly', () => { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/all_rules_tables/index.tsx b/x-pack/plugins/siem/public/alerts/components/rules/all_rules_tables/index.tsx similarity index 88% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/all_rules_tables/index.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/all_rules_tables/index.tsx index 8ea5606d0082c..8fd3f648bc812 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/all_rules_tables/index.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/all_rules_tables/index.tsx @@ -14,14 +14,14 @@ import { import React, { useMemo, memo } from 'react'; import styled from 'styled-components'; -import { EuiBasicTableOnChange } from '../../types'; -import * as i18n from '../../translations'; +import { EuiBasicTableOnChange } from '../../../pages/detection_engine/rules/types'; +import * as i18n from '../../../pages/detection_engine/rules/translations'; import { RulesColumns, RuleStatusRowItemType, -} from '../../../../../pages/detection_engine/rules/all/columns'; -import { Rule, Rules } from '../../../../../containers/detection_engine/rules'; -import { AllRulesTabs } from '../../all'; +} from '../../../pages/detection_engine/rules/all/columns'; +import { Rule, Rules } from '../../../containers/detection_engine/rules/types'; +import { AllRulesTabs } from '../../../pages/detection_engine/rules/all'; // EuiBasicTable give me a hardtime with adding the ref attributes so I went the easy way // after few hours of fight with typescript !!!! I lost :( diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/anomaly_threshold_slider/index.test.tsx b/x-pack/plugins/siem/public/alerts/components/rules/anomaly_threshold_slider/index.test.tsx similarity index 92% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/anomaly_threshold_slider/index.test.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/anomaly_threshold_slider/index.test.tsx index c0e957d94261f..5e65ff2fca59b 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/anomaly_threshold_slider/index.test.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/anomaly_threshold_slider/index.test.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { shallow } from 'enzyme'; import { AnomalyThresholdSlider } from './index'; -import { useFormFieldMock } from '../../../../../mock'; +import { useFormFieldMock } from '../../../../common/mock'; describe('AnomalyThresholdSlider', () => { it('renders correctly', () => { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/anomaly_threshold_slider/index.tsx b/x-pack/plugins/siem/public/alerts/components/rules/anomaly_threshold_slider/index.tsx similarity index 95% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/anomaly_threshold_slider/index.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/anomaly_threshold_slider/index.tsx index 01fddf98b97d8..705626c77621c 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/anomaly_threshold_slider/index.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/anomaly_threshold_slider/index.tsx @@ -7,7 +7,7 @@ import React, { useCallback } from 'react'; import { EuiFlexGroup, EuiFlexItem, EuiRange, EuiFormRow } from '@elastic/eui'; -import { FieldHook } from '../../../../../shared_imports'; +import { FieldHook } from '../../../../shared_imports'; interface AnomalyThresholdSliderProps { describedByIds: string[]; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/description_step/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/alerts/components/rules/description_step/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/description_step/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/alerts/components/rules/description_step/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/description_step/assets/list_tree_icon.svg b/x-pack/plugins/siem/public/alerts/components/rules/description_step/assets/list_tree_icon.svg similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/description_step/assets/list_tree_icon.svg rename to x-pack/plugins/siem/public/alerts/components/rules/description_step/assets/list_tree_icon.svg diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/description_step/helpers.test.tsx b/x-pack/plugins/siem/public/alerts/components/rules/description_step/helpers.test.tsx similarity index 99% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/description_step/helpers.test.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/description_step/helpers.test.tsx index 186aeae42246d..70de3d2a72dcc 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/description_step/helpers.test.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/description_step/helpers.test.tsx @@ -8,8 +8,8 @@ import React from 'react'; import { shallow } from 'enzyme'; import { EuiLoadingSpinner } from '@elastic/eui'; -import { coreMock } from '../../../../../../../../../src/core/public/mocks'; -import { esFilters, FilterManager } from '../../../../../../../../../src/plugins/data/public'; +import { coreMock } from '../../../../../../../../src/core/public/mocks'; +import { esFilters, FilterManager } from '../../../../../../../../src/plugins/data/public'; import { SeverityBadge } from '../severity_badge'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/description_step/helpers.tsx b/x-pack/plugins/siem/public/alerts/components/rules/description_step/helpers.tsx similarity index 97% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/description_step/helpers.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/description_step/helpers.tsx index 1ac371a3f6829..ad3ed538c875b 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/description_step/helpers.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/description_step/helpers.tsx @@ -19,8 +19,8 @@ import { isEmpty } from 'lodash/fp'; import React from 'react'; import styled from 'styled-components'; -import { RuleType } from '../../../../../../common/detection_engine/types'; -import { esFilters } from '../../../../../../../../../src/plugins/data/public'; +import { RuleType } from '../../../../../common/detection_engine/types'; +import { esFilters } from '../../../../../../../../src/plugins/data/public'; import { tacticsOptions, techniquesOptions } from '../../../mitre/mitre_tactics_techniques'; @@ -28,7 +28,7 @@ import * as i18n from './translations'; import { BuildQueryBarDescription, BuildThreatDescription, ListItems } from './types'; import { SeverityBadge } from '../severity_badge'; import ListTreeIcon from './assets/list_tree_icon.svg'; -import { assertUnreachable } from '../../../../../lib/helpers'; +import { assertUnreachable } from '../../../../common/lib/helpers'; const NoteDescriptionContainer = styled(EuiFlexItem)` height: 105px; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/description_step/index.test.tsx b/x-pack/plugins/siem/public/alerts/components/rules/description_step/index.test.tsx similarity index 95% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/description_step/index.test.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/description_step/index.test.tsx index fdfcfd0fd85fe..0cd79f1db78a0 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/description_step/index.test.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/description_step/index.test.tsx @@ -11,23 +11,23 @@ import { addFilterStateIfNotThere, buildListItems, getDescriptionItem, -} from './'; +} from '.'; +import { esFilters, Filter, FilterManager } from '../../../../../../../../src/plugins/data/public'; import { - esFilters, - Filter, - FilterManager, -} from '../../../../../../../../../src/plugins/data/public'; -import { mockAboutStepRule, mockDefineStepRule } from '../../all/__mocks__/mock'; -import { coreMock } from '../../../../../../../../../src/core/public/mocks'; -import { DEFAULT_TIMELINE_TITLE } from '../../../../../components/timeline/translations'; + mockAboutStepRule, + mockDefineStepRule, +} from '../../../pages/detection_engine/rules/all/__mocks__/mock'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { coreMock } from '../../../../../../../../src/core/public/mocks'; +import { DEFAULT_TIMELINE_TITLE } from '../../../../timelines/components/timeline/translations'; import * as i18n from './translations'; import { schema } from '../step_about_rule/schema'; import { ListItems } from './types'; -import { AboutStepRule } from '../../types'; +import { AboutStepRule } from '../../../pages/detection_engine/rules/types'; -jest.mock('../../../../../lib/kibana'); +jest.mock('../../../../common/lib/kibana'); describe('description_step', () => { const setupMock = coreMock.createSetup(); diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/description_step/index.tsx b/x-pack/plugins/siem/public/alerts/components/rules/description_step/index.tsx similarity index 91% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/description_step/index.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/description_step/index.tsx index 108f213811412..86fe128b0a4fb 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/description_step/index.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/description_step/index.tsx @@ -9,18 +9,18 @@ import { isEmpty, chunk, get, pick, isNumber } from 'lodash/fp'; import React, { memo, useState } from 'react'; import styled from 'styled-components'; -import { RuleType } from '../../../../../../common/detection_engine/types'; +import { RuleType } from '../../../../../common/detection_engine/types'; import { IIndexPattern, Filter, esFilters, FilterManager, -} from '../../../../../../../../../src/plugins/data/public'; -import { DEFAULT_TIMELINE_TITLE } from '../../../../../components/timeline/translations'; -import { useKibana } from '../../../../../lib/kibana'; -import { IMitreEnterpriseAttack } from '../../types'; +} from '../../../../../../../../src/plugins/data/public'; +import { DEFAULT_TIMELINE_TITLE } from '../../../../timelines/components/timeline/translations'; +import { useKibana } from '../../../../common/lib/kibana'; +import { IMitreEnterpriseAttack } from '../../../pages/detection_engine/rules/types'; import { FieldValueTimeline } from '../pick_timeline'; -import { FormSchema } from '../../../../../shared_imports'; +import { FormSchema } from '../../../../shared_imports'; import { ListItems } from './types'; import { buildQueryBarDescription, @@ -32,7 +32,7 @@ import { buildNoteDescription, buildRuleTypeDescription, } from './helpers'; -import { useSiemJobs } from '../../../../../components/ml_popover/hooks/use_siem_jobs'; +import { useSiemJobs } from '../../../../common/components/ml_popover/hooks/use_siem_jobs'; import { buildMlJobDescription } from './ml_job_description'; const DescriptionListContainer = styled(EuiDescriptionList)` diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/description_step/ml_job_description.test.tsx b/x-pack/plugins/siem/public/alerts/components/rules/description_step/ml_job_description.test.tsx similarity index 97% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/description_step/ml_job_description.test.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/description_step/ml_job_description.test.tsx index 59231c31d15bb..c82a465f08c3a 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/description_step/ml_job_description.test.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/description_step/ml_job_description.test.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { shallow } from 'enzyme'; import { MlJobDescription, AuditIcon, JobStatusBadge } from './ml_job_description'; -jest.mock('../../../../../lib/kibana'); +jest.mock('../../../../common/lib/kibana'); const job = { moduleId: 'moduleId', diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/description_step/ml_job_description.tsx b/x-pack/plugins/siem/public/alerts/components/rules/description_step/ml_job_description.tsx similarity index 92% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/description_step/ml_job_description.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/description_step/ml_job_description.tsx index 33d3dbcba8631..c5df8b1a3db70 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/description_step/ml_job_description.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/description_step/ml_job_description.tsx @@ -8,9 +8,9 @@ import React from 'react'; import styled from 'styled-components'; import { EuiBadge, EuiIcon, EuiLink, EuiToolTip } from '@elastic/eui'; -import { isJobStarted } from '../../../../../../common/machine_learning/helpers'; -import { useKibana } from '../../../../../lib/kibana'; -import { SiemJob } from '../../../../../components/ml_popover/types'; +import { isJobStarted } from '../../../../../common/machine_learning/helpers'; +import { useKibana } from '../../../../common/lib/kibana'; +import { SiemJob } from '../../../../common/components/ml_popover/types'; import { ListItems } from './types'; import { ML_JOB_STARTED, ML_JOB_STOPPED } from './translations'; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/description_step/translations.tsx b/x-pack/plugins/siem/public/alerts/components/rules/description_step/translations.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/description_step/translations.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/description_step/translations.tsx diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/description_step/types.ts b/x-pack/plugins/siem/public/alerts/components/rules/description_step/types.ts similarity index 83% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/description_step/types.ts rename to x-pack/plugins/siem/public/alerts/components/rules/description_step/types.ts index 564a3c5dc2c01..bcda5ff67a9a6 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/description_step/types.ts +++ b/x-pack/plugins/siem/public/alerts/components/rules/description_step/types.ts @@ -9,8 +9,8 @@ import { IIndexPattern, Filter, FilterManager, -} from '../../../../../../../../../src/plugins/data/public'; -import { IMitreEnterpriseAttack } from '../../types'; +} from '../../../../../../../../src/plugins/data/public'; +import { IMitreEnterpriseAttack } from '../../../pages/detection_engine/rules/types'; export interface ListItems { title: NonNullable; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/mitre/helpers.test.tsx b/x-pack/plugins/siem/public/alerts/components/rules/mitre/helpers.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/mitre/helpers.test.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/mitre/helpers.test.tsx diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/mitre/helpers.ts b/x-pack/plugins/siem/public/alerts/components/rules/mitre/helpers.ts similarity index 87% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/mitre/helpers.ts rename to x-pack/plugins/siem/public/alerts/components/rules/mitre/helpers.ts index 7a28a16214df6..2dc7a6d8f45e5 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/mitre/helpers.ts +++ b/x-pack/plugins/siem/public/alerts/components/rules/mitre/helpers.ts @@ -5,7 +5,7 @@ */ import { isEmpty } from 'lodash/fp'; -import { IMitreAttack } from '../../types'; +import { IMitreAttack } from '../../../pages/detection_engine/rules/types'; export const isMitreAttackInvalid = ( tacticName: string | null | undefined, diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/mitre/index.test.tsx b/x-pack/plugins/siem/public/alerts/components/rules/mitre/index.test.tsx similarity index 93% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/mitre/index.test.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/mitre/index.test.tsx index 3e8d542682456..ecf1bda807b68 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/mitre/index.test.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/mitre/index.test.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { shallow } from 'enzyme'; import { AddMitreThreat } from './index'; -import { useFormFieldMock } from '../../../../../mock'; +import { useFormFieldMock } from '../../../../common/mock'; describe('AddMitreThreat', () => { it('renders correctly', () => { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/mitre/index.tsx b/x-pack/plugins/siem/public/alerts/components/rules/mitre/index.tsx similarity index 97% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/mitre/index.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/mitre/index.tsx index a2d81e72af40e..4170ce5ebeabd 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/mitre/index.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/mitre/index.tsx @@ -19,10 +19,10 @@ import React, { useCallback, useState } from 'react'; import styled from 'styled-components'; import { tacticsOptions, techniquesOptions } from '../../../mitre/mitre_tactics_techniques'; -import * as Rulei18n from '../../translations'; -import { FieldHook, getFieldValidityAndErrorMessage } from '../../../../../shared_imports'; +import * as Rulei18n from '../../../pages/detection_engine/rules/translations'; +import { FieldHook, getFieldValidityAndErrorMessage } from '../../../../shared_imports'; import { threatDefault } from '../step_about_rule/default_value'; -import { IMitreEnterpriseAttack } from '../../types'; +import { IMitreEnterpriseAttack } from '../../../pages/detection_engine/rules/types'; import { MyAddItemButton } from '../add_item_form'; import { isMitreAttackInvalid } from './helpers'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/mitre/translations.ts b/x-pack/plugins/siem/public/alerts/components/rules/mitre/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/mitre/translations.ts rename to x-pack/plugins/siem/public/alerts/components/rules/mitre/translations.ts diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/ml_job_select/index.test.tsx b/x-pack/plugins/siem/public/alerts/components/rules/ml_job_select/index.test.tsx similarity index 74% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/ml_job_select/index.test.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/ml_job_select/index.test.tsx index dea27d8d04536..6f6581e4de1c3 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/ml_job_select/index.test.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/ml_job_select/index.test.tsx @@ -8,10 +8,10 @@ import React from 'react'; import { shallow } from 'enzyme'; import { MlJobSelect } from './index'; -import { useSiemJobs } from '../../../../../components/ml_popover/hooks/use_siem_jobs'; -import { useFormFieldMock } from '../../../../../mock'; -jest.mock('../../../../../components/ml_popover/hooks/use_siem_jobs'); -jest.mock('../../../../../lib/kibana'); +import { useSiemJobs } from '../../../../common/components/ml_popover/hooks/use_siem_jobs'; +import { useFormFieldMock } from '../../../../common/mock'; +jest.mock('../../../../common/components/ml_popover/hooks/use_siem_jobs'); +jest.mock('../../../../common/lib/kibana'); describe('MlJobSelect', () => { beforeAll(() => { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/ml_job_select/index.tsx b/x-pack/plugins/siem/public/alerts/components/rules/ml_job_select/index.tsx similarity index 94% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/ml_job_select/index.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/ml_job_select/index.tsx index c011c06e86542..d3b6de6cf0c40 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/ml_job_select/index.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/ml_job_select/index.tsx @@ -17,10 +17,10 @@ import { } from '@elastic/eui'; import styled from 'styled-components'; -import { isJobStarted } from '../../../../../../common/machine_learning/helpers'; -import { FieldHook, getFieldValidityAndErrorMessage } from '../../../../../shared_imports'; -import { useSiemJobs } from '../../../../../components/ml_popover/hooks/use_siem_jobs'; -import { useKibana } from '../../../../../lib/kibana'; +import { isJobStarted } from '../../../../../common/machine_learning/helpers'; +import { FieldHook, getFieldValidityAndErrorMessage } from '../../../../shared_imports'; +import { useSiemJobs } from '../../../../common/components/ml_popover/hooks/use_siem_jobs'; +import { useKibana } from '../../../../common/lib/kibana'; import { ML_JOB_SELECT_PLACEHOLDER_TEXT, ENABLE_ML_JOB_WARNING, diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/next_step/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/alerts/components/rules/next_step/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/next_step/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/alerts/components/rules/next_step/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/next_step/index.test.tsx b/x-pack/plugins/siem/public/alerts/components/rules/next_step/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/next_step/index.test.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/next_step/index.test.tsx diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/next_step/index.tsx b/x-pack/plugins/siem/public/alerts/components/rules/next_step/index.tsx similarity index 92% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/next_step/index.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/next_step/index.tsx index 11332e7af9266..d97c2b4c8c0aa 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/next_step/index.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/next_step/index.tsx @@ -6,7 +6,7 @@ import React from 'react'; import { EuiHorizontalRule, EuiFlexGroup, EuiFlexItem, EuiButton } from '@elastic/eui'; -import * as RuleI18n from '../../translations'; +import * as RuleI18n from '../../../pages/detection_engine/rules/translations'; interface NextStepProps { onClick: () => Promise; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/optional_field_label/index.test.tsx b/x-pack/plugins/siem/public/alerts/components/rules/optional_field_label/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/optional_field_label/index.test.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/optional_field_label/index.test.tsx diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/optional_field_label/index.tsx b/x-pack/plugins/siem/public/alerts/components/rules/optional_field_label/index.tsx similarity index 84% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/optional_field_label/index.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/optional_field_label/index.tsx index 0dab87b0a3b74..0d144e30cbaba 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/optional_field_label/index.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/optional_field_label/index.tsx @@ -7,7 +7,7 @@ import { EuiText } from '@elastic/eui'; import React from 'react'; -import * as RuleI18n from '../../translations'; +import * as RuleI18n from '../../../pages/detection_engine/rules/translations'; export const OptionalFieldLabel = ( diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/pick_timeline/index.test.tsx b/x-pack/plugins/siem/public/alerts/components/rules/pick_timeline/index.test.tsx similarity index 93% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/pick_timeline/index.test.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/pick_timeline/index.test.tsx index fefc9697176c4..379a8a48e1ad7 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/pick_timeline/index.test.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/pick_timeline/index.test.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { shallow } from 'enzyme'; import { PickTimeline } from './index'; -import { useFormFieldMock } from '../../../../../mock'; +import { useFormFieldMock } from '../../../../common/mock'; describe('PickTimeline', () => { it('renders correctly', () => { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/pick_timeline/index.tsx b/x-pack/plugins/siem/public/alerts/components/rules/pick_timeline/index.tsx similarity index 93% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/pick_timeline/index.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/pick_timeline/index.tsx index 27d668dc6166c..0029e70e4edda 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/pick_timeline/index.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/pick_timeline/index.tsx @@ -7,8 +7,8 @@ import { EuiFormRow } from '@elastic/eui'; import React, { useCallback, useEffect, useState } from 'react'; -import { SearchTimelineSuperSelect } from '../../../../../components/timeline/search_super_select'; -import { FieldHook, getFieldValidityAndErrorMessage } from '../../../../../shared_imports'; +import { SearchTimelineSuperSelect } from '../../../../timelines/components/timeline/search_super_select'; +import { FieldHook, getFieldValidityAndErrorMessage } from '../../../../shared_imports'; export interface FieldValueTimeline { id: string | null; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/pre_packaged_rules/load_empty_prompt.test.tsx b/x-pack/plugins/siem/public/alerts/components/rules/pre_packaged_rules/load_empty_prompt.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/pre_packaged_rules/load_empty_prompt.test.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/pre_packaged_rules/load_empty_prompt.test.tsx diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/pre_packaged_rules/load_empty_prompt.tsx b/x-pack/plugins/siem/public/alerts/components/rules/pre_packaged_rules/load_empty_prompt.tsx similarity index 94% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/pre_packaged_rules/load_empty_prompt.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/pre_packaged_rules/load_empty_prompt.tsx index 5d136265ef1f2..cd88c4ce72af8 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/pre_packaged_rules/load_empty_prompt.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/pre_packaged_rules/load_empty_prompt.tsx @@ -8,7 +8,7 @@ import { EuiEmptyPrompt, EuiFlexGroup, EuiFlexItem, EuiButton } from '@elastic/e import React, { memo, useCallback } from 'react'; import styled from 'styled-components'; -import { DETECTION_ENGINE_PAGE_NAME } from '../../../../../components/link_to/redirect_to_detection_engine'; +import { DETECTION_ENGINE_PAGE_NAME } from '../../../../common/components/link_to/redirect_to_detection_engine'; import * as i18n from './translations'; const EmptyPrompt = styled(EuiEmptyPrompt)` diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/pre_packaged_rules/translations.ts b/x-pack/plugins/siem/public/alerts/components/rules/pre_packaged_rules/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/pre_packaged_rules/translations.ts rename to x-pack/plugins/siem/public/alerts/components/rules/pre_packaged_rules/translations.ts diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/pre_packaged_rules/update_callout.test.tsx b/x-pack/plugins/siem/public/alerts/components/rules/pre_packaged_rules/update_callout.test.tsx similarity index 89% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/pre_packaged_rules/update_callout.test.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/pre_packaged_rules/update_callout.test.tsx index 807da79fb7a1a..b5dca70ad9575 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/pre_packaged_rules/update_callout.test.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/pre_packaged_rules/update_callout.test.tsx @@ -8,8 +8,8 @@ import React from 'react'; import { shallow } from 'enzyme'; import { UpdatePrePackagedRulesCallOut } from './update_callout'; -import { useKibana } from '../../../../../lib/kibana'; -jest.mock('../../../../../lib/kibana'); +import { useKibana } from '../../../../common/lib/kibana'; +jest.mock('../../../../common/lib/kibana'); describe('UpdatePrePackagedRulesCallOut', () => { beforeAll(() => { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/pre_packaged_rules/update_callout.tsx b/x-pack/plugins/siem/public/alerts/components/rules/pre_packaged_rules/update_callout.tsx similarity index 95% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/pre_packaged_rules/update_callout.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/pre_packaged_rules/update_callout.tsx index c2887508a9ae9..0faf4074ed890 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/pre_packaged_rules/update_callout.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/pre_packaged_rules/update_callout.tsx @@ -8,7 +8,7 @@ import React, { memo } from 'react'; import { EuiCallOut, EuiButton, EuiLink } from '@elastic/eui'; -import { useKibana } from '../../../../../lib/kibana'; +import { useKibana } from '../../../../common/lib/kibana'; import * as i18n from './translations'; interface UpdatePrePackagedRulesCallOutProps { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/query_bar/index.test.tsx b/x-pack/plugins/siem/public/alerts/components/rules/query_bar/index.test.tsx similarity index 90% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/query_bar/index.test.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/query_bar/index.test.tsx index cdd06ad58bb4b..e22359edecd1a 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/query_bar/index.test.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/query_bar/index.test.tsx @@ -8,9 +8,9 @@ import React from 'react'; import { shallow } from 'enzyme'; import { QueryBarDefineRule } from './index'; -import { useFormFieldMock } from '../../../../../mock'; +import { useFormFieldMock } from '../../../../common/mock'; -jest.mock('../../../../../lib/kibana'); +jest.mock('../../../../common/lib/kibana'); describe('QueryBarDefineRule', () => { it('renders correctly', () => { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/query_bar/index.tsx b/x-pack/plugins/siem/public/alerts/components/rules/query_bar/index.tsx similarity index 90% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/query_bar/index.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/query_bar/index.tsx index b92d98a4afb13..1aa5ce66d371e 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/query_bar/index.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/query_bar/index.tsx @@ -17,19 +17,19 @@ import { FilterManager, SavedQuery, SavedQueryTimeFilter, -} from '../../../../../../../../../src/plugins/data/public'; +} from '../../../../../../../../src/plugins/data/public'; -import { BrowserFields } from '../../../../../containers/source'; -import { OpenTimelineModal } from '../../../../../components/open_timeline/open_timeline_modal'; -import { ActionTimelineToShow } from '../../../../../components/open_timeline/types'; -import { QueryBar } from '../../../../../components/query_bar'; -import { buildGlobalQuery } from '../../../../../components/timeline/helpers'; -import { getDataProviderFilter } from '../../../../../components/timeline/query_bar'; -import { convertKueryToElasticSearchQuery } from '../../../../../lib/keury'; -import { useKibana } from '../../../../../lib/kibana'; -import { TimelineModel } from '../../../../../store/timeline/model'; -import { useSavedQueryServices } from '../../../../../utils/saved_query_services'; -import { FieldHook, getFieldValidityAndErrorMessage } from '../../../../../shared_imports'; +import { BrowserFields } from '../../../../common/containers/source'; +import { OpenTimelineModal } from '../../../../timelines/components/open_timeline/open_timeline_modal'; +import { ActionTimelineToShow } from '../../../../timelines/components/open_timeline/types'; +import { QueryBar } from '../../../../common/components/query_bar'; +import { buildGlobalQuery } from '../../../../timelines/components/timeline/helpers'; +import { getDataProviderFilter } from '../../../../timelines/components/timeline/query_bar'; +import { convertKueryToElasticSearchQuery } from '../../../../common/lib/keury'; +import { useKibana } from '../../../../common/lib/kibana'; +import { TimelineModel } from '../../../../timelines/store/timeline/model'; +import { useSavedQueryServices } from '../../../../common/utils/saved_query_services'; +import { FieldHook, getFieldValidityAndErrorMessage } from '../../../../shared_imports'; import * as i18n from './translations'; export interface FieldValueQueryBar { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/query_bar/translations.tsx b/x-pack/plugins/siem/public/alerts/components/rules/query_bar/translations.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/query_bar/translations.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/query_bar/translations.tsx diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/read_only_callout/index.test.tsx b/x-pack/plugins/siem/public/alerts/components/rules/read_only_callout/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/read_only_callout/index.test.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/read_only_callout/index.test.tsx diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/read_only_callout/index.tsx b/x-pack/plugins/siem/public/alerts/components/rules/read_only_callout/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/read_only_callout/index.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/read_only_callout/index.tsx diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/read_only_callout/translations.ts b/x-pack/plugins/siem/public/alerts/components/rules/read_only_callout/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/read_only_callout/translations.ts rename to x-pack/plugins/siem/public/alerts/components/rules/read_only_callout/translations.ts diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/rule_actions_field/index.test.tsx b/x-pack/plugins/siem/public/alerts/components/rules/rule_actions_field/index.test.tsx similarity index 86% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/rule_actions_field/index.test.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/rule_actions_field/index.test.tsx index 13ae3ee3d3b7d..579f8869c08b1 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/rule_actions_field/index.test.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/rule_actions_field/index.test.tsx @@ -8,9 +8,9 @@ import React from 'react'; import { shallow } from 'enzyme'; import { RuleActionsField } from './index'; -import { useKibana } from '../../../../../lib/kibana'; -import { useFormFieldMock } from '../../../../../mock'; -jest.mock('../../../../../lib/kibana'); +import { useKibana } from '../../../../common/lib/kibana'; +import { useFormFieldMock } from '../../../../common/mock'; +jest.mock('../../../../common/lib/kibana'); describe('RuleActionsField', () => { it('should not render ActionForm is no actions are supported', () => { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/rule_actions_field/index.tsx b/x-pack/plugins/siem/public/alerts/components/rules/rule_actions_field/index.tsx similarity index 86% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/rule_actions_field/index.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/rule_actions_field/index.tsx index d53cf52cc67b9..2e9a793bbdef2 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/rule_actions_field/index.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/rule_actions_field/index.tsx @@ -7,13 +7,13 @@ import React, { useCallback, useEffect, useState } from 'react'; import deepMerge from 'deepmerge'; -import { NOTIFICATION_SUPPORTED_ACTION_TYPES_IDS } from '../../../../../../common/constants'; +import { NOTIFICATION_SUPPORTED_ACTION_TYPES_IDS } from '../../../../../common/constants'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { loadActionTypes } from '../../../../../../../triggers_actions_ui/public/application/lib/action_connector_api'; -import { SelectField } from '../../../../../shared_imports'; -import { ActionForm, ActionType } from '../../../../../../../triggers_actions_ui/public'; -import { AlertAction } from '../../../../../../../alerting/common'; -import { useKibana } from '../../../../../lib/kibana'; +import { loadActionTypes } from '../../../../../../triggers_actions_ui/public/application/lib/action_connector_api'; +import { SelectField } from '../../../../shared_imports'; +import { ActionForm, ActionType } from '../../../../../../triggers_actions_ui/public'; +import { AlertAction } from '../../../../../../alerting/common'; +import { useKibana } from '../../../../common/lib/kibana'; type ThrottleSelectField = typeof SelectField; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/rule_actions_overflow/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/alerts/components/rules/rule_actions_overflow/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/rule_actions_overflow/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/alerts/components/rules/rule_actions_overflow/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/rule_actions_overflow/index.test.tsx b/x-pack/plugins/siem/public/alerts/components/rules/rule_actions_overflow/index.test.tsx similarity index 97% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/rule_actions_overflow/index.test.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/rule_actions_overflow/index.test.tsx index b54938e6a3cf1..a648a1bdb9aa8 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/rule_actions_overflow/index.test.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/rule_actions_overflow/index.test.tsx @@ -7,9 +7,12 @@ import { shallow, mount } from 'enzyme'; import React from 'react'; -import { deleteRulesAction, duplicateRulesAction } from '../../all/actions'; +import { + deleteRulesAction, + duplicateRulesAction, +} from '../../../pages/detection_engine/rules/all/actions'; import { RuleActionsOverflow } from './index'; -import { mockRule } from '../../all/__mocks__/mock'; +import { mockRule } from '../../../pages/detection_engine/rules/all/__mocks__/mock'; jest.mock('react-router-dom', () => ({ useHistory: () => ({ @@ -17,7 +20,7 @@ jest.mock('react-router-dom', () => ({ }), })); -jest.mock('../../all/actions', () => ({ +jest.mock('../../../pages/detection_engine/rules/all/actions', () => ({ deleteRulesAction: jest.fn(), duplicateRulesAction: jest.fn(), })); diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/rule_actions_overflow/index.tsx b/x-pack/plugins/siem/public/alerts/components/rules/rule_actions_overflow/index.tsx similarity index 89% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/rule_actions_overflow/index.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/rule_actions_overflow/index.tsx index a7ce0c85ffdcf..2d8e6bef8ee90 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/rule_actions_overflow/index.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/rule_actions_overflow/index.tsx @@ -16,13 +16,16 @@ import styled from 'styled-components'; import { noop } from 'lodash/fp'; import { useHistory } from 'react-router-dom'; -import { Rule, exportRules } from '../../../../../containers/detection_engine/rules'; +import { Rule, exportRules } from '../../../../alerts/containers/detection_engine/rules'; import * as i18n from './translations'; -import * as i18nActions from '../../../rules/translations'; -import { displaySuccessToast, useStateToaster } from '../../../../../components/toasters'; -import { deleteRulesAction, duplicateRulesAction } from '../../all/actions'; -import { GenericDownloader } from '../../../../../components/generic_downloader'; -import { DETECTION_ENGINE_PAGE_NAME } from '../../../../../components/link_to/redirect_to_detection_engine'; +import * as i18nActions from '../../../pages/detection_engine/rules/translations'; +import { displaySuccessToast, useStateToaster } from '../../../../common/components/toasters'; +import { + deleteRulesAction, + duplicateRulesAction, +} from '../../../pages/detection_engine/rules/all/actions'; +import { GenericDownloader } from '../../../../common/components/generic_downloader'; +import { DETECTION_ENGINE_PAGE_NAME } from '../../../../common/components/link_to/redirect_to_detection_engine'; const MyEuiButtonIcon = styled(EuiButtonIcon)` &.euiButtonIcon { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/rule_actions_overflow/translations.ts b/x-pack/plugins/siem/public/alerts/components/rules/rule_actions_overflow/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/rule_actions_overflow/translations.ts rename to x-pack/plugins/siem/public/alerts/components/rules/rule_actions_overflow/translations.ts diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/rule_status/helpers.test.tsx b/x-pack/plugins/siem/public/alerts/components/rules/rule_status/helpers.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/rule_status/helpers.test.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/rule_status/helpers.test.tsx diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/rule_status/helpers.ts b/x-pack/plugins/siem/public/alerts/components/rules/rule_status/helpers.ts similarity index 85% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/rule_status/helpers.ts rename to x-pack/plugins/siem/public/alerts/components/rules/rule_status/helpers.ts index 263f602251ea7..88fca3d95604e 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/rule_status/helpers.ts +++ b/x-pack/plugins/siem/public/alerts/components/rules/rule_status/helpers.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { RuleStatusType } from '../../../../../containers/detection_engine/rules'; +import { RuleStatusType } from '../../../../alerts/containers/detection_engine/rules'; export const getStatusColor = (status: RuleStatusType | string | null) => status == null diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/rule_status/index.test.tsx b/x-pack/plugins/siem/public/alerts/components/rules/rule_status/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/rule_status/index.test.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/rule_status/index.test.tsx diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/rule_status/index.tsx b/x-pack/plugins/siem/public/alerts/components/rules/rule_status/index.tsx similarity index 92% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/rule_status/index.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/rule_status/index.tsx index ac457d7345c29..53be48bc98850 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/rule_status/index.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/rule_status/index.tsx @@ -15,9 +15,12 @@ import { import React, { memo, useCallback, useEffect, useState } from 'react'; import deepEqual from 'fast-deep-equal'; -import { useRuleStatus, RuleInfoStatus } from '../../../../../containers/detection_engine/rules'; -import { FormattedDate } from '../../../../../components/formatted_date'; -import { getEmptyTagValue } from '../../../../../components/empty_value'; +import { + useRuleStatus, + RuleInfoStatus, +} from '../../../../alerts/containers/detection_engine/rules'; +import { FormattedDate } from '../../../../common/components/formatted_date'; +import { getEmptyTagValue } from '../../../../common/components/empty_value'; import { getStatusColor } from './helpers'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/rule_status/translations.ts b/x-pack/plugins/siem/public/alerts/components/rules/rule_status/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/rule_status/translations.ts rename to x-pack/plugins/siem/public/alerts/components/rules/rule_status/translations.ts diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/rule_switch/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/alerts/components/rules/rule_switch/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/rule_switch/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/alerts/components/rules/rule_switch/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/rule_switch/index.test.tsx b/x-pack/plugins/siem/public/alerts/components/rules/rule_switch/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/rule_switch/index.test.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/rule_switch/index.test.tsx diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/rule_switch/index.tsx b/x-pack/plugins/siem/public/alerts/components/rules/rule_switch/index.tsx similarity index 88% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/rule_switch/index.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/rule_switch/index.tsx index 44845ea68d954..2f718818ff2e7 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/rule_switch/index.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/rule_switch/index.tsx @@ -15,12 +15,12 @@ import { isEmpty } from 'lodash/fp'; import styled from 'styled-components'; import React, { useCallback, useState, useEffect } from 'react'; -import * as i18n from '../../translations'; -import { enableRules } from '../../../../../containers/detection_engine/rules'; -import { enableRulesAction } from '../../all/actions'; -import { Action } from '../../all/reducer'; -import { useStateToaster, displayErrorToast } from '../../../../../components/toasters'; -import { bucketRulesResponse } from '../../all/helpers'; +import * as i18n from '../../../pages/detection_engine/rules/translations'; +import { enableRules } from '../../../../alerts/containers/detection_engine/rules'; +import { enableRulesAction } from '../../../pages/detection_engine/rules/all/actions'; +import { Action } from '../../../pages/detection_engine/rules/all/reducer'; +import { useStateToaster, displayErrorToast } from '../../../../common/components/toasters'; +import { bucketRulesResponse } from '../../../pages/detection_engine/rules/all/helpers'; const StaticSwitch = styled(EuiSwitch)` .euiSwitch__thumb, diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/schedule_item_form/index.test.tsx b/x-pack/plugins/siem/public/alerts/components/rules/schedule_item_form/index.test.tsx similarity index 93% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/schedule_item_form/index.test.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/schedule_item_form/index.test.tsx index 3829af02ca4f1..9dddd9e6c4085 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/schedule_item_form/index.test.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/schedule_item_form/index.test.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { shallow } from 'enzyme'; import { ScheduleItem } from './index'; -import { useFormFieldMock } from '../../../../../mock'; +import { useFormFieldMock } from '../../../../common/mock'; describe('ScheduleItem', () => { it('renders correctly', () => { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/schedule_item_form/index.tsx b/x-pack/plugins/siem/public/alerts/components/rules/schedule_item_form/index.tsx similarity index 99% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/schedule_item_form/index.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/schedule_item_form/index.tsx index 1b7d17016f83c..ffb6c4eda3243 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/schedule_item_form/index.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/schedule_item_form/index.tsx @@ -16,7 +16,7 @@ import { isEmpty } from 'lodash/fp'; import React, { useCallback, useEffect, useMemo, useState } from 'react'; import styled from 'styled-components'; -import { FieldHook, getFieldValidityAndErrorMessage } from '../../../../../shared_imports'; +import { FieldHook, getFieldValidityAndErrorMessage } from '../../../../shared_imports'; import * as I18n from './translations'; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/schedule_item_form/translations.ts b/x-pack/plugins/siem/public/alerts/components/rules/schedule_item_form/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/schedule_item_form/translations.ts rename to x-pack/plugins/siem/public/alerts/components/rules/schedule_item_form/translations.ts diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/select_rule_type/index.test.tsx b/x-pack/plugins/siem/public/alerts/components/rules/select_rule_type/index.test.tsx similarity index 86% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/select_rule_type/index.test.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/select_rule_type/index.test.tsx index 3d832d61abb28..87401408c3cc1 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/select_rule_type/index.test.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/select_rule_type/index.test.tsx @@ -8,8 +8,8 @@ import React from 'react'; import { shallow } from 'enzyme'; import { SelectRuleType } from './index'; -import { useFormFieldMock } from '../../../../../mock'; -jest.mock('../../../../../lib/kibana'); +import { useFormFieldMock } from '../../../../common/mock'; +jest.mock('../../../../common/lib/kibana'); describe('SelectRuleType', () => { it('renders correctly', () => { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/select_rule_type/index.tsx b/x-pack/plugins/siem/public/alerts/components/rules/select_rule_type/index.tsx similarity index 92% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/select_rule_type/index.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/select_rule_type/index.tsx index dc9a832f820ba..58112732bea3b 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/select_rule_type/index.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/select_rule_type/index.tsx @@ -16,10 +16,10 @@ import { EuiText, } from '@elastic/eui'; -import { isMlRule } from '../../../../../../common/machine_learning/helpers'; -import { RuleType } from '../../../../../../common/detection_engine/types'; -import { FieldHook } from '../../../../../shared_imports'; -import { useKibana } from '../../../../../lib/kibana'; +import { isMlRule } from '../../../../../common/machine_learning/helpers'; +import { RuleType } from '../../../../../common/detection_engine/types'; +import { FieldHook } from '../../../../shared_imports'; +import { useKibana } from '../../../../common/lib/kibana'; import * as i18n from './translations'; const MlCardDescription = ({ diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/select_rule_type/translations.ts b/x-pack/plugins/siem/public/alerts/components/rules/select_rule_type/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/select_rule_type/translations.ts rename to x-pack/plugins/siem/public/alerts/components/rules/select_rule_type/translations.ts diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/severity_badge/index.test.tsx b/x-pack/plugins/siem/public/alerts/components/rules/severity_badge/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/severity_badge/index.test.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/severity_badge/index.test.tsx diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/severity_badge/index.tsx b/x-pack/plugins/siem/public/alerts/components/rules/severity_badge/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/severity_badge/index.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/severity_badge/index.tsx diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/status_icon/index.test.tsx b/x-pack/plugins/siem/public/alerts/components/rules/status_icon/index.test.tsx similarity index 85% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/status_icon/index.test.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/status_icon/index.test.tsx index 89b8a56e79054..6a16008e9d616 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/status_icon/index.test.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/status_icon/index.test.tsx @@ -7,9 +7,9 @@ import React from 'react'; import { shallow } from 'enzyme'; -import { TestProviders } from '../../../../../mock'; +import { TestProviders } from '../../../../common/mock'; import { RuleStatusIcon } from './index'; -jest.mock('../../../../../lib/kibana'); +jest.mock('../../../../common/lib/kibana'); describe('RuleStatusIcon', () => { it('renders correctly', () => { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/status_icon/index.tsx b/x-pack/plugins/siem/public/alerts/components/rules/status_icon/index.tsx similarity index 87% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/status_icon/index.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/status_icon/index.tsx index 3ec5bf1a12eb0..443ee3e1811f6 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/status_icon/index.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/status_icon/index.tsx @@ -8,8 +8,8 @@ import { EuiAvatar, EuiIcon } from '@elastic/eui'; import React, { memo } from 'react'; import styled from 'styled-components'; -import { useEuiTheme } from '../../../../../lib/theme/use_eui_theme'; -import { RuleStatusType } from '../../types'; +import { useEuiTheme } from '../../../../common/lib/theme/use_eui_theme'; +import { RuleStatusType } from '../../../pages/detection_engine/rules/types'; export interface RuleStatusIconProps { name: string; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_about_rule/data.tsx b/x-pack/plugins/siem/public/alerts/components/rules/step_about_rule/data.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_about_rule/data.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/step_about_rule/data.tsx diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_about_rule/default_value.ts b/x-pack/plugins/siem/public/alerts/components/rules/step_about_rule/default_value.ts similarity index 89% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_about_rule/default_value.ts rename to x-pack/plugins/siem/public/alerts/components/rules/step_about_rule/default_value.ts index 52b0038507b59..977769158481e 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_about_rule/default_value.ts +++ b/x-pack/plugins/siem/public/alerts/components/rules/step_about_rule/default_value.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { AboutStepRule } from '../../types'; +import { AboutStepRule } from '../../../pages/detection_engine/rules/types'; export const threatDefault = [ { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_about_rule/helpers.test.ts b/x-pack/plugins/siem/public/alerts/components/rules/step_about_rule/helpers.test.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_about_rule/helpers.test.ts rename to x-pack/plugins/siem/public/alerts/components/rules/step_about_rule/helpers.test.ts diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_about_rule/helpers.ts b/x-pack/plugins/siem/public/alerts/components/rules/step_about_rule/helpers.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_about_rule/helpers.ts rename to x-pack/plugins/siem/public/alerts/components/rules/step_about_rule/helpers.ts diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_about_rule/index.test.tsx b/x-pack/plugins/siem/public/alerts/components/rules/step_about_rule/index.test.tsx similarity index 97% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_about_rule/index.test.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/step_about_rule/index.test.tsx index 3c28e697789ac..13a62cee047ba 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_about_rule/index.test.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/step_about_rule/index.test.tsx @@ -8,8 +8,9 @@ import { mount, shallow } from 'enzyme'; import { ThemeProvider } from 'styled-components'; import euiDarkVars from '@elastic/eui/dist/eui_theme_light.json'; -import { StepAboutRule } from './'; -import { mockAboutStepRule } from '../../all/__mocks__/mock'; +import { StepAboutRule } from '.'; + +import { mockAboutStepRule } from '../../../pages/detection_engine/rules/all/__mocks__/mock'; import { StepRuleDescription } from '../description_step'; import { stepAboutDefaultValue } from './default_value'; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_about_rule/index.tsx b/x-pack/plugins/siem/public/alerts/components/rules/step_about_rule/index.tsx similarity index 96% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_about_rule/index.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/step_about_rule/index.tsx index eaf543780d777..78ae3e44705c7 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_about_rule/index.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/step_about_rule/index.tsx @@ -9,8 +9,11 @@ import React, { FC, memo, useCallback, useEffect, useState } from 'react'; import styled from 'styled-components'; import deepEqual from 'fast-deep-equal'; -import { setFieldValue } from '../../helpers'; -import { RuleStepProps, RuleStep, AboutStepRule } from '../../types'; +import { + RuleStepProps, + RuleStep, + AboutStepRule, +} from '../../../pages/detection_engine/rules/types'; import { AddItem } from '../add_item_form'; import { StepRuleDescription } from '../description_step'; import { AddMitreThreat } from '../mitre'; @@ -21,7 +24,7 @@ import { getUseField, UseField, useForm, -} from '../../../../../shared_imports'; +} from '../../../../shared_imports'; import { defaultRiskScoreBySeverity, severityOptions, SeverityValue } from './data'; import { stepAboutDefaultValue } from './default_value'; @@ -30,7 +33,8 @@ import { schema } from './schema'; import * as I18n from './translations'; import { StepContentWrapper } from '../step_content_wrapper'; import { NextStep } from '../next_step'; -import { MarkdownEditorForm } from '../../../../../components/markdown_editor/form'; +import { MarkdownEditorForm } from '../../../../common/components/markdown_editor/form'; +import { setFieldValue } from '../../../pages/detection_engine/rules/helpers'; const CommonUseField = getUseField({ component: Field }); diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_about_rule/schema.tsx b/x-pack/plugins/siem/public/alerts/components/rules/step_about_rule/schema.tsx similarity index 97% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_about_rule/schema.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/step_about_rule/schema.tsx index 7c088c068c9b2..3cb5e9a0dd5f0 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_about_rule/schema.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/step_about_rule/schema.tsx @@ -6,14 +6,14 @@ import { i18n } from '@kbn/i18n'; -import { IMitreEnterpriseAttack } from '../../types'; import { FIELD_TYPES, fieldValidators, FormSchema, ValidationFunc, ERROR_CODE, -} from '../../../../../shared_imports'; +} from '../../../../shared_imports'; +import { IMitreEnterpriseAttack } from '../../../pages/detection_engine/rules/types'; import { isMitreAttackInvalid } from '../mitre/helpers'; import { OptionalFieldLabel } from '../optional_field_label'; import { isUrlInvalid } from './helpers'; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_about_rule/translations.ts b/x-pack/plugins/siem/public/alerts/components/rules/step_about_rule/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_about_rule/translations.ts rename to x-pack/plugins/siem/public/alerts/components/rules/step_about_rule/translations.ts diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_about_rule_details/index.test.tsx b/x-pack/plugins/siem/public/alerts/components/rules/step_about_rule_details/index.test.tsx similarity index 92% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_about_rule_details/index.test.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/step_about_rule_details/index.test.tsx index 76a3c590a62a6..cd499c60b1233 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_about_rule_details/index.test.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/step_about_rule_details/index.test.tsx @@ -9,13 +9,13 @@ import { EuiProgress, EuiButtonGroup } from '@elastic/eui'; import { ThemeProvider } from 'styled-components'; import euiDarkVars from '@elastic/eui/dist/eui_theme_light.json'; -import { StepAboutRuleToggleDetails } from './'; -import { mockAboutStepRule } from '../../all/__mocks__/mock'; -import { HeaderSection } from '../../../../../components/header_section'; -import { StepAboutRule } from '../step_about_rule/'; -import { AboutStepRule } from '../../types'; +import { StepAboutRuleToggleDetails } from '.'; +import { mockAboutStepRule } from '../../../pages/detection_engine/rules/all/__mocks__/mock'; +import { HeaderSection } from '../../../../common/components/header_section'; +import { StepAboutRule } from '../step_about_rule'; +import { AboutStepRule } from '../../../pages/detection_engine/rules/types'; -jest.mock('../../../../../lib/kibana'); +jest.mock('../../../../common/lib/kibana'); const theme = () => ({ eui: euiDarkVars, darkMode: true }); diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_about_rule_details/index.tsx b/x-pack/plugins/siem/public/alerts/components/rules/step_about_rule_details/index.tsx similarity index 93% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_about_rule_details/index.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/step_about_rule_details/index.tsx index 5d9803214fa0a..2163ea80f673a 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_about_rule_details/index.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/step_about_rule_details/index.tsx @@ -19,11 +19,11 @@ import React, { memo, useCallback, useState } from 'react'; import styled from 'styled-components'; import { isEmpty } from 'lodash/fp'; -import { HeaderSection } from '../../../../../components/header_section'; -import { Markdown } from '../../../../../components/markdown'; -import { AboutStepRule, AboutStepRuleDetails } from '../../types'; +import { HeaderSection } from '../../../../common/components/header_section'; +import { Markdown } from '../../../../common/components/markdown'; +import { AboutStepRule, AboutStepRuleDetails } from '../../../pages/detection_engine/rules/types'; import * as i18n from './translations'; -import { StepAboutRule } from '../step_about_rule/'; +import { StepAboutRule } from '../step_about_rule'; const MyPanel = styled(EuiPanel)` position: relative; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_about_rule_details/translations.ts b/x-pack/plugins/siem/public/alerts/components/rules/step_about_rule_details/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_about_rule_details/translations.ts rename to x-pack/plugins/siem/public/alerts/components/rules/step_about_rule_details/translations.ts diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_content_wrapper/index.test.tsx b/x-pack/plugins/siem/public/alerts/components/rules/step_content_wrapper/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_content_wrapper/index.test.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/step_content_wrapper/index.test.tsx diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_content_wrapper/index.tsx b/x-pack/plugins/siem/public/alerts/components/rules/step_content_wrapper/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_content_wrapper/index.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/step_content_wrapper/index.tsx diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_define_rule/index.test.tsx b/x-pack/plugins/siem/public/alerts/components/rules/step_define_rule/index.test.tsx similarity index 93% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_define_rule/index.test.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/step_define_rule/index.test.tsx index ebef6348d477e..6831548992ff1 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_define_rule/index.test.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/step_define_rule/index.test.tsx @@ -9,7 +9,7 @@ import { shallow } from 'enzyme'; import { StepDefineRule } from './index'; -jest.mock('../../../../../lib/kibana'); +jest.mock('../../../../common/lib/kibana'); describe('StepDefineRule', () => { it('renders correctly', () => { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_define_rule/index.tsx b/x-pack/plugins/siem/public/alerts/components/rules/step_define_rule/index.tsx similarity index 89% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_define_rule/index.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/step_define_rule/index.tsx index 3517c6fb21e69..119f851ecdfe4 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_define_rule/index.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/step_define_rule/index.tsx @@ -9,15 +9,24 @@ import React, { FC, memo, useCallback, useState, useEffect } from 'react'; import styled from 'styled-components'; import deepEqual from 'fast-deep-equal'; -import { DEFAULT_INDEX_KEY } from '../../../../../../common/constants'; -import { isMlRule } from '../../../../../../common/machine_learning/helpers'; -import { IIndexPattern } from '../../../../../../../../../src/plugins/data/public'; -import { useFetchIndexPatterns } from '../../../../../containers/detection_engine/rules'; -import { DEFAULT_TIMELINE_TITLE } from '../../../../../components/timeline/translations'; -import { useMlCapabilities } from '../../../../../components/ml_popover/hooks/use_ml_capabilities'; -import { useUiSetting$ } from '../../../../../lib/kibana'; -import { setFieldValue } from '../../helpers'; -import { DefineStepRule, RuleStep, RuleStepProps } from '../../types'; +import { DEFAULT_INDEX_KEY } from '../../../../../common/constants'; +import { isMlRule } from '../../../../../common/machine_learning/helpers'; +import { hasMlAdminPermissions } from '../../../../../common/machine_learning/has_ml_admin_permissions'; +import { IIndexPattern } from '../../../../../../../../src/plugins/data/public'; +import { useFetchIndexPatterns } from '../../../../alerts/containers/detection_engine/rules'; +import { DEFAULT_TIMELINE_TITLE } from '../../../../timelines/components/timeline/translations'; +import { useMlCapabilities } from '../../../../common/components/ml_popover/hooks/use_ml_capabilities'; +import { useUiSetting$ } from '../../../../common/lib/kibana'; +import { setFieldValue } from '../../../pages/detection_engine/rules/helpers'; +import { + filterRuleFieldsForType, + RuleFields, +} from '../../../pages/detection_engine/rules/create/helpers'; +import { + DefineStepRule, + RuleStep, + RuleStepProps, +} from '../../../pages/detection_engine/rules/types'; import { StepRuleDescription } from '../description_step'; import { QueryBarDefineRule } from '../query_bar'; import { SelectRuleType } from '../select_rule_type'; @@ -34,11 +43,9 @@ import { UseField, useForm, FormSchema, -} from '../../../../../shared_imports'; +} from '../../../../shared_imports'; import { schema } from './schema'; import * as i18n from './translations'; -import { filterRuleFieldsForType, RuleFields } from '../../create/helpers'; -import { hasMlAdminPermissions } from '../../../../../../common/machine_learning/has_ml_admin_permissions'; const CommonUseField = getUseField({ component: Field }); diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_define_rule/schema.tsx b/x-pack/plugins/siem/public/alerts/components/rules/step_define_rule/schema.tsx similarity index 96% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_define_rule/schema.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/step_define_rule/schema.tsx index 08832c5dfe4f5..babfebb2c6ca7 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_define_rule/schema.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/step_define_rule/schema.tsx @@ -9,8 +9,8 @@ import { EuiText } from '@elastic/eui'; import { isEmpty } from 'lodash/fp'; import React from 'react'; -import { isMlRule } from '../../../../../../common/machine_learning/helpers'; -import { esKuery } from '../../../../../../../../../src/plugins/data/public'; +import { isMlRule } from '../../../../../common/machine_learning/helpers'; +import { esKuery } from '../../../../../../../../src/plugins/data/public'; import { FieldValueQueryBar } from '../query_bar'; import { ERROR_CODE, @@ -18,7 +18,7 @@ import { fieldValidators, FormSchema, ValidationFunc, -} from '../../../../../shared_imports'; +} from '../../../../shared_imports'; import { CUSTOM_QUERY_REQUIRED, INVALID_CUSTOM_QUERY, INDEX_HELPER_TEXT } from './translations'; export const schema: FormSchema = { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_define_rule/translations.tsx b/x-pack/plugins/siem/public/alerts/components/rules/step_define_rule/translations.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_define_rule/translations.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/step_define_rule/translations.tsx diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_define_rule/types.ts b/x-pack/plugins/siem/public/alerts/components/rules/step_define_rule/types.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_define_rule/types.ts rename to x-pack/plugins/siem/public/alerts/components/rules/step_define_rule/types.ts diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_panel/index.test.tsx b/x-pack/plugins/siem/public/alerts/components/rules/step_panel/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_panel/index.test.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/step_panel/index.test.tsx diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_panel/index.tsx b/x-pack/plugins/siem/public/alerts/components/rules/step_panel/index.tsx similarity index 91% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_panel/index.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/step_panel/index.tsx index 1923ed09252dd..ef8cfc99a3b11 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_panel/index.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/step_panel/index.tsx @@ -8,7 +8,7 @@ import { EuiPanel, EuiProgress } from '@elastic/eui'; import React, { memo } from 'react'; import styled from 'styled-components'; -import { HeaderSection } from '../../../../../components/header_section'; +import { HeaderSection } from '../../../../common/components/header_section'; interface StepPanelProps { children: React.ReactNode; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_rule_actions/index.test.tsx b/x-pack/plugins/siem/public/alerts/components/rules/step_rule_actions/index.test.tsx similarity index 93% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_rule_actions/index.test.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/step_rule_actions/index.test.tsx index 69d118ba9f28e..712aacd3e3e82 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_rule_actions/index.test.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/step_rule_actions/index.test.tsx @@ -9,7 +9,7 @@ import { shallow } from 'enzyme'; import { StepRuleActions } from './index'; -jest.mock('../../../../../lib/kibana'); +jest.mock('../../../../common/lib/kibana'); describe('StepRuleActions', () => { it('renders correctly', () => { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_rule_actions/index.tsx b/x-pack/plugins/siem/public/alerts/components/rules/step_rule_actions/index.tsx similarity index 94% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_rule_actions/index.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/step_rule_actions/index.tsx index aec315938b6ae..2d22f0a3437f1 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_rule_actions/index.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/step_rule_actions/index.tsx @@ -8,14 +8,18 @@ import { EuiHorizontalRule, EuiFlexGroup, EuiFlexItem, EuiButton, EuiSpacer } fr import React, { FC, memo, useCallback, useEffect, useMemo, useState } from 'react'; import deepEqual from 'fast-deep-equal'; -import { setFieldValue } from '../../helpers'; -import { RuleStep, RuleStepProps, ActionsStepRule } from '../../types'; +import { setFieldValue } from '../../../pages/detection_engine/rules/helpers'; +import { + RuleStep, + RuleStepProps, + ActionsStepRule, +} from '../../../pages/detection_engine/rules/types'; import { StepRuleDescription } from '../description_step'; -import { Form, UseField, useForm } from '../../../../../shared_imports'; +import { Form, UseField, useForm } from '../../../../shared_imports'; import { StepContentWrapper } from '../step_content_wrapper'; import { ThrottleSelectField, THROTTLE_OPTIONS } from '../throttle_select_field'; import { RuleActionsField } from '../rule_actions_field'; -import { useKibana } from '../../../../../lib/kibana'; +import { useKibana } from '../../../../common/lib/kibana'; import { schema } from './schema'; import * as I18n from './translations'; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_rule_actions/schema.tsx b/x-pack/plugins/siem/public/alerts/components/rules/step_rule_actions/schema.tsx similarity index 93% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_rule_actions/schema.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/step_rule_actions/schema.tsx index 1b27d0e0fcc0e..a978e038985f6 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_rule_actions/schema.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/step_rule_actions/schema.tsx @@ -8,7 +8,7 @@ import { i18n } from '@kbn/i18n'; -import { FormSchema } from '../../../../../shared_imports'; +import { FormSchema } from '../../../../shared_imports'; export const schema: FormSchema = { actions: {}, diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_rule_actions/translations.tsx b/x-pack/plugins/siem/public/alerts/components/rules/step_rule_actions/translations.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_rule_actions/translations.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/step_rule_actions/translations.tsx diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_schedule_rule/index.test.tsx b/x-pack/plugins/siem/public/alerts/components/rules/step_schedule_rule/index.test.tsx similarity index 93% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_schedule_rule/index.test.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/step_schedule_rule/index.test.tsx index 98de933590d60..6f5eddfe051a1 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_schedule_rule/index.test.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/step_schedule_rule/index.test.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { shallow, mount } from 'enzyme'; -import { TestProviders } from '../../../../../mock'; +import { TestProviders } from '../../../../common/mock'; import { StepScheduleRule } from './index'; describe('StepScheduleRule', () => { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_schedule_rule/index.tsx b/x-pack/plugins/siem/public/alerts/components/rules/step_schedule_rule/index.tsx similarity index 93% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_schedule_rule/index.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/step_schedule_rule/index.tsx index de9abcefdea2e..fa49637a0c830 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_schedule_rule/index.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/step_schedule_rule/index.tsx @@ -8,11 +8,15 @@ import React, { FC, memo, useCallback, useEffect, useState } from 'react'; import deepEqual from 'fast-deep-equal'; import styled from 'styled-components'; -import { setFieldValue } from '../../helpers'; -import { RuleStep, RuleStepProps, ScheduleStepRule } from '../../types'; +import { setFieldValue } from '../../../pages/detection_engine/rules/helpers'; +import { + RuleStep, + RuleStepProps, + ScheduleStepRule, +} from '../../../pages/detection_engine/rules/types'; import { StepRuleDescription } from '../description_step'; import { ScheduleItem } from '../schedule_item_form'; -import { Form, UseField, useForm } from '../../../../../shared_imports'; +import { Form, UseField, useForm } from '../../../../shared_imports'; import { StepContentWrapper } from '../step_content_wrapper'; import { NextStep } from '../next_step'; import { schema } from './schema'; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_schedule_rule/schema.tsx b/x-pack/plugins/siem/public/alerts/components/rules/step_schedule_rule/schema.tsx similarity index 95% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_schedule_rule/schema.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/step_schedule_rule/schema.tsx index e79aec2be6e15..99ff8a6727372 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_schedule_rule/schema.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/step_schedule_rule/schema.tsx @@ -9,7 +9,7 @@ import { i18n } from '@kbn/i18n'; import { OptionalFieldLabel } from '../optional_field_label'; -import { FormSchema } from '../../../../../shared_imports'; +import { FormSchema } from '../../../../shared_imports'; export const schema: FormSchema = { interval: { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_schedule_rule/translations.tsx b/x-pack/plugins/siem/public/alerts/components/rules/step_schedule_rule/translations.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/step_schedule_rule/translations.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/step_schedule_rule/translations.tsx diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/throttle_select_field/index.test.tsx b/x-pack/plugins/siem/public/alerts/components/rules/throttle_select_field/index.test.tsx similarity index 92% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/throttle_select_field/index.test.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/throttle_select_field/index.test.tsx index 0ab19b671494e..2a13c40a0dd17 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/throttle_select_field/index.test.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/throttle_select_field/index.test.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { shallow } from 'enzyme'; import { ThrottleSelectField } from './index'; -import { useFormFieldMock } from '../../../../../mock'; +import { useFormFieldMock } from '../../../../common/mock'; describe('ThrottleSelectField', () => { it('renders correctly', () => { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/throttle_select_field/index.tsx b/x-pack/plugins/siem/public/alerts/components/rules/throttle_select_field/index.tsx similarity index 91% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/components/throttle_select_field/index.tsx rename to x-pack/plugins/siem/public/alerts/components/rules/throttle_select_field/index.tsx index 0cf15c41a0f91..281c45b19ece5 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/components/throttle_select_field/index.tsx +++ b/x-pack/plugins/siem/public/alerts/components/rules/throttle_select_field/index.tsx @@ -9,8 +9,8 @@ import React, { useCallback } from 'react'; import { NOTIFICATION_THROTTLE_RULE, NOTIFICATION_THROTTLE_NO_ACTIONS, -} from '../../../../../../common/constants'; -import { SelectField } from '../../../../../shared_imports'; +} from '../../../../../common/constants'; +import { SelectField } from '../../../../shared_imports'; export const THROTTLE_OPTIONS = [ { value: NOTIFICATION_THROTTLE_NO_ACTIONS, text: 'Perform no actions' }, diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/signals/actions.test.tsx b/x-pack/plugins/siem/public/alerts/components/signals/actions.test.tsx similarity index 98% rename from x-pack/plugins/siem/public/pages/detection_engine/components/signals/actions.test.tsx rename to x-pack/plugins/siem/public/alerts/components/signals/actions.test.tsx index ab75fcb6d6d1f..d3be87ce7c39c 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/components/signals/actions.test.tsx +++ b/x-pack/plugins/siem/public/alerts/components/signals/actions.test.tsx @@ -12,10 +12,10 @@ import { defaultTimelineProps, apolloClient, mockTimelineApolloResult, -} from '../../../../mock/'; +} from '../../../common/mock/'; import { CreateTimeline, UpdateTimelineLoading } from './types'; -import { Ecs } from '../../../../graphql/types'; -import { TimelineType } from '../../../../../common/types/timeline'; +import { Ecs } from '../../../graphql/types'; +import { TimelineType } from '../../../../common/types/timeline'; jest.mock('apollo-client'); diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/signals/actions.tsx b/x-pack/plugins/siem/public/alerts/components/signals/actions.tsx similarity index 93% rename from x-pack/plugins/siem/public/pages/detection_engine/components/signals/actions.tsx rename to x-pack/plugins/siem/public/alerts/components/signals/actions.tsx index c71ede32d8403..044633da62f61 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/components/signals/actions.tsx +++ b/x-pack/plugins/siem/public/alerts/components/signals/actions.tsx @@ -8,16 +8,16 @@ import dateMath from '@elastic/datemath'; import { getOr, isEmpty } from 'lodash/fp'; import moment from 'moment'; -import { updateSignalStatus } from '../../../../containers/detection_engine/signals/api'; +import { updateSignalStatus } from '../../containers/detection_engine/signals/api'; import { SendSignalToTimelineActionProps, UpdateSignalStatusActionProps } from './types'; -import { TimelineNonEcsData, GetOneTimeline, TimelineResult, Ecs } from '../../../../graphql/types'; -import { oneTimelineQuery } from '../../../../containers/timeline/one/index.gql_query'; +import { TimelineNonEcsData, GetOneTimeline, TimelineResult, Ecs } from '../../../graphql/types'; +import { oneTimelineQuery } from '../../../timelines/containers/one/index.gql_query'; +import { timelineDefaults } from '../../../timelines/store/timeline/defaults'; import { omitTypenameInTimeline, formatTimelineResultToModel, -} from '../../../../components/open_timeline/helpers'; -import { convertKueryToElasticSearchQuery } from '../../../../lib/keury'; -import { timelineDefaults } from '../../../../store/timeline/defaults'; +} from '../../../timelines/components/open_timeline/helpers'; +import { convertKueryToElasticSearchQuery } from '../../../common/lib/keury'; import { replaceTemplateFieldFromQuery, replaceTemplateFieldFromMatchFilters, diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/signals/default_config.test.tsx b/x-pack/plugins/siem/public/alerts/components/signals/default_config.test.tsx similarity index 96% rename from x-pack/plugins/siem/public/pages/detection_engine/components/signals/default_config.test.tsx rename to x-pack/plugins/siem/public/alerts/components/signals/default_config.test.tsx index 5428b9932fbde..71da68108da7e 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/components/signals/default_config.test.tsx +++ b/x-pack/plugins/siem/public/alerts/components/signals/default_config.test.tsx @@ -7,8 +7,8 @@ import React from 'react'; import { mount, ReactWrapper } from 'enzyme'; import { EuiButtonIcon, EuiToolTip } from '@elastic/eui'; -import { Filter } from '../../../../../../../../src/plugins/data/common/es_query'; -import { TimelineAction } from '../../../../components/timeline/body/actions'; +import { Filter } from '../../../../../../../src/plugins/data/common/es_query'; +import { TimelineAction } from '../../../timelines/components/timeline/body/actions'; import { buildSignalsRuleIdFilter, getSignalsActions } from './default_config'; import { CreateTimeline, @@ -16,7 +16,7 @@ import { SetEventsLoadingProps, UpdateTimelineLoading, } from './types'; -import { mockEcsDataWithSignal } from '../../../../mock/mock_ecs'; +import { mockEcsDataWithSignal } from '../../../common/mock/mock_ecs'; import { sendSignalToTimelineAction, updateSignalStatusAction } from './actions'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/signals/default_config.tsx b/x-pack/plugins/siem/public/alerts/components/signals/default_config.tsx similarity index 92% rename from x-pack/plugins/siem/public/pages/detection_engine/components/signals/default_config.tsx rename to x-pack/plugins/siem/public/alerts/components/signals/default_config.tsx index 81b643b7894df..05e0baba66d0a 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/components/signals/default_config.tsx +++ b/x-pack/plugins/siem/public/alerts/components/signals/default_config.tsx @@ -10,15 +10,18 @@ import { EuiButtonIcon, EuiToolTip } from '@elastic/eui'; import ApolloClient from 'apollo-client'; import React from 'react'; -import { Filter } from '../../../../../../../../src/plugins/data/common/es_query'; -import { TimelineAction, TimelineActionProps } from '../../../../components/timeline/body/actions'; -import { defaultColumnHeaderType } from '../../../../components/timeline/body/column_headers/default_headers'; +import { Filter } from '../../../../../../../src/plugins/data/common/es_query'; +import { + TimelineAction, + TimelineActionProps, +} from '../../../timelines/components/timeline/body/actions'; +import { defaultColumnHeaderType } from '../../../timelines/components/timeline/body/column_headers/default_headers'; import { DEFAULT_COLUMN_MIN_WIDTH, DEFAULT_DATE_COLUMN_MIN_WIDTH, -} from '../../../../components/timeline/body/constants'; -import { ColumnHeaderOptions, SubsetTimelineModel } from '../../../../store/timeline/model'; -import { timelineDefaults } from '../../../../store/timeline/defaults'; +} from '../../../timelines/components/timeline/body/constants'; +import { ColumnHeaderOptions, SubsetTimelineModel } from '../../../timelines/store/timeline/model'; +import { timelineDefaults } from '../../../timelines/store/timeline/defaults'; import { FILTER_OPEN } from './signals_filter_group'; import { sendSignalToTimelineAction, updateSignalStatusAction } from './actions'; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/signals/helpers.test.ts b/x-pack/plugins/siem/public/alerts/components/signals/helpers.test.ts similarity index 96% rename from x-pack/plugins/siem/public/pages/detection_engine/components/signals/helpers.test.ts rename to x-pack/plugins/siem/public/alerts/components/signals/helpers.test.ts index a948d2b940b0c..ad4f5cf8b4aa8 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/components/signals/helpers.test.ts +++ b/x-pack/plugins/siem/public/alerts/components/signals/helpers.test.ts @@ -3,6 +3,12 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ +import { cloneDeep } from 'lodash/fp'; + +import { mockEcsData } from '../../../common/mock/mock_ecs'; +import { Filter } from '../../../../../../../src/plugins/data/public'; +import { DataProvider } from '../../../timelines/components/timeline/data_providers/data_provider'; +import { mockDataProviders } from '../../../timelines/components/timeline/data_providers/mock/mock_data_providers'; import { getStringArray, @@ -10,11 +16,6 @@ import { replaceTemplateFieldFromMatchFilters, reformatDataProviderWithNewValue, } from './helpers'; -import { mockEcsData } from '../../../../mock/mock_ecs'; -import { Filter } from '../../../../../../../../src/plugins/data/public'; -import { DataProvider } from '../../../../components/timeline/data_providers/data_provider'; -import { mockDataProviders } from '../../../../components/timeline/data_providers/mock/mock_data_providers'; -import { cloneDeep } from 'lodash/fp'; describe('helpers', () => { let mockEcsDataClone = cloneDeep(mockEcsData); diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/signals/helpers.ts b/x-pack/plugins/siem/public/alerts/components/signals/helpers.ts similarity index 97% rename from x-pack/plugins/siem/public/pages/detection_engine/components/signals/helpers.ts rename to x-pack/plugins/siem/public/alerts/components/signals/helpers.ts index 3fa2da37046b0..5099d61254caa 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/components/signals/helpers.ts +++ b/x-pack/plugins/siem/public/alerts/components/signals/helpers.ts @@ -5,12 +5,12 @@ */ import { get, isEmpty } from 'lodash/fp'; -import { Filter, esKuery, KueryNode } from '../../../../../../../../src/plugins/data/public'; +import { Filter, esKuery, KueryNode } from '../../../../../../../src/plugins/data/public'; import { DataProvider, DataProvidersAnd, -} from '../../../../components/timeline/data_providers/data_provider'; -import { Ecs } from '../../../../graphql/types'; +} from '../../../timelines/components/timeline/data_providers/data_provider'; +import { Ecs } from '../../../graphql/types'; interface FindValueToChangeInQuery { field: string; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/signals/index.test.tsx b/x-pack/plugins/siem/public/alerts/components/signals/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/components/signals/index.test.tsx rename to x-pack/plugins/siem/public/alerts/components/signals/index.test.tsx diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/signals/index.tsx b/x-pack/plugins/siem/public/alerts/components/signals/index.tsx similarity index 92% rename from x-pack/plugins/siem/public/pages/detection_engine/components/signals/index.tsx rename to x-pack/plugins/siem/public/alerts/components/signals/index.tsx index 5442c8c19b5a7..eb19cfea97324 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/components/signals/index.tsx +++ b/x-pack/plugins/siem/public/alerts/components/signals/index.tsx @@ -10,17 +10,17 @@ import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { connect, ConnectedProps } from 'react-redux'; import { Dispatch } from 'redux'; -import { Filter, esQuery } from '../../../../../../../../src/plugins/data/public'; -import { useFetchIndexPatterns } from '../../../../containers/detection_engine/rules/fetch_index_patterns'; -import { StatefulEventsViewer } from '../../../../components/events_viewer'; -import { HeaderSection } from '../../../../components/header_section'; -import { combineQueries } from '../../../../components/timeline/helpers'; -import { useKibana } from '../../../../lib/kibana'; -import { inputsSelectors, State, inputsModel } from '../../../../store'; -import { timelineActions, timelineSelectors } from '../../../../store/timeline'; -import { TimelineModel } from '../../../../store/timeline/model'; -import { timelineDefaults } from '../../../../store/timeline/defaults'; -import { useApolloClient } from '../../../../utils/apollo_context'; +import { Filter, esQuery } from '../../../../../../../src/plugins/data/public'; +import { useFetchIndexPatterns } from '../../../alerts/containers/detection_engine/rules/fetch_index_patterns'; +import { StatefulEventsViewer } from '../../../common/components/events_viewer'; +import { HeaderSection } from '../../../common/components/header_section'; +import { combineQueries } from '../../../timelines/components/timeline/helpers'; +import { useKibana } from '../../../common/lib/kibana'; +import { inputsSelectors, State, inputsModel } from '../../../common/store'; +import { timelineActions, timelineSelectors } from '../../../timelines/store/timeline'; +import { TimelineModel } from '../../../timelines/store/timeline/model'; +import { timelineDefaults } from '../../../timelines/store/timeline/defaults'; +import { useApolloClient } from '../../../common/utils/apollo_context'; import { updateSignalStatusAction } from './actions'; import { @@ -45,7 +45,7 @@ import { UpdateSignalsStatusCallback, UpdateSignalsStatusProps, } from './types'; -import { dispatchUpdateTimeline } from '../../../../components/open_timeline/helpers'; +import { dispatchUpdateTimeline } from '../../../timelines/components/open_timeline/helpers'; export const SIGNALS_PAGE_TIMELINE_ID = 'signals-page'; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/signals/signals_filter_group/index.test.tsx b/x-pack/plugins/siem/public/alerts/components/signals/signals_filter_group/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/components/signals/signals_filter_group/index.test.tsx rename to x-pack/plugins/siem/public/alerts/components/signals/signals_filter_group/index.test.tsx diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/signals/signals_filter_group/index.tsx b/x-pack/plugins/siem/public/alerts/components/signals/signals_filter_group/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/components/signals/signals_filter_group/index.tsx rename to x-pack/plugins/siem/public/alerts/components/signals/signals_filter_group/index.tsx diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/signals/signals_utility_bar/index.test.tsx b/x-pack/plugins/siem/public/alerts/components/signals/signals_utility_bar/index.test.tsx similarity index 95% rename from x-pack/plugins/siem/public/pages/detection_engine/components/signals/signals_utility_bar/index.test.tsx rename to x-pack/plugins/siem/public/alerts/components/signals/signals_utility_bar/index.test.tsx index 6cab43b5285b5..3b43185c2c16b 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/components/signals/signals_utility_bar/index.test.tsx +++ b/x-pack/plugins/siem/public/alerts/components/signals/signals_utility_bar/index.test.tsx @@ -9,7 +9,7 @@ import { shallow } from 'enzyme'; import { SignalsUtilityBar } from './index'; -jest.mock('../../../../../lib/kibana'); +jest.mock('../../../../common/lib/kibana'); describe('SignalsUtilityBar', () => { it('renders correctly', () => { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/signals/signals_utility_bar/index.tsx b/x-pack/plugins/siem/public/alerts/components/signals/signals_utility_bar/index.tsx similarity index 94% rename from x-pack/plugins/siem/public/pages/detection_engine/components/signals/signals_utility_bar/index.tsx rename to x-pack/plugins/siem/public/alerts/components/signals/signals_utility_bar/index.tsx index b9268716f85f0..e23f4ebdd3d30 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/components/signals/signals_utility_bar/index.tsx +++ b/x-pack/plugins/siem/public/alerts/components/signals/signals_utility_bar/index.tsx @@ -8,17 +8,17 @@ import { isEmpty } from 'lodash/fp'; import React, { useCallback } from 'react'; import numeral from '@elastic/numeral'; -import { DEFAULT_NUMBER_FORMAT } from '../../../../../../common/constants'; +import { DEFAULT_NUMBER_FORMAT } from '../../../../../common/constants'; import { UtilityBar, UtilityBarAction, UtilityBarGroup, UtilityBarSection, UtilityBarText, -} from '../../../../../components/utility_bar'; +} from '../../../../common/components/utility_bar'; import * as i18n from './translations'; -import { useUiSetting$ } from '../../../../../lib/kibana'; -import { TimelineNonEcsData } from '../../../../../graphql/types'; +import { useUiSetting$ } from '../../../../common/lib/kibana'; +import { TimelineNonEcsData } from '../../../../graphql/types'; import { UpdateSignalsStatus } from '../types'; import { FILTER_CLOSED, FILTER_OPEN } from '../signals_filter_group'; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/signals/signals_utility_bar/translations.ts b/x-pack/plugins/siem/public/alerts/components/signals/signals_utility_bar/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/components/signals/signals_utility_bar/translations.ts rename to x-pack/plugins/siem/public/alerts/components/signals/signals_utility_bar/translations.ts diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/signals/translations.ts b/x-pack/plugins/siem/public/alerts/components/signals/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/components/signals/translations.ts rename to x-pack/plugins/siem/public/alerts/components/signals/translations.ts diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/signals/types.ts b/x-pack/plugins/siem/public/alerts/components/signals/types.ts similarity index 90% rename from x-pack/plugins/siem/public/pages/detection_engine/components/signals/types.ts rename to x-pack/plugins/siem/public/alerts/components/signals/types.ts index 909b217646746..b3c770415ed57 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/components/signals/types.ts +++ b/x-pack/plugins/siem/public/alerts/components/signals/types.ts @@ -6,9 +6,9 @@ import ApolloClient from 'apollo-client'; -import { Ecs } from '../../../../graphql/types'; -import { TimelineModel } from '../../../../store/timeline/model'; -import { inputsModel } from '../../../../store'; +import { Ecs } from '../../../graphql/types'; +import { TimelineModel } from '../../../timelines/store/timeline/model'; +import { inputsModel } from '../../../common/store'; export interface SetEventsLoadingProps { eventIds: string[]; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/config.ts b/x-pack/plugins/siem/public/alerts/components/signals_histogram_panel/config.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/config.ts rename to x-pack/plugins/siem/public/alerts/components/signals_histogram_panel/config.ts diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/helpers.test.tsx b/x-pack/plugins/siem/public/alerts/components/signals_histogram_panel/helpers.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/helpers.test.tsx rename to x-pack/plugins/siem/public/alerts/components/signals_histogram_panel/helpers.test.tsx diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/helpers.tsx b/x-pack/plugins/siem/public/alerts/components/signals_histogram_panel/helpers.tsx similarity index 94% rename from x-pack/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/helpers.tsx rename to x-pack/plugins/siem/public/alerts/components/signals_histogram_panel/helpers.tsx index 24b12cae62d85..0c9fa39e53d00 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/helpers.tsx +++ b/x-pack/plugins/siem/public/alerts/components/signals_histogram_panel/helpers.tsx @@ -4,9 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ -import { showAllOthersBucket } from '../../../../../common/constants'; +import { showAllOthersBucket } from '../../../../common/constants'; import { HistogramData, SignalsAggregation, SignalsBucket, SignalsGroupBucket } from './types'; -import { SignalSearchResponse } from '../../../../containers/detection_engine/signals/types'; +import { SignalSearchResponse } from '../../containers/detection_engine/signals/types'; import * as i18n from './translations'; export const formatSignalsData = ( diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/index.test.tsx b/x-pack/plugins/siem/public/alerts/components/signals_histogram_panel/index.test.tsx similarity index 86% rename from x-pack/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/index.test.tsx rename to x-pack/plugins/siem/public/alerts/components/signals_histogram_panel/index.test.tsx index 6921c49d8a8b4..6578af19094df 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/index.test.tsx +++ b/x-pack/plugins/siem/public/alerts/components/signals_histogram_panel/index.test.tsx @@ -9,8 +9,8 @@ import { shallow } from 'enzyme'; import { SignalsHistogramPanel } from './index'; -jest.mock('../../../../lib/kibana'); -jest.mock('../../../../components/navigation/use_get_url_search'); +jest.mock('../../../common/lib/kibana'); +jest.mock('../../../common/components/navigation/use_get_url_search'); describe('SignalsHistogramPanel', () => { it('renders correctly', () => { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/index.tsx b/x-pack/plugins/siem/public/alerts/components/signals_histogram_panel/index.tsx similarity index 87% rename from x-pack/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/index.tsx rename to x-pack/plugins/siem/public/alerts/components/signals_histogram_panel/index.tsx index 9b336766b1724..0a1ce5a39af89 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/index.tsx +++ b/x-pack/plugins/siem/public/alerts/components/signals_histogram_panel/index.tsx @@ -11,21 +11,21 @@ import styled from 'styled-components'; import { isEmpty } from 'lodash/fp'; import uuid from 'uuid'; -import { DEFAULT_NUMBER_FORMAT } from '../../../../../common/constants'; -import { UpdateDateRange } from '../../../../components/charts/common'; -import { LegendItem } from '../../../../components/charts/draggable_legend_item'; -import { escapeDataProviderId } from '../../../../components/drag_and_drop/helpers'; -import { HeaderSection } from '../../../../components/header_section'; -import { Filter, esQuery, Query } from '../../../../../../../../src/plugins/data/public'; -import { useQuerySignals } from '../../../../containers/detection_engine/signals/use_query'; -import { getDetectionEngineUrl } from '../../../../components/link_to'; -import { defaultLegendColors } from '../../../../components/matrix_histogram/utils'; -import { InspectButtonContainer } from '../../../../components/inspect'; -import { useGetUrlSearch } from '../../../../components/navigation/use_get_url_search'; -import { MatrixLoader } from '../../../../components/matrix_histogram/matrix_loader'; -import { MatrixHistogramOption } from '../../../../components/matrix_histogram/types'; -import { useKibana, useUiSetting$ } from '../../../../lib/kibana'; -import { navTabs } from '../../../home/home_navigations'; +import { DEFAULT_NUMBER_FORMAT } from '../../../../common/constants'; +import { UpdateDateRange } from '../../../common/components/charts/common'; +import { LegendItem } from '../../../common/components/charts/draggable_legend_item'; +import { escapeDataProviderId } from '../../../common/components/drag_and_drop/helpers'; +import { HeaderSection } from '../../../common/components/header_section'; +import { Filter, esQuery, Query } from '../../../../../../../src/plugins/data/public'; +import { useQuerySignals } from '../../containers/detection_engine/signals/use_query'; +import { getDetectionEngineUrl } from '../../../common/components/link_to'; +import { defaultLegendColors } from '../../../common/components/matrix_histogram/utils'; +import { InspectButtonContainer } from '../../../common/components/inspect'; +import { useGetUrlSearch } from '../../../common/components/navigation/use_get_url_search'; +import { MatrixLoader } from '../../../common/components/matrix_histogram/matrix_loader'; +import { MatrixHistogramOption } from '../../../common/components/matrix_histogram/types'; +import { useKibana, useUiSetting$ } from '../../../common/lib/kibana'; +import { navTabs } from '../../../app/home/home_navigations'; import { signalsHistogramOptions } from './config'; import { formatSignalsData, getSignalsHistogramQuery, showInitialLoadingSpinner } from './helpers'; import { SignalsHistogram } from './signals_histogram'; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/signals_histogram.test.tsx b/x-pack/plugins/siem/public/alerts/components/signals_histogram_panel/signals_histogram.test.tsx similarity index 94% rename from x-pack/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/signals_histogram.test.tsx rename to x-pack/plugins/siem/public/alerts/components/signals_histogram_panel/signals_histogram.test.tsx index 6a116efb8f2f8..f921c00cdafb7 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/signals_histogram.test.tsx +++ b/x-pack/plugins/siem/public/alerts/components/signals_histogram_panel/signals_histogram.test.tsx @@ -9,7 +9,7 @@ import { shallow } from 'enzyme'; import { SignalsHistogram } from './signals_histogram'; -jest.mock('../../../../lib/kibana'); +jest.mock('../../../common/lib/kibana'); describe('SignalsHistogram', () => { it('renders correctly', () => { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/signals_histogram.tsx b/x-pack/plugins/siem/public/alerts/components/signals_histogram_panel/signals_histogram.tsx similarity index 89% rename from x-pack/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/signals_histogram.tsx rename to x-pack/plugins/siem/public/alerts/components/signals_histogram_panel/signals_histogram.tsx index a031f2542b877..3c6e7b84fd2b4 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/signals_histogram.tsx +++ b/x-pack/plugins/siem/public/alerts/components/signals_histogram_panel/signals_histogram.tsx @@ -15,10 +15,10 @@ import { import { EuiFlexGroup, EuiFlexItem, EuiProgress } from '@elastic/eui'; import React, { useMemo } from 'react'; -import { useTheme, UpdateDateRange } from '../../../../components/charts/common'; -import { histogramDateTimeFormatter } from '../../../../components/utils'; -import { DraggableLegend } from '../../../../components/charts/draggable_legend'; -import { LegendItem } from '../../../../components/charts/draggable_legend_item'; +import { useTheme, UpdateDateRange } from '../../../common/components/charts/common'; +import { histogramDateTimeFormatter } from '../../../common/components/utils'; +import { DraggableLegend } from '../../../common/components/charts/draggable_legend'; +import { LegendItem } from '../../../common/components/charts/draggable_legend_item'; import { HistogramData } from './types'; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/translations.ts b/x-pack/plugins/siem/public/alerts/components/signals_histogram_panel/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/translations.ts rename to x-pack/plugins/siem/public/alerts/components/signals_histogram_panel/translations.ts diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/types.ts b/x-pack/plugins/siem/public/alerts/components/signals_histogram_panel/types.ts similarity index 94% rename from x-pack/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/types.ts rename to x-pack/plugins/siem/public/alerts/components/signals_histogram_panel/types.ts index 6ef4cecc4ec8b..41d58a4a7391d 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/components/signals_histogram_panel/types.ts +++ b/x-pack/plugins/siem/public/alerts/components/signals_histogram_panel/types.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { inputsModel } from '../../../../store'; +import { inputsModel } from '../../../common/store'; export interface SignalsHistogramOption { text: string; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/signals_info/index.tsx b/x-pack/plugins/siem/public/alerts/components/signals_info/index.tsx similarity index 94% rename from x-pack/plugins/siem/public/pages/detection_engine/components/signals_info/index.tsx rename to x-pack/plugins/siem/public/alerts/components/signals_info/index.tsx index e7cdc3345c031..b1d7f2cfe7eb5 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/components/signals_info/index.tsx +++ b/x-pack/plugins/siem/public/alerts/components/signals_info/index.tsx @@ -8,7 +8,7 @@ import { EuiLoadingSpinner } from '@elastic/eui'; import { FormattedRelative } from '@kbn/i18n/react'; import React, { useState, useEffect } from 'react'; -import { useQuerySignals } from '../../../../containers/detection_engine/signals/use_query'; +import { useQuerySignals } from '../../containers/detection_engine/signals/use_query'; import { buildLastSignalsQuery } from './query.dsl'; import { Aggs } from './types'; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/signals_info/query.dsl.ts b/x-pack/plugins/siem/public/alerts/components/signals_info/query.dsl.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/components/signals_info/query.dsl.ts rename to x-pack/plugins/siem/public/alerts/components/signals_info/query.dsl.ts diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/signals_info/types.ts b/x-pack/plugins/siem/public/alerts/components/signals_info/types.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/components/signals_info/types.ts rename to x-pack/plugins/siem/public/alerts/components/signals_info/types.ts diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/user_info/index.test.tsx b/x-pack/plugins/siem/public/alerts/components/user_info/index.test.tsx similarity index 71% rename from x-pack/plugins/siem/public/pages/detection_engine/components/user_info/index.test.tsx rename to x-pack/plugins/siem/public/alerts/components/user_info/index.test.tsx index b3d710de5e94e..81b2c4347e17c 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/components/user_info/index.test.tsx +++ b/x-pack/plugins/siem/public/alerts/components/user_info/index.test.tsx @@ -7,12 +7,12 @@ import { renderHook } from '@testing-library/react-hooks'; import { useUserInfo } from './index'; -import { usePrivilegeUser } from '../../../../containers/detection_engine/signals/use_privilege_user'; -import { useSignalIndex } from '../../../../containers/detection_engine/signals/use_signal_index'; -import { useKibana } from '../../../../lib/kibana'; -jest.mock('../../../../containers/detection_engine/signals/use_privilege_user'); -jest.mock('../../../../containers/detection_engine/signals/use_signal_index'); -jest.mock('../../../../lib/kibana'); +import { usePrivilegeUser } from '../../containers/detection_engine/signals/use_privilege_user'; +import { useSignalIndex } from '../../containers/detection_engine/signals/use_signal_index'; +import { useKibana } from '../../../common/lib/kibana'; +jest.mock('../../containers/detection_engine/signals/use_privilege_user'); +jest.mock('../../containers/detection_engine/signals/use_signal_index'); +jest.mock('../../../common/lib/kibana'); describe('useUserInfo', () => { beforeAll(() => { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/components/user_info/index.tsx b/x-pack/plugins/siem/public/alerts/components/user_info/index.tsx similarity index 96% rename from x-pack/plugins/siem/public/pages/detection_engine/components/user_info/index.tsx rename to x-pack/plugins/siem/public/alerts/components/user_info/index.tsx index 9e45371fb6058..faf9016292559 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/components/user_info/index.tsx +++ b/x-pack/plugins/siem/public/alerts/components/user_info/index.tsx @@ -7,9 +7,9 @@ import { noop } from 'lodash/fp'; import React, { useEffect, useReducer, Dispatch, createContext, useContext } from 'react'; -import { usePrivilegeUser } from '../../../../containers/detection_engine/signals/use_privilege_user'; -import { useSignalIndex } from '../../../../containers/detection_engine/signals/use_signal_index'; -import { useKibana } from '../../../../lib/kibana'; +import { usePrivilegeUser } from '../../containers/detection_engine/signals/use_privilege_user'; +import { useSignalIndex } from '../../containers/detection_engine/signals/use_signal_index'; +import { useKibana } from '../../../common/lib/kibana'; export interface State { canUserCRUD: boolean | null; diff --git a/x-pack/plugins/siem/public/containers/detection_engine/rules/__mocks__/api.ts b/x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/__mocks__/api.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/detection_engine/rules/__mocks__/api.ts rename to x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/__mocks__/api.ts diff --git a/x-pack/plugins/siem/public/containers/detection_engine/rules/api.test.ts b/x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/api.test.ts similarity index 99% rename from x-pack/plugins/siem/public/containers/detection_engine/rules/api.test.ts rename to x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/api.test.ts index 9eb4acbdb6164..abba7c02cf875 100644 --- a/x-pack/plugins/siem/public/containers/detection_engine/rules/api.test.ts +++ b/x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/api.test.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { KibanaServices } from '../../../lib/kibana'; +import { KibanaServices } from '../../../../common/lib/kibana'; import { addRule, fetchRules, @@ -23,7 +23,7 @@ import { ruleMock, rulesMock } from './mock'; const abortCtrl = new AbortController(); const mockKibanaServices = KibanaServices.get as jest.Mock; -jest.mock('../../../lib/kibana'); +jest.mock('../../../../common/lib/kibana'); const fetchMock = jest.fn(); mockKibanaServices.mockReturnValue({ http: { fetch: fetchMock } }); diff --git a/x-pack/plugins/siem/public/containers/detection_engine/rules/api.ts b/x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/api.ts similarity index 98% rename from x-pack/plugins/siem/public/containers/detection_engine/rules/api.ts rename to x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/api.ts index c1fadf289ef4d..9ae29a740dd87 100644 --- a/x-pack/plugins/siem/public/containers/detection_engine/rules/api.ts +++ b/x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/api.ts @@ -10,7 +10,7 @@ import { DETECTION_ENGINE_RULES_STATUS_URL, DETECTION_ENGINE_PREPACKAGED_RULES_STATUS_URL, DETECTION_ENGINE_TAGS_URL, -} from '../../../../common/constants'; +} from '../../../../../common/constants'; import { AddRulesProps, DeleteRulesProps, @@ -29,7 +29,7 @@ import { PrePackagedRulesStatusResponse, BulkRuleResponse, } from './types'; -import { KibanaServices } from '../../../lib/kibana'; +import { KibanaServices } from '../../../../common/lib/kibana'; import * as i18n from '../../../pages/detection_engine/rules/translations'; /** diff --git a/x-pack/plugins/siem/public/containers/detection_engine/rules/fetch_index_patterns.test.tsx b/x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/fetch_index_patterns.test.tsx similarity index 98% rename from x-pack/plugins/siem/public/containers/detection_engine/rules/fetch_index_patterns.test.tsx rename to x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/fetch_index_patterns.test.tsx index 8c688fe5615f0..79d5886f8845f 100644 --- a/x-pack/plugins/siem/public/containers/detection_engine/rules/fetch_index_patterns.test.tsx +++ b/x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/fetch_index_patterns.test.tsx @@ -6,14 +6,14 @@ import { renderHook, act } from '@testing-library/react-hooks'; -import { DEFAULT_INDEX_PATTERN } from '../../../../common/constants'; -import { useApolloClient } from '../../../utils/apollo_context'; -import { mocksSource } from '../../source/mock'; +import { DEFAULT_INDEX_PATTERN } from '../../../../../common/constants'; +import { useApolloClient } from '../../../../common/utils/apollo_context'; +import { mocksSource } from '../../../../common/containers/source/mock'; import { useFetchIndexPatterns, Return } from './fetch_index_patterns'; const mockUseApolloClient = useApolloClient as jest.Mock; -jest.mock('../../../utils/apollo_context'); +jest.mock('../../../../common/utils/apollo_context'); describe('useFetchIndexPatterns', () => { beforeEach(() => { diff --git a/x-pack/plugins/siem/public/containers/detection_engine/rules/fetch_index_patterns.tsx b/x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/fetch_index_patterns.tsx similarity index 89% rename from x-pack/plugins/siem/public/containers/detection_engine/rules/fetch_index_patterns.tsx rename to x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/fetch_index_patterns.tsx index 7e222045a1a3b..dec9f344e16b8 100644 --- a/x-pack/plugins/siem/public/containers/detection_engine/rules/fetch_index_patterns.tsx +++ b/x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/fetch_index_patterns.tsx @@ -8,16 +8,16 @@ import { isEmpty, get } from 'lodash/fp'; import { useEffect, useState, Dispatch, SetStateAction } from 'react'; import deepEqual from 'fast-deep-equal'; -import { IIndexPattern } from '../../../../../../../src/plugins/data/public'; +import { IIndexPattern } from '../../../../../../../../src/plugins/data/public'; import { BrowserFields, getBrowserFields, getIndexFields, sourceQuery, -} from '../../../containers/source'; -import { errorToToaster, useStateToaster } from '../../../components/toasters'; -import { SourceQuery } from '../../../graphql/types'; -import { useApolloClient } from '../../../utils/apollo_context'; +} from '../../../../common/containers/source'; +import { errorToToaster, useStateToaster } from '../../../../common/components/toasters'; +import { SourceQuery } from '../../../../graphql/types'; +import { useApolloClient } from '../../../../common/utils/apollo_context'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/containers/detection_engine/rules/index.ts b/x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/index.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/detection_engine/rules/index.ts rename to x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/index.ts diff --git a/x-pack/plugins/siem/public/containers/detection_engine/rules/mock.ts b/x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/mock.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/detection_engine/rules/mock.ts rename to x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/mock.ts diff --git a/x-pack/plugins/siem/public/containers/detection_engine/rules/persist_rule.test.tsx b/x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/persist_rule.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/containers/detection_engine/rules/persist_rule.test.tsx rename to x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/persist_rule.test.tsx diff --git a/x-pack/plugins/siem/public/containers/detection_engine/rules/persist_rule.tsx b/x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/persist_rule.tsx similarity index 94% rename from x-pack/plugins/siem/public/containers/detection_engine/rules/persist_rule.tsx rename to x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/persist_rule.tsx index 4d4f6c9d8f63a..03080bf68cbf5 100644 --- a/x-pack/plugins/siem/public/containers/detection_engine/rules/persist_rule.tsx +++ b/x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/persist_rule.tsx @@ -6,7 +6,7 @@ import { useEffect, useState, Dispatch } from 'react'; -import { errorToToaster, useStateToaster } from '../../../components/toasters'; +import { errorToToaster, useStateToaster } from '../../../../common/components/toasters'; import { addRule as persistRule } from './api'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/containers/detection_engine/rules/translations.ts b/x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/detection_engine/rules/translations.ts rename to x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/translations.ts diff --git a/x-pack/plugins/siem/public/containers/detection_engine/rules/types.ts b/x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/types.ts similarity index 98% rename from x-pack/plugins/siem/public/containers/detection_engine/rules/types.ts rename to x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/types.ts index f89d21ef1aeb1..897568cdbf16e 100644 --- a/x-pack/plugins/siem/public/containers/detection_engine/rules/types.ts +++ b/x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/types.ts @@ -6,7 +6,7 @@ import * as t from 'io-ts'; -import { RuleTypeSchema } from '../../../../common/detection_engine/types'; +import { RuleTypeSchema } from '../../../../../common/detection_engine/types'; /** * Params is an "record", since it is a type of AlertActionParams which is action templates. diff --git a/x-pack/plugins/siem/public/containers/detection_engine/rules/use_pre_packaged_rules.test.tsx b/x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/use_pre_packaged_rules.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/containers/detection_engine/rules/use_pre_packaged_rules.test.tsx rename to x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/use_pre_packaged_rules.test.tsx diff --git a/x-pack/plugins/siem/public/containers/detection_engine/rules/use_pre_packaged_rules.tsx b/x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/use_pre_packaged_rules.tsx similarity index 98% rename from x-pack/plugins/siem/public/containers/detection_engine/rules/use_pre_packaged_rules.tsx rename to x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/use_pre_packaged_rules.tsx index 44d5de10e361a..f1897002e13cd 100644 --- a/x-pack/plugins/siem/public/containers/detection_engine/rules/use_pre_packaged_rules.tsx +++ b/x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/use_pre_packaged_rules.tsx @@ -6,7 +6,11 @@ import { useEffect, useState } from 'react'; -import { errorToToaster, useStateToaster, displaySuccessToast } from '../../../components/toasters'; +import { + errorToToaster, + useStateToaster, + displaySuccessToast, +} from '../../../../common/components/toasters'; import { getPrePackagedRulesStatus, createPrepackagedRules } from './api'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/containers/detection_engine/rules/use_rule.test.tsx b/x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/use_rule.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/containers/detection_engine/rules/use_rule.test.tsx rename to x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/use_rule.test.tsx diff --git a/x-pack/plugins/siem/public/containers/detection_engine/rules/use_rule.tsx b/x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/use_rule.tsx similarity index 94% rename from x-pack/plugins/siem/public/containers/detection_engine/rules/use_rule.tsx rename to x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/use_rule.tsx index d6a49e006e1b8..6ae5da3e56ff6 100644 --- a/x-pack/plugins/siem/public/containers/detection_engine/rules/use_rule.tsx +++ b/x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/use_rule.tsx @@ -6,7 +6,7 @@ import { useEffect, useState } from 'react'; -import { errorToToaster, useStateToaster } from '../../../components/toasters'; +import { errorToToaster, useStateToaster } from '../../../../common/components/toasters'; import { fetchRuleById } from './api'; import * as i18n from './translations'; import { Rule } from './types'; diff --git a/x-pack/plugins/siem/public/containers/detection_engine/rules/use_rule_status.test.tsx b/x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/use_rule_status.test.tsx similarity index 99% rename from x-pack/plugins/siem/public/containers/detection_engine/rules/use_rule_status.test.tsx rename to x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/use_rule_status.test.tsx index f74c2bad1019e..f203eca42cde6 100644 --- a/x-pack/plugins/siem/public/containers/detection_engine/rules/use_rule_status.test.tsx +++ b/x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/use_rule_status.test.tsx @@ -12,7 +12,7 @@ import { ReturnRulesStatuses, } from './use_rule_status'; import * as api from './api'; -import { Rule } from '../rules/types'; +import { Rule } from './types'; jest.mock('./api'); diff --git a/x-pack/plugins/siem/public/containers/detection_engine/rules/use_rule_status.tsx b/x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/use_rule_status.tsx similarity index 97% rename from x-pack/plugins/siem/public/containers/detection_engine/rules/use_rule_status.tsx rename to x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/use_rule_status.tsx index 412fc0706b151..9164f38d2ac28 100644 --- a/x-pack/plugins/siem/public/containers/detection_engine/rules/use_rule_status.tsx +++ b/x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/use_rule_status.tsx @@ -6,7 +6,7 @@ import { useEffect, useRef, useState } from 'react'; -import { errorToToaster, useStateToaster } from '../../../components/toasters'; +import { errorToToaster, useStateToaster } from '../../../../common/components/toasters'; import { RuleStatusRowItemType } from '../../../pages/detection_engine/rules/all/columns'; import { getRuleStatusById, getRulesStatusByIds } from './api'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/containers/detection_engine/rules/use_rules.test.tsx b/x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/use_rules.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/containers/detection_engine/rules/use_rules.test.tsx rename to x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/use_rules.test.tsx diff --git a/x-pack/plugins/siem/public/containers/detection_engine/rules/use_rules.tsx b/x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/use_rules.tsx similarity index 97% rename from x-pack/plugins/siem/public/containers/detection_engine/rules/use_rules.tsx rename to x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/use_rules.tsx index 6e41e229c2490..3a074f2bc3785 100644 --- a/x-pack/plugins/siem/public/containers/detection_engine/rules/use_rules.tsx +++ b/x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/use_rules.tsx @@ -8,7 +8,7 @@ import { noop } from 'lodash/fp'; import { useEffect, useState, useRef } from 'react'; import { FetchRulesResponse, FilterOptions, PaginationOptions, Rule } from './types'; -import { errorToToaster, useStateToaster } from '../../../components/toasters'; +import { errorToToaster, useStateToaster } from '../../../../common/components/toasters'; import { fetchRules } from './api'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/containers/detection_engine/rules/use_tags.test.tsx b/x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/use_tags.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/containers/detection_engine/rules/use_tags.test.tsx rename to x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/use_tags.test.tsx diff --git a/x-pack/plugins/siem/public/containers/detection_engine/rules/use_tags.tsx b/x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/use_tags.tsx similarity index 94% rename from x-pack/plugins/siem/public/containers/detection_engine/rules/use_tags.tsx rename to x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/use_tags.tsx index 669efedc619bb..ebfe73f2f0863 100644 --- a/x-pack/plugins/siem/public/containers/detection_engine/rules/use_tags.tsx +++ b/x-pack/plugins/siem/public/alerts/containers/detection_engine/rules/use_tags.tsx @@ -6,7 +6,7 @@ import { noop } from 'lodash/fp'; import { useEffect, useState, useRef } from 'react'; -import { errorToToaster, useStateToaster } from '../../../components/toasters'; +import { errorToToaster, useStateToaster } from '../../../../common/components/toasters'; import { fetchTags } from './api'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/containers/detection_engine/signals/__mocks__/api.ts b/x-pack/plugins/siem/public/alerts/containers/detection_engine/signals/__mocks__/api.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/detection_engine/signals/__mocks__/api.ts rename to x-pack/plugins/siem/public/alerts/containers/detection_engine/signals/__mocks__/api.ts diff --git a/x-pack/plugins/siem/public/containers/detection_engine/signals/api.test.ts b/x-pack/plugins/siem/public/alerts/containers/detection_engine/signals/api.test.ts similarity index 97% rename from x-pack/plugins/siem/public/containers/detection_engine/signals/api.test.ts rename to x-pack/plugins/siem/public/alerts/containers/detection_engine/signals/api.test.ts index c011ecffb35bc..67d81d19faa7c 100644 --- a/x-pack/plugins/siem/public/containers/detection_engine/signals/api.test.ts +++ b/x-pack/plugins/siem/public/alerts/containers/detection_engine/signals/api.test.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { KibanaServices } from '../../../lib/kibana'; +import { KibanaServices } from '../../../../common/lib/kibana'; import { signalsMock, mockSignalsQuery, @@ -22,7 +22,7 @@ import { const abortCtrl = new AbortController(); const mockKibanaServices = KibanaServices.get as jest.Mock; -jest.mock('../../../lib/kibana'); +jest.mock('../../../../common/lib/kibana'); const fetchMock = jest.fn(); mockKibanaServices.mockReturnValue({ http: { fetch: fetchMock } }); diff --git a/x-pack/plugins/siem/public/containers/detection_engine/signals/api.ts b/x-pack/plugins/siem/public/alerts/containers/detection_engine/signals/api.ts similarity index 96% rename from x-pack/plugins/siem/public/containers/detection_engine/signals/api.ts rename to x-pack/plugins/siem/public/alerts/containers/detection_engine/signals/api.ts index 1397e4a8696be..860305dd58e67 100644 --- a/x-pack/plugins/siem/public/containers/detection_engine/signals/api.ts +++ b/x-pack/plugins/siem/public/alerts/containers/detection_engine/signals/api.ts @@ -9,8 +9,8 @@ import { DETECTION_ENGINE_SIGNALS_STATUS_URL, DETECTION_ENGINE_INDEX_URL, DETECTION_ENGINE_PRIVILEGES_URL, -} from '../../../../common/constants'; -import { KibanaServices } from '../../../lib/kibana'; +} from '../../../../../common/constants'; +import { KibanaServices } from '../../../../common/lib/kibana'; import { BasicSignals, Privilege, diff --git a/x-pack/plugins/siem/public/containers/detection_engine/signals/mock.ts b/x-pack/plugins/siem/public/alerts/containers/detection_engine/signals/mock.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/detection_engine/signals/mock.ts rename to x-pack/plugins/siem/public/alerts/containers/detection_engine/signals/mock.ts diff --git a/x-pack/plugins/siem/public/containers/detection_engine/signals/translations.ts b/x-pack/plugins/siem/public/alerts/containers/detection_engine/signals/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/detection_engine/signals/translations.ts rename to x-pack/plugins/siem/public/alerts/containers/detection_engine/signals/translations.ts diff --git a/x-pack/plugins/siem/public/containers/detection_engine/signals/types.ts b/x-pack/plugins/siem/public/alerts/containers/detection_engine/signals/types.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/detection_engine/signals/types.ts rename to x-pack/plugins/siem/public/alerts/containers/detection_engine/signals/types.ts diff --git a/x-pack/plugins/siem/public/containers/detection_engine/signals/use_privilege_user.test.tsx b/x-pack/plugins/siem/public/alerts/containers/detection_engine/signals/use_privilege_user.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/containers/detection_engine/signals/use_privilege_user.test.tsx rename to x-pack/plugins/siem/public/alerts/containers/detection_engine/signals/use_privilege_user.test.tsx diff --git a/x-pack/plugins/siem/public/containers/detection_engine/signals/use_privilege_user.tsx b/x-pack/plugins/siem/public/alerts/containers/detection_engine/signals/use_privilege_user.tsx similarity index 96% rename from x-pack/plugins/siem/public/containers/detection_engine/signals/use_privilege_user.tsx rename to x-pack/plugins/siem/public/alerts/containers/detection_engine/signals/use_privilege_user.tsx index 140dd1544b12b..e67afd686a7ca 100644 --- a/x-pack/plugins/siem/public/containers/detection_engine/signals/use_privilege_user.tsx +++ b/x-pack/plugins/siem/public/alerts/containers/detection_engine/signals/use_privilege_user.tsx @@ -6,7 +6,7 @@ import { useEffect, useState } from 'react'; -import { errorToToaster, useStateToaster } from '../../../components/toasters'; +import { errorToToaster, useStateToaster } from '../../../../common/components/toasters'; import { getUserPrivilege } from './api'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/containers/detection_engine/signals/use_query.test.tsx b/x-pack/plugins/siem/public/alerts/containers/detection_engine/signals/use_query.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/containers/detection_engine/signals/use_query.test.tsx rename to x-pack/plugins/siem/public/alerts/containers/detection_engine/signals/use_query.test.tsx diff --git a/x-pack/plugins/siem/public/containers/detection_engine/signals/use_query.tsx b/x-pack/plugins/siem/public/alerts/containers/detection_engine/signals/use_query.tsx similarity index 100% rename from x-pack/plugins/siem/public/containers/detection_engine/signals/use_query.tsx rename to x-pack/plugins/siem/public/alerts/containers/detection_engine/signals/use_query.tsx diff --git a/x-pack/plugins/siem/public/containers/detection_engine/signals/use_signal_index.test.tsx b/x-pack/plugins/siem/public/alerts/containers/detection_engine/signals/use_signal_index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/containers/detection_engine/signals/use_signal_index.test.tsx rename to x-pack/plugins/siem/public/alerts/containers/detection_engine/signals/use_signal_index.test.tsx diff --git a/x-pack/plugins/siem/public/containers/detection_engine/signals/use_signal_index.tsx b/x-pack/plugins/siem/public/alerts/containers/detection_engine/signals/use_signal_index.tsx similarity index 95% rename from x-pack/plugins/siem/public/containers/detection_engine/signals/use_signal_index.tsx rename to x-pack/plugins/siem/public/alerts/containers/detection_engine/signals/use_signal_index.tsx index a7f5c9731320e..6c428bd9354ee 100644 --- a/x-pack/plugins/siem/public/containers/detection_engine/signals/use_signal_index.tsx +++ b/x-pack/plugins/siem/public/alerts/containers/detection_engine/signals/use_signal_index.tsx @@ -6,10 +6,10 @@ import { useEffect, useState } from 'react'; -import { errorToToaster, useStateToaster } from '../../../components/toasters'; +import { errorToToaster, useStateToaster } from '../../../../common/components/toasters'; import { createSignalIndex, getSignalIndex } from './api'; import * as i18n from './translations'; -import { isApiError } from '../../../utils/api'; +import { isApiError } from '../../../../common/utils/api'; type Func = () => void; diff --git a/x-pack/plugins/siem/public/alerts/index.ts b/x-pack/plugins/siem/public/alerts/index.ts new file mode 100644 index 0000000000000..c1501419a1cf6 --- /dev/null +++ b/x-pack/plugins/siem/public/alerts/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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { getAlertsRoutes } from './routes'; +import { SecuritySubPlugin } from '../app/types'; + +export class Alerts { + public setup() {} + + public start(): SecuritySubPlugin { + return { + routes: getAlertsRoutes(), + }; + } +} diff --git a/x-pack/plugins/siem/public/pages/detection_engine/mitre/mitre_tactics_techniques.ts b/x-pack/plugins/siem/public/alerts/mitre/mitre_tactics_techniques.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/mitre/mitre_tactics_techniques.ts rename to x-pack/plugins/siem/public/alerts/mitre/mitre_tactics_techniques.ts diff --git a/x-pack/plugins/siem/public/pages/detection_engine/mitre/types.ts b/x-pack/plugins/siem/public/alerts/mitre/types.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/mitre/types.ts rename to x-pack/plugins/siem/public/alerts/mitre/types.ts diff --git a/x-pack/plugins/siem/public/pages/detection_engine/detection_engine.test.tsx b/x-pack/plugins/siem/public/alerts/pages/detection_engine/detection_engine.test.tsx similarity index 80% rename from x-pack/plugins/siem/public/pages/detection_engine/detection_engine.test.tsx rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/detection_engine.test.tsx index 779e9a4557f2a..de8a732839728 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/detection_engine.test.tsx +++ b/x-pack/plugins/siem/public/alerts/pages/detection_engine/detection_engine.test.tsx @@ -8,13 +8,13 @@ import React from 'react'; import { shallow } from 'enzyme'; import { useParams } from 'react-router-dom'; -import '../../mock/match_media'; -import { setAbsoluteRangeDatePicker } from '../../store/inputs/actions'; +import '../../../common/mock/match_media'; +import { setAbsoluteRangeDatePicker } from '../../../common/store/inputs/actions'; import { DetectionEnginePageComponent } from './detection_engine'; -import { useUserInfo } from './components/user_info'; +import { useUserInfo } from '../../components/user_info'; -jest.mock('./components/user_info'); -jest.mock('../../lib/kibana'); +jest.mock('../../components/user_info'); +jest.mock('../../../common/lib/kibana'); jest.mock('react-router-dom', () => { const originalModule = jest.requireActual('react-router-dom'); diff --git a/x-pack/plugins/siem/public/pages/detection_engine/detection_engine.tsx b/x-pack/plugins/siem/public/alerts/pages/detection_engine/detection_engine.tsx similarity index 80% rename from x-pack/plugins/siem/public/pages/detection_engine/detection_engine.tsx rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/detection_engine.tsx index 3e23700b08e66..a83a85678bd03 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/detection_engine.tsx +++ b/x-pack/plugins/siem/public/alerts/pages/detection_engine/detection_engine.tsx @@ -10,35 +10,38 @@ import { useParams } from 'react-router-dom'; import { StickyContainer } from 'react-sticky'; import { connect, ConnectedProps } from 'react-redux'; -import { GlobalTime } from '../../containers/global_time'; -import { indicesExistOrDataTemporarilyUnavailable, WithSource } from '../../containers/source'; -import { AlertsTable } from '../../components/alerts_viewer/alerts_table'; -import { UpdateDateRange } from '../../components/charts/common'; -import { FiltersGlobal } from '../../components/filters_global'; +import { GlobalTime } from '../../../common/containers/global_time'; +import { + indicesExistOrDataTemporarilyUnavailable, + WithSource, +} from '../../../common/containers/source'; +import { AlertsTable } from '../../../common/components/alerts_viewer/alerts_table'; +import { UpdateDateRange } from '../../../common/components/charts/common'; +import { FiltersGlobal } from '../../../common/components/filters_global'; import { getDetectionEngineTabUrl, getRulesUrl, -} from '../../components/link_to/redirect_to_detection_engine'; -import { SiemSearchBar } from '../../components/search_bar'; -import { WrapperPage } from '../../components/wrapper_page'; -import { SiemNavigation } from '../../components/navigation'; -import { NavTab } from '../../components/navigation/types'; -import { State } from '../../store'; -import { inputsSelectors } from '../../store/inputs'; -import { setAbsoluteRangeDatePicker as dispatchSetAbsoluteRangeDatePicker } from '../../store/inputs/actions'; -import { SpyRoute } from '../../utils/route/spy_routes'; -import { InputsRange } from '../../store/inputs/model'; -import { AlertsByCategory } from '../overview/alerts_by_category'; -import { useSignalInfo } from './components/signals_info'; -import { SignalsTable } from './components/signals'; -import { NoApiIntegrationKeyCallOut } from './components/no_api_integration_callout'; -import { NoWriteSignalsCallOut } from './components/no_write_signals_callout'; -import { SignalsHistogramPanel } from './components/signals_histogram_panel'; -import { signalsHistogramOptions } from './components/signals_histogram_panel/config'; -import { useUserInfo } from './components/user_info'; +} from '../../../common/components/link_to/redirect_to_detection_engine'; +import { SiemSearchBar } from '../../../common/components/search_bar'; +import { WrapperPage } from '../../../common/components/wrapper_page'; +import { SiemNavigation } from '../../../common/components/navigation'; +import { NavTab } from '../../../common/components/navigation/types'; +import { State } from '../../../common/store'; +import { inputsSelectors } from '../../../common/store/inputs'; +import { setAbsoluteRangeDatePicker as dispatchSetAbsoluteRangeDatePicker } from '../../../common/store/inputs/actions'; +import { SpyRoute } from '../../../common/utils/route/spy_routes'; +import { InputsRange } from '../../../common/store/inputs/model'; +import { AlertsByCategory } from '../../../overview/components/alerts_by_category'; +import { useSignalInfo } from '../../components/signals_info'; +import { SignalsTable } from '../../components/signals'; +import { NoApiIntegrationKeyCallOut } from '../../components/no_api_integration_callout'; +import { NoWriteSignalsCallOut } from '../../components/no_write_signals_callout'; +import { SignalsHistogramPanel } from '../../components/signals_histogram_panel'; +import { signalsHistogramOptions } from '../../components/signals_histogram_panel/config'; +import { useUserInfo } from '../../components/user_info'; import { DetectionEngineEmptyPage } from './detection_engine_empty_page'; import { DetectionEngineNoIndex } from './detection_engine_no_signal_index'; -import { DetectionEngineHeaderPage } from './components/detection_engine_header_page'; +import { DetectionEngineHeaderPage } from '../../components/detection_engine_header_page'; import { DetectionEngineUserUnauthenticated } from './detection_engine_user_unauthenticated'; import * as i18n from './translations'; import { DetectionEngineTab } from './types'; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/detection_engine_empty_page.test.tsx b/x-pack/plugins/siem/public/alerts/pages/detection_engine/detection_engine_empty_page.test.tsx similarity index 93% rename from x-pack/plugins/siem/public/pages/detection_engine/detection_engine_empty_page.test.tsx rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/detection_engine_empty_page.test.tsx index f64526fd2f7c4..039c878b121a0 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/detection_engine_empty_page.test.tsx +++ b/x-pack/plugins/siem/public/alerts/pages/detection_engine/detection_engine_empty_page.test.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { shallow } from 'enzyme'; import { DetectionEngineEmptyPage } from './detection_engine_empty_page'; -jest.mock('../../lib/kibana'); +jest.mock('../../../common/lib/kibana'); describe('DetectionEngineEmptyPage', () => { it('renders correctly', () => { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/detection_engine_empty_page.tsx b/x-pack/plugins/siem/public/alerts/pages/detection_engine/detection_engine_empty_page.tsx similarity index 83% rename from x-pack/plugins/siem/public/pages/detection_engine/detection_engine_empty_page.tsx rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/detection_engine_empty_page.tsx index 7516bb13a9e75..3d8f221a02375 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/detection_engine_empty_page.tsx +++ b/x-pack/plugins/siem/public/alerts/pages/detection_engine/detection_engine_empty_page.tsx @@ -6,9 +6,9 @@ import React from 'react'; -import { useKibana } from '../../lib/kibana'; -import { EmptyPage } from '../../components/empty_page'; -import * as i18n from '../common/translations'; +import { useKibana } from '../../../common/lib/kibana'; +import { EmptyPage } from '../../../common/components/empty_page'; +import * as i18n from '../../../common/translations'; export const DetectionEngineEmptyPage = React.memo(() => ( { it('renders correctly', () => { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/detection_engine_no_signal_index.tsx b/x-pack/plugins/siem/public/alerts/pages/detection_engine/detection_engine_no_signal_index.tsx similarity index 88% rename from x-pack/plugins/siem/public/pages/detection_engine/detection_engine_no_signal_index.tsx rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/detection_engine_no_signal_index.tsx index f1478ab5858c9..59267b5d62a26 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/detection_engine_no_signal_index.tsx +++ b/x-pack/plugins/siem/public/alerts/pages/detection_engine/detection_engine_no_signal_index.tsx @@ -6,9 +6,9 @@ import React from 'react'; -import { EmptyPage } from '../../components/empty_page'; +import { EmptyPage } from '../../../common/components/empty_page'; import * as i18n from './translations'; -import { useKibana } from '../../lib/kibana'; +import { useKibana } from '../../../common/lib/kibana'; export const DetectionEngineNoIndex = React.memo(() => { const docLinks = useKibana().services.docLinks; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/detection_engine_user_unauthenticated.test.tsx b/x-pack/plugins/siem/public/alerts/pages/detection_engine/detection_engine_user_unauthenticated.test.tsx similarity index 93% rename from x-pack/plugins/siem/public/pages/detection_engine/detection_engine_user_unauthenticated.test.tsx rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/detection_engine_user_unauthenticated.test.tsx index e71f4de2b010b..5a1efe1c71857 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/detection_engine_user_unauthenticated.test.tsx +++ b/x-pack/plugins/siem/public/alerts/pages/detection_engine/detection_engine_user_unauthenticated.test.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { shallow } from 'enzyme'; import { DetectionEngineUserUnauthenticated } from './detection_engine_user_unauthenticated'; -jest.mock('../../lib/kibana'); +jest.mock('../../../common/lib/kibana'); describe('DetectionEngineUserUnauthenticated', () => { it('renders correctly', () => { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/detection_engine_user_unauthenticated.tsx b/x-pack/plugins/siem/public/alerts/pages/detection_engine/detection_engine_user_unauthenticated.tsx similarity index 88% rename from x-pack/plugins/siem/public/pages/detection_engine/detection_engine_user_unauthenticated.tsx rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/detection_engine_user_unauthenticated.tsx index b5c805f92135a..fc1fee1077bd6 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/detection_engine_user_unauthenticated.tsx +++ b/x-pack/plugins/siem/public/alerts/pages/detection_engine/detection_engine_user_unauthenticated.tsx @@ -6,9 +6,9 @@ import React from 'react'; -import { EmptyPage } from '../../components/empty_page'; +import { EmptyPage } from '../../../common/components/empty_page'; import * as i18n from './translations'; -import { useKibana } from '../../lib/kibana'; +import { useKibana } from '../../../common/lib/kibana'; export const DetectionEngineUserUnauthenticated = React.memo(() => { const docLinks = useKibana().services.docLinks; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/index.test.tsx b/x-pack/plugins/siem/public/alerts/pages/detection_engine/index.test.tsx similarity index 93% rename from x-pack/plugins/siem/public/pages/detection_engine/index.test.tsx rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/index.test.tsx index 6c4980f1d1500..d4e654321ef98 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/index.test.tsx +++ b/x-pack/plugins/siem/public/alerts/pages/detection_engine/index.test.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { shallow } from 'enzyme'; -import '../../mock/match_media'; +import '../../../common/mock/match_media'; import { DetectionEngineContainer } from './index'; describe('DetectionEngineContainer', () => { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/index.tsx b/x-pack/plugins/siem/public/alerts/pages/detection_engine/index.tsx similarity index 96% rename from x-pack/plugins/siem/public/pages/detection_engine/index.tsx rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/index.tsx index 1509348819510..756e222c02950 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/index.tsx +++ b/x-pack/plugins/siem/public/alerts/pages/detection_engine/index.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { Redirect, Route, Switch, RouteComponentProps } from 'react-router-dom'; -import { ManageUserInfo } from './components/user_info'; +import { ManageUserInfo } from '../../components/user_info'; import { CreateRulePage } from './rules/create'; import { DetectionEnginePage } from './detection_engine'; import { EditRulePage } from './rules/edit'; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/all/__mocks__/mock.ts b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/all/__mocks__/mock.ts similarity index 94% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/all/__mocks__/mock.ts rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/all/__mocks__/mock.ts index 66964fae70f94..1b43a513d0d29 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/all/__mocks__/mock.ts +++ b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/all/__mocks__/mock.ts @@ -4,10 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ -import { esFilters } from '../../../../../../../../../src/plugins/data/public'; -import { Rule, RuleError } from '../../../../../containers/detection_engine/rules'; +import { esFilters } from '../../../../../../../../../../src/plugins/data/public'; +import { Rule, RuleError } from '../../../../../../alerts/containers/detection_engine/rules'; import { AboutStepRule, ActionsStepRule, DefineStepRule, ScheduleStepRule } from '../../types'; -import { FieldValueQueryBar } from '../../components/query_bar'; +import { FieldValueQueryBar } from '../../../../../../alerts/components/rules/query_bar'; export const mockQueryBar: FieldValueQueryBar = { query: { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/all/actions.tsx b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/all/actions.tsx similarity index 93% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/all/actions.tsx rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/all/actions.tsx index bc5d0c32bb9c6..5ed7221b68bf3 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/all/actions.tsx +++ b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/all/actions.tsx @@ -7,13 +7,13 @@ import * as H from 'history'; import React, { Dispatch } from 'react'; -import { DETECTION_ENGINE_PAGE_NAME } from '../../../../components/link_to/redirect_to_detection_engine'; +import { DETECTION_ENGINE_PAGE_NAME } from '../../../../../common/components/link_to/redirect_to_detection_engine'; import { deleteRules, duplicateRules, enableRules, Rule, -} from '../../../../containers/detection_engine/rules'; +} from '../../../../../alerts/containers/detection_engine/rules'; import { Action } from './reducer'; import { @@ -21,8 +21,8 @@ import { displayErrorToast, displaySuccessToast, errorToToaster, -} from '../../../../components/toasters'; -import { track, METRIC_TYPE, TELEMETRY_EVENT } from '../../../../lib/telemetry'; +} from '../../../../../common/components/toasters'; +import { track, METRIC_TYPE, TELEMETRY_EVENT } from '../../../../../common/lib/telemetry'; import * as i18n from '../translations'; import { bucketRulesResponse } from './helpers'; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/all/batch_actions.tsx b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/all/batch_actions.tsx similarity index 97% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/all/batch_actions.tsx rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/all/batch_actions.tsx index 454ef18e0ae14..769839a62091b 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/all/batch_actions.tsx +++ b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/all/batch_actions.tsx @@ -14,8 +14,8 @@ import { enableRulesAction, exportRulesAction, } from './actions'; -import { ActionToaster, displayWarningToast } from '../../../../components/toasters'; -import { Rule } from '../../../../containers/detection_engine/rules'; +import { ActionToaster, displayWarningToast } from '../../../../../common/components/toasters'; +import { Rule } from '../../../../../alerts/containers/detection_engine/rules'; import * as detectionI18n from '../../translations'; interface GetBatchItems { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/all/columns.test.tsx b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/all/columns.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/all/columns.test.tsx rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/all/columns.test.tsx diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/all/columns.tsx b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/all/columns.tsx similarity index 90% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/all/columns.tsx rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/all/columns.tsx index 542a004cb3727..224a32ef6ac9d 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/all/columns.tsx +++ b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/all/columns.tsx @@ -19,16 +19,16 @@ import { FormattedRelative } from '@kbn/i18n/react'; import * as H from 'history'; import React, { Dispatch } from 'react'; -import { isMlRule } from '../../../../../common/machine_learning/helpers'; -import { Rule, RuleStatus } from '../../../../containers/detection_engine/rules'; -import { getEmptyTagValue } from '../../../../components/empty_value'; -import { FormattedDate } from '../../../../components/formatted_date'; -import { getRuleDetailsUrl } from '../../../../components/link_to/redirect_to_detection_engine'; -import { ActionToaster } from '../../../../components/toasters'; -import { TruncatableText } from '../../../../components/truncatable_text'; -import { getStatusColor } from '../components/rule_status/helpers'; -import { RuleSwitch } from '../components/rule_switch'; -import { SeverityBadge } from '../components/severity_badge'; +import { isMlRule } from '../../../../../../common/machine_learning/helpers'; +import { Rule, RuleStatus } from '../../../../../alerts/containers/detection_engine/rules'; +import { getEmptyTagValue } from '../../../../../common/components/empty_value'; +import { FormattedDate } from '../../../../../common/components/formatted_date'; +import { getRuleDetailsUrl } from '../../../../../common/components/link_to/redirect_to_detection_engine'; +import { ActionToaster } from '../../../../../common/components/toasters'; +import { TruncatableText } from '../../../../../common/components/truncatable_text'; +import { getStatusColor } from '../../../../components/rules/rule_status/helpers'; +import { RuleSwitch } from '../../../../components/rules/rule_switch'; +import { SeverityBadge } from '../../../../components/rules/severity_badge'; import * as i18n from '../translations'; import { deleteRulesAction, @@ -37,7 +37,7 @@ import { exportRulesAction, } from './actions'; import { Action } from './reducer'; -import { LocalizedDateTooltip } from '../../../../components/localized_date_tooltip'; +import { LocalizedDateTooltip } from '../../../../../common/components/localized_date_tooltip'; import * as detectionI18n from '../../translations'; export const getActions = ( diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/all/helpers.test.tsx b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/all/helpers.test.tsx similarity index 97% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/all/helpers.test.tsx rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/all/helpers.test.tsx index 062d7967bf301..7350cec0115fb 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/all/helpers.test.tsx +++ b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/all/helpers.test.tsx @@ -7,7 +7,7 @@ import { bucketRulesResponse, showRulesTable } from './helpers'; import { mockRule, mockRuleError } from './__mocks__/mock'; import uuid from 'uuid'; -import { Rule, RuleError } from '../../../../containers/detection_engine/rules'; +import { Rule, RuleError } from '../../../../../alerts/containers/detection_engine/rules'; describe('AllRulesTable Helpers', () => { const mockRule1: Readonly = mockRule(uuid.v4()); diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/all/helpers.ts b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/all/helpers.ts similarity index 94% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/all/helpers.ts rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/all/helpers.ts index 0ebeb84d57468..632d03cebef71 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/all/helpers.ts +++ b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/all/helpers.ts @@ -7,7 +7,7 @@ import { BulkRuleResponse, RuleResponseBuckets, -} from '../../../../containers/detection_engine/rules'; +} from '../../../../../alerts/containers/detection_engine/rules'; /** * Separates rules/errors from bulk rules API response (create/update/delete) diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/all/index.test.tsx b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/all/index.test.tsx similarity index 95% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/all/index.test.tsx rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/all/index.test.tsx index 59b3b02ff3587..11909ae7d9c53 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/all/index.test.tsx +++ b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/all/index.test.tsx @@ -8,9 +8,9 @@ import React from 'react'; import { shallow, mount } from 'enzyme'; import { act } from 'react-dom/test-utils'; -import { createKibanaContextProviderMock } from '../../../../mock/kibana_react'; -import { TestProviders } from '../../../../mock'; -import { wait } from '../../../../lib/helpers'; +import { createKibanaContextProviderMock } from '../../../../../common/mock/kibana_react'; +import { TestProviders } from '../../../../../common/mock'; +import { wait } from '../../../../../common/lib/helpers'; import { AllRules } from './index'; jest.mock('./reducer', () => { @@ -67,7 +67,7 @@ jest.mock('./reducer', () => { }; }); -jest.mock('../../../../containers/detection_engine/rules', () => { +jest.mock('../../../../../alerts/containers/detection_engine/rules', () => { return { useRules: jest.fn().mockReturnValue([ false, diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/all/index.tsx b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/all/index.tsx similarity index 93% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/all/index.tsx rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/all/index.tsx index d9a2fafd144bc..c1fd24e24a38b 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/all/index.tsx +++ b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/all/index.tsx @@ -24,21 +24,21 @@ import { Rule, PaginationOptions, exportRules, -} from '../../../../containers/detection_engine/rules'; -import { HeaderSection } from '../../../../components/header_section'; +} from '../../../../../alerts/containers/detection_engine/rules'; +import { HeaderSection } from '../../../../../common/components/header_section'; import { UtilityBar, UtilityBarAction, UtilityBarGroup, UtilityBarSection, UtilityBarText, -} from '../../../../components/utility_bar'; -import { useStateToaster } from '../../../../components/toasters'; -import { Loader } from '../../../../components/loader'; -import { Panel } from '../../../../components/panel'; -import { PrePackagedRulesPrompt } from '../components/pre_packaged_rules/load_empty_prompt'; -import { GenericDownloader } from '../../../../components/generic_downloader'; -import { AllRulesTables, SortingType } from '../components/all_rules_tables'; +} from '../../../../../common/components/utility_bar'; +import { useStateToaster } from '../../../../../common/components/toasters'; +import { Loader } from '../../../../../common/components/loader'; +import { Panel } from '../../../../../common/components/panel'; +import { PrePackagedRulesPrompt } from '../../../../components/rules/pre_packaged_rules/load_empty_prompt'; +import { GenericDownloader } from '../../../../../common/components/generic_downloader'; +import { AllRulesTables, SortingType } from '../../../../components/rules/all_rules_tables'; import { getPrePackagedRuleStatus } from '../helpers'; import * as i18n from '../translations'; import { EuiBasicTableOnChange } from '../types'; @@ -47,8 +47,8 @@ import { getColumns, getMonitoringColumns } from './columns'; import { showRulesTable } from './helpers'; import { allRulesReducer, State } from './reducer'; import { RulesTableFilters } from './rules_table_filters/rules_table_filters'; -import { useMlCapabilities } from '../../../../components/ml_popover/hooks/use_ml_capabilities'; -import { hasMlAdminPermissions } from '../../../../../common/machine_learning/has_ml_admin_permissions'; +import { useMlCapabilities } from '../../../../../common/components/ml_popover/hooks/use_ml_capabilities'; +import { hasMlAdminPermissions } from '../../../../../../common/machine_learning/has_ml_admin_permissions'; const SORT_FIELD = 'enabled'; const initialState: State = { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/all/reducer.ts b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/all/reducer.ts similarity index 98% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/all/reducer.ts rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/all/reducer.ts index bc5297e7628b7..72559d84eeab4 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/all/reducer.ts +++ b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/all/reducer.ts @@ -9,7 +9,7 @@ import { FilterOptions, PaginationOptions, Rule, -} from '../../../../containers/detection_engine/rules'; +} from '../../../../../alerts/containers/detection_engine/rules'; type LoadingRuleAction = 'duplicate' | 'enable' | 'disable' | 'export' | 'delete' | null; export interface State { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/all/rules_table_filters/rules_table_filters.test.tsx b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/all/rules_table_filters/rules_table_filters.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/all/rules_table_filters/rules_table_filters.test.tsx rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/all/rules_table_filters/rules_table_filters.test.tsx diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/all/rules_table_filters/rules_table_filters.tsx b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/all/rules_table_filters/rules_table_filters.tsx similarity index 95% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/all/rules_table_filters/rules_table_filters.tsx rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/all/rules_table_filters/rules_table_filters.tsx index ddb8894c206b5..de4804f37f1bc 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/all/rules_table_filters/rules_table_filters.tsx +++ b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/all/rules_table_filters/rules_table_filters.tsx @@ -16,8 +16,8 @@ import { import { isEqual } from 'lodash/fp'; import * as i18n from '../../translations'; -import { FilterOptions } from '../../../../../containers/detection_engine/rules'; -import { useTags } from '../../../../../containers/detection_engine/rules/use_tags'; +import { FilterOptions } from '../../../../../../alerts/containers/detection_engine/rules'; +import { useTags } from '../../../../../../alerts/containers/detection_engine/rules/use_tags'; import { TagsFilterPopover } from './tags_filter_popover'; interface RulesTableFiltersProps { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/all/rules_table_filters/tags_filter_popover.test.tsx b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/all/rules_table_filters/tags_filter_popover.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/all/rules_table_filters/tags_filter_popover.test.tsx rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/all/rules_table_filters/tags_filter_popover.test.tsx diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/all/rules_table_filters/tags_filter_popover.tsx b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/all/rules_table_filters/tags_filter_popover.tsx similarity index 95% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/all/rules_table_filters/tags_filter_popover.tsx rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/all/rules_table_filters/tags_filter_popover.tsx index 44149a072f5c1..b453125223c30 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/all/rules_table_filters/tags_filter_popover.tsx +++ b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/all/rules_table_filters/tags_filter_popover.tsx @@ -16,7 +16,7 @@ import { } from '@elastic/eui'; import styled from 'styled-components'; import * as i18n from '../../translations'; -import { toggleSelectedGroup } from '../../../../../components/ml_popover/jobs_table/filters/toggle_selected_group'; +import { toggleSelectedGroup } from '../../../../../../common/components/ml_popover/jobs_table/filters/toggle_selected_group'; interface TagsFilterPopoverProps { selectedTags: string[]; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/create/helpers.test.ts b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/create/helpers.test.ts similarity index 99% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/create/helpers.test.ts rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/create/helpers.test.ts index 8d793f39afa99..1894d0ab1a9e7 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/create/helpers.test.ts +++ b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/create/helpers.test.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { NewRule } from '../../../../containers/detection_engine/rules'; +import { NewRule } from '../../../../../alerts/containers/detection_engine/rules'; import { DefineStepRuleJson, ScheduleStepRuleJson, diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/create/helpers.ts b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/create/helpers.ts similarity index 93% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/create/helpers.ts rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/create/helpers.ts index b912c182a7c65..7f200ef421c48 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/create/helpers.ts +++ b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/create/helpers.ts @@ -8,11 +8,11 @@ import { has, isEmpty } from 'lodash/fp'; import moment from 'moment'; import deepmerge from 'deepmerge'; -import { NOTIFICATION_THROTTLE_NO_ACTIONS } from '../../../../../common/constants'; -import { transformAlertToRuleAction } from '../../../../../common/detection_engine/transform_actions'; -import { RuleType } from '../../../../../common/detection_engine/types'; -import { isMlRule } from '../../../../../common/machine_learning/helpers'; -import { NewRule } from '../../../../containers/detection_engine/rules'; +import { NOTIFICATION_THROTTLE_NO_ACTIONS } from '../../../../../../common/constants'; +import { transformAlertToRuleAction } from '../../../../../../common/detection_engine/transform_actions'; +import { RuleType } from '../../../../../../common/detection_engine/types'; +import { isMlRule } from '../../../../../../common/machine_learning/helpers'; +import { NewRule } from '../../../../../alerts/containers/detection_engine/rules'; import { AboutStepRule, diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/create/index.test.tsx b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/create/index.test.tsx similarity index 78% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/create/index.test.tsx rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/create/index.test.tsx index db32be652d0f7..7749e38578e90 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/create/index.test.tsx +++ b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/create/index.test.tsx @@ -7,11 +7,11 @@ import React from 'react'; import { shallow } from 'enzyme'; -import { TestProviders } from '../../../../mock'; +import { TestProviders } from '../../../../../common/mock'; import { CreateRulePage } from './index'; -import { useUserInfo } from '../../components/user_info'; +import { useUserInfo } from '../../../../components/user_info'; -jest.mock('../../components/user_info'); +jest.mock('../../../../components/user_info'); describe('CreateRulePage', () => { it('renders correctly', () => { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/create/index.tsx b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/create/index.tsx similarity index 93% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/create/index.tsx rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/create/index.tsx index 2686bb47925b6..5cf7f9e5b15a3 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/create/index.tsx +++ b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/create/index.tsx @@ -9,20 +9,20 @@ import React, { useCallback, useRef, useState, useMemo } from 'react'; import { Redirect } from 'react-router-dom'; import styled, { StyledComponent } from 'styled-components'; -import { usePersistRule } from '../../../../containers/detection_engine/rules'; +import { usePersistRule } from '../../../../../alerts/containers/detection_engine/rules'; -import { DETECTION_ENGINE_PAGE_NAME } from '../../../../components/link_to/redirect_to_detection_engine'; -import { WrapperPage } from '../../../../components/wrapper_page'; -import { displaySuccessToast, useStateToaster } from '../../../../components/toasters'; -import { SpyRoute } from '../../../../utils/route/spy_routes'; -import { useUserInfo } from '../../components/user_info'; -import { AccordionTitle } from '../components/accordion_title'; -import { FormData, FormHook } from '../../../../shared_imports'; -import { StepAboutRule } from '../components/step_about_rule'; -import { StepDefineRule } from '../components/step_define_rule'; -import { StepScheduleRule } from '../components/step_schedule_rule'; -import { StepRuleActions } from '../components/step_rule_actions'; -import { DetectionEngineHeaderPage } from '../../components/detection_engine_header_page'; +import { DETECTION_ENGINE_PAGE_NAME } from '../../../../../common/components/link_to/redirect_to_detection_engine'; +import { WrapperPage } from '../../../../../common/components/wrapper_page'; +import { displaySuccessToast, useStateToaster } from '../../../../../common/components/toasters'; +import { SpyRoute } from '../../../../../common/utils/route/spy_routes'; +import { useUserInfo } from '../../../../components/user_info'; +import { AccordionTitle } from '../../../../components/rules/accordion_title'; +import { FormData, FormHook } from '../../../../../shared_imports'; +import { StepAboutRule } from '../../../../components/rules/step_about_rule'; +import { StepDefineRule } from '../../../../components/rules/step_define_rule'; +import { StepScheduleRule } from '../../../../components/rules/step_schedule_rule'; +import { StepRuleActions } from '../../../../components/rules/step_rule_actions'; +import { DetectionEngineHeaderPage } from '../../../../components/detection_engine_header_page'; import * as RuleI18n from '../translations'; import { redirectToDetections, getActionMessageParams, userHasNoPermissions } from '../helpers'; import { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/create/translations.ts b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/create/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/create/translations.ts rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/create/translations.ts diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/details/failure_history.test.tsx b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/details/failure_history.test.tsx similarity index 76% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/details/failure_history.test.tsx rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/details/failure_history.test.tsx index a83ff4c54b076..fc16bcd96f766 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/details/failure_history.test.tsx +++ b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/details/failure_history.test.tsx @@ -7,10 +7,10 @@ import React from 'react'; import { shallow } from 'enzyme'; -import { TestProviders } from '../../../../mock'; +import { TestProviders } from '../../../../../common/mock'; import { FailureHistory } from './failure_history'; -import { useRuleStatus } from '../../../../containers/detection_engine/rules'; -jest.mock('../../../../containers/detection_engine/rules'); +import { useRuleStatus } from '../../../../../alerts/containers/detection_engine/rules'; +jest.mock('../../../../../alerts/containers/detection_engine/rules'); describe('FailureHistory', () => { beforeAll(() => { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/details/failure_history.tsx b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/details/failure_history.tsx similarity index 87% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/details/failure_history.tsx rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/details/failure_history.tsx index f660c1763d5e0..f03f320c51418 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/details/failure_history.tsx +++ b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/details/failure_history.tsx @@ -15,10 +15,13 @@ import { } from '@elastic/eui'; import React, { memo } from 'react'; -import { useRuleStatus, RuleInfoStatus } from '../../../../containers/detection_engine/rules'; -import { HeaderSection } from '../../../../components/header_section'; +import { + useRuleStatus, + RuleInfoStatus, +} from '../../../../../alerts/containers/detection_engine/rules'; +import { HeaderSection } from '../../../../../common/components/header_section'; import * as i18n from './translations'; -import { FormattedDate } from '../../../../components/formatted_date'; +import { FormattedDate } from '../../../../../common/components/formatted_date'; interface FailureHistoryProps { id?: string | null; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/details/index.test.tsx b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/details/index.test.tsx similarity index 78% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/details/index.test.tsx rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/details/index.test.tsx index 19c6f39a9bc7e..d755f972f2950 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/details/index.test.tsx +++ b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/details/index.test.tsx @@ -7,14 +7,14 @@ import React from 'react'; import { shallow } from 'enzyme'; -import '../../../../mock/match_media'; -import { TestProviders } from '../../../../mock'; +import '../../../../../common/mock/match_media'; +import { TestProviders } from '../../../../../common/mock'; import { RuleDetailsPageComponent } from './index'; -import { setAbsoluteRangeDatePicker } from '../../../../store/inputs/actions'; -import { useUserInfo } from '../../components/user_info'; +import { setAbsoluteRangeDatePicker } from '../../../../../common/store/inputs/actions'; +import { useUserInfo } from '../../../../components/user_info'; import { useParams } from 'react-router-dom'; -jest.mock('../../components/user_info'); +jest.mock('../../../../components/user_info'); jest.mock('react-router-dom', () => { const originalModule = jest.requireActual('react-router-dom'); diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/details/index.tsx b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/details/index.tsx similarity index 84% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/details/index.tsx rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/details/index.tsx index 6a43c217e5ff5..60491387c492d 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/details/index.tsx +++ b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/details/index.tsx @@ -22,54 +22,54 @@ import { Redirect, useParams } from 'react-router-dom'; import { StickyContainer } from 'react-sticky'; import { connect, ConnectedProps } from 'react-redux'; -import { UpdateDateRange } from '../../../../components/charts/common'; -import { FiltersGlobal } from '../../../../components/filters_global'; -import { FormattedDate } from '../../../../components/formatted_date'; +import { UpdateDateRange } from '../../../../../common/components/charts/common'; +import { FiltersGlobal } from '../../../../../common/components/filters_global'; +import { FormattedDate } from '../../../../../common/components/formatted_date'; import { getEditRuleUrl, getRulesUrl, DETECTION_ENGINE_PAGE_NAME, -} from '../../../../components/link_to/redirect_to_detection_engine'; -import { SiemSearchBar } from '../../../../components/search_bar'; -import { WrapperPage } from '../../../../components/wrapper_page'; -import { useRule } from '../../../../containers/detection_engine/rules'; +} from '../../../../../common/components/link_to/redirect_to_detection_engine'; +import { SiemSearchBar } from '../../../../../common/components/search_bar'; +import { WrapperPage } from '../../../../../common/components/wrapper_page'; +import { useRule } from '../../../../../alerts/containers/detection_engine/rules'; import { indicesExistOrDataTemporarilyUnavailable, WithSource, -} from '../../../../containers/source'; -import { SpyRoute } from '../../../../utils/route/spy_routes'; +} from '../../../../../common/containers/source'; +import { SpyRoute } from '../../../../../common/utils/route/spy_routes'; -import { StepAboutRuleToggleDetails } from '../components/step_about_rule_details/'; -import { DetectionEngineHeaderPage } from '../../components/detection_engine_header_page'; -import { SignalsHistogramPanel } from '../../components/signals_histogram_panel'; -import { SignalsTable } from '../../components/signals'; -import { useUserInfo } from '../../components/user_info'; +import { StepAboutRuleToggleDetails } from '../../../../components/rules/step_about_rule_details'; +import { DetectionEngineHeaderPage } from '../../../../components/detection_engine_header_page'; +import { SignalsHistogramPanel } from '../../../../components/signals_histogram_panel'; +import { SignalsTable } from '../../../../components/signals'; +import { useUserInfo } from '../../../../components/user_info'; import { DetectionEngineEmptyPage } from '../../detection_engine_empty_page'; -import { useSignalInfo } from '../../components/signals_info'; -import { StepDefineRule } from '../components/step_define_rule'; -import { StepScheduleRule } from '../components/step_schedule_rule'; -import { buildSignalsRuleIdFilter } from '../../components/signals/default_config'; -import { NoWriteSignalsCallOut } from '../../components/no_write_signals_callout'; +import { useSignalInfo } from '../../../../components/signals_info'; +import { StepDefineRule } from '../../../../components/rules/step_define_rule'; +import { StepScheduleRule } from '../../../../components/rules/step_schedule_rule'; +import { buildSignalsRuleIdFilter } from '../../../../components/signals/default_config'; +import { NoWriteSignalsCallOut } from '../../../../components/no_write_signals_callout'; import * as detectionI18n from '../../translations'; -import { ReadOnlyCallOut } from '../components/read_only_callout'; -import { RuleSwitch } from '../components/rule_switch'; -import { StepPanel } from '../components/step_panel'; +import { ReadOnlyCallOut } from '../../../../components/rules/read_only_callout'; +import { RuleSwitch } from '../../../../components/rules/rule_switch'; +import { StepPanel } from '../../../../components/rules/step_panel'; import { getStepsData, redirectToDetections, userHasNoPermissions } from '../helpers'; import * as ruleI18n from '../translations'; import * as i18n from './translations'; -import { GlobalTime } from '../../../../containers/global_time'; -import { signalsHistogramOptions } from '../../components/signals_histogram_panel/config'; -import { inputsSelectors } from '../../../../store/inputs'; -import { State } from '../../../../store'; -import { InputsRange } from '../../../../store/inputs/model'; -import { setAbsoluteRangeDatePicker as dispatchSetAbsoluteRangeDatePicker } from '../../../../store/inputs/actions'; -import { RuleActionsOverflow } from '../components/rule_actions_overflow'; +import { GlobalTime } from '../../../../../common/containers/global_time'; +import { signalsHistogramOptions } from '../../../../components/signals_histogram_panel/config'; +import { inputsSelectors } from '../../../../../common/store/inputs'; +import { State } from '../../../../../common/store'; +import { InputsRange } from '../../../../../common/store/inputs/model'; +import { setAbsoluteRangeDatePicker as dispatchSetAbsoluteRangeDatePicker } from '../../../../../common/store/inputs/actions'; +import { RuleActionsOverflow } from '../../../../components/rules/rule_actions_overflow'; import { RuleStatusFailedCallOut } from './status_failed_callout'; import { FailureHistory } from './failure_history'; -import { RuleStatus } from '../components/rule_status'; -import { useMlCapabilities } from '../../../../components/ml_popover/hooks/use_ml_capabilities'; -import { hasMlAdminPermissions } from '../../../../../common/machine_learning/has_ml_admin_permissions'; +import { RuleStatus } from '../../../../components/rules//rule_status'; +import { useMlCapabilities } from '../../../../../common/components/ml_popover/hooks/use_ml_capabilities'; +import { hasMlAdminPermissions } from '../../../../../../common/machine_learning/has_ml_admin_permissions'; enum RuleDetailTabs { signals = 'signals', diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/details/status_failed_callout.test.tsx b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/details/status_failed_callout.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/details/status_failed_callout.test.tsx rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/details/status_failed_callout.test.tsx diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/details/status_failed_callout.tsx b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/details/status_failed_callout.tsx similarity index 93% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/details/status_failed_callout.tsx rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/details/status_failed_callout.tsx index d1699a83becaf..5b5b96ace8670 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/details/status_failed_callout.tsx +++ b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/details/status_failed_callout.tsx @@ -7,7 +7,7 @@ import { EuiCallOut, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import React, { memo } from 'react'; -import { FormattedDate } from '../../../../components/formatted_date'; +import { FormattedDate } from '../../../../../common/components/formatted_date'; import * as i18n from './translations'; interface RuleStatusFailedCallOutComponentProps { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/details/translations.ts b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/details/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/details/translations.ts rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/details/translations.ts diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/edit/index.test.tsx b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/edit/index.test.tsx similarity index 84% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/edit/index.test.tsx rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/edit/index.test.tsx index d22bc12abf9fa..91bc2ce7bce25 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/edit/index.test.tsx +++ b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/edit/index.test.tsx @@ -7,12 +7,12 @@ import React from 'react'; import { shallow } from 'enzyme'; -import { TestProviders } from '../../../../mock'; +import { TestProviders } from '../../../../../common/mock'; import { EditRulePage } from './index'; -import { useUserInfo } from '../../components/user_info'; +import { useUserInfo } from '../../../../components/user_info'; import { useParams } from 'react-router-dom'; -jest.mock('../../components/user_info'); +jest.mock('../../../../components/user_info'); jest.mock('react-router-dom', () => { const originalModule = jest.requireActual('react-router-dom'); diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/edit/index.tsx b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/edit/index.tsx similarity index 92% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/edit/index.tsx rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/edit/index.tsx index c42e7b902cd5c..041f932c412cf 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/edit/index.tsx +++ b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/edit/index.tsx @@ -19,19 +19,19 @@ import { FormattedMessage } from '@kbn/i18n/react'; import React, { FC, memo, useCallback, useEffect, useMemo, useRef, useState } from 'react'; import { Redirect, useParams } from 'react-router-dom'; -import { useRule, usePersistRule } from '../../../../containers/detection_engine/rules'; -import { WrapperPage } from '../../../../components/wrapper_page'; -import { DETECTION_ENGINE_PAGE_NAME } from '../../../../components/link_to/redirect_to_detection_engine'; -import { displaySuccessToast, useStateToaster } from '../../../../components/toasters'; -import { SpyRoute } from '../../../../utils/route/spy_routes'; -import { useUserInfo } from '../../components/user_info'; -import { DetectionEngineHeaderPage } from '../../components/detection_engine_header_page'; -import { FormHook, FormData } from '../../../../shared_imports'; -import { StepPanel } from '../components/step_panel'; -import { StepAboutRule } from '../components/step_about_rule'; -import { StepDefineRule } from '../components/step_define_rule'; -import { StepScheduleRule } from '../components/step_schedule_rule'; -import { StepRuleActions } from '../components/step_rule_actions'; +import { useRule, usePersistRule } from '../../../../../alerts/containers/detection_engine/rules'; +import { WrapperPage } from '../../../../../common/components/wrapper_page'; +import { DETECTION_ENGINE_PAGE_NAME } from '../../../../../common/components/link_to/redirect_to_detection_engine'; +import { displaySuccessToast, useStateToaster } from '../../../../../common/components/toasters'; +import { SpyRoute } from '../../../../../common/utils/route/spy_routes'; +import { useUserInfo } from '../../../../components/user_info'; +import { DetectionEngineHeaderPage } from '../../../../components/detection_engine_header_page'; +import { FormHook, FormData } from '../../../../../shared_imports'; +import { StepPanel } from '../../../../components/rules/step_panel'; +import { StepAboutRule } from '../../../../components/rules/step_about_rule'; +import { StepDefineRule } from '../../../../components/rules/step_define_rule'; +import { StepScheduleRule } from '../../../../components/rules/step_schedule_rule'; +import { StepRuleActions } from '../../../../components/rules/step_rule_actions'; import { formatRule } from '../create/helpers'; import { getStepsData, diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/edit/translations.ts b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/edit/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/edit/translations.ts rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/edit/translations.ts diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/helpers.test.tsx b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/helpers.test.tsx similarity index 98% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/helpers.test.tsx rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/helpers.test.tsx index f2a04a87ced27..6c64577b083df 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/helpers.test.tsx +++ b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/helpers.test.tsx @@ -17,8 +17,8 @@ import { userHasNoPermissions, } from './helpers'; import { mockRuleWithEverything, mockRule } from './all/__mocks__/mock'; -import { esFilters } from '../../../../../../../src/plugins/data/public'; -import { Rule } from '../../../containers/detection_engine/rules'; +import { esFilters } from '../../../../../../../../src/plugins/data/public'; +import { Rule } from '../../../../alerts/containers/detection_engine/rules'; import { AboutStepRule, AboutStepRuleDetails, diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/helpers.tsx b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/helpers.tsx similarity index 93% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/helpers.tsx rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/helpers.tsx index 3dbcf3b2425cc..8fbb8babe90c7 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/helpers.tsx +++ b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/helpers.tsx @@ -10,12 +10,12 @@ import moment from 'moment'; import memoizeOne from 'memoize-one'; import { useLocation } from 'react-router-dom'; -import { RuleAlertAction, RuleType } from '../../../../common/detection_engine/types'; -import { isMlRule } from '../../../../common/machine_learning/helpers'; -import { transformRuleToAlertAction } from '../../../../common/detection_engine/transform_actions'; -import { Filter } from '../../../../../../../src/plugins/data/public'; -import { Rule } from '../../../containers/detection_engine/rules'; -import { FormData, FormHook, FormSchema } from '../../../shared_imports'; +import { RuleAlertAction, RuleType } from '../../../../../common/detection_engine/types'; +import { isMlRule } from '../../../../../common/machine_learning/helpers'; +import { transformRuleToAlertAction } from '../../../../../common/detection_engine/transform_actions'; +import { Filter } from '../../../../../../../../src/plugins/data/public'; +import { Rule } from '../../../../alerts/containers/detection_engine/rules'; +import { FormData, FormHook, FormSchema } from '../../../../shared_imports'; import { AboutStepRule, AboutStepRuleDetails, diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/index.test.tsx b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/index.test.tsx similarity index 71% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/index.test.tsx rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/index.test.tsx index 3fa81ca3ced08..29f875d113a42 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/index.test.tsx +++ b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/index.test.tsx @@ -8,11 +8,11 @@ import React from 'react'; import { shallow } from 'enzyme'; import { RulesPage } from './index'; -import { useUserInfo } from '../components/user_info'; -import { usePrePackagedRules } from '../../../containers/detection_engine/rules'; +import { useUserInfo } from '../../../components/user_info'; +import { usePrePackagedRules } from '../../../../alerts/containers/detection_engine/rules'; -jest.mock('../components/user_info'); -jest.mock('../../../containers/detection_engine/rules'); +jest.mock('../../../components/user_info'); +jest.mock('../../../../alerts/containers/detection_engine/rules'); describe('RulesPage', () => { beforeAll(() => { diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/index.tsx b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/index.tsx similarity index 89% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/index.tsx rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/index.tsx index 8831bc77691fa..7a9620df3a7b3 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/index.tsx +++ b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/index.tsx @@ -8,21 +8,24 @@ import { EuiButton, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import React, { useCallback, useRef, useState } from 'react'; import { Redirect } from 'react-router-dom'; -import { usePrePackagedRules, importRules } from '../../../containers/detection_engine/rules'; +import { + usePrePackagedRules, + importRules, +} from '../../../../alerts/containers/detection_engine/rules'; import { DETECTION_ENGINE_PAGE_NAME, getDetectionEngineUrl, getCreateRuleUrl, -} from '../../../components/link_to/redirect_to_detection_engine'; -import { DetectionEngineHeaderPage } from '../components/detection_engine_header_page'; -import { WrapperPage } from '../../../components/wrapper_page'; -import { SpyRoute } from '../../../utils/route/spy_routes'; +} from '../../../../common/components/link_to/redirect_to_detection_engine'; +import { DetectionEngineHeaderPage } from '../../../components/detection_engine_header_page'; +import { WrapperPage } from '../../../../common/components/wrapper_page'; +import { SpyRoute } from '../../../../common/utils/route/spy_routes'; -import { useUserInfo } from '../components/user_info'; +import { useUserInfo } from '../../../components/user_info'; import { AllRules } from './all'; -import { ImportDataModal } from '../../../components/import_data_modal'; -import { ReadOnlyCallOut } from './components/read_only_callout'; -import { UpdatePrePackagedRulesCallOut } from './components/pre_packaged_rules/update_callout'; +import { ImportDataModal } from '../../../../common/components/import_data_modal'; +import { ReadOnlyCallOut } from '../../../components/rules/read_only_callout'; +import { UpdatePrePackagedRulesCallOut } from '../../../components/rules/pre_packaged_rules/update_callout'; import { getPrePackagedRuleStatus, redirectToDetections, userHasNoPermissions } from './helpers'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/translations.ts b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/translations.ts rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/translations.ts diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/types.ts b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/types.ts similarity index 87% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/types.ts rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/types.ts index dcb5397d28f7c..92c9780a11722 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/types.ts +++ b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/types.ts @@ -4,12 +4,12 @@ * you may not use this file except in compliance with the Elastic License. */ -import { RuleAlertAction, RuleType } from '../../../../common/detection_engine/types'; -import { AlertAction } from '../../../../../alerting/common'; -import { Filter } from '../../../../../../../src/plugins/data/common'; -import { FieldValueQueryBar } from './components/query_bar'; -import { FormData, FormHook } from '../../../shared_imports'; -import { FieldValueTimeline } from './components/pick_timeline'; +import { RuleAlertAction, RuleType } from '../../../../../common/detection_engine/types'; +import { AlertAction } from '../../../../../../alerting/common'; +import { Filter } from '../../../../../../../../src/plugins/data/common'; +import { FormData, FormHook } from '../../../../shared_imports'; +import { FieldValueQueryBar } from '../../../components/rules/query_bar'; +import { FieldValueTimeline } from '../../../components/rules/pick_timeline'; export interface EuiBasicTableSortTypes { field: string; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/utils.test.ts b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/utils.test.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/utils.test.ts rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/utils.test.ts diff --git a/x-pack/plugins/siem/public/pages/detection_engine/rules/utils.ts b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/utils.ts similarity index 90% rename from x-pack/plugins/siem/public/pages/detection_engine/rules/utils.ts rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/utils.ts index f93ad94dd462b..159301a07de78 100644 --- a/x-pack/plugins/siem/public/pages/detection_engine/rules/utils.ts +++ b/x-pack/plugins/siem/public/alerts/pages/detection_engine/rules/utils.ts @@ -6,7 +6,8 @@ import { isEmpty } from 'lodash/fp'; -import { ChromeBreadcrumb } from '../../../../../../../src/core/public'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { ChromeBreadcrumb } from '../../../../../../../../src/core/public'; import { getDetectionEngineUrl, getDetectionEngineTabUrl, @@ -14,10 +15,10 @@ import { getRuleDetailsUrl, getCreateRuleUrl, getEditRuleUrl, -} from '../../../components/link_to/redirect_to_detection_engine'; +} from '../../../../common/components/link_to/redirect_to_detection_engine'; import * as i18nDetections from '../translations'; import * as i18nRules from './translations'; -import { RouteSpyState } from '../../../utils/route/types'; +import { RouteSpyState } from '../../../../common/utils/route/types'; const getTabBreadcrumb = (pathname: string, search: string[]) => { const tabPath = pathname.split('/')[2]; diff --git a/x-pack/plugins/siem/public/pages/detection_engine/translations.ts b/x-pack/plugins/siem/public/alerts/pages/detection_engine/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/translations.ts rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/translations.ts diff --git a/x-pack/plugins/siem/public/pages/detection_engine/types.ts b/x-pack/plugins/siem/public/alerts/pages/detection_engine/types.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/detection_engine/types.ts rename to x-pack/plugins/siem/public/alerts/pages/detection_engine/types.ts diff --git a/x-pack/plugins/siem/public/alerts/routes.tsx b/x-pack/plugins/siem/public/alerts/routes.tsx new file mode 100644 index 0000000000000..897ba3269546f --- /dev/null +++ b/x-pack/plugins/siem/public/alerts/routes.tsx @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { Route } from 'react-router-dom'; + +import { DetectionEngineContainer } from './pages/detection_engine'; +import { SiemPageName } from '../app/types'; + +export const getAlertsRoutes = () => [ + ( + + )} + />, +]; diff --git a/x-pack/plugins/siem/public/pages/404.tsx b/x-pack/plugins/siem/public/app/404.tsx similarity index 90% rename from x-pack/plugins/siem/public/pages/404.tsx rename to x-pack/plugins/siem/public/app/404.tsx index ba1cb4f40cbed..6a1b5c56dc853 100644 --- a/x-pack/plugins/siem/public/pages/404.tsx +++ b/x-pack/plugins/siem/public/app/404.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { FormattedMessage } from '@kbn/i18n/react'; -import { WrapperPage } from '../components/wrapper_page'; +import { WrapperPage } from '../common/components/wrapper_page'; export const NotFoundPage = React.memo(() => ( diff --git a/x-pack/plugins/siem/public/app/app.tsx b/x-pack/plugins/siem/public/app/app.tsx index 6e2a4642f99a4..7aef91380b522 100644 --- a/x-pack/plugins/siem/public/app/app.tsx +++ b/x-pack/plugins/siem/public/app/app.tsx @@ -17,32 +17,35 @@ import euiLightVars from '@elastic/eui/dist/eui_theme_light.json'; import { BehaviorSubject } from 'rxjs'; import { pluck } from 'rxjs/operators'; -import { KibanaContextProvider, useKibana, useUiSetting$ } from '../lib/kibana'; +import { KibanaContextProvider, useKibana, useUiSetting$ } from '../common/lib/kibana'; import { Storage } from '../../../../../src/plugins/kibana_utils/public'; import { DEFAULT_DARK_MODE } from '../../common/constants'; -import { ErrorToastDispatcher } from '../components/error_toast_dispatcher'; -import { compose } from '../lib/compose/kibana_compose'; -import { AppFrontendLibs, AppApolloClient } from '../lib/lib'; +import { ErrorToastDispatcher } from '../common/components/error_toast_dispatcher'; +import { compose } from '../common/lib/compose/kibana_compose'; +import { AppFrontendLibs, AppApolloClient } from '../common/lib/lib'; import { StartServices } from '../plugin'; -import { PageRouter } from '../routes'; -import { createStore, createInitialState } from '../store'; -import { GlobalToaster, ManageGlobalToaster } from '../components/toasters'; -import { MlCapabilitiesProvider } from '../components/ml/permissions/ml_capabilities_provider'; +import { PageRouter } from './routes'; +import { createStore, createInitialState } from '../common/store'; +import { GlobalToaster, ManageGlobalToaster } from '../common/components/toasters'; +import { MlCapabilitiesProvider } from '../common/components/ml/permissions/ml_capabilities_provider'; -import { ApolloClientContext } from '../utils/apollo_context'; +import { ApolloClientContext } from '../common/utils/apollo_context'; +import { SecuritySubPlugins } from './types'; interface AppPluginRootComponentProps { apolloClient: AppApolloClient; history: History; store: Store; + subPluginRoutes: React.ReactElement[]; theme: any; // eslint-disable-line @typescript-eslint/no-explicit-any } const AppPluginRootComponent: React.FC = ({ + apolloClient, theme, store, - apolloClient, + subPluginRoutes, history, }) => ( @@ -51,7 +54,7 @@ const AppPluginRootComponent: React.FC = ({ - + @@ -64,11 +67,22 @@ const AppPluginRootComponent: React.FC = ({ const AppPluginRoot = memo(AppPluginRootComponent); -const StartAppComponent: FC = libs => { +interface StartAppComponent extends AppFrontendLibs { + subPlugins: SecuritySubPlugins; +} + +const StartAppComponent: FC = ({ subPlugins, ...libs }) => { + const { routes: subPluginRoutes, store: subPluginsStore } = subPlugins; const { i18n } = useKibana().services; const history = createHashHistory(); const libs$ = new BehaviorSubject(libs); - const store = createStore(createInitialState(), libs$.pipe(pluck('apolloClient'))); + + const store = createStore( + createInitialState(subPluginsStore.initialState), + subPluginsStore.reducer, + libs$.pipe(pluck('apolloClient')) + ); + const [darkMode] = useUiSetting$(DEFAULT_DARK_MODE); const theme = useMemo( () => ({ @@ -82,9 +96,10 @@ const StartAppComponent: FC = libs => { @@ -96,9 +111,10 @@ const StartApp = memo(StartAppComponent); interface SiemAppComponentProps { services: StartServices; + subPlugins: SecuritySubPlugins; } -const SiemAppComponent: React.FC = ({ services }) => ( +const SiemAppComponent: React.FC = ({ services, subPlugins }) => ( = ({ services }) => ( ...services, }} > - + ); diff --git a/x-pack/plugins/siem/public/pages/home/home_navigations.tsx b/x-pack/plugins/siem/public/app/home/home_navigations.tsx similarity index 93% rename from x-pack/plugins/siem/public/pages/home/home_navigations.tsx rename to x-pack/plugins/siem/public/app/home/home_navigations.tsx index 543469e2fddb7..2eed64a2b26e5 100644 --- a/x-pack/plugins/siem/public/pages/home/home_navigations.tsx +++ b/x-pack/plugins/siem/public/app/home/home_navigations.tsx @@ -11,9 +11,9 @@ import { getTimelinesUrl, getHostsUrl, getCaseUrl, -} from '../../components/link_to'; +} from '../../common/components/link_to'; import * as i18n from './translations'; -import { SiemPageName, SiemNavTab } from './types'; +import { SiemPageName, SiemNavTab } from '../types'; export const navTabs: SiemNavTab = { [SiemPageName.overview]: { diff --git a/x-pack/plugins/siem/public/pages/home/index.tsx b/x-pack/plugins/siem/public/app/home/index.tsx similarity index 56% rename from x-pack/plugins/siem/public/pages/home/index.tsx rename to x-pack/plugins/siem/public/app/home/index.tsx index a9e0962f16e6e..b6116ad4f0666 100644 --- a/x-pack/plugins/siem/public/pages/home/index.tsx +++ b/x-pack/plugins/siem/public/app/home/index.tsx @@ -8,28 +8,25 @@ import React, { useMemo } from 'react'; import { Redirect, Route, Switch } from 'react-router-dom'; import styled from 'styled-components'; -import { useThrottledResizeObserver } from '../../components/utils'; -import { DragDropContextWrapper } from '../../components/drag_and_drop/drag_drop_context_wrapper'; -import { Flyout } from '../../components/flyout'; -import { HeaderGlobal } from '../../components/header_global'; -import { HelpMenu } from '../../components/help_menu'; -import { LinkToPage } from '../../components/link_to'; -import { MlHostConditionalContainer } from '../../components/ml/conditional_links/ml_host_conditional_container'; -import { MlNetworkConditionalContainer } from '../../components/ml/conditional_links/ml_network_conditional_container'; -import { AutoSaveWarningMsg } from '../../components/timeline/auto_save_warning'; -import { UseUrlState } from '../../components/url_state'; -import { WithSource, indicesExistOrDataTemporarilyUnavailable } from '../../containers/source'; -import { SpyRoute } from '../../utils/route/spy_routes'; -import { useShowTimeline } from '../../utils/timeline/use_show_timeline'; +import { useThrottledResizeObserver } from '../../common/components/utils'; +import { DragDropContextWrapper } from '../../common/components/drag_and_drop/drag_drop_context_wrapper'; +import { Flyout } from '../../timelines/components/flyout'; +import { HeaderGlobal } from '../../common/components/header_global'; +import { HelpMenu } from '../../common/components/help_menu'; +import { LinkToPage } from '../../common/components/link_to'; +import { MlHostConditionalContainer } from '../../common/components/ml/conditional_links/ml_host_conditional_container'; +import { MlNetworkConditionalContainer } from '../../common/components/ml/conditional_links/ml_network_conditional_container'; +import { AutoSaveWarningMsg } from '../../timelines/components/timeline/auto_save_warning'; +import { UseUrlState } from '../../common/components/url_state'; +import { + WithSource, + indicesExistOrDataTemporarilyUnavailable, +} from '../../common/containers/source'; +import { SpyRoute } from '../../common/utils/route/spy_routes'; +import { useShowTimeline } from '../../common/utils/timeline/use_show_timeline'; import { NotFoundPage } from '../404'; -import { DetectionEngineContainer } from '../detection_engine'; -import { HostsContainer } from '../hosts'; -import { NetworkContainer } from '../network'; -import { Overview } from '../overview'; -import { Case } from '../case'; -import { Timelines } from '../timelines'; import { navTabs } from './home_navigations'; -import { SiemPageName } from './types'; +import { SiemPageName } from '../types'; const WrappedByAutoSizer = styled.div` height: 100%; @@ -54,7 +51,11 @@ const calculateFlyoutHeight = ({ windowHeight: number; }): number => Math.max(0, windowHeight - globalHeaderSize); -export const HomePage: React.FC = () => { +interface HomePageProps { + subPlugins: JSX.Element[]; +} + +export const HomePage: React.FC = ({ subPlugins }) => { const { ref: measureRef, height: windowHeight = 0 } = useThrottledResizeObserver(); const flyoutHeight = useMemo( () => @@ -89,27 +90,7 @@ export const HomePage: React.FC = () => { - } /> - } - /> - ( - - )} - /> - ( - - )} - /> - } - /> + {subPlugins} } /> { )} /> - - - } /> diff --git a/x-pack/plugins/siem/public/pages/home/translations.ts b/x-pack/plugins/siem/public/app/home/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/home/translations.ts rename to x-pack/plugins/siem/public/app/home/translations.ts diff --git a/x-pack/plugins/siem/public/app/index.tsx b/x-pack/plugins/siem/public/app/index.tsx index 7275a718564ef..d69be6e09e614 100644 --- a/x-pack/plugins/siem/public/app/index.tsx +++ b/x-pack/plugins/siem/public/app/index.tsx @@ -7,11 +7,17 @@ import React from 'react'; import { render, unmountComponentAtNode } from 'react-dom'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { AppMountParameters } from '../../../../../src/core/public'; import { StartServices } from '../plugin'; import { SiemApp } from './app'; +import { SecuritySubPlugins } from './types'; -export const renderApp = (services: StartServices, { element }: AppMountParameters) => { - render(, element); +export const renderApp = ( + services: StartServices, + { element }: AppMountParameters, + subPlugins: SecuritySubPlugins +) => { + render(, element); return () => unmountComponentAtNode(element); }; diff --git a/x-pack/plugins/siem/public/routes.tsx b/x-pack/plugins/siem/public/app/routes.tsx similarity index 69% rename from x-pack/plugins/siem/public/routes.tsx rename to x-pack/plugins/siem/public/app/routes.tsx index a989fa9873435..ed3565df5f507 100644 --- a/x-pack/plugins/siem/public/routes.tsx +++ b/x-pack/plugins/siem/public/app/routes.tsx @@ -8,20 +8,21 @@ import { History } from 'history'; import React, { FC, memo } from 'react'; import { Route, Router, Switch } from 'react-router-dom'; -import { NotFoundPage } from './pages/404'; -import { HomePage } from './pages/home'; -import { ManageRoutesSpy } from './utils/route/manage_spy_routes'; +import { NotFoundPage } from './404'; +import { HomePage } from './home'; +import { ManageRoutesSpy } from '../common/utils/route/manage_spy_routes'; interface RouterProps { history: History; + subPluginRoutes: JSX.Element[]; } -const PageRouterComponent: FC = ({ history }) => ( +const PageRouterComponent: FC = ({ history, subPluginRoutes }) => ( - + diff --git a/x-pack/plugins/siem/public/app/types.ts b/x-pack/plugins/siem/public/app/types.ts new file mode 100644 index 0000000000000..5fe4b5a8d8227 --- /dev/null +++ b/x-pack/plugins/siem/public/app/types.ts @@ -0,0 +1,61 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { Reducer, AnyAction } from 'redux'; + +import { NavTab } from '../common/components/navigation/types'; +import { HostsState } from '../hosts/store'; +import { NetworkState } from '../network/store'; +import { TimelineState } from '../timelines/store/timeline/types'; + +export enum SiemPageName { + overview = 'overview', + hosts = 'hosts', + network = 'network', + detections = 'detections', + timelines = 'timelines', + case = 'case', +} + +export type SiemNavTabKey = + | SiemPageName.overview + | SiemPageName.hosts + | SiemPageName.network + | SiemPageName.detections + | SiemPageName.timelines + | SiemPageName.case; + +export type SiemNavTab = Record; + +export interface SecuritySubPluginStore { + initialState: Record; + reducer: Record>; +} + +export interface SecuritySubPlugin { + routes: React.ReactElement[]; +} + +type SecuritySubPluginKeyStore = 'hosts' | 'network' | 'timeline'; +export interface SecuritySubPluginWithStore + extends SecuritySubPlugin { + store: SecuritySubPluginStore; +} + +export interface SecuritySubPlugins extends SecuritySubPlugin { + store: { + initialState: { + hosts: HostsState; + network: NetworkState; + timeline: TimelineState; + }; + reducer: { + hosts: Reducer; + network: Reducer; + timeline: Reducer; + }; + }; +} diff --git a/x-pack/plugins/siem/public/pages/case/components/__mock__/form.ts b/x-pack/plugins/siem/public/cases/components/__mock__/form.ts similarity index 84% rename from x-pack/plugins/siem/public/pages/case/components/__mock__/form.ts rename to x-pack/plugins/siem/public/cases/components/__mock__/form.ts index 12946c3af06bd..96c1217577ff2 100644 --- a/x-pack/plugins/siem/public/pages/case/components/__mock__/form.ts +++ b/x-pack/plugins/siem/public/cases/components/__mock__/form.ts @@ -3,9 +3,9 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import { useForm } from '../../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks'; +import { useForm } from '../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form'; jest.mock( - '../../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form' + '../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form' ); export const mockFormHook = { isSubmitted: false, diff --git a/x-pack/plugins/siem/public/pages/case/components/__mock__/router.ts b/x-pack/plugins/siem/public/cases/components/__mock__/router.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/case/components/__mock__/router.ts rename to x-pack/plugins/siem/public/cases/components/__mock__/router.ts diff --git a/x-pack/plugins/siem/public/pages/case/components/add_comment/index.test.tsx b/x-pack/plugins/siem/public/cases/components/add_comment/index.test.tsx similarity index 85% rename from x-pack/plugins/siem/public/pages/case/components/add_comment/index.test.tsx rename to x-pack/plugins/siem/public/cases/components/add_comment/index.test.tsx index 7ba8ec9666253..ab61930cd841b 100644 --- a/x-pack/plugins/siem/public/pages/case/components/add_comment/index.test.tsx +++ b/x-pack/plugins/siem/public/cases/components/add_comment/index.test.tsx @@ -7,20 +7,22 @@ import React from 'react'; import { mount } from 'enzyme'; -import { AddComment } from './'; -import { TestProviders } from '../../../../mock'; +import { AddComment } from '.'; +import { TestProviders } from '../../../common/mock'; import { getFormMock } from '../__mock__/form'; import { Router, routeData, mockHistory, mockLocation } from '../__mock__/router'; -import { useInsertTimeline } from '../../../../components/timeline/insert_timeline_popover/use_insert_timeline'; -import { usePostComment } from '../../../../containers/case/use_post_comment'; -import { useForm } from '../../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form'; -import { wait } from '../../../../lib/helpers'; +import { useInsertTimeline } from '../../../timelines/components/timeline/insert_timeline_popover/use_insert_timeline'; +import { usePostComment } from '../../containers/use_post_comment'; +import { useForm } from '../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form'; +import { wait } from '../../../common/lib/helpers'; + jest.mock( - '../../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form' + '../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form' ); -jest.mock('../../../../components/timeline/insert_timeline_popover/use_insert_timeline'); -jest.mock('../../../../containers/case/use_post_comment'); + +jest.mock('../../../timelines/components/timeline/insert_timeline_popover/use_insert_timeline'); +jest.mock('../../containers/use_post_comment'); export const useFormMock = useForm as jest.Mock; diff --git a/x-pack/plugins/siem/public/pages/case/components/add_comment/index.tsx b/x-pack/plugins/siem/public/cases/components/add_comment/index.tsx similarity index 83% rename from x-pack/plugins/siem/public/pages/case/components/add_comment/index.tsx rename to x-pack/plugins/siem/public/cases/components/add_comment/index.tsx index aa987b277da06..277352c39df65 100644 --- a/x-pack/plugins/siem/public/pages/case/components/add_comment/index.tsx +++ b/x-pack/plugins/siem/public/cases/components/add_comment/index.tsx @@ -8,15 +8,15 @@ import { EuiButton, EuiLoadingSpinner } from '@elastic/eui'; import React, { useCallback, useEffect } from 'react'; import styled from 'styled-components'; -import { CommentRequest } from '../../../../../../case/common/api'; -import { usePostComment } from '../../../../containers/case/use_post_comment'; -import { Case } from '../../../../containers/case/types'; -import { MarkdownEditorForm } from '../../../../components/markdown_editor/form'; -import { InsertTimelinePopover } from '../../../../components/timeline/insert_timeline_popover'; -import { useInsertTimeline } from '../../../../components/timeline/insert_timeline_popover/use_insert_timeline'; -import { Form, useForm, UseField } from '../../../../shared_imports'; +import { CommentRequest } from '../../../../../case/common/api'; +import { usePostComment } from '../../containers/use_post_comment'; +import { Case } from '../../containers/types'; +import { MarkdownEditorForm } from '../../../common/components/markdown_editor/form'; +import { InsertTimelinePopover } from '../../../timelines/components/timeline/insert_timeline_popover'; +import { useInsertTimeline } from '../../../timelines/components/timeline/insert_timeline_popover/use_insert_timeline'; +import { Form, useForm, UseField } from '../../../shared_imports'; -import * as i18n from '../../translations'; +import * as i18n from './translations'; import { schema } from './schema'; const MySpinner = styled(EuiLoadingSpinner)` diff --git a/x-pack/plugins/siem/public/pages/case/components/add_comment/schema.tsx b/x-pack/plugins/siem/public/cases/components/add_comment/schema.tsx similarity index 80% rename from x-pack/plugins/siem/public/pages/case/components/add_comment/schema.tsx rename to x-pack/plugins/siem/public/cases/components/add_comment/schema.tsx index ad73fd71b8e11..eb11357cd7ce9 100644 --- a/x-pack/plugins/siem/public/pages/case/components/add_comment/schema.tsx +++ b/x-pack/plugins/siem/public/cases/components/add_comment/schema.tsx @@ -4,9 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ -import { CommentRequest } from '../../../../../../case/common/api'; -import { FIELD_TYPES, fieldValidators, FormSchema } from '../../../../shared_imports'; -import * as i18n from '../../translations'; +import { CommentRequest } from '../../../../../case/common/api'; +import { FIELD_TYPES, fieldValidators, FormSchema } from '../../../shared_imports'; +import * as i18n from './translations'; const { emptyField } = fieldValidators; diff --git a/x-pack/plugins/siem/public/components/page/hosts/index.tsx b/x-pack/plugins/siem/public/cases/components/add_comment/translations.ts similarity index 62% rename from x-pack/plugins/siem/public/components/page/hosts/index.tsx rename to x-pack/plugins/siem/public/cases/components/add_comment/translations.ts index 9b3f36faa065d..704b8db48c1d3 100644 --- a/x-pack/plugins/siem/public/components/page/hosts/index.tsx +++ b/x-pack/plugins/siem/public/cases/components/add_comment/translations.ts @@ -4,7 +4,4 @@ * you may not use this file except in compliance with the Elastic License. */ -export * from './authentications_table'; -export * from './hosts_table'; -export * from './uncommon_process_table'; -export * from './kpi_hosts'; +export * from '../../translations'; diff --git a/x-pack/plugins/siem/public/pages/case/components/all_cases/actions.tsx b/x-pack/plugins/siem/public/cases/components/all_cases/actions.tsx similarity index 92% rename from x-pack/plugins/siem/public/pages/case/components/all_cases/actions.tsx rename to x-pack/plugins/siem/public/cases/components/all_cases/actions.tsx index 01b501bf6cf07..9f7e2e73c5bbc 100644 --- a/x-pack/plugins/siem/public/pages/case/components/all_cases/actions.tsx +++ b/x-pack/plugins/siem/public/cases/components/all_cases/actions.tsx @@ -5,10 +5,10 @@ */ import { DefaultItemIconButtonAction } from '@elastic/eui/src/components/basic_table/action_types'; import { Dispatch } from 'react'; -import { Case } from '../../../../containers/case/types'; +import { Case } from '../../containers/types'; import * as i18n from './translations'; -import { UpdateCase } from '../../../../containers/case/use_get_cases'; +import { UpdateCase } from '../../containers/use_get_cases'; interface GetActions { caseStatus: string; diff --git a/x-pack/plugins/siem/public/pages/case/components/all_cases/columns.test.tsx b/x-pack/plugins/siem/public/cases/components/all_cases/columns.test.tsx similarity index 94% rename from x-pack/plugins/siem/public/pages/case/components/all_cases/columns.test.tsx rename to x-pack/plugins/siem/public/cases/components/all_cases/columns.test.tsx index 2a06fa6eb51ac..8316823591f3f 100644 --- a/x-pack/plugins/siem/public/pages/case/components/all_cases/columns.test.tsx +++ b/x-pack/plugins/siem/public/cases/components/all_cases/columns.test.tsx @@ -9,7 +9,7 @@ import { mount } from 'enzyme'; import { ExternalServiceColumn } from './columns'; -import { useGetCasesMockState } from '../../../../containers/case/mock'; +import { useGetCasesMockState } from '../../containers/mock'; describe('ExternalServiceColumn ', () => { it('Not pushed render', () => { diff --git a/x-pack/plugins/siem/public/pages/case/components/all_cases/columns.tsx b/x-pack/plugins/siem/public/cases/components/all_cases/columns.tsx similarity index 94% rename from x-pack/plugins/siem/public/pages/case/components/all_cases/columns.tsx rename to x-pack/plugins/siem/public/cases/components/all_cases/columns.tsx index 9a0460009ffac..ddd860a8720c5 100644 --- a/x-pack/plugins/siem/public/pages/case/components/all_cases/columns.tsx +++ b/x-pack/plugins/siem/public/cases/components/all_cases/columns.tsx @@ -14,11 +14,11 @@ import { } from '@elastic/eui'; import styled from 'styled-components'; import { DefaultItemIconButtonAction } from '@elastic/eui/src/components/basic_table/action_types'; -import { getEmptyTagValue } from '../../../../components/empty_value'; -import { Case } from '../../../../containers/case/types'; -import { FormattedRelativePreferenceDate } from '../../../../components/formatted_date'; -import { CaseDetailsLink } from '../../../../components/links'; -import { TruncatableText } from '../../../../components/truncatable_text'; +import { getEmptyTagValue } from '../../../common/components/empty_value'; +import { Case } from '../../containers/types'; +import { FormattedRelativePreferenceDate } from '../../../common/components/formatted_date'; +import { CaseDetailsLink } from '../../../common/components/links'; +import { TruncatableText } from '../../../common/components/truncatable_text'; import * as i18n from './translations'; export type CasesColumns = diff --git a/x-pack/plugins/siem/public/pages/case/components/all_cases/index.test.tsx b/x-pack/plugins/siem/public/cases/components/all_cases/index.test.tsx similarity index 92% rename from x-pack/plugins/siem/public/pages/case/components/all_cases/index.test.tsx rename to x-pack/plugins/siem/public/cases/components/all_cases/index.test.tsx index eb5bca6cc57ff..1dbd008277b34 100644 --- a/x-pack/plugins/siem/public/pages/case/components/all_cases/index.test.tsx +++ b/x-pack/plugins/siem/public/cases/components/all_cases/index.test.tsx @@ -7,21 +7,23 @@ import React from 'react'; import { mount } from 'enzyme'; import moment from 'moment-timezone'; -import { AllCases } from './'; -import { TestProviders } from '../../../../mock'; -import { useGetCasesMockState } from '../../../../containers/case/mock'; +import { AllCases } from '.'; +import { TestProviders } from '../../../common/mock'; +import { useGetCasesMockState } from '../../containers/mock'; import * as i18n from './translations'; -import { getEmptyTagValue } from '../../../../components/empty_value'; -import { useDeleteCases } from '../../../../containers/case/use_delete_cases'; -import { useGetCases } from '../../../../containers/case/use_get_cases'; -import { useGetCasesStatus } from '../../../../containers/case/use_get_cases_status'; -import { useUpdateCases } from '../../../../containers/case/use_bulk_update_case'; +import { getEmptyTagValue } from '../../../common/components/empty_value'; +import { useDeleteCases } from '../../containers/use_delete_cases'; +import { useGetCases } from '../../containers/use_get_cases'; +import { useGetCasesStatus } from '../../containers/use_get_cases_status'; +import { useUpdateCases } from '../../containers/use_bulk_update_case'; import { getCasesColumns } from './columns'; -jest.mock('../../../../containers/case/use_bulk_update_case'); -jest.mock('../../../../containers/case/use_delete_cases'); -jest.mock('../../../../containers/case/use_get_cases'); -jest.mock('../../../../containers/case/use_get_cases_status'); + +jest.mock('../../containers/use_bulk_update_case'); +jest.mock('../../containers/use_delete_cases'); +jest.mock('../../containers/use_get_cases'); +jest.mock('../../containers/use_get_cases_status'); + const useDeleteCasesMock = useDeleteCases as jest.Mock; const useGetCasesMock = useGetCases as jest.Mock; const useGetCasesStatusMock = useGetCasesStatus as jest.Mock; diff --git a/x-pack/plugins/siem/public/pages/case/components/all_cases/index.tsx b/x-pack/plugins/siem/public/cases/components/all_cases/index.tsx similarity index 94% rename from x-pack/plugins/siem/public/pages/case/components/all_cases/index.tsx rename to x-pack/plugins/siem/public/cases/components/all_cases/index.tsx index 9dd90074a2e7b..e86953c84336c 100644 --- a/x-pack/plugins/siem/public/pages/case/components/all_cases/index.tsx +++ b/x-pack/plugins/siem/public/cases/components/all_cases/index.tsx @@ -22,31 +22,31 @@ import styled, { css } from 'styled-components'; import * as i18n from './translations'; import { getCasesColumns } from './columns'; -import { Case, DeleteCase, FilterOptions, SortFieldCase } from '../../../../containers/case/types'; -import { useGetCases, UpdateCase } from '../../../../containers/case/use_get_cases'; -import { useGetCasesStatus } from '../../../../containers/case/use_get_cases_status'; -import { useDeleteCases } from '../../../../containers/case/use_delete_cases'; -import { EuiBasicTableOnChange } from '../../../detection_engine/rules/types'; -import { useGetUrlSearch } from '../../../../components/navigation/use_get_url_search'; -import { Panel } from '../../../../components/panel'; +import { Case, DeleteCase, FilterOptions, SortFieldCase } from '../../containers/types'; +import { useGetCases, UpdateCase } from '../../containers/use_get_cases'; +import { useGetCasesStatus } from '../../containers/use_get_cases_status'; +import { useDeleteCases } from '../../containers/use_delete_cases'; +import { EuiBasicTableOnChange } from '../../../alerts/pages/detection_engine/rules/types'; +import { useGetUrlSearch } from '../../../common/components/navigation/use_get_url_search'; +import { Panel } from '../../../common/components/panel'; import { UtilityBar, UtilityBarAction, UtilityBarGroup, UtilityBarSection, UtilityBarText, -} from '../../../../components/utility_bar'; -import { getCreateCaseUrl } from '../../../../components/link_to'; +} from '../../../common/components/utility_bar'; +import { getCreateCaseUrl } from '../../../common/components/link_to'; import { getBulkItems } from '../bulk_actions'; import { CaseHeaderPage } from '../case_header_page'; import { ConfirmDeleteCaseModal } from '../confirm_delete_case'; import { OpenClosedStats } from '../open_closed_stats'; -import { navTabs } from '../../../home/home_navigations'; +import { navTabs } from '../../../app/home/home_navigations'; import { getActions } from './actions'; import { CasesTableFilters } from './table_filters'; -import { useUpdateCases } from '../../../../containers/case/use_bulk_update_case'; -import { useGetActionLicense } from '../../../../containers/case/use_get_action_license'; +import { useUpdateCases } from '../../containers/use_bulk_update_case'; +import { useGetActionLicense } from '../../containers/use_get_action_license'; import { getActionLicenseError } from '../use_push_to_service/helpers'; import { CaseCallOut } from '../callout'; import { ConfigureCaseButton } from '../configure_cases/button'; diff --git a/x-pack/plugins/siem/public/pages/case/components/all_cases/table_filters.test.tsx b/x-pack/plugins/siem/public/cases/components/all_cases/table_filters.test.tsx similarity index 90% rename from x-pack/plugins/siem/public/pages/case/components/all_cases/table_filters.test.tsx rename to x-pack/plugins/siem/public/cases/components/all_cases/table_filters.test.tsx index 21dcc9732440d..05702e931fc25 100644 --- a/x-pack/plugins/siem/public/pages/case/components/all_cases/table_filters.test.tsx +++ b/x-pack/plugins/siem/public/cases/components/all_cases/table_filters.test.tsx @@ -8,14 +8,14 @@ import React from 'react'; import { mount } from 'enzyme'; import { CasesTableFilters } from './table_filters'; -import { TestProviders } from '../../../../mock'; +import { TestProviders } from '../../../common/mock'; -import { useGetTags } from '../../../../containers/case/use_get_tags'; -import { useGetReporters } from '../../../../containers/case/use_get_reporters'; -import { DEFAULT_FILTER_OPTIONS } from '../../../../containers/case/use_get_cases'; -jest.mock('../../../../components/timeline/insert_timeline_popover/use_insert_timeline'); -jest.mock('../../../../containers/case/use_get_reporters'); -jest.mock('../../../../containers/case/use_get_tags'); +import { useGetTags } from '../../containers/use_get_tags'; +import { useGetReporters } from '../../containers/use_get_reporters'; +import { DEFAULT_FILTER_OPTIONS } from '../../containers/use_get_cases'; +jest.mock('../../../timelines/components/timeline/insert_timeline_popover/use_insert_timeline'); +jest.mock('../../containers/use_get_reporters'); +jest.mock('../../containers/use_get_tags'); const onFilterChanged = jest.fn(); const fetchReporters = jest.fn(); diff --git a/x-pack/plugins/siem/public/pages/case/components/all_cases/table_filters.tsx b/x-pack/plugins/siem/public/cases/components/all_cases/table_filters.tsx similarity index 94% rename from x-pack/plugins/siem/public/pages/case/components/all_cases/table_filters.tsx rename to x-pack/plugins/siem/public/cases/components/all_cases/table_filters.tsx index 901fb133753e8..55713c201743a 100644 --- a/x-pack/plugins/siem/public/pages/case/components/all_cases/table_filters.tsx +++ b/x-pack/plugins/siem/public/cases/components/all_cases/table_filters.tsx @@ -15,10 +15,10 @@ import { } from '@elastic/eui'; import * as i18n from './translations'; -import { FilterOptions } from '../../../../containers/case/types'; -import { useGetTags } from '../../../../containers/case/use_get_tags'; -import { useGetReporters } from '../../../../containers/case/use_get_reporters'; -import { FilterPopover } from '../../../../components/filter_popover'; +import { FilterOptions } from '../../containers/types'; +import { useGetTags } from '../../containers/use_get_tags'; +import { useGetReporters } from '../../containers/use_get_reporters'; +import { FilterPopover } from '../filter_popover'; interface CasesTableFiltersProps { countClosedCases: number | null; diff --git a/x-pack/plugins/siem/public/pages/case/components/all_cases/translations.ts b/x-pack/plugins/siem/public/cases/components/all_cases/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/case/components/all_cases/translations.ts rename to x-pack/plugins/siem/public/cases/components/all_cases/translations.ts diff --git a/x-pack/plugins/siem/public/pages/case/components/bulk_actions/index.tsx b/x-pack/plugins/siem/public/cases/components/bulk_actions/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/case/components/bulk_actions/index.tsx rename to x-pack/plugins/siem/public/cases/components/bulk_actions/index.tsx diff --git a/x-pack/plugins/siem/public/pages/case/components/bulk_actions/translations.ts b/x-pack/plugins/siem/public/cases/components/bulk_actions/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/case/components/bulk_actions/translations.ts rename to x-pack/plugins/siem/public/cases/components/bulk_actions/translations.ts diff --git a/x-pack/plugins/siem/public/pages/case/components/callout/helpers.tsx b/x-pack/plugins/siem/public/cases/components/callout/helpers.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/case/components/callout/helpers.tsx rename to x-pack/plugins/siem/public/cases/components/callout/helpers.tsx diff --git a/x-pack/plugins/siem/public/pages/case/components/callout/index.test.tsx b/x-pack/plugins/siem/public/cases/components/callout/index.test.tsx similarity index 98% rename from x-pack/plugins/siem/public/pages/case/components/callout/index.test.tsx rename to x-pack/plugins/siem/public/cases/components/callout/index.test.tsx index 126ea13e96af6..0ab90d8a73126 100644 --- a/x-pack/plugins/siem/public/pages/case/components/callout/index.test.tsx +++ b/x-pack/plugins/siem/public/cases/components/callout/index.test.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { mount } from 'enzyme'; -import { CaseCallOut } from './'; +import { CaseCallOut } from '.'; const defaultProps = { title: 'hey title', diff --git a/x-pack/plugins/siem/public/pages/case/components/callout/index.tsx b/x-pack/plugins/siem/public/cases/components/callout/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/case/components/callout/index.tsx rename to x-pack/plugins/siem/public/cases/components/callout/index.tsx diff --git a/x-pack/plugins/siem/public/pages/case/components/callout/translations.ts b/x-pack/plugins/siem/public/cases/components/callout/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/case/components/callout/translations.ts rename to x-pack/plugins/siem/public/cases/components/callout/translations.ts diff --git a/x-pack/plugins/siem/public/pages/case/components/case_header_page/index.tsx b/x-pack/plugins/siem/public/cases/components/case_header_page/index.tsx similarity index 87% rename from x-pack/plugins/siem/public/pages/case/components/case_header_page/index.tsx rename to x-pack/plugins/siem/public/cases/components/case_header_page/index.tsx index ae2664ca6e839..4c7cfabe757cf 100644 --- a/x-pack/plugins/siem/public/pages/case/components/case_header_page/index.tsx +++ b/x-pack/plugins/siem/public/cases/components/case_header_page/index.tsx @@ -6,7 +6,7 @@ import React from 'react'; -import { HeaderPage, HeaderPageProps } from '../../../../components/header_page'; +import { HeaderPage, HeaderPageProps } from '../../../common/components/header_page'; import * as i18n from './translations'; const CaseHeaderPageComponent: React.FC = props => ; diff --git a/x-pack/plugins/siem/public/pages/case/components/case_header_page/translations.ts b/x-pack/plugins/siem/public/cases/components/case_header_page/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/case/components/case_header_page/translations.ts rename to x-pack/plugins/siem/public/cases/components/case_header_page/translations.ts diff --git a/x-pack/plugins/siem/public/pages/case/components/case_status/index.tsx b/x-pack/plugins/siem/public/cases/components/case_status/index.tsx similarity index 93% rename from x-pack/plugins/siem/public/pages/case/components/case_status/index.tsx rename to x-pack/plugins/siem/public/cases/components/case_status/index.tsx index f48d9a68ffaf0..a37c9052c2ff3 100644 --- a/x-pack/plugins/siem/public/pages/case/components/case_status/index.tsx +++ b/x-pack/plugins/siem/public/cases/components/case_status/index.tsx @@ -17,10 +17,10 @@ import { EuiFlexItem, } from '@elastic/eui'; import * as i18n from '../case_view/translations'; -import { FormattedRelativePreferenceDate } from '../../../../components/formatted_date'; +import { FormattedRelativePreferenceDate } from '../../../common/components/formatted_date'; import { CaseViewActions } from '../case_view/actions'; -import { Case } from '../../../../containers/case/types'; -import { CaseService } from '../../../../containers/case/use_get_case_user_actions'; +import { Case } from '../../containers/types'; +import { CaseService } from '../../containers/use_get_case_user_actions'; const MyDescriptionList = styled(EuiDescriptionList)` ${({ theme }) => css` diff --git a/x-pack/plugins/siem/public/pages/case/components/case_view/actions.test.tsx b/x-pack/plugins/siem/public/cases/components/case_view/actions.test.tsx similarity index 91% rename from x-pack/plugins/siem/public/pages/case/components/case_view/actions.test.tsx rename to x-pack/plugins/siem/public/cases/components/case_view/actions.test.tsx index 24fbd59b3282b..1f8d3230f42a8 100644 --- a/x-pack/plugins/siem/public/pages/case/components/case_view/actions.test.tsx +++ b/x-pack/plugins/siem/public/cases/components/case_view/actions.test.tsx @@ -7,12 +7,12 @@ import React from 'react'; import { mount } from 'enzyme'; -import { useDeleteCases } from '../../../../containers/case/use_delete_cases'; -import { TestProviders } from '../../../../mock'; -import { basicCase, basicPush } from '../../../../containers/case/mock'; +import { useDeleteCases } from '../../containers/use_delete_cases'; +import { TestProviders } from '../../../common/mock'; +import { basicCase, basicPush } from '../../containers/mock'; import { CaseViewActions } from './actions'; import * as i18n from './translations'; -jest.mock('../../../../containers/case/use_delete_cases'); +jest.mock('../../containers/use_delete_cases'); const useDeleteCasesMock = useDeleteCases as jest.Mock; describe('CaseView actions', () => { diff --git a/x-pack/plugins/siem/public/pages/case/components/case_view/actions.tsx b/x-pack/plugins/siem/public/cases/components/case_view/actions.tsx similarity index 88% rename from x-pack/plugins/siem/public/pages/case/components/case_view/actions.tsx rename to x-pack/plugins/siem/public/cases/components/case_view/actions.tsx index 4acdaef6ca51f..cd9318a355e3c 100644 --- a/x-pack/plugins/siem/public/pages/case/components/case_view/actions.tsx +++ b/x-pack/plugins/siem/public/cases/components/case_view/actions.tsx @@ -8,12 +8,12 @@ import { isEmpty } from 'lodash/fp'; import React, { useMemo } from 'react'; import { Redirect } from 'react-router-dom'; import * as i18n from './translations'; -import { useDeleteCases } from '../../../../containers/case/use_delete_cases'; +import { useDeleteCases } from '../../containers/use_delete_cases'; import { ConfirmDeleteCaseModal } from '../confirm_delete_case'; -import { SiemPageName } from '../../../home/types'; +import { SiemPageName } from '../../../app/types'; import { PropertyActions } from '../property_actions'; -import { Case } from '../../../../containers/case/types'; -import { CaseService } from '../../../../containers/case/use_get_case_user_actions'; +import { Case } from '../../containers/types'; +import { CaseService } from '../../containers/use_get_case_user_actions'; interface CaseViewActions { caseData: Case; diff --git a/x-pack/plugins/siem/public/pages/case/components/case_view/index.test.tsx b/x-pack/plugins/siem/public/cases/components/case_view/index.test.tsx similarity index 94% rename from x-pack/plugins/siem/public/pages/case/components/case_view/index.test.tsx rename to x-pack/plugins/siem/public/cases/components/case_view/index.test.tsx index a6e6b19a071ce..70d2dc97f3f45 100644 --- a/x-pack/plugins/siem/public/pages/case/components/case_view/index.test.tsx +++ b/x-pack/plugins/siem/public/cases/components/case_view/index.test.tsx @@ -8,17 +8,17 @@ import React from 'react'; import { mount } from 'enzyme'; import { Router, routeData, mockHistory, mockLocation } from '../__mock__/router'; -import { CaseComponent, CaseProps, CaseView } from './'; -import { basicCase, basicCaseClosed, caseUserActions } from '../../../../containers/case/mock'; -import { TestProviders } from '../../../../mock'; -import { useUpdateCase } from '../../../../containers/case/use_update_case'; -import { useGetCase } from '../../../../containers/case/use_get_case'; -import { useGetCaseUserActions } from '../../../../containers/case/use_get_case_user_actions'; -import { wait } from '../../../../lib/helpers'; +import { CaseComponent, CaseProps, CaseView } from '.'; +import { basicCase, basicCaseClosed, caseUserActions } from '../../containers/mock'; +import { TestProviders } from '../../../common/mock'; +import { useUpdateCase } from '../../containers/use_update_case'; +import { useGetCase } from '../../containers/use_get_case'; +import { useGetCaseUserActions } from '../../containers/use_get_case_user_actions'; +import { wait } from '../../../common/lib/helpers'; import { usePushToService } from '../use_push_to_service'; -jest.mock('../../../../containers/case/use_update_case'); -jest.mock('../../../../containers/case/use_get_case_user_actions'); -jest.mock('../../../../containers/case/use_get_case'); +jest.mock('../../containers/use_update_case'); +jest.mock('../../containers/use_get_case_user_actions'); +jest.mock('../../containers/use_get_case'); jest.mock('../use_push_to_service'); const useUpdateCaseMock = useUpdateCase as jest.Mock; const useGetCaseUserActionsMock = useGetCaseUserActions as jest.Mock; diff --git a/x-pack/plugins/siem/public/pages/case/components/case_view/index.tsx b/x-pack/plugins/siem/public/cases/components/case_view/index.tsx similarity index 92% rename from x-pack/plugins/siem/public/pages/case/components/case_view/index.tsx rename to x-pack/plugins/siem/public/cases/components/case_view/index.tsx index fed8ec8edbe8b..d02119580a75a 100644 --- a/x-pack/plugins/siem/public/pages/case/components/case_view/index.tsx +++ b/x-pack/plugins/siem/public/cases/components/case_view/index.tsx @@ -16,27 +16,27 @@ import React, { useCallback, useEffect, useMemo, useState } from 'react'; import styled from 'styled-components'; import * as i18n from './translations'; -import { Case } from '../../../../containers/case/types'; -import { getCaseUrl } from '../../../../components/link_to'; -import { HeaderPage } from '../../../../components/header_page'; -import { EditableTitle } from '../../../../components/header_page/editable_title'; +import { Case } from '../../containers/types'; +import { getCaseUrl } from '../../../common/components/link_to'; +import { HeaderPage } from '../../../common/components/header_page'; +import { EditableTitle } from '../../../common/components/header_page/editable_title'; import { TagList } from '../tag_list'; -import { useGetCase } from '../../../../containers/case/use_get_case'; +import { useGetCase } from '../../containers/use_get_case'; import { UserActionTree } from '../user_action_tree'; import { UserList } from '../user_list'; -import { useUpdateCase } from '../../../../containers/case/use_update_case'; -import { useGetUrlSearch } from '../../../../components/navigation/use_get_url_search'; -import { WrapperPage } from '../../../../components/wrapper_page'; -import { getTypedPayload } from '../../../../containers/case/utils'; +import { useUpdateCase } from '../../containers/use_update_case'; +import { useGetUrlSearch } from '../../../common/components/navigation/use_get_url_search'; +import { WrapperPage } from '../../../common/components/wrapper_page'; +import { getTypedPayload } from '../../containers/utils'; import { WhitePageWrapper } from '../wrappers'; -import { useBasePath } from '../../../../lib/kibana'; +import { useBasePath } from '../../../common/lib/kibana'; import { CaseStatus } from '../case_status'; -import { navTabs } from '../../../home/home_navigations'; -import { SpyRoute } from '../../../../utils/route/spy_routes'; -import { useGetCaseUserActions } from '../../../../containers/case/use_get_case_user_actions'; +import { navTabs } from '../../../app/home/home_navigations'; +import { SpyRoute } from '../../../common/utils/route/spy_routes'; +import { useGetCaseUserActions } from '../../containers/use_get_case_user_actions'; import { usePushToService } from '../use_push_to_service'; import { EditConnector } from '../edit_connector'; -import { useConnectors } from '../../../../containers/case/configure/use_connectors'; +import { useConnectors } from '../../containers/configure/use_connectors'; interface Props { caseId: string; diff --git a/x-pack/plugins/siem/public/pages/case/components/case_view/translations.ts b/x-pack/plugins/siem/public/cases/components/case_view/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/case/components/case_view/translations.ts rename to x-pack/plugins/siem/public/cases/components/case_view/translations.ts diff --git a/x-pack/plugins/siem/public/pages/case/components/configure_cases/__mock__/index.tsx b/x-pack/plugins/siem/public/cases/components/configure_cases/__mock__/index.tsx similarity index 70% rename from x-pack/plugins/siem/public/pages/case/components/configure_cases/__mock__/index.tsx rename to x-pack/plugins/siem/public/cases/components/configure_cases/__mock__/index.tsx index 0eccd8980ccd2..23c76953a6a0f 100644 --- a/x-pack/plugins/siem/public/pages/case/components/configure_cases/__mock__/index.tsx +++ b/x-pack/plugins/siem/public/cases/components/configure_cases/__mock__/index.tsx @@ -4,17 +4,18 @@ * you may not use this file except in compliance with the Elastic License. */ -import { Connector } from '../../../../../containers/case/configure/types'; -import { ReturnConnectors } from '../../../../../containers/case/configure/use_connectors'; -import { connectorsMock } from '../../../../../containers/case/configure/mock'; -import { ReturnUseCaseConfigure } from '../../../../../containers/case/configure/use_configure'; -import { createUseKibanaMock } from '../../../../../mock/kibana_react'; -export { mapping } from '../../../../../containers/case/configure/mock'; +import { Connector } from '../../../containers/configure/types'; +import { ReturnConnectors } from '../../../containers/configure/use_connectors'; +import { connectorsMock } from '../../../containers/configure/mock'; +import { ReturnUseCaseConfigure } from '../../../containers/configure/use_configure'; +import { createUseKibanaMock } from '../../../../common/mock/kibana_react'; +export { mapping } from '../../../containers/configure/mock'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { actionTypeRegistryMock } from '../../../../../../../triggers_actions_ui/public/application/action_type_registry.mock'; +import { actionTypeRegistryMock } from '../../../../../../triggers_actions_ui/public/application/action_type_registry.mock'; export const connectors: Connector[] = connectorsMock; +// x - pack / plugins / triggers_actions_ui; export const searchURL = '?timerange=(global:(linkTo:!(),timerange:(from:1585487656371,fromStr:now-24h,kind:relative,to:1585574056371,toStr:now)),timeline:(linkTo:!(),timerange:(from:1585227005527,kind:absolute,to:1585313405527)))'; diff --git a/x-pack/plugins/siem/public/pages/case/components/configure_cases/button.test.tsx b/x-pack/plugins/siem/public/cases/components/configure_cases/button.test.tsx similarity index 98% rename from x-pack/plugins/siem/public/pages/case/components/configure_cases/button.test.tsx rename to x-pack/plugins/siem/public/cases/components/configure_cases/button.test.tsx index cf52fef94ed17..550b9bd9896a3 100644 --- a/x-pack/plugins/siem/public/pages/case/components/configure_cases/button.test.tsx +++ b/x-pack/plugins/siem/public/cases/components/configure_cases/button.test.tsx @@ -9,7 +9,7 @@ import { ReactWrapper, mount } from 'enzyme'; import { EuiText } from '@elastic/eui'; import { ConfigureCaseButton, ConfigureCaseButtonProps } from './button'; -import { TestProviders } from '../../../../mock'; +import { TestProviders } from '../../../common/mock'; import { searchURL } from './__mock__'; describe('Configuration button', () => { diff --git a/x-pack/plugins/siem/public/pages/case/components/configure_cases/button.tsx b/x-pack/plugins/siem/public/cases/components/configure_cases/button.tsx similarity index 94% rename from x-pack/plugins/siem/public/pages/case/components/configure_cases/button.tsx rename to x-pack/plugins/siem/public/cases/components/configure_cases/button.tsx index 844ffea28415f..a6d78d4a2a620 100644 --- a/x-pack/plugins/siem/public/pages/case/components/configure_cases/button.tsx +++ b/x-pack/plugins/siem/public/cases/components/configure_cases/button.tsx @@ -6,7 +6,7 @@ import { EuiButton, EuiToolTip } from '@elastic/eui'; import React, { memo, useMemo } from 'react'; -import { getConfigureCasesUrl } from '../../../../components/link_to'; +import { getConfigureCasesUrl } from '../../../common/components/link_to'; export interface ConfigureCaseButtonProps { label: string; diff --git a/x-pack/plugins/siem/public/pages/case/components/configure_cases/closure_options.test.tsx b/x-pack/plugins/siem/public/cases/components/configure_cases/closure_options.test.tsx similarity index 97% rename from x-pack/plugins/siem/public/pages/case/components/configure_cases/closure_options.test.tsx rename to x-pack/plugins/siem/public/cases/components/configure_cases/closure_options.test.tsx index eaef524b13da8..6192fd0ee9fff 100644 --- a/x-pack/plugins/siem/public/pages/case/components/configure_cases/closure_options.test.tsx +++ b/x-pack/plugins/siem/public/cases/components/configure_cases/closure_options.test.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { mount, ReactWrapper } from 'enzyme'; import { ClosureOptions, ClosureOptionsProps } from './closure_options'; -import { TestProviders } from '../../../../mock'; +import { TestProviders } from '../../../common/mock'; import { ClosureOptionsRadio } from './closure_options_radio'; describe('ClosureOptions', () => { diff --git a/x-pack/plugins/siem/public/pages/case/components/configure_cases/closure_options.tsx b/x-pack/plugins/siem/public/cases/components/configure_cases/closure_options.tsx similarity index 95% rename from x-pack/plugins/siem/public/pages/case/components/configure_cases/closure_options.tsx rename to x-pack/plugins/siem/public/cases/components/configure_cases/closure_options.tsx index 6fa97818dd0ce..b845b423449ea 100644 --- a/x-pack/plugins/siem/public/pages/case/components/configure_cases/closure_options.tsx +++ b/x-pack/plugins/siem/public/cases/components/configure_cases/closure_options.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { EuiDescribedFormGroup, EuiFormRow } from '@elastic/eui'; -import { ClosureType } from '../../../../containers/case/configure/types'; +import { ClosureType } from '../../containers/configure/types'; import { ClosureOptionsRadio } from './closure_options_radio'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/pages/case/components/configure_cases/closure_options_radio.test.tsx b/x-pack/plugins/siem/public/cases/components/configure_cases/closure_options_radio.test.tsx similarity index 97% rename from x-pack/plugins/siem/public/pages/case/components/configure_cases/closure_options_radio.test.tsx rename to x-pack/plugins/siem/public/cases/components/configure_cases/closure_options_radio.test.tsx index f2ef2c2d55c28..dae2204bc4665 100644 --- a/x-pack/plugins/siem/public/pages/case/components/configure_cases/closure_options_radio.test.tsx +++ b/x-pack/plugins/siem/public/cases/components/configure_cases/closure_options_radio.test.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { ReactWrapper, mount } from 'enzyme'; import { ClosureOptionsRadio, ClosureOptionsRadioComponentProps } from './closure_options_radio'; -import { TestProviders } from '../../../../mock'; +import { TestProviders } from '../../../common/mock'; describe('ClosureOptionsRadio', () => { let wrapper: ReactWrapper; diff --git a/x-pack/plugins/siem/public/pages/case/components/configure_cases/closure_options_radio.tsx b/x-pack/plugins/siem/public/cases/components/configure_cases/closure_options_radio.tsx similarity index 95% rename from x-pack/plugins/siem/public/pages/case/components/configure_cases/closure_options_radio.tsx rename to x-pack/plugins/siem/public/cases/components/configure_cases/closure_options_radio.tsx index d2cdb7ecda7ba..673c8fbcc70d0 100644 --- a/x-pack/plugins/siem/public/pages/case/components/configure_cases/closure_options_radio.tsx +++ b/x-pack/plugins/siem/public/cases/components/configure_cases/closure_options_radio.tsx @@ -7,7 +7,7 @@ import React, { ReactNode, useCallback } from 'react'; import { EuiRadioGroup } from '@elastic/eui'; -import { ClosureType } from '../../../../containers/case/configure/types'; +import { ClosureType } from '../../containers/configure/types'; import * as i18n from './translations'; interface ClosureRadios { diff --git a/x-pack/plugins/siem/public/pages/case/components/configure_cases/connectors.test.tsx b/x-pack/plugins/siem/public/cases/components/configure_cases/connectors.test.tsx similarity index 98% rename from x-pack/plugins/siem/public/pages/case/components/configure_cases/connectors.test.tsx rename to x-pack/plugins/siem/public/cases/components/configure_cases/connectors.test.tsx index b0271f6849ac5..41cd3e549415d 100644 --- a/x-pack/plugins/siem/public/pages/case/components/configure_cases/connectors.test.tsx +++ b/x-pack/plugins/siem/public/cases/components/configure_cases/connectors.test.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { mount, ReactWrapper } from 'enzyme'; import { Connectors, Props } from './connectors'; -import { TestProviders } from '../../../../mock'; +import { TestProviders } from '../../../common/mock'; import { ConnectorsDropdown } from './connectors_dropdown'; import { connectors } from './__mock__'; diff --git a/x-pack/plugins/siem/public/pages/case/components/configure_cases/connectors.tsx b/x-pack/plugins/siem/public/cases/components/configure_cases/connectors.tsx similarity index 97% rename from x-pack/plugins/siem/public/pages/case/components/configure_cases/connectors.tsx rename to x-pack/plugins/siem/public/cases/components/configure_cases/connectors.tsx index 1b1439d3bac43..3916ce297a0a4 100644 --- a/x-pack/plugins/siem/public/pages/case/components/configure_cases/connectors.tsx +++ b/x-pack/plugins/siem/public/cases/components/configure_cases/connectors.tsx @@ -19,7 +19,7 @@ import styled from 'styled-components'; import { ConnectorsDropdown } from './connectors_dropdown'; import * as i18n from './translations'; -import { Connector } from '../../../../containers/case/configure/types'; +import { Connector } from '../../containers/configure/types'; const EuiFormRowExtended = styled(EuiFormRow)` .euiFormRow__labelWrapper { diff --git a/x-pack/plugins/siem/public/pages/case/components/configure_cases/connectors_dropdown.test.tsx b/x-pack/plugins/siem/public/cases/components/configure_cases/connectors_dropdown.test.tsx similarity index 97% rename from x-pack/plugins/siem/public/pages/case/components/configure_cases/connectors_dropdown.test.tsx rename to x-pack/plugins/siem/public/cases/components/configure_cases/connectors_dropdown.test.tsx index 6abe4f1ac00ad..da20078dde0d0 100644 --- a/x-pack/plugins/siem/public/pages/case/components/configure_cases/connectors_dropdown.test.tsx +++ b/x-pack/plugins/siem/public/cases/components/configure_cases/connectors_dropdown.test.tsx @@ -9,7 +9,7 @@ import { mount, ReactWrapper } from 'enzyme'; import { EuiSuperSelect } from '@elastic/eui'; import { ConnectorsDropdown, Props } from './connectors_dropdown'; -import { TestProviders } from '../../../../mock'; +import { TestProviders } from '../../../common/mock'; import { connectors } from './__mock__'; describe('ConnectorsDropdown', () => { diff --git a/x-pack/plugins/siem/public/pages/case/components/configure_cases/connectors_dropdown.tsx b/x-pack/plugins/siem/public/cases/components/configure_cases/connectors_dropdown.tsx similarity index 94% rename from x-pack/plugins/siem/public/pages/case/components/configure_cases/connectors_dropdown.tsx rename to x-pack/plugins/siem/public/cases/components/configure_cases/connectors_dropdown.tsx index 2f73c8c5dba05..b2b2edb04bd29 100644 --- a/x-pack/plugins/siem/public/pages/case/components/configure_cases/connectors_dropdown.tsx +++ b/x-pack/plugins/siem/public/cases/components/configure_cases/connectors_dropdown.tsx @@ -8,8 +8,8 @@ import React, { useMemo } from 'react'; import { EuiFlexGroup, EuiFlexItem, EuiIcon, EuiSuperSelect } from '@elastic/eui'; import styled from 'styled-components'; -import { Connector } from '../../../../containers/case/configure/types'; -import { connectorsConfiguration } from '../../../../lib/connectors/config'; +import { Connector } from '../../containers/configure/types'; +import { connectorsConfiguration } from '../../../common/lib/connectors/config'; import * as i18n from './translations'; export interface Props { diff --git a/x-pack/plugins/siem/public/pages/case/components/configure_cases/field_mapping.test.tsx b/x-pack/plugins/siem/public/cases/components/configure_cases/field_mapping.test.tsx similarity index 93% rename from x-pack/plugins/siem/public/pages/case/components/configure_cases/field_mapping.test.tsx rename to x-pack/plugins/siem/public/cases/components/configure_cases/field_mapping.test.tsx index 498757a34b78d..7f9ad87706693 100644 --- a/x-pack/plugins/siem/public/pages/case/components/configure_cases/field_mapping.test.tsx +++ b/x-pack/plugins/siem/public/cases/components/configure_cases/field_mapping.test.tsx @@ -7,13 +7,13 @@ import React from 'react'; import { mount, ReactWrapper } from 'enzyme'; -import { connectorsConfiguration } from '../../../../lib/connectors/config'; -import { createDefaultMapping } from '../../../../lib/connectors/utils'; +import { connectorsConfiguration } from '../../../common/lib/connectors/config'; +import { createDefaultMapping } from '../../../common/lib/connectors/utils'; import { FieldMapping, FieldMappingProps } from './field_mapping'; import { mapping } from './__mock__'; import { FieldMappingRow } from './field_mapping_row'; -import { TestProviders } from '../../../../mock'; +import { TestProviders } from '../../../common/mock'; describe('FieldMappingRow', () => { let wrapper: ReactWrapper; diff --git a/x-pack/plugins/siem/public/pages/case/components/configure_cases/field_mapping.tsx b/x-pack/plugins/siem/public/cases/components/configure_cases/field_mapping.tsx similarity index 94% rename from x-pack/plugins/siem/public/pages/case/components/configure_cases/field_mapping.tsx rename to x-pack/plugins/siem/public/cases/components/configure_cases/field_mapping.tsx index 41a6fbca3c007..0eab690915f40 100644 --- a/x-pack/plugins/siem/public/pages/case/components/configure_cases/field_mapping.tsx +++ b/x-pack/plugins/siem/public/cases/components/configure_cases/field_mapping.tsx @@ -13,17 +13,17 @@ import { CaseField, ActionType, ThirdPartyField, -} from '../../../../containers/case/configure/types'; +} from '../../containers/configure/types'; import { FieldMappingRow } from './field_mapping_row'; import * as i18n from './translations'; -import { connectorsConfiguration } from '../../../../lib/connectors/config'; +import { connectorsConfiguration } from '../../../common/lib/connectors/config'; import { setActionTypeToMapping, setThirdPartyToMapping } from './utils'; import { ThirdPartyField as ConnectorConfigurationThirdPartyField, AllThirdPartyFields, -} from '../../../../lib/connectors/types'; -import { createDefaultMapping } from '../../../../lib/connectors/utils'; +} from '../../../common/lib/connectors/types'; +import { createDefaultMapping } from '../../../common/lib/connectors/utils'; const FieldRowWrapper = styled.div` margin-top: 8px; diff --git a/x-pack/plugins/siem/public/pages/case/components/configure_cases/field_mapping_row.test.tsx b/x-pack/plugins/siem/public/cases/components/configure_cases/field_mapping_row.test.tsx similarity index 95% rename from x-pack/plugins/siem/public/pages/case/components/configure_cases/field_mapping_row.test.tsx rename to x-pack/plugins/siem/public/cases/components/configure_cases/field_mapping_row.test.tsx index e30096cc7eb62..4d0401fdf1bfd 100644 --- a/x-pack/plugins/siem/public/pages/case/components/configure_cases/field_mapping_row.test.tsx +++ b/x-pack/plugins/siem/public/cases/components/configure_cases/field_mapping_row.test.tsx @@ -9,8 +9,8 @@ import { mount, ReactWrapper } from 'enzyme'; import { EuiSuperSelectOption, EuiSuperSelect } from '@elastic/eui'; import { FieldMappingRow, RowProps } from './field_mapping_row'; -import { TestProviders } from '../../../../mock'; -import { ThirdPartyField, ActionType } from '../../../../containers/case/configure/types'; +import { TestProviders } from '../../../common/mock'; +import { ThirdPartyField, ActionType } from '../../containers/configure/types'; const thirdPartyOptions: Array> = [ { diff --git a/x-pack/plugins/siem/public/pages/case/components/configure_cases/field_mapping_row.tsx b/x-pack/plugins/siem/public/cases/components/configure_cases/field_mapping_row.tsx similarity index 92% rename from x-pack/plugins/siem/public/pages/case/components/configure_cases/field_mapping_row.tsx rename to x-pack/plugins/siem/public/cases/components/configure_cases/field_mapping_row.tsx index 687b0517326eb..922ea7222efce 100644 --- a/x-pack/plugins/siem/public/pages/case/components/configure_cases/field_mapping_row.tsx +++ b/x-pack/plugins/siem/public/cases/components/configure_cases/field_mapping_row.tsx @@ -14,13 +14,8 @@ import { } from '@elastic/eui'; import { capitalize } from 'lodash/fp'; - -import { - CaseField, - ActionType, - ThirdPartyField, -} from '../../../../containers/case/configure/types'; -import { AllThirdPartyFields } from '../../../../lib/connectors/types'; +import { CaseField, ActionType, ThirdPartyField } from '../../containers/configure/types'; +import { AllThirdPartyFields } from '../../../common/lib/connectors/types'; export interface RowProps { id: string; diff --git a/x-pack/plugins/siem/public/pages/case/components/configure_cases/index.test.tsx b/x-pack/plugins/siem/public/cases/components/configure_cases/index.test.tsx similarity index 97% rename from x-pack/plugins/siem/public/pages/case/components/configure_cases/index.test.tsx rename to x-pack/plugins/siem/public/cases/components/configure_cases/index.test.tsx index 08975703241c7..fcacb6dedff7d 100644 --- a/x-pack/plugins/siem/public/pages/case/components/configure_cases/index.test.tsx +++ b/x-pack/plugins/siem/public/cases/components/configure_cases/index.test.tsx @@ -7,20 +7,20 @@ import React from 'react'; import { ReactWrapper, mount } from 'enzyme'; -import { ConfigureCases } from './'; -import { TestProviders } from '../../../../mock'; +import { ConfigureCases } from '.'; +import { TestProviders } from '../../../common/mock'; import { Connectors } from './connectors'; import { ClosureOptions } from './closure_options'; import { ActionsConnectorsContextProvider, ConnectorAddFlyout, ConnectorEditFlyout, -} from '../../../../../../triggers_actions_ui/public'; +} from '../../../../../triggers_actions_ui/public'; -import { useKibana } from '../../../../lib/kibana'; -import { useConnectors } from '../../../../containers/case/configure/use_connectors'; -import { useCaseConfigure } from '../../../../containers/case/configure/use_configure'; -import { useGetUrlSearch } from '../../../../components/navigation/use_get_url_search'; +import { useKibana } from '../../../common/lib/kibana'; +import { useConnectors } from '../../containers/configure/use_connectors'; +import { useCaseConfigure } from '../../containers/configure/use_configure'; +import { useGetUrlSearch } from '../../../common/components/navigation/use_get_url_search'; import { connectors, @@ -30,10 +30,10 @@ import { kibanaMockImplementationArgs, } from './__mock__'; -jest.mock('../../../../lib/kibana'); -jest.mock('../../../../containers/case/configure/use_connectors'); -jest.mock('../../../../containers/case/configure/use_configure'); -jest.mock('../../../../components/navigation/use_get_url_search'); +jest.mock('../../../common/lib/kibana'); +jest.mock('../../containers/configure/use_connectors'); +jest.mock('../../containers/configure/use_configure'); +jest.mock('../../../common/components/navigation/use_get_url_search'); const useKibanaMock = useKibana as jest.Mock; const useConnectorsMock = useConnectors as jest.Mock; diff --git a/x-pack/plugins/siem/public/pages/case/components/configure_cases/index.tsx b/x-pack/plugins/siem/public/cases/components/configure_cases/index.tsx similarity index 91% rename from x-pack/plugins/siem/public/pages/case/components/configure_cases/index.tsx rename to x-pack/plugins/siem/public/cases/components/configure_cases/index.tsx index 739083a5009ec..d5c6cc671433b 100644 --- a/x-pack/plugins/siem/public/pages/case/components/configure_cases/index.tsx +++ b/x-pack/plugins/siem/public/cases/components/configure_cases/index.tsx @@ -16,28 +16,27 @@ import { EuiButtonEmpty, EuiText, } from '@elastic/eui'; - import { difference } from 'lodash/fp'; -import { useKibana } from '../../../../lib/kibana'; -import { useConnectors } from '../../../../containers/case/configure/use_connectors'; -import { useCaseConfigure } from '../../../../containers/case/configure/use_configure'; +import { useKibana } from '../../../common/lib/kibana'; +import { useConnectors } from '../../containers/configure/use_connectors'; +import { useCaseConfigure } from '../../containers/configure/use_configure'; import { ActionsConnectorsContextProvider, ActionType, ConnectorAddFlyout, ConnectorEditFlyout, -} from '../../../../../../triggers_actions_ui/public'; +} from '../../../../../triggers_actions_ui/public'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { ActionConnectorTableItem } from '../../../../../../triggers_actions_ui/public/types'; -import { getCaseUrl } from '../../../../components/link_to'; -import { useGetUrlSearch } from '../../../../components/navigation/use_get_url_search'; -import { connectorsConfiguration } from '../../../../lib/connectors/config'; +import { ActionConnectorTableItem } from '../../../../../triggers_actions_ui/public/types'; +import { getCaseUrl } from '../../../common/components/link_to'; +import { useGetUrlSearch } from '../../../common/components/navigation/use_get_url_search'; +import { connectorsConfiguration } from '../../../common/lib/connectors/config'; -import { Connectors } from '../configure_cases/connectors'; -import { ClosureOptions } from '../configure_cases/closure_options'; +import { Connectors } from './connectors'; +import { ClosureOptions } from './closure_options'; import { SectionWrapper } from '../wrappers'; -import { navTabs } from '../../../../pages/home/home_navigations'; +import { navTabs } from '../../../app/home/home_navigations'; import * as i18n from './translations'; const FormWrapper = styled.div` diff --git a/x-pack/plugins/siem/public/pages/case/components/configure_cases/mapping.test.tsx b/x-pack/plugins/siem/public/cases/components/configure_cases/mapping.test.tsx similarity index 99% rename from x-pack/plugins/siem/public/pages/case/components/configure_cases/mapping.test.tsx rename to x-pack/plugins/siem/public/cases/components/configure_cases/mapping.test.tsx index 083904d303490..68a35987ecaf6 100644 --- a/x-pack/plugins/siem/public/pages/case/components/configure_cases/mapping.test.tsx +++ b/x-pack/plugins/siem/public/cases/components/configure_cases/mapping.test.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { mount, ReactWrapper } from 'enzyme'; -import { TestProviders } from '../../../../mock'; +import { TestProviders } from '../../../common/mock'; import { Mapping, MappingProps } from './mapping'; import { mapping } from './__mock__'; diff --git a/x-pack/plugins/siem/public/pages/case/components/configure_cases/mapping.tsx b/x-pack/plugins/siem/public/cases/components/configure_cases/mapping.tsx similarity index 95% rename from x-pack/plugins/siem/public/pages/case/components/configure_cases/mapping.tsx rename to x-pack/plugins/siem/public/cases/components/configure_cases/mapping.tsx index acbcdac68a134..2c3172a30f159 100644 --- a/x-pack/plugins/siem/public/pages/case/components/configure_cases/mapping.tsx +++ b/x-pack/plugins/siem/public/cases/components/configure_cases/mapping.tsx @@ -18,7 +18,7 @@ import { import * as i18n from './translations'; import { FieldMapping } from './field_mapping'; -import { CasesConfigurationMapping } from '../../../../containers/case/configure/types'; +import { CasesConfigurationMapping } from '../../containers/configure/types'; export interface MappingProps { disabled: boolean; diff --git a/x-pack/plugins/siem/public/pages/case/components/configure_cases/translations.ts b/x-pack/plugins/siem/public/cases/components/configure_cases/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/case/components/configure_cases/translations.ts rename to x-pack/plugins/siem/public/cases/components/configure_cases/translations.ts diff --git a/x-pack/plugins/siem/public/pages/case/components/configure_cases/utils.test.tsx b/x-pack/plugins/siem/public/cases/components/configure_cases/utils.test.tsx similarity index 96% rename from x-pack/plugins/siem/public/pages/case/components/configure_cases/utils.test.tsx rename to x-pack/plugins/siem/public/cases/components/configure_cases/utils.test.tsx index 1c6fc9b2d405f..d6755f687100f 100644 --- a/x-pack/plugins/siem/public/pages/case/components/configure_cases/utils.test.tsx +++ b/x-pack/plugins/siem/public/cases/components/configure_cases/utils.test.tsx @@ -6,7 +6,7 @@ import { mapping } from './__mock__'; import { setActionTypeToMapping, setThirdPartyToMapping } from './utils'; -import { CasesConfigurationMapping } from '../../../../containers/case/configure/types'; +import { CasesConfigurationMapping } from '../../containers/configure/types'; describe('FieldMappingRow', () => { test('it should change the action type', () => { diff --git a/x-pack/plugins/siem/public/pages/case/components/configure_cases/utils.ts b/x-pack/plugins/siem/public/cases/components/configure_cases/utils.ts similarity index 95% rename from x-pack/plugins/siem/public/pages/case/components/configure_cases/utils.ts rename to x-pack/plugins/siem/public/cases/components/configure_cases/utils.ts index a44378c22e892..95851ec294e0b 100644 --- a/x-pack/plugins/siem/public/pages/case/components/configure_cases/utils.ts +++ b/x-pack/plugins/siem/public/cases/components/configure_cases/utils.ts @@ -8,7 +8,7 @@ import { ActionType, CasesConfigurationMapping, ThirdPartyField, -} from '../../../../containers/case/configure/types'; +} from '../../containers/configure/types'; export const setActionTypeToMapping = ( caseField: CaseField, diff --git a/x-pack/plugins/siem/public/pages/case/components/confirm_delete_case/index.tsx b/x-pack/plugins/siem/public/cases/components/confirm_delete_case/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/case/components/confirm_delete_case/index.tsx rename to x-pack/plugins/siem/public/cases/components/confirm_delete_case/index.tsx diff --git a/x-pack/plugins/siem/public/pages/case/components/confirm_delete_case/translations.ts b/x-pack/plugins/siem/public/cases/components/confirm_delete_case/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/case/components/confirm_delete_case/translations.ts rename to x-pack/plugins/siem/public/cases/components/confirm_delete_case/translations.ts diff --git a/x-pack/plugins/siem/public/pages/case/components/connector_selector/form.tsx b/x-pack/plugins/siem/public/cases/components/connector_selector/form.tsx similarity index 94% rename from x-pack/plugins/siem/public/pages/case/components/connector_selector/form.tsx rename to x-pack/plugins/siem/public/cases/components/connector_selector/form.tsx index 5f0e498bb4056..9e058ee5cf09e 100644 --- a/x-pack/plugins/siem/public/pages/case/components/connector_selector/form.tsx +++ b/x-pack/plugins/siem/public/cases/components/connector_selector/form.tsx @@ -7,9 +7,9 @@ import { EuiFormRow } from '@elastic/eui'; import React, { useCallback, useEffect } from 'react'; -import { FieldHook, getFieldValidityAndErrorMessage } from '../../../../shared_imports'; +import { FieldHook, getFieldValidityAndErrorMessage } from '../../../shared_imports'; import { ConnectorsDropdown } from '../configure_cases/connectors_dropdown'; -import { Connector } from '../../../../../../case/common/api/cases'; +import { Connector } from '../../../../../case/common/api/cases'; interface ConnectorSelectorProps { connectors: Connector[]; diff --git a/x-pack/plugins/siem/public/pages/case/components/create/index.test.tsx b/x-pack/plugins/siem/public/cases/components/create/index.test.tsx similarity index 81% rename from x-pack/plugins/siem/public/pages/case/components/create/index.test.tsx rename to x-pack/plugins/siem/public/cases/components/create/index.test.tsx index 4c2e15ddfa98a..647a0d3247259 100644 --- a/x-pack/plugins/siem/public/pages/case/components/create/index.test.tsx +++ b/x-pack/plugins/siem/public/cases/components/create/index.test.tsx @@ -7,26 +7,26 @@ import React from 'react'; import { mount } from 'enzyme'; -import { Create } from './'; -import { TestProviders } from '../../../../mock'; +import { Create } from '.'; +import { TestProviders } from '../../../common/mock'; import { getFormMock } from '../__mock__/form'; import { Router, routeData, mockHistory, mockLocation } from '../__mock__/router'; -import { useInsertTimeline } from '../../../../components/timeline/insert_timeline_popover/use_insert_timeline'; -import { usePostCase } from '../../../../containers/case/use_post_case'; -import { useGetTags } from '../../../../containers/case/use_get_tags'; +import { useInsertTimeline } from '../../../timelines/components/timeline/insert_timeline_popover/use_insert_timeline'; +import { usePostCase } from '../../containers/use_post_case'; +import { useGetTags } from '../../containers/use_get_tags'; -jest.mock('../../../../components/timeline/insert_timeline_popover/use_insert_timeline'); -jest.mock('../../../../containers/case/use_post_case'); -import { useForm } from '../../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks'; -import { wait } from '../../../../lib/helpers'; -import { SiemPageName } from '../../../home/types'; +jest.mock('../../../timelines/components/timeline/insert_timeline_popover/use_insert_timeline'); +jest.mock('../../containers/use_post_case'); +import { useForm } from '../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form'; +import { wait } from '../../../common/lib/helpers'; +import { SiemPageName } from '../../../app/types'; jest.mock( - '../../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form' + '../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form' ); -jest.mock('../../../../containers/case/use_get_tags'); +jest.mock('../../containers/use_get_tags'); jest.mock( - '../../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/components/form_data_provider', + '../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/components/form_data_provider', () => ({ FormDataProvider: ({ children }: { children: ({ tags }: { tags: string[] }) => void }) => children({ tags: ['rad', 'dude'] }), diff --git a/x-pack/plugins/siem/public/pages/case/components/create/index.tsx b/x-pack/plugins/siem/public/cases/components/create/index.tsx similarity index 90% rename from x-pack/plugins/siem/public/pages/case/components/create/index.tsx rename to x-pack/plugins/siem/public/cases/components/create/index.tsx index 6731b88572cdd..655536faa171d 100644 --- a/x-pack/plugins/siem/public/pages/case/components/create/index.tsx +++ b/x-pack/plugins/siem/public/cases/components/create/index.tsx @@ -16,7 +16,7 @@ import styled, { css } from 'styled-components'; import { Redirect } from 'react-router-dom'; import { isEqual } from 'lodash/fp'; -import { CasePostRequest } from '../../../../../../case/common/api'; +import { CasePostRequest } from '../../../../../case/common/api'; import { Field, Form, @@ -24,15 +24,15 @@ import { useForm, UseField, FormDataProvider, -} from '../../../../shared_imports'; -import { usePostCase } from '../../../../containers/case/use_post_case'; +} from '../../../shared_imports'; +import { usePostCase } from '../../containers/use_post_case'; import { schema } from './schema'; -import { InsertTimelinePopover } from '../../../../components/timeline/insert_timeline_popover'; -import { useInsertTimeline } from '../../../../components/timeline/insert_timeline_popover/use_insert_timeline'; +import { InsertTimelinePopover } from '../../../timelines/components/timeline/insert_timeline_popover'; +import { useInsertTimeline } from '../../../timelines/components/timeline/insert_timeline_popover/use_insert_timeline'; import * as i18n from '../../translations'; -import { SiemPageName } from '../../../home/types'; -import { MarkdownEditorForm } from '../../../../components/markdown_editor/form'; -import { useGetTags } from '../../../../containers/case/use_get_tags'; +import { SiemPageName } from '../../../app/types'; +import { MarkdownEditorForm } from '../../../common/components//markdown_editor/form'; +import { useGetTags } from '../../containers/use_get_tags'; export const CommonUseField = getUseField({ component: Field }); diff --git a/x-pack/plugins/siem/public/pages/case/components/create/optional_field_label/index.tsx b/x-pack/plugins/siem/public/cases/components/create/optional_field_label/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/case/components/create/optional_field_label/index.tsx rename to x-pack/plugins/siem/public/cases/components/create/optional_field_label/index.tsx diff --git a/x-pack/plugins/siem/public/pages/case/components/create/schema.tsx b/x-pack/plugins/siem/public/cases/components/create/schema.tsx similarity index 91% rename from x-pack/plugins/siem/public/pages/case/components/create/schema.tsx rename to x-pack/plugins/siem/public/cases/components/create/schema.tsx index a4e0bb6916531..ce38033271d04 100644 --- a/x-pack/plugins/siem/public/pages/case/components/create/schema.tsx +++ b/x-pack/plugins/siem/public/cases/components/create/schema.tsx @@ -4,8 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import { CasePostRequest } from '../../../../../../case/common/api'; -import { FIELD_TYPES, fieldValidators, FormSchema } from '../../../../shared_imports'; +import { CasePostRequest } from '../../../../../case/common/api'; +import { FIELD_TYPES, fieldValidators, FormSchema } from '../../../shared_imports'; import * as i18n from '../../translations'; import { OptionalFieldLabel } from './optional_field_label'; diff --git a/x-pack/plugins/siem/public/pages/case/components/edit_connector/index.test.tsx b/x-pack/plugins/siem/public/cases/components/edit_connector/index.test.tsx similarity index 93% rename from x-pack/plugins/siem/public/pages/case/components/edit_connector/index.test.tsx rename to x-pack/plugins/siem/public/cases/components/edit_connector/index.test.tsx index 29776360b72da..5dfed80baa8ed 100644 --- a/x-pack/plugins/siem/public/pages/case/components/edit_connector/index.test.tsx +++ b/x-pack/plugins/siem/public/cases/components/edit_connector/index.test.tsx @@ -9,12 +9,12 @@ import { mount } from 'enzyme'; import { EditConnector } from './index'; import { getFormMock, useFormMock } from '../__mock__/form'; -import { TestProviders } from '../../../../mock'; -import { connectorsMock } from '../../../../containers/case/configure/mock'; -import { wait } from '../../../../lib/helpers'; +import { TestProviders } from '../../../common/mock'; +import { connectorsMock } from '../../containers/configure/mock'; +import { wait } from '../../../common/lib/helpers'; import { act } from 'react-dom/test-utils'; jest.mock( - '../../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form' + '../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form' ); const onSubmit = jest.fn(); const defaultProps = { diff --git a/x-pack/plugins/siem/public/pages/case/components/edit_connector/index.tsx b/x-pack/plugins/siem/public/cases/components/edit_connector/index.tsx similarity index 97% rename from x-pack/plugins/siem/public/pages/case/components/edit_connector/index.tsx rename to x-pack/plugins/siem/public/cases/components/edit_connector/index.tsx index 83be8b5ad7e5a..29f06532a4ab4 100644 --- a/x-pack/plugins/siem/public/pages/case/components/edit_connector/index.tsx +++ b/x-pack/plugins/siem/public/cases/components/edit_connector/index.tsx @@ -17,10 +17,10 @@ import { } from '@elastic/eui'; import styled, { css } from 'styled-components'; import * as i18n from '../../translations'; -import { Form, UseField, useForm } from '../../../../shared_imports'; +import { Form, UseField, useForm } from '../../../shared_imports'; import { schema } from './schema'; import { ConnectorSelector } from '../connector_selector/form'; -import { Connector } from '../../../../../../case/common/api/cases'; +import { Connector } from '../../../../../case/common/api/cases'; interface EditConnectorProps { connectors: Connector[]; diff --git a/x-pack/plugins/siem/public/pages/case/components/edit_connector/schema.tsx b/x-pack/plugins/siem/public/cases/components/edit_connector/schema.tsx similarity index 85% rename from x-pack/plugins/siem/public/pages/case/components/edit_connector/schema.tsx rename to x-pack/plugins/siem/public/cases/components/edit_connector/schema.tsx index 4b9008839e695..cdc50c7d28e4f 100644 --- a/x-pack/plugins/siem/public/pages/case/components/edit_connector/schema.tsx +++ b/x-pack/plugins/siem/public/cases/components/edit_connector/schema.tsx @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import { FormSchema } from '../../../../shared_imports'; +import { FormSchema } from '../../../shared_imports'; export const schema: FormSchema = { connector: { diff --git a/x-pack/plugins/siem/public/components/filter_popover/index.tsx b/x-pack/plugins/siem/public/cases/components/filter_popover/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/filter_popover/index.tsx rename to x-pack/plugins/siem/public/cases/components/filter_popover/index.tsx diff --git a/x-pack/plugins/siem/public/pages/case/components/open_closed_stats/index.tsx b/x-pack/plugins/siem/public/cases/components/open_closed_stats/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/case/components/open_closed_stats/index.tsx rename to x-pack/plugins/siem/public/cases/components/open_closed_stats/index.tsx diff --git a/x-pack/plugins/siem/public/pages/case/components/property_actions/constants.ts b/x-pack/plugins/siem/public/cases/components/property_actions/constants.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/case/components/property_actions/constants.ts rename to x-pack/plugins/siem/public/cases/components/property_actions/constants.ts diff --git a/x-pack/plugins/siem/public/pages/case/components/property_actions/index.tsx b/x-pack/plugins/siem/public/cases/components/property_actions/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/case/components/property_actions/index.tsx rename to x-pack/plugins/siem/public/cases/components/property_actions/index.tsx diff --git a/x-pack/plugins/siem/public/pages/case/components/property_actions/translations.ts b/x-pack/plugins/siem/public/cases/components/property_actions/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/case/components/property_actions/translations.ts rename to x-pack/plugins/siem/public/cases/components/property_actions/translations.ts diff --git a/x-pack/plugins/siem/public/pages/case/components/tag_list/index.test.tsx b/x-pack/plugins/siem/public/cases/components/tag_list/index.test.tsx similarity index 88% rename from x-pack/plugins/siem/public/pages/case/components/tag_list/index.test.tsx rename to x-pack/plugins/siem/public/cases/components/tag_list/index.test.tsx index 9ddb96a4ed295..0b7b4211f6a3b 100644 --- a/x-pack/plugins/siem/public/pages/case/components/tag_list/index.test.tsx +++ b/x-pack/plugins/siem/public/cases/components/tag_list/index.test.tsx @@ -8,19 +8,19 @@ import React from 'react'; import { mount } from 'enzyme'; import { act } from 'react-dom/test-utils'; -import { TagList } from './'; +import { TagList } from '.'; import { getFormMock } from '../__mock__/form'; -import { TestProviders } from '../../../../mock'; -import { wait } from '../../../../lib/helpers'; -import { useForm } from '../../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks'; -import { useGetTags } from '../../../../containers/case/use_get_tags'; +import { TestProviders } from '../../../common/mock'; +import { wait } from '../../../common/lib/helpers'; +import { useForm } from '../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form'; +import { useGetTags } from '../../containers/use_get_tags'; jest.mock( - '../../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form' + '../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form' ); -jest.mock('../../../../containers/case/use_get_tags'); +jest.mock('../../containers/use_get_tags'); jest.mock( - '../../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/components/form_data_provider', + '../../../../../../../src/plugins/es_ui_shared/static/forms/hook_form_lib/components/form_data_provider', () => ({ FormDataProvider: ({ children }: { children: ({ tags }: { tags: string[] }) => void }) => children({ tags: ['rad', 'dude'] }), diff --git a/x-pack/plugins/siem/public/pages/case/components/tag_list/index.tsx b/x-pack/plugins/siem/public/cases/components/tag_list/index.tsx similarity index 97% rename from x-pack/plugins/siem/public/pages/case/components/tag_list/index.tsx rename to x-pack/plugins/siem/public/cases/components/tag_list/index.tsx index c61feab0bab98..259028d9c6363 100644 --- a/x-pack/plugins/siem/public/pages/case/components/tag_list/index.tsx +++ b/x-pack/plugins/siem/public/cases/components/tag_list/index.tsx @@ -19,10 +19,10 @@ import { import styled, { css } from 'styled-components'; import { isEqual } from 'lodash/fp'; import * as i18n from './translations'; -import { Form, FormDataProvider, useForm } from '../../../../shared_imports'; +import { Form, FormDataProvider, useForm } from '../../../shared_imports'; import { schema } from './schema'; import { CommonUseField } from '../create'; -import { useGetTags } from '../../../../containers/case/use_get_tags'; +import { useGetTags } from '../../containers/use_get_tags'; interface TagListProps { disabled?: boolean; diff --git a/x-pack/plugins/siem/public/pages/case/components/tag_list/schema.tsx b/x-pack/plugins/siem/public/cases/components/tag_list/schema.tsx similarity index 85% rename from x-pack/plugins/siem/public/pages/case/components/tag_list/schema.tsx rename to x-pack/plugins/siem/public/cases/components/tag_list/schema.tsx index 50ba114de528e..335a0785ecb04 100644 --- a/x-pack/plugins/siem/public/pages/case/components/tag_list/schema.tsx +++ b/x-pack/plugins/siem/public/cases/components/tag_list/schema.tsx @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import { FormSchema } from '../../../../shared_imports'; +import { FormSchema } from '../../../shared_imports'; import { schemaTags } from '../create/schema'; export const schema: FormSchema = { diff --git a/x-pack/plugins/siem/public/pages/case/components/tag_list/translations.ts b/x-pack/plugins/siem/public/cases/components/tag_list/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/case/components/tag_list/translations.ts rename to x-pack/plugins/siem/public/cases/components/tag_list/translations.ts diff --git a/x-pack/plugins/siem/public/pages/case/components/use_push_to_service/helpers.tsx b/x-pack/plugins/siem/public/cases/components/use_push_to_service/helpers.tsx similarity index 96% rename from x-pack/plugins/siem/public/pages/case/components/use_push_to_service/helpers.tsx rename to x-pack/plugins/siem/public/cases/components/use_push_to_service/helpers.tsx index 0613c40d1181d..f0ded815fce43 100644 --- a/x-pack/plugins/siem/public/pages/case/components/use_push_to_service/helpers.tsx +++ b/x-pack/plugins/siem/public/cases/components/use_push_to_service/helpers.tsx @@ -9,7 +9,7 @@ import { FormattedMessage } from '@kbn/i18n/react'; import React from 'react'; import * as i18n from './translations'; -import { ActionLicense } from '../../../../containers/case/types'; +import { ActionLicense } from '../../containers/types'; export const getLicenseError = () => ({ title: i18n.PUSH_DISABLE_BY_LICENSE_TITLE, diff --git a/x-pack/plugins/siem/public/pages/case/components/use_push_to_service/index.test.tsx b/x-pack/plugins/siem/public/cases/components/use_push_to_service/index.test.tsx similarity index 89% rename from x-pack/plugins/siem/public/pages/case/components/use_push_to_service/index.test.tsx rename to x-pack/plugins/siem/public/cases/components/use_push_to_service/index.test.tsx index b19c2dbf5273a..cb00201942312 100644 --- a/x-pack/plugins/siem/public/pages/case/components/use_push_to_service/index.test.tsx +++ b/x-pack/plugins/siem/public/cases/components/use_push_to_service/index.test.tsx @@ -6,17 +6,17 @@ /* eslint-disable react/display-name */ import React from 'react'; import { renderHook, act } from '@testing-library/react-hooks'; -import { usePushToService, ReturnUsePushToService, UsePushToService } from './'; -import { TestProviders } from '../../../../mock'; -import { usePostPushToService } from '../../../../containers/case/use_post_push_to_service'; -import { basicPush, actionLicenses } from '../../../../containers/case/mock'; +import { usePushToService, ReturnUsePushToService, UsePushToService } from '.'; +import { TestProviders } from '../../../common/mock'; +import { usePostPushToService } from '../../containers/use_post_push_to_service'; +import { basicPush, actionLicenses } from '../../containers/mock'; import * as i18n from './translations'; -import { useGetActionLicense } from '../../../../containers/case/use_get_action_license'; +import { useGetActionLicense } from '../../containers/use_get_action_license'; import { getKibanaConfigError, getLicenseError } from './helpers'; -import { connectorsMock } from '../../../../containers/case/configure/mock'; -jest.mock('../../../../containers/case/use_get_action_license'); -jest.mock('../../../../containers/case/use_post_push_to_service'); -jest.mock('../../../../containers/case/configure/api'); +import { connectorsMock } from '../../containers/configure/mock'; +jest.mock('../../containers/use_get_action_license'); +jest.mock('../../containers/use_post_push_to_service'); +jest.mock('../../containers/configure/api'); describe('usePushToService', () => { const caseId = '12345'; diff --git a/x-pack/plugins/siem/public/pages/case/components/use_push_to_service/index.tsx b/x-pack/plugins/siem/public/cases/components/use_push_to_service/index.tsx similarity index 89% rename from x-pack/plugins/siem/public/pages/case/components/use_push_to_service/index.tsx rename to x-pack/plugins/siem/public/cases/components/use_push_to_service/index.tsx index 7f3a951339ef1..157639f011fef 100644 --- a/x-pack/plugins/siem/public/pages/case/components/use_push_to_service/index.tsx +++ b/x-pack/plugins/siem/public/cases/components/use_push_to_service/index.tsx @@ -8,17 +8,17 @@ import { EuiButton, EuiLink, EuiToolTip } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import React, { useCallback, useMemo } from 'react'; -import { Case } from '../../../../containers/case/types'; -import { useGetActionLicense } from '../../../../containers/case/use_get_action_license'; -import { usePostPushToService } from '../../../../containers/case/use_post_push_to_service'; -import { getConfigureCasesUrl } from '../../../../components/link_to'; -import { useGetUrlSearch } from '../../../../components/navigation/use_get_url_search'; -import { navTabs } from '../../../home/home_navigations'; +import { Case } from '../../containers/types'; +import { useGetActionLicense } from '../../containers/use_get_action_license'; +import { usePostPushToService } from '../../containers/use_post_push_to_service'; +import { getConfigureCasesUrl } from '../../../common/components/link_to'; +import { useGetUrlSearch } from '../../../common/components/navigation/use_get_url_search'; +import { navTabs } from '../../../app/home/home_navigations'; import { CaseCallOut } from '../callout'; import { getLicenseError, getKibanaConfigError } from './helpers'; import * as i18n from './translations'; -import { Connector } from '../../../../../../case/common/api/cases'; -import { CaseServices } from '../../../../containers/case/use_get_case_user_actions'; +import { Connector } from '../../../../../case/common/api/cases'; +import { CaseServices } from '../../containers/use_get_case_user_actions'; export interface UsePushToService { caseId: string; diff --git a/x-pack/plugins/siem/public/pages/case/components/use_push_to_service/translations.ts b/x-pack/plugins/siem/public/cases/components/use_push_to_service/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/case/components/use_push_to_service/translations.ts rename to x-pack/plugins/siem/public/cases/components/use_push_to_service/translations.ts diff --git a/x-pack/plugins/siem/public/pages/case/components/user_action_tree/helpers.test.tsx b/x-pack/plugins/siem/public/cases/components/user_action_tree/helpers.test.tsx similarity index 96% rename from x-pack/plugins/siem/public/pages/case/components/user_action_tree/helpers.test.tsx rename to x-pack/plugins/siem/public/cases/components/user_action_tree/helpers.test.tsx index 6e7c2979f80bb..678bd54975144 100644 --- a/x-pack/plugins/siem/public/pages/case/components/user_action_tree/helpers.test.tsx +++ b/x-pack/plugins/siem/public/cases/components/user_action_tree/helpers.test.tsx @@ -5,11 +5,11 @@ */ import React from 'react'; -import { basicPush, getUserAction } from '../../../../containers/case/mock'; +import { basicPush, getUserAction } from '../../containers/mock'; import { getLabelTitle } from './helpers'; import * as i18n from '../case_view/translations'; import { mount } from 'enzyme'; -import { connectorsMock } from '../../../../containers/case/configure/mock'; +import { connectorsMock } from '../../containers/configure/mock'; describe('User action tree helpers', () => { const connectors = connectorsMock; diff --git a/x-pack/plugins/siem/public/pages/case/components/user_action_tree/helpers.tsx b/x-pack/plugins/siem/public/cases/components/user_action_tree/helpers.tsx similarity index 97% rename from x-pack/plugins/siem/public/pages/case/components/user_action_tree/helpers.tsx rename to x-pack/plugins/siem/public/cases/components/user_action_tree/helpers.tsx index 285fa3c58c18a..58c176ed96b5d 100644 --- a/x-pack/plugins/siem/public/pages/case/components/user_action_tree/helpers.tsx +++ b/x-pack/plugins/siem/public/cases/components/user_action_tree/helpers.tsx @@ -7,8 +7,8 @@ import { EuiFlexGroup, EuiFlexItem, EuiBadge, EuiLink } from '@elastic/eui'; import React from 'react'; -import { CaseFullExternalService, Connector } from '../../../../../../case/common/api'; -import { CaseUserActions } from '../../../../containers/case/types'; +import { CaseFullExternalService, Connector } from '../../../../../case/common/api'; +import { CaseUserActions } from '../../containers/types'; import * as i18n from '../case_view/translations'; interface LabelTitle { diff --git a/x-pack/plugins/siem/public/pages/case/components/user_action_tree/index.test.tsx b/x-pack/plugins/siem/public/cases/components/user_action_tree/index.test.tsx similarity index 96% rename from x-pack/plugins/siem/public/pages/case/components/user_action_tree/index.test.tsx rename to x-pack/plugins/siem/public/cases/components/user_action_tree/index.test.tsx index b9a94f83fded1..d3e8ea6563b2c 100644 --- a/x-pack/plugins/siem/public/pages/case/components/user_action_tree/index.test.tsx +++ b/x-pack/plugins/siem/public/cases/components/user_action_tree/index.test.tsx @@ -9,11 +9,11 @@ import { mount } from 'enzyme'; import { Router, routeData, mockHistory, mockLocation } from '../__mock__/router'; import { getFormMock, useFormMock } from '../__mock__/form'; -import { useUpdateComment } from '../../../../containers/case/use_update_comment'; -import { basicCase, basicPush, getUserAction } from '../../../../containers/case/mock'; -import { UserActionTree } from './'; -import { TestProviders } from '../../../../mock'; -import { wait } from '../../../../lib/helpers'; +import { useUpdateComment } from '../../containers/use_update_comment'; +import { basicCase, basicPush, getUserAction } from '../../containers/mock'; +import { UserActionTree } from '.'; +import { TestProviders } from '../../../common/mock'; +import { wait } from '../../../common/lib/helpers'; import { act } from 'react-dom/test-utils'; const fetchUserActions = jest.fn(); @@ -32,7 +32,7 @@ const defaultProps = { userCanCrud: true, }; const useUpdateCommentMock = useUpdateComment as jest.Mock; -jest.mock('../../../../containers/case/use_update_comment'); +jest.mock('../../containers/use_update_comment'); const patchComment = jest.fn(); describe('UserActionTree ', () => { diff --git a/x-pack/plugins/siem/public/pages/case/components/user_action_tree/index.tsx b/x-pack/plugins/siem/public/cases/components/user_action_tree/index.tsx similarity index 96% rename from x-pack/plugins/siem/public/pages/case/components/user_action_tree/index.tsx rename to x-pack/plugins/siem/public/cases/components/user_action_tree/index.tsx index 80d2c20631432..3a909636bc048 100644 --- a/x-pack/plugins/siem/public/pages/case/components/user_action_tree/index.tsx +++ b/x-pack/plugins/siem/public/cases/components/user_action_tree/index.tsx @@ -11,16 +11,16 @@ import styled from 'styled-components'; import * as i18n from '../case_view/translations'; -import { Case, CaseUserActions } from '../../../../containers/case/types'; -import { useUpdateComment } from '../../../../containers/case/use_update_comment'; -import { useCurrentUser } from '../../../../lib/kibana'; +import { Case, CaseUserActions } from '../../containers/types'; +import { useUpdateComment } from '../../containers/use_update_comment'; +import { useCurrentUser } from '../../../common/lib/kibana'; import { AddComment } from '../add_comment'; import { getLabelTitle } from './helpers'; import { UserActionItem } from './user_action_item'; import { UserActionMarkdown } from './user_action_markdown'; -import { Connector } from '../../../../../../case/common/api/cases'; -import { CaseServices } from '../../../../containers/case/use_get_case_user_actions'; -import { parseString } from '../../../../containers/case/utils'; +import { Connector } from '../../../../../case/common/api/cases'; +import { CaseServices } from '../../containers/use_get_case_user_actions'; +import { parseString } from '../../containers/utils'; export interface UserActionTreeProps { caseServices: CaseServices; diff --git a/x-pack/plugins/siem/public/pages/case/components/user_action_tree/schema.ts b/x-pack/plugins/siem/public/cases/components/user_action_tree/schema.ts similarity index 96% rename from x-pack/plugins/siem/public/pages/case/components/user_action_tree/schema.ts rename to x-pack/plugins/siem/public/cases/components/user_action_tree/schema.ts index a9e6bf84a1a1e..7a2777037023a 100644 --- a/x-pack/plugins/siem/public/pages/case/components/user_action_tree/schema.ts +++ b/x-pack/plugins/siem/public/cases/components/user_action_tree/schema.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { FIELD_TYPES, fieldValidators, FormSchema } from '../../../../shared_imports'; +import { FIELD_TYPES, fieldValidators, FormSchema } from '../../../shared_imports'; import * as i18n from '../../translations'; const { emptyField } = fieldValidators; diff --git a/x-pack/plugins/siem/public/pages/case/components/user_action_tree/translations.ts b/x-pack/plugins/siem/public/cases/components/user_action_tree/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/case/components/user_action_tree/translations.ts rename to x-pack/plugins/siem/public/cases/components/user_action_tree/translations.ts diff --git a/x-pack/plugins/siem/public/pages/case/components/user_action_tree/user_action_avatar.tsx b/x-pack/plugins/siem/public/cases/components/user_action_tree/user_action_avatar.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/case/components/user_action_tree/user_action_avatar.tsx rename to x-pack/plugins/siem/public/cases/components/user_action_tree/user_action_avatar.tsx diff --git a/x-pack/plugins/siem/public/pages/case/components/user_action_tree/user_action_item.tsx b/x-pack/plugins/siem/public/cases/components/user_action_tree/user_action_item.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/case/components/user_action_tree/user_action_item.tsx rename to x-pack/plugins/siem/public/cases/components/user_action_tree/user_action_item.tsx diff --git a/x-pack/plugins/siem/public/pages/case/components/user_action_tree/user_action_markdown.tsx b/x-pack/plugins/siem/public/cases/components/user_action_tree/user_action_markdown.tsx similarity index 87% rename from x-pack/plugins/siem/public/pages/case/components/user_action_tree/user_action_markdown.tsx rename to x-pack/plugins/siem/public/cases/components/user_action_tree/user_action_markdown.tsx index 827fe2df120ab..23d8d8f1a7e68 100644 --- a/x-pack/plugins/siem/public/pages/case/components/user_action_tree/user_action_markdown.tsx +++ b/x-pack/plugins/siem/public/cases/components/user_action_tree/user_action_markdown.tsx @@ -9,12 +9,12 @@ import React, { useCallback } from 'react'; import styled, { css } from 'styled-components'; import * as i18n from '../case_view/translations'; -import { Markdown } from '../../../../components/markdown'; -import { Form, useForm, UseField } from '../../../../shared_imports'; +import { Markdown } from '../../../common/components/markdown'; +import { Form, useForm, UseField } from '../../../shared_imports'; import { schema, Content } from './schema'; -import { InsertTimelinePopover } from '../../../../components/timeline/insert_timeline_popover'; -import { useInsertTimeline } from '../../../../components/timeline/insert_timeline_popover/use_insert_timeline'; -import { MarkdownEditorForm } from '../../../../components/markdown_editor/form'; +import { InsertTimelinePopover } from '../../../timelines/components/timeline/insert_timeline_popover'; +import { useInsertTimeline } from '../../../timelines/components/timeline/insert_timeline_popover/use_insert_timeline'; +import { MarkdownEditorForm } from '../../../common/components//markdown_editor/form'; const ContentWrapper = styled.div` ${({ theme }) => css` diff --git a/x-pack/plugins/siem/public/pages/case/components/user_action_tree/user_action_title.test.tsx b/x-pack/plugins/siem/public/cases/components/user_action_tree/user_action_title.test.tsx similarity index 92% rename from x-pack/plugins/siem/public/pages/case/components/user_action_tree/user_action_title.test.tsx rename to x-pack/plugins/siem/public/cases/components/user_action_tree/user_action_title.test.tsx index 8a1e8a80f664d..cf29fa061e419 100644 --- a/x-pack/plugins/siem/public/pages/case/components/user_action_tree/user_action_title.test.tsx +++ b/x-pack/plugins/siem/public/cases/components/user_action_tree/user_action_title.test.tsx @@ -8,9 +8,9 @@ import React from 'react'; import { mount } from 'enzyme'; import copy from 'copy-to-clipboard'; import { Router, routeData, mockHistory } from '../__mock__/router'; -import { caseUserActions as basicUserActions } from '../../../../containers/case/mock'; +import { caseUserActions as basicUserActions } from '../../containers/mock'; import { UserActionTitle } from './user_action_title'; -import { TestProviders } from '../../../../mock'; +import { TestProviders } from '../../../common/mock'; const outlineComment = jest.fn(); const onEdit = jest.fn(); diff --git a/x-pack/plugins/siem/public/pages/case/components/user_action_tree/user_action_title.tsx b/x-pack/plugins/siem/public/cases/components/user_action_tree/user_action_title.tsx similarity index 95% rename from x-pack/plugins/siem/public/pages/case/components/user_action_tree/user_action_title.tsx rename to x-pack/plugins/siem/public/cases/components/user_action_tree/user_action_title.tsx index fc2a74466dedc..307790194421d 100644 --- a/x-pack/plugins/siem/public/pages/case/components/user_action_tree/user_action_title.tsx +++ b/x-pack/plugins/siem/public/cases/components/user_action_tree/user_action_title.tsx @@ -19,11 +19,11 @@ import React, { useMemo, useCallback } from 'react'; import styled from 'styled-components'; import { useParams } from 'react-router-dom'; -import { LocalizedDateTooltip } from '../../../../components/localized_date_tooltip'; -import { useGetUrlSearch } from '../../../../components/navigation/use_get_url_search'; -import { navTabs } from '../../../home/home_navigations'; +import { LocalizedDateTooltip } from '../../../common/components/localized_date_tooltip'; +import { useGetUrlSearch } from '../../../common/components/navigation/use_get_url_search'; +import { navTabs } from '../../../app/home/home_navigations'; import { PropertyActions } from '../property_actions'; -import { SiemPageName } from '../../../home/types'; +import { SiemPageName } from '../../../app/types'; import * as i18n from './translations'; const MySpinner = styled(EuiLoadingSpinner)` diff --git a/x-pack/plugins/siem/public/pages/case/components/user_list/index.test.tsx b/x-pack/plugins/siem/public/cases/components/user_list/index.test.tsx similarity index 97% rename from x-pack/plugins/siem/public/pages/case/components/user_list/index.test.tsx rename to x-pack/plugins/siem/public/cases/components/user_list/index.test.tsx index 51acb3b810d92..7916a72d591ad 100644 --- a/x-pack/plugins/siem/public/pages/case/components/user_list/index.test.tsx +++ b/x-pack/plugins/siem/public/cases/components/user_list/index.test.tsx @@ -6,7 +6,7 @@ import React from 'react'; import { shallow } from 'enzyme'; -import { UserList } from './'; +import { UserList } from '.'; import * as i18n from '../case_view/translations'; describe('UserList ', () => { diff --git a/x-pack/plugins/siem/public/pages/case/components/user_list/index.tsx b/x-pack/plugins/siem/public/cases/components/user_list/index.tsx similarity index 97% rename from x-pack/plugins/siem/public/pages/case/components/user_list/index.tsx rename to x-pack/plugins/siem/public/cases/components/user_list/index.tsx index 579e8e48fa147..0606da371d16a 100644 --- a/x-pack/plugins/siem/public/pages/case/components/user_list/index.tsx +++ b/x-pack/plugins/siem/public/cases/components/user_list/index.tsx @@ -20,7 +20,7 @@ import { import styled, { css } from 'styled-components'; -import { ElasticUser } from '../../../../containers/case/types'; +import { ElasticUser } from '../../containers/types'; import * as i18n from './translations'; interface UserListProps { diff --git a/x-pack/plugins/siem/public/pages/case/components/user_list/translations.ts b/x-pack/plugins/siem/public/cases/components/user_list/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/case/components/user_list/translations.ts rename to x-pack/plugins/siem/public/cases/components/user_list/translations.ts diff --git a/x-pack/plugins/siem/public/pages/case/components/wrappers/index.tsx b/x-pack/plugins/siem/public/cases/components/wrappers/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/case/components/wrappers/index.tsx rename to x-pack/plugins/siem/public/cases/components/wrappers/index.tsx diff --git a/x-pack/plugins/siem/public/containers/case/__mocks__/api.ts b/x-pack/plugins/siem/public/cases/containers/__mocks__/api.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/case/__mocks__/api.ts rename to x-pack/plugins/siem/public/cases/containers/__mocks__/api.ts diff --git a/x-pack/plugins/siem/public/containers/case/api.test.tsx b/x-pack/plugins/siem/public/cases/containers/api.test.tsx similarity index 99% rename from x-pack/plugins/siem/public/containers/case/api.test.tsx rename to x-pack/plugins/siem/public/cases/containers/api.test.tsx index 174738098fa10..b4f0c2198b458 100644 --- a/x-pack/plugins/siem/public/containers/case/api.test.tsx +++ b/x-pack/plugins/siem/public/cases/containers/api.test.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { KibanaServices } from '../../lib/kibana'; +import { KibanaServices } from '../../common/lib/kibana'; import { CASES_URL } from '../../../../case/common/constants'; @@ -54,7 +54,7 @@ import * as i18n from './translations'; const abortCtrl = new AbortController(); const mockKibanaServices = KibanaServices.get as jest.Mock; -jest.mock('../../lib/kibana'); +jest.mock('../../common/lib/kibana'); const fetchMock = jest.fn(); mockKibanaServices.mockReturnValue({ http: { fetch: fetchMock } }); diff --git a/x-pack/plugins/siem/public/containers/case/api.ts b/x-pack/plugins/siem/public/cases/containers/api.ts similarity index 99% rename from x-pack/plugins/siem/public/containers/case/api.ts rename to x-pack/plugins/siem/public/cases/containers/api.ts index 438eae9d88a44..678286c0634d4 100644 --- a/x-pack/plugins/siem/public/containers/case/api.ts +++ b/x-pack/plugins/siem/public/cases/containers/api.ts @@ -35,7 +35,7 @@ import { getCaseCommentsUrl, } from '../../../../case/common/api/helpers'; -import { KibanaServices } from '../../lib/kibana'; +import { KibanaServices } from '../../common/lib/kibana'; import { ActionLicense, diff --git a/x-pack/plugins/siem/public/containers/case/configure/__mocks__/api.ts b/x-pack/plugins/siem/public/cases/containers/configure/__mocks__/api.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/case/configure/__mocks__/api.ts rename to x-pack/plugins/siem/public/cases/containers/configure/__mocks__/api.ts diff --git a/x-pack/plugins/siem/public/containers/case/configure/api.test.ts b/x-pack/plugins/siem/public/cases/containers/configure/api.test.ts similarity index 97% rename from x-pack/plugins/siem/public/containers/case/configure/api.test.ts rename to x-pack/plugins/siem/public/cases/containers/configure/api.test.ts index ef0e51fb1c24d..11a293ef437fa 100644 --- a/x-pack/plugins/siem/public/containers/case/configure/api.test.ts +++ b/x-pack/plugins/siem/public/cases/containers/configure/api.test.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { KibanaServices } from '../../../lib/kibana'; +import { KibanaServices } from '../../../common/lib/kibana'; import { fetchConnectors, getCaseConfigure, postCaseConfigure, patchCaseConfigure } from './api'; import { connectorsMock, @@ -15,7 +15,7 @@ import { const abortCtrl = new AbortController(); const mockKibanaServices = KibanaServices.get as jest.Mock; -jest.mock('../../../lib/kibana'); +jest.mock('../../../common/lib/kibana'); const fetchMock = jest.fn(); mockKibanaServices.mockReturnValue({ http: { fetch: fetchMock } }); diff --git a/x-pack/plugins/siem/public/containers/case/configure/api.ts b/x-pack/plugins/siem/public/cases/containers/configure/api.ts similarity index 97% rename from x-pack/plugins/siem/public/containers/case/configure/api.ts rename to x-pack/plugins/siem/public/cases/containers/configure/api.ts index 4f516764e46f3..4b4b81460ebc2 100644 --- a/x-pack/plugins/siem/public/containers/case/configure/api.ts +++ b/x-pack/plugins/siem/public/cases/containers/configure/api.ts @@ -11,7 +11,7 @@ import { CasesConfigureResponse, CasesConfigureRequest, } from '../../../../../case/common/api'; -import { KibanaServices } from '../../../lib/kibana'; +import { KibanaServices } from '../../../common/lib/kibana'; import { CASE_CONFIGURE_CONNECTORS_URL, diff --git a/x-pack/plugins/siem/public/containers/case/configure/mock.ts b/x-pack/plugins/siem/public/cases/containers/configure/mock.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/case/configure/mock.ts rename to x-pack/plugins/siem/public/cases/containers/configure/mock.ts diff --git a/x-pack/plugins/siem/public/containers/case/configure/translations.ts b/x-pack/plugins/siem/public/cases/containers/configure/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/case/configure/translations.ts rename to x-pack/plugins/siem/public/cases/containers/configure/translations.ts diff --git a/x-pack/plugins/siem/public/containers/case/configure/types.ts b/x-pack/plugins/siem/public/cases/containers/configure/types.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/case/configure/types.ts rename to x-pack/plugins/siem/public/cases/containers/configure/types.ts diff --git a/x-pack/plugins/siem/public/containers/case/configure/use_configure.test.tsx b/x-pack/plugins/siem/public/cases/containers/configure/use_configure.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/containers/case/configure/use_configure.test.tsx rename to x-pack/plugins/siem/public/cases/containers/configure/use_configure.test.tsx diff --git a/x-pack/plugins/siem/public/containers/case/configure/use_configure.tsx b/x-pack/plugins/siem/public/cases/containers/configure/use_configure.tsx similarity index 98% rename from x-pack/plugins/siem/public/containers/case/configure/use_configure.tsx rename to x-pack/plugins/siem/public/cases/containers/configure/use_configure.tsx index a185d435f7165..5a85a3a0633bc 100644 --- a/x-pack/plugins/siem/public/containers/case/configure/use_configure.tsx +++ b/x-pack/plugins/siem/public/cases/containers/configure/use_configure.tsx @@ -7,7 +7,11 @@ import { useEffect, useCallback, useReducer } from 'react'; import { getCaseConfigure, patchCaseConfigure, postCaseConfigure } from './api'; -import { useStateToaster, errorToToaster, displaySuccessToast } from '../../../components/toasters'; +import { + useStateToaster, + errorToToaster, + displaySuccessToast, +} from '../../../common/components/toasters'; import * as i18n from './translations'; import { CasesConfigurationMapping, ClosureType } from './types'; diff --git a/x-pack/plugins/siem/public/containers/case/configure/use_connectors.test.tsx b/x-pack/plugins/siem/public/cases/containers/configure/use_connectors.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/containers/case/configure/use_connectors.test.tsx rename to x-pack/plugins/siem/public/cases/containers/configure/use_connectors.test.tsx diff --git a/x-pack/plugins/siem/public/containers/case/configure/use_connectors.tsx b/x-pack/plugins/siem/public/cases/containers/configure/use_connectors.tsx similarity index 95% rename from x-pack/plugins/siem/public/containers/case/configure/use_connectors.tsx rename to x-pack/plugins/siem/public/cases/containers/configure/use_connectors.tsx index 30108ecf33874..9cd755864d37b 100644 --- a/x-pack/plugins/siem/public/containers/case/configure/use_connectors.tsx +++ b/x-pack/plugins/siem/public/cases/containers/configure/use_connectors.tsx @@ -6,7 +6,7 @@ import { useState, useEffect, useCallback } from 'react'; -import { useStateToaster, errorToToaster } from '../../../components/toasters'; +import { useStateToaster, errorToToaster } from '../../../common/components/toasters'; import * as i18n from '../translations'; import { fetchConnectors } from './api'; import { Connector } from './types'; diff --git a/x-pack/plugins/siem/public/containers/case/constants.ts b/x-pack/plugins/siem/public/cases/containers/constants.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/case/constants.ts rename to x-pack/plugins/siem/public/cases/containers/constants.ts diff --git a/x-pack/plugins/siem/public/containers/case/mock.ts b/x-pack/plugins/siem/public/cases/containers/mock.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/case/mock.ts rename to x-pack/plugins/siem/public/cases/containers/mock.ts diff --git a/x-pack/plugins/siem/public/containers/case/translations.ts b/x-pack/plugins/siem/public/cases/containers/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/case/translations.ts rename to x-pack/plugins/siem/public/cases/containers/translations.ts diff --git a/x-pack/plugins/siem/public/containers/case/types.ts b/x-pack/plugins/siem/public/cases/containers/types.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/case/types.ts rename to x-pack/plugins/siem/public/cases/containers/types.ts diff --git a/x-pack/plugins/siem/public/containers/case/use_bulk_update_case.test.tsx b/x-pack/plugins/siem/public/cases/containers/use_bulk_update_case.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/containers/case/use_bulk_update_case.test.tsx rename to x-pack/plugins/siem/public/cases/containers/use_bulk_update_case.test.tsx diff --git a/x-pack/plugins/siem/public/containers/case/use_bulk_update_case.tsx b/x-pack/plugins/siem/public/cases/containers/use_bulk_update_case.tsx similarity index 96% rename from x-pack/plugins/siem/public/containers/case/use_bulk_update_case.tsx rename to x-pack/plugins/siem/public/cases/containers/use_bulk_update_case.tsx index d0cc4d99f8f9f..b9b64aa77493a 100644 --- a/x-pack/plugins/siem/public/containers/case/use_bulk_update_case.tsx +++ b/x-pack/plugins/siem/public/cases/containers/use_bulk_update_case.tsx @@ -5,7 +5,11 @@ */ import { useCallback, useReducer } from 'react'; -import { displaySuccessToast, errorToToaster, useStateToaster } from '../../components/toasters'; +import { + displaySuccessToast, + errorToToaster, + useStateToaster, +} from '../../common/components/toasters'; import * as i18n from './translations'; import { patchCasesStatus } from './api'; import { BulkUpdateStatus, Case } from './types'; diff --git a/x-pack/plugins/siem/public/containers/case/use_delete_cases.test.tsx b/x-pack/plugins/siem/public/cases/containers/use_delete_cases.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/containers/case/use_delete_cases.test.tsx rename to x-pack/plugins/siem/public/cases/containers/use_delete_cases.test.tsx diff --git a/x-pack/plugins/siem/public/containers/case/use_delete_cases.tsx b/x-pack/plugins/siem/public/cases/containers/use_delete_cases.tsx similarity index 97% rename from x-pack/plugins/siem/public/containers/case/use_delete_cases.tsx rename to x-pack/plugins/siem/public/cases/containers/use_delete_cases.tsx index 3c49be551c064..31a73351de8f5 100644 --- a/x-pack/plugins/siem/public/containers/case/use_delete_cases.tsx +++ b/x-pack/plugins/siem/public/cases/containers/use_delete_cases.tsx @@ -5,7 +5,11 @@ */ import { useCallback, useReducer } from 'react'; -import { displaySuccessToast, errorToToaster, useStateToaster } from '../../components/toasters'; +import { + displaySuccessToast, + errorToToaster, + useStateToaster, +} from '../../common/components/toasters'; import * as i18n from './translations'; import { deleteCases } from './api'; import { DeleteCase } from './types'; diff --git a/x-pack/plugins/siem/public/containers/case/use_get_action_license.test.tsx b/x-pack/plugins/siem/public/cases/containers/use_get_action_license.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/containers/case/use_get_action_license.test.tsx rename to x-pack/plugins/siem/public/cases/containers/use_get_action_license.test.tsx diff --git a/x-pack/plugins/siem/public/containers/case/use_get_action_license.tsx b/x-pack/plugins/siem/public/cases/containers/use_get_action_license.tsx similarity index 96% rename from x-pack/plugins/siem/public/containers/case/use_get_action_license.tsx rename to x-pack/plugins/siem/public/cases/containers/use_get_action_license.tsx index 0d28a1b20c61f..c09cc8dedd379 100644 --- a/x-pack/plugins/siem/public/containers/case/use_get_action_license.tsx +++ b/x-pack/plugins/siem/public/cases/containers/use_get_action_license.tsx @@ -6,7 +6,7 @@ import { useCallback, useEffect, useState } from 'react'; -import { errorToToaster, useStateToaster } from '../../components/toasters'; +import { errorToToaster, useStateToaster } from '../../common/components/toasters'; import { getActionLicense } from './api'; import * as i18n from './translations'; import { ActionLicense } from './types'; diff --git a/x-pack/plugins/siem/public/containers/case/use_get_case.test.tsx b/x-pack/plugins/siem/public/cases/containers/use_get_case.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/containers/case/use_get_case.test.tsx rename to x-pack/plugins/siem/public/cases/containers/use_get_case.test.tsx diff --git a/x-pack/plugins/siem/public/containers/case/use_get_case.tsx b/x-pack/plugins/siem/public/cases/containers/use_get_case.tsx similarity index 97% rename from x-pack/plugins/siem/public/containers/case/use_get_case.tsx rename to x-pack/plugins/siem/public/cases/containers/use_get_case.tsx index 06d4c38ddda49..01ada00ba9b72 100644 --- a/x-pack/plugins/siem/public/containers/case/use_get_case.tsx +++ b/x-pack/plugins/siem/public/cases/containers/use_get_case.tsx @@ -8,7 +8,7 @@ import { useEffect, useReducer, useCallback } from 'react'; import { Case } from './types'; import * as i18n from './translations'; -import { errorToToaster, useStateToaster } from '../../components/toasters'; +import { errorToToaster, useStateToaster } from '../../common/components/toasters'; import { getCase } from './api'; interface CaseState { diff --git a/x-pack/plugins/siem/public/containers/case/use_get_case_user_actions.test.tsx b/x-pack/plugins/siem/public/cases/containers/use_get_case_user_actions.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/containers/case/use_get_case_user_actions.test.tsx rename to x-pack/plugins/siem/public/cases/containers/use_get_case_user_actions.test.tsx diff --git a/x-pack/plugins/siem/public/containers/case/use_get_case_user_actions.tsx b/x-pack/plugins/siem/public/cases/containers/use_get_case_user_actions.tsx similarity index 98% rename from x-pack/plugins/siem/public/containers/case/use_get_case_user_actions.tsx rename to x-pack/plugins/siem/public/cases/containers/use_get_case_user_actions.tsx index 5afe06a9828e5..2848d56378cd2 100644 --- a/x-pack/plugins/siem/public/containers/case/use_get_case_user_actions.tsx +++ b/x-pack/plugins/siem/public/cases/containers/use_get_case_user_actions.tsx @@ -7,7 +7,7 @@ import { isEmpty, uniqBy } from 'lodash/fp'; import { useCallback, useEffect, useState } from 'react'; -import { errorToToaster, useStateToaster } from '../../components/toasters'; +import { errorToToaster, useStateToaster } from '../../common/components/toasters'; import { getCaseUserActions } from './api'; import * as i18n from './translations'; import { CaseExternalService, CaseUserActions, ElasticUser } from './types'; diff --git a/x-pack/plugins/siem/public/containers/case/use_get_cases.test.tsx b/x-pack/plugins/siem/public/cases/containers/use_get_cases.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/containers/case/use_get_cases.test.tsx rename to x-pack/plugins/siem/public/cases/containers/use_get_cases.test.tsx diff --git a/x-pack/plugins/siem/public/containers/case/use_get_cases.tsx b/x-pack/plugins/siem/public/cases/containers/use_get_cases.tsx similarity index 98% rename from x-pack/plugins/siem/public/containers/case/use_get_cases.tsx rename to x-pack/plugins/siem/public/cases/containers/use_get_cases.tsx index 465b50dbdc1bc..b0701c71b857e 100644 --- a/x-pack/plugins/siem/public/containers/case/use_get_cases.tsx +++ b/x-pack/plugins/siem/public/cases/containers/use_get_cases.tsx @@ -7,7 +7,7 @@ import { useCallback, useEffect, useReducer } from 'react'; import { DEFAULT_TABLE_ACTIVE_PAGE, DEFAULT_TABLE_LIMIT } from './constants'; import { AllCases, SortFieldCase, FilterOptions, QueryParams, Case } from './types'; -import { errorToToaster, useStateToaster } from '../../components/toasters'; +import { errorToToaster, useStateToaster } from '../../common/components/toasters'; import * as i18n from './translations'; import { UpdateByKey } from './use_update_case'; import { getCases, patchCase } from './api'; diff --git a/x-pack/plugins/siem/public/containers/case/use_get_cases_status.test.tsx b/x-pack/plugins/siem/public/cases/containers/use_get_cases_status.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/containers/case/use_get_cases_status.test.tsx rename to x-pack/plugins/siem/public/cases/containers/use_get_cases_status.test.tsx diff --git a/x-pack/plugins/siem/public/containers/case/use_get_cases_status.tsx b/x-pack/plugins/siem/public/cases/containers/use_get_cases_status.tsx similarity index 96% rename from x-pack/plugins/siem/public/containers/case/use_get_cases_status.tsx rename to x-pack/plugins/siem/public/cases/containers/use_get_cases_status.tsx index 0788464602357..476462b7e4c28 100644 --- a/x-pack/plugins/siem/public/containers/case/use_get_cases_status.tsx +++ b/x-pack/plugins/siem/public/cases/containers/use_get_cases_status.tsx @@ -6,7 +6,7 @@ import { useCallback, useEffect, useState } from 'react'; -import { errorToToaster, useStateToaster } from '../../components/toasters'; +import { errorToToaster, useStateToaster } from '../../common/components/toasters'; import { getCasesStatus } from './api'; import * as i18n from './translations'; import { CasesStatus } from './types'; diff --git a/x-pack/plugins/siem/public/containers/case/use_get_reporters.test.tsx b/x-pack/plugins/siem/public/cases/containers/use_get_reporters.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/containers/case/use_get_reporters.test.tsx rename to x-pack/plugins/siem/public/cases/containers/use_get_reporters.test.tsx diff --git a/x-pack/plugins/siem/public/containers/case/use_get_reporters.tsx b/x-pack/plugins/siem/public/cases/containers/use_get_reporters.tsx similarity index 96% rename from x-pack/plugins/siem/public/containers/case/use_get_reporters.tsx rename to x-pack/plugins/siem/public/cases/containers/use_get_reporters.tsx index 01679ae4ccd82..5bfc8c84d1ecc 100644 --- a/x-pack/plugins/siem/public/containers/case/use_get_reporters.tsx +++ b/x-pack/plugins/siem/public/cases/containers/use_get_reporters.tsx @@ -8,7 +8,7 @@ import { useCallback, useEffect, useState } from 'react'; import { isEmpty } from 'lodash/fp'; import { User } from '../../../../case/common/api'; -import { errorToToaster, useStateToaster } from '../../components/toasters'; +import { errorToToaster, useStateToaster } from '../../common/components/toasters'; import { getReporters } from './api'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/containers/case/use_get_tags.test.tsx b/x-pack/plugins/siem/public/cases/containers/use_get_tags.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/containers/case/use_get_tags.test.tsx rename to x-pack/plugins/siem/public/cases/containers/use_get_tags.test.tsx diff --git a/x-pack/plugins/siem/public/containers/case/use_get_tags.tsx b/x-pack/plugins/siem/public/cases/containers/use_get_tags.tsx similarity index 96% rename from x-pack/plugins/siem/public/containers/case/use_get_tags.tsx rename to x-pack/plugins/siem/public/cases/containers/use_get_tags.tsx index 99bb65fa160f7..14f5e35bc4976 100644 --- a/x-pack/plugins/siem/public/containers/case/use_get_tags.tsx +++ b/x-pack/plugins/siem/public/cases/containers/use_get_tags.tsx @@ -6,7 +6,7 @@ import { useEffect, useReducer } from 'react'; -import { errorToToaster, useStateToaster } from '../../components/toasters'; +import { errorToToaster, useStateToaster } from '../../common/components/toasters'; import { getTags } from './api'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/containers/case/use_post_case.test.tsx b/x-pack/plugins/siem/public/cases/containers/use_post_case.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/containers/case/use_post_case.test.tsx rename to x-pack/plugins/siem/public/cases/containers/use_post_case.test.tsx diff --git a/x-pack/plugins/siem/public/containers/case/use_post_case.tsx b/x-pack/plugins/siem/public/cases/containers/use_post_case.tsx similarity index 96% rename from x-pack/plugins/siem/public/containers/case/use_post_case.tsx rename to x-pack/plugins/siem/public/cases/containers/use_post_case.tsx index b33269f26e97d..13cfc2738620f 100644 --- a/x-pack/plugins/siem/public/containers/case/use_post_case.tsx +++ b/x-pack/plugins/siem/public/cases/containers/use_post_case.tsx @@ -7,7 +7,7 @@ import { useReducer, useCallback } from 'react'; import { CasePostRequest } from '../../../../case/common/api'; -import { errorToToaster, useStateToaster } from '../../components/toasters'; +import { errorToToaster, useStateToaster } from '../../common/components/toasters'; import { postCase } from './api'; import * as i18n from './translations'; import { Case } from './types'; diff --git a/x-pack/plugins/siem/public/containers/case/use_post_comment.test.tsx b/x-pack/plugins/siem/public/cases/containers/use_post_comment.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/containers/case/use_post_comment.test.tsx rename to x-pack/plugins/siem/public/cases/containers/use_post_comment.test.tsx diff --git a/x-pack/plugins/siem/public/containers/case/use_post_comment.tsx b/x-pack/plugins/siem/public/cases/containers/use_post_comment.tsx similarity index 96% rename from x-pack/plugins/siem/public/containers/case/use_post_comment.tsx rename to x-pack/plugins/siem/public/cases/containers/use_post_comment.tsx index c7d3b4125aada..9a52eaaf0db6b 100644 --- a/x-pack/plugins/siem/public/containers/case/use_post_comment.tsx +++ b/x-pack/plugins/siem/public/cases/containers/use_post_comment.tsx @@ -7,7 +7,7 @@ import { useReducer, useCallback } from 'react'; import { CommentRequest } from '../../../../case/common/api'; -import { errorToToaster, useStateToaster } from '../../components/toasters'; +import { errorToToaster, useStateToaster } from '../../common/components/toasters'; import { postComment } from './api'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/containers/case/use_post_push_to_service.test.tsx b/x-pack/plugins/siem/public/cases/containers/use_post_push_to_service.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/containers/case/use_post_push_to_service.test.tsx rename to x-pack/plugins/siem/public/cases/containers/use_post_push_to_service.test.tsx diff --git a/x-pack/plugins/siem/public/containers/case/use_post_push_to_service.tsx b/x-pack/plugins/siem/public/cases/containers/use_post_push_to_service.tsx similarity index 98% rename from x-pack/plugins/siem/public/containers/case/use_post_push_to_service.tsx rename to x-pack/plugins/siem/public/cases/containers/use_post_push_to_service.tsx index 7f4c4a4276172..def324dcf442e 100644 --- a/x-pack/plugins/siem/public/containers/case/use_post_push_to_service.tsx +++ b/x-pack/plugins/siem/public/cases/containers/use_post_push_to_service.tsx @@ -10,7 +10,11 @@ import { ServiceConnectorCaseResponse, ServiceConnectorCaseParams, } from '../../../../case/common/api'; -import { errorToToaster, useStateToaster, displaySuccessToast } from '../../components/toasters'; +import { + errorToToaster, + useStateToaster, + displaySuccessToast, +} from '../../common/components/toasters'; import { getCase, pushToService, pushCase } from './api'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/containers/case/use_update_case.test.tsx b/x-pack/plugins/siem/public/cases/containers/use_update_case.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/containers/case/use_update_case.test.tsx rename to x-pack/plugins/siem/public/cases/containers/use_update_case.test.tsx diff --git a/x-pack/plugins/siem/public/containers/case/use_update_case.tsx b/x-pack/plugins/siem/public/cases/containers/use_update_case.tsx similarity index 96% rename from x-pack/plugins/siem/public/containers/case/use_update_case.tsx rename to x-pack/plugins/siem/public/cases/containers/use_update_case.tsx index af824674999b9..77cf53165d914 100644 --- a/x-pack/plugins/siem/public/containers/case/use_update_case.tsx +++ b/x-pack/plugins/siem/public/cases/containers/use_update_case.tsx @@ -5,7 +5,11 @@ */ import { useReducer, useCallback } from 'react'; -import { displaySuccessToast, errorToToaster, useStateToaster } from '../../components/toasters'; +import { + displaySuccessToast, + errorToToaster, + useStateToaster, +} from '../../common/components/toasters'; import { CasePatchRequest } from '../../../../case/common/api'; import { patchCase } from './api'; diff --git a/x-pack/plugins/siem/public/containers/case/use_update_comment.test.tsx b/x-pack/plugins/siem/public/cases/containers/use_update_comment.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/containers/case/use_update_comment.test.tsx rename to x-pack/plugins/siem/public/cases/containers/use_update_comment.test.tsx diff --git a/x-pack/plugins/siem/public/containers/case/use_update_comment.tsx b/x-pack/plugins/siem/public/cases/containers/use_update_comment.tsx similarity index 97% rename from x-pack/plugins/siem/public/containers/case/use_update_comment.tsx rename to x-pack/plugins/siem/public/cases/containers/use_update_comment.tsx index ffc5cffee7a55..66064faea27d7 100644 --- a/x-pack/plugins/siem/public/containers/case/use_update_comment.tsx +++ b/x-pack/plugins/siem/public/cases/containers/use_update_comment.tsx @@ -6,7 +6,7 @@ import { useReducer, useCallback } from 'react'; -import { errorToToaster, useStateToaster } from '../../components/toasters'; +import { errorToToaster, useStateToaster } from '../../common/components/toasters'; import { patchComment } from './api'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/containers/case/utils.ts b/x-pack/plugins/siem/public/cases/containers/utils.ts similarity index 98% rename from x-pack/plugins/siem/public/containers/case/utils.ts rename to x-pack/plugins/siem/public/cases/containers/utils.ts index 15e514d6ea8b3..ebaba0fe42f78 100644 --- a/x-pack/plugins/siem/public/containers/case/utils.ts +++ b/x-pack/plugins/siem/public/cases/containers/utils.ts @@ -26,7 +26,7 @@ import { ServiceConnectorCaseResponseRt, ServiceConnectorCaseResponse, } from '../../../../case/common/api'; -import { ToasterError } from '../../components/toasters'; +import { ToasterError } from '../../common/components/toasters'; import { AllCases, Case } from './types'; export const getTypedPayload = (a: unknown): T => a as T; diff --git a/x-pack/plugins/siem/public/cases/index.ts b/x-pack/plugins/siem/public/cases/index.ts new file mode 100644 index 0000000000000..1eb8c82532e21 --- /dev/null +++ b/x-pack/plugins/siem/public/cases/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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { SecuritySubPlugin } from '../app/types'; +import { getCasesRoutes } from './routes'; + +export class Cases { + public setup() {} + + public start(): SecuritySubPlugin { + return { + routes: getCasesRoutes(), + }; + } +} diff --git a/x-pack/plugins/siem/public/pages/case/case.tsx b/x-pack/plugins/siem/public/cases/pages/case.tsx similarity index 74% rename from x-pack/plugins/siem/public/pages/case/case.tsx rename to x-pack/plugins/siem/public/cases/pages/case.tsx index 2b613f6692df1..03ebec34c2cdd 100644 --- a/x-pack/plugins/siem/public/pages/case/case.tsx +++ b/x-pack/plugins/siem/public/cases/pages/case.tsx @@ -6,12 +6,12 @@ import React from 'react'; -import { WrapperPage } from '../../components/wrapper_page'; -import { useGetUserSavedObjectPermissions } from '../../lib/kibana'; -import { SpyRoute } from '../../utils/route/spy_routes'; -import { AllCases } from './components/all_cases'; +import { WrapperPage } from '../../common/components/wrapper_page'; +import { useGetUserSavedObjectPermissions } from '../../common/lib/kibana'; +import { SpyRoute } from '../../common/utils/route/spy_routes'; +import { AllCases } from '../components/all_cases'; -import { savedObjectReadOnly, CaseCallOut } from './components/callout'; +import { savedObjectReadOnly, CaseCallOut } from '../components/callout'; import { CaseSavedObjectNoPermissions } from './saved_object_no_permissions'; export const CasesPage = React.memo(() => { diff --git a/x-pack/plugins/siem/public/pages/case/case_details.tsx b/x-pack/plugins/siem/public/cases/pages/case_details.tsx similarity index 68% rename from x-pack/plugins/siem/public/pages/case/case_details.tsx rename to x-pack/plugins/siem/public/cases/pages/case_details.tsx index 4bb8afa7f8d42..5ea5e52951592 100644 --- a/x-pack/plugins/siem/public/pages/case/case_details.tsx +++ b/x-pack/plugins/siem/public/cases/pages/case_details.tsx @@ -7,13 +7,13 @@ import React from 'react'; import { useParams, Redirect } from 'react-router-dom'; -import { useGetUrlSearch } from '../../components/navigation/use_get_url_search'; -import { useGetUserSavedObjectPermissions } from '../../lib/kibana'; -import { SpyRoute } from '../../utils/route/spy_routes'; -import { getCaseUrl } from '../../components/link_to'; -import { navTabs } from '../home/home_navigations'; -import { CaseView } from './components/case_view'; -import { savedObjectReadOnly, CaseCallOut } from './components/callout'; +import { useGetUrlSearch } from '../../common/components/navigation/use_get_url_search'; +import { useGetUserSavedObjectPermissions } from '../../common/lib/kibana'; +import { SpyRoute } from '../../common/utils/route/spy_routes'; +import { getCaseUrl } from '../../common/components/link_to'; +import { navTabs } from '../../app/home/home_navigations'; +import { CaseView } from '../components/case_view'; +import { savedObjectReadOnly, CaseCallOut } from '../components/callout'; export const CaseDetailsPage = React.memo(() => { const userPermissions = useGetUserSavedObjectPermissions(); diff --git a/x-pack/plugins/siem/public/pages/case/configure_cases.tsx b/x-pack/plugins/siem/public/cases/pages/configure_cases.tsx similarity index 68% rename from x-pack/plugins/siem/public/pages/case/configure_cases.tsx rename to x-pack/plugins/siem/public/cases/pages/configure_cases.tsx index 7515efa0e1b7a..bea3a9fb110ab 100644 --- a/x-pack/plugins/siem/public/pages/case/configure_cases.tsx +++ b/x-pack/plugins/siem/public/cases/pages/configure_cases.tsx @@ -7,15 +7,15 @@ import React, { useMemo } from 'react'; import { Redirect } from 'react-router-dom'; -import { getCaseUrl } from '../../components/link_to'; -import { useGetUrlSearch } from '../../components/navigation/use_get_url_search'; -import { WrapperPage } from '../../components/wrapper_page'; -import { useGetUserSavedObjectPermissions } from '../../lib/kibana'; -import { SpyRoute } from '../../utils/route/spy_routes'; -import { navTabs } from '../home/home_navigations'; -import { CaseHeaderPage } from './components/case_header_page'; -import { ConfigureCases } from './components/configure_cases'; -import { WhitePageWrapper, SectionWrapper } from './components/wrappers'; +import { getCaseUrl } from '../../common/components/link_to'; +import { useGetUrlSearch } from '../../common/components/navigation/use_get_url_search'; +import { WrapperPage } from '../../common/components/wrapper_page'; +import { useGetUserSavedObjectPermissions } from '../../common/lib/kibana'; +import { SpyRoute } from '../../common/utils/route/spy_routes'; +import { navTabs } from '../../app/home/home_navigations'; +import { CaseHeaderPage } from '../components/case_header_page'; +import { ConfigureCases } from '../components/configure_cases'; +import { WhitePageWrapper, SectionWrapper } from '../components/wrappers'; import * as i18n from './translations'; const wrapperPageStyle: Record = { diff --git a/x-pack/plugins/siem/public/pages/case/create_case.tsx b/x-pack/plugins/siem/public/cases/pages/create_case.tsx similarity index 65% rename from x-pack/plugins/siem/public/pages/case/create_case.tsx rename to x-pack/plugins/siem/public/cases/pages/create_case.tsx index 06cb7fadfb8d3..c586a90e5ef9c 100644 --- a/x-pack/plugins/siem/public/pages/case/create_case.tsx +++ b/x-pack/plugins/siem/public/cases/pages/create_case.tsx @@ -7,14 +7,14 @@ import React, { useMemo } from 'react'; import { Redirect } from 'react-router-dom'; -import { getCaseUrl } from '../../components/link_to'; -import { useGetUrlSearch } from '../../components/navigation/use_get_url_search'; -import { WrapperPage } from '../../components/wrapper_page'; -import { useGetUserSavedObjectPermissions } from '../../lib/kibana'; -import { SpyRoute } from '../../utils/route/spy_routes'; -import { navTabs } from '../home/home_navigations'; -import { CaseHeaderPage } from './components/case_header_page'; -import { Create } from './components/create'; +import { getCaseUrl } from '../../common/components/link_to'; +import { useGetUrlSearch } from '../../common/components/navigation/use_get_url_search'; +import { WrapperPage } from '../../common/components/wrapper_page'; +import { useGetUserSavedObjectPermissions } from '../../common/lib/kibana'; +import { SpyRoute } from '../../common/utils/route/spy_routes'; +import { navTabs } from '../../app/home/home_navigations'; +import { CaseHeaderPage } from '../components/case_header_page'; +import { Create } from '../components/create'; import * as i18n from './translations'; export const CreateCasePage = React.memo(() => { diff --git a/x-pack/plugins/siem/public/pages/case/index.tsx b/x-pack/plugins/siem/public/cases/pages/index.tsx similarity index 96% rename from x-pack/plugins/siem/public/pages/case/index.tsx rename to x-pack/plugins/siem/public/cases/pages/index.tsx index 124cefa726a8b..32f64d2690cba 100644 --- a/x-pack/plugins/siem/public/pages/case/index.tsx +++ b/x-pack/plugins/siem/public/cases/pages/index.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { Route, Switch } from 'react-router-dom'; -import { SiemPageName } from '../home/types'; +import { SiemPageName } from '../../app/types'; import { CaseDetailsPage } from './case_details'; import { CasesPage } from './case'; import { CreateCasePage } from './create_case'; diff --git a/x-pack/plugins/siem/public/pages/case/saved_object_no_permissions.tsx b/x-pack/plugins/siem/public/cases/pages/saved_object_no_permissions.tsx similarity index 88% rename from x-pack/plugins/siem/public/pages/case/saved_object_no_permissions.tsx rename to x-pack/plugins/siem/public/cases/pages/saved_object_no_permissions.tsx index 689c290c91019..a560f697de415 100644 --- a/x-pack/plugins/siem/public/pages/case/saved_object_no_permissions.tsx +++ b/x-pack/plugins/siem/public/cases/pages/saved_object_no_permissions.tsx @@ -6,9 +6,9 @@ import React from 'react'; -import { EmptyPage } from '../../components/empty_page'; +import { EmptyPage } from '../../common/components/empty_page'; import * as i18n from './translations'; -import { useKibana } from '../../lib/kibana'; +import { useKibana } from '../../common/lib/kibana'; export const CaseSavedObjectNoPermissions = React.memo(() => { const docLinks = useKibana().services.docLinks; diff --git a/x-pack/plugins/siem/public/pages/case/translations.ts b/x-pack/plugins/siem/public/cases/pages/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/case/translations.ts rename to x-pack/plugins/siem/public/cases/pages/translations.ts diff --git a/x-pack/plugins/siem/public/pages/case/utils.ts b/x-pack/plugins/siem/public/cases/pages/utils.ts similarity index 92% rename from x-pack/plugins/siem/public/pages/case/utils.ts rename to x-pack/plugins/siem/public/cases/pages/utils.ts index f1aea747485e4..0b60d66756d0c 100644 --- a/x-pack/plugins/siem/public/pages/case/utils.ts +++ b/x-pack/plugins/siem/public/cases/pages/utils.ts @@ -8,8 +8,8 @@ import { isEmpty } from 'lodash/fp'; import { ChromeBreadcrumb } from 'src/core/public'; -import { getCaseDetailsUrl, getCaseUrl, getCreateCaseUrl } from '../../components/link_to'; -import { RouteSpyState } from '../../utils/route/types'; +import { getCaseDetailsUrl, getCaseUrl, getCreateCaseUrl } from '../../common/components/link_to'; +import { RouteSpyState } from '../../common/utils/route/types'; import * as i18n from './translations'; export const getBreadcrumbs = (params: RouteSpyState, search: string[]): ChromeBreadcrumb[] => { diff --git a/x-pack/plugins/siem/public/cases/routes.tsx b/x-pack/plugins/siem/public/cases/routes.tsx new file mode 100644 index 0000000000000..698350e49bc3e --- /dev/null +++ b/x-pack/plugins/siem/public/cases/routes.tsx @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { Route } from 'react-router-dom'; + +import { Case } from './pages'; +import { SiemPageName } from '../app/types'; + +export const getCasesRoutes = () => [ + + + , +]; diff --git a/x-pack/plugins/siem/public/cases/translations.ts b/x-pack/plugins/siem/public/cases/translations.ts new file mode 100644 index 0000000000000..782ba9d9f32db --- /dev/null +++ b/x-pack/plugins/siem/public/cases/translations.ts @@ -0,0 +1,205 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { i18n } from '@kbn/i18n'; + +export const SAVED_OBJECT_NO_PERMISSIONS_TITLE = i18n.translate( + 'xpack.siem.case.caseSavedObjectNoPermissionsTitle', + { + defaultMessage: 'Kibana feature privileges required', + } +); + +export const SAVED_OBJECT_NO_PERMISSIONS_MSG = i18n.translate( + 'xpack.siem.case.caseSavedObjectNoPermissionsMessage', + { + defaultMessage: + 'To view cases, you must have privileges for the Saved Object Management feature in the Kibana space. For more information, contact your Kibana administrator.', + } +); + +export const BACK_TO_ALL = i18n.translate('xpack.siem.case.caseView.backLabel', { + defaultMessage: 'Back to cases', +}); + +export const CANCEL = i18n.translate('xpack.siem.case.caseView.cancel', { + defaultMessage: 'Cancel', +}); + +export const DELETE_CASE = i18n.translate('xpack.siem.case.confirmDeleteCase.deleteCase', { + defaultMessage: 'Delete case', +}); + +export const DELETE_CASES = i18n.translate('xpack.siem.case.confirmDeleteCase.deleteCases', { + defaultMessage: 'Delete cases', +}); + +export const NAME = i18n.translate('xpack.siem.case.caseView.name', { + defaultMessage: 'Name', +}); + +export const OPENED_ON = i18n.translate('xpack.siem.case.caseView.openedOn', { + defaultMessage: 'Opened on', +}); + +export const CLOSED_ON = i18n.translate('xpack.siem.case.caseView.closedOn', { + defaultMessage: 'Closed on', +}); + +export const REPORTER = i18n.translate('xpack.siem.case.caseView.reporterLabel', { + defaultMessage: 'Reporter', +}); + +export const PARTICIPANTS = i18n.translate('xpack.siem.case.caseView.particpantsLabel', { + defaultMessage: 'Participants', +}); + +export const CREATE_BC_TITLE = i18n.translate('xpack.siem.case.caseView.breadcrumb', { + defaultMessage: 'Create', +}); + +export const CREATE_TITLE = i18n.translate('xpack.siem.case.caseView.create', { + defaultMessage: 'Create new case', +}); + +export const DESCRIPTION = i18n.translate('xpack.siem.case.caseView.description', { + defaultMessage: 'Description', +}); + +export const DESCRIPTION_REQUIRED = i18n.translate( + 'xpack.siem.case.createCase.descriptionFieldRequiredError', + { + defaultMessage: 'A description is required.', + } +); + +export const COMMENT_REQUIRED = i18n.translate( + 'xpack.siem.case.caseView.commentFieldRequiredError', + { + defaultMessage: 'A comment is required.', + } +); + +export const REQUIRED_FIELD = i18n.translate('xpack.siem.case.caseView.fieldRequiredError', { + defaultMessage: 'Required field', +}); + +export const EDIT = i18n.translate('xpack.siem.case.caseView.edit', { + defaultMessage: 'Edit', +}); + +export const OPTIONAL = i18n.translate('xpack.siem.case.caseView.optional', { + defaultMessage: 'Optional', +}); + +export const PAGE_TITLE = i18n.translate('xpack.siem.case.pageTitle', { + defaultMessage: 'Cases', +}); + +export const CREATE_CASE = i18n.translate('xpack.siem.case.caseView.createCase', { + defaultMessage: 'Create case', +}); + +export const CLOSED_CASE = i18n.translate('xpack.siem.case.caseView.closedCase', { + defaultMessage: 'Closed case', +}); + +export const CLOSE_CASE = i18n.translate('xpack.siem.case.caseView.closeCase', { + defaultMessage: 'Close case', +}); + +export const REOPEN_CASE = i18n.translate('xpack.siem.case.caseView.reopenCase', { + defaultMessage: 'Reopen case', +}); + +export const REOPENED_CASE = i18n.translate('xpack.siem.case.caseView.reopenedCase', { + defaultMessage: 'Reopened case', +}); + +export const CASE_NAME = i18n.translate('xpack.siem.case.caseView.caseName', { + defaultMessage: 'Case name', +}); + +export const TO = i18n.translate('xpack.siem.case.caseView.to', { + defaultMessage: 'to', +}); + +export const TAGS = i18n.translate('xpack.siem.case.caseView.tags', { + defaultMessage: 'Tags', +}); + +export const ACTIONS = i18n.translate('xpack.siem.case.allCases.actions', { + defaultMessage: 'Actions', +}); + +export const NO_TAGS_AVAILABLE = i18n.translate('xpack.siem.case.allCases.noTagsAvailable', { + defaultMessage: 'No tags available', +}); + +export const NO_REPORTERS_AVAILABLE = i18n.translate( + 'xpack.siem.case.caseView.noReportersAvailable', + { + defaultMessage: 'No reporters available.', + } +); + +export const COMMENTS = i18n.translate('xpack.siem.case.allCases.comments', { + defaultMessage: 'Comments', +}); + +export const TAGS_HELP = i18n.translate('xpack.siem.case.createCase.fieldTagsHelpText', { + defaultMessage: + 'Type one or more custom identifying tags for this case. Press enter after each tag to begin a new one.', +}); + +export const NO_TAGS = i18n.translate('xpack.siem.case.caseView.noTags', { + defaultMessage: 'No tags are currently assigned to this case.', +}); + +export const TITLE_REQUIRED = i18n.translate('xpack.siem.case.createCase.titleFieldRequiredError', { + defaultMessage: 'A title is required.', +}); + +export const CONFIGURE_CASES_PAGE_TITLE = i18n.translate( + 'xpack.siem.case.configureCases.headerTitle', + { + defaultMessage: 'Configure cases', + } +); + +export const CONFIGURE_CASES_BUTTON = i18n.translate('xpack.siem.case.configureCasesButton', { + defaultMessage: 'Edit external connection', +}); + +export const ADD_COMMENT = i18n.translate('xpack.siem.case.caseView.comment.addComment', { + defaultMessage: 'Add comment', +}); + +export const ADD_COMMENT_HELP_TEXT = i18n.translate( + 'xpack.siem.case.caseView.comment.addCommentHelpText', + { + defaultMessage: 'Add a new comment...', + } +); + +export const SAVE = i18n.translate('xpack.siem.case.caseView.description.save', { + defaultMessage: 'Save', +}); + +export const GO_TO_DOCUMENTATION = i18n.translate( + 'xpack.siem.case.caseView.goToDocumentationButton', + { + defaultMessage: 'View documentation', + } +); + +export const CONNECTORS = i18n.translate('xpack.siem.case.caseView.connectors', { + defaultMessage: 'External incident management system', +}); + +export const EDIT_CONNECTOR = i18n.translate('xpack.siem.case.caseView.editConnector', { + defaultMessage: 'Change external incident management system', +}); diff --git a/x-pack/plugins/siem/public/components/page/add_filter_to_global_search_bar/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/common/components/add_filter_to_global_search_bar/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/page/add_filter_to_global_search_bar/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/add_filter_to_global_search_bar/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/page/add_filter_to_global_search_bar/helpers.test.tsx b/x-pack/plugins/siem/public/common/components/add_filter_to_global_search_bar/helpers.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/page/add_filter_to_global_search_bar/helpers.test.tsx rename to x-pack/plugins/siem/public/common/components/add_filter_to_global_search_bar/helpers.test.tsx diff --git a/x-pack/plugins/siem/public/components/page/add_filter_to_global_search_bar/helpers.ts b/x-pack/plugins/siem/public/common/components/add_filter_to_global_search_bar/helpers.ts similarity index 100% rename from x-pack/plugins/siem/public/components/page/add_filter_to_global_search_bar/helpers.ts rename to x-pack/plugins/siem/public/common/components/add_filter_to_global_search_bar/helpers.ts diff --git a/x-pack/plugins/siem/public/components/page/add_filter_to_global_search_bar/index.test.tsx b/x-pack/plugins/siem/public/common/components/add_filter_to_global_search_bar/index.test.tsx similarity index 91% rename from x-pack/plugins/siem/public/components/page/add_filter_to_global_search_bar/index.test.tsx rename to x-pack/plugins/siem/public/common/components/add_filter_to_global_search_bar/index.test.tsx index 677fc5e102614..18c0032f58c3c 100644 --- a/x-pack/plugins/siem/public/components/page/add_filter_to_global_search_bar/index.test.tsx +++ b/x-pack/plugins/siem/public/common/components/add_filter_to_global_search_bar/index.test.tsx @@ -7,12 +7,17 @@ import { mount, shallow } from 'enzyme'; import React from 'react'; -import { apolloClientObservable, mockGlobalState, TestProviders } from '../../../mock'; -import { createStore, State } from '../../../store'; +import { + apolloClientObservable, + mockGlobalState, + TestProviders, + SUB_PLUGINS_REDUCER, +} from '../../mock'; +import { createStore, State } from '../../store'; import { AddFilterToGlobalSearchBar } from '.'; const mockAddFilters = jest.fn(); -jest.mock('../../../lib/kibana', () => ({ +jest.mock('../../lib/kibana', () => ({ useKibana: () => ({ services: { data: { @@ -28,10 +33,10 @@ jest.mock('../../../lib/kibana', () => ({ describe('AddFilterToGlobalSearchBar Component', () => { const state: State = mockGlobalState; - let store = createStore(state, apolloClientObservable); + let store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); beforeEach(() => { - store = createStore(state, apolloClientObservable); + store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); mockAddFilters.mockClear(); }); diff --git a/x-pack/plugins/siem/public/components/page/add_filter_to_global_search_bar/index.tsx b/x-pack/plugins/siem/public/common/components/add_filter_to_global_search_bar/index.tsx similarity index 95% rename from x-pack/plugins/siem/public/components/page/add_filter_to_global_search_bar/index.tsx rename to x-pack/plugins/siem/public/common/components/add_filter_to_global_search_bar/index.tsx index 7aed36422bd2f..8a294ec1b71fd 100644 --- a/x-pack/plugins/siem/public/components/page/add_filter_to_global_search_bar/index.tsx +++ b/x-pack/plugins/siem/public/common/components/add_filter_to_global_search_bar/index.tsx @@ -8,8 +8,8 @@ import { EuiButtonIcon, EuiToolTip } from '@elastic/eui'; import React, { useCallback } from 'react'; import { Filter } from '../../../../../../../src/plugins/data/public'; -import { WithHoverActions } from '../../with_hover_actions'; -import { useKibana } from '../../../lib/kibana'; +import { WithHoverActions } from '../with_hover_actions'; +import { useKibana } from '../../lib/kibana'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/components/page/add_filter_to_global_search_bar/translations.ts b/x-pack/plugins/siem/public/common/components/add_filter_to_global_search_bar/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/page/add_filter_to_global_search_bar/translations.ts rename to x-pack/plugins/siem/public/common/components/add_filter_to_global_search_bar/translations.ts diff --git a/x-pack/plugins/siem/public/components/alerts_viewer/alerts_table.tsx b/x-pack/plugins/siem/public/common/components/alerts_viewer/alerts_table.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/alerts_viewer/alerts_table.tsx rename to x-pack/plugins/siem/public/common/components/alerts_viewer/alerts_table.tsx index d545a071c3ea6..dd608babef48f 100644 --- a/x-pack/plugins/siem/public/components/alerts_viewer/alerts_table.tsx +++ b/x-pack/plugins/siem/public/common/components/alerts_viewer/alerts_table.tsx @@ -6,7 +6,7 @@ import React, { useMemo } from 'react'; -import { Filter } from '../../../../../../src/plugins/data/public'; +import { Filter } from '../../../../../../../src/plugins/data/public'; import { StatefulEventsViewer } from '../events_viewer'; import * as i18n from './translations'; import { alertsDefaultModel } from './default_headers'; diff --git a/x-pack/plugins/siem/public/components/alerts_viewer/default_headers.ts b/x-pack/plugins/siem/public/common/components/alerts_viewer/default_headers.ts similarity index 85% rename from x-pack/plugins/siem/public/components/alerts_viewer/default_headers.ts rename to x-pack/plugins/siem/public/common/components/alerts_viewer/default_headers.ts index b12bd1b6c2a51..cf5b565b99f67 100644 --- a/x-pack/plugins/siem/public/components/alerts_viewer/default_headers.ts +++ b/x-pack/plugins/siem/public/common/components/alerts_viewer/default_headers.ts @@ -4,13 +4,13 @@ * you may not use this file except in compliance with the Elastic License. */ -import { defaultColumnHeaderType } from '../timeline/body/column_headers/default_headers'; +import { defaultColumnHeaderType } from '../../../timelines/components/timeline/body/column_headers/default_headers'; import { DEFAULT_COLUMN_MIN_WIDTH, DEFAULT_DATE_COLUMN_MIN_WIDTH, -} from '../timeline/body/constants'; -import { ColumnHeaderOptions, SubsetTimelineModel } from '../../store/timeline/model'; -import { timelineDefaults } from '../../store/timeline/defaults'; +} from '../../../timelines/components/timeline/body/constants'; +import { ColumnHeaderOptions, SubsetTimelineModel } from '../../../timelines/store/timeline/model'; +import { timelineDefaults } from '../../../timelines/store/timeline/defaults'; export const alertsHeaders: ColumnHeaderOptions[] = [ { diff --git a/x-pack/plugins/siem/public/components/alerts_viewer/histogram_configs.ts b/x-pack/plugins/siem/public/common/components/alerts_viewer/histogram_configs.ts similarity index 94% rename from x-pack/plugins/siem/public/components/alerts_viewer/histogram_configs.ts rename to x-pack/plugins/siem/public/common/components/alerts_viewer/histogram_configs.ts index fbcf4c6ed039b..5a00079bb056b 100644 --- a/x-pack/plugins/siem/public/components/alerts_viewer/histogram_configs.ts +++ b/x-pack/plugins/siem/public/common/components/alerts_viewer/histogram_configs.ts @@ -3,9 +3,10 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ + import * as i18n from './translations'; import { MatrixHistogramOption, MatrixHisrogramConfigs } from '../matrix_histogram/types'; -import { HistogramType } from '../../graphql/types'; +import { HistogramType } from '../../../graphql/types'; export const alertsStackByOptions: MatrixHistogramOption[] = [ { diff --git a/x-pack/plugins/siem/public/components/alerts_viewer/index.tsx b/x-pack/plugins/siem/public/common/components/alerts_viewer/index.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/alerts_viewer/index.tsx rename to x-pack/plugins/siem/public/common/components/alerts_viewer/index.tsx index 957feb6244792..29f4bdff92ad6 100644 --- a/x-pack/plugins/siem/public/components/alerts_viewer/index.tsx +++ b/x-pack/plugins/siem/public/common/components/alerts_viewer/index.tsx @@ -6,7 +6,7 @@ import React, { useEffect, useCallback, useMemo } from 'react'; import numeral from '@elastic/numeral'; -import { DEFAULT_NUMBER_FORMAT } from '../../../common/constants'; +import { DEFAULT_NUMBER_FORMAT } from '../../../../common/constants'; import { AlertsComponentsQueryProps } from './types'; import { AlertsTable } from './alerts_table'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/components/alerts_viewer/translations.ts b/x-pack/plugins/siem/public/common/components/alerts_viewer/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/alerts_viewer/translations.ts rename to x-pack/plugins/siem/public/common/components/alerts_viewer/translations.ts diff --git a/x-pack/plugins/siem/public/components/alerts_viewer/types.ts b/x-pack/plugins/siem/public/common/components/alerts_viewer/types.ts similarity index 76% rename from x-pack/plugins/siem/public/components/alerts_viewer/types.ts rename to x-pack/plugins/siem/public/common/components/alerts_viewer/types.ts index 321f7214c8fef..2bc33aaf1bae7 100644 --- a/x-pack/plugins/siem/public/components/alerts_viewer/types.ts +++ b/x-pack/plugins/siem/public/common/components/alerts_viewer/types.ts @@ -4,9 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ -import { Filter } from '../../../../../../src/plugins/data/public'; -import { HostsComponentsQueryProps } from '../../pages/hosts/navigation/types'; -import { NetworkComponentQueryProps } from '../../pages/network/navigation/types'; +import { Filter } from '../../../../../../../src/plugins/data/public'; +import { HostsComponentsQueryProps } from '../../../hosts/pages/navigation/types'; +import { NetworkComponentQueryProps } from '../../../network/pages/navigation/types'; import { MatrixHistogramOption } from '../matrix_histogram/types'; type CommonQueryProps = HostsComponentsQueryProps | NetworkComponentQueryProps; diff --git a/x-pack/plugins/siem/public/components/autocomplete_field/__examples__/index.stories.tsx b/x-pack/plugins/siem/public/common/components/autocomplete_field/__examples__/index.stories.tsx similarity index 94% rename from x-pack/plugins/siem/public/components/autocomplete_field/__examples__/index.stories.tsx rename to x-pack/plugins/siem/public/common/components/autocomplete_field/__examples__/index.stories.tsx index dccc156ff6e44..8f261da629f94 100644 --- a/x-pack/plugins/siem/public/components/autocomplete_field/__examples__/index.stories.tsx +++ b/x-pack/plugins/siem/public/common/components/autocomplete_field/__examples__/index.stories.tsx @@ -11,7 +11,7 @@ import euiLightVars from '@elastic/eui/dist/eui_theme_light.json'; import { QuerySuggestion, QuerySuggestionTypes, -} from '../../../../../../../src/plugins/data/public'; +} from '../../../../../../../../src/plugins/data/public'; import { SuggestionItem } from '../suggestion_item'; const suggestion: QuerySuggestion = { diff --git a/x-pack/plugins/siem/public/components/autocomplete_field/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/common/components/autocomplete_field/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/autocomplete_field/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/autocomplete_field/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/autocomplete_field/index.test.tsx b/x-pack/plugins/siem/public/common/components/autocomplete_field/index.test.tsx similarity index 99% rename from x-pack/plugins/siem/public/components/autocomplete_field/index.test.tsx rename to x-pack/plugins/siem/public/common/components/autocomplete_field/index.test.tsx index 72236d799f995..55e114818ffea 100644 --- a/x-pack/plugins/siem/public/components/autocomplete_field/index.test.tsx +++ b/x-pack/plugins/siem/public/common/components/autocomplete_field/index.test.tsx @@ -10,7 +10,10 @@ import { mount, shallow } from 'enzyme'; import { noop } from 'lodash/fp'; import React from 'react'; import { ThemeProvider } from 'styled-components'; -import { QuerySuggestion, QuerySuggestionTypes } from '../../../../../../src/plugins/data/public'; +import { + QuerySuggestion, + QuerySuggestionTypes, +} from '../../../../../../../src/plugins/data/public'; import { TestProviders } from '../../mock'; diff --git a/x-pack/plugins/siem/public/components/autocomplete_field/index.tsx b/x-pack/plugins/siem/public/common/components/autocomplete_field/index.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/autocomplete_field/index.tsx rename to x-pack/plugins/siem/public/common/components/autocomplete_field/index.tsx index 9821bb6048b51..0140a652ba183 100644 --- a/x-pack/plugins/siem/public/components/autocomplete_field/index.tsx +++ b/x-pack/plugins/siem/public/common/components/autocomplete_field/index.tsx @@ -11,9 +11,9 @@ import { EuiPanel, } from '@elastic/eui'; import React from 'react'; -import { QuerySuggestion } from '../../../../../../src/plugins/data/public'; +import { QuerySuggestion } from '../../../../../../../src/plugins/data/public'; -import euiStyled from '../../../../../legacy/common/eui_styled_components'; +import euiStyled from '../../../../../../legacy/common/eui_styled_components'; import { SuggestionItem } from './suggestion_item'; diff --git a/x-pack/plugins/siem/public/components/autocomplete_field/suggestion_item.tsx b/x-pack/plugins/siem/public/common/components/autocomplete_field/suggestion_item.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/autocomplete_field/suggestion_item.tsx rename to x-pack/plugins/siem/public/common/components/autocomplete_field/suggestion_item.tsx index be9a9817265b0..b305663dd48be 100644 --- a/x-pack/plugins/siem/public/components/autocomplete_field/suggestion_item.tsx +++ b/x-pack/plugins/siem/public/common/components/autocomplete_field/suggestion_item.tsx @@ -8,8 +8,8 @@ import { EuiIcon } from '@elastic/eui'; import { transparentize } from 'polished'; import React from 'react'; import styled from 'styled-components'; -import euiStyled from '../../../../../legacy/common/eui_styled_components'; -import { QuerySuggestion } from '../../../../../../src/plugins/data/public'; +import euiStyled from '../../../../../../legacy/common/eui_styled_components'; +import { QuerySuggestion } from '../../../../../../../src/plugins/data/public'; interface SuggestionItemProps { isSelected?: boolean; diff --git a/x-pack/plugins/siem/public/components/charts/__snapshots__/areachart.test.tsx.snap b/x-pack/plugins/siem/public/common/components/charts/__snapshots__/areachart.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/charts/__snapshots__/areachart.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/charts/__snapshots__/areachart.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/charts/__snapshots__/barchart.test.tsx.snap b/x-pack/plugins/siem/public/common/components/charts/__snapshots__/barchart.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/charts/__snapshots__/barchart.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/charts/__snapshots__/barchart.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/charts/areachart.test.tsx b/x-pack/plugins/siem/public/common/components/charts/areachart.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/charts/areachart.test.tsx rename to x-pack/plugins/siem/public/common/components/charts/areachart.test.tsx diff --git a/x-pack/plugins/siem/public/components/charts/areachart.tsx b/x-pack/plugins/siem/public/common/components/charts/areachart.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/charts/areachart.tsx rename to x-pack/plugins/siem/public/common/components/charts/areachart.tsx diff --git a/x-pack/plugins/siem/public/components/charts/barchart.test.tsx b/x-pack/plugins/siem/public/common/components/charts/barchart.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/charts/barchart.test.tsx rename to x-pack/plugins/siem/public/common/components/charts/barchart.test.tsx diff --git a/x-pack/plugins/siem/public/components/charts/barchart.tsx b/x-pack/plugins/siem/public/common/components/charts/barchart.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/charts/barchart.tsx rename to x-pack/plugins/siem/public/common/components/charts/barchart.tsx diff --git a/x-pack/plugins/siem/public/components/charts/chart_place_holder.test.tsx b/x-pack/plugins/siem/public/common/components/charts/chart_place_holder.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/charts/chart_place_holder.test.tsx rename to x-pack/plugins/siem/public/common/components/charts/chart_place_holder.test.tsx diff --git a/x-pack/plugins/siem/public/components/charts/chart_place_holder.tsx b/x-pack/plugins/siem/public/common/components/charts/chart_place_holder.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/charts/chart_place_holder.tsx rename to x-pack/plugins/siem/public/common/components/charts/chart_place_holder.tsx diff --git a/x-pack/plugins/siem/public/components/charts/common.test.tsx b/x-pack/plugins/siem/public/common/components/charts/common.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/charts/common.test.tsx rename to x-pack/plugins/siem/public/common/components/charts/common.test.tsx diff --git a/x-pack/plugins/siem/public/components/charts/common.tsx b/x-pack/plugins/siem/public/common/components/charts/common.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/charts/common.tsx rename to x-pack/plugins/siem/public/common/components/charts/common.tsx index 7e4b307916042..1078040e9efd0 100644 --- a/x-pack/plugins/siem/public/components/charts/common.tsx +++ b/x-pack/plugins/siem/public/common/components/charts/common.tsx @@ -20,7 +20,7 @@ import { import React, { useMemo } from 'react'; import styled from 'styled-components'; -import { DEFAULT_DARK_MODE } from '../../../common/constants'; +import { DEFAULT_DARK_MODE } from '../../../../common/constants'; import { useUiSetting } from '../../lib/kibana'; export const defaultChartHeight = '100%'; diff --git a/x-pack/plugins/siem/public/components/charts/draggable_legend.test.tsx b/x-pack/plugins/siem/public/common/components/charts/draggable_legend.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/charts/draggable_legend.test.tsx rename to x-pack/plugins/siem/public/common/components/charts/draggable_legend.test.tsx diff --git a/x-pack/plugins/siem/public/components/charts/draggable_legend.tsx b/x-pack/plugins/siem/public/common/components/charts/draggable_legend.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/charts/draggable_legend.tsx rename to x-pack/plugins/siem/public/common/components/charts/draggable_legend.tsx diff --git a/x-pack/plugins/siem/public/components/charts/draggable_legend_item.test.tsx b/x-pack/plugins/siem/public/common/components/charts/draggable_legend_item.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/charts/draggable_legend_item.test.tsx rename to x-pack/plugins/siem/public/common/components/charts/draggable_legend_item.test.tsx diff --git a/x-pack/plugins/siem/public/components/charts/draggable_legend_item.tsx b/x-pack/plugins/siem/public/common/components/charts/draggable_legend_item.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/charts/draggable_legend_item.tsx rename to x-pack/plugins/siem/public/common/components/charts/draggable_legend_item.tsx diff --git a/x-pack/plugins/siem/public/components/charts/translation.ts b/x-pack/plugins/siem/public/common/components/charts/translation.ts similarity index 100% rename from x-pack/plugins/siem/public/components/charts/translation.ts rename to x-pack/plugins/siem/public/common/components/charts/translation.ts diff --git a/x-pack/plugins/siem/public/components/drag_and_drop/__snapshots__/drag_drop_context_wrapper.test.tsx.snap b/x-pack/plugins/siem/public/common/components/drag_and_drop/__snapshots__/drag_drop_context_wrapper.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/drag_and_drop/__snapshots__/drag_drop_context_wrapper.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/drag_and_drop/__snapshots__/drag_drop_context_wrapper.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/drag_and_drop/__snapshots__/draggable_wrapper.test.tsx.snap b/x-pack/plugins/siem/public/common/components/drag_and_drop/__snapshots__/draggable_wrapper.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/drag_and_drop/__snapshots__/draggable_wrapper.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/drag_and_drop/__snapshots__/draggable_wrapper.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/drag_and_drop/__snapshots__/droppable_wrapper.test.tsx.snap b/x-pack/plugins/siem/public/common/components/drag_and_drop/__snapshots__/droppable_wrapper.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/drag_and_drop/__snapshots__/droppable_wrapper.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/drag_and_drop/__snapshots__/droppable_wrapper.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/drag_and_drop/drag_drop_context.tsx b/x-pack/plugins/siem/public/common/components/drag_and_drop/drag_drop_context.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/drag_and_drop/drag_drop_context.tsx rename to x-pack/plugins/siem/public/common/components/drag_and_drop/drag_drop_context.tsx diff --git a/x-pack/plugins/siem/public/components/drag_and_drop/drag_drop_context_wrapper.test.tsx b/x-pack/plugins/siem/public/common/components/drag_and_drop/drag_drop_context_wrapper.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/drag_and_drop/drag_drop_context_wrapper.test.tsx rename to x-pack/plugins/siem/public/common/components/drag_and_drop/drag_drop_context_wrapper.test.tsx diff --git a/x-pack/plugins/siem/public/components/drag_and_drop/drag_drop_context_wrapper.tsx b/x-pack/plugins/siem/public/common/components/drag_and_drop/drag_drop_context_wrapper.tsx similarity index 94% rename from x-pack/plugins/siem/public/components/drag_and_drop/drag_drop_context_wrapper.tsx rename to x-pack/plugins/siem/public/common/components/drag_and_drop/drag_drop_context_wrapper.tsx index 8e6743ad8f92e..3bd2a3da1c88b 100644 --- a/x-pack/plugins/siem/public/components/drag_and_drop/drag_drop_context_wrapper.tsx +++ b/x-pack/plugins/siem/public/common/components/drag_and_drop/drag_drop_context_wrapper.tsx @@ -12,11 +12,12 @@ import { Dispatch } from 'redux'; import { BeforeCapture } from './drag_drop_context'; import { BrowserFields } from '../../containers/source'; -import { dragAndDropModel, dragAndDropSelectors, timelineSelectors } from '../../store'; +import { dragAndDropModel, dragAndDropSelectors } from '../../store'; +import { timelineSelectors } from '../../../timelines/store/timeline'; import { IdToDataProvider } from '../../store/drag_and_drop/model'; import { State } from '../../store/reducer'; -import { DataProvider } from '../timeline/data_providers/data_provider'; -import { reArrangeProviders } from '../timeline/data_providers/helpers'; +import { DataProvider } from '../../../timelines/components/timeline/data_providers/data_provider'; +import { reArrangeProviders } from '../../../timelines/components/timeline/data_providers/helpers'; import { ACTIVE_TIMELINE_REDUX_ID } from '../top_n'; import { ADDED_TO_TIMELINE_MESSAGE } from '../../hooks/translations'; import { useAddToTimelineSensor } from '../../hooks/use_add_to_timeline'; diff --git a/x-pack/plugins/siem/public/components/drag_and_drop/draggable_wrapper.test.tsx b/x-pack/plugins/siem/public/common/components/drag_and_drop/draggable_wrapper.test.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/drag_and_drop/draggable_wrapper.test.tsx rename to x-pack/plugins/siem/public/common/components/drag_and_drop/draggable_wrapper.test.tsx index cd9e1dc95ff01..d1b3b671307d1 100644 --- a/x-pack/plugins/siem/public/components/drag_and_drop/draggable_wrapper.test.tsx +++ b/x-pack/plugins/siem/public/common/components/drag_and_drop/draggable_wrapper.test.tsx @@ -11,7 +11,7 @@ import { DraggableStateSnapshot, DraggingStyle } from 'react-beautiful-dnd'; import { mockBrowserFields, mocksSource } from '../../containers/source/mock'; import { TestProviders } from '../../mock'; -import { mockDataProviders } from '../timeline/data_providers/mock/mock_data_providers'; +import { mockDataProviders } from '../../../timelines/components/timeline/data_providers/mock/mock_data_providers'; import { DragDropContextWrapper } from './drag_drop_context_wrapper'; import { ConditionalPortal, DraggableWrapper, getStyle } from './draggable_wrapper'; import { useMountAppended } from '../../utils/use_mount_appended'; diff --git a/x-pack/plugins/siem/public/components/drag_and_drop/draggable_wrapper.tsx b/x-pack/plugins/siem/public/common/components/drag_and_drop/draggable_wrapper.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/drag_and_drop/draggable_wrapper.tsx rename to x-pack/plugins/siem/public/common/components/drag_and_drop/draggable_wrapper.tsx index 5676c8fe5c30b..f90a5c1410c34 100644 --- a/x-pack/plugins/siem/public/components/drag_and_drop/draggable_wrapper.tsx +++ b/x-pack/plugins/siem/public/common/components/drag_and_drop/draggable_wrapper.tsx @@ -18,7 +18,7 @@ import styled from 'styled-components'; import deepEqual from 'fast-deep-equal'; import { dragAndDropActions } from '../../store/drag_and_drop'; -import { DataProvider } from '../timeline/data_providers/data_provider'; +import { DataProvider } from '../../../timelines/components/timeline/data_providers/data_provider'; import { TruncatableText } from '../truncatable_text'; import { WithHoverActions } from '../with_hover_actions'; diff --git a/x-pack/plugins/siem/public/components/drag_and_drop/draggable_wrapper_hover_content.test.tsx b/x-pack/plugins/siem/public/common/components/drag_and_drop/draggable_wrapper_hover_content.test.tsx similarity index 99% rename from x-pack/plugins/siem/public/components/drag_and_drop/draggable_wrapper_hover_content.test.tsx rename to x-pack/plugins/siem/public/common/components/drag_and_drop/draggable_wrapper_hover_content.test.tsx index 1d9508fc28f3d..a5fcdd9a943d8 100644 --- a/x-pack/plugins/siem/public/components/drag_and_drop/draggable_wrapper_hover_content.test.tsx +++ b/x-pack/plugins/siem/public/common/components/drag_and_drop/draggable_wrapper_hover_content.test.tsx @@ -13,8 +13,8 @@ import { wait } from '../../lib/helpers'; import { useKibana } from '../../lib/kibana'; import { TestProviders } from '../../mock'; import { createKibanaCoreStartMock } from '../../mock/kibana_core'; -import { FilterManager } from '../../../../../../src/plugins/data/public'; -import { TimelineContext } from '../timeline/timeline_context'; +import { FilterManager } from '../../../../../../../src/plugins/data/public'; +import { TimelineContext } from '../../../timelines/components/timeline/timeline_context'; import { DraggableWrapperHoverContent } from './draggable_wrapper_hover_content'; diff --git a/x-pack/plugins/siem/public/components/drag_and_drop/draggable_wrapper_hover_content.tsx b/x-pack/plugins/siem/public/common/components/drag_and_drop/draggable_wrapper_hover_content.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/drag_and_drop/draggable_wrapper_hover_content.tsx rename to x-pack/plugins/siem/public/common/components/drag_and_drop/draggable_wrapper_hover_content.tsx index 6976714cbe324..a0546dc64113c 100644 --- a/x-pack/plugins/siem/public/components/drag_and_drop/draggable_wrapper_hover_content.tsx +++ b/x-pack/plugins/siem/public/common/components/drag_and_drop/draggable_wrapper_hover_content.tsx @@ -12,8 +12,8 @@ import { getAllFieldsByName, WithSource } from '../../containers/source'; import { useAddToTimeline } from '../../hooks/use_add_to_timeline'; import { WithCopyToClipboard } from '../../lib/clipboard/with_copy_to_clipboard'; import { useKibana } from '../../lib/kibana'; -import { createFilter } from '../page/add_filter_to_global_search_bar'; -import { useTimelineContext } from '../timeline/timeline_context'; +import { createFilter } from '../add_filter_to_global_search_bar'; +import { useTimelineContext } from '../../../timelines/components/timeline/timeline_context'; import { StatefulTopN } from '../top_n'; import { allowTopN } from './helpers'; diff --git a/x-pack/plugins/siem/public/components/drag_and_drop/droppable_wrapper.test.tsx b/x-pack/plugins/siem/public/common/components/drag_and_drop/droppable_wrapper.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/drag_and_drop/droppable_wrapper.test.tsx rename to x-pack/plugins/siem/public/common/components/drag_and_drop/droppable_wrapper.test.tsx diff --git a/x-pack/plugins/siem/public/components/drag_and_drop/droppable_wrapper.tsx b/x-pack/plugins/siem/public/common/components/drag_and_drop/droppable_wrapper.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/drag_and_drop/droppable_wrapper.tsx rename to x-pack/plugins/siem/public/common/components/drag_and_drop/droppable_wrapper.tsx diff --git a/x-pack/plugins/siem/public/components/drag_and_drop/helpers.test.ts b/x-pack/plugins/siem/public/common/components/drag_and_drop/helpers.test.ts similarity index 100% rename from x-pack/plugins/siem/public/components/drag_and_drop/helpers.test.ts rename to x-pack/plugins/siem/public/common/components/drag_and_drop/helpers.test.ts diff --git a/x-pack/plugins/siem/public/components/drag_and_drop/helpers.ts b/x-pack/plugins/siem/public/common/components/drag_and_drop/helpers.ts similarity index 95% rename from x-pack/plugins/siem/public/components/drag_and_drop/helpers.ts rename to x-pack/plugins/siem/public/common/components/drag_and_drop/helpers.ts index 9b37387ce076b..ad370f647738f 100644 --- a/x-pack/plugins/siem/public/components/drag_and_drop/helpers.ts +++ b/x-pack/plugins/siem/public/common/components/drag_and_drop/helpers.ts @@ -10,12 +10,13 @@ import { Dispatch } from 'redux'; import { ActionCreator } from 'typescript-fsa'; import { BrowserField, BrowserFields, getAllFieldsByName } from '../../containers/source'; -import { dragAndDropActions, timelineActions } from '../../store/actions'; +import { dragAndDropActions } from '../../store/actions'; import { IdToDataProvider } from '../../store/drag_and_drop/model'; -import { ColumnHeaderOptions } from '../../store/timeline/model'; -import { DEFAULT_COLUMN_MIN_WIDTH } from '../timeline/body/constants'; -import { DataProvider } from '../timeline/data_providers/data_provider'; -import { addContentToTimeline } from '../timeline/data_providers/helpers'; +import { ColumnHeaderOptions } from '../../../timelines/store/timeline/model'; +import { timelineActions } from '../../../timelines/store/timeline'; +import { DEFAULT_COLUMN_MIN_WIDTH } from '../../../timelines/components/timeline/body/constants'; +import { addContentToTimeline } from '../../../timelines/components/timeline/data_providers/helpers'; +import { DataProvider } from '../../../timelines/components/timeline/data_providers/data_provider'; export const draggableIdPrefix = 'draggableId'; diff --git a/x-pack/plugins/siem/public/components/drag_and_drop/provider_container.tsx b/x-pack/plugins/siem/public/common/components/drag_and_drop/provider_container.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/drag_and_drop/provider_container.tsx rename to x-pack/plugins/siem/public/common/components/drag_and_drop/provider_container.tsx index c1f029086aa35..06cb8ee2e1a46 100644 --- a/x-pack/plugins/siem/public/components/drag_and_drop/provider_container.tsx +++ b/x-pack/plugins/siem/public/common/components/drag_and_drop/provider_container.tsx @@ -6,7 +6,7 @@ import React from 'react'; import styled, { css } from 'styled-components'; -import { STATEFUL_EVENT_CSS_CLASS_NAME } from '../timeline/helpers'; +import { STATEFUL_EVENT_CSS_CLASS_NAME } from '../../../timelines/components/timeline/helpers'; interface ProviderContainerProps { isDragging: boolean; diff --git a/x-pack/plugins/siem/public/components/drag_and_drop/translations.ts b/x-pack/plugins/siem/public/common/components/drag_and_drop/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/drag_and_drop/translations.ts rename to x-pack/plugins/siem/public/common/components/drag_and_drop/translations.ts diff --git a/x-pack/plugins/siem/public/components/draggables/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/common/components/draggables/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/draggables/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/draggables/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/draggables/field_badge/index.tsx b/x-pack/plugins/siem/public/common/components/draggables/field_badge/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/draggables/field_badge/index.tsx rename to x-pack/plugins/siem/public/common/components/draggables/field_badge/index.tsx diff --git a/x-pack/plugins/siem/public/components/draggables/field_badge/translations.ts b/x-pack/plugins/siem/public/common/components/draggables/field_badge/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/draggables/field_badge/translations.ts rename to x-pack/plugins/siem/public/common/components/draggables/field_badge/translations.ts diff --git a/x-pack/plugins/siem/public/components/draggables/index.test.tsx b/x-pack/plugins/siem/public/common/components/draggables/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/draggables/index.test.tsx rename to x-pack/plugins/siem/public/common/components/draggables/index.test.tsx diff --git a/x-pack/plugins/siem/public/components/draggables/index.tsx b/x-pack/plugins/siem/public/common/components/draggables/index.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/draggables/index.tsx rename to x-pack/plugins/siem/public/common/components/draggables/index.tsx index cea900f7bccf9..fcf007a4cf1ba 100644 --- a/x-pack/plugins/siem/public/components/draggables/index.tsx +++ b/x-pack/plugins/siem/public/common/components/draggables/index.tsx @@ -11,8 +11,8 @@ import styled from 'styled-components'; import { DragEffects, DraggableWrapper } from '../drag_and_drop/draggable_wrapper'; import { escapeDataProviderId } from '../drag_and_drop/helpers'; import { getEmptyStringTag } from '../empty_value'; -import { IS_OPERATOR } from '../timeline/data_providers/data_provider'; -import { Provider } from '../timeline/data_providers/provider'; +import { IS_OPERATOR } from '../../../timelines/components/timeline/data_providers/data_provider'; +import { Provider } from '../../../timelines/components/timeline/data_providers/provider'; export interface DefaultDraggableType { id: string; diff --git a/x-pack/plugins/siem/public/components/empty_page/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/common/components/empty_page/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/empty_page/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/empty_page/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/empty_page/index.test.tsx b/x-pack/plugins/siem/public/common/components/empty_page/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/empty_page/index.test.tsx rename to x-pack/plugins/siem/public/common/components/empty_page/index.test.tsx diff --git a/x-pack/plugins/siem/public/components/empty_page/index.tsx b/x-pack/plugins/siem/public/common/components/empty_page/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/empty_page/index.tsx rename to x-pack/plugins/siem/public/common/components/empty_page/index.tsx diff --git a/x-pack/plugins/siem/public/components/empty_value/__snapshots__/empty_value.test.tsx.snap b/x-pack/plugins/siem/public/common/components/empty_value/__snapshots__/empty_value.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/empty_value/__snapshots__/empty_value.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/empty_value/__snapshots__/empty_value.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/empty_value/empty_value.test.tsx b/x-pack/plugins/siem/public/common/components/empty_value/empty_value.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/empty_value/empty_value.test.tsx rename to x-pack/plugins/siem/public/common/components/empty_value/empty_value.test.tsx diff --git a/x-pack/plugins/siem/public/components/empty_value/index.tsx b/x-pack/plugins/siem/public/common/components/empty_value/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/empty_value/index.tsx rename to x-pack/plugins/siem/public/common/components/empty_value/index.tsx diff --git a/x-pack/plugins/siem/public/components/empty_value/translations.ts b/x-pack/plugins/siem/public/common/components/empty_value/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/empty_value/translations.ts rename to x-pack/plugins/siem/public/common/components/empty_value/translations.ts diff --git a/x-pack/plugins/siem/public/components/error_toast_dispatcher/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/common/components/error_toast_dispatcher/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/error_toast_dispatcher/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/error_toast_dispatcher/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/error_toast_dispatcher/index.test.tsx b/x-pack/plugins/siem/public/common/components/error_toast_dispatcher/index.test.tsx similarity index 78% rename from x-pack/plugins/siem/public/components/error_toast_dispatcher/index.test.tsx rename to x-pack/plugins/siem/public/common/components/error_toast_dispatcher/index.test.tsx index 6b90d9ccd08c4..50b20099b17d0 100644 --- a/x-pack/plugins/siem/public/components/error_toast_dispatcher/index.test.tsx +++ b/x-pack/plugins/siem/public/common/components/error_toast_dispatcher/index.test.tsx @@ -8,7 +8,7 @@ import { shallow } from 'enzyme'; import React from 'react'; import { Provider } from 'react-redux'; -import { apolloClientObservable, mockGlobalState } from '../../mock'; +import { apolloClientObservable, mockGlobalState, SUB_PLUGINS_REDUCER } from '../../mock'; import { createStore } from '../../store/store'; import { ErrorToastDispatcher } from '.'; @@ -16,10 +16,10 @@ import { State } from '../../store/reducer'; describe('Error Toast Dispatcher', () => { const state: State = mockGlobalState; - let store = createStore(state, apolloClientObservable); + let store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); beforeEach(() => { - store = createStore(state, apolloClientObservable); + store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); }); describe('rendering', () => { diff --git a/x-pack/plugins/siem/public/components/error_toast_dispatcher/index.tsx b/x-pack/plugins/siem/public/common/components/error_toast_dispatcher/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/error_toast_dispatcher/index.tsx rename to x-pack/plugins/siem/public/common/components/error_toast_dispatcher/index.tsx diff --git a/x-pack/plugins/siem/public/components/event_details/__snapshots__/event_details.test.tsx.snap b/x-pack/plugins/siem/public/common/components/event_details/__snapshots__/event_details.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/event_details/__snapshots__/event_details.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/event_details/__snapshots__/event_details.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/event_details/__snapshots__/json_view.test.tsx.snap b/x-pack/plugins/siem/public/common/components/event_details/__snapshots__/json_view.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/event_details/__snapshots__/json_view.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/event_details/__snapshots__/json_view.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/event_details/columns.tsx b/x-pack/plugins/siem/public/common/components/event_details/columns.tsx similarity index 89% rename from x-pack/plugins/siem/public/components/event_details/columns.tsx rename to x-pack/plugins/siem/public/common/components/event_details/columns.tsx index 131a3a63bae30..4b5ce3b98e5e1 100644 --- a/x-pack/plugins/siem/public/components/event_details/columns.tsx +++ b/x-pack/plugins/siem/public/common/components/event_details/columns.tsx @@ -20,20 +20,20 @@ import { Draggable } from 'react-beautiful-dnd'; import styled from 'styled-components'; import { BrowserFields } from '../../containers/source'; -import { ToStringArray } from '../../graphql/types'; -import { ColumnHeaderOptions } from '../../store/timeline/model'; +import { ToStringArray } from '../../../graphql/types'; +import { ColumnHeaderOptions } from '../../../timelines/store/timeline/model'; import { DragEffects } from '../drag_and_drop/draggable_wrapper'; import { DroppableWrapper } from '../drag_and_drop/droppable_wrapper'; import { getDroppableId, getDraggableFieldId, DRAG_TYPE_FIELD } from '../drag_and_drop/helpers'; import { DraggableFieldBadge } from '../draggables/field_badge'; -import { FieldName } from '../fields_browser/field_name'; +import { FieldName } from '../../../timelines/components/fields_browser/field_name'; import { SelectableText } from '../selectable_text'; import { OverflowField } from '../tables/helpers'; -import { defaultColumnHeaderType } from '../timeline/body/column_headers/default_headers'; -import { DEFAULT_COLUMN_MIN_WIDTH } from '../timeline/body/constants'; -import { MESSAGE_FIELD_NAME } from '../timeline/body/renderers/constants'; -import { FormattedFieldValue } from '../timeline/body/renderers/formatted_field'; -import { OnUpdateColumns } from '../timeline/events'; +import { defaultColumnHeaderType } from '../../../timelines/components/timeline/body/column_headers/default_headers'; +import { DEFAULT_COLUMN_MIN_WIDTH } from '../../../timelines/components/timeline/body/constants'; +import { MESSAGE_FIELD_NAME } from '../../../timelines/components/timeline/body/renderers/constants'; +import { FormattedFieldValue } from '../../../timelines/components/timeline/body/renderers/formatted_field'; +import { OnUpdateColumns } from '../../../timelines/components/timeline/events'; import { getIconFromType, getExampleText, getColumnsWithTimestamp } from './helpers'; import * as i18n from './translations'; import { EventFieldsData } from './types'; diff --git a/x-pack/plugins/siem/public/components/event_details/event_details.test.tsx b/x-pack/plugins/siem/public/common/components/event_details/event_details.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/event_details/event_details.test.tsx rename to x-pack/plugins/siem/public/common/components/event_details/event_details.test.tsx diff --git a/x-pack/plugins/siem/public/components/event_details/event_details.tsx b/x-pack/plugins/siem/public/common/components/event_details/event_details.tsx similarity index 90% rename from x-pack/plugins/siem/public/components/event_details/event_details.tsx rename to x-pack/plugins/siem/public/common/components/event_details/event_details.tsx index 9234fe44320f0..c6a7a05bb2698 100644 --- a/x-pack/plugins/siem/public/components/event_details/event_details.tsx +++ b/x-pack/plugins/siem/public/common/components/event_details/event_details.tsx @@ -9,9 +9,9 @@ import React from 'react'; import styled from 'styled-components'; import { BrowserFields } from '../../containers/source'; -import { DetailItem } from '../../graphql/types'; -import { ColumnHeaderOptions } from '../../store/timeline/model'; -import { OnUpdateColumns } from '../timeline/events'; +import { DetailItem } from '../../../graphql/types'; +import { ColumnHeaderOptions } from '../../../timelines/store/timeline/model'; +import { OnUpdateColumns } from '../../../timelines/components/timeline/events'; import { EventFieldsBrowser } from './event_fields_browser'; import { JsonView } from './json_view'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/components/event_details/event_fields_browser.test.tsx b/x-pack/plugins/siem/public/common/components/event_details/event_fields_browser.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/event_details/event_fields_browser.test.tsx rename to x-pack/plugins/siem/public/common/components/event_details/event_fields_browser.test.tsx diff --git a/x-pack/plugins/siem/public/components/event_details/event_fields_browser.tsx b/x-pack/plugins/siem/public/common/components/event_details/event_fields_browser.tsx similarity index 90% rename from x-pack/plugins/siem/public/components/event_details/event_fields_browser.tsx rename to x-pack/plugins/siem/public/common/components/event_details/event_fields_browser.tsx index 9a842339cb62e..0428f3ec8a197 100644 --- a/x-pack/plugins/siem/public/components/event_details/event_fields_browser.tsx +++ b/x-pack/plugins/siem/public/common/components/event_details/event_fields_browser.tsx @@ -8,10 +8,10 @@ import { sortBy } from 'lodash'; import { EuiInMemoryTable } from '@elastic/eui'; import React, { useMemo } from 'react'; -import { ColumnHeaderOptions } from '../../store/timeline/model'; +import { ColumnHeaderOptions } from '../../../timelines/store/timeline/model'; import { BrowserFields, getAllFieldsByName } from '../../containers/source'; -import { DetailItem } from '../../graphql/types'; -import { OnUpdateColumns } from '../timeline/events'; +import { DetailItem } from '../../../graphql/types'; +import { OnUpdateColumns } from '../../../timelines/components/timeline/events'; import { getColumns } from './columns'; import { search } from './helpers'; diff --git a/x-pack/plugins/siem/public/components/event_details/event_id.ts b/x-pack/plugins/siem/public/common/components/event_details/event_id.ts similarity index 100% rename from x-pack/plugins/siem/public/components/event_details/event_id.ts rename to x-pack/plugins/siem/public/common/components/event_details/event_id.ts diff --git a/x-pack/plugins/siem/public/components/event_details/helpers.test.tsx b/x-pack/plugins/siem/public/common/components/event_details/helpers.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/event_details/helpers.test.tsx rename to x-pack/plugins/siem/public/common/components/event_details/helpers.test.tsx diff --git a/x-pack/plugins/siem/public/components/event_details/helpers.tsx b/x-pack/plugins/siem/public/common/components/event_details/helpers.tsx similarity index 93% rename from x-pack/plugins/siem/public/components/event_details/helpers.tsx rename to x-pack/plugins/siem/public/common/components/event_details/helpers.tsx index 5d9c9d82490bb..aae7ca901c3d2 100644 --- a/x-pack/plugins/siem/public/components/event_details/helpers.tsx +++ b/x-pack/plugins/siem/public/common/components/event_details/helpers.tsx @@ -7,12 +7,12 @@ import { get, getOr, isEmpty, uniqBy } from 'lodash/fp'; import { BrowserField, BrowserFields } from '../../containers/source'; -import { ColumnHeaderOptions } from '../../store/timeline/model'; +import { ColumnHeaderOptions } from '../../../timelines/store/timeline/model'; import { DEFAULT_DATE_COLUMN_MIN_WIDTH, DEFAULT_COLUMN_MIN_WIDTH, -} from '../timeline/body/constants'; -import { ToStringArray } from '../../graphql/types'; +} from '../../../timelines/components/timeline/body/constants'; +import { ToStringArray } from '../../../graphql/types'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/components/event_details/json_view.test.tsx b/x-pack/plugins/siem/public/common/components/event_details/json_view.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/event_details/json_view.test.tsx rename to x-pack/plugins/siem/public/common/components/event_details/json_view.test.tsx diff --git a/x-pack/plugins/siem/public/components/event_details/json_view.tsx b/x-pack/plugins/siem/public/common/components/event_details/json_view.tsx similarity index 88% rename from x-pack/plugins/siem/public/components/event_details/json_view.tsx rename to x-pack/plugins/siem/public/common/components/event_details/json_view.tsx index 9897e319e0487..788ca95e2022e 100644 --- a/x-pack/plugins/siem/public/components/event_details/json_view.tsx +++ b/x-pack/plugins/siem/public/common/components/event_details/json_view.tsx @@ -9,8 +9,8 @@ import { set } from 'lodash/fp'; import React from 'react'; import styled from 'styled-components'; -import { DetailItem } from '../../graphql/types'; -import { omitTypenameAndEmpty } from '../timeline/body/helpers'; +import { DetailItem } from '../../../graphql/types'; +import { omitTypenameAndEmpty } from '../../../timelines/components/timeline/body/helpers'; interface Props { data: DetailItem[]; diff --git a/x-pack/plugins/siem/public/components/event_details/stateful_event_details.tsx b/x-pack/plugins/siem/public/common/components/event_details/stateful_event_details.tsx similarity index 86% rename from x-pack/plugins/siem/public/components/event_details/stateful_event_details.tsx rename to x-pack/plugins/siem/public/common/components/event_details/stateful_event_details.tsx index c79f02740253a..ec0e82c218a07 100644 --- a/x-pack/plugins/siem/public/components/event_details/stateful_event_details.tsx +++ b/x-pack/plugins/siem/public/common/components/event_details/stateful_event_details.tsx @@ -7,9 +7,9 @@ import React, { useCallback, useState } from 'react'; import { BrowserFields } from '../../containers/source'; -import { DetailItem } from '../../graphql/types'; -import { ColumnHeaderOptions } from '../../store/timeline/model'; -import { OnUpdateColumns } from '../timeline/events'; +import { DetailItem } from '../../../graphql/types'; +import { ColumnHeaderOptions } from '../../../timelines/store/timeline/model'; +import { OnUpdateColumns } from '../../../timelines/components/timeline/events'; import { EventDetails, View } from './event_details'; diff --git a/x-pack/plugins/siem/public/components/event_details/translations.ts b/x-pack/plugins/siem/public/common/components/event_details/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/event_details/translations.ts rename to x-pack/plugins/siem/public/common/components/event_details/translations.ts diff --git a/x-pack/plugins/siem/public/components/event_details/types.ts b/x-pack/plugins/siem/public/common/components/event_details/types.ts similarity index 87% rename from x-pack/plugins/siem/public/components/event_details/types.ts rename to x-pack/plugins/siem/public/common/components/event_details/types.ts index 4e351fcdf98e4..db53f411fa518 100644 --- a/x-pack/plugins/siem/public/components/event_details/types.ts +++ b/x-pack/plugins/siem/public/common/components/event_details/types.ts @@ -5,6 +5,6 @@ */ import { BrowserField } from '../../containers/source'; -import { DetailItem } from '../../graphql/types'; +import { DetailItem } from '../../../graphql/types'; export type EventFieldsData = BrowserField & DetailItem; diff --git a/x-pack/plugins/siem/public/components/events_viewer/default_headers.tsx b/x-pack/plugins/siem/public/common/components/events_viewer/default_headers.tsx similarity index 84% rename from x-pack/plugins/siem/public/components/events_viewer/default_headers.tsx rename to x-pack/plugins/siem/public/common/components/events_viewer/default_headers.tsx index b97e0da5df078..4660351e0d8f9 100644 --- a/x-pack/plugins/siem/public/components/events_viewer/default_headers.tsx +++ b/x-pack/plugins/siem/public/common/components/events_viewer/default_headers.tsx @@ -4,12 +4,12 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ColumnHeaderOptions } from '../../store/timeline/model'; -import { defaultColumnHeaderType } from '../timeline/body/column_headers/default_headers'; +import { ColumnHeaderOptions } from '../../../timelines/store/timeline/model'; +import { defaultColumnHeaderType } from '../../../timelines/components/timeline/body/column_headers/default_headers'; import { DEFAULT_COLUMN_MIN_WIDTH, DEFAULT_DATE_COLUMN_MIN_WIDTH, -} from '../timeline/body/constants'; +} from '../../../timelines/components/timeline/body/constants'; export const defaultHeaders: ColumnHeaderOptions[] = [ { diff --git a/x-pack/plugins/siem/public/components/events_viewer/default_model.tsx b/x-pack/plugins/siem/public/common/components/events_viewer/default_model.tsx similarity index 71% rename from x-pack/plugins/siem/public/components/events_viewer/default_model.tsx rename to x-pack/plugins/siem/public/common/components/events_viewer/default_model.tsx index 59a9f6d061c8d..ecb76eb7ff93f 100644 --- a/x-pack/plugins/siem/public/components/events_viewer/default_model.tsx +++ b/x-pack/plugins/siem/public/common/components/events_viewer/default_model.tsx @@ -5,8 +5,8 @@ */ import { defaultHeaders } from './default_headers'; -import { SubsetTimelineModel } from '../../store/timeline/model'; -import { timelineDefaults } from '../../store/timeline/defaults'; +import { SubsetTimelineModel } from '../../../timelines/store/timeline/model'; +import { timelineDefaults } from '../../../timelines/store/timeline/defaults'; export const eventsDefaultModel: SubsetTimelineModel = { ...timelineDefaults, diff --git a/x-pack/plugins/siem/public/components/events_viewer/event_details_width_context.tsx b/x-pack/plugins/siem/public/common/components/events_viewer/event_details_width_context.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/events_viewer/event_details_width_context.tsx rename to x-pack/plugins/siem/public/common/components/events_viewer/event_details_width_context.tsx diff --git a/x-pack/plugins/siem/public/components/events_viewer/events_viewer.test.tsx b/x-pack/plugins/siem/public/common/components/events_viewer/events_viewer.test.tsx similarity index 95% rename from x-pack/plugins/siem/public/components/events_viewer/events_viewer.test.tsx rename to x-pack/plugins/siem/public/common/components/events_viewer/events_viewer.test.tsx index d3cdf9886e469..d2f0d47380dd2 100644 --- a/x-pack/plugins/siem/public/components/events_viewer/events_viewer.test.tsx +++ b/x-pack/plugins/siem/public/common/components/events_viewer/events_viewer.test.tsx @@ -14,13 +14,13 @@ import { wait } from '../../lib/helpers'; import { mockEventViewerResponse } from './mock'; import { StatefulEventsViewer } from '.'; import { defaultHeaders } from './default_headers'; -import { useFetchIndexPatterns } from '../../containers/detection_engine/rules/fetch_index_patterns'; +import { useFetchIndexPatterns } from '../../../alerts/containers/detection_engine/rules/fetch_index_patterns'; import { mockBrowserFields } from '../../containers/source/mock'; import { eventsDefaultModel } from './default_model'; import { useMountAppended } from '../../utils/use_mount_appended'; const mockUseFetchIndexPatterns: jest.Mock = useFetchIndexPatterns as jest.Mock; -jest.mock('../../containers/detection_engine/rules/fetch_index_patterns'); +jest.mock('../../../alerts/containers/detection_engine/rules/fetch_index_patterns'); mockUseFetchIndexPatterns.mockImplementation(() => [ { browserFields: mockBrowserFields, diff --git a/x-pack/plugins/siem/public/components/events_viewer/events_viewer.tsx b/x-pack/plugins/siem/public/common/components/events_viewer/events_viewer.tsx similarity index 86% rename from x-pack/plugins/siem/public/components/events_viewer/events_viewer.tsx rename to x-pack/plugins/siem/public/common/components/events_viewer/events_viewer.tsx index aff66396af39d..bec8c30ecdd38 100644 --- a/x-pack/plugins/siem/public/components/events_viewer/events_viewer.tsx +++ b/x-pack/plugins/siem/public/common/components/events_viewer/events_viewer.tsx @@ -11,23 +11,31 @@ import styled from 'styled-components'; import deepEqual from 'fast-deep-equal'; import { BrowserFields } from '../../containers/source'; -import { TimelineQuery } from '../../containers/timeline'; -import { Direction } from '../../graphql/types'; +import { TimelineQuery } from '../../../timelines/containers'; +import { Direction } from '../../../graphql/types'; import { useKibana } from '../../lib/kibana'; -import { ColumnHeaderOptions, KqlMode } from '../../store/timeline/model'; +import { ColumnHeaderOptions, KqlMode } from '../../../timelines/store/timeline/model'; import { HeaderSection } from '../header_section'; -import { defaultHeaders } from '../timeline/body/column_headers/default_headers'; -import { Sort } from '../timeline/body/sort'; -import { StatefulBody } from '../timeline/body/stateful_body'; -import { DataProvider } from '../timeline/data_providers/data_provider'; -import { OnChangeItemsPerPage } from '../timeline/events'; -import { Footer, footerHeight } from '../timeline/footer'; -import { combineQueries } from '../timeline/helpers'; -import { TimelineRefetch } from '../timeline/refetch_timeline'; -import { ManageTimelineContext, TimelineTypeContextProps } from '../timeline/timeline_context'; +import { defaultHeaders } from '../../../timelines/components/timeline/body/column_headers/default_headers'; +import { Sort } from '../../../timelines/components/timeline/body/sort'; +import { StatefulBody } from '../../../timelines/components/timeline/body/stateful_body'; +import { DataProvider } from '../../../timelines/components/timeline/data_providers/data_provider'; +import { OnChangeItemsPerPage } from '../../../timelines/components/timeline/events'; +import { Footer, footerHeight } from '../../../timelines/components/timeline/footer'; +import { combineQueries } from '../../../timelines/components/timeline/helpers'; +import { TimelineRefetch } from '../../../timelines/components/timeline/refetch_timeline'; +import { + ManageTimelineContext, + TimelineTypeContextProps, +} from '../../../timelines/components/timeline/timeline_context'; import { EventDetailsWidthProvider } from './event_details_width_context'; import * as i18n from './translations'; -import { Filter, esQuery, IIndexPattern, Query } from '../../../../../../src/plugins/data/public'; +import { + Filter, + esQuery, + IIndexPattern, + Query, +} from '../../../../../../../src/plugins/data/public'; import { inputsModel } from '../../store'; const DEFAULT_EVENTS_VIEWER_HEIGHT = 500; diff --git a/x-pack/plugins/siem/public/components/events_viewer/index.test.tsx b/x-pack/plugins/siem/public/common/components/events_viewer/index.test.tsx similarity index 92% rename from x-pack/plugins/siem/public/components/events_viewer/index.test.tsx rename to x-pack/plugins/siem/public/common/components/events_viewer/index.test.tsx index 6f614c1e32f65..bdc0338450507 100644 --- a/x-pack/plugins/siem/public/components/events_viewer/index.test.tsx +++ b/x-pack/plugins/siem/public/common/components/events_viewer/index.test.tsx @@ -14,12 +14,12 @@ import { useMountAppended } from '../../utils/use_mount_appended'; import { mockEventViewerResponse } from './mock'; import { StatefulEventsViewer } from '.'; -import { useFetchIndexPatterns } from '../../containers/detection_engine/rules/fetch_index_patterns'; +import { useFetchIndexPatterns } from '../../../alerts/containers/detection_engine/rules/fetch_index_patterns'; import { mockBrowserFields } from '../../containers/source/mock'; import { eventsDefaultModel } from './default_model'; const mockUseFetchIndexPatterns: jest.Mock = useFetchIndexPatterns as jest.Mock; -jest.mock('../../containers/detection_engine/rules/fetch_index_patterns'); +jest.mock('../../../alerts/containers/detection_engine/rules/fetch_index_patterns'); mockUseFetchIndexPatterns.mockImplementation(() => [ { browserFields: mockBrowserFields, diff --git a/x-pack/plugins/siem/public/components/events_viewer/index.tsx b/x-pack/plugins/siem/public/common/components/events_viewer/index.tsx similarity index 90% rename from x-pack/plugins/siem/public/components/events_viewer/index.tsx rename to x-pack/plugins/siem/public/common/components/events_viewer/index.tsx index bc6a1b3b77bfa..e7af69096179a 100644 --- a/x-pack/plugins/siem/public/components/events_viewer/index.tsx +++ b/x-pack/plugins/siem/public/common/components/events_viewer/index.tsx @@ -8,20 +8,21 @@ import React, { useCallback, useMemo, useEffect } from 'react'; import { connect, ConnectedProps } from 'react-redux'; import deepEqual from 'fast-deep-equal'; -import { DEFAULT_INDEX_KEY } from '../../../common/constants'; -import { inputsModel, inputsSelectors, State, timelineSelectors } from '../../store'; -import { inputsActions, timelineActions } from '../../store/actions'; +import { DEFAULT_INDEX_KEY } from '../../../../common/constants'; +import { inputsModel, inputsSelectors, State } from '../../store'; +import { inputsActions } from '../../store/actions'; +import { timelineSelectors, timelineActions } from '../../../timelines/store/timeline'; import { ColumnHeaderOptions, SubsetTimelineModel, TimelineModel, -} from '../../store/timeline/model'; -import { OnChangeItemsPerPage } from '../timeline/events'; -import { Filter } from '../../../../../../src/plugins/data/public'; +} from '../../../timelines/store/timeline/model'; +import { OnChangeItemsPerPage } from '../../../timelines/components/timeline/events'; +import { Filter } from '../../../../../../../src/plugins/data/public'; import { useUiSetting } from '../../lib/kibana'; import { EventsViewer } from './events_viewer'; -import { useFetchIndexPatterns } from '../../containers/detection_engine/rules/fetch_index_patterns'; -import { TimelineTypeContextProps } from '../timeline/timeline_context'; +import { useFetchIndexPatterns } from '../../../alerts/containers/detection_engine/rules/fetch_index_patterns'; +import { TimelineTypeContextProps } from '../../../timelines/components/timeline/timeline_context'; import { InspectButtonContainer } from '../inspect'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/components/events_viewer/mock.ts b/x-pack/plugins/siem/public/common/components/events_viewer/mock.ts similarity index 95% rename from x-pack/plugins/siem/public/components/events_viewer/mock.ts rename to x-pack/plugins/siem/public/common/components/events_viewer/mock.ts index 352b0b95c6dd4..bf95a58aec981 100644 --- a/x-pack/plugins/siem/public/components/events_viewer/mock.ts +++ b/x-pack/plugins/siem/public/common/components/events_viewer/mock.ts @@ -5,7 +5,7 @@ */ import { noop } from 'lodash/fp'; -import { timelineQuery } from '../../containers/timeline/index.gql_query'; +import { timelineQuery } from '../../../timelines/containers/index.gql_query'; export const mockEventViewerResponse = [ { diff --git a/x-pack/plugins/siem/public/components/events_viewer/translations.ts b/x-pack/plugins/siem/public/common/components/events_viewer/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/events_viewer/translations.ts rename to x-pack/plugins/siem/public/common/components/events_viewer/translations.ts diff --git a/x-pack/plugins/siem/public/components/external_link_icon/index.test.tsx b/x-pack/plugins/siem/public/common/components/external_link_icon/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/external_link_icon/index.test.tsx rename to x-pack/plugins/siem/public/common/components/external_link_icon/index.test.tsx diff --git a/x-pack/plugins/siem/public/components/external_link_icon/index.tsx b/x-pack/plugins/siem/public/common/components/external_link_icon/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/external_link_icon/index.tsx rename to x-pack/plugins/siem/public/common/components/external_link_icon/index.tsx diff --git a/x-pack/plugins/siem/public/components/filters_global/__snapshots__/filters_global.test.tsx.snap b/x-pack/plugins/siem/public/common/components/filters_global/__snapshots__/filters_global.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/filters_global/__snapshots__/filters_global.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/filters_global/__snapshots__/filters_global.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/filters_global/filters_global.test.tsx b/x-pack/plugins/siem/public/common/components/filters_global/filters_global.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/filters_global/filters_global.test.tsx rename to x-pack/plugins/siem/public/common/components/filters_global/filters_global.test.tsx diff --git a/x-pack/plugins/siem/public/components/filters_global/filters_global.tsx b/x-pack/plugins/siem/public/common/components/filters_global/filters_global.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/filters_global/filters_global.tsx rename to x-pack/plugins/siem/public/common/components/filters_global/filters_global.tsx diff --git a/x-pack/plugins/siem/public/components/filters_global/index.tsx b/x-pack/plugins/siem/public/common/components/filters_global/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/filters_global/index.tsx rename to x-pack/plugins/siem/public/common/components/filters_global/index.tsx diff --git a/x-pack/plugins/siem/public/components/formatted_bytes/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/common/components/formatted_bytes/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/formatted_bytes/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/formatted_bytes/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/formatted_bytes/index.test.tsx b/x-pack/plugins/siem/public/common/components/formatted_bytes/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/formatted_bytes/index.test.tsx rename to x-pack/plugins/siem/public/common/components/formatted_bytes/index.test.tsx diff --git a/x-pack/plugins/siem/public/components/formatted_bytes/index.tsx b/x-pack/plugins/siem/public/common/components/formatted_bytes/index.tsx similarity index 93% rename from x-pack/plugins/siem/public/components/formatted_bytes/index.tsx rename to x-pack/plugins/siem/public/common/components/formatted_bytes/index.tsx index 98a1acf471629..5664af2aa3f5b 100644 --- a/x-pack/plugins/siem/public/components/formatted_bytes/index.tsx +++ b/x-pack/plugins/siem/public/common/components/formatted_bytes/index.tsx @@ -7,7 +7,7 @@ import React from 'react'; import numeral from '@elastic/numeral'; -import { DEFAULT_BYTES_FORMAT } from '../../../common/constants'; +import { DEFAULT_BYTES_FORMAT } from '../../../../common/constants'; import { useUiSetting$ } from '../../lib/kibana'; type Bytes = string | number; diff --git a/x-pack/plugins/siem/public/components/formatted_date/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/common/components/formatted_date/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/formatted_date/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/formatted_date/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/formatted_date/index.test.tsx b/x-pack/plugins/siem/public/common/components/formatted_date/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/formatted_date/index.test.tsx rename to x-pack/plugins/siem/public/common/components/formatted_date/index.test.tsx diff --git a/x-pack/plugins/siem/public/components/formatted_date/index.tsx b/x-pack/plugins/siem/public/common/components/formatted_date/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/formatted_date/index.tsx rename to x-pack/plugins/siem/public/common/components/formatted_date/index.tsx diff --git a/x-pack/plugins/siem/public/components/formatted_date/maybe_date.test.ts b/x-pack/plugins/siem/public/common/components/formatted_date/maybe_date.test.ts similarity index 100% rename from x-pack/plugins/siem/public/components/formatted_date/maybe_date.test.ts rename to x-pack/plugins/siem/public/common/components/formatted_date/maybe_date.test.ts diff --git a/x-pack/plugins/siem/public/components/formatted_date/maybe_date.ts b/x-pack/plugins/siem/public/common/components/formatted_date/maybe_date.ts similarity index 100% rename from x-pack/plugins/siem/public/components/formatted_date/maybe_date.ts rename to x-pack/plugins/siem/public/common/components/formatted_date/maybe_date.ts diff --git a/x-pack/plugins/siem/public/components/generic_downloader/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/common/components/generic_downloader/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/generic_downloader/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/generic_downloader/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/generic_downloader/index.test.tsx b/x-pack/plugins/siem/public/common/components/generic_downloader/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/generic_downloader/index.test.tsx rename to x-pack/plugins/siem/public/common/components/generic_downloader/index.test.tsx diff --git a/x-pack/plugins/siem/public/components/generic_downloader/index.tsx b/x-pack/plugins/siem/public/common/components/generic_downloader/index.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/generic_downloader/index.tsx rename to x-pack/plugins/siem/public/common/components/generic_downloader/index.tsx index 6f08f5c8c381c..2f68da0c18727 100644 --- a/x-pack/plugins/siem/public/components/generic_downloader/index.tsx +++ b/x-pack/plugins/siem/public/common/components/generic_downloader/index.tsx @@ -9,7 +9,7 @@ import styled from 'styled-components'; import { isFunction } from 'lodash/fp'; import * as i18n from './translations'; -import { ExportDocumentsProps } from '../../containers/detection_engine/rules'; +import { ExportDocumentsProps } from '../../../alerts/containers/detection_engine/rules'; import { useStateToaster, errorToToaster } from '../toasters'; const InvisibleAnchor = styled.a` diff --git a/x-pack/plugins/siem/public/components/generic_downloader/translations.ts b/x-pack/plugins/siem/public/common/components/generic_downloader/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/generic_downloader/translations.ts rename to x-pack/plugins/siem/public/common/components/generic_downloader/translations.ts diff --git a/x-pack/plugins/siem/public/components/header_global/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/common/components/header_global/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/header_global/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/header_global/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/header_global/index.test.tsx b/x-pack/plugins/siem/public/common/components/header_global/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/header_global/index.test.tsx rename to x-pack/plugins/siem/public/common/components/header_global/index.test.tsx diff --git a/x-pack/plugins/siem/public/components/header_global/index.tsx b/x-pack/plugins/siem/public/common/components/header_global/index.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/header_global/index.tsx rename to x-pack/plugins/siem/public/common/components/header_global/index.tsx index adc2be4f9c365..bc4bb80d8874d 100644 --- a/x-pack/plugins/siem/public/components/header_global/index.tsx +++ b/x-pack/plugins/siem/public/common/components/header_global/index.tsx @@ -11,8 +11,8 @@ import styled, { css } from 'styled-components'; import { useLocation } from 'react-router-dom'; import { gutterTimeline } from '../../lib/helpers'; -import { navTabs } from '../../pages/home/home_navigations'; -import { SiemPageName } from '../../pages/home/types'; +import { navTabs } from '../../../app/home/home_navigations'; +import { SiemPageName } from '../../../app/types'; import { getOverviewUrl } from '../link_to'; import { MlPopover } from '../ml_popover/ml_popover'; import { SiemNavigation } from '../navigation'; diff --git a/x-pack/plugins/siem/public/components/header_global/translations.ts b/x-pack/plugins/siem/public/common/components/header_global/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/header_global/translations.ts rename to x-pack/plugins/siem/public/common/components/header_global/translations.ts diff --git a/x-pack/plugins/siem/public/components/header_page/__snapshots__/editable_title.test.tsx.snap b/x-pack/plugins/siem/public/common/components/header_page/__snapshots__/editable_title.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/header_page/__snapshots__/editable_title.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/header_page/__snapshots__/editable_title.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/header_page/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/common/components/header_page/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/header_page/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/header_page/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/header_page/__snapshots__/title.test.tsx.snap b/x-pack/plugins/siem/public/common/components/header_page/__snapshots__/title.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/header_page/__snapshots__/title.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/header_page/__snapshots__/title.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/header_page/editable_title.test.tsx b/x-pack/plugins/siem/public/common/components/header_page/editable_title.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/header_page/editable_title.test.tsx rename to x-pack/plugins/siem/public/common/components/header_page/editable_title.test.tsx diff --git a/x-pack/plugins/siem/public/components/header_page/editable_title.tsx b/x-pack/plugins/siem/public/common/components/header_page/editable_title.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/header_page/editable_title.tsx rename to x-pack/plugins/siem/public/common/components/header_page/editable_title.tsx diff --git a/x-pack/plugins/siem/public/components/header_page/index.test.tsx b/x-pack/plugins/siem/public/common/components/header_page/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/header_page/index.test.tsx rename to x-pack/plugins/siem/public/common/components/header_page/index.test.tsx diff --git a/x-pack/plugins/siem/public/components/header_page/index.tsx b/x-pack/plugins/siem/public/common/components/header_page/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/header_page/index.tsx rename to x-pack/plugins/siem/public/common/components/header_page/index.tsx diff --git a/x-pack/plugins/siem/public/components/header_page/title.test.tsx b/x-pack/plugins/siem/public/common/components/header_page/title.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/header_page/title.test.tsx rename to x-pack/plugins/siem/public/common/components/header_page/title.test.tsx diff --git a/x-pack/plugins/siem/public/components/header_page/title.tsx b/x-pack/plugins/siem/public/common/components/header_page/title.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/header_page/title.tsx rename to x-pack/plugins/siem/public/common/components/header_page/title.tsx diff --git a/x-pack/plugins/siem/public/components/header_page/translations.ts b/x-pack/plugins/siem/public/common/components/header_page/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/header_page/translations.ts rename to x-pack/plugins/siem/public/common/components/header_page/translations.ts diff --git a/x-pack/plugins/siem/public/components/header_page/types.ts b/x-pack/plugins/siem/public/common/components/header_page/types.ts similarity index 100% rename from x-pack/plugins/siem/public/components/header_page/types.ts rename to x-pack/plugins/siem/public/common/components/header_page/types.ts diff --git a/x-pack/plugins/siem/public/components/header_section/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/common/components/header_section/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/header_section/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/header_section/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/header_section/index.test.tsx b/x-pack/plugins/siem/public/common/components/header_section/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/header_section/index.test.tsx rename to x-pack/plugins/siem/public/common/components/header_section/index.test.tsx diff --git a/x-pack/plugins/siem/public/components/header_section/index.tsx b/x-pack/plugins/siem/public/common/components/header_section/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/header_section/index.tsx rename to x-pack/plugins/siem/public/common/components/header_section/index.tsx diff --git a/x-pack/plugins/siem/public/components/help_menu/index.tsx b/x-pack/plugins/siem/public/common/components/help_menu/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/help_menu/index.tsx rename to x-pack/plugins/siem/public/common/components/help_menu/index.tsx diff --git a/x-pack/plugins/siem/public/components/import_data_modal/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/common/components/import_data_modal/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/import_data_modal/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/import_data_modal/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/import_data_modal/index.test.tsx b/x-pack/plugins/siem/public/common/components/import_data_modal/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/import_data_modal/index.test.tsx rename to x-pack/plugins/siem/public/common/components/import_data_modal/index.test.tsx diff --git a/x-pack/plugins/siem/public/components/import_data_modal/index.tsx b/x-pack/plugins/siem/public/common/components/import_data_modal/index.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/import_data_modal/index.tsx rename to x-pack/plugins/siem/public/common/components/import_data_modal/index.tsx index c827411a41e2e..45368d1fefc53 100644 --- a/x-pack/plugins/siem/public/components/import_data_modal/index.tsx +++ b/x-pack/plugins/siem/public/common/components/import_data_modal/index.tsx @@ -21,7 +21,10 @@ import { } from '@elastic/eui'; import React, { useCallback, useState } from 'react'; -import { ImportDataResponse, ImportDataProps } from '../../containers/detection_engine/rules'; +import { + ImportDataResponse, + ImportDataProps, +} from '../../../alerts/containers/detection_engine/rules'; import { displayErrorToast, displaySuccessToast, diff --git a/x-pack/plugins/siem/public/components/import_data_modal/translations.ts b/x-pack/plugins/siem/public/common/components/import_data_modal/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/import_data_modal/translations.ts rename to x-pack/plugins/siem/public/common/components/import_data_modal/translations.ts diff --git a/x-pack/plugins/siem/public/components/inspect/index.test.tsx b/x-pack/plugins/siem/public/common/components/inspect/index.test.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/inspect/index.test.tsx rename to x-pack/plugins/siem/public/common/components/inspect/index.test.tsx index 9492002717e2b..a4ef6f8c79570 100644 --- a/x-pack/plugins/siem/public/components/inspect/index.test.tsx +++ b/x-pack/plugins/siem/public/common/components/inspect/index.test.tsx @@ -13,6 +13,7 @@ import { TestProviderWithoutDragAndDrop, mockGlobalState, apolloClientObservable, + SUB_PLUGINS_REDUCER, } from '../../mock'; import { createStore, State } from '../../store'; import { UpdateQueryParams, upsertQuery } from '../../store/inputs/helpers'; @@ -33,13 +34,13 @@ describe('Inspect Button', () => { state: state.inputs, }; - let store = createStore(state, apolloClientObservable); + let store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); describe('Render', () => { beforeEach(() => { const myState = cloneDeep(state); myState.inputs = upsertQuery(newQuery); - store = createStore(myState, apolloClientObservable); + store = createStore(myState, SUB_PLUGINS_REDUCER, apolloClientObservable); }); test('Eui Empty Button', () => { const wrapper = mount( @@ -155,7 +156,7 @@ describe('Inspect Button', () => { response: ['my response'], }; myState.inputs = upsertQuery(myQuery); - store = createStore(myState, apolloClientObservable); + store = createStore(myState, SUB_PLUGINS_REDUCER, apolloClientObservable); }); test('Open Inspect Modal', () => { const wrapper = mount( diff --git a/x-pack/plugins/siem/public/components/inspect/index.tsx b/x-pack/plugins/siem/public/common/components/inspect/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/inspect/index.tsx rename to x-pack/plugins/siem/public/common/components/inspect/index.tsx diff --git a/x-pack/plugins/siem/public/components/inspect/modal.test.tsx b/x-pack/plugins/siem/public/common/components/inspect/modal.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/inspect/modal.test.tsx rename to x-pack/plugins/siem/public/common/components/inspect/modal.test.tsx diff --git a/x-pack/plugins/siem/public/components/inspect/modal.tsx b/x-pack/plugins/siem/public/common/components/inspect/modal.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/inspect/modal.tsx rename to x-pack/plugins/siem/public/common/components/inspect/modal.tsx diff --git a/x-pack/plugins/siem/public/components/inspect/translations.ts b/x-pack/plugins/siem/public/common/components/inspect/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/inspect/translations.ts rename to x-pack/plugins/siem/public/common/components/inspect/translations.ts diff --git a/x-pack/plugins/siem/public/components/last_event_time/index.test.tsx b/x-pack/plugins/siem/public/common/components/last_event_time/index.test.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/last_event_time/index.test.tsx rename to x-pack/plugins/siem/public/common/components/last_event_time/index.test.tsx index 69a795d0c8db7..2f0060c91668b 100644 --- a/x-pack/plugins/siem/public/components/last_event_time/index.test.tsx +++ b/x-pack/plugins/siem/public/common/components/last_event_time/index.test.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { getEmptyValue } from '../empty_value'; -import { LastEventIndexKey } from '../../graphql/types'; +import { LastEventIndexKey } from '../../../graphql/types'; import { mockLastEventTimeQuery } from '../../containers/events/last_event_time/mock'; import { useMountAppended } from '../../utils/use_mount_appended'; diff --git a/x-pack/plugins/siem/public/components/last_event_time/index.tsx b/x-pack/plugins/siem/public/common/components/last_event_time/index.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/last_event_time/index.tsx rename to x-pack/plugins/siem/public/common/components/last_event_time/index.tsx index 2493a1378e944..1c988ed989e86 100644 --- a/x-pack/plugins/siem/public/components/last_event_time/index.tsx +++ b/x-pack/plugins/siem/public/common/components/last_event_time/index.tsx @@ -8,7 +8,7 @@ import { EuiIcon, EuiLoadingSpinner, EuiToolTip } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import React, { memo } from 'react'; -import { LastEventIndexKey } from '../../graphql/types'; +import { LastEventIndexKey } from '../../../graphql/types'; import { useLastEventTimeQuery } from '../../containers/events/last_event_time'; import { getEmptyTagValue } from '../empty_value'; import { FormattedRelativePreferenceDate } from '../formatted_date'; diff --git a/x-pack/plugins/siem/public/components/link_icon/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/common/components/link_icon/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/link_icon/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/link_icon/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/link_icon/index.test.tsx b/x-pack/plugins/siem/public/common/components/link_icon/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/link_icon/index.test.tsx rename to x-pack/plugins/siem/public/common/components/link_icon/index.test.tsx diff --git a/x-pack/plugins/siem/public/components/link_icon/index.tsx b/x-pack/plugins/siem/public/common/components/link_icon/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/link_icon/index.tsx rename to x-pack/plugins/siem/public/common/components/link_icon/index.tsx diff --git a/x-pack/plugins/siem/public/components/link_to/helpers.test.ts b/x-pack/plugins/siem/public/common/components/link_to/helpers.test.ts similarity index 100% rename from x-pack/plugins/siem/public/components/link_to/helpers.test.ts rename to x-pack/plugins/siem/public/common/components/link_to/helpers.test.ts diff --git a/x-pack/plugins/siem/public/components/link_to/helpers.ts b/x-pack/plugins/siem/public/common/components/link_to/helpers.ts similarity index 100% rename from x-pack/plugins/siem/public/components/link_to/helpers.ts rename to x-pack/plugins/siem/public/common/components/link_to/helpers.ts diff --git a/x-pack/plugins/siem/public/components/link_to/index.ts b/x-pack/plugins/siem/public/common/components/link_to/index.ts similarity index 100% rename from x-pack/plugins/siem/public/components/link_to/index.ts rename to x-pack/plugins/siem/public/common/components/link_to/index.ts diff --git a/x-pack/plugins/siem/public/components/link_to/link_to.tsx b/x-pack/plugins/siem/public/common/components/link_to/link_to.tsx similarity index 94% rename from x-pack/plugins/siem/public/components/link_to/link_to.tsx rename to x-pack/plugins/siem/public/common/components/link_to/link_to.tsx index d3bf2e34b435b..77636af8bc4a4 100644 --- a/x-pack/plugins/siem/public/components/link_to/link_to.tsx +++ b/x-pack/plugins/siem/public/common/components/link_to/link_to.tsx @@ -7,8 +7,8 @@ import React from 'react'; import { match as RouteMatch, Redirect, Route, Switch } from 'react-router-dom'; -import { SiemPageName } from '../../pages/home/types'; -import { HostsTableType } from '../../store/hosts/model'; +import { SiemPageName } from '../../../app/types'; +import { HostsTableType } from '../../../hosts/store/model'; import { RedirectToCreateRulePage, RedirectToDetectionEnginePage, @@ -25,8 +25,8 @@ import { RedirectToCreatePage, RedirectToConfigureCasesPage, } from './redirect_to_case'; -import { DetectionEngineTab } from '../../pages/detection_engine/types'; -import { TimelineType } from '../../../common/types/timeline'; +import { DetectionEngineTab } from '../../../alerts/pages/detection_engine/types'; +import { TimelineType } from '../../../../common/types/timeline'; interface LinkToPageProps { match: RouteMatch<{}>; diff --git a/x-pack/plugins/siem/public/components/link_to/redirect_to_case.tsx b/x-pack/plugins/siem/public/common/components/link_to/redirect_to_case.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/link_to/redirect_to_case.tsx rename to x-pack/plugins/siem/public/common/components/link_to/redirect_to_case.tsx index 6ec15b55ba83d..e0c03519c6cbe 100644 --- a/x-pack/plugins/siem/public/components/link_to/redirect_to_case.tsx +++ b/x-pack/plugins/siem/public/common/components/link_to/redirect_to_case.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { RouteComponentProps } from 'react-router-dom'; import { appendSearch } from './helpers'; import { RedirectWrapper } from './redirect_wrapper'; -import { SiemPageName } from '../../pages/home/types'; +import { SiemPageName } from '../../../app/types'; export type CaseComponentProps = RouteComponentProps<{ detailName: string; diff --git a/x-pack/plugins/siem/public/components/link_to/redirect_to_detection_engine.tsx b/x-pack/plugins/siem/public/common/components/link_to/redirect_to_detection_engine.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/link_to/redirect_to_detection_engine.tsx rename to x-pack/plugins/siem/public/common/components/link_to/redirect_to_detection_engine.tsx index 18111aa93a27a..fc5aef966f228 100644 --- a/x-pack/plugins/siem/public/components/link_to/redirect_to_detection_engine.tsx +++ b/x-pack/plugins/siem/public/common/components/link_to/redirect_to_detection_engine.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { RouteComponentProps } from 'react-router-dom'; -import { DetectionEngineTab } from '../../pages/detection_engine/types'; +import { DetectionEngineTab } from '../../../alerts/pages/detection_engine/types'; import { appendSearch } from './helpers'; import { RedirectWrapper } from './redirect_wrapper'; diff --git a/x-pack/plugins/siem/public/components/link_to/redirect_to_hosts.tsx b/x-pack/plugins/siem/public/common/components/link_to/redirect_to_hosts.tsx similarity index 94% rename from x-pack/plugins/siem/public/components/link_to/redirect_to_hosts.tsx rename to x-pack/plugins/siem/public/common/components/link_to/redirect_to_hosts.tsx index 746a959cc996a..0cfe8e655e255 100644 --- a/x-pack/plugins/siem/public/components/link_to/redirect_to_hosts.tsx +++ b/x-pack/plugins/siem/public/common/components/link_to/redirect_to_hosts.tsx @@ -7,8 +7,8 @@ import React from 'react'; import { RouteComponentProps } from 'react-router-dom'; -import { HostsTableType } from '../../store/hosts/model'; -import { SiemPageName } from '../../pages/home/types'; +import { HostsTableType } from '../../../hosts/store/model'; +import { SiemPageName } from '../../../app/types'; import { appendSearch } from './helpers'; import { RedirectWrapper } from './redirect_wrapper'; diff --git a/x-pack/plugins/siem/public/components/link_to/redirect_to_network.tsx b/x-pack/plugins/siem/public/common/components/link_to/redirect_to_network.tsx similarity index 90% rename from x-pack/plugins/siem/public/components/link_to/redirect_to_network.tsx rename to x-pack/plugins/siem/public/common/components/link_to/redirect_to_network.tsx index 71925edd5c086..d72bacf511faa 100644 --- a/x-pack/plugins/siem/public/components/link_to/redirect_to_network.tsx +++ b/x-pack/plugins/siem/public/common/components/link_to/redirect_to_network.tsx @@ -7,8 +7,8 @@ import React from 'react'; import { RouteComponentProps } from 'react-router-dom'; -import { SiemPageName } from '../../pages/home/types'; -import { FlowTarget, FlowTargetSourceDest } from '../../graphql/types'; +import { SiemPageName } from '../../../app/types'; +import { FlowTarget, FlowTargetSourceDest } from '../../../graphql/types'; import { appendSearch } from './helpers'; import { RedirectWrapper } from './redirect_wrapper'; diff --git a/x-pack/plugins/siem/public/components/link_to/redirect_to_overview.tsx b/x-pack/plugins/siem/public/common/components/link_to/redirect_to_overview.tsx similarity index 92% rename from x-pack/plugins/siem/public/components/link_to/redirect_to_overview.tsx rename to x-pack/plugins/siem/public/common/components/link_to/redirect_to_overview.tsx index e0789ac9e2558..2043b820e6966 100644 --- a/x-pack/plugins/siem/public/components/link_to/redirect_to_overview.tsx +++ b/x-pack/plugins/siem/public/common/components/link_to/redirect_to_overview.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { RouteComponentProps } from 'react-router-dom'; import { RedirectWrapper } from './redirect_wrapper'; -import { SiemPageName } from '../../pages/home/types'; +import { SiemPageName } from '../../../app/types'; export type OverviewComponentProps = RouteComponentProps<{ search: string; diff --git a/x-pack/plugins/siem/public/components/link_to/redirect_to_timelines.tsx b/x-pack/plugins/siem/public/common/components/link_to/redirect_to_timelines.tsx similarity index 89% rename from x-pack/plugins/siem/public/components/link_to/redirect_to_timelines.tsx rename to x-pack/plugins/siem/public/common/components/link_to/redirect_to_timelines.tsx index 9c704a7f70d29..3562153bea646 100644 --- a/x-pack/plugins/siem/public/components/link_to/redirect_to_timelines.tsx +++ b/x-pack/plugins/siem/public/common/components/link_to/redirect_to_timelines.tsx @@ -7,11 +7,11 @@ import React from 'react'; import { RouteComponentProps } from 'react-router-dom'; -import { SiemPageName } from '../../pages/home/types'; +import { SiemPageName } from '../../../app/types'; import { appendSearch } from './helpers'; import { RedirectWrapper } from './redirect_wrapper'; -import { TimelineTypeLiteral, TimelineType } from '../../../common/types/timeline'; +import { TimelineTypeLiteral, TimelineType } from '../../../../common/types/timeline'; export type TimelineComponentProps = RouteComponentProps<{ tabName: TimelineTypeLiteral; diff --git a/x-pack/plugins/siem/public/components/link_to/redirect_wrapper.tsx b/x-pack/plugins/siem/public/common/components/link_to/redirect_wrapper.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/link_to/redirect_wrapper.tsx rename to x-pack/plugins/siem/public/common/components/link_to/redirect_wrapper.tsx diff --git a/x-pack/plugins/siem/public/components/links/index.test.tsx b/x-pack/plugins/siem/public/common/components/links/index.test.tsx similarity index 99% rename from x-pack/plugins/siem/public/components/links/index.test.tsx rename to x-pack/plugins/siem/public/common/components/links/index.test.tsx index 214c0294f2cf4..9eff86bffb369 100644 --- a/x-pack/plugins/siem/public/components/links/index.test.tsx +++ b/x-pack/plugins/siem/public/common/components/links/index.test.tsx @@ -24,7 +24,7 @@ import { ExternalLink, } from '.'; -jest.mock('../../pages/overview/events_by_dataset'); +jest.mock('../../../overview/components/events_by_dataset'); jest.mock('../../lib/kibana', () => { return { diff --git a/x-pack/plugins/siem/public/components/links/index.tsx b/x-pack/plugins/siem/public/common/components/links/index.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/links/index.tsx rename to x-pack/plugins/siem/public/common/components/links/index.tsx index 6d473f4721710..4d639ce2781b1 100644 --- a/x-pack/plugins/siem/public/components/links/index.tsx +++ b/x-pack/plugins/siem/public/common/components/links/index.tsx @@ -9,11 +9,11 @@ import React, { useMemo } from 'react'; import { isNil } from 'lodash/fp'; import styled from 'styled-components'; -import { IP_REPUTATION_LINKS_SETTING } from '../../../common/constants'; +import { IP_REPUTATION_LINKS_SETTING } from '../../../../common/constants'; import { DefaultFieldRendererOverflow, DEFAULT_MORE_MAX_HEIGHT, -} from '../field_renderers/field_renderers'; +} from '../../../timelines/components/field_renderers/field_renderers'; import { encodeIpv6 } from '../../lib/helpers'; import { getCaseDetailsUrl, @@ -21,11 +21,11 @@ import { getIPDetailsUrl, getCreateCaseUrl, } from '../link_to'; -import { FlowTarget, FlowTargetSourceDest } from '../../graphql/types'; +import { FlowTarget, FlowTargetSourceDest } from '../../../graphql/types'; import { useUiSetting$ } from '../../lib/kibana'; -import { isUrlInvalid } from '../../pages/detection_engine/rules/components/step_about_rule/helpers'; +import { isUrlInvalid } from '../../../alerts/components/rules/step_about_rule/helpers'; import { ExternalLinkIcon } from '../external_link_icon'; -import { navTabs } from '../../pages/home/home_navigations'; +import { navTabs } from '../../../app/home/home_navigations'; import { useGetUrlSearch } from '../navigation/use_get_url_search'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/components/links/translations.ts b/x-pack/plugins/siem/public/common/components/links/translations.ts similarity index 87% rename from x-pack/plugins/siem/public/components/links/translations.ts rename to x-pack/plugins/siem/public/common/components/links/translations.ts index bed867cd5bf50..fdc5036117577 100644 --- a/x-pack/plugins/siem/public/components/links/translations.ts +++ b/x-pack/plugins/siem/public/common/components/links/translations.ts @@ -6,7 +6,7 @@ import { i18n } from '@kbn/i18n'; -export * from '../page/network/ip_overview/translations'; +export * from '../../../network/components/ip_overview/translations'; export const CASE_DETAILS_LINK_ARIA = (detailName: string) => i18n.translate('xpack.siem.case.caseTable.caseDetailsLinkAria', { diff --git a/x-pack/plugins/siem/public/components/loader/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/common/components/loader/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/loader/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/loader/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/loader/index.test.tsx b/x-pack/plugins/siem/public/common/components/loader/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/loader/index.test.tsx rename to x-pack/plugins/siem/public/common/components/loader/index.test.tsx diff --git a/x-pack/plugins/siem/public/components/loader/index.tsx b/x-pack/plugins/siem/public/common/components/loader/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/loader/index.tsx rename to x-pack/plugins/siem/public/common/components/loader/index.tsx diff --git a/x-pack/plugins/siem/public/components/localized_date_tooltip/index.test.tsx b/x-pack/plugins/siem/public/common/components/localized_date_tooltip/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/localized_date_tooltip/index.test.tsx rename to x-pack/plugins/siem/public/common/components/localized_date_tooltip/index.test.tsx diff --git a/x-pack/plugins/siem/public/components/localized_date_tooltip/index.tsx b/x-pack/plugins/siem/public/common/components/localized_date_tooltip/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/localized_date_tooltip/index.tsx rename to x-pack/plugins/siem/public/common/components/localized_date_tooltip/index.tsx diff --git a/x-pack/plugins/siem/public/components/markdown/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/common/components/markdown/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/markdown/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/markdown/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/markdown/__snapshots__/markdown_hint.test.tsx.snap b/x-pack/plugins/siem/public/common/components/markdown/__snapshots__/markdown_hint.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/markdown/__snapshots__/markdown_hint.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/markdown/__snapshots__/markdown_hint.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/markdown/index.test.tsx b/x-pack/plugins/siem/public/common/components/markdown/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/markdown/index.test.tsx rename to x-pack/plugins/siem/public/common/components/markdown/index.test.tsx diff --git a/x-pack/plugins/siem/public/components/markdown/index.tsx b/x-pack/plugins/siem/public/common/components/markdown/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/markdown/index.tsx rename to x-pack/plugins/siem/public/common/components/markdown/index.tsx diff --git a/x-pack/plugins/siem/public/components/markdown/markdown_hint.test.tsx b/x-pack/plugins/siem/public/common/components/markdown/markdown_hint.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/markdown/markdown_hint.test.tsx rename to x-pack/plugins/siem/public/common/components/markdown/markdown_hint.test.tsx diff --git a/x-pack/plugins/siem/public/components/markdown/markdown_hint.tsx b/x-pack/plugins/siem/public/common/components/markdown/markdown_hint.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/markdown/markdown_hint.tsx rename to x-pack/plugins/siem/public/common/components/markdown/markdown_hint.tsx diff --git a/x-pack/plugins/siem/public/components/markdown/translations.ts b/x-pack/plugins/siem/public/common/components/markdown/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/markdown/translations.ts rename to x-pack/plugins/siem/public/common/components/markdown/translations.ts diff --git a/x-pack/plugins/siem/public/components/markdown_editor/constants.ts b/x-pack/plugins/siem/public/common/components/markdown_editor/constants.ts similarity index 100% rename from x-pack/plugins/siem/public/components/markdown_editor/constants.ts rename to x-pack/plugins/siem/public/common/components/markdown_editor/constants.ts diff --git a/x-pack/plugins/siem/public/components/markdown_editor/form.tsx b/x-pack/plugins/siem/public/common/components/markdown_editor/form.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/markdown_editor/form.tsx rename to x-pack/plugins/siem/public/common/components/markdown_editor/form.tsx index 17c321b15418c..2ed85b04fe3f6 100644 --- a/x-pack/plugins/siem/public/components/markdown_editor/form.tsx +++ b/x-pack/plugins/siem/public/common/components/markdown_editor/form.tsx @@ -7,7 +7,7 @@ import { EuiFormRow } from '@elastic/eui'; import React, { useCallback } from 'react'; -import { FieldHook, getFieldValidityAndErrorMessage } from '../../shared_imports'; +import { FieldHook, getFieldValidityAndErrorMessage } from '../../../shared_imports'; import { CursorPosition, MarkdownEditor } from '.'; interface IMarkdownEditorForm { diff --git a/x-pack/plugins/siem/public/components/markdown_editor/index.tsx b/x-pack/plugins/siem/public/common/components/markdown_editor/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/markdown_editor/index.tsx rename to x-pack/plugins/siem/public/common/components/markdown_editor/index.tsx diff --git a/x-pack/plugins/siem/public/components/markdown_editor/translations.ts b/x-pack/plugins/siem/public/common/components/markdown_editor/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/markdown_editor/translations.ts rename to x-pack/plugins/siem/public/common/components/markdown_editor/translations.ts diff --git a/x-pack/plugins/siem/public/components/matrix_histogram/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/common/components/matrix_histogram/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/matrix_histogram/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/matrix_histogram/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/matrix_histogram/index.test.tsx b/x-pack/plugins/siem/public/common/components/matrix_histogram/index.test.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/matrix_histogram/index.test.tsx rename to x-pack/plugins/siem/public/common/components/matrix_histogram/index.test.tsx index 3b8a43a0f395a..b45207ab47c7a 100644 --- a/x-pack/plugins/siem/public/components/matrix_histogram/index.test.tsx +++ b/x-pack/plugins/siem/public/common/components/matrix_histogram/index.test.tsx @@ -11,7 +11,7 @@ import React from 'react'; import { MatrixHistogram } from '.'; import { useQuery } from '../../containers/matrix_histogram'; -import { HistogramType } from '../../graphql/types'; +import { HistogramType } from '../../../graphql/types'; jest.mock('../../lib/kibana'); jest.mock('./matrix_loader', () => { diff --git a/x-pack/plugins/siem/public/components/matrix_histogram/index.tsx b/x-pack/plugins/siem/public/common/components/matrix_histogram/index.tsx similarity index 95% rename from x-pack/plugins/siem/public/components/matrix_histogram/index.tsx rename to x-pack/plugins/siem/public/common/components/matrix_histogram/index.tsx index ba3cb4f62af86..b2a9f915005f1 100644 --- a/x-pack/plugins/siem/public/components/matrix_histogram/index.tsx +++ b/x-pack/plugins/siem/public/common/components/matrix_histogram/index.tsx @@ -27,18 +27,20 @@ import { } from './types'; import { InspectButtonContainer } from '../inspect'; -import { State, inputsSelectors, hostsModel, networkModel } from '../../store'; +import { State, inputsSelectors } from '../../store'; +import { hostsModel } from '../../../hosts/store'; +import { networkModel } from '../../../network/store'; import { MatrixHistogramMappingTypes, GetTitle, GetSubTitle, } from '../../components/matrix_histogram/types'; -import { SetQuery } from '../../pages/hosts/navigation/types'; +import { SetQuery } from '../../../hosts/pages/navigation/types'; import { QueryTemplateProps } from '../../containers/query_template'; import { setAbsoluteRangeDatePicker } from '../../store/inputs/actions'; import { InputsModelId } from '../../store/inputs/constants'; -import { HistogramType } from '../../graphql/types'; +import { HistogramType } from '../../../graphql/types'; export interface OwnProps extends QueryTemplateProps { defaultStackByOption: MatrixHistogramOption; @@ -112,11 +114,11 @@ export const MatrixHistogramComponent: React.FC { diff --git a/x-pack/plugins/siem/public/components/matrix_histogram/utils.ts b/x-pack/plugins/siem/public/common/components/matrix_histogram/utils.ts similarity index 97% rename from x-pack/plugins/siem/public/components/matrix_histogram/utils.ts rename to x-pack/plugins/siem/public/common/components/matrix_histogram/utils.ts index d31eb1da15ea1..45e9c54b2eff8 100644 --- a/x-pack/plugins/siem/public/components/matrix_histogram/utils.ts +++ b/x-pack/plugins/siem/public/common/components/matrix_histogram/utils.ts @@ -8,7 +8,7 @@ import { get, groupBy, map, toPairs } from 'lodash/fp'; import { UpdateDateRange, ChartSeriesData } from '../charts/common'; import { MatrixHistogramMappingTypes, BarchartConfigs } from './types'; -import { MatrixOverTimeHistogramData } from '../../graphql/types'; +import { MatrixOverTimeHistogramData } from '../../../graphql/types'; import { histogramDateTimeFormatter } from '../utils'; interface GetBarchartConfigsProps { diff --git a/x-pack/plugins/siem/public/components/ml/__snapshots__/entity_draggable.test.tsx.snap b/x-pack/plugins/siem/public/common/components/ml/__snapshots__/entity_draggable.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/ml/__snapshots__/entity_draggable.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/ml/__snapshots__/entity_draggable.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/ml/anomaly/anomaly_table_provider.tsx b/x-pack/plugins/siem/public/common/components/ml/anomaly/anomaly_table_provider.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/ml/anomaly/anomaly_table_provider.tsx rename to x-pack/plugins/siem/public/common/components/ml/anomaly/anomaly_table_provider.tsx diff --git a/x-pack/plugins/siem/public/components/ml/anomaly/get_interval_from_anomalies.test.ts b/x-pack/plugins/siem/public/common/components/ml/anomaly/get_interval_from_anomalies.test.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/anomaly/get_interval_from_anomalies.test.ts rename to x-pack/plugins/siem/public/common/components/ml/anomaly/get_interval_from_anomalies.test.ts diff --git a/x-pack/plugins/siem/public/components/ml/anomaly/get_interval_from_anomalies.ts b/x-pack/plugins/siem/public/common/components/ml/anomaly/get_interval_from_anomalies.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/anomaly/get_interval_from_anomalies.ts rename to x-pack/plugins/siem/public/common/components/ml/anomaly/get_interval_from_anomalies.ts diff --git a/x-pack/plugins/siem/public/components/ml/anomaly/translations.ts b/x-pack/plugins/siem/public/common/components/ml/anomaly/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/anomaly/translations.ts rename to x-pack/plugins/siem/public/common/components/ml/anomaly/translations.ts diff --git a/x-pack/plugins/siem/public/components/ml/anomaly/use_anomalies_table_data.test.ts b/x-pack/plugins/siem/public/common/components/ml/anomaly/use_anomalies_table_data.test.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/anomaly/use_anomalies_table_data.test.ts rename to x-pack/plugins/siem/public/common/components/ml/anomaly/use_anomalies_table_data.test.ts diff --git a/x-pack/plugins/siem/public/components/ml/anomaly/use_anomalies_table_data.ts b/x-pack/plugins/siem/public/common/components/ml/anomaly/use_anomalies_table_data.ts similarity index 95% rename from x-pack/plugins/siem/public/components/ml/anomaly/use_anomalies_table_data.ts rename to x-pack/plugins/siem/public/common/components/ml/anomaly/use_anomalies_table_data.ts index 67efda67a20a3..51300d9145000 100644 --- a/x-pack/plugins/siem/public/components/ml/anomaly/use_anomalies_table_data.ts +++ b/x-pack/plugins/siem/public/common/components/ml/anomaly/use_anomalies_table_data.ts @@ -6,10 +6,10 @@ import { useState, useEffect } from 'react'; -import { DEFAULT_ANOMALY_SCORE } from '../../../../common/constants'; +import { DEFAULT_ANOMALY_SCORE } from '../../../../../common/constants'; import { anomaliesTableData } from '../api/anomalies_table_data'; import { InfluencerInput, Anomalies, CriteriaFields } from '../types'; -import { hasMlUserPermissions } from '../../../../common/machine_learning/has_ml_user_permissions'; +import { hasMlUserPermissions } from '../../../../../common/machine_learning/has_ml_user_permissions'; import { useSiemJobs } from '../../ml_popover/hooks/use_siem_jobs'; import { useMlCapabilities } from '../../ml_popover/hooks/use_ml_capabilities'; import { useStateToaster, errorToToaster } from '../../toasters'; diff --git a/x-pack/plugins/siem/public/components/ml/api/anomalies_table_data.ts b/x-pack/plugins/siem/public/common/components/ml/api/anomalies_table_data.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/api/anomalies_table_data.ts rename to x-pack/plugins/siem/public/common/components/ml/api/anomalies_table_data.ts diff --git a/x-pack/plugins/siem/public/components/ml/api/errors.ts b/x-pack/plugins/siem/public/common/components/ml/api/errors.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/api/errors.ts rename to x-pack/plugins/siem/public/common/components/ml/api/errors.ts diff --git a/x-pack/plugins/siem/public/components/ml/api/get_ml_capabilities.ts b/x-pack/plugins/siem/public/common/components/ml/api/get_ml_capabilities.ts similarity index 92% rename from x-pack/plugins/siem/public/components/ml/api/get_ml_capabilities.ts rename to x-pack/plugins/siem/public/common/components/ml/api/get_ml_capabilities.ts index e6a792e779b0c..32f6f888ab8d7 100644 --- a/x-pack/plugins/siem/public/components/ml/api/get_ml_capabilities.ts +++ b/x-pack/plugins/siem/public/common/components/ml/api/get_ml_capabilities.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { MlCapabilitiesResponse } from '../../../../../ml/public'; +import { MlCapabilitiesResponse } from '../../../../../../ml/public'; import { KibanaServices } from '../../../lib/kibana'; import { InfluencerInput } from '../types'; diff --git a/x-pack/plugins/siem/public/components/ml/api/throw_if_not_ok.test.ts b/x-pack/plugins/siem/public/common/components/ml/api/throw_if_not_ok.test.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/api/throw_if_not_ok.test.ts rename to x-pack/plugins/siem/public/common/components/ml/api/throw_if_not_ok.test.ts diff --git a/x-pack/plugins/siem/public/components/ml/api/throw_if_not_ok.ts b/x-pack/plugins/siem/public/common/components/ml/api/throw_if_not_ok.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/api/throw_if_not_ok.ts rename to x-pack/plugins/siem/public/common/components/ml/api/throw_if_not_ok.ts diff --git a/x-pack/plugins/siem/public/components/ml/api/translations.ts b/x-pack/plugins/siem/public/common/components/ml/api/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/api/translations.ts rename to x-pack/plugins/siem/public/common/components/ml/api/translations.ts diff --git a/x-pack/plugins/siem/public/components/ml/conditional_links/add_entities_to_kql.test.ts b/x-pack/plugins/siem/public/common/components/ml/conditional_links/add_entities_to_kql.test.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/conditional_links/add_entities_to_kql.test.ts rename to x-pack/plugins/siem/public/common/components/ml/conditional_links/add_entities_to_kql.test.ts diff --git a/x-pack/plugins/siem/public/components/ml/conditional_links/add_entities_to_kql.ts b/x-pack/plugins/siem/public/common/components/ml/conditional_links/add_entities_to_kql.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/conditional_links/add_entities_to_kql.ts rename to x-pack/plugins/siem/public/common/components/ml/conditional_links/add_entities_to_kql.ts diff --git a/x-pack/plugins/siem/public/components/ml/conditional_links/entity_helpers.test.ts b/x-pack/plugins/siem/public/common/components/ml/conditional_links/entity_helpers.test.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/conditional_links/entity_helpers.test.ts rename to x-pack/plugins/siem/public/common/components/ml/conditional_links/entity_helpers.test.ts diff --git a/x-pack/plugins/siem/public/components/ml/conditional_links/entity_helpers.ts b/x-pack/plugins/siem/public/common/components/ml/conditional_links/entity_helpers.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/conditional_links/entity_helpers.ts rename to x-pack/plugins/siem/public/common/components/ml/conditional_links/entity_helpers.ts diff --git a/x-pack/plugins/siem/public/components/ml/conditional_links/ml_host_conditional_container.tsx b/x-pack/plugins/siem/public/common/components/ml/conditional_links/ml_host_conditional_container.tsx similarity index 94% rename from x-pack/plugins/siem/public/components/ml/conditional_links/ml_host_conditional_container.tsx rename to x-pack/plugins/siem/public/common/components/ml/conditional_links/ml_host_conditional_container.tsx index b7c544273ae92..6ca723c50c681 100644 --- a/x-pack/plugins/siem/public/components/ml/conditional_links/ml_host_conditional_container.tsx +++ b/x-pack/plugins/siem/public/common/components/ml/conditional_links/ml_host_conditional_container.tsx @@ -11,10 +11,10 @@ import { Redirect, Route, Switch, RouteComponentProps } from 'react-router-dom'; import { addEntitiesToKql } from './add_entities_to_kql'; import { replaceKQLParts } from './replace_kql_parts'; import { emptyEntity, multipleEntities, getMultipleEntities } from './entity_helpers'; -import { SiemPageName } from '../../../pages/home/types'; -import { HostsTableType } from '../../../store/hosts/model'; +import { SiemPageName } from '../../../../app/types'; +import { HostsTableType } from '../../../../hosts/store/model'; -import { url as urlUtils } from '../../../../../../../src/plugins/kibana_utils/public'; +import { url as urlUtils } from '../../../../../../../../src/plugins/kibana_utils/public'; interface QueryStringType { '?_g': string; diff --git a/x-pack/plugins/siem/public/components/ml/conditional_links/ml_network_conditional_container.tsx b/x-pack/plugins/siem/public/common/components/ml/conditional_links/ml_network_conditional_container.tsx similarity index 95% rename from x-pack/plugins/siem/public/components/ml/conditional_links/ml_network_conditional_container.tsx rename to x-pack/plugins/siem/public/common/components/ml/conditional_links/ml_network_conditional_container.tsx index 54773e3ab6dda..05049cd9b4ea5 100644 --- a/x-pack/plugins/siem/public/components/ml/conditional_links/ml_network_conditional_container.tsx +++ b/x-pack/plugins/siem/public/common/components/ml/conditional_links/ml_network_conditional_container.tsx @@ -11,9 +11,9 @@ import { Redirect, Route, Switch, RouteComponentProps } from 'react-router-dom'; import { addEntitiesToKql } from './add_entities_to_kql'; import { replaceKQLParts } from './replace_kql_parts'; import { emptyEntity, getMultipleEntities, multipleEntities } from './entity_helpers'; -import { SiemPageName } from '../../../pages/home/types'; +import { SiemPageName } from '../../../../app/types'; -import { url as urlUtils } from '../../../../../../../src/plugins/kibana_utils/public'; +import { url as urlUtils } from '../../../../../../../../src/plugins/kibana_utils/public'; interface QueryStringType { '?_g': string; diff --git a/x-pack/plugins/siem/public/components/ml/conditional_links/remove_kql_variables.test.ts b/x-pack/plugins/siem/public/common/components/ml/conditional_links/remove_kql_variables.test.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/conditional_links/remove_kql_variables.test.ts rename to x-pack/plugins/siem/public/common/components/ml/conditional_links/remove_kql_variables.test.ts diff --git a/x-pack/plugins/siem/public/components/ml/conditional_links/remove_kql_variables.ts b/x-pack/plugins/siem/public/common/components/ml/conditional_links/remove_kql_variables.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/conditional_links/remove_kql_variables.ts rename to x-pack/plugins/siem/public/common/components/ml/conditional_links/remove_kql_variables.ts diff --git a/x-pack/plugins/siem/public/components/ml/conditional_links/replace_kql_commas_with_or.test.ts b/x-pack/plugins/siem/public/common/components/ml/conditional_links/replace_kql_commas_with_or.test.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/conditional_links/replace_kql_commas_with_or.test.ts rename to x-pack/plugins/siem/public/common/components/ml/conditional_links/replace_kql_commas_with_or.test.ts diff --git a/x-pack/plugins/siem/public/components/ml/conditional_links/replace_kql_commas_with_or.ts b/x-pack/plugins/siem/public/common/components/ml/conditional_links/replace_kql_commas_with_or.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/conditional_links/replace_kql_commas_with_or.ts rename to x-pack/plugins/siem/public/common/components/ml/conditional_links/replace_kql_commas_with_or.ts diff --git a/x-pack/plugins/siem/public/components/ml/conditional_links/replace_kql_parts.test.ts b/x-pack/plugins/siem/public/common/components/ml/conditional_links/replace_kql_parts.test.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/conditional_links/replace_kql_parts.test.ts rename to x-pack/plugins/siem/public/common/components/ml/conditional_links/replace_kql_parts.test.ts diff --git a/x-pack/plugins/siem/public/components/ml/conditional_links/replace_kql_parts.ts b/x-pack/plugins/siem/public/common/components/ml/conditional_links/replace_kql_parts.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/conditional_links/replace_kql_parts.ts rename to x-pack/plugins/siem/public/common/components/ml/conditional_links/replace_kql_parts.ts diff --git a/x-pack/plugins/siem/public/components/ml/conditional_links/rison_helpers.test.ts b/x-pack/plugins/siem/public/common/components/ml/conditional_links/rison_helpers.test.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/conditional_links/rison_helpers.test.ts rename to x-pack/plugins/siem/public/common/components/ml/conditional_links/rison_helpers.test.ts diff --git a/x-pack/plugins/siem/public/components/ml/conditional_links/rison_helpers.ts b/x-pack/plugins/siem/public/common/components/ml/conditional_links/rison_helpers.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/conditional_links/rison_helpers.ts rename to x-pack/plugins/siem/public/common/components/ml/conditional_links/rison_helpers.ts diff --git a/x-pack/plugins/siem/public/components/ml/criteria/get_criteria_from_host_type.test.ts b/x-pack/plugins/siem/public/common/components/ml/criteria/get_criteria_from_host_type.test.ts similarity index 94% rename from x-pack/plugins/siem/public/components/ml/criteria/get_criteria_from_host_type.test.ts rename to x-pack/plugins/siem/public/common/components/ml/criteria/get_criteria_from_host_type.test.ts index d8e951adabbc9..215df22f4a255 100644 --- a/x-pack/plugins/siem/public/components/ml/criteria/get_criteria_from_host_type.test.ts +++ b/x-pack/plugins/siem/public/common/components/ml/criteria/get_criteria_from_host_type.test.ts @@ -5,7 +5,7 @@ */ import { getCriteriaFromHostType } from './get_criteria_from_host_type'; -import { HostsType } from '../../../store/hosts/model'; +import { HostsType } from '../../../../hosts/store/model'; describe('get_criteria_from_host_type', () => { test('returns host names from criteria if the host type is details', () => { diff --git a/x-pack/plugins/siem/public/components/ml/criteria/get_criteria_from_host_type.ts b/x-pack/plugins/siem/public/common/components/ml/criteria/get_criteria_from_host_type.ts similarity index 90% rename from x-pack/plugins/siem/public/components/ml/criteria/get_criteria_from_host_type.ts rename to x-pack/plugins/siem/public/common/components/ml/criteria/get_criteria_from_host_type.ts index 2667e3a089f41..5988f0d1001b2 100644 --- a/x-pack/plugins/siem/public/components/ml/criteria/get_criteria_from_host_type.ts +++ b/x-pack/plugins/siem/public/common/components/ml/criteria/get_criteria_from_host_type.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { HostsType } from '../../../store/hosts/model'; +import { HostsType } from '../../../../hosts/store/model'; import { CriteriaFields } from '../types'; export const getCriteriaFromHostType = ( diff --git a/x-pack/plugins/siem/public/components/ml/criteria/get_criteria_from_network_type.test.ts b/x-pack/plugins/siem/public/common/components/ml/criteria/get_criteria_from_network_type.test.ts similarity index 92% rename from x-pack/plugins/siem/public/components/ml/criteria/get_criteria_from_network_type.test.ts rename to x-pack/plugins/siem/public/common/components/ml/criteria/get_criteria_from_network_type.test.ts index fe1cd77a61195..07bdee140a0cd 100644 --- a/x-pack/plugins/siem/public/components/ml/criteria/get_criteria_from_network_type.test.ts +++ b/x-pack/plugins/siem/public/common/components/ml/criteria/get_criteria_from_network_type.test.ts @@ -5,8 +5,8 @@ */ import { getCriteriaFromNetworkType } from './get_criteria_from_network_type'; -import { NetworkType } from '../../../store/network/model'; -import { FlowTarget } from '../../../graphql/types'; +import { NetworkType } from '../../../../network/store/model'; +import { FlowTarget } from '../../../../graphql/types'; describe('get_criteria_from_network_type', () => { test('returns network names from criteria if the network type is details and it is source', () => { diff --git a/x-pack/plugins/siem/public/components/ml/criteria/get_criteria_from_network_type.ts b/x-pack/plugins/siem/public/common/components/ml/criteria/get_criteria_from_network_type.ts similarity index 86% rename from x-pack/plugins/siem/public/components/ml/criteria/get_criteria_from_network_type.ts rename to x-pack/plugins/siem/public/common/components/ml/criteria/get_criteria_from_network_type.ts index 75c7e580f93c0..d717edea97cce 100644 --- a/x-pack/plugins/siem/public/components/ml/criteria/get_criteria_from_network_type.ts +++ b/x-pack/plugins/siem/public/common/components/ml/criteria/get_criteria_from_network_type.ts @@ -5,8 +5,8 @@ */ import { CriteriaFields } from '../types'; -import { NetworkType } from '../../../store/network/model'; -import { FlowTarget } from '../../../graphql/types'; +import { NetworkType } from '../../../../network/store/model'; +import { FlowTarget } from '../../../../graphql/types'; export const getCriteriaFromNetworkType = ( type: NetworkType, diff --git a/x-pack/plugins/siem/public/components/ml/criteria/host_to_criteria.test.ts b/x-pack/plugins/siem/public/common/components/ml/criteria/host_to_criteria.test.ts similarity index 95% rename from x-pack/plugins/siem/public/components/ml/criteria/host_to_criteria.test.ts rename to x-pack/plugins/siem/public/common/components/ml/criteria/host_to_criteria.test.ts index 8cc672ab4321c..bdd107145516f 100644 --- a/x-pack/plugins/siem/public/components/ml/criteria/host_to_criteria.test.ts +++ b/x-pack/plugins/siem/public/common/components/ml/criteria/host_to_criteria.test.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { HostItem } from '../../../graphql/types'; +import { HostItem } from '../../../../graphql/types'; import { CriteriaFields } from '../types'; import { hostToCriteria } from './host_to_criteria'; diff --git a/x-pack/plugins/siem/public/components/ml/criteria/host_to_criteria.ts b/x-pack/plugins/siem/public/common/components/ml/criteria/host_to_criteria.ts similarity index 91% rename from x-pack/plugins/siem/public/components/ml/criteria/host_to_criteria.ts rename to x-pack/plugins/siem/public/common/components/ml/criteria/host_to_criteria.ts index aeb5fa2646822..f708bd43b8c9b 100644 --- a/x-pack/plugins/siem/public/components/ml/criteria/host_to_criteria.ts +++ b/x-pack/plugins/siem/public/common/components/ml/criteria/host_to_criteria.ts @@ -5,7 +5,7 @@ */ import { CriteriaFields } from '../types'; -import { HostItem } from '../../../graphql/types'; +import { HostItem } from '../../../../graphql/types'; export const hostToCriteria = (hostItem: HostItem): CriteriaFields[] => { if (hostItem.host != null && hostItem.host.name != null) { diff --git a/x-pack/plugins/siem/public/components/ml/criteria/network_to_criteria.test.ts b/x-pack/plugins/siem/public/common/components/ml/criteria/network_to_criteria.test.ts similarity index 95% rename from x-pack/plugins/siem/public/components/ml/criteria/network_to_criteria.test.ts rename to x-pack/plugins/siem/public/common/components/ml/criteria/network_to_criteria.test.ts index d6abb4a42e80f..6c0d2fc60a626 100644 --- a/x-pack/plugins/siem/public/components/ml/criteria/network_to_criteria.test.ts +++ b/x-pack/plugins/siem/public/common/components/ml/criteria/network_to_criteria.test.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { FlowTarget } from '../../../graphql/types'; +import { FlowTarget } from '../../../../graphql/types'; import { CriteriaFields } from '../types'; import { networkToCriteria } from './network_to_criteria'; diff --git a/x-pack/plugins/siem/public/components/ml/criteria/network_to_criteria.ts b/x-pack/plugins/siem/public/common/components/ml/criteria/network_to_criteria.ts similarity index 91% rename from x-pack/plugins/siem/public/components/ml/criteria/network_to_criteria.ts rename to x-pack/plugins/siem/public/common/components/ml/criteria/network_to_criteria.ts index a859931d6e228..de2cc35007e87 100644 --- a/x-pack/plugins/siem/public/components/ml/criteria/network_to_criteria.ts +++ b/x-pack/plugins/siem/public/common/components/ml/criteria/network_to_criteria.ts @@ -5,7 +5,7 @@ */ import { CriteriaFields } from '../types'; -import { FlowTarget } from '../../../graphql/types'; +import { FlowTarget } from '../../../../graphql/types'; export const networkToCriteria = (ip: string, flowTarget: FlowTarget): CriteriaFields[] => { if (flowTarget === FlowTarget.source) { diff --git a/x-pack/plugins/siem/public/components/ml/entity_draggable.test.tsx b/x-pack/plugins/siem/public/common/components/ml/entity_draggable.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/ml/entity_draggable.test.tsx rename to x-pack/plugins/siem/public/common/components/ml/entity_draggable.test.tsx diff --git a/x-pack/plugins/siem/public/components/ml/entity_draggable.tsx b/x-pack/plugins/siem/public/common/components/ml/entity_draggable.tsx similarity index 88% rename from x-pack/plugins/siem/public/components/ml/entity_draggable.tsx rename to x-pack/plugins/siem/public/common/components/ml/entity_draggable.tsx index b0636b08a5634..9024aec17400c 100644 --- a/x-pack/plugins/siem/public/components/ml/entity_draggable.tsx +++ b/x-pack/plugins/siem/public/common/components/ml/entity_draggable.tsx @@ -6,8 +6,8 @@ import React from 'react'; import { DraggableWrapper, DragEffects } from '../drag_and_drop/draggable_wrapper'; -import { IS_OPERATOR } from '../timeline/data_providers/data_provider'; -import { Provider } from '../timeline/data_providers/provider'; +import { IS_OPERATOR } from '../../../timelines/components/timeline/data_providers/data_provider'; +import { Provider } from '../../../timelines/components/timeline/data_providers/provider'; import { escapeDataProviderId } from '../drag_and_drop/helpers'; interface Props { diff --git a/x-pack/plugins/siem/public/components/ml/get_entries.test.ts b/x-pack/plugins/siem/public/common/components/ml/get_entries.test.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/get_entries.test.ts rename to x-pack/plugins/siem/public/common/components/ml/get_entries.test.ts diff --git a/x-pack/plugins/siem/public/components/ml/get_entries.ts b/x-pack/plugins/siem/public/common/components/ml/get_entries.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/get_entries.ts rename to x-pack/plugins/siem/public/common/components/ml/get_entries.ts diff --git a/x-pack/plugins/siem/public/components/ml/influencers/__snapshots__/create_influencers.test.tsx.snap b/x-pack/plugins/siem/public/common/components/ml/influencers/__snapshots__/create_influencers.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/ml/influencers/__snapshots__/create_influencers.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/ml/influencers/__snapshots__/create_influencers.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/ml/influencers/create_influencers.test.tsx b/x-pack/plugins/siem/public/common/components/ml/influencers/create_influencers.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/ml/influencers/create_influencers.test.tsx rename to x-pack/plugins/siem/public/common/components/ml/influencers/create_influencers.test.tsx diff --git a/x-pack/plugins/siem/public/components/ml/influencers/create_influencers.tsx b/x-pack/plugins/siem/public/common/components/ml/influencers/create_influencers.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/ml/influencers/create_influencers.tsx rename to x-pack/plugins/siem/public/common/components/ml/influencers/create_influencers.tsx diff --git a/x-pack/plugins/siem/public/components/ml/influencers/get_host_name_from_influencers.test.ts b/x-pack/plugins/siem/public/common/components/ml/influencers/get_host_name_from_influencers.test.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/influencers/get_host_name_from_influencers.test.ts rename to x-pack/plugins/siem/public/common/components/ml/influencers/get_host_name_from_influencers.test.ts diff --git a/x-pack/plugins/siem/public/components/ml/influencers/get_host_name_from_influencers.ts b/x-pack/plugins/siem/public/common/components/ml/influencers/get_host_name_from_influencers.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/influencers/get_host_name_from_influencers.ts rename to x-pack/plugins/siem/public/common/components/ml/influencers/get_host_name_from_influencers.ts diff --git a/x-pack/plugins/siem/public/components/ml/influencers/get_network_from_influencers.test.ts b/x-pack/plugins/siem/public/common/components/ml/influencers/get_network_from_influencers.test.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/influencers/get_network_from_influencers.test.ts rename to x-pack/plugins/siem/public/common/components/ml/influencers/get_network_from_influencers.test.ts diff --git a/x-pack/plugins/siem/public/components/ml/influencers/get_network_from_influencers.ts b/x-pack/plugins/siem/public/common/components/ml/influencers/get_network_from_influencers.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/influencers/get_network_from_influencers.ts rename to x-pack/plugins/siem/public/common/components/ml/influencers/get_network_from_influencers.ts diff --git a/x-pack/plugins/siem/public/components/ml/influencers/host_to_influencers.test.ts b/x-pack/plugins/siem/public/common/components/ml/influencers/host_to_influencers.test.ts similarity index 95% rename from x-pack/plugins/siem/public/components/ml/influencers/host_to_influencers.test.ts rename to x-pack/plugins/siem/public/common/components/ml/influencers/host_to_influencers.test.ts index 47a1fd52e947f..8e67168b6acd4 100644 --- a/x-pack/plugins/siem/public/components/ml/influencers/host_to_influencers.test.ts +++ b/x-pack/plugins/siem/public/common/components/ml/influencers/host_to_influencers.test.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { HostItem } from '../../../graphql/types'; +import { HostItem } from '../../../../graphql/types'; import { InfluencerInput } from '../types'; import { hostToInfluencers } from './host_to_influencers'; diff --git a/x-pack/plugins/siem/public/components/ml/influencers/host_to_influencers.ts b/x-pack/plugins/siem/public/common/components/ml/influencers/host_to_influencers.ts similarity index 92% rename from x-pack/plugins/siem/public/components/ml/influencers/host_to_influencers.ts rename to x-pack/plugins/siem/public/common/components/ml/influencers/host_to_influencers.ts index 69d1b6e26ac72..ae7698a1bac88 100644 --- a/x-pack/plugins/siem/public/components/ml/influencers/host_to_influencers.ts +++ b/x-pack/plugins/siem/public/common/components/ml/influencers/host_to_influencers.ts @@ -5,7 +5,7 @@ */ import { InfluencerInput } from '../types'; -import { HostItem } from '../../../graphql/types'; +import { HostItem } from '../../../../graphql/types'; export const hostToInfluencers = (hostItem: HostItem): InfluencerInput[] | null => { if (hostItem.host != null && hostItem.host.name != null) { diff --git a/x-pack/plugins/siem/public/components/ml/influencers/network_to_influencers.test.ts b/x-pack/plugins/siem/public/common/components/ml/influencers/network_to_influencers.test.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/influencers/network_to_influencers.test.ts rename to x-pack/plugins/siem/public/common/components/ml/influencers/network_to_influencers.test.ts diff --git a/x-pack/plugins/siem/public/components/ml/influencers/network_to_influencers.ts b/x-pack/plugins/siem/public/common/components/ml/influencers/network_to_influencers.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/influencers/network_to_influencers.ts rename to x-pack/plugins/siem/public/common/components/ml/influencers/network_to_influencers.ts diff --git a/x-pack/plugins/siem/public/components/ml/links/create_explorer_link.test.ts b/x-pack/plugins/siem/public/common/components/ml/links/create_explorer_link.test.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/links/create_explorer_link.test.ts rename to x-pack/plugins/siem/public/common/components/ml/links/create_explorer_link.test.ts diff --git a/x-pack/plugins/siem/public/components/ml/links/create_explorer_link.ts b/x-pack/plugins/siem/public/common/components/ml/links/create_explorer_link.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/links/create_explorer_link.ts rename to x-pack/plugins/siem/public/common/components/ml/links/create_explorer_link.ts diff --git a/x-pack/plugins/siem/public/components/ml/links/create_series_link.test.ts b/x-pack/plugins/siem/public/common/components/ml/links/create_series_link.test.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/links/create_series_link.test.ts rename to x-pack/plugins/siem/public/common/components/ml/links/create_series_link.test.ts diff --git a/x-pack/plugins/siem/public/components/ml/links/create_series_link.ts b/x-pack/plugins/siem/public/common/components/ml/links/create_series_link.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/links/create_series_link.ts rename to x-pack/plugins/siem/public/common/components/ml/links/create_series_link.ts diff --git a/x-pack/plugins/siem/public/components/ml/mock.ts b/x-pack/plugins/siem/public/common/components/ml/mock.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/mock.ts rename to x-pack/plugins/siem/public/common/components/ml/mock.ts diff --git a/x-pack/plugins/siem/public/components/ml/permissions/ml_capabilities_provider.tsx b/x-pack/plugins/siem/public/common/components/ml/permissions/ml_capabilities_provider.tsx similarity index 92% rename from x-pack/plugins/siem/public/components/ml/permissions/ml_capabilities_provider.tsx rename to x-pack/plugins/siem/public/common/components/ml/permissions/ml_capabilities_provider.tsx index 9326c53b6064d..1d5c1b36e22af 100644 --- a/x-pack/plugins/siem/public/components/ml/permissions/ml_capabilities_provider.tsx +++ b/x-pack/plugins/siem/public/common/components/ml/permissions/ml_capabilities_provider.tsx @@ -6,8 +6,8 @@ import React, { useState, useEffect } from 'react'; -import { MlCapabilitiesResponse } from '../../../../../ml/public'; -import { emptyMlCapabilities } from '../../../../common/machine_learning/empty_ml_capabilities'; +import { MlCapabilitiesResponse } from '../../../../../../ml/public'; +import { emptyMlCapabilities } from '../../../../../common/machine_learning/empty_ml_capabilities'; import { getMlCapabilities } from '../api/get_ml_capabilities'; import { errorToToaster, useStateToaster } from '../../toasters'; diff --git a/x-pack/plugins/siem/public/components/ml/permissions/translations.ts b/x-pack/plugins/siem/public/common/components/ml/permissions/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/permissions/translations.ts rename to x-pack/plugins/siem/public/common/components/ml/permissions/translations.ts diff --git a/x-pack/plugins/siem/public/components/ml/score/__snapshots__/anomaly_score.test.tsx.snap b/x-pack/plugins/siem/public/common/components/ml/score/__snapshots__/anomaly_score.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/ml/score/__snapshots__/anomaly_score.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/ml/score/__snapshots__/anomaly_score.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/ml/score/__snapshots__/anomaly_scores.test.tsx.snap b/x-pack/plugins/siem/public/common/components/ml/score/__snapshots__/anomaly_scores.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/ml/score/__snapshots__/anomaly_scores.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/ml/score/__snapshots__/anomaly_scores.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/ml/score/__snapshots__/create_descriptions_list.test.tsx.snap b/x-pack/plugins/siem/public/common/components/ml/score/__snapshots__/create_descriptions_list.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/ml/score/__snapshots__/create_descriptions_list.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/ml/score/__snapshots__/create_descriptions_list.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/ml/score/__snapshots__/draggable_score.test.tsx.snap b/x-pack/plugins/siem/public/common/components/ml/score/__snapshots__/draggable_score.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/ml/score/__snapshots__/draggable_score.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/ml/score/__snapshots__/draggable_score.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/ml/score/anomaly_score.test.tsx b/x-pack/plugins/siem/public/common/components/ml/score/anomaly_score.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/ml/score/anomaly_score.test.tsx rename to x-pack/plugins/siem/public/common/components/ml/score/anomaly_score.test.tsx diff --git a/x-pack/plugins/siem/public/components/ml/score/anomaly_score.tsx b/x-pack/plugins/siem/public/common/components/ml/score/anomaly_score.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/ml/score/anomaly_score.tsx rename to x-pack/plugins/siem/public/common/components/ml/score/anomaly_score.tsx diff --git a/x-pack/plugins/siem/public/components/ml/score/anomaly_scores.test.tsx b/x-pack/plugins/siem/public/common/components/ml/score/anomaly_scores.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/ml/score/anomaly_scores.test.tsx rename to x-pack/plugins/siem/public/common/components/ml/score/anomaly_scores.test.tsx diff --git a/x-pack/plugins/siem/public/components/ml/score/anomaly_scores.tsx b/x-pack/plugins/siem/public/common/components/ml/score/anomaly_scores.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/ml/score/anomaly_scores.tsx rename to x-pack/plugins/siem/public/common/components/ml/score/anomaly_scores.tsx diff --git a/x-pack/plugins/siem/public/components/ml/score/create_description_list.tsx b/x-pack/plugins/siem/public/common/components/ml/score/create_description_list.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/ml/score/create_description_list.tsx rename to x-pack/plugins/siem/public/common/components/ml/score/create_description_list.tsx index e7615bf3b89ba..0651bc5874860 100644 --- a/x-pack/plugins/siem/public/components/ml/score/create_description_list.tsx +++ b/x-pack/plugins/siem/public/common/components/ml/score/create_description_list.tsx @@ -8,7 +8,7 @@ import { EuiText, EuiSpacer, EuiFlexGroup, EuiFlexItem, EuiLink } from '@elastic import React from 'react'; import styled from 'styled-components'; -import { DescriptionList } from '../../../../common/utility_types'; +import { DescriptionList } from '../../../../../common/utility_types'; import { Anomaly, NarrowDateRange } from '../types'; import { getScoreString } from './score_health'; import { PreferenceFormattedDate } from '../../formatted_date'; diff --git a/x-pack/plugins/siem/public/components/ml/score/create_descriptions_list.test.tsx b/x-pack/plugins/siem/public/common/components/ml/score/create_descriptions_list.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/ml/score/create_descriptions_list.test.tsx rename to x-pack/plugins/siem/public/common/components/ml/score/create_descriptions_list.test.tsx diff --git a/x-pack/plugins/siem/public/components/ml/score/create_entities_from_score.test.ts b/x-pack/plugins/siem/public/common/components/ml/score/create_entities_from_score.test.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/score/create_entities_from_score.test.ts rename to x-pack/plugins/siem/public/common/components/ml/score/create_entities_from_score.test.ts diff --git a/x-pack/plugins/siem/public/components/ml/score/create_entities_from_score.ts b/x-pack/plugins/siem/public/common/components/ml/score/create_entities_from_score.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/score/create_entities_from_score.ts rename to x-pack/plugins/siem/public/common/components/ml/score/create_entities_from_score.ts diff --git a/x-pack/plugins/siem/public/components/ml/score/draggable_score.test.tsx b/x-pack/plugins/siem/public/common/components/ml/score/draggable_score.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/ml/score/draggable_score.test.tsx rename to x-pack/plugins/siem/public/common/components/ml/score/draggable_score.test.tsx diff --git a/x-pack/plugins/siem/public/components/ml/score/draggable_score.tsx b/x-pack/plugins/siem/public/common/components/ml/score/draggable_score.tsx similarity index 89% rename from x-pack/plugins/siem/public/components/ml/score/draggable_score.tsx rename to x-pack/plugins/siem/public/common/components/ml/score/draggable_score.tsx index 732eaf4bc5e78..c849476f0c3db 100644 --- a/x-pack/plugins/siem/public/components/ml/score/draggable_score.tsx +++ b/x-pack/plugins/siem/public/common/components/ml/score/draggable_score.tsx @@ -7,8 +7,8 @@ import React from 'react'; import { DraggableWrapper, DragEffects } from '../../drag_and_drop/draggable_wrapper'; import { Anomaly } from '../types'; -import { IS_OPERATOR } from '../../timeline/data_providers/data_provider'; -import { Provider } from '../../timeline/data_providers/provider'; +import { IS_OPERATOR } from '../../../../timelines/components/timeline/data_providers/data_provider'; +import { Provider } from '../../../../timelines/components/timeline/data_providers/provider'; import { Spacer } from '../../page'; import { getScoreString } from './score_health'; diff --git a/x-pack/plugins/siem/public/components/ml/score/get_score_string.test.ts b/x-pack/plugins/siem/public/common/components/ml/score/get_score_string.test.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/score/get_score_string.test.ts rename to x-pack/plugins/siem/public/common/components/ml/score/get_score_string.test.ts diff --git a/x-pack/plugins/siem/public/components/ml/score/get_top_severity.test.ts b/x-pack/plugins/siem/public/common/components/ml/score/get_top_severity.test.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/score/get_top_severity.test.ts rename to x-pack/plugins/siem/public/common/components/ml/score/get_top_severity.test.ts diff --git a/x-pack/plugins/siem/public/components/ml/score/get_top_severity.ts b/x-pack/plugins/siem/public/common/components/ml/score/get_top_severity.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/score/get_top_severity.ts rename to x-pack/plugins/siem/public/common/components/ml/score/get_top_severity.ts diff --git a/x-pack/plugins/siem/public/components/ml/score/score_health.tsx b/x-pack/plugins/siem/public/common/components/ml/score/score_health.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/ml/score/score_health.tsx rename to x-pack/plugins/siem/public/common/components/ml/score/score_health.tsx diff --git a/x-pack/plugins/siem/public/components/ml/score/score_interval_to_datetime.test.ts b/x-pack/plugins/siem/public/common/components/ml/score/score_interval_to_datetime.test.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/score/score_interval_to_datetime.test.ts rename to x-pack/plugins/siem/public/common/components/ml/score/score_interval_to_datetime.test.ts diff --git a/x-pack/plugins/siem/public/components/ml/score/score_interval_to_datetime.ts b/x-pack/plugins/siem/public/common/components/ml/score/score_interval_to_datetime.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/score/score_interval_to_datetime.ts rename to x-pack/plugins/siem/public/common/components/ml/score/score_interval_to_datetime.ts diff --git a/x-pack/plugins/siem/public/components/ml/score/translations.ts b/x-pack/plugins/siem/public/common/components/ml/score/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/score/translations.ts rename to x-pack/plugins/siem/public/common/components/ml/score/translations.ts diff --git a/x-pack/plugins/siem/public/components/ml/tables/anomalies_host_table.tsx b/x-pack/plugins/siem/public/common/components/ml/tables/anomalies_host_table.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/ml/tables/anomalies_host_table.tsx rename to x-pack/plugins/siem/public/common/components/ml/tables/anomalies_host_table.tsx index 3272042732dff..d6e343265b6e7 100644 --- a/x-pack/plugins/siem/public/components/ml/tables/anomalies_host_table.tsx +++ b/x-pack/plugins/siem/public/common/components/ml/tables/anomalies_host_table.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { useAnomaliesTableData } from '../anomaly/use_anomalies_table_data'; import { HeaderSection } from '../../header_section'; -import { hasMlUserPermissions } from '../../../../common/machine_learning/has_ml_user_permissions'; +import { hasMlUserPermissions } from '../../../../../common/machine_learning/has_ml_user_permissions'; import * as i18n from './translations'; import { getAnomaliesHostTableColumnsCurated } from './get_anomalies_host_table_columns'; import { convertAnomaliesToHosts } from './convert_anomalies_to_hosts'; diff --git a/x-pack/plugins/siem/public/components/ml/tables/anomalies_network_table.tsx b/x-pack/plugins/siem/public/common/components/ml/tables/anomalies_network_table.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/ml/tables/anomalies_network_table.tsx rename to x-pack/plugins/siem/public/common/components/ml/tables/anomalies_network_table.tsx index cc3b1196f8432..c7a49202bf239 100644 --- a/x-pack/plugins/siem/public/components/ml/tables/anomalies_network_table.tsx +++ b/x-pack/plugins/siem/public/common/components/ml/tables/anomalies_network_table.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { useAnomaliesTableData } from '../anomaly/use_anomalies_table_data'; import { HeaderSection } from '../../header_section'; -import { hasMlUserPermissions } from '../../../../common/machine_learning/has_ml_user_permissions'; +import { hasMlUserPermissions } from '../../../../../common/machine_learning/has_ml_user_permissions'; import * as i18n from './translations'; import { convertAnomaliesToNetwork } from './convert_anomalies_to_network'; import { Loader } from '../../loader'; diff --git a/x-pack/plugins/siem/public/components/ml/tables/basic_table.tsx b/x-pack/plugins/siem/public/common/components/ml/tables/basic_table.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/ml/tables/basic_table.tsx rename to x-pack/plugins/siem/public/common/components/ml/tables/basic_table.tsx diff --git a/x-pack/plugins/siem/public/components/ml/tables/convert_anomalies_to_hosts.test.ts b/x-pack/plugins/siem/public/common/components/ml/tables/convert_anomalies_to_hosts.test.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/tables/convert_anomalies_to_hosts.test.ts rename to x-pack/plugins/siem/public/common/components/ml/tables/convert_anomalies_to_hosts.test.ts diff --git a/x-pack/plugins/siem/public/components/ml/tables/convert_anomalies_to_hosts.ts b/x-pack/plugins/siem/public/common/components/ml/tables/convert_anomalies_to_hosts.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/tables/convert_anomalies_to_hosts.ts rename to x-pack/plugins/siem/public/common/components/ml/tables/convert_anomalies_to_hosts.ts diff --git a/x-pack/plugins/siem/public/components/ml/tables/convert_anomalies_to_network.test.ts b/x-pack/plugins/siem/public/common/components/ml/tables/convert_anomalies_to_network.test.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/tables/convert_anomalies_to_network.test.ts rename to x-pack/plugins/siem/public/common/components/ml/tables/convert_anomalies_to_network.test.ts diff --git a/x-pack/plugins/siem/public/components/ml/tables/convert_anomalies_to_network.ts b/x-pack/plugins/siem/public/common/components/ml/tables/convert_anomalies_to_network.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/tables/convert_anomalies_to_network.ts rename to x-pack/plugins/siem/public/common/components/ml/tables/convert_anomalies_to_network.ts diff --git a/x-pack/plugins/siem/public/components/ml/tables/create_compound_key.test.ts b/x-pack/plugins/siem/public/common/components/ml/tables/create_compound_key.test.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/tables/create_compound_key.test.ts rename to x-pack/plugins/siem/public/common/components/ml/tables/create_compound_key.test.ts diff --git a/x-pack/plugins/siem/public/components/ml/tables/create_compound_key.ts b/x-pack/plugins/siem/public/common/components/ml/tables/create_compound_key.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/tables/create_compound_key.ts rename to x-pack/plugins/siem/public/common/components/ml/tables/create_compound_key.ts diff --git a/x-pack/plugins/siem/public/components/ml/tables/get_anomalies_host_table_columns.test.tsx b/x-pack/plugins/siem/public/common/components/ml/tables/get_anomalies_host_table_columns.test.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/ml/tables/get_anomalies_host_table_columns.test.tsx rename to x-pack/plugins/siem/public/common/components/ml/tables/get_anomalies_host_table_columns.test.tsx index 80980756d2130..ae9133f23c0b2 100644 --- a/x-pack/plugins/siem/public/components/ml/tables/get_anomalies_host_table_columns.test.tsx +++ b/x-pack/plugins/siem/public/common/components/ml/tables/get_anomalies_host_table_columns.test.tsx @@ -5,7 +5,7 @@ */ import { getAnomaliesHostTableColumnsCurated } from './get_anomalies_host_table_columns'; -import { HostsType } from '../../../store/hosts/model'; +import { HostsType } from '../../../../hosts/store/model'; import * as i18n from './translations'; import { AnomaliesByHost, Anomaly } from '../types'; import { Columns } from '../../paginated_table'; diff --git a/x-pack/plugins/siem/public/components/ml/tables/get_anomalies_host_table_columns.tsx b/x-pack/plugins/siem/public/common/components/ml/tables/get_anomalies_host_table_columns.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/ml/tables/get_anomalies_host_table_columns.tsx rename to x-pack/plugins/siem/public/common/components/ml/tables/get_anomalies_host_table_columns.tsx index 4e6484c23613f..4697eb1fbf86e 100644 --- a/x-pack/plugins/siem/public/components/ml/tables/get_anomalies_host_table_columns.tsx +++ b/x-pack/plugins/siem/public/common/components/ml/tables/get_anomalies_host_table_columns.tsx @@ -19,7 +19,7 @@ import * as i18n from './translations'; import { getEntries } from '../get_entries'; import { DraggableScore } from '../score/draggable_score'; import { createExplorerLink } from '../links/create_explorer_link'; -import { HostsType } from '../../../store/hosts/model'; +import { HostsType } from '../../../../hosts/store/model'; import { escapeDataProviderId } from '../../drag_and_drop/helpers'; import { FormattedRelativePreferenceDate } from '../../formatted_date'; diff --git a/x-pack/plugins/siem/public/components/ml/tables/get_anomalies_network_table_columns.test.tsx b/x-pack/plugins/siem/public/common/components/ml/tables/get_anomalies_network_table_columns.test.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/ml/tables/get_anomalies_network_table_columns.test.tsx rename to x-pack/plugins/siem/public/common/components/ml/tables/get_anomalies_network_table_columns.test.tsx index 658444bfeda5c..37cb99b33c793 100644 --- a/x-pack/plugins/siem/public/components/ml/tables/get_anomalies_network_table_columns.test.tsx +++ b/x-pack/plugins/siem/public/common/components/ml/tables/get_anomalies_network_table_columns.test.tsx @@ -5,7 +5,7 @@ */ import { getAnomaliesNetworkTableColumnsCurated } from './get_anomalies_network_table_columns'; -import { NetworkType } from '../../../store/network/model'; +import { NetworkType } from '../../../../network/store/model'; import * as i18n from './translations'; import { AnomaliesByNetwork, Anomaly } from '../types'; import { Columns } from '../../paginated_table'; diff --git a/x-pack/plugins/siem/public/components/ml/tables/get_anomalies_network_table_columns.tsx b/x-pack/plugins/siem/public/common/components/ml/tables/get_anomalies_network_table_columns.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/ml/tables/get_anomalies_network_table_columns.tsx rename to x-pack/plugins/siem/public/common/components/ml/tables/get_anomalies_network_table_columns.tsx index f6a493f80eb78..f09a4d0779ac7 100644 --- a/x-pack/plugins/siem/public/components/ml/tables/get_anomalies_network_table_columns.tsx +++ b/x-pack/plugins/siem/public/common/components/ml/tables/get_anomalies_network_table_columns.tsx @@ -21,9 +21,9 @@ import { getEntries } from '../get_entries'; import { DraggableScore } from '../score/draggable_score'; import { createExplorerLink } from '../links/create_explorer_link'; import { FormattedRelativePreferenceDate } from '../../formatted_date'; -import { NetworkType } from '../../../store/network/model'; +import { NetworkType } from '../../../../network/store/model'; import { escapeDataProviderId } from '../../drag_and_drop/helpers'; -import { FlowTarget } from '../../../graphql/types'; +import { FlowTarget } from '../../../../graphql/types'; export const getAnomaliesNetworkTableColumns = ( startDate: number, diff --git a/x-pack/plugins/siem/public/components/ml/tables/host_equality.test.ts b/x-pack/plugins/siem/public/common/components/ml/tables/host_equality.test.ts similarity index 98% rename from x-pack/plugins/siem/public/components/ml/tables/host_equality.test.ts rename to x-pack/plugins/siem/public/common/components/ml/tables/host_equality.test.ts index c5054d40f94ab..89b87f95e5159 100644 --- a/x-pack/plugins/siem/public/components/ml/tables/host_equality.test.ts +++ b/x-pack/plugins/siem/public/common/components/ml/tables/host_equality.test.ts @@ -6,7 +6,7 @@ import { hostEquality } from './host_equality'; import { AnomaliesHostTableProps } from '../types'; -import { HostsType } from '../../../store/hosts/model'; +import { HostsType } from '../../../../hosts/store/model'; describe('host_equality', () => { test('it returns true if start and end date are equal', () => { diff --git a/x-pack/plugins/siem/public/components/ml/tables/host_equality.ts b/x-pack/plugins/siem/public/common/components/ml/tables/host_equality.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/tables/host_equality.ts rename to x-pack/plugins/siem/public/common/components/ml/tables/host_equality.ts diff --git a/x-pack/plugins/siem/public/components/ml/tables/network_equality.test.ts b/x-pack/plugins/siem/public/common/components/ml/tables/network_equality.test.ts similarity index 97% rename from x-pack/plugins/siem/public/components/ml/tables/network_equality.test.ts rename to x-pack/plugins/siem/public/common/components/ml/tables/network_equality.test.ts index cb053d1a43d2f..8b3e30c329031 100644 --- a/x-pack/plugins/siem/public/components/ml/tables/network_equality.test.ts +++ b/x-pack/plugins/siem/public/common/components/ml/tables/network_equality.test.ts @@ -6,8 +6,8 @@ import { networkEquality } from './network_equality'; import { AnomaliesNetworkTableProps } from '../types'; -import { NetworkType } from '../../../store/network/model'; -import { FlowTarget } from '../../../graphql/types'; +import { NetworkType } from '../../../../network/store/model'; +import { FlowTarget } from '../../../../graphql/types'; describe('network_equality', () => { test('it returns true if start and end date are equal', () => { diff --git a/x-pack/plugins/siem/public/components/ml/tables/network_equality.ts b/x-pack/plugins/siem/public/common/components/ml/tables/network_equality.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/tables/network_equality.ts rename to x-pack/plugins/siem/public/common/components/ml/tables/network_equality.ts diff --git a/x-pack/plugins/siem/public/components/ml/tables/translations.ts b/x-pack/plugins/siem/public/common/components/ml/tables/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/tables/translations.ts rename to x-pack/plugins/siem/public/common/components/ml/tables/translations.ts diff --git a/x-pack/plugins/siem/public/components/ml/types.test.ts b/x-pack/plugins/siem/public/common/components/ml/types.test.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml/types.test.ts rename to x-pack/plugins/siem/public/common/components/ml/types.test.ts diff --git a/x-pack/plugins/siem/public/components/ml/types.ts b/x-pack/plugins/siem/public/common/components/ml/types.ts similarity index 91% rename from x-pack/plugins/siem/public/components/ml/types.ts rename to x-pack/plugins/siem/public/common/components/ml/types.ts index f70c7d3eb034c..13bceaa473a84 100644 --- a/x-pack/plugins/siem/public/components/ml/types.ts +++ b/x-pack/plugins/siem/public/common/components/ml/types.ts @@ -4,11 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ -import { Influencer } from '../../../../ml/public'; +import { Influencer } from '../../../../../ml/public'; -import { HostsType } from '../../store/hosts/model'; -import { NetworkType } from '../../store/network/model'; -import { FlowTarget } from '../../graphql/types'; +import { HostsType } from '../../../hosts/store/model'; +import { NetworkType } from '../../../network/store/model'; +import { FlowTarget } from '../../../graphql/types'; export interface Source { job_id: string; diff --git a/x-pack/plugins/siem/public/components/ml_popover/__mocks__/api.tsx b/x-pack/plugins/siem/public/common/components/ml_popover/__mocks__/api.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/ml_popover/__mocks__/api.tsx rename to x-pack/plugins/siem/public/common/components/ml_popover/__mocks__/api.tsx diff --git a/x-pack/plugins/siem/public/components/ml_popover/__snapshots__/popover_description.test.tsx.snap b/x-pack/plugins/siem/public/common/components/ml_popover/__snapshots__/popover_description.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/ml_popover/__snapshots__/popover_description.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/ml_popover/__snapshots__/popover_description.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/ml_popover/__snapshots__/upgrade_contents.test.tsx.snap b/x-pack/plugins/siem/public/common/components/ml_popover/__snapshots__/upgrade_contents.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/ml_popover/__snapshots__/upgrade_contents.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/ml_popover/__snapshots__/upgrade_contents.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/ml_popover/api.tsx b/x-pack/plugins/siem/public/common/components/ml_popover/api.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/ml_popover/api.tsx rename to x-pack/plugins/siem/public/common/components/ml_popover/api.tsx diff --git a/x-pack/plugins/siem/public/components/ml_popover/helpers.test.tsx b/x-pack/plugins/siem/public/common/components/ml_popover/helpers.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/ml_popover/helpers.test.tsx rename to x-pack/plugins/siem/public/common/components/ml_popover/helpers.test.tsx diff --git a/x-pack/plugins/siem/public/components/ml_popover/helpers.tsx b/x-pack/plugins/siem/public/common/components/ml_popover/helpers.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/ml_popover/helpers.tsx rename to x-pack/plugins/siem/public/common/components/ml_popover/helpers.tsx diff --git a/x-pack/plugins/siem/public/components/ml_popover/hooks/translations.ts b/x-pack/plugins/siem/public/common/components/ml_popover/hooks/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml_popover/hooks/translations.ts rename to x-pack/plugins/siem/public/common/components/ml_popover/hooks/translations.ts diff --git a/x-pack/plugins/siem/public/components/ml_popover/hooks/use_ml_capabilities.tsx b/x-pack/plugins/siem/public/common/components/ml_popover/hooks/use_ml_capabilities.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/ml_popover/hooks/use_ml_capabilities.tsx rename to x-pack/plugins/siem/public/common/components/ml_popover/hooks/use_ml_capabilities.tsx diff --git a/x-pack/plugins/siem/public/components/ml_popover/hooks/use_siem_jobs.tsx b/x-pack/plugins/siem/public/common/components/ml_popover/hooks/use_siem_jobs.tsx similarity index 94% rename from x-pack/plugins/siem/public/components/ml_popover/hooks/use_siem_jobs.tsx rename to x-pack/plugins/siem/public/common/components/ml_popover/hooks/use_siem_jobs.tsx index 98e74208b3dcc..a84d88782926c 100644 --- a/x-pack/plugins/siem/public/components/ml_popover/hooks/use_siem_jobs.tsx +++ b/x-pack/plugins/siem/public/common/components/ml_popover/hooks/use_siem_jobs.tsx @@ -6,10 +6,10 @@ import { useEffect, useState } from 'react'; -import { DEFAULT_INDEX_KEY } from '../../../../common/constants'; +import { DEFAULT_INDEX_KEY } from '../../../../../common/constants'; import { checkRecognizer, getJobsSummary, getModules } from '../api'; import { SiemJob } from '../types'; -import { hasMlUserPermissions } from '../../../../common/machine_learning/has_ml_user_permissions'; +import { hasMlUserPermissions } from '../../../../../common/machine_learning/has_ml_user_permissions'; import { errorToToaster, useStateToaster } from '../../toasters'; import { useUiSetting$ } from '../../../lib/kibana'; diff --git a/x-pack/plugins/siem/public/components/ml_popover/hooks/use_siem_jobs_helpers.test.tsx b/x-pack/plugins/siem/public/common/components/ml_popover/hooks/use_siem_jobs_helpers.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/ml_popover/hooks/use_siem_jobs_helpers.test.tsx rename to x-pack/plugins/siem/public/common/components/ml_popover/hooks/use_siem_jobs_helpers.test.tsx diff --git a/x-pack/plugins/siem/public/components/ml_popover/hooks/use_siem_jobs_helpers.tsx b/x-pack/plugins/siem/public/common/components/ml_popover/hooks/use_siem_jobs_helpers.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/ml_popover/hooks/use_siem_jobs_helpers.tsx rename to x-pack/plugins/siem/public/common/components/ml_popover/hooks/use_siem_jobs_helpers.tsx diff --git a/x-pack/plugins/siem/public/components/ml_popover/jobs_table/__snapshots__/job_switch.test.tsx.snap b/x-pack/plugins/siem/public/common/components/ml_popover/jobs_table/__snapshots__/job_switch.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/ml_popover/jobs_table/__snapshots__/job_switch.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/ml_popover/jobs_table/__snapshots__/job_switch.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/ml_popover/jobs_table/__snapshots__/jobs_table.test.tsx.snap b/x-pack/plugins/siem/public/common/components/ml_popover/jobs_table/__snapshots__/jobs_table.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/ml_popover/jobs_table/__snapshots__/jobs_table.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/ml_popover/jobs_table/__snapshots__/jobs_table.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/ml_popover/jobs_table/__snapshots__/showing_count.test.tsx.snap b/x-pack/plugins/siem/public/common/components/ml_popover/jobs_table/__snapshots__/showing_count.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/ml_popover/jobs_table/__snapshots__/showing_count.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/ml_popover/jobs_table/__snapshots__/showing_count.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/ml_popover/jobs_table/filters/__snapshots__/groups_filter_popover.test.tsx.snap b/x-pack/plugins/siem/public/common/components/ml_popover/jobs_table/filters/__snapshots__/groups_filter_popover.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/ml_popover/jobs_table/filters/__snapshots__/groups_filter_popover.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/ml_popover/jobs_table/filters/__snapshots__/groups_filter_popover.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/ml_popover/jobs_table/filters/__snapshots__/jobs_table_filters.test.tsx.snap b/x-pack/plugins/siem/public/common/components/ml_popover/jobs_table/filters/__snapshots__/jobs_table_filters.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/ml_popover/jobs_table/filters/__snapshots__/jobs_table_filters.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/ml_popover/jobs_table/filters/__snapshots__/jobs_table_filters.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/ml_popover/jobs_table/filters/groups_filter_popover.test.tsx b/x-pack/plugins/siem/public/common/components/ml_popover/jobs_table/filters/groups_filter_popover.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/ml_popover/jobs_table/filters/groups_filter_popover.test.tsx rename to x-pack/plugins/siem/public/common/components/ml_popover/jobs_table/filters/groups_filter_popover.test.tsx diff --git a/x-pack/plugins/siem/public/components/ml_popover/jobs_table/filters/groups_filter_popover.tsx b/x-pack/plugins/siem/public/common/components/ml_popover/jobs_table/filters/groups_filter_popover.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/ml_popover/jobs_table/filters/groups_filter_popover.tsx rename to x-pack/plugins/siem/public/common/components/ml_popover/jobs_table/filters/groups_filter_popover.tsx diff --git a/x-pack/plugins/siem/public/components/ml_popover/jobs_table/filters/jobs_table_filters.test.tsx b/x-pack/plugins/siem/public/common/components/ml_popover/jobs_table/filters/jobs_table_filters.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/ml_popover/jobs_table/filters/jobs_table_filters.test.tsx rename to x-pack/plugins/siem/public/common/components/ml_popover/jobs_table/filters/jobs_table_filters.test.tsx diff --git a/x-pack/plugins/siem/public/components/ml_popover/jobs_table/filters/jobs_table_filters.tsx b/x-pack/plugins/siem/public/common/components/ml_popover/jobs_table/filters/jobs_table_filters.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/ml_popover/jobs_table/filters/jobs_table_filters.tsx rename to x-pack/plugins/siem/public/common/components/ml_popover/jobs_table/filters/jobs_table_filters.tsx index 551ed5f08bd76..8cb35fc689185 100644 --- a/x-pack/plugins/siem/public/components/ml_popover/jobs_table/filters/jobs_table_filters.tsx +++ b/x-pack/plugins/siem/public/common/components/ml_popover/jobs_table/filters/jobs_table_filters.tsx @@ -14,7 +14,7 @@ import { // @ts-ignore no-exported-member EuiSearchBar, } from '@elastic/eui'; -import { EuiSearchBarQuery } from '../../../open_timeline/types'; +import { EuiSearchBarQuery } from '../../../../../timelines/components/open_timeline/types'; import * as i18n from './translations'; import { JobsFilters, SiemJob } from '../../types'; import { GroupsFilterPopover } from './groups_filter_popover'; diff --git a/x-pack/plugins/siem/public/components/ml_popover/jobs_table/filters/toggle_selected_group.test.tsx b/x-pack/plugins/siem/public/common/components/ml_popover/jobs_table/filters/toggle_selected_group.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/ml_popover/jobs_table/filters/toggle_selected_group.test.tsx rename to x-pack/plugins/siem/public/common/components/ml_popover/jobs_table/filters/toggle_selected_group.test.tsx diff --git a/x-pack/plugins/siem/public/components/ml_popover/jobs_table/filters/toggle_selected_group.tsx b/x-pack/plugins/siem/public/common/components/ml_popover/jobs_table/filters/toggle_selected_group.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/ml_popover/jobs_table/filters/toggle_selected_group.tsx rename to x-pack/plugins/siem/public/common/components/ml_popover/jobs_table/filters/toggle_selected_group.tsx diff --git a/x-pack/plugins/siem/public/components/ml_popover/jobs_table/filters/translations.ts b/x-pack/plugins/siem/public/common/components/ml_popover/jobs_table/filters/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml_popover/jobs_table/filters/translations.ts rename to x-pack/plugins/siem/public/common/components/ml_popover/jobs_table/filters/translations.ts diff --git a/x-pack/plugins/siem/public/components/ml_popover/jobs_table/job_switch.test.tsx b/x-pack/plugins/siem/public/common/components/ml_popover/jobs_table/job_switch.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/ml_popover/jobs_table/job_switch.test.tsx rename to x-pack/plugins/siem/public/common/components/ml_popover/jobs_table/job_switch.test.tsx diff --git a/x-pack/plugins/siem/public/components/ml_popover/jobs_table/job_switch.tsx b/x-pack/plugins/siem/public/common/components/ml_popover/jobs_table/job_switch.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/ml_popover/jobs_table/job_switch.tsx rename to x-pack/plugins/siem/public/common/components/ml_popover/jobs_table/job_switch.tsx index 7de2f0fbfbc54..732f5cc062bf1 100644 --- a/x-pack/plugins/siem/public/components/ml_popover/jobs_table/job_switch.tsx +++ b/x-pack/plugins/siem/public/common/components/ml_popover/jobs_table/job_switch.tsx @@ -11,7 +11,7 @@ import { isJobLoading, isJobFailed, isJobStarted, -} from '../../../../common/machine_learning/helpers'; +} from '../../../../../common/machine_learning/helpers'; import { SiemJob } from '../types'; const StaticSwitch = styled(EuiSwitch)` diff --git a/x-pack/plugins/siem/public/components/ml_popover/jobs_table/jobs_table.test.tsx b/x-pack/plugins/siem/public/common/components/ml_popover/jobs_table/jobs_table.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/ml_popover/jobs_table/jobs_table.test.tsx rename to x-pack/plugins/siem/public/common/components/ml_popover/jobs_table/jobs_table.test.tsx diff --git a/x-pack/plugins/siem/public/components/ml_popover/jobs_table/jobs_table.tsx b/x-pack/plugins/siem/public/common/components/ml_popover/jobs_table/jobs_table.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/ml_popover/jobs_table/jobs_table.tsx rename to x-pack/plugins/siem/public/common/components/ml_popover/jobs_table/jobs_table.tsx diff --git a/x-pack/plugins/siem/public/components/ml_popover/jobs_table/showing_count.test.tsx b/x-pack/plugins/siem/public/common/components/ml_popover/jobs_table/showing_count.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/ml_popover/jobs_table/showing_count.test.tsx rename to x-pack/plugins/siem/public/common/components/ml_popover/jobs_table/showing_count.test.tsx diff --git a/x-pack/plugins/siem/public/components/ml_popover/jobs_table/showing_count.tsx b/x-pack/plugins/siem/public/common/components/ml_popover/jobs_table/showing_count.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/ml_popover/jobs_table/showing_count.tsx rename to x-pack/plugins/siem/public/common/components/ml_popover/jobs_table/showing_count.tsx diff --git a/x-pack/plugins/siem/public/components/ml_popover/jobs_table/translations.ts b/x-pack/plugins/siem/public/common/components/ml_popover/jobs_table/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml_popover/jobs_table/translations.ts rename to x-pack/plugins/siem/public/common/components/ml_popover/jobs_table/translations.ts diff --git a/x-pack/plugins/siem/public/components/ml_popover/ml_modules.tsx b/x-pack/plugins/siem/public/common/components/ml_popover/ml_modules.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/ml_popover/ml_modules.tsx rename to x-pack/plugins/siem/public/common/components/ml_popover/ml_modules.tsx diff --git a/x-pack/plugins/siem/public/components/ml_popover/ml_popover.test.tsx b/x-pack/plugins/siem/public/common/components/ml_popover/ml_popover.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/ml_popover/ml_popover.test.tsx rename to x-pack/plugins/siem/public/common/components/ml_popover/ml_popover.test.tsx diff --git a/x-pack/plugins/siem/public/components/ml_popover/ml_popover.tsx b/x-pack/plugins/siem/public/common/components/ml_popover/ml_popover.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/ml_popover/ml_popover.tsx rename to x-pack/plugins/siem/public/common/components/ml_popover/ml_popover.tsx index e7f7770ee87f8..292b5286e9f3e 100644 --- a/x-pack/plugins/siem/public/components/ml_popover/ml_popover.tsx +++ b/x-pack/plugins/siem/public/common/components/ml_popover/ml_popover.tsx @@ -12,7 +12,7 @@ import styled from 'styled-components'; import { useKibana } from '../../lib/kibana'; import { METRIC_TYPE, TELEMETRY_EVENT, track } from '../../lib/telemetry'; -import { hasMlAdminPermissions } from '../../../common/machine_learning/has_ml_admin_permissions'; +import { hasMlAdminPermissions } from '../../../../common/machine_learning/has_ml_admin_permissions'; import { errorToToaster, useStateToaster, ActionToaster } from '../toasters'; import { setupMlJob, startDatafeeds, stopDatafeeds } from './api'; import { filterJobs } from './helpers'; diff --git a/x-pack/plugins/siem/public/components/ml_popover/popover_description.test.tsx b/x-pack/plugins/siem/public/common/components/ml_popover/popover_description.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/ml_popover/popover_description.test.tsx rename to x-pack/plugins/siem/public/common/components/ml_popover/popover_description.test.tsx diff --git a/x-pack/plugins/siem/public/components/ml_popover/popover_description.tsx b/x-pack/plugins/siem/public/common/components/ml_popover/popover_description.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/ml_popover/popover_description.tsx rename to x-pack/plugins/siem/public/common/components/ml_popover/popover_description.tsx diff --git a/x-pack/plugins/siem/public/components/ml_popover/translations.ts b/x-pack/plugins/siem/public/common/components/ml_popover/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ml_popover/translations.ts rename to x-pack/plugins/siem/public/common/components/ml_popover/translations.ts diff --git a/x-pack/plugins/siem/public/components/ml_popover/types.ts b/x-pack/plugins/siem/public/common/components/ml_popover/types.ts similarity index 98% rename from x-pack/plugins/siem/public/components/ml_popover/types.ts rename to x-pack/plugins/siem/public/common/components/ml_popover/types.ts index 005f93650a8eb..f39daa0b9a7fb 100644 --- a/x-pack/plugins/siem/public/components/ml_popover/types.ts +++ b/x-pack/plugins/siem/public/common/components/ml_popover/types.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { AuditMessageBase } from '../../../../ml/public'; +import { AuditMessageBase } from '../../../../../ml/public'; import { MlError } from '../ml/types'; export interface Group { diff --git a/x-pack/plugins/siem/public/components/ml_popover/upgrade_contents.test.tsx b/x-pack/plugins/siem/public/common/components/ml_popover/upgrade_contents.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/ml_popover/upgrade_contents.test.tsx rename to x-pack/plugins/siem/public/common/components/ml_popover/upgrade_contents.test.tsx diff --git a/x-pack/plugins/siem/public/components/ml_popover/upgrade_contents.tsx b/x-pack/plugins/siem/public/common/components/ml_popover/upgrade_contents.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/ml_popover/upgrade_contents.tsx rename to x-pack/plugins/siem/public/common/components/ml_popover/upgrade_contents.tsx diff --git a/x-pack/plugins/siem/public/components/navigation/breadcrumbs/index.test.ts b/x-pack/plugins/siem/public/common/components/navigation/breadcrumbs/index.test.ts similarity index 98% rename from x-pack/plugins/siem/public/components/navigation/breadcrumbs/index.test.ts rename to x-pack/plugins/siem/public/common/components/navigation/breadcrumbs/index.test.ts index 2acae92c390dd..9ec2542c52db2 100644 --- a/x-pack/plugins/siem/public/components/navigation/breadcrumbs/index.test.ts +++ b/x-pack/plugins/siem/public/common/components/navigation/breadcrumbs/index.test.ts @@ -7,10 +7,10 @@ import '../../../mock/match_media'; import { encodeIpv6 } from '../../../lib/helpers'; import { getBreadcrumbsForRoute, setBreadcrumbs } from '.'; -import { HostsTableType } from '../../../store/hosts/model'; +import { HostsTableType } from '../../../../hosts/store/model'; import { RouteSpyState, SiemRouteType } from '../../../utils/route/types'; import { TabNavigationProps } from '../tab_navigation/types'; -import { NetworkRouteType } from '../../../pages/network/navigation/types'; +import { NetworkRouteType } from '../../../../network/pages/navigation/types'; const setBreadcrumbsMock = jest.fn(); const chromeMock = { diff --git a/x-pack/plugins/siem/public/components/navigation/breadcrumbs/index.ts b/x-pack/plugins/siem/public/common/components/navigation/breadcrumbs/index.ts similarity index 91% rename from x-pack/plugins/siem/public/components/navigation/breadcrumbs/index.ts rename to x-pack/plugins/siem/public/common/components/navigation/breadcrumbs/index.ts index 8abc099ee7f69..16ae1b1e096ca 100644 --- a/x-pack/plugins/siem/public/components/navigation/breadcrumbs/index.ts +++ b/x-pack/plugins/siem/public/common/components/navigation/breadcrumbs/index.ts @@ -6,15 +6,16 @@ import { getOr, omit } from 'lodash/fp'; -import { ChromeBreadcrumb } from '../../../../../../../src/core/public'; -import { APP_NAME } from '../../../../common/constants'; -import { StartServices } from '../../../plugin'; -import { getBreadcrumbs as getHostDetailsBreadcrumbs } from '../../../pages/hosts/details/utils'; -import { getBreadcrumbs as getIPDetailsBreadcrumbs } from '../../../pages/network/ip_details'; -import { getBreadcrumbs as getCaseDetailsBreadcrumbs } from '../../../pages/case/utils'; -import { getBreadcrumbs as getDetectionRulesBreadcrumbs } from '../../../pages/detection_engine/rules/utils'; -import { getBreadcrumbs as getTimelinesBreadcrumbs } from '../../../pages/timelines'; -import { SiemPageName } from '../../../pages/home/types'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { ChromeBreadcrumb } from '../../../../../../../../src/core/public'; +import { APP_NAME } from '../../../../../common/constants'; +import { StartServices } from '../../../../plugin'; +import { getBreadcrumbs as getHostDetailsBreadcrumbs } from '../../../../hosts/pages/details/utils'; +import { getBreadcrumbs as getIPDetailsBreadcrumbs } from '../../../../network/pages/ip_details'; +import { getBreadcrumbs as getCaseDetailsBreadcrumbs } from '../../../../cases/pages/utils'; +import { getBreadcrumbs as getDetectionRulesBreadcrumbs } from '../../../../alerts/pages/detection_engine/rules/utils'; +import { getBreadcrumbs as getTimelinesBreadcrumbs } from '../../../../timelines/pages'; +import { SiemPageName } from '../../../../app/types'; import { RouteSpyState, HostRouteSpyState, diff --git a/x-pack/plugins/siem/public/components/navigation/helpers.ts b/x-pack/plugins/siem/public/common/components/navigation/helpers.ts similarity index 93% rename from x-pack/plugins/siem/public/components/navigation/helpers.ts rename to x-pack/plugins/siem/public/common/components/navigation/helpers.ts index 291cb90098f78..8f5a3ac63fa1a 100644 --- a/x-pack/plugins/siem/public/components/navigation/helpers.ts +++ b/x-pack/plugins/siem/public/common/components/navigation/helpers.ts @@ -8,7 +8,7 @@ import { isEmpty } from 'lodash/fp'; import { Location } from 'history'; import { UrlInputsModel } from '../../store/inputs/model'; -import { TimelineUrl } from '../../store/timeline/model'; +import { TimelineUrl } from '../../../timelines/store/timeline/model'; import { CONSTANTS } from '../url_state/constants'; import { URL_STATE_KEYS, KeyUrlState, UrlState } from '../url_state/types'; import { @@ -16,7 +16,7 @@ import { replaceStateKeyInQueryString, getQueryStringFromLocation, } from '../url_state/helpers'; -import { Query, Filter } from '../../../../../../src/plugins/data/public'; +import { Query, Filter } from '../../../../../../../src/plugins/data/public'; import { SearchNavTab } from './types'; diff --git a/x-pack/plugins/siem/public/components/navigation/index.test.tsx b/x-pack/plugins/siem/public/common/components/navigation/index.test.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/navigation/index.test.tsx rename to x-pack/plugins/siem/public/common/components/navigation/index.test.tsx index d8b62029138c8..ff3f9ba0694a9 100644 --- a/x-pack/plugins/siem/public/components/navigation/index.test.tsx +++ b/x-pack/plugins/siem/public/common/components/navigation/index.test.tsx @@ -10,8 +10,8 @@ import React from 'react'; import { CONSTANTS } from '../url_state/constants'; import { SiemNavigationComponent } from './'; import { setBreadcrumbs } from './breadcrumbs'; -import { navTabs } from '../../pages/home/home_navigations'; -import { HostsTableType } from '../../store/hosts/model'; +import { navTabs } from '../../../app/home/home_navigations'; +import { HostsTableType } from '../../../hosts/store/model'; import { RouteSpyState } from '../../utils/route/types'; import { SiemNavigationProps, SiemNavigationComponentProps } from './types'; diff --git a/x-pack/plugins/siem/public/components/navigation/index.tsx b/x-pack/plugins/siem/public/common/components/navigation/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/navigation/index.tsx rename to x-pack/plugins/siem/public/common/components/navigation/index.tsx diff --git a/x-pack/plugins/siem/public/components/navigation/tab_navigation/index.test.tsx b/x-pack/plugins/siem/public/common/components/navigation/tab_navigation/index.test.tsx similarity index 95% rename from x-pack/plugins/siem/public/components/navigation/tab_navigation/index.test.tsx rename to x-pack/plugins/siem/public/common/components/navigation/tab_navigation/index.test.tsx index 99ded06cfdcc8..b9572caece94f 100644 --- a/x-pack/plugins/siem/public/components/navigation/tab_navigation/index.test.tsx +++ b/x-pack/plugins/siem/public/common/components/navigation/tab_navigation/index.test.tsx @@ -7,10 +7,10 @@ import { mount } from 'enzyme'; import React from 'react'; -import { navTabs } from '../../../pages/home/home_navigations'; -import { SiemPageName } from '../../../pages/home/types'; -import { navTabsHostDetails } from '../../../pages/hosts/details/nav_tabs'; -import { HostsTableType } from '../../../store/hosts/model'; +import { navTabs } from '../../../../app/home/home_navigations'; +import { SiemPageName } from '../../../../app/types'; +import { navTabsHostDetails } from '../../../../hosts/pages/details/nav_tabs'; +import { HostsTableType } from '../../../../hosts/store/model'; import { RouteSpyState } from '../../../utils/route/types'; import { CONSTANTS } from '../../url_state/constants'; import { TabNavigationComponent } from './'; diff --git a/x-pack/plugins/siem/public/components/navigation/tab_navigation/index.tsx b/x-pack/plugins/siem/public/common/components/navigation/tab_navigation/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/navigation/tab_navigation/index.tsx rename to x-pack/plugins/siem/public/common/components/navigation/tab_navigation/index.tsx diff --git a/x-pack/plugins/siem/public/components/navigation/tab_navigation/types.ts b/x-pack/plugins/siem/public/common/components/navigation/tab_navigation/types.ts similarity index 80% rename from x-pack/plugins/siem/public/components/navigation/tab_navigation/types.ts rename to x-pack/plugins/siem/public/common/components/navigation/tab_navigation/types.ts index 2e2dea09f8c38..a283691cfe0df 100644 --- a/x-pack/plugins/siem/public/components/navigation/tab_navigation/types.ts +++ b/x-pack/plugins/siem/public/common/components/navigation/tab_navigation/types.ts @@ -6,9 +6,9 @@ import { UrlInputsModel } from '../../../store/inputs/model'; import { CONSTANTS } from '../../url_state/constants'; -import { HostsTableType } from '../../../store/hosts/model'; -import { TimelineUrl } from '../../../store/timeline/model'; -import { Filter, Query } from '../../../../../../../src/plugins/data/public'; +import { HostsTableType } from '../../../../hosts/store/model'; +import { TimelineUrl } from '../../../../timelines/store/timeline/model'; +import { Filter, Query } from '../../../../../../../../src/plugins/data/public'; import { SiemNavigationProps } from '../types'; diff --git a/x-pack/plugins/siem/public/components/navigation/types.ts b/x-pack/plugins/siem/public/common/components/navigation/types.ts similarity index 83% rename from x-pack/plugins/siem/public/components/navigation/types.ts rename to x-pack/plugins/siem/public/common/components/navigation/types.ts index e8a2865938062..f0256813c29e7 100644 --- a/x-pack/plugins/siem/public/components/navigation/types.ts +++ b/x-pack/plugins/siem/public/common/components/navigation/types.ts @@ -4,10 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ -import { Filter, Query } from '../../../../../../src/plugins/data/public'; -import { HostsTableType } from '../../store/hosts/model'; +import { Filter, Query } from '../../../../../../../src/plugins/data/public'; +import { HostsTableType } from '../../../hosts/store/model'; import { UrlInputsModel } from '../../store/inputs/model'; -import { TimelineUrl } from '../../store/timeline/model'; +import { TimelineUrl } from '../../../timelines/store/timeline/model'; import { CONSTANTS, UrlStateType } from '../url_state/constants'; export interface SiemNavigationProps { diff --git a/x-pack/plugins/siem/public/components/navigation/use_get_url_search.tsx b/x-pack/plugins/siem/public/common/components/navigation/use_get_url_search.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/navigation/use_get_url_search.tsx rename to x-pack/plugins/siem/public/common/components/navigation/use_get_url_search.tsx diff --git a/x-pack/plugins/siem/public/components/news_feed/helpers.test.ts b/x-pack/plugins/siem/public/common/components/news_feed/helpers.test.ts similarity index 99% rename from x-pack/plugins/siem/public/components/news_feed/helpers.test.ts rename to x-pack/plugins/siem/public/common/components/news_feed/helpers.test.ts index 96bd9b08bf8bf..cdd04b50a6d50 100644 --- a/x-pack/plugins/siem/public/components/news_feed/helpers.test.ts +++ b/x-pack/plugins/siem/public/common/components/news_feed/helpers.test.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { NEWS_FEED_URL_SETTING_DEFAULT } from '../../../common/constants'; +import { NEWS_FEED_URL_SETTING_DEFAULT } from '../../../../common/constants'; import { KibanaServices } from '../../lib/kibana'; import { rawNewsApiResponse } from '../../mock/news'; import { rawNewsJSON } from '../../mock/raw_news'; diff --git a/x-pack/plugins/siem/public/components/news_feed/helpers.ts b/x-pack/plugins/siem/public/common/components/news_feed/helpers.ts similarity index 100% rename from x-pack/plugins/siem/public/components/news_feed/helpers.ts rename to x-pack/plugins/siem/public/common/components/news_feed/helpers.ts diff --git a/x-pack/plugins/siem/public/components/news_feed/index.tsx b/x-pack/plugins/siem/public/common/components/news_feed/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/news_feed/index.tsx rename to x-pack/plugins/siem/public/common/components/news_feed/index.tsx diff --git a/x-pack/plugins/siem/public/components/news_feed/news_feed.tsx b/x-pack/plugins/siem/public/common/components/news_feed/news_feed.tsx similarity index 86% rename from x-pack/plugins/siem/public/components/news_feed/news_feed.tsx rename to x-pack/plugins/siem/public/common/components/news_feed/news_feed.tsx index cd356212b4400..523273d1caf2e 100644 --- a/x-pack/plugins/siem/public/components/news_feed/news_feed.tsx +++ b/x-pack/plugins/siem/public/common/components/news_feed/news_feed.tsx @@ -6,8 +6,8 @@ import React from 'react'; -import { LoadingPlaceholders } from '../page/overview/loading_placeholders'; -import { NEWS_FEED_TITLE } from '../../pages/overview/translations'; +import { LoadingPlaceholders } from '../../../overview/components/loading_placeholders'; +import { NEWS_FEED_TITLE } from '../../../overview/pages/translations'; import { SidebarHeader } from '../sidebar_header'; import { NoNews } from './no_news'; diff --git a/x-pack/plugins/siem/public/components/news_feed/news_link/index.tsx b/x-pack/plugins/siem/public/common/components/news_feed/news_link/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/news_feed/news_link/index.tsx rename to x-pack/plugins/siem/public/common/components/news_feed/news_link/index.tsx diff --git a/x-pack/plugins/siem/public/components/news_feed/no_news/index.tsx b/x-pack/plugins/siem/public/common/components/news_feed/no_news/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/news_feed/no_news/index.tsx rename to x-pack/plugins/siem/public/common/components/news_feed/no_news/index.tsx diff --git a/x-pack/plugins/siem/public/components/news_feed/post/index.tsx b/x-pack/plugins/siem/public/common/components/news_feed/post/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/news_feed/post/index.tsx rename to x-pack/plugins/siem/public/common/components/news_feed/post/index.tsx diff --git a/x-pack/plugins/siem/public/components/news_feed/translations.ts b/x-pack/plugins/siem/public/common/components/news_feed/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/news_feed/translations.ts rename to x-pack/plugins/siem/public/common/components/news_feed/translations.ts diff --git a/x-pack/plugins/siem/public/components/news_feed/types.ts b/x-pack/plugins/siem/public/common/components/news_feed/types.ts similarity index 100% rename from x-pack/plugins/siem/public/components/news_feed/types.ts rename to x-pack/plugins/siem/public/common/components/news_feed/types.ts diff --git a/x-pack/plugins/siem/public/components/page/index.tsx b/x-pack/plugins/siem/public/common/components/page/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/page/index.tsx rename to x-pack/plugins/siem/public/common/components/page/index.tsx diff --git a/x-pack/plugins/siem/public/components/page/manage_query.tsx b/x-pack/plugins/siem/public/common/components/page/manage_query.tsx similarity index 95% rename from x-pack/plugins/siem/public/components/page/manage_query.tsx rename to x-pack/plugins/siem/public/common/components/page/manage_query.tsx index 3b723c66f5af5..9e78f704b0f05 100644 --- a/x-pack/plugins/siem/public/components/page/manage_query.tsx +++ b/x-pack/plugins/siem/public/common/components/page/manage_query.tsx @@ -9,7 +9,7 @@ import { omit } from 'lodash/fp'; import React from 'react'; import { inputsModel } from '../../store'; -import { SetQuery } from '../../pages/hosts/navigation/types'; +import { SetQuery } from '../../../hosts/pages/navigation/types'; interface OwnProps { deleteQuery?: ({ id }: { id: string }) => void; diff --git a/x-pack/plugins/siem/public/components/page/translations.ts b/x-pack/plugins/siem/public/common/components/page/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/page/translations.ts rename to x-pack/plugins/siem/public/common/components/page/translations.ts diff --git a/x-pack/plugins/siem/public/components/page_route/index.tsx b/x-pack/plugins/siem/public/common/components/page_route/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/page_route/index.tsx rename to x-pack/plugins/siem/public/common/components/page_route/index.tsx diff --git a/x-pack/plugins/siem/public/components/page_route/pageroute.test.tsx b/x-pack/plugins/siem/public/common/components/page_route/pageroute.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/page_route/pageroute.test.tsx rename to x-pack/plugins/siem/public/common/components/page_route/pageroute.test.tsx diff --git a/x-pack/plugins/siem/public/components/page_route/pageroute.tsx b/x-pack/plugins/siem/public/common/components/page_route/pageroute.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/page_route/pageroute.tsx rename to x-pack/plugins/siem/public/common/components/page_route/pageroute.tsx diff --git a/x-pack/plugins/siem/public/components/paginated_table/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/common/components/paginated_table/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/paginated_table/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/paginated_table/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/paginated_table/helpers.test.ts b/x-pack/plugins/siem/public/common/components/paginated_table/helpers.test.ts similarity index 100% rename from x-pack/plugins/siem/public/components/paginated_table/helpers.test.ts rename to x-pack/plugins/siem/public/common/components/paginated_table/helpers.test.ts diff --git a/x-pack/plugins/siem/public/components/paginated_table/helpers.ts b/x-pack/plugins/siem/public/common/components/paginated_table/helpers.ts similarity index 89% rename from x-pack/plugins/siem/public/components/paginated_table/helpers.ts rename to x-pack/plugins/siem/public/common/components/paginated_table/helpers.ts index c63b8699e79ee..8fde81adc922a 100644 --- a/x-pack/plugins/siem/public/components/paginated_table/helpers.ts +++ b/x-pack/plugins/siem/public/common/components/paginated_table/helpers.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { PaginationInputPaginated } from '../../graphql/types'; +import { PaginationInputPaginated } from '../../../graphql/types'; export const generateTablePaginationOptions = ( activePage: number, diff --git a/x-pack/plugins/siem/public/components/paginated_table/index.mock.tsx b/x-pack/plugins/siem/public/common/components/paginated_table/index.mock.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/paginated_table/index.mock.tsx rename to x-pack/plugins/siem/public/common/components/paginated_table/index.mock.tsx diff --git a/x-pack/plugins/siem/public/components/paginated_table/index.test.tsx b/x-pack/plugins/siem/public/common/components/paginated_table/index.test.tsx similarity index 99% rename from x-pack/plugins/siem/public/components/paginated_table/index.test.tsx rename to x-pack/plugins/siem/public/common/components/paginated_table/index.test.tsx index 94dac6607ce21..108ae19b5a2b4 100644 --- a/x-pack/plugins/siem/public/components/paginated_table/index.test.tsx +++ b/x-pack/plugins/siem/public/common/components/paginated_table/index.test.tsx @@ -7,8 +7,8 @@ import { mount, shallow } from 'enzyme'; import React from 'react'; -import { DEFAULT_MAX_TABLE_QUERY_SIZE } from '../../../common/constants'; -import { Direction } from '../../graphql/types'; +import { DEFAULT_MAX_TABLE_QUERY_SIZE } from '../../../../common/constants'; +import { Direction } from '../../../graphql/types'; import { BasicTableProps, PaginatedTable } from './index'; import { getHostsColumns, mockData, rowItems, sortedHosts } from './index.mock'; diff --git a/x-pack/plugins/siem/public/components/paginated_table/index.tsx b/x-pack/plugins/siem/public/common/components/paginated_table/index.tsx similarity index 91% rename from x-pack/plugins/siem/public/components/paginated_table/index.tsx rename to x-pack/plugins/siem/public/common/components/paginated_table/index.tsx index a815ecd100518..3b3130af77cfd 100644 --- a/x-pack/plugins/siem/public/components/paginated_table/index.tsx +++ b/x-pack/plugins/siem/public/common/components/paginated_table/index.tsx @@ -22,22 +22,22 @@ import { noop } from 'lodash/fp'; import React, { FC, memo, useState, useEffect, ComponentType } from 'react'; import styled from 'styled-components'; -import { DEFAULT_MAX_TABLE_QUERY_SIZE } from '../../../common/constants'; -import { AuthTableColumns } from '../page/hosts/authentications_table'; -import { HostsTableColumns } from '../page/hosts/hosts_table'; -import { NetworkDnsColumns } from '../page/network/network_dns_table/columns'; -import { NetworkHttpColumns } from '../page/network/network_http_table/columns'; +import { DEFAULT_MAX_TABLE_QUERY_SIZE } from '../../../../common/constants'; +import { AuthTableColumns } from '../../../hosts/components/authentications_table'; +import { HostsTableColumns } from '../../../hosts/components/hosts_table'; +import { NetworkDnsColumns } from '../../../network/components/network_dns_table/columns'; +import { NetworkHttpColumns } from '../../../network/components/network_http_table/columns'; import { NetworkTopNFlowColumns, NetworkTopNFlowColumnsIpDetails, -} from '../page/network/network_top_n_flow_table/columns'; +} from '../../../network/components/network_top_n_flow_table/columns'; import { NetworkTopCountriesColumns, NetworkTopCountriesColumnsIpDetails, -} from '../page/network/network_top_countries_table/columns'; -import { TlsColumns } from '../page/network/tls_table/columns'; -import { UncommonProcessTableColumns } from '../page/hosts/uncommon_process_table'; -import { UsersColumns } from '../page/network/users_table/columns'; +} from '../../../network/components/network_top_countries_table/columns'; +import { TlsColumns } from '../../../network/components/tls_table/columns'; +import { UncommonProcessTableColumns } from '../../../hosts/components/uncommon_process_table'; +import { UsersColumns } from '../../../network/components/users_table/columns'; import { HeaderSection } from '../header_section'; import { Loader } from '../loader'; import { useStateToaster } from '../toasters'; diff --git a/x-pack/plugins/siem/public/components/paginated_table/translations.ts b/x-pack/plugins/siem/public/common/components/paginated_table/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/paginated_table/translations.ts rename to x-pack/plugins/siem/public/common/components/paginated_table/translations.ts diff --git a/x-pack/plugins/siem/public/components/panel/index.test.tsx b/x-pack/plugins/siem/public/common/components/panel/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/panel/index.test.tsx rename to x-pack/plugins/siem/public/common/components/panel/index.test.tsx diff --git a/x-pack/plugins/siem/public/components/panel/index.tsx b/x-pack/plugins/siem/public/common/components/panel/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/panel/index.tsx rename to x-pack/plugins/siem/public/common/components/panel/index.tsx diff --git a/x-pack/plugins/siem/public/components/progress_inline/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/common/components/progress_inline/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/progress_inline/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/progress_inline/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/progress_inline/index.test.tsx b/x-pack/plugins/siem/public/common/components/progress_inline/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/progress_inline/index.test.tsx rename to x-pack/plugins/siem/public/common/components/progress_inline/index.test.tsx diff --git a/x-pack/plugins/siem/public/components/progress_inline/index.tsx b/x-pack/plugins/siem/public/common/components/progress_inline/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/progress_inline/index.tsx rename to x-pack/plugins/siem/public/common/components/progress_inline/index.tsx diff --git a/x-pack/plugins/siem/public/components/query_bar/index.test.tsx b/x-pack/plugins/siem/public/common/components/query_bar/index.test.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/query_bar/index.test.tsx rename to x-pack/plugins/siem/public/common/components/query_bar/index.test.tsx index e27669b2b15be..74c07640b8328 100644 --- a/x-pack/plugins/siem/public/components/query_bar/index.test.tsx +++ b/x-pack/plugins/siem/public/common/components/query_bar/index.test.tsx @@ -7,10 +7,10 @@ import { mount } from 'enzyme'; import React from 'react'; -import { DEFAULT_FROM, DEFAULT_TO } from '../../../common/constants'; +import { DEFAULT_FROM, DEFAULT_TO } from '../../../../common/constants'; import { TestProviders, mockIndexPattern } from '../../mock'; import { createKibanaCoreStartMock } from '../../mock/kibana_core'; -import { FilterManager, SearchBar } from '../../../../../../src/plugins/data/public'; +import { FilterManager, SearchBar } from '../../../../../../../src/plugins/data/public'; import { QueryBar, QueryBarComponentProps } from '.'; import { createKibanaContextProviderMock } from '../../mock/kibana_react'; diff --git a/x-pack/plugins/siem/public/components/query_bar/index.tsx b/x-pack/plugins/siem/public/common/components/query_bar/index.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/query_bar/index.tsx rename to x-pack/plugins/siem/public/common/components/query_bar/index.tsx index 1ad7bc16b901e..557d389aefee9 100644 --- a/x-pack/plugins/siem/public/components/query_bar/index.tsx +++ b/x-pack/plugins/siem/public/common/components/query_bar/index.tsx @@ -17,8 +17,8 @@ import { SavedQuery, SearchBar, SavedQueryTimeFilter, -} from '../../../../../../src/plugins/data/public'; -import { Storage } from '../../../../../../src/plugins/kibana_utils/public'; +} from '../../../../../../../src/plugins/data/public'; +import { Storage } from '../../../../../../../src/plugins/kibana_utils/public'; export interface QueryBarComponentProps { dataTestSubj?: string; diff --git a/x-pack/plugins/siem/public/components/scroll_to_top/index.test.tsx b/x-pack/plugins/siem/public/common/components/scroll_to_top/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/scroll_to_top/index.test.tsx rename to x-pack/plugins/siem/public/common/components/scroll_to_top/index.test.tsx diff --git a/x-pack/plugins/siem/public/components/scroll_to_top/index.tsx b/x-pack/plugins/siem/public/common/components/scroll_to_top/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/scroll_to_top/index.tsx rename to x-pack/plugins/siem/public/common/components/scroll_to_top/index.tsx diff --git a/x-pack/plugins/siem/public/components/search_bar/index.tsx b/x-pack/plugins/siem/public/common/components/search_bar/index.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/search_bar/index.tsx rename to x-pack/plugins/siem/public/common/components/search_bar/index.tsx index 4dd1b114ccff3..995955cff54f5 100644 --- a/x-pack/plugins/siem/public/components/search_bar/index.tsx +++ b/x-pack/plugins/siem/public/common/components/search_bar/index.tsx @@ -38,7 +38,9 @@ import { startSelector, toStrSelector, } from './selectors'; -import { timelineActions, hostsActions, networkActions } from '../../store/actions'; +import { hostsActions } from '../../../hosts/store'; +import { networkActions } from '../../../network/store'; +import { timelineActions } from '../../../timelines/store/timeline'; import { useKibana } from '../../lib/kibana'; interface SiemSearchBarProps { diff --git a/x-pack/plugins/siem/public/components/search_bar/selectors.ts b/x-pack/plugins/siem/public/common/components/search_bar/selectors.ts similarity index 91% rename from x-pack/plugins/siem/public/components/search_bar/selectors.ts rename to x-pack/plugins/siem/public/common/components/search_bar/selectors.ts index 4e700a46ca0e2..793737a1ad754 100644 --- a/x-pack/plugins/siem/public/components/search_bar/selectors.ts +++ b/x-pack/plugins/siem/public/common/components/search_bar/selectors.ts @@ -6,7 +6,7 @@ import { createSelector } from 'reselect'; import { InputsRange } from '../../store/inputs/model'; -import { Query, SavedQuery } from '../../../../../../src/plugins/data/public'; +import { Query, SavedQuery } from '../../../../../../../src/plugins/data/public'; export { endSelector, diff --git a/x-pack/plugins/siem/public/components/selectable_text/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/common/components/selectable_text/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/selectable_text/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/selectable_text/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/selectable_text/index.test.tsx b/x-pack/plugins/siem/public/common/components/selectable_text/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/selectable_text/index.test.tsx rename to x-pack/plugins/siem/public/common/components/selectable_text/index.test.tsx diff --git a/x-pack/plugins/siem/public/components/selectable_text/index.tsx b/x-pack/plugins/siem/public/common/components/selectable_text/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/selectable_text/index.tsx rename to x-pack/plugins/siem/public/common/components/selectable_text/index.tsx diff --git a/x-pack/plugins/siem/public/components/sidebar_header/index.tsx b/x-pack/plugins/siem/public/common/components/sidebar_header/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/sidebar_header/index.tsx rename to x-pack/plugins/siem/public/common/components/sidebar_header/index.tsx diff --git a/x-pack/plugins/siem/public/components/stat_items/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/common/components/stat_items/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/stat_items/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/stat_items/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/stat_items/index.test.tsx b/x-pack/plugins/siem/public/common/components/stat_items/index.test.tsx similarity index 95% rename from x-pack/plugins/siem/public/components/stat_items/index.test.tsx rename to x-pack/plugins/siem/public/common/components/stat_items/index.test.tsx index 95ef747bc429a..e0da50abf6b53 100644 --- a/x-pack/plugins/siem/public/components/stat_items/index.test.tsx +++ b/x-pack/plugins/siem/public/common/components/stat_items/index.test.tsx @@ -23,17 +23,17 @@ import { import { BarChart } from '../charts/barchart'; import { AreaChart } from '../charts/areachart'; import { EuiHorizontalRule } from '@elastic/eui'; -import { fieldTitleChartMapping } from '../page/network/kpi_network'; +import { fieldTitleChartMapping } from '../../../network/components/kpi_network'; import { mockData, mockEnableChartsData, mockNoChartMappings, mockNarrowDateRange, -} from '../page/network/kpi_network/mock'; -import { mockGlobalState, apolloClientObservable } from '../../mock'; +} from '../../../network/components/kpi_network/mock'; +import { mockGlobalState, apolloClientObservable, SUB_PLUGINS_REDUCER } from '../../mock'; import { State, createStore } from '../../store'; import { Provider as ReduxStoreProvider } from 'react-redux'; -import { KpiNetworkData, KpiHostsData } from '../../graphql/types'; +import { KpiNetworkData, KpiHostsData } from '../../../graphql/types'; const from = new Date('2019-06-15T06:00:00.000Z').valueOf(); const to = new Date('2019-06-18T06:00:00.000Z').valueOf(); @@ -49,7 +49,7 @@ jest.mock('../charts/barchart', () => { describe('Stat Items Component', () => { const theme = () => ({ eui: euiDarkVars, darkMode: true }); const state: State = mockGlobalState; - const store = createStore(state, apolloClientObservable); + const store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); describe.each([ [ diff --git a/x-pack/plugins/siem/public/components/stat_items/index.tsx b/x-pack/plugins/siem/public/common/components/stat_items/index.tsx similarity index 99% rename from x-pack/plugins/siem/public/components/stat_items/index.tsx rename to x-pack/plugins/siem/public/common/components/stat_items/index.tsx index 3ebcba0a85a40..b2543f70e9401 100644 --- a/x-pack/plugins/siem/public/components/stat_items/index.tsx +++ b/x-pack/plugins/siem/public/common/components/stat_items/index.tsx @@ -18,7 +18,7 @@ import { get, getOr } from 'lodash/fp'; import React, { useState, useEffect } from 'react'; import styled from 'styled-components'; -import { KpiHostsData, KpiNetworkData } from '../../graphql/types'; +import { KpiHostsData, KpiNetworkData } from '../../../graphql/types'; import { AreaChart } from '../charts/areachart'; import { BarChart } from '../charts/barchart'; import { ChartSeriesData, ChartData, ChartSeriesConfigs, UpdateDateRange } from '../charts/common'; diff --git a/x-pack/plugins/siem/public/components/subtitle/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/common/components/subtitle/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/subtitle/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/subtitle/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/subtitle/index.test.tsx b/x-pack/plugins/siem/public/common/components/subtitle/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/subtitle/index.test.tsx rename to x-pack/plugins/siem/public/common/components/subtitle/index.test.tsx diff --git a/x-pack/plugins/siem/public/components/subtitle/index.tsx b/x-pack/plugins/siem/public/common/components/subtitle/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/subtitle/index.tsx rename to x-pack/plugins/siem/public/common/components/subtitle/index.tsx diff --git a/x-pack/plugins/siem/public/components/super_date_picker/index.test.tsx b/x-pack/plugins/siem/public/common/components/super_date_picker/index.test.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/super_date_picker/index.test.tsx rename to x-pack/plugins/siem/public/common/components/super_date_picker/index.test.tsx index b6b515ceeffa6..ba4848923b2af 100644 --- a/x-pack/plugins/siem/public/components/super_date_picker/index.test.tsx +++ b/x-pack/plugins/siem/public/common/components/super_date_picker/index.test.tsx @@ -8,9 +8,9 @@ import { mount } from 'enzyme'; import React from 'react'; import { Provider as ReduxStoreProvider } from 'react-redux'; -import { DEFAULT_TIMEPICKER_QUICK_RANGES } from '../../../common/constants'; +import { DEFAULT_TIMEPICKER_QUICK_RANGES } from '../../../../common/constants'; import { useUiSetting$ } from '../../lib/kibana'; -import { apolloClientObservable, mockGlobalState } from '../../mock'; +import { apolloClientObservable, mockGlobalState, SUB_PLUGINS_REDUCER } from '../../mock'; import { createUseUiSetting$Mock } from '../../mock/kibana_react'; import { createStore, State } from '../../store'; @@ -75,11 +75,11 @@ const timepickerRanges = [ describe('SIEM Super Date Picker', () => { describe('#SuperDatePicker', () => { const state: State = mockGlobalState; - let store = createStore(state, apolloClientObservable); + let store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); beforeEach(() => { jest.clearAllMocks(); - store = createStore(state, apolloClientObservable); + store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); mockUseUiSetting$.mockImplementation((key, defaultValue) => { const useUiSetting$Mock = createUseUiSetting$Mock(); diff --git a/x-pack/plugins/siem/public/components/super_date_picker/index.tsx b/x-pack/plugins/siem/public/common/components/super_date_picker/index.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/super_date_picker/index.tsx rename to x-pack/plugins/siem/public/common/components/super_date_picker/index.tsx index ad38a7d61bcba..d1936ac61e26b 100644 --- a/x-pack/plugins/siem/public/components/super_date_picker/index.tsx +++ b/x-pack/plugins/siem/public/common/components/super_date_picker/index.tsx @@ -17,10 +17,11 @@ import React, { useState, useCallback } from 'react'; import { connect, ConnectedProps } from 'react-redux'; import { Dispatch } from 'redux'; -import { DEFAULT_TIMEPICKER_QUICK_RANGES } from '../../../common/constants'; +import { DEFAULT_TIMEPICKER_QUICK_RANGES } from '../../../../common/constants'; +import { timelineActions } from '../../../timelines/store/timeline'; import { useUiSetting$ } from '../../lib/kibana'; import { inputsModel, State } from '../../store'; -import { inputsActions, timelineActions } from '../../store/actions'; +import { inputsActions } from '../../store/actions'; import { InputsModelId } from '../../store/inputs/constants'; import { policySelector, diff --git a/x-pack/plugins/siem/public/components/super_date_picker/selectors.test.ts b/x-pack/plugins/siem/public/common/components/super_date_picker/selectors.test.ts similarity index 100% rename from x-pack/plugins/siem/public/components/super_date_picker/selectors.test.ts rename to x-pack/plugins/siem/public/common/components/super_date_picker/selectors.test.ts diff --git a/x-pack/plugins/siem/public/components/super_date_picker/selectors.ts b/x-pack/plugins/siem/public/common/components/super_date_picker/selectors.ts similarity index 100% rename from x-pack/plugins/siem/public/components/super_date_picker/selectors.ts rename to x-pack/plugins/siem/public/common/components/super_date_picker/selectors.ts diff --git a/x-pack/plugins/siem/public/components/tables/__snapshots__/helpers.test.tsx.snap b/x-pack/plugins/siem/public/common/components/tables/__snapshots__/helpers.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/tables/__snapshots__/helpers.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/tables/__snapshots__/helpers.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/tables/helpers.test.tsx b/x-pack/plugins/siem/public/common/components/tables/helpers.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/tables/helpers.test.tsx rename to x-pack/plugins/siem/public/common/components/tables/helpers.test.tsx diff --git a/x-pack/plugins/siem/public/components/tables/helpers.tsx b/x-pack/plugins/siem/public/common/components/tables/helpers.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/tables/helpers.tsx rename to x-pack/plugins/siem/public/common/components/tables/helpers.tsx index f4f7375c26d14..c9d90504c36db 100644 --- a/x-pack/plugins/siem/public/components/tables/helpers.tsx +++ b/x-pack/plugins/siem/public/common/components/tables/helpers.tsx @@ -13,8 +13,8 @@ import { DragEffects, DraggableWrapper } from '../drag_and_drop/draggable_wrappe import { escapeDataProviderId } from '../drag_and_drop/helpers'; import { defaultToEmptyTag, getEmptyTagValue } from '../empty_value'; import { MoreRowItems, Spacer } from '../page'; -import { IS_OPERATOR } from '../timeline/data_providers/data_provider'; -import { Provider } from '../timeline/data_providers/provider'; +import { IS_OPERATOR } from '../../../timelines/components/timeline/data_providers/data_provider'; +import { Provider } from '../../../timelines/components/timeline/data_providers/provider'; const Subtext = styled.div` font-size: ${props => props.theme.eui.euiFontSizeXS}; diff --git a/x-pack/plugins/siem/public/components/toasters/__snapshots__/modal_all_errors.test.tsx.snap b/x-pack/plugins/siem/public/common/components/toasters/__snapshots__/modal_all_errors.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/toasters/__snapshots__/modal_all_errors.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/toasters/__snapshots__/modal_all_errors.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/toasters/errors.ts b/x-pack/plugins/siem/public/common/components/toasters/errors.ts similarity index 100% rename from x-pack/plugins/siem/public/components/toasters/errors.ts rename to x-pack/plugins/siem/public/common/components/toasters/errors.ts diff --git a/x-pack/plugins/siem/public/components/toasters/index.test.tsx b/x-pack/plugins/siem/public/common/components/toasters/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/toasters/index.test.tsx rename to x-pack/plugins/siem/public/common/components/toasters/index.test.tsx diff --git a/x-pack/plugins/siem/public/components/toasters/index.tsx b/x-pack/plugins/siem/public/common/components/toasters/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/toasters/index.tsx rename to x-pack/plugins/siem/public/common/components/toasters/index.tsx diff --git a/x-pack/plugins/siem/public/components/toasters/modal_all_errors.test.tsx b/x-pack/plugins/siem/public/common/components/toasters/modal_all_errors.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/toasters/modal_all_errors.test.tsx rename to x-pack/plugins/siem/public/common/components/toasters/modal_all_errors.test.tsx diff --git a/x-pack/plugins/siem/public/components/toasters/modal_all_errors.tsx b/x-pack/plugins/siem/public/common/components/toasters/modal_all_errors.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/toasters/modal_all_errors.tsx rename to x-pack/plugins/siem/public/common/components/toasters/modal_all_errors.tsx diff --git a/x-pack/plugins/siem/public/components/toasters/translations.ts b/x-pack/plugins/siem/public/common/components/toasters/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/toasters/translations.ts rename to x-pack/plugins/siem/public/common/components/toasters/translations.ts diff --git a/x-pack/plugins/siem/public/components/toasters/utils.test.ts b/x-pack/plugins/siem/public/common/components/toasters/utils.test.ts similarity index 100% rename from x-pack/plugins/siem/public/components/toasters/utils.test.ts rename to x-pack/plugins/siem/public/common/components/toasters/utils.test.ts diff --git a/x-pack/plugins/siem/public/components/toasters/utils.ts b/x-pack/plugins/siem/public/common/components/toasters/utils.ts similarity index 100% rename from x-pack/plugins/siem/public/components/toasters/utils.ts rename to x-pack/plugins/siem/public/common/components/toasters/utils.ts diff --git a/x-pack/plugins/siem/public/components/top_n/helpers.test.tsx b/x-pack/plugins/siem/public/common/components/top_n/helpers.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/top_n/helpers.test.tsx rename to x-pack/plugins/siem/public/common/components/top_n/helpers.test.tsx diff --git a/x-pack/plugins/siem/public/components/top_n/helpers.ts b/x-pack/plugins/siem/public/common/components/top_n/helpers.ts similarity index 96% rename from x-pack/plugins/siem/public/components/top_n/helpers.ts rename to x-pack/plugins/siem/public/common/components/top_n/helpers.ts index 8d9ae48d29b69..a4226cc58530a 100644 --- a/x-pack/plugins/siem/public/components/top_n/helpers.ts +++ b/x-pack/plugins/siem/public/common/components/top_n/helpers.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { EventType } from '../../store/timeline/model'; +import { EventType } from '../../../timelines/store/timeline/model'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/components/top_n/index.test.tsx b/x-pack/plugins/siem/public/common/components/top_n/index.test.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/top_n/index.test.tsx rename to x-pack/plugins/siem/public/common/components/top_n/index.test.tsx index 9325dcf499b2b..24d1939d9319d 100644 --- a/x-pack/plugins/siem/public/components/top_n/index.test.tsx +++ b/x-pack/plugins/siem/public/common/components/top_n/index.test.tsx @@ -8,11 +8,19 @@ import { mount, ReactWrapper } from 'enzyme'; import React from 'react'; import { mockBrowserFields } from '../../containers/source/mock'; -import { apolloClientObservable, mockGlobalState, TestProviders } from '../../mock'; +import { + apolloClientObservable, + mockGlobalState, + TestProviders, + SUB_PLUGINS_REDUCER, +} from '../../mock'; import { createKibanaCoreStartMock } from '../../mock/kibana_core'; -import { FilterManager } from '../../../../../../src/plugins/data/public'; +import { FilterManager } from '../../../../../../../src/plugins/data/public'; import { createStore, State } from '../../store'; -import { TimelineContext, TimelineTypeContext } from '../timeline/timeline_context'; +import { + TimelineContext, + TimelineTypeContext, +} from '../../../timelines/components/timeline/timeline_context'; import { Props } from './top_n'; import { ACTIVE_TIMELINE_REDUX_ID, StatefulTopN } from '.'; @@ -132,7 +140,7 @@ const state: State = { }, }, }; -const store = createStore(state, apolloClientObservable); +const store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); describe('StatefulTopN', () => { // Suppress warnings about "react-beautiful-dnd" diff --git a/x-pack/plugins/siem/public/components/top_n/index.tsx b/x-pack/plugins/siem/public/common/components/top_n/index.tsx similarity index 91% rename from x-pack/plugins/siem/public/components/top_n/index.tsx rename to x-pack/plugins/siem/public/common/components/top_n/index.tsx index 9863df42f101d..a71b27e0bd9cb 100644 --- a/x-pack/plugins/siem/public/components/top_n/index.tsx +++ b/x-pack/plugins/siem/public/common/components/top_n/index.tsx @@ -10,13 +10,14 @@ import { connect, ConnectedProps } from 'react-redux'; import { GlobalTime } from '../../containers/global_time'; import { BrowserFields, WithSource } from '../../containers/source'; import { useKibana } from '../../lib/kibana'; -import { esQuery, Filter, Query } from '../../../../../../src/plugins/data/public'; -import { inputsModel, inputsSelectors, State, timelineSelectors } from '../../store'; +import { esQuery, Filter, Query } from '../../../../../../../src/plugins/data/public'; +import { inputsModel, inputsSelectors, State } from '../../store'; import { setAbsoluteRangeDatePicker as dispatchSetAbsoluteRangeDatePicker } from '../../store/inputs/actions'; -import { timelineDefaults } from '../../store/timeline/defaults'; -import { TimelineModel } from '../../store/timeline/model'; -import { combineQueries } from '../timeline/helpers'; -import { useTimelineTypeContext } from '../timeline/timeline_context'; +import { timelineDefaults } from '../../../timelines/store/timeline/defaults'; +import { timelineSelectors } from '../../../timelines/store/timeline'; +import { TimelineModel } from '../../../timelines/store/timeline/model'; +import { combineQueries } from '../../../timelines/components/timeline/helpers'; +import { useTimelineTypeContext } from '../../../timelines/components/timeline/timeline_context'; import { getOptions } from './helpers'; import { TopN } from './top_n'; diff --git a/x-pack/plugins/siem/public/components/top_n/top_n.test.tsx b/x-pack/plugins/siem/public/common/components/top_n/top_n.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/top_n/top_n.test.tsx rename to x-pack/plugins/siem/public/common/components/top_n/top_n.test.tsx diff --git a/x-pack/plugins/siem/public/components/top_n/top_n.tsx b/x-pack/plugins/siem/public/common/components/top_n/top_n.tsx similarity index 93% rename from x-pack/plugins/siem/public/components/top_n/top_n.tsx rename to x-pack/plugins/siem/public/common/components/top_n/top_n.tsx index d8dc63ef92ec6..0ccb7e1e72f1f 100644 --- a/x-pack/plugins/siem/public/components/top_n/top_n.tsx +++ b/x-pack/plugins/siem/public/common/components/top_n/top_n.tsx @@ -9,12 +9,12 @@ import React, { useCallback, useMemo, useState } from 'react'; import styled from 'styled-components'; import { ActionCreator } from 'typescript-fsa'; -import { EventsByDataset } from '../../pages/overview/events_by_dataset'; -import { SignalsByCategory } from '../../pages/overview/signals_by_category'; -import { Filter, IIndexPattern, Query } from '../../../../../../src/plugins/data/public'; +import { EventsByDataset } from '../../../overview/components/events_by_dataset'; +import { SignalsByCategory } from '../../../overview/components/signals_by_category'; +import { Filter, IIndexPattern, Query } from '../../../../../../../src/plugins/data/public'; import { inputsModel } from '../../store'; import { InputsModelId } from '../../store/inputs/constants'; -import { EventType } from '../../store/timeline/model'; +import { EventType } from '../../../timelines/store/timeline/model'; import { TopNOption } from './helpers'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/components/top_n/translations.ts b/x-pack/plugins/siem/public/common/components/top_n/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/top_n/translations.ts rename to x-pack/plugins/siem/public/common/components/top_n/translations.ts diff --git a/x-pack/plugins/siem/public/components/truncatable_text/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/common/components/truncatable_text/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/truncatable_text/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/truncatable_text/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/truncatable_text/index.test.tsx b/x-pack/plugins/siem/public/common/components/truncatable_text/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/truncatable_text/index.test.tsx rename to x-pack/plugins/siem/public/common/components/truncatable_text/index.test.tsx diff --git a/x-pack/plugins/siem/public/components/truncatable_text/index.tsx b/x-pack/plugins/siem/public/common/components/truncatable_text/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/truncatable_text/index.tsx rename to x-pack/plugins/siem/public/common/components/truncatable_text/index.tsx diff --git a/x-pack/plugins/siem/public/components/url_state/constants.ts b/x-pack/plugins/siem/public/common/components/url_state/constants.ts similarity index 100% rename from x-pack/plugins/siem/public/components/url_state/constants.ts rename to x-pack/plugins/siem/public/common/components/url_state/constants.ts diff --git a/x-pack/plugins/siem/public/components/url_state/helpers.test.ts b/x-pack/plugins/siem/public/common/components/url_state/helpers.test.ts similarity index 91% rename from x-pack/plugins/siem/public/components/url_state/helpers.test.ts rename to x-pack/plugins/siem/public/common/components/url_state/helpers.test.ts index c6c18d4c25a74..410bd62e3a708 100644 --- a/x-pack/plugins/siem/public/components/url_state/helpers.test.ts +++ b/x-pack/plugins/siem/public/common/components/url_state/helpers.test.ts @@ -3,9 +3,9 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import { navTabs } from '../../pages/home/home_navigations'; +import { navTabs } from '../../../app/home/home_navigations'; import { getTitle } from './helpers'; -import { HostsType } from '../../store/hosts/model'; +import { HostsType } from '../../../hosts/store/model'; describe('Helpers Url_State', () => { describe('getTitle', () => { diff --git a/x-pack/plugins/siem/public/components/url_state/helpers.ts b/x-pack/plugins/siem/public/common/components/url_state/helpers.ts similarity index 95% rename from x-pack/plugins/siem/public/components/url_state/helpers.ts rename to x-pack/plugins/siem/public/common/components/url_state/helpers.ts index 62196b90e5e6f..8f13e4dd0cdcf 100644 --- a/x-pack/plugins/siem/public/components/url_state/helpers.ts +++ b/x-pack/plugins/siem/public/common/components/url_state/helpers.ts @@ -9,13 +9,14 @@ import { parse, stringify } from 'query-string'; import { decode, encode } from 'rison-node'; import * as H from 'history'; -import { Query, Filter } from '../../../../../../src/plugins/data/public'; -import { url } from '../../../../../../src/plugins/kibana_utils/public'; +import { Query, Filter } from '../../../../../../../src/plugins/data/public'; +import { url } from '../../../../../../../src/plugins/kibana_utils/public'; -import { SiemPageName } from '../../pages/home/types'; -import { inputsSelectors, State, timelineSelectors } from '../../store'; +import { SiemPageName } from '../../../app/types'; +import { inputsSelectors, State } from '../../store'; import { UrlInputsModel } from '../../store/inputs/model'; -import { TimelineUrl } from '../../store/timeline/model'; +import { TimelineUrl } from '../../../timelines/store/timeline/model'; +import { timelineSelectors } from '../../../timelines/store/timeline'; import { formatDate } from '../super_date_picker'; import { NavTab } from '../navigation/types'; import { CONSTANTS, UrlStateType } from './constants'; diff --git a/x-pack/plugins/siem/public/components/url_state/index.test.tsx b/x-pack/plugins/siem/public/common/components/url_state/index.test.tsx similarity index 99% rename from x-pack/plugins/siem/public/components/url_state/index.test.tsx rename to x-pack/plugins/siem/public/common/components/url_state/index.test.tsx index 4d2a717153894..b901bc2b820cc 100644 --- a/x-pack/plugins/siem/public/components/url_state/index.test.tsx +++ b/x-pack/plugins/siem/public/common/components/url_state/index.test.tsx @@ -8,7 +8,7 @@ import { mount } from 'enzyme'; import React from 'react'; import { HookWrapper } from '../../mock'; -import { SiemPageName } from '../../pages/home/types'; +import { SiemPageName } from '../../../app/types'; import { RouteSpyState } from '../../utils/route/types'; import { CONSTANTS } from './constants'; import { diff --git a/x-pack/plugins/siem/public/components/url_state/index.tsx b/x-pack/plugins/siem/public/common/components/url_state/index.tsx similarity index 92% rename from x-pack/plugins/siem/public/components/url_state/index.tsx rename to x-pack/plugins/siem/public/common/components/url_state/index.tsx index 294e41a1faa7b..f90e9cf62801b 100644 --- a/x-pack/plugins/siem/public/components/url_state/index.tsx +++ b/x-pack/plugins/siem/public/common/components/url_state/index.tsx @@ -9,13 +9,13 @@ import { compose, Dispatch } from 'redux'; import { connect } from 'react-redux'; import deepEqual from 'fast-deep-equal'; -import { timelineActions } from '../../store/actions'; +import { timelineActions } from '../../../timelines/store/timeline'; import { RouteSpyState } from '../../utils/route/types'; import { useRouteSpy } from '../../utils/route/use_route_spy'; import { UrlStateContainerPropTypes, UrlStateProps } from './types'; import { useUrlStateHooks } from './use_url_state'; -import { dispatchUpdateTimeline } from '../open_timeline/helpers'; +import { dispatchUpdateTimeline } from '../../../timelines/components/open_timeline/helpers'; import { dispatchSetInitialStateFromUrl } from './initialize_redux_by_url'; import { makeMapStateToProps } from './helpers'; diff --git a/x-pack/plugins/siem/public/components/url_state/index_mocked.test.tsx b/x-pack/plugins/siem/public/common/components/url_state/index_mocked.test.tsx similarity index 99% rename from x-pack/plugins/siem/public/components/url_state/index_mocked.test.tsx rename to x-pack/plugins/siem/public/common/components/url_state/index_mocked.test.tsx index 4adc17b32e189..122f7f6fed57e 100644 --- a/x-pack/plugins/siem/public/components/url_state/index_mocked.test.tsx +++ b/x-pack/plugins/siem/public/common/components/url_state/index_mocked.test.tsx @@ -8,7 +8,7 @@ import { mount } from 'enzyme'; import React from 'react'; import { HookWrapper } from '../../mock/hook_wrapper'; -import { SiemPageName } from '../../pages/home/types'; +import { SiemPageName } from '../../../app/types'; import { CONSTANTS } from './constants'; import { getFilterQuery, getMockPropsObj, mockHistory, testCases } from './test_dependencies'; diff --git a/x-pack/plugins/siem/public/components/url_state/initialize_redux_by_url.tsx b/x-pack/plugins/siem/public/common/components/url_state/initialize_redux_by_url.tsx similarity index 95% rename from x-pack/plugins/siem/public/components/url_state/initialize_redux_by_url.tsx rename to x-pack/plugins/siem/public/common/components/url_state/initialize_redux_by_url.tsx index 54a196d1b8161..441424faa48dc 100644 --- a/x-pack/plugins/siem/public/components/url_state/initialize_redux_by_url.tsx +++ b/x-pack/plugins/siem/public/common/components/url_state/initialize_redux_by_url.tsx @@ -7,7 +7,7 @@ import { get, isEmpty } from 'lodash/fp'; import { Dispatch } from 'redux'; -import { Query, Filter } from '../../../../../../src/plugins/data/public'; +import { Query, Filter } from '../../../../../../../src/plugins/data/public'; import { inputsActions } from '../../store/actions'; import { InputsModelId, TimeRangeKinds } from '../../store/inputs/constants'; import { @@ -16,12 +16,12 @@ import { AbsoluteTimeRange, RelativeTimeRange, } from '../../store/inputs/model'; -import { TimelineUrl } from '../../store/timeline/model'; +import { TimelineUrl } from '../../../timelines/store/timeline/model'; import { CONSTANTS } from './constants'; import { decodeRisonUrlState } from './helpers'; import { normalizeTimeRange } from './normalize_time_range'; import { DispatchSetInitialStateFromUrl, SetInitialStateFromUrl } from './types'; -import { queryTimelineById } from '../open_timeline/helpers'; +import { queryTimelineById } from '../../../timelines/components/open_timeline/helpers'; export const dispatchSetInitialStateFromUrl = ( dispatch: Dispatch diff --git a/x-pack/plugins/siem/public/components/url_state/normalize_time_range.test.ts b/x-pack/plugins/siem/public/common/components/url_state/normalize_time_range.test.ts similarity index 100% rename from x-pack/plugins/siem/public/components/url_state/normalize_time_range.test.ts rename to x-pack/plugins/siem/public/common/components/url_state/normalize_time_range.test.ts diff --git a/x-pack/plugins/siem/public/components/url_state/normalize_time_range.ts b/x-pack/plugins/siem/public/common/components/url_state/normalize_time_range.ts similarity index 100% rename from x-pack/plugins/siem/public/components/url_state/normalize_time_range.ts rename to x-pack/plugins/siem/public/common/components/url_state/normalize_time_range.ts diff --git a/x-pack/plugins/siem/public/components/url_state/test_dependencies.ts b/x-pack/plugins/siem/public/common/components/url_state/test_dependencies.ts similarity index 95% rename from x-pack/plugins/siem/public/components/url_state/test_dependencies.ts rename to x-pack/plugins/siem/public/common/components/url_state/test_dependencies.ts index 974bee53bc2ba..de6a00bfadb80 100644 --- a/x-pack/plugins/siem/public/components/url_state/test_dependencies.ts +++ b/x-pack/plugins/siem/public/common/components/url_state/test_dependencies.ts @@ -5,17 +5,18 @@ */ import { ActionCreator } from 'typescript-fsa'; -import { DispatchUpdateTimeline } from '../open_timeline/types'; -import { navTabs } from '../../pages/home/home_navigations'; -import { SiemPageName } from '../../pages/home/types'; -import { hostsModel, networkModel } from '../../store'; +import { DispatchUpdateTimeline } from '../../../timelines/components/open_timeline/types'; +import { navTabs } from '../../../app/home/home_navigations'; +import { SiemPageName } from '../../../app/types'; import { inputsActions } from '../../store/actions'; -import { HostsTableType } from '../../store/hosts/model'; import { CONSTANTS } from './constants'; import { dispatchSetInitialStateFromUrl } from './initialize_redux_by_url'; import { UrlStateContainerPropTypes, LocationTypes } from './types'; -import { Query } from '../../../../../../src/plugins/data/public'; +import { Query } from '../../../../../../../src/plugins/data/public'; +import { networkModel } from '../../../network/store'; +import { hostsModel } from '../../../hosts/store'; +import { HostsTableType } from '../../../hosts/store/model'; type Action = 'PUSH' | 'POP' | 'REPLACE'; const pop: Action = 'POP'; diff --git a/x-pack/plugins/siem/public/components/url_state/types.ts b/x-pack/plugins/siem/public/common/components/url_state/types.ts similarity index 96% rename from x-pack/plugins/siem/public/components/url_state/types.ts rename to x-pack/plugins/siem/public/common/components/url_state/types.ts index 9d8a4a8e6a908..56578d84e12e4 100644 --- a/x-pack/plugins/siem/public/components/url_state/types.ts +++ b/x-pack/plugins/siem/public/common/components/url_state/types.ts @@ -16,9 +16,9 @@ import { } from 'src/plugins/data/public'; import { UrlInputsModel } from '../../store/inputs/model'; -import { TimelineUrl } from '../../store/timeline/model'; +import { TimelineUrl } from '../../../timelines/store/timeline/model'; import { RouteSpyState } from '../../utils/route/types'; -import { DispatchUpdateTimeline } from '../open_timeline/types'; +import { DispatchUpdateTimeline } from '../../../timelines/components/open_timeline/types'; import { NavTab } from '../navigation/types'; import { CONSTANTS, UrlStateType } from './constants'; diff --git a/x-pack/plugins/siem/public/components/url_state/use_url_state.tsx b/x-pack/plugins/siem/public/common/components/url_state/use_url_state.tsx similarity index 99% rename from x-pack/plugins/siem/public/components/url_state/use_url_state.tsx rename to x-pack/plugins/siem/public/common/components/url_state/use_url_state.tsx index a7704e0e86970..b3436a7da8297 100644 --- a/x-pack/plugins/siem/public/components/url_state/use_url_state.tsx +++ b/x-pack/plugins/siem/public/common/components/url_state/use_url_state.tsx @@ -27,7 +27,7 @@ import { ALL_URL_STATE_KEYS, UrlStateToRedux, } from './types'; -import { SiemPageName } from '../../pages/home/types'; +import { SiemPageName } from '../../../app/types'; function usePrevious(value: PreviousLocationUrlState) { const ref = useRef(value); diff --git a/x-pack/plugins/siem/public/components/utility_bar/__snapshots__/utility_bar.test.tsx.snap b/x-pack/plugins/siem/public/common/components/utility_bar/__snapshots__/utility_bar.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/utility_bar/__snapshots__/utility_bar.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/utility_bar/__snapshots__/utility_bar.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/utility_bar/__snapshots__/utility_bar_action.test.tsx.snap b/x-pack/plugins/siem/public/common/components/utility_bar/__snapshots__/utility_bar_action.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/utility_bar/__snapshots__/utility_bar_action.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/utility_bar/__snapshots__/utility_bar_action.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/utility_bar/__snapshots__/utility_bar_group.test.tsx.snap b/x-pack/plugins/siem/public/common/components/utility_bar/__snapshots__/utility_bar_group.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/utility_bar/__snapshots__/utility_bar_group.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/utility_bar/__snapshots__/utility_bar_group.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/utility_bar/__snapshots__/utility_bar_section.test.tsx.snap b/x-pack/plugins/siem/public/common/components/utility_bar/__snapshots__/utility_bar_section.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/utility_bar/__snapshots__/utility_bar_section.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/utility_bar/__snapshots__/utility_bar_section.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/utility_bar/__snapshots__/utility_bar_text.test.tsx.snap b/x-pack/plugins/siem/public/common/components/utility_bar/__snapshots__/utility_bar_text.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/utility_bar/__snapshots__/utility_bar_text.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/utility_bar/__snapshots__/utility_bar_text.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/utility_bar/index.ts b/x-pack/plugins/siem/public/common/components/utility_bar/index.ts similarity index 100% rename from x-pack/plugins/siem/public/components/utility_bar/index.ts rename to x-pack/plugins/siem/public/common/components/utility_bar/index.ts diff --git a/x-pack/plugins/siem/public/components/utility_bar/styles.tsx b/x-pack/plugins/siem/public/common/components/utility_bar/styles.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/utility_bar/styles.tsx rename to x-pack/plugins/siem/public/common/components/utility_bar/styles.tsx diff --git a/x-pack/plugins/siem/public/components/utility_bar/utility_bar.test.tsx b/x-pack/plugins/siem/public/common/components/utility_bar/utility_bar.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/utility_bar/utility_bar.test.tsx rename to x-pack/plugins/siem/public/common/components/utility_bar/utility_bar.test.tsx diff --git a/x-pack/plugins/siem/public/components/utility_bar/utility_bar.tsx b/x-pack/plugins/siem/public/common/components/utility_bar/utility_bar.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/utility_bar/utility_bar.tsx rename to x-pack/plugins/siem/public/common/components/utility_bar/utility_bar.tsx diff --git a/x-pack/plugins/siem/public/components/utility_bar/utility_bar_action.test.tsx b/x-pack/plugins/siem/public/common/components/utility_bar/utility_bar_action.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/utility_bar/utility_bar_action.test.tsx rename to x-pack/plugins/siem/public/common/components/utility_bar/utility_bar_action.test.tsx diff --git a/x-pack/plugins/siem/public/components/utility_bar/utility_bar_action.tsx b/x-pack/plugins/siem/public/common/components/utility_bar/utility_bar_action.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/utility_bar/utility_bar_action.tsx rename to x-pack/plugins/siem/public/common/components/utility_bar/utility_bar_action.tsx diff --git a/x-pack/plugins/siem/public/components/utility_bar/utility_bar_group.test.tsx b/x-pack/plugins/siem/public/common/components/utility_bar/utility_bar_group.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/utility_bar/utility_bar_group.test.tsx rename to x-pack/plugins/siem/public/common/components/utility_bar/utility_bar_group.test.tsx diff --git a/x-pack/plugins/siem/public/components/utility_bar/utility_bar_group.tsx b/x-pack/plugins/siem/public/common/components/utility_bar/utility_bar_group.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/utility_bar/utility_bar_group.tsx rename to x-pack/plugins/siem/public/common/components/utility_bar/utility_bar_group.tsx diff --git a/x-pack/plugins/siem/public/components/utility_bar/utility_bar_section.test.tsx b/x-pack/plugins/siem/public/common/components/utility_bar/utility_bar_section.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/utility_bar/utility_bar_section.test.tsx rename to x-pack/plugins/siem/public/common/components/utility_bar/utility_bar_section.test.tsx diff --git a/x-pack/plugins/siem/public/components/utility_bar/utility_bar_section.tsx b/x-pack/plugins/siem/public/common/components/utility_bar/utility_bar_section.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/utility_bar/utility_bar_section.tsx rename to x-pack/plugins/siem/public/common/components/utility_bar/utility_bar_section.tsx diff --git a/x-pack/plugins/siem/public/components/utility_bar/utility_bar_text.test.tsx b/x-pack/plugins/siem/public/common/components/utility_bar/utility_bar_text.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/utility_bar/utility_bar_text.test.tsx rename to x-pack/plugins/siem/public/common/components/utility_bar/utility_bar_text.test.tsx diff --git a/x-pack/plugins/siem/public/components/utility_bar/utility_bar_text.tsx b/x-pack/plugins/siem/public/common/components/utility_bar/utility_bar_text.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/utility_bar/utility_bar_text.tsx rename to x-pack/plugins/siem/public/common/components/utility_bar/utility_bar_text.tsx diff --git a/x-pack/plugins/siem/public/components/utils.ts b/x-pack/plugins/siem/public/common/components/utils.ts similarity index 100% rename from x-pack/plugins/siem/public/components/utils.ts rename to x-pack/plugins/siem/public/common/components/utils.ts diff --git a/x-pack/plugins/siem/public/components/with_hover_actions/index.tsx b/x-pack/plugins/siem/public/common/components/with_hover_actions/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/with_hover_actions/index.tsx rename to x-pack/plugins/siem/public/common/components/with_hover_actions/index.tsx diff --git a/x-pack/plugins/siem/public/components/wrapper_page/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/common/components/wrapper_page/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/wrapper_page/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/common/components/wrapper_page/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/wrapper_page/index.test.tsx b/x-pack/plugins/siem/public/common/components/wrapper_page/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/wrapper_page/index.test.tsx rename to x-pack/plugins/siem/public/common/components/wrapper_page/index.test.tsx diff --git a/x-pack/plugins/siem/public/components/wrapper_page/index.tsx b/x-pack/plugins/siem/public/common/components/wrapper_page/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/wrapper_page/index.tsx rename to x-pack/plugins/siem/public/common/components/wrapper_page/index.tsx diff --git a/x-pack/plugins/siem/public/containers/anomalies/anomalies_query_tab_body/histogram_configs.ts b/x-pack/plugins/siem/public/common/containers/anomalies/anomalies_query_tab_body/histogram_configs.ts similarity index 94% rename from x-pack/plugins/siem/public/containers/anomalies/anomalies_query_tab_body/histogram_configs.ts rename to x-pack/plugins/siem/public/common/containers/anomalies/anomalies_query_tab_body/histogram_configs.ts index f63349d3e573a..c3d470df11be7 100644 --- a/x-pack/plugins/siem/public/containers/anomalies/anomalies_query_tab_body/histogram_configs.ts +++ b/x-pack/plugins/siem/public/common/containers/anomalies/anomalies_query_tab_body/histogram_configs.ts @@ -8,7 +8,7 @@ import { MatrixHistogramOption, MatrixHisrogramConfigs, } from '../../../components/matrix_histogram/types'; -import { HistogramType } from '../../../graphql/types'; +import { HistogramType } from '../../../../graphql/types'; export const anomaliesStackByOptions: MatrixHistogramOption[] = [ { diff --git a/x-pack/plugins/siem/public/containers/anomalies/anomalies_query_tab_body/index.tsx b/x-pack/plugins/siem/public/common/containers/anomalies/anomalies_query_tab_body/index.tsx similarity index 96% rename from x-pack/plugins/siem/public/containers/anomalies/anomalies_query_tab_body/index.tsx rename to x-pack/plugins/siem/public/common/containers/anomalies/anomalies_query_tab_body/index.tsx index 2bbb4cde92b15..a5574bd2a57c7 100644 --- a/x-pack/plugins/siem/public/containers/anomalies/anomalies_query_tab_body/index.tsx +++ b/x-pack/plugins/siem/public/common/containers/anomalies/anomalies_query_tab_body/index.tsx @@ -6,7 +6,7 @@ import React, { useEffect } from 'react'; -import { DEFAULT_ANOMALY_SCORE } from '../../../../common/constants'; +import { DEFAULT_ANOMALY_SCORE } from '../../../../../common/constants'; import { AnomaliesQueryTabBodyProps } from './types'; import { getAnomaliesFilterQuery } from './utils'; import { useSiemJobs } from '../../../components/ml_popover/hooks/use_siem_jobs'; diff --git a/x-pack/plugins/siem/public/containers/anomalies/anomalies_query_tab_body/translations.ts b/x-pack/plugins/siem/public/common/containers/anomalies/anomalies_query_tab_body/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/anomalies/anomalies_query_tab_body/translations.ts rename to x-pack/plugins/siem/public/common/containers/anomalies/anomalies_query_tab_body/translations.ts diff --git a/x-pack/plugins/siem/public/containers/anomalies/anomalies_query_tab_body/types.ts b/x-pack/plugins/siem/public/common/containers/anomalies/anomalies_query_tab_body/types.ts similarity index 78% rename from x-pack/plugins/siem/public/containers/anomalies/anomalies_query_tab_body/types.ts rename to x-pack/plugins/siem/public/common/containers/anomalies/anomalies_query_tab_body/types.ts index f6cae81e3c6c4..ecf4c3590a42c 100644 --- a/x-pack/plugins/siem/public/containers/anomalies/anomalies_query_tab_body/types.ts +++ b/x-pack/plugins/siem/public/common/containers/anomalies/anomalies_query_tab_body/types.ts @@ -4,13 +4,13 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ESTermQuery } from '../../../../common/typed_json'; +import { ESTermQuery } from '../../../../../common/typed_json'; import { NarrowDateRange } from '../../../components/ml/types'; import { UpdateDateRange } from '../../../components/charts/common'; -import { SetQuery } from '../../../pages/hosts/navigation/types'; -import { FlowTarget } from '../../../graphql/types'; -import { HostsType } from '../../../store/hosts/model'; -import { NetworkType } from '../../../store/network/model'; +import { SetQuery } from '../../../../hosts/pages/navigation/types'; +import { FlowTarget } from '../../../../graphql/types'; +import { HostsType } from '../../../../hosts/store/model'; +import { NetworkType } from '../../../../network/store//model'; import { AnomaliesHostTable } from '../../../components/ml/tables/anomalies_host_table'; import { AnomaliesNetworkTable } from '../../../components/ml/tables/anomalies_network_table'; diff --git a/x-pack/plugins/siem/public/containers/anomalies/anomalies_query_tab_body/utils.ts b/x-pack/plugins/siem/public/common/containers/anomalies/anomalies_query_tab_body/utils.ts similarity index 93% rename from x-pack/plugins/siem/public/containers/anomalies/anomalies_query_tab_body/utils.ts rename to x-pack/plugins/siem/public/common/containers/anomalies/anomalies_query_tab_body/utils.ts index 790a797b2fead..e815db68ebcdd 100644 --- a/x-pack/plugins/siem/public/containers/anomalies/anomalies_query_tab_body/utils.ts +++ b/x-pack/plugins/siem/public/common/containers/anomalies/anomalies_query_tab_body/utils.ts @@ -6,10 +6,10 @@ import deepmerge from 'deepmerge'; -import { ESTermQuery } from '../../../../common/typed_json'; +import { ESTermQuery } from '../../../../../common/typed_json'; import { createFilter } from '../../helpers'; import { SiemJob } from '../../../components/ml_popover/types'; -import { FlowTarget } from '../../../graphql/types'; +import { FlowTarget } from '../../../../graphql/types'; export const getAnomaliesFilterQuery = ( filterQuery: string | ESTermQuery | undefined, diff --git a/x-pack/plugins/siem/public/containers/errors/index.test.tsx b/x-pack/plugins/siem/public/common/containers/errors/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/containers/errors/index.test.tsx rename to x-pack/plugins/siem/public/common/containers/errors/index.test.tsx diff --git a/x-pack/plugins/siem/public/containers/errors/index.tsx b/x-pack/plugins/siem/public/common/containers/errors/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/containers/errors/index.tsx rename to x-pack/plugins/siem/public/common/containers/errors/index.tsx diff --git a/x-pack/plugins/siem/public/containers/errors/translations.ts b/x-pack/plugins/siem/public/common/containers/errors/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/errors/translations.ts rename to x-pack/plugins/siem/public/common/containers/errors/translations.ts diff --git a/x-pack/plugins/siem/public/containers/events/last_event_time/index.ts b/x-pack/plugins/siem/public/common/containers/events/last_event_time/index.ts similarity index 93% rename from x-pack/plugins/siem/public/containers/events/last_event_time/index.ts rename to x-pack/plugins/siem/public/common/containers/events/last_event_time/index.ts index 9cae503d30940..17b2cb746e92b 100644 --- a/x-pack/plugins/siem/public/containers/events/last_event_time/index.ts +++ b/x-pack/plugins/siem/public/common/containers/events/last_event_time/index.ts @@ -7,8 +7,12 @@ import { get } from 'lodash/fp'; import React, { useEffect, useState } from 'react'; -import { DEFAULT_INDEX_KEY } from '../../../../common/constants'; -import { GetLastEventTimeQuery, LastEventIndexKey, LastTimeDetails } from '../../../graphql/types'; +import { DEFAULT_INDEX_KEY } from '../../../../../common/constants'; +import { + GetLastEventTimeQuery, + LastEventIndexKey, + LastTimeDetails, +} from '../../../../graphql/types'; import { inputsModel } from '../../../store'; import { QueryTemplateProps } from '../../query_template'; import { useUiSetting$ } from '../../../lib/kibana'; diff --git a/x-pack/plugins/siem/public/containers/events/last_event_time/last_event_time.gql_query.ts b/x-pack/plugins/siem/public/common/containers/events/last_event_time/last_event_time.gql_query.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/events/last_event_time/last_event_time.gql_query.ts rename to x-pack/plugins/siem/public/common/containers/events/last_event_time/last_event_time.gql_query.ts diff --git a/x-pack/plugins/siem/public/containers/events/last_event_time/mock.ts b/x-pack/plugins/siem/public/common/containers/events/last_event_time/mock.ts similarity index 93% rename from x-pack/plugins/siem/public/containers/events/last_event_time/mock.ts rename to x-pack/plugins/siem/public/common/containers/events/last_event_time/mock.ts index 43f55dfcf2777..938473f92782a 100644 --- a/x-pack/plugins/siem/public/containers/events/last_event_time/mock.ts +++ b/x-pack/plugins/siem/public/common/containers/events/last_event_time/mock.ts @@ -4,8 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import { DEFAULT_INDEX_PATTERN } from '../../../../common/constants'; -import { GetLastEventTimeQuery, LastEventIndexKey } from '../../../graphql/types'; +import { DEFAULT_INDEX_PATTERN } from '../../../../../common/constants'; +import { GetLastEventTimeQuery, LastEventIndexKey } from '../../../../graphql/types'; import { LastEventTimeGqlQuery } from './last_event_time.gql_query'; diff --git a/x-pack/plugins/siem/public/containers/global_time/index.tsx b/x-pack/plugins/siem/public/common/containers/global_time/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/containers/global_time/index.tsx rename to x-pack/plugins/siem/public/common/containers/global_time/index.tsx diff --git a/x-pack/plugins/siem/public/containers/helpers.test.ts b/x-pack/plugins/siem/public/common/containers/helpers.test.ts similarity index 94% rename from x-pack/plugins/siem/public/containers/helpers.test.ts rename to x-pack/plugins/siem/public/common/containers/helpers.test.ts index 5d378d79acc7a..360ba28a746b0 100644 --- a/x-pack/plugins/siem/public/containers/helpers.test.ts +++ b/x-pack/plugins/siem/public/common/containers/helpers.test.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ESQuery } from '../../common/typed_json'; +import { ESQuery } from '../../../common/typed_json'; import { createFilter } from './helpers'; diff --git a/x-pack/plugins/siem/public/containers/helpers.ts b/x-pack/plugins/siem/public/common/containers/helpers.ts similarity index 91% rename from x-pack/plugins/siem/public/containers/helpers.ts rename to x-pack/plugins/siem/public/common/containers/helpers.ts index 5f66e3f4b88d4..39fd1987218fa 100644 --- a/x-pack/plugins/siem/public/containers/helpers.ts +++ b/x-pack/plugins/siem/public/common/containers/helpers.ts @@ -7,7 +7,7 @@ import { FetchPolicy } from 'apollo-client'; import { isString } from 'lodash/fp'; -import { ESQuery } from '../../common/typed_json'; +import { ESQuery } from '../../../common/typed_json'; export const createFilter = (filterQuery: ESQuery | string | undefined) => isString(filterQuery) ? filterQuery : JSON.stringify(filterQuery); diff --git a/x-pack/plugins/siem/public/containers/kuery_autocompletion/index.tsx b/x-pack/plugins/siem/public/common/containers/kuery_autocompletion/index.tsx similarity index 98% rename from x-pack/plugins/siem/public/containers/kuery_autocompletion/index.tsx rename to x-pack/plugins/siem/public/common/containers/kuery_autocompletion/index.tsx index 6120538a01e78..af4eb1ff7a5e1 100644 --- a/x-pack/plugins/siem/public/containers/kuery_autocompletion/index.tsx +++ b/x-pack/plugins/siem/public/common/containers/kuery_autocompletion/index.tsx @@ -5,7 +5,7 @@ */ import React, { useState } from 'react'; -import { QuerySuggestion, IIndexPattern } from '../../../../../../src/plugins/data/public'; +import { QuerySuggestion, IIndexPattern } from '../../../../../../../src/plugins/data/public'; import { useKibana } from '../../lib/kibana'; type RendererResult = React.ReactElement | null; diff --git a/x-pack/plugins/siem/public/containers/matrix_histogram/index.gql_query.ts b/x-pack/plugins/siem/public/common/containers/matrix_histogram/index.gql_query.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/matrix_histogram/index.gql_query.ts rename to x-pack/plugins/siem/public/common/containers/matrix_histogram/index.gql_query.ts diff --git a/x-pack/plugins/siem/public/containers/matrix_histogram/index.test.tsx b/x-pack/plugins/siem/public/common/containers/matrix_histogram/index.test.tsx similarity index 99% rename from x-pack/plugins/siem/public/containers/matrix_histogram/index.test.tsx rename to x-pack/plugins/siem/public/common/containers/matrix_histogram/index.test.tsx index 80899a061e7c1..cb988d7ebf190 100644 --- a/x-pack/plugins/siem/public/containers/matrix_histogram/index.test.tsx +++ b/x-pack/plugins/siem/public/common/containers/matrix_histogram/index.test.tsx @@ -9,7 +9,7 @@ import { mount } from 'enzyme'; import React from 'react'; import { useApolloClient } from '../../utils/apollo_context'; import { errorToToaster } from '../../components/toasters'; -import { MatrixOverTimeHistogramData, HistogramType } from '../../graphql/types'; +import { MatrixOverTimeHistogramData, HistogramType } from '../../../graphql/types'; import { InspectQuery, Refetch } from '../../store/inputs/model'; const mockQuery = jest.fn().mockResolvedValue({ diff --git a/x-pack/plugins/siem/public/containers/matrix_histogram/index.ts b/x-pack/plugins/siem/public/common/containers/matrix_histogram/index.ts similarity index 97% rename from x-pack/plugins/siem/public/containers/matrix_histogram/index.ts rename to x-pack/plugins/siem/public/common/containers/matrix_histogram/index.ts index 18bb611191bbc..649ca526c2102 100644 --- a/x-pack/plugins/siem/public/containers/matrix_histogram/index.ts +++ b/x-pack/plugins/siem/public/common/containers/matrix_histogram/index.ts @@ -7,7 +7,7 @@ import { isEmpty } from 'lodash/fp'; import { useEffect, useMemo, useState, useRef } from 'react'; -import { DEFAULT_INDEX_KEY } from '../../../common/constants'; +import { DEFAULT_INDEX_KEY } from '../../../../common/constants'; import { MatrixHistogramQueryProps } from '../../components/matrix_histogram/types'; import { errorToToaster, useStateToaster } from '../../components/toasters'; import { useUiSetting$ } from '../../lib/kibana'; @@ -15,7 +15,7 @@ import { createFilter } from '../helpers'; import { useApolloClient } from '../../utils/apollo_context'; import { inputsModel } from '../../store'; import { MatrixHistogramGqlQuery } from './index.gql_query'; -import { GetMatrixHistogramQuery, MatrixOverTimeHistogramData } from '../../graphql/types'; +import { GetMatrixHistogramQuery, MatrixOverTimeHistogramData } from '../../../graphql/types'; export const useQuery = ({ endDate, diff --git a/x-pack/plugins/siem/public/containers/query_template.tsx b/x-pack/plugins/siem/public/common/containers/query_template.tsx similarity index 98% rename from x-pack/plugins/siem/public/containers/query_template.tsx rename to x-pack/plugins/siem/public/common/containers/query_template.tsx index dfb452c24b86e..fdc95c1dadfe1 100644 --- a/x-pack/plugins/siem/public/containers/query_template.tsx +++ b/x-pack/plugins/siem/public/common/containers/query_template.tsx @@ -8,7 +8,7 @@ import { ApolloQueryResult } from 'apollo-client'; import React from 'react'; import { FetchMoreOptions, FetchMoreQueryOptions, OperationVariables } from 'react-apollo'; -import { ESQuery } from '../../common/typed_json'; +import { ESQuery } from '../../../common/typed_json'; export interface QueryTemplateProps { id?: string; diff --git a/x-pack/plugins/siem/public/containers/query_template_paginated.tsx b/x-pack/plugins/siem/public/common/containers/query_template_paginated.tsx similarity index 98% rename from x-pack/plugins/siem/public/containers/query_template_paginated.tsx rename to x-pack/plugins/siem/public/common/containers/query_template_paginated.tsx index db618f216d83e..446e1125b2807 100644 --- a/x-pack/plugins/siem/public/containers/query_template_paginated.tsx +++ b/x-pack/plugins/siem/public/common/containers/query_template_paginated.tsx @@ -10,7 +10,7 @@ import React from 'react'; import { FetchMoreOptions, FetchMoreQueryOptions, OperationVariables } from 'react-apollo'; import deepEqual from 'fast-deep-equal'; -import { ESQuery } from '../../common/typed_json'; +import { ESQuery } from '../../../common/typed_json'; import { inputsModel } from '../store/model'; import { generateTablePaginationOptions } from '../components/paginated_table/helpers'; diff --git a/x-pack/plugins/siem/public/containers/source/index.gql_query.ts b/x-pack/plugins/siem/public/common/containers/source/index.gql_query.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/source/index.gql_query.ts rename to x-pack/plugins/siem/public/common/containers/source/index.gql_query.ts diff --git a/x-pack/plugins/siem/public/containers/source/index.test.tsx b/x-pack/plugins/siem/public/common/containers/source/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/containers/source/index.test.tsx rename to x-pack/plugins/siem/public/common/containers/source/index.test.tsx diff --git a/x-pack/plugins/siem/public/containers/source/index.tsx b/x-pack/plugins/siem/public/common/containers/source/index.tsx similarity index 97% rename from x-pack/plugins/siem/public/containers/source/index.tsx rename to x-pack/plugins/siem/public/common/containers/source/index.tsx index e9359fdb19587..8c33c556c6767 100644 --- a/x-pack/plugins/siem/public/containers/source/index.tsx +++ b/x-pack/plugins/siem/public/common/containers/source/index.tsx @@ -11,10 +11,10 @@ import React, { useEffect, useMemo, useState } from 'react'; import memoizeOne from 'memoize-one'; import { IIndexPattern } from 'src/plugins/data/public'; -import { DEFAULT_INDEX_KEY } from '../../../common/constants'; +import { DEFAULT_INDEX_KEY } from '../../../../common/constants'; import { useUiSetting$ } from '../../lib/kibana'; -import { IndexField, SourceQuery } from '../../graphql/types'; +import { IndexField, SourceQuery } from '../../../graphql/types'; import { sourceQuery } from './index.gql_query'; import { useApolloClient } from '../../utils/apollo_context'; diff --git a/x-pack/plugins/siem/public/containers/source/mock.ts b/x-pack/plugins/siem/public/common/containers/source/mock.ts similarity index 99% rename from x-pack/plugins/siem/public/containers/source/mock.ts rename to x-pack/plugins/siem/public/common/containers/source/mock.ts index 092aad9e7400c..55e8b6ac02b12 100644 --- a/x-pack/plugins/siem/public/containers/source/mock.ts +++ b/x-pack/plugins/siem/public/common/containers/source/mock.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { DEFAULT_INDEX_PATTERN } from '../../../common/constants'; +import { DEFAULT_INDEX_PATTERN } from '../../../../common/constants'; import { BrowserFields } from '.'; import { sourceQuery } from './index.gql_query'; diff --git a/x-pack/plugins/siem/public/hooks/api/__mock__/api.tsx b/x-pack/plugins/siem/public/common/hooks/api/__mock__/api.tsx similarity index 100% rename from x-pack/plugins/siem/public/hooks/api/__mock__/api.tsx rename to x-pack/plugins/siem/public/common/hooks/api/__mock__/api.tsx diff --git a/x-pack/plugins/siem/public/hooks/api/api.tsx b/x-pack/plugins/siem/public/common/hooks/api/api.tsx similarity index 94% rename from x-pack/plugins/siem/public/hooks/api/api.tsx rename to x-pack/plugins/siem/public/common/hooks/api/api.tsx index 8120e3819d9a8..12863bffcf515 100644 --- a/x-pack/plugins/siem/public/hooks/api/api.tsx +++ b/x-pack/plugins/siem/public/common/hooks/api/api.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { StartServices } from '../../plugin'; +import { StartServices } from '../../../plugin'; import { IndexPatternSavedObject, IndexPatternSavedObjectAttributes } from '../types'; /** diff --git a/x-pack/plugins/siem/public/hooks/api/helpers.test.tsx b/x-pack/plugins/siem/public/common/hooks/api/helpers.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/hooks/api/helpers.test.tsx rename to x-pack/plugins/siem/public/common/hooks/api/helpers.test.tsx diff --git a/x-pack/plugins/siem/public/hooks/api/helpers.tsx b/x-pack/plugins/siem/public/common/hooks/api/helpers.tsx similarity index 100% rename from x-pack/plugins/siem/public/hooks/api/helpers.tsx rename to x-pack/plugins/siem/public/common/hooks/api/helpers.tsx diff --git a/x-pack/plugins/siem/public/hooks/translations.ts b/x-pack/plugins/siem/public/common/hooks/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/hooks/translations.ts rename to x-pack/plugins/siem/public/common/hooks/translations.ts diff --git a/x-pack/plugins/siem/public/hooks/types.ts b/x-pack/plugins/siem/public/common/hooks/types.ts similarity index 80% rename from x-pack/plugins/siem/public/hooks/types.ts rename to x-pack/plugins/siem/public/common/hooks/types.ts index 6527904964d00..36b626b0ba9f1 100644 --- a/x-pack/plugins/siem/public/hooks/types.ts +++ b/x-pack/plugins/siem/public/common/hooks/types.ts @@ -4,7 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import { SimpleSavedObject } from '../../../../../src/core/public'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { SimpleSavedObject } from '../../../../../../src/core/public'; // eslint-disable-next-line @typescript-eslint/consistent-type-definitions export type IndexPatternSavedObjectAttributes = { title: string }; diff --git a/x-pack/plugins/siem/public/hooks/use_add_to_timeline.tsx b/x-pack/plugins/siem/public/common/hooks/use_add_to_timeline.tsx similarity index 95% rename from x-pack/plugins/siem/public/hooks/use_add_to_timeline.tsx rename to x-pack/plugins/siem/public/common/hooks/use_add_to_timeline.tsx index be0ddb153457e..9d3c1efbe3451 100644 --- a/x-pack/plugins/siem/public/hooks/use_add_to_timeline.tsx +++ b/x-pack/plugins/siem/public/common/hooks/use_add_to_timeline.tsx @@ -9,8 +9,8 @@ import { useCallback } from 'react'; import { DraggableId, FluidDragActions, Position, SensorAPI } from 'react-beautiful-dnd'; import { IS_DRAGGING_CLASS_NAME } from '../components/drag_and_drop/helpers'; -import { HIGHLIGHTED_DROP_TARGET_CLASS_NAME } from '../components/timeline/data_providers/empty'; -import { EMPTY_PROVIDERS_GROUP_CLASS_NAME } from '../components/timeline/data_providers/providers'; +import { HIGHLIGHTED_DROP_TARGET_CLASS_NAME } from '../../timelines/components/timeline/data_providers/empty'; +import { EMPTY_PROVIDERS_GROUP_CLASS_NAME } from '../../timelines/components/timeline/data_providers/providers'; let _sensorApiSingleton: SensorAPI; diff --git a/x-pack/plugins/siem/public/hooks/use_index_patterns.tsx b/x-pack/plugins/siem/public/common/hooks/use_index_patterns.tsx similarity index 100% rename from x-pack/plugins/siem/public/hooks/use_index_patterns.tsx rename to x-pack/plugins/siem/public/common/hooks/use_index_patterns.tsx diff --git a/x-pack/plugins/siem/public/hooks/use_providers_portal.tsx b/x-pack/plugins/siem/public/common/hooks/use_providers_portal.tsx similarity index 100% rename from x-pack/plugins/siem/public/hooks/use_providers_portal.tsx rename to x-pack/plugins/siem/public/common/hooks/use_providers_portal.tsx diff --git a/x-pack/plugins/siem/public/lib/clipboard/clipboard.tsx b/x-pack/plugins/siem/public/common/lib/clipboard/clipboard.tsx similarity index 100% rename from x-pack/plugins/siem/public/lib/clipboard/clipboard.tsx rename to x-pack/plugins/siem/public/common/lib/clipboard/clipboard.tsx diff --git a/x-pack/plugins/siem/public/lib/clipboard/translations.ts b/x-pack/plugins/siem/public/common/lib/clipboard/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/lib/clipboard/translations.ts rename to x-pack/plugins/siem/public/common/lib/clipboard/translations.ts diff --git a/x-pack/plugins/siem/public/lib/clipboard/with_copy_to_clipboard.tsx b/x-pack/plugins/siem/public/common/lib/clipboard/with_copy_to_clipboard.tsx similarity index 100% rename from x-pack/plugins/siem/public/lib/clipboard/with_copy_to_clipboard.tsx rename to x-pack/plugins/siem/public/common/lib/clipboard/with_copy_to_clipboard.tsx diff --git a/x-pack/plugins/siem/public/lib/compose/helpers.test.ts b/x-pack/plugins/siem/public/common/lib/compose/helpers.test.ts similarity index 94% rename from x-pack/plugins/siem/public/lib/compose/helpers.test.ts rename to x-pack/plugins/siem/public/common/lib/compose/helpers.test.ts index af4521b4f6e2c..4a3d734d0a6d4 100644 --- a/x-pack/plugins/siem/public/lib/compose/helpers.test.ts +++ b/x-pack/plugins/siem/public/common/lib/compose/helpers.test.ts @@ -9,7 +9,7 @@ import { errorLink, reTryOneTimeOnErrorLink } from '../../containers/errors'; import { getLinks } from './helpers'; import { withClientState } from 'apollo-link-state'; import * as apolloLinkHttp from 'apollo-link-http'; -import introspectionQueryResultData from '../../graphql/introspection.json'; +import introspectionQueryResultData from '../../../graphql/introspection.json'; jest.mock('apollo-cache-inmemory'); jest.mock('apollo-link-http'); diff --git a/x-pack/plugins/siem/public/lib/compose/helpers.ts b/x-pack/plugins/siem/public/common/lib/compose/helpers.ts similarity index 100% rename from x-pack/plugins/siem/public/lib/compose/helpers.ts rename to x-pack/plugins/siem/public/common/lib/compose/helpers.ts diff --git a/x-pack/plugins/siem/public/lib/compose/kibana_compose.tsx b/x-pack/plugins/siem/public/common/lib/compose/kibana_compose.tsx similarity index 83% rename from x-pack/plugins/siem/public/lib/compose/kibana_compose.tsx rename to x-pack/plugins/siem/public/common/lib/compose/kibana_compose.tsx index fb30c9a5411ed..f7c7c65318482 100644 --- a/x-pack/plugins/siem/public/lib/compose/kibana_compose.tsx +++ b/x-pack/plugins/siem/public/common/lib/compose/kibana_compose.tsx @@ -8,8 +8,9 @@ import { InMemoryCache, IntrospectionFragmentMatcher } from 'apollo-cache-inmemo import ApolloClient from 'apollo-client'; import { ApolloLink } from 'apollo-link'; -import { CoreStart } from '../../../../../../src/core/public'; -import introspectionQueryResultData from '../../graphql/introspection.json'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { CoreStart } from '../../../../../../../src/core/public'; +import introspectionQueryResultData from '../../../graphql/introspection.json'; import { AppFrontendLibs } from '../lib'; import { getLinks } from './helpers'; diff --git a/x-pack/plugins/siem/public/lib/connectors/components/connector_flyout/index.tsx b/x-pack/plugins/siem/public/common/lib/connectors/components/connector_flyout/index.tsx similarity index 94% rename from x-pack/plugins/siem/public/lib/connectors/components/connector_flyout/index.tsx rename to x-pack/plugins/siem/public/common/lib/connectors/components/connector_flyout/index.tsx index 10b1e75c6ea84..246a7cced37e5 100644 --- a/x-pack/plugins/siem/public/lib/connectors/components/connector_flyout/index.tsx +++ b/x-pack/plugins/siem/public/common/lib/connectors/components/connector_flyout/index.tsx @@ -10,10 +10,10 @@ import { EuiFieldText, EuiFlexGroup, EuiFlexItem, EuiFormRow, EuiSpacer } from ' import { isEmpty, get } from 'lodash/fp'; // eslint-disable-next-line @kbn/eslint/no-restricted-paths -import { ActionConnectorFieldsProps } from '../../../../../../triggers_actions_ui/public/types'; -import { FieldMapping } from '../../../../pages/case/components/configure_cases/field_mapping'; +import { ActionConnectorFieldsProps } from '../../../../../../../triggers_actions_ui/public/types'; +import { FieldMapping } from '../../../../../cases/components/configure_cases/field_mapping'; -import { CasesConfigurationMapping } from '../../../../containers/case/configure/types'; +import { CasesConfigurationMapping } from '../../../../../cases/containers/configure/types'; import * as i18n from '../../translations'; import { ActionConnector, ConnectorFlyoutHOCProps } from '../../types'; diff --git a/x-pack/plugins/siem/public/lib/connectors/config.ts b/x-pack/plugins/siem/public/common/lib/connectors/config.ts similarity index 100% rename from x-pack/plugins/siem/public/lib/connectors/config.ts rename to x-pack/plugins/siem/public/common/lib/connectors/config.ts diff --git a/x-pack/plugins/siem/public/lib/connectors/index.ts b/x-pack/plugins/siem/public/common/lib/connectors/index.ts similarity index 100% rename from x-pack/plugins/siem/public/lib/connectors/index.ts rename to x-pack/plugins/siem/public/common/lib/connectors/index.ts diff --git a/x-pack/plugins/siem/public/lib/connectors/jira/config.ts b/x-pack/plugins/siem/public/common/lib/connectors/jira/config.ts similarity index 100% rename from x-pack/plugins/siem/public/lib/connectors/jira/config.ts rename to x-pack/plugins/siem/public/common/lib/connectors/jira/config.ts diff --git a/x-pack/plugins/siem/public/lib/connectors/jira/flyout.tsx b/x-pack/plugins/siem/public/common/lib/connectors/jira/flyout.tsx similarity index 100% rename from x-pack/plugins/siem/public/lib/connectors/jira/flyout.tsx rename to x-pack/plugins/siem/public/common/lib/connectors/jira/flyout.tsx diff --git a/x-pack/plugins/siem/public/lib/connectors/jira/index.tsx b/x-pack/plugins/siem/public/common/lib/connectors/jira/index.tsx similarity index 95% rename from x-pack/plugins/siem/public/lib/connectors/jira/index.tsx rename to x-pack/plugins/siem/public/common/lib/connectors/jira/index.tsx index 049ccb7cf17b7..f7e293d9ad2f8 100644 --- a/x-pack/plugins/siem/public/lib/connectors/jira/index.tsx +++ b/x-pack/plugins/siem/public/common/lib/connectors/jira/index.tsx @@ -8,7 +8,7 @@ import { lazy } from 'react'; import { ValidationResult, // eslint-disable-next-line @kbn/eslint/no-restricted-paths -} from '../../../../../triggers_actions_ui/public/types'; +} from '../../../../../../triggers_actions_ui/public/types'; import { connector } from './config'; import { createActionType } from '../utils'; diff --git a/x-pack/plugins/siem/public/lib/connectors/jira/logo.svg b/x-pack/plugins/siem/public/common/lib/connectors/jira/logo.svg similarity index 100% rename from x-pack/plugins/siem/public/lib/connectors/jira/logo.svg rename to x-pack/plugins/siem/public/common/lib/connectors/jira/logo.svg diff --git a/x-pack/plugins/siem/public/lib/connectors/jira/translations.ts b/x-pack/plugins/siem/public/common/lib/connectors/jira/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/lib/connectors/jira/translations.ts rename to x-pack/plugins/siem/public/common/lib/connectors/jira/translations.ts diff --git a/x-pack/plugins/siem/public/lib/connectors/jira/types.ts b/x-pack/plugins/siem/public/common/lib/connectors/jira/types.ts similarity index 78% rename from x-pack/plugins/siem/public/lib/connectors/jira/types.ts rename to x-pack/plugins/siem/public/common/lib/connectors/jira/types.ts index d6b8a6cadcb90..fafb4a0d41fb3 100644 --- a/x-pack/plugins/siem/public/lib/connectors/jira/types.ts +++ b/x-pack/plugins/siem/public/common/lib/connectors/jira/types.ts @@ -10,9 +10,9 @@ import { JiraPublicConfigurationType, JiraSecretConfigurationType, -} from '../../../../../actions/server/builtin_action_types/jira/types'; +} from '../../../../../../actions/server/builtin_action_types/jira/types'; -export { JiraFieldsType } from '../../../../../case/common/api/connectors'; +export { JiraFieldsType } from '../../../../../../case/common/api/connectors'; export * from '../types'; diff --git a/x-pack/plugins/siem/public/lib/connectors/servicenow/config.ts b/x-pack/plugins/siem/public/common/lib/connectors/servicenow/config.ts similarity index 100% rename from x-pack/plugins/siem/public/lib/connectors/servicenow/config.ts rename to x-pack/plugins/siem/public/common/lib/connectors/servicenow/config.ts diff --git a/x-pack/plugins/siem/public/lib/connectors/servicenow/flyout.tsx b/x-pack/plugins/siem/public/common/lib/connectors/servicenow/flyout.tsx similarity index 100% rename from x-pack/plugins/siem/public/lib/connectors/servicenow/flyout.tsx rename to x-pack/plugins/siem/public/common/lib/connectors/servicenow/flyout.tsx diff --git a/x-pack/plugins/siem/public/lib/connectors/servicenow/index.tsx b/x-pack/plugins/siem/public/common/lib/connectors/servicenow/index.tsx similarity index 95% rename from x-pack/plugins/siem/public/lib/connectors/servicenow/index.tsx rename to x-pack/plugins/siem/public/common/lib/connectors/servicenow/index.tsx index 0a239648271d1..c9c5298365e81 100644 --- a/x-pack/plugins/siem/public/lib/connectors/servicenow/index.tsx +++ b/x-pack/plugins/siem/public/common/lib/connectors/servicenow/index.tsx @@ -8,7 +8,7 @@ import { lazy } from 'react'; import { ValidationResult, // eslint-disable-next-line @kbn/eslint/no-restricted-paths -} from '../../../../../triggers_actions_ui/public/types'; +} from '../../../../../../triggers_actions_ui/public/types'; import { connector } from './config'; import { createActionType } from '../utils'; import logo from './logo.svg'; diff --git a/x-pack/plugins/siem/public/lib/connectors/servicenow/logo.svg b/x-pack/plugins/siem/public/common/lib/connectors/servicenow/logo.svg similarity index 100% rename from x-pack/plugins/siem/public/lib/connectors/servicenow/logo.svg rename to x-pack/plugins/siem/public/common/lib/connectors/servicenow/logo.svg diff --git a/x-pack/plugins/siem/public/lib/connectors/servicenow/translations.ts b/x-pack/plugins/siem/public/common/lib/connectors/servicenow/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/lib/connectors/servicenow/translations.ts rename to x-pack/plugins/siem/public/common/lib/connectors/servicenow/translations.ts diff --git a/x-pack/plugins/siem/public/lib/connectors/servicenow/types.ts b/x-pack/plugins/siem/public/common/lib/connectors/servicenow/types.ts similarity index 78% rename from x-pack/plugins/siem/public/lib/connectors/servicenow/types.ts rename to x-pack/plugins/siem/public/common/lib/connectors/servicenow/types.ts index 43da5624a497b..b4a80e28c8d15 100644 --- a/x-pack/plugins/siem/public/lib/connectors/servicenow/types.ts +++ b/x-pack/plugins/siem/public/common/lib/connectors/servicenow/types.ts @@ -10,9 +10,9 @@ import { ServiceNowPublicConfigurationType, ServiceNowSecretConfigurationType, -} from '../../../../../actions/server/builtin_action_types/servicenow/types'; +} from '../../../../../../actions/server/builtin_action_types/servicenow/types'; -export { ServiceNowFieldsType } from '../../../../../case/common/api/connectors'; +export { ServiceNowFieldsType } from '../../../../../../case/common/api/connectors'; export * from '../types'; diff --git a/x-pack/plugins/siem/public/lib/connectors/translations.ts b/x-pack/plugins/siem/public/common/lib/connectors/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/lib/connectors/translations.ts rename to x-pack/plugins/siem/public/common/lib/connectors/translations.ts diff --git a/x-pack/plugins/siem/public/lib/connectors/types.ts b/x-pack/plugins/siem/public/common/lib/connectors/types.ts similarity index 82% rename from x-pack/plugins/siem/public/lib/connectors/types.ts rename to x-pack/plugins/siem/public/common/lib/connectors/types.ts index 3d3692c9806e4..1d688ad9b1d6a 100644 --- a/x-pack/plugins/siem/public/lib/connectors/types.ts +++ b/x-pack/plugins/siem/public/common/lib/connectors/types.ts @@ -7,13 +7,16 @@ /* eslint-disable no-restricted-imports */ /* eslint-disable @kbn/eslint/no-restricted-paths */ -import { ActionType } from '../../../../triggers_actions_ui/public'; -import { IErrorObject } from '../../../../triggers_actions_ui/public/types'; -import { ExternalIncidentServiceConfiguration } from '../../../../actions/server/builtin_action_types/case/types'; +import { ActionType } from '../../../../../triggers_actions_ui/public'; +import { IErrorObject } from '../../../../../triggers_actions_ui/public/types'; +import { ExternalIncidentServiceConfiguration } from '../../../../../actions/server/builtin_action_types/case/types'; -import { ActionType as ThirdPartySupportedActions, CaseField } from '../../../../case/common/api'; +import { + ActionType as ThirdPartySupportedActions, + CaseField, +} from '../../../../../case/common/api'; -export { ThirdPartyField as AllThirdPartyFields } from '../../../../case/common/api'; +export { ThirdPartyField as AllThirdPartyFields } from '../../../../../case/common/api'; export interface ThirdPartyField { label: string; diff --git a/x-pack/plugins/siem/public/lib/connectors/utils.ts b/x-pack/plugins/siem/public/common/lib/connectors/utils.ts similarity index 93% rename from x-pack/plugins/siem/public/lib/connectors/utils.ts rename to x-pack/plugins/siem/public/common/lib/connectors/utils.ts index cc1608a05e2ce..b9c90a593b202 100644 --- a/x-pack/plugins/siem/public/lib/connectors/utils.ts +++ b/x-pack/plugins/siem/public/common/lib/connectors/utils.ts @@ -8,7 +8,7 @@ import { ActionTypeModel, ValidationResult, // eslint-disable-next-line @kbn/eslint/no-restricted-paths -} from '../../../../triggers_actions_ui/public/types'; +} from '../../../../../triggers_actions_ui/public/types'; import { ActionConnector, @@ -20,7 +20,7 @@ import { import { isUrlInvalid } from './validators'; import * as i18n from './translations'; -import { CasesConfigurationMapping } from '../../containers/case/configure/types'; +import { CasesConfigurationMapping } from '../../../cases/containers/configure/types'; export const createActionType = ({ id, diff --git a/x-pack/plugins/siem/public/lib/connectors/validators.ts b/x-pack/plugins/siem/public/common/lib/connectors/validators.ts similarity index 100% rename from x-pack/plugins/siem/public/lib/connectors/validators.ts rename to x-pack/plugins/siem/public/common/lib/connectors/validators.ts diff --git a/x-pack/plugins/siem/public/lib/helpers/index.test.tsx b/x-pack/plugins/siem/public/common/lib/helpers/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/lib/helpers/index.test.tsx rename to x-pack/plugins/siem/public/common/lib/helpers/index.test.tsx diff --git a/x-pack/plugins/siem/public/lib/helpers/index.tsx b/x-pack/plugins/siem/public/common/lib/helpers/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/lib/helpers/index.tsx rename to x-pack/plugins/siem/public/common/lib/helpers/index.tsx diff --git a/x-pack/plugins/siem/public/lib/helpers/scheduler.ts b/x-pack/plugins/siem/public/common/lib/helpers/scheduler.ts similarity index 100% rename from x-pack/plugins/siem/public/lib/helpers/scheduler.ts rename to x-pack/plugins/siem/public/common/lib/helpers/scheduler.ts diff --git a/x-pack/plugins/siem/public/lib/history/index.ts b/x-pack/plugins/siem/public/common/lib/history/index.ts similarity index 100% rename from x-pack/plugins/siem/public/lib/history/index.ts rename to x-pack/plugins/siem/public/common/lib/history/index.ts diff --git a/x-pack/plugins/siem/public/lib/keury/index.test.ts b/x-pack/plugins/siem/public/common/lib/keury/index.test.ts similarity index 100% rename from x-pack/plugins/siem/public/lib/keury/index.test.ts rename to x-pack/plugins/siem/public/common/lib/keury/index.test.ts diff --git a/x-pack/plugins/siem/public/lib/keury/index.ts b/x-pack/plugins/siem/public/common/lib/keury/index.ts similarity index 95% rename from x-pack/plugins/siem/public/lib/keury/index.ts rename to x-pack/plugins/siem/public/common/lib/keury/index.ts index 810baa89cd60d..53f845de48fb3 100644 --- a/x-pack/plugins/siem/public/lib/keury/index.ts +++ b/x-pack/plugins/siem/public/common/lib/keury/index.ts @@ -12,9 +12,9 @@ import { esQuery, esKuery, IIndexPattern, -} from '../../../../../../src/plugins/data/public'; +} from '../../../../../../../src/plugins/data/public'; -import { JsonObject } from '../../../../../../src/plugins/kibana_utils/public'; +import { JsonObject } from '../../../../../../../src/plugins/kibana_utils/public'; import { KueryFilterQuery } from '../../store'; diff --git a/x-pack/plugins/siem/public/lib/kibana/__mocks__/index.ts b/x-pack/plugins/siem/public/common/lib/kibana/__mocks__/index.ts similarity index 100% rename from x-pack/plugins/siem/public/lib/kibana/__mocks__/index.ts rename to x-pack/plugins/siem/public/common/lib/kibana/__mocks__/index.ts diff --git a/x-pack/plugins/siem/public/lib/kibana/hooks.ts b/x-pack/plugins/siem/public/common/lib/kibana/hooks.ts similarity index 95% rename from x-pack/plugins/siem/public/lib/kibana/hooks.ts rename to x-pack/plugins/siem/public/common/lib/kibana/hooks.ts index d62701fe5944a..ebdefa66b0ef3 100644 --- a/x-pack/plugins/siem/public/lib/kibana/hooks.ts +++ b/x-pack/plugins/siem/public/common/lib/kibana/hooks.ts @@ -8,11 +8,11 @@ import moment from 'moment-timezone'; import { useCallback, useEffect, useState } from 'react'; import { i18n } from '@kbn/i18n'; -import { DEFAULT_DATE_FORMAT, DEFAULT_DATE_FORMAT_TZ } from '../../../common/constants'; +import { DEFAULT_DATE_FORMAT, DEFAULT_DATE_FORMAT_TZ } from '../../../../common/constants'; import { useUiSetting, useKibana } from './kibana_react'; import { errorToToaster, useStateToaster } from '../../components/toasters'; -import { AuthenticatedUser } from '../../../../security/common/model'; -import { convertToCamelCase } from '../../containers/case/utils'; +import { AuthenticatedUser } from '../../../../../security/common/model'; +import { convertToCamelCase } from '../../../cases/containers/utils'; export const useDateFormat = (): string => useUiSetting(DEFAULT_DATE_FORMAT); diff --git a/x-pack/plugins/siem/public/lib/kibana/index.ts b/x-pack/plugins/siem/public/common/lib/kibana/index.ts similarity index 100% rename from x-pack/plugins/siem/public/lib/kibana/index.ts rename to x-pack/plugins/siem/public/common/lib/kibana/index.ts diff --git a/x-pack/plugins/siem/public/lib/kibana/kibana_react.ts b/x-pack/plugins/siem/public/common/lib/kibana/kibana_react.ts similarity index 86% rename from x-pack/plugins/siem/public/lib/kibana/kibana_react.ts rename to x-pack/plugins/siem/public/common/lib/kibana/kibana_react.ts index 88be8d25e5840..42738c6bbe7d8 100644 --- a/x-pack/plugins/siem/public/lib/kibana/kibana_react.ts +++ b/x-pack/plugins/siem/public/common/lib/kibana/kibana_react.ts @@ -11,8 +11,8 @@ import { useUiSetting, useUiSetting$, withKibana, -} from '../../../../../../src/plugins/kibana_react/public'; -import { StartServices } from '../../plugin'; +} from '../../../../../../../src/plugins/kibana_react/public'; +import { StartServices } from '../../../plugin'; export type KibanaContext = KibanaReactContextValue; export interface WithKibanaProps { diff --git a/x-pack/plugins/siem/public/lib/kibana/services.ts b/x-pack/plugins/siem/public/common/lib/kibana/services.ts similarity index 89% rename from x-pack/plugins/siem/public/lib/kibana/services.ts rename to x-pack/plugins/siem/public/common/lib/kibana/services.ts index 4ab3e102f56ab..8a8138691ba17 100644 --- a/x-pack/plugins/siem/public/lib/kibana/services.ts +++ b/x-pack/plugins/siem/public/common/lib/kibana/services.ts @@ -4,7 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import { CoreStart } from '../../../../../../src/core/public'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { CoreStart } from '../../../../../../../src/core/public'; type GlobalServices = Pick; diff --git a/x-pack/plugins/siem/public/lib/lib.ts b/x-pack/plugins/siem/public/common/lib/lib.ts similarity index 100% rename from x-pack/plugins/siem/public/lib/lib.ts rename to x-pack/plugins/siem/public/common/lib/lib.ts diff --git a/x-pack/plugins/siem/public/lib/note/index.ts b/x-pack/plugins/siem/public/common/lib/note/index.ts similarity index 100% rename from x-pack/plugins/siem/public/lib/note/index.ts rename to x-pack/plugins/siem/public/common/lib/note/index.ts diff --git a/x-pack/plugins/siem/public/lib/telemetry/index.ts b/x-pack/plugins/siem/public/common/lib/telemetry/index.ts similarity index 96% rename from x-pack/plugins/siem/public/lib/telemetry/index.ts rename to x-pack/plugins/siem/public/common/lib/telemetry/index.ts index 37d181e9b8ad7..0ed524c2ae548 100644 --- a/x-pack/plugins/siem/public/lib/telemetry/index.ts +++ b/x-pack/plugins/siem/public/common/lib/telemetry/index.ts @@ -6,7 +6,7 @@ import { METRIC_TYPE, UiStatsMetricType } from '@kbn/analytics'; -import { SetupPlugins } from '../../plugin'; +import { SetupPlugins } from '../../../plugin'; export { telemetryMiddleware } from './middleware'; export { METRIC_TYPE }; diff --git a/x-pack/plugins/siem/public/lib/telemetry/middleware.ts b/x-pack/plugins/siem/public/common/lib/telemetry/middleware.ts similarity index 91% rename from x-pack/plugins/siem/public/lib/telemetry/middleware.ts rename to x-pack/plugins/siem/public/common/lib/telemetry/middleware.ts index ca889e20e695f..87acdddf87ed7 100644 --- a/x-pack/plugins/siem/public/lib/telemetry/middleware.ts +++ b/x-pack/plugins/siem/public/common/lib/telemetry/middleware.ts @@ -7,7 +7,7 @@ import { Action, Dispatch, MiddlewareAPI } from 'redux'; import { track, METRIC_TYPE, TELEMETRY_EVENT } from './'; -import * as timelineActions from '../../store/timeline/actions'; +import * as timelineActions from '../../../timelines/store/timeline/actions'; export const telemetryMiddleware = (api: MiddlewareAPI) => (next: Dispatch) => (action: Action) => { if (timelineActions.endTimelineSaving.match(action)) { diff --git a/x-pack/plugins/siem/public/lib/theme/use_eui_theme.tsx b/x-pack/plugins/siem/public/common/lib/theme/use_eui_theme.tsx similarity index 89% rename from x-pack/plugins/siem/public/lib/theme/use_eui_theme.tsx rename to x-pack/plugins/siem/public/common/lib/theme/use_eui_theme.tsx index 1696001203bc8..23dae0d019f30 100644 --- a/x-pack/plugins/siem/public/lib/theme/use_eui_theme.tsx +++ b/x-pack/plugins/siem/public/common/lib/theme/use_eui_theme.tsx @@ -7,7 +7,7 @@ import darkTheme from '@elastic/eui/dist/eui_theme_dark.json'; import lightTheme from '@elastic/eui/dist/eui_theme_light.json'; -import { DEFAULT_DARK_MODE } from '../../../common/constants'; +import { DEFAULT_DARK_MODE } from '../../../../common/constants'; import { useUiSetting$ } from '../kibana'; export const useEuiTheme = () => { diff --git a/x-pack/plugins/siem/public/mock/global_state.ts b/x-pack/plugins/siem/public/common/mock/global_state.ts similarity index 95% rename from x-pack/plugins/siem/public/mock/global_state.ts rename to x-pack/plugins/siem/public/common/mock/global_state.ts index d0223b7834db0..e215aa7403ec9 100644 --- a/x-pack/plugins/siem/public/mock/global_state.ts +++ b/x-pack/plugins/siem/public/common/mock/global_state.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { DEFAULT_TIMELINE_WIDTH } from '../components/timeline/body/constants'; +import { DEFAULT_TIMELINE_WIDTH } from '../../timelines/components/timeline/body/constants'; import { Direction, FlowTarget, @@ -13,8 +13,8 @@ import { NetworkTopTablesFields, TlsFields, UsersFields, -} from '../graphql/types'; -import { networkModel, State } from '../store'; +} from '../../graphql/types'; +import { State } from '../store'; import { defaultHeaders } from './header'; import { @@ -22,8 +22,9 @@ import { DEFAULT_TO, DEFAULT_INTERVAL_TYPE, DEFAULT_INTERVAL_VALUE, -} from '../../common/constants'; -import { TimelineType } from '../../common/types/timeline'; +} from '../../../common/constants'; +import { networkModel } from '../../network/store'; +import { TimelineType } from '../../../common/types/timeline'; export const mockGlobalState: State = { app: { diff --git a/x-pack/plugins/siem/public/mock/header.ts b/x-pack/plugins/siem/public/common/mock/header.ts similarity index 94% rename from x-pack/plugins/siem/public/mock/header.ts rename to x-pack/plugins/siem/public/common/mock/header.ts index 61af5a5f098b5..51636e1efb254 100644 --- a/x-pack/plugins/siem/public/mock/header.ts +++ b/x-pack/plugins/siem/public/common/mock/header.ts @@ -3,12 +3,12 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import { ColumnHeaderOptions } from '../store/timeline/model'; -import { defaultColumnHeaderType } from '../components/timeline/body/column_headers/default_headers'; +import { ColumnHeaderOptions } from '../../timelines/store/timeline/model'; +import { defaultColumnHeaderType } from '../../timelines/components/timeline/body/column_headers/default_headers'; import { DEFAULT_COLUMN_MIN_WIDTH, DEFAULT_DATE_COLUMN_MIN_WIDTH, -} from '../components/timeline/body/constants'; +} from '../../timelines/components/timeline/body/constants'; export const defaultHeaders: ColumnHeaderOptions[] = [ { diff --git a/x-pack/plugins/siem/public/mock/hook_wrapper.tsx b/x-pack/plugins/siem/public/common/mock/hook_wrapper.tsx similarity index 100% rename from x-pack/plugins/siem/public/mock/hook_wrapper.tsx rename to x-pack/plugins/siem/public/common/mock/hook_wrapper.tsx diff --git a/x-pack/plugins/siem/public/mock/index.ts b/x-pack/plugins/siem/public/common/mock/index.ts similarity index 100% rename from x-pack/plugins/siem/public/mock/index.ts rename to x-pack/plugins/siem/public/common/mock/index.ts diff --git a/x-pack/plugins/siem/public/mock/index_pattern.ts b/x-pack/plugins/siem/public/common/mock/index_pattern.ts similarity index 100% rename from x-pack/plugins/siem/public/mock/index_pattern.ts rename to x-pack/plugins/siem/public/common/mock/index_pattern.ts diff --git a/x-pack/plugins/siem/public/mock/kibana_core.ts b/x-pack/plugins/siem/public/common/mock/kibana_core.ts similarity index 66% rename from x-pack/plugins/siem/public/mock/kibana_core.ts rename to x-pack/plugins/siem/public/common/mock/kibana_core.ts index b175ddbf5106d..e82c37e3a5b66 100644 --- a/x-pack/plugins/siem/public/mock/kibana_core.ts +++ b/x-pack/plugins/siem/public/common/mock/kibana_core.ts @@ -4,8 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ -import { coreMock } from '../../../../../src/core/public/mocks'; -import { dataPluginMock } from '../../../../../src/plugins/data/public/mocks'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths +import { coreMock } from '../../../../../../src/core/public/mocks'; +import { dataPluginMock } from '../../../../../../src/plugins/data/public/mocks'; export const createKibanaCoreStartMock = () => coreMock.createStart(); export const createKibanaPluginsStartMock = () => ({ diff --git a/x-pack/plugins/siem/public/mock/kibana_react.ts b/x-pack/plugins/siem/public/common/mock/kibana_react.ts similarity index 95% rename from x-pack/plugins/siem/public/mock/kibana_react.ts rename to x-pack/plugins/siem/public/common/mock/kibana_react.ts index cebba3e237f98..0c51d39257a97 100644 --- a/x-pack/plugins/siem/public/mock/kibana_react.ts +++ b/x-pack/plugins/siem/public/common/mock/kibana_react.ts @@ -7,7 +7,7 @@ /* eslint-disable react/display-name */ import React from 'react'; -import { KibanaContextProvider } from '../../../../../src/plugins/kibana_react/public'; +import { KibanaContextProvider } from '../../../../../../src/plugins/kibana_react/public'; import { DEFAULT_SIEM_TIME_RANGE, @@ -24,7 +24,7 @@ import { DEFAULT_INTERVAL_VALUE, DEFAULT_BYTES_FORMAT, DEFAULT_INDEX_PATTERN, -} from '../../common/constants'; +} from '../../../common/constants'; import { createKibanaCoreStartMock, createKibanaPluginsStartMock } from './kibana_core'; // eslint-disable-next-line @typescript-eslint/no-explicit-any diff --git a/x-pack/plugins/siem/public/mock/match_media.ts b/x-pack/plugins/siem/public/common/mock/match_media.ts similarity index 100% rename from x-pack/plugins/siem/public/mock/match_media.ts rename to x-pack/plugins/siem/public/common/mock/match_media.ts diff --git a/x-pack/plugins/siem/public/mock/mock_detail_item.ts b/x-pack/plugins/siem/public/common/mock/mock_detail_item.ts similarity index 98% rename from x-pack/plugins/siem/public/mock/mock_detail_item.ts rename to x-pack/plugins/siem/public/common/mock/mock_detail_item.ts index c25428649d563..2395010a0ba2e 100644 --- a/x-pack/plugins/siem/public/mock/mock_detail_item.ts +++ b/x-pack/plugins/siem/public/common/mock/mock_detail_item.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { DetailItem } from '../graphql/types'; +import { DetailItem } from '../../graphql/types'; export const mockDetailItemDataId = 'Y-6TfmcB0WOhS6qyMv3s'; diff --git a/x-pack/plugins/siem/public/mock/mock_ecs.ts b/x-pack/plugins/siem/public/common/mock/mock_ecs.ts similarity index 99% rename from x-pack/plugins/siem/public/mock/mock_ecs.ts rename to x-pack/plugins/siem/public/common/mock/mock_ecs.ts index 59e26039e6bff..7fbbabb29da1b 100644 --- a/x-pack/plugins/siem/public/mock/mock_ecs.ts +++ b/x-pack/plugins/siem/public/common/mock/mock_ecs.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { Ecs } from '../graphql/types'; +import { Ecs } from '../../graphql/types'; export const mockEcsData: Ecs[] = [ { diff --git a/x-pack/plugins/siem/public/mock/mock_endgame_ecs_data.ts b/x-pack/plugins/siem/public/common/mock/mock_endgame_ecs_data.ts similarity index 99% rename from x-pack/plugins/siem/public/mock/mock_endgame_ecs_data.ts rename to x-pack/plugins/siem/public/common/mock/mock_endgame_ecs_data.ts index e6eee3d1c1cb1..9b2cd14499db4 100644 --- a/x-pack/plugins/siem/public/mock/mock_endgame_ecs_data.ts +++ b/x-pack/plugins/siem/public/common/mock/mock_endgame_ecs_data.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { Ecs } from '../graphql/types'; +import { Ecs } from '../../graphql/types'; export const mockEndgameDnsRequest: Ecs = { _id: 'S8jPcG0BOpWiDweSou3g', diff --git a/x-pack/plugins/siem/public/mock/mock_timeline_data.ts b/x-pack/plugins/siem/public/common/mock/mock_timeline_data.ts similarity index 99% rename from x-pack/plugins/siem/public/mock/mock_timeline_data.ts rename to x-pack/plugins/siem/public/common/mock/mock_timeline_data.ts index b300053d5f227..7503062300d2d 100644 --- a/x-pack/plugins/siem/public/mock/mock_timeline_data.ts +++ b/x-pack/plugins/siem/public/common/mock/mock_timeline_data.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { Ecs, TimelineItem } from '../graphql/types'; +import { Ecs, TimelineItem } from '../../graphql/types'; export const mockTimelineData: TimelineItem[] = [ { diff --git a/x-pack/plugins/siem/public/mock/netflow.ts b/x-pack/plugins/siem/public/common/mock/netflow.ts similarity index 92% rename from x-pack/plugins/siem/public/mock/netflow.ts rename to x-pack/plugins/siem/public/common/mock/netflow.ts index 333188cca4b7e..4dad794533374 100644 --- a/x-pack/plugins/siem/public/mock/netflow.ts +++ b/x-pack/plugins/siem/public/common/mock/netflow.ts @@ -4,8 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ONE_MILLISECOND_AS_NANOSECONDS } from '../components/formatted_duration/helpers'; -import { Ecs } from '../graphql/types'; +import { ONE_MILLISECOND_AS_NANOSECONDS } from '../../timelines/components/formatted_duration/helpers'; +import { Ecs } from '../../graphql/types'; /** Returns mock data for testing the Netflow component */ export const getMockNetflowData = (): Ecs => ({ diff --git a/x-pack/plugins/siem/public/mock/news.ts b/x-pack/plugins/siem/public/common/mock/news.ts similarity index 100% rename from x-pack/plugins/siem/public/mock/news.ts rename to x-pack/plugins/siem/public/common/mock/news.ts diff --git a/x-pack/plugins/siem/public/mock/raw_news.ts b/x-pack/plugins/siem/public/common/mock/raw_news.ts similarity index 100% rename from x-pack/plugins/siem/public/mock/raw_news.ts rename to x-pack/plugins/siem/public/common/mock/raw_news.ts diff --git a/x-pack/plugins/siem/public/mock/test_providers.tsx b/x-pack/plugins/siem/public/common/mock/test_providers.tsx similarity index 92% rename from x-pack/plugins/siem/public/mock/test_providers.tsx rename to x-pack/plugins/siem/public/common/mock/test_providers.tsx index 59e3874c6d0a1..679e0bdc14cd5 100644 --- a/x-pack/plugins/siem/public/mock/test_providers.tsx +++ b/x-pack/plugins/siem/public/common/mock/test_providers.tsx @@ -20,7 +20,8 @@ import { ThemeProvider } from 'styled-components'; import { createStore, State } from '../store'; import { mockGlobalState } from './global_state'; import { createKibanaContextProviderMock } from './kibana_react'; -import { FieldHook, useForm } from '../shared_imports'; +import { FieldHook, useForm } from '../../shared_imports'; +import { SUB_PLUGINS_REDUCER } from './utils'; const state: State = mockGlobalState; @@ -62,7 +63,7 @@ const MockKibanaContextProvider = createKibanaContextProviderMock(); /** A utility for wrapping children in the providers required to run most tests */ const TestProvidersComponent: React.FC = ({ children, - store = createStore(state, apolloClientObservable), + store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable), onDragEnd = jest.fn(), }) => ( @@ -82,7 +83,7 @@ export const TestProviders = React.memo(TestProvidersComponent); const TestProviderWithoutDragAndDropComponent: React.FC = ({ children, - store = createStore(state, apolloClientObservable), + store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable), }) => ( {children} diff --git a/x-pack/plugins/siem/public/mock/timeline_results.ts b/x-pack/plugins/siem/public/common/mock/timeline_results.ts similarity index 99% rename from x-pack/plugins/siem/public/mock/timeline_results.ts rename to x-pack/plugins/siem/public/common/mock/timeline_results.ts index 1af0f533a7ca9..b1a9b65874edc 100644 --- a/x-pack/plugins/siem/public/mock/timeline_results.ts +++ b/x-pack/plugins/siem/public/common/mock/timeline_results.ts @@ -3,16 +3,16 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import { FilterStateStore } from '../../../../../src/plugins/data/common/es_query/filters/meta_filter'; +import { FilterStateStore } from '../../../../../../src/plugins/data/common/es_query/filters/meta_filter'; -import { TimelineType } from '../../common/types/timeline'; +import { TimelineType } from '../../../common/types/timeline'; -import { OpenTimelineResult } from '../components/open_timeline/types'; -import { GetAllTimeline, SortFieldTimeline, TimelineResult, Direction } from '../graphql/types'; -import { allTimelinesQuery } from '../containers/timeline/all/index.gql_query'; -import { CreateTimelineProps } from '../pages/detection_engine/components/signals/types'; -import { TimelineModel } from '../store/timeline/model'; -import { timelineDefaults } from '../store/timeline/defaults'; +import { OpenTimelineResult } from '../../timelines/components/open_timeline/types'; +import { GetAllTimeline, SortFieldTimeline, TimelineResult, Direction } from '../../graphql/types'; +import { allTimelinesQuery } from '../../timelines/containers/all/index.gql_query'; +import { CreateTimelineProps } from '../../alerts/components/signals/types'; +import { TimelineModel } from '../../timelines/store/timeline/model'; +import { timelineDefaults } from '../../timelines/store/timeline/defaults'; export interface MockedProvidedQuery { request: { query: GetAllTimeline.Query; diff --git a/x-pack/plugins/siem/public/mock/utils.ts b/x-pack/plugins/siem/public/common/mock/utils.ts similarity index 57% rename from x-pack/plugins/siem/public/mock/utils.ts rename to x-pack/plugins/siem/public/common/mock/utils.ts index 6a372f163a648..2b54bf83c0a9b 100644 --- a/x-pack/plugins/siem/public/mock/utils.ts +++ b/x-pack/plugins/siem/public/common/mock/utils.ts @@ -4,9 +4,19 @@ * you may not use this file except in compliance with the Elastic License. */ +import { hostsReducer } from '../../hosts/store'; +import { networkReducer } from '../../network/store'; +import { timelineReducer } from '../../timelines/store/timeline/reducer'; + interface Global extends NodeJS.Global { // eslint-disable-next-line @typescript-eslint/no-explicit-any window?: any; } export const globalNode: Global = global; + +export const SUB_PLUGINS_REDUCER = { + hosts: hostsReducer, + network: networkReducer, + timeline: timelineReducer, +}; diff --git a/x-pack/plugins/siem/public/store/actions.ts b/x-pack/plugins/siem/public/common/store/actions.ts similarity index 74% rename from x-pack/plugins/siem/public/store/actions.ts rename to x-pack/plugins/siem/public/common/store/actions.ts index 12da695d2966d..8a6c292c4893a 100644 --- a/x-pack/plugins/siem/public/store/actions.ts +++ b/x-pack/plugins/siem/public/common/store/actions.ts @@ -6,7 +6,4 @@ export { appActions } from './app'; export { dragAndDropActions } from './drag_and_drop'; -export { hostsActions } from './hosts'; export { inputsActions } from './inputs'; -export { networkActions } from './network'; -export { timelineActions } from './timeline'; diff --git a/x-pack/plugins/siem/public/store/app/actions.ts b/x-pack/plugins/siem/public/common/store/app/actions.ts similarity index 100% rename from x-pack/plugins/siem/public/store/app/actions.ts rename to x-pack/plugins/siem/public/common/store/app/actions.ts diff --git a/x-pack/plugins/siem/public/store/app/index.ts b/x-pack/plugins/siem/public/common/store/app/index.ts similarity index 100% rename from x-pack/plugins/siem/public/store/app/index.ts rename to x-pack/plugins/siem/public/common/store/app/index.ts diff --git a/x-pack/plugins/siem/public/store/app/model.ts b/x-pack/plugins/siem/public/common/store/app/model.ts similarity index 100% rename from x-pack/plugins/siem/public/store/app/model.ts rename to x-pack/plugins/siem/public/common/store/app/model.ts diff --git a/x-pack/plugins/siem/public/store/app/reducer.ts b/x-pack/plugins/siem/public/common/store/app/reducer.ts similarity index 100% rename from x-pack/plugins/siem/public/store/app/reducer.ts rename to x-pack/plugins/siem/public/common/store/app/reducer.ts diff --git a/x-pack/plugins/siem/public/store/app/selectors.ts b/x-pack/plugins/siem/public/common/store/app/selectors.ts similarity index 100% rename from x-pack/plugins/siem/public/store/app/selectors.ts rename to x-pack/plugins/siem/public/common/store/app/selectors.ts diff --git a/x-pack/plugins/siem/public/store/constants.ts b/x-pack/plugins/siem/public/common/store/constants.ts similarity index 100% rename from x-pack/plugins/siem/public/store/constants.ts rename to x-pack/plugins/siem/public/common/store/constants.ts diff --git a/x-pack/plugins/siem/public/store/drag_and_drop/actions.ts b/x-pack/plugins/siem/public/common/store/drag_and_drop/actions.ts similarity index 86% rename from x-pack/plugins/siem/public/store/drag_and_drop/actions.ts rename to x-pack/plugins/siem/public/common/store/drag_and_drop/actions.ts index 5d3cdc5a126f9..82b544641adcb 100644 --- a/x-pack/plugins/siem/public/store/drag_and_drop/actions.ts +++ b/x-pack/plugins/siem/public/common/store/drag_and_drop/actions.ts @@ -6,7 +6,7 @@ import actionCreatorFactory from 'typescript-fsa'; -import { DataProvider } from '../../components/timeline/data_providers/data_provider'; +import { DataProvider } from '../../../timelines/components/timeline/data_providers/data_provider'; const actionCreator = actionCreatorFactory('x-pack/siem/local/drag_and_drop'); diff --git a/x-pack/plugins/siem/public/store/drag_and_drop/index.ts b/x-pack/plugins/siem/public/common/store/drag_and_drop/index.ts similarity index 100% rename from x-pack/plugins/siem/public/store/drag_and_drop/index.ts rename to x-pack/plugins/siem/public/common/store/drag_and_drop/index.ts diff --git a/x-pack/plugins/siem/public/store/drag_and_drop/model.ts b/x-pack/plugins/siem/public/common/store/drag_and_drop/model.ts similarity index 79% rename from x-pack/plugins/siem/public/store/drag_and_drop/model.ts rename to x-pack/plugins/siem/public/common/store/drag_and_drop/model.ts index 6b6491b32a1d0..e62bf05c042f8 100644 --- a/x-pack/plugins/siem/public/store/drag_and_drop/model.ts +++ b/x-pack/plugins/siem/public/common/store/drag_and_drop/model.ts @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import { DataProvider } from '../../components/timeline/data_providers/data_provider'; +import { DataProvider } from '../../../timelines/components/timeline/data_providers/data_provider'; export interface IdToDataProvider { [id: string]: DataProvider; diff --git a/x-pack/plugins/siem/public/store/drag_and_drop/reducer.test.ts b/x-pack/plugins/siem/public/common/store/drag_and_drop/reducer.test.ts similarity index 85% rename from x-pack/plugins/siem/public/store/drag_and_drop/reducer.test.ts rename to x-pack/plugins/siem/public/common/store/drag_and_drop/reducer.test.ts index e779b990b590e..d89f7beb208d5 100644 --- a/x-pack/plugins/siem/public/store/drag_and_drop/reducer.test.ts +++ b/x-pack/plugins/siem/public/common/store/drag_and_drop/reducer.test.ts @@ -4,8 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import { DataProvider } from '../../components/timeline/data_providers/data_provider'; -import { mockDataProviders } from '../../components/timeline/data_providers/mock/mock_data_providers'; +import { DataProvider } from '../../../timelines/components/timeline/data_providers/data_provider'; +import { mockDataProviders } from '../../../timelines/components/timeline/data_providers/mock/mock_data_providers'; import { IdToDataProvider } from './model'; import { registerProviderHandler, unRegisterProviderHandler } from './reducer'; diff --git a/x-pack/plugins/siem/public/store/drag_and_drop/reducer.ts b/x-pack/plugins/siem/public/common/store/drag_and_drop/reducer.ts similarity index 93% rename from x-pack/plugins/siem/public/store/drag_and_drop/reducer.ts rename to x-pack/plugins/siem/public/common/store/drag_and_drop/reducer.ts index d5d49f3a0a1b1..d402da136a596 100644 --- a/x-pack/plugins/siem/public/store/drag_and_drop/reducer.ts +++ b/x-pack/plugins/siem/public/common/store/drag_and_drop/reducer.ts @@ -7,7 +7,7 @@ import { omit } from 'lodash/fp'; import { reducerWithInitialState } from 'typescript-fsa-reducers'; -import { DataProvider } from '../../components/timeline/data_providers/data_provider'; +import { DataProvider } from '../../../timelines/components/timeline/data_providers/data_provider'; import { registerProvider, unRegisterProvider } from './actions'; import { DragAndDropModel, IdToDataProvider } from './model'; diff --git a/x-pack/plugins/siem/public/store/drag_and_drop/selectors.ts b/x-pack/plugins/siem/public/common/store/drag_and_drop/selectors.ts similarity index 100% rename from x-pack/plugins/siem/public/store/drag_and_drop/selectors.ts rename to x-pack/plugins/siem/public/common/store/drag_and_drop/selectors.ts diff --git a/x-pack/plugins/siem/public/store/epic.ts b/x-pack/plugins/siem/public/common/store/epic.ts similarity index 59% rename from x-pack/plugins/siem/public/store/epic.ts rename to x-pack/plugins/siem/public/common/store/epic.ts index 336960588f48c..b9e8e7d88c202 100644 --- a/x-pack/plugins/siem/public/store/epic.ts +++ b/x-pack/plugins/siem/public/common/store/epic.ts @@ -5,10 +5,10 @@ */ import { combineEpics } from 'redux-observable'; -import { createTimelineEpic } from './timeline/epic'; -import { createTimelineFavoriteEpic } from './timeline/epic_favorite'; -import { createTimelineNoteEpic } from './timeline/epic_note'; -import { createTimelinePinnedEventEpic } from './timeline/epic_pinned_event'; +import { createTimelineEpic } from '../../timelines/store/timeline/epic'; +import { createTimelineFavoriteEpic } from '../../timelines/store/timeline/epic_favorite'; +import { createTimelineNoteEpic } from '../../timelines/store/timeline/epic_note'; +import { createTimelinePinnedEventEpic } from '../../timelines/store/timeline/epic_pinned_event'; export const createRootEpic = () => combineEpics( diff --git a/x-pack/plugins/siem/public/store/index.ts b/x-pack/plugins/siem/public/common/store/index.ts similarity index 100% rename from x-pack/plugins/siem/public/store/index.ts rename to x-pack/plugins/siem/public/common/store/index.ts diff --git a/x-pack/plugins/siem/public/store/inputs/actions.ts b/x-pack/plugins/siem/public/common/store/inputs/actions.ts similarity index 96% rename from x-pack/plugins/siem/public/store/inputs/actions.ts rename to x-pack/plugins/siem/public/common/store/inputs/actions.ts index 04cdf5246de2c..5b26957843f08 100644 --- a/x-pack/plugins/siem/public/store/inputs/actions.ts +++ b/x-pack/plugins/siem/public/common/store/inputs/actions.ts @@ -8,7 +8,7 @@ import actionCreatorFactory from 'typescript-fsa'; import { InspectQuery, Refetch, RefetchKql } from './model'; import { InputsModelId } from './constants'; -import { Filter, SavedQuery } from '../../../../../../src/plugins/data/public'; +import { Filter, SavedQuery } from '../../../../../../../src/plugins/data/public'; const actionCreator = actionCreatorFactory('x-pack/siem/local/inputs'); diff --git a/x-pack/plugins/siem/public/store/inputs/constants.ts b/x-pack/plugins/siem/public/common/store/inputs/constants.ts similarity index 100% rename from x-pack/plugins/siem/public/store/inputs/constants.ts rename to x-pack/plugins/siem/public/common/store/inputs/constants.ts diff --git a/x-pack/plugins/siem/public/store/inputs/helpers.test.ts b/x-pack/plugins/siem/public/common/store/inputs/helpers.test.ts similarity index 100% rename from x-pack/plugins/siem/public/store/inputs/helpers.test.ts rename to x-pack/plugins/siem/public/common/store/inputs/helpers.test.ts diff --git a/x-pack/plugins/siem/public/store/inputs/helpers.ts b/x-pack/plugins/siem/public/common/store/inputs/helpers.ts similarity index 100% rename from x-pack/plugins/siem/public/store/inputs/helpers.ts rename to x-pack/plugins/siem/public/common/store/inputs/helpers.ts diff --git a/x-pack/plugins/siem/public/store/inputs/index.ts b/x-pack/plugins/siem/public/common/store/inputs/index.ts similarity index 100% rename from x-pack/plugins/siem/public/store/inputs/index.ts rename to x-pack/plugins/siem/public/common/store/inputs/index.ts diff --git a/x-pack/plugins/siem/public/store/inputs/model.ts b/x-pack/plugins/siem/public/common/store/inputs/model.ts similarity index 96% rename from x-pack/plugins/siem/public/store/inputs/model.ts rename to x-pack/plugins/siem/public/common/store/inputs/model.ts index 3e6be6ce859e5..e851caf523eb4 100644 --- a/x-pack/plugins/siem/public/store/inputs/model.ts +++ b/x-pack/plugins/siem/public/common/store/inputs/model.ts @@ -7,7 +7,7 @@ import { Dispatch } from 'redux'; import { InputsModelId } from './constants'; import { CONSTANTS } from '../../components/url_state/constants'; -import { Query, Filter, SavedQuery } from '../../../../../../src/plugins/data/public'; +import { Query, Filter, SavedQuery } from '../../../../../../../src/plugins/data/public'; export interface AbsoluteTimeRange { kind: 'absolute'; diff --git a/x-pack/plugins/siem/public/store/inputs/reducer.ts b/x-pack/plugins/siem/public/common/store/inputs/reducer.ts similarity index 100% rename from x-pack/plugins/siem/public/store/inputs/reducer.ts rename to x-pack/plugins/siem/public/common/store/inputs/reducer.ts diff --git a/x-pack/plugins/siem/public/store/inputs/selectors.ts b/x-pack/plugins/siem/public/common/store/inputs/selectors.ts similarity index 100% rename from x-pack/plugins/siem/public/store/inputs/selectors.ts rename to x-pack/plugins/siem/public/common/store/inputs/selectors.ts diff --git a/x-pack/plugins/siem/public/store/model.ts b/x-pack/plugins/siem/public/common/store/model.ts similarity index 83% rename from x-pack/plugins/siem/public/store/model.ts rename to x-pack/plugins/siem/public/common/store/model.ts index 686dc096e61b0..0032a95cce321 100644 --- a/x-pack/plugins/siem/public/store/model.ts +++ b/x-pack/plugins/siem/public/common/store/model.ts @@ -6,7 +6,5 @@ export { appModel } from './app'; export { dragAndDropModel } from './drag_and_drop'; -export { hostsModel } from './hosts'; export { inputsModel } from './inputs'; -export { networkModel } from './network'; export * from './types'; diff --git a/x-pack/plugins/siem/public/common/store/reducer.ts b/x-pack/plugins/siem/public/common/store/reducer.ts new file mode 100644 index 0000000000000..da1dcd3ea9e73 --- /dev/null +++ b/x-pack/plugins/siem/public/common/store/reducer.ts @@ -0,0 +1,46 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { combineReducers } from 'redux'; + +import { appReducer, AppState, initialAppState } from './app'; +import { dragAndDropReducer, DragAndDropState, initialDragAndDropState } from './drag_and_drop'; +import { createInitialInputsState, initialInputsState, inputsReducer, InputsState } from './inputs'; + +import { HostsPluginState, HostsPluginReducer } from '../../hosts/store'; +import { NetworkPluginState, NetworkPluginReducer } from '../../network/store'; +import { TimelinePluginState, TimelinePluginReducer } from '../../timelines/store/timeline'; + +export interface State extends HostsPluginState, NetworkPluginState, TimelinePluginState { + app: AppState; + dragAndDrop: DragAndDropState; + inputs: InputsState; +} + +export const initialState: Pick = { + app: initialAppState, + dragAndDrop: initialDragAndDropState, + inputs: initialInputsState, +}; + +type SubPluginsInitState = HostsPluginState & NetworkPluginState & TimelinePluginState; +export type SubPluginsInitReducer = HostsPluginReducer & + NetworkPluginReducer & + TimelinePluginReducer; + +export const createInitialState = (pluginsInitState: SubPluginsInitState): State => ({ + ...initialState, + ...pluginsInitState, + inputs: createInitialInputsState(), +}); + +export const createReducer = (pluginsReducer: SubPluginsInitReducer) => + combineReducers({ + app: appReducer, + dragAndDrop: dragAndDropReducer, + inputs: inputsReducer, + ...pluginsReducer, + }); diff --git a/x-pack/plugins/siem/public/store/selectors.ts b/x-pack/plugins/siem/public/common/store/selectors.ts similarity index 73% rename from x-pack/plugins/siem/public/store/selectors.ts rename to x-pack/plugins/siem/public/common/store/selectors.ts index b188f95ad27cf..b938bae39b634 100644 --- a/x-pack/plugins/siem/public/store/selectors.ts +++ b/x-pack/plugins/siem/public/common/store/selectors.ts @@ -6,7 +6,4 @@ export { appSelectors } from './app'; export { dragAndDropSelectors } from './drag_and_drop'; -export { hostsSelectors } from './hosts'; export { inputsSelectors } from './inputs'; -export { networkSelectors } from './network'; -export { timelineSelectors } from './timeline'; diff --git a/x-pack/plugins/siem/public/store/store.ts b/x-pack/plugins/siem/public/common/store/store.ts similarity index 87% rename from x-pack/plugins/siem/public/store/store.ts rename to x-pack/plugins/siem/public/common/store/store.ts index 2af0f87b4494d..ea7cb417fb24b 100644 --- a/x-pack/plugins/siem/public/store/store.ts +++ b/x-pack/plugins/siem/public/common/store/store.ts @@ -9,13 +9,13 @@ import { Action, applyMiddleware, compose, createStore as createReduxStore, Stor import { createEpicMiddleware } from 'redux-observable'; import { Observable } from 'rxjs'; -import { AppApolloClient } from '../lib/lib'; import { telemetryMiddleware } from '../lib/telemetry'; import { appSelectors } from './app'; -import { timelineSelectors } from './timeline'; +import { timelineSelectors } from '../../timelines/store/timeline'; import { inputsSelectors } from './inputs'; -import { State, initialState, reducer } from './reducer'; +import { State, SubPluginsInitReducer, createReducer } from './reducer'; import { createRootEpic } from './epic'; +import { AppApolloClient } from '../lib/lib'; type ComposeType = typeof compose; declare global { @@ -24,8 +24,10 @@ declare global { } } let store: Store | null = null; +export { SubPluginsInitReducer }; export const createStore = ( - state: State = initialState, + state: State, + pluginsReducer: SubPluginsInitReducer, apolloClient: Observable ): Store => { const composeEnhancers = window.__REDUX_DEVTOOLS_EXTENSION_COMPOSE__ || compose; @@ -45,7 +47,7 @@ export const createStore = ( ); store = createReduxStore( - reducer, + createReducer(pluginsReducer), state, composeEnhancers(applyMiddleware(epicMiddleware, telemetryMiddleware)) ); diff --git a/x-pack/plugins/siem/public/store/types.ts b/x-pack/plugins/siem/public/common/store/types.ts similarity index 100% rename from x-pack/plugins/siem/public/store/types.ts rename to x-pack/plugins/siem/public/common/store/types.ts diff --git a/x-pack/plugins/siem/public/pages/common/translations.ts b/x-pack/plugins/siem/public/common/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/common/translations.ts rename to x-pack/plugins/siem/public/common/translations.ts diff --git a/x-pack/plugins/siem/public/utils/api/index.ts b/x-pack/plugins/siem/public/common/utils/api/index.ts similarity index 100% rename from x-pack/plugins/siem/public/utils/api/index.ts rename to x-pack/plugins/siem/public/common/utils/api/index.ts diff --git a/x-pack/plugins/siem/public/utils/apollo_context.ts b/x-pack/plugins/siem/public/common/utils/apollo_context.ts similarity index 100% rename from x-pack/plugins/siem/public/utils/apollo_context.ts rename to x-pack/plugins/siem/public/common/utils/apollo_context.ts diff --git a/x-pack/plugins/siem/public/utils/default_date_settings.test.ts b/x-pack/plugins/siem/public/common/utils/default_date_settings.test.ts similarity index 99% rename from x-pack/plugins/siem/public/utils/default_date_settings.test.ts rename to x-pack/plugins/siem/public/common/utils/default_date_settings.test.ts index 9dc179ba7a6e2..3ae3ef2326ea2 100644 --- a/x-pack/plugins/siem/public/utils/default_date_settings.test.ts +++ b/x-pack/plugins/siem/public/common/utils/default_date_settings.test.ts @@ -21,7 +21,7 @@ import { DEFAULT_INTERVAL_PAUSE, DEFAULT_INTERVAL_VALUE, DEFAULT_INTERVAL_TYPE, -} from '../../common/constants'; +} from '../../../common/constants'; import { KibanaServices } from '../lib/kibana'; import { Policy } from '../store/inputs/model'; @@ -30,7 +30,7 @@ import { Policy } from '../store/inputs/model'; // we have to repeat ourselves once const DEFAULT_FROM_DATE = '1983-05-31T13:03:54.234Z'; const DEFAULT_TO_DATE = '1990-05-31T13:03:54.234Z'; -jest.mock('../../common/constants', () => ({ +jest.mock('../../../common/constants', () => ({ DEFAULT_FROM: '1983-05-31T13:03:54.234Z', DEFAULT_TO: '1990-05-31T13:03:54.234Z', DEFAULT_INTERVAL_PAUSE: true, diff --git a/x-pack/plugins/siem/public/utils/default_date_settings.ts b/x-pack/plugins/siem/public/common/utils/default_date_settings.ts similarity index 98% rename from x-pack/plugins/siem/public/utils/default_date_settings.ts rename to x-pack/plugins/siem/public/common/utils/default_date_settings.ts index c4869a4851ae5..3523a02ea44f5 100644 --- a/x-pack/plugins/siem/public/utils/default_date_settings.ts +++ b/x-pack/plugins/siem/public/common/utils/default_date_settings.ts @@ -15,7 +15,7 @@ import { DEFAULT_TO, DEFAULT_INTERVAL_TYPE, DEFAULT_INTERVAL_VALUE, -} from '../../common/constants'; +} from '../../../common/constants'; import { KibanaServices } from '../lib/kibana'; import { Policy } from '../store/inputs/model'; diff --git a/x-pack/plugins/siem/public/utils/kql/use_update_kql.test.tsx b/x-pack/plugins/siem/public/common/utils/kql/use_update_kql.test.tsx similarity index 92% rename from x-pack/plugins/siem/public/utils/kql/use_update_kql.test.tsx rename to x-pack/plugins/siem/public/common/utils/kql/use_update_kql.test.tsx index b70a5432e47f8..9b1a397deb17f 100644 --- a/x-pack/plugins/siem/public/utils/kql/use_update_kql.test.tsx +++ b/x-pack/plugins/siem/public/common/utils/kql/use_update_kql.test.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { applyKqlFilterQuery as dispatchApplyTimelineFilterQuery } from '../../store/timeline/actions'; +import { applyKqlFilterQuery as dispatchApplyTimelineFilterQuery } from '../../../timelines/store/timeline/actions'; import { mockIndexPattern } from '../../mock/index_pattern'; import { useUpdateKql } from './use_update_kql'; @@ -14,7 +14,7 @@ mockDispatch.mockImplementation(fn => fn); const applyTimelineKqlMock: jest.Mock = (dispatchApplyTimelineFilterQuery as unknown) as jest.Mock; -jest.mock('../../store/timeline/actions', () => ({ +jest.mock('../../../timelines/store/timeline/actions', () => ({ applyKqlFilterQuery: jest.fn(), })); diff --git a/x-pack/plugins/siem/public/utils/kql/use_update_kql.tsx b/x-pack/plugins/siem/public/common/utils/kql/use_update_kql.tsx similarity index 96% rename from x-pack/plugins/siem/public/utils/kql/use_update_kql.tsx rename to x-pack/plugins/siem/public/common/utils/kql/use_update_kql.tsx index af993588f7e0d..d1f5b40086cea 100644 --- a/x-pack/plugins/siem/public/utils/kql/use_update_kql.tsx +++ b/x-pack/plugins/siem/public/common/utils/kql/use_update_kql.tsx @@ -9,7 +9,7 @@ import { IIndexPattern } from 'src/plugins/data/public'; import deepEqual from 'fast-deep-equal'; import { KueryFilterQuery } from '../../store'; -import { applyKqlFilterQuery as dispatchApplyTimelineFilterQuery } from '../../store/timeline/actions'; +import { applyKqlFilterQuery as dispatchApplyTimelineFilterQuery } from '../../../timelines/store/timeline/actions'; import { convertKueryToElasticSearchQuery } from '../../lib/keury'; import { RefetchKql } from '../../store/inputs/model'; diff --git a/x-pack/plugins/siem/public/utils/logo_endpoint/64_color.svg b/x-pack/plugins/siem/public/common/utils/logo_endpoint/64_color.svg similarity index 100% rename from x-pack/plugins/siem/public/utils/logo_endpoint/64_color.svg rename to x-pack/plugins/siem/public/common/utils/logo_endpoint/64_color.svg diff --git a/x-pack/plugins/siem/public/utils/route/helpers.ts b/x-pack/plugins/siem/public/common/utils/route/helpers.ts similarity index 100% rename from x-pack/plugins/siem/public/utils/route/helpers.ts rename to x-pack/plugins/siem/public/common/utils/route/helpers.ts diff --git a/x-pack/plugins/siem/public/utils/route/index.test.tsx b/x-pack/plugins/siem/public/common/utils/route/index.test.tsx similarity index 98% rename from x-pack/plugins/siem/public/utils/route/index.test.tsx rename to x-pack/plugins/siem/public/common/utils/route/index.test.tsx index e777d281ed51a..95e40b0f66301 100644 --- a/x-pack/plugins/siem/public/utils/route/index.test.tsx +++ b/x-pack/plugins/siem/public/common/utils/route/index.test.tsx @@ -7,7 +7,7 @@ import { mount } from 'enzyme'; import React from 'react'; -import { HostsTableType } from '../../store/hosts/model'; +import { HostsTableType } from '../../../hosts/store/model'; import { RouteSpyState } from './types'; import { ManageRoutesSpy } from './manage_spy_routes'; import { SpyRouteComponent } from './spy_routes'; diff --git a/x-pack/plugins/siem/public/utils/route/manage_spy_routes.tsx b/x-pack/plugins/siem/public/common/utils/route/manage_spy_routes.tsx similarity index 100% rename from x-pack/plugins/siem/public/utils/route/manage_spy_routes.tsx rename to x-pack/plugins/siem/public/common/utils/route/manage_spy_routes.tsx diff --git a/x-pack/plugins/siem/public/utils/route/spy_routes.tsx b/x-pack/plugins/siem/public/common/utils/route/spy_routes.tsx similarity index 100% rename from x-pack/plugins/siem/public/utils/route/spy_routes.tsx rename to x-pack/plugins/siem/public/common/utils/route/spy_routes.tsx diff --git a/x-pack/plugins/siem/public/utils/route/types.ts b/x-pack/plugins/siem/public/common/utils/route/types.ts similarity index 86% rename from x-pack/plugins/siem/public/utils/route/types.ts rename to x-pack/plugins/siem/public/common/utils/route/types.ts index 17b312a427c43..912da545a66a3 100644 --- a/x-pack/plugins/siem/public/utils/route/types.ts +++ b/x-pack/plugins/siem/public/common/utils/route/types.ts @@ -8,11 +8,11 @@ import * as H from 'history'; import React from 'react'; import { RouteComponentProps } from 'react-router-dom'; -import { TimelineType } from '../../../common/types/timeline'; +import { TimelineType } from '../../../../common/types/timeline'; -import { HostsTableType } from '../../store/hosts/model'; -import { NetworkRouteType } from '../../pages/network/navigation/types'; -import { FlowTarget } from '../../graphql/types'; +import { HostsTableType } from '../../../hosts/store/model'; +import { NetworkRouteType } from '../../../network/pages/navigation/types'; +import { FlowTarget } from '../../../graphql/types'; export type SiemRouteType = HostsTableType | NetworkRouteType | TimelineType; export interface RouteSpyState { diff --git a/x-pack/plugins/siem/public/utils/route/use_route_spy.tsx b/x-pack/plugins/siem/public/common/utils/route/use_route_spy.tsx similarity index 100% rename from x-pack/plugins/siem/public/utils/route/use_route_spy.tsx rename to x-pack/plugins/siem/public/common/utils/route/use_route_spy.tsx diff --git a/x-pack/plugins/siem/public/utils/saved_query_services/index.tsx b/x-pack/plugins/siem/public/common/utils/saved_query_services/index.tsx similarity index 93% rename from x-pack/plugins/siem/public/utils/saved_query_services/index.tsx rename to x-pack/plugins/siem/public/common/utils/saved_query_services/index.tsx index 335398177f0f4..a8ee10ba2b801 100644 --- a/x-pack/plugins/siem/public/utils/saved_query_services/index.tsx +++ b/x-pack/plugins/siem/public/common/utils/saved_query_services/index.tsx @@ -8,7 +8,7 @@ import { useState, useEffect } from 'react'; import { SavedQueryService, createSavedQueryService, -} from '../../../../../../src/plugins/data/public'; +} from '../../../../../../../src/plugins/data/public'; import { useKibana } from '../../lib/kibana'; diff --git a/x-pack/plugins/siem/public/utils/timeline/use_show_timeline.tsx b/x-pack/plugins/siem/public/common/utils/timeline/use_show_timeline.tsx similarity index 94% rename from x-pack/plugins/siem/public/utils/timeline/use_show_timeline.tsx rename to x-pack/plugins/siem/public/common/utils/timeline/use_show_timeline.tsx index e969330b809ff..78f22a86c1893 100644 --- a/x-pack/plugins/siem/public/utils/timeline/use_show_timeline.tsx +++ b/x-pack/plugins/siem/public/common/utils/timeline/use_show_timeline.tsx @@ -7,7 +7,7 @@ import { useLocation } from 'react-router-dom'; import { useState, useEffect } from 'react'; -import { SiemPageName } from '../../pages/home/types'; +import { SiemPageName } from '../../../app/types'; const hideTimelineForRoutes = [`/${SiemPageName.case}/configure`]; diff --git a/x-pack/plugins/siem/public/utils/use_mount_appended.ts b/x-pack/plugins/siem/public/common/utils/use_mount_appended.ts similarity index 100% rename from x-pack/plugins/siem/public/utils/use_mount_appended.ts rename to x-pack/plugins/siem/public/common/utils/use_mount_appended.ts diff --git a/x-pack/plugins/siem/public/utils/validators/index.ts b/x-pack/plugins/siem/public/common/utils/validators/index.ts similarity index 100% rename from x-pack/plugins/siem/public/utils/validators/index.ts rename to x-pack/plugins/siem/public/common/utils/validators/index.ts diff --git a/x-pack/plugins/siem/public/components/page/network/index.tsx b/x-pack/plugins/siem/public/components/page/network/index.tsx deleted file mode 100644 index 1f502635a8de4..0000000000000 --- a/x-pack/plugins/siem/public/components/page/network/index.tsx +++ /dev/null @@ -1,12 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License; - * you may not use this file except in compliance with the Elastic License. - */ - -export { IpOverview } from './ip_overview'; -export { KpiNetworkComponent } from './kpi_network'; -export { NetworkDnsTable } from './network_dns_table'; -export { NetworkTopCountriesTable } from './network_top_countries_table'; -export { NetworkTopNFlowTable } from './network_top_n_flow_table'; -export { NetworkHttpTable } from './network_http_table'; diff --git a/x-pack/plugins/siem/public/components/page/hosts/authentications_table/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/hosts/components/authentications_table/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/page/hosts/authentications_table/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/hosts/components/authentications_table/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/page/hosts/authentications_table/index.test.tsx b/x-pack/plugins/siem/public/hosts/components/authentications_table/index.test.tsx similarity index 89% rename from x-pack/plugins/siem/public/components/page/hosts/authentications_table/index.test.tsx rename to x-pack/plugins/siem/public/hosts/components/authentications_table/index.test.tsx index d7c25e97b3838..2c39db2ab7340 100644 --- a/x-pack/plugins/siem/public/components/page/hosts/authentications_table/index.test.tsx +++ b/x-pack/plugins/siem/public/hosts/components/authentications_table/index.test.tsx @@ -9,9 +9,9 @@ import { getOr } from 'lodash/fp'; import React from 'react'; import { Provider as ReduxStoreProvider } from 'react-redux'; -import { apolloClientObservable, mockGlobalState } from '../../../../mock'; -import { createStore, hostsModel, State } from '../../../../store'; - +import { apolloClientObservable, mockGlobalState, SUB_PLUGINS_REDUCER } from '../../../common/mock'; +import { createStore, State } from '../../../common/store'; +import { hostsModel } from '../../store'; import { mockData } from './mock'; import * as i18n from './translations'; import { AuthenticationTable, getAuthenticationColumnsCurated } from '.'; @@ -20,10 +20,10 @@ describe('Authentication Table Component', () => { const loadPage = jest.fn(); const state: State = mockGlobalState; - let store = createStore(state, apolloClientObservable); + let store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); beforeEach(() => { - store = createStore(state, apolloClientObservable); + store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); }); describe('rendering', () => { diff --git a/x-pack/plugins/siem/public/components/page/hosts/authentications_table/index.tsx b/x-pack/plugins/siem/public/hosts/components/authentications_table/index.tsx similarity index 90% rename from x-pack/plugins/siem/public/components/page/hosts/authentications_table/index.tsx rename to x-pack/plugins/siem/public/hosts/components/authentications_table/index.tsx index 678faff7654db..ef28f268bb73a 100644 --- a/x-pack/plugins/siem/public/components/page/hosts/authentications_table/index.tsx +++ b/x-pack/plugins/siem/public/hosts/components/authentications_table/index.tsx @@ -10,20 +10,23 @@ import { has } from 'lodash/fp'; import React, { useCallback, useMemo } from 'react'; import { connect, ConnectedProps } from 'react-redux'; -import { hostsActions } from '../../../../store/hosts'; -import { AuthenticationsEdges } from '../../../../graphql/types'; -import { hostsModel, hostsSelectors, State } from '../../../../store'; -import { DragEffects, DraggableWrapper } from '../../../drag_and_drop/draggable_wrapper'; -import { escapeDataProviderId } from '../../../drag_and_drop/helpers'; -import { getEmptyTagValue } from '../../../empty_value'; -import { FormattedRelativePreferenceDate } from '../../../formatted_date'; -import { HostDetailsLink, IPDetailsLink } from '../../../links'; -import { Columns, ItemsPerRow, PaginatedTable } from '../../../paginated_table'; -import { IS_OPERATOR } from '../../../timeline/data_providers/data_provider'; -import { Provider } from '../../../timeline/data_providers/provider'; +import { hostsActions, hostsModel, hostsSelectors } from '../../store'; +import { AuthenticationsEdges } from '../../../graphql/types'; +import { State } from '../../../common/store'; +import { + DragEffects, + DraggableWrapper, +} from '../../../common/components/drag_and_drop/draggable_wrapper'; +import { escapeDataProviderId } from '../../../common/components/drag_and_drop/helpers'; +import { getEmptyTagValue } from '../../../common/components/empty_value'; +import { FormattedRelativePreferenceDate } from '../../../common/components/formatted_date'; +import { HostDetailsLink, IPDetailsLink } from '../../../common/components/links'; +import { Columns, ItemsPerRow, PaginatedTable } from '../../../common/components/paginated_table'; +import { IS_OPERATOR } from '../../../timelines/components/timeline/data_providers/data_provider'; +import { Provider } from '../../../timelines/components/timeline/data_providers/provider'; import * as i18n from './translations'; -import { getRowItemDraggables } from '../../../tables/helpers'; +import { getRowItemDraggables } from '../../../common/components/tables/helpers'; const tableType = hostsModel.HostsTableType.authentications; diff --git a/x-pack/plugins/siem/public/components/page/hosts/authentications_table/mock.ts b/x-pack/plugins/siem/public/hosts/components/authentications_table/mock.ts similarity index 96% rename from x-pack/plugins/siem/public/components/page/hosts/authentications_table/mock.ts rename to x-pack/plugins/siem/public/hosts/components/authentications_table/mock.ts index 50a1fa8eb7d72..84682fd14ac6b 100644 --- a/x-pack/plugins/siem/public/components/page/hosts/authentications_table/mock.ts +++ b/x-pack/plugins/siem/public/hosts/components/authentications_table/mock.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { AuthenticationsData } from '../../../../graphql/types'; +import { AuthenticationsData } from '../../../graphql/types'; export const mockData: { Authentications: AuthenticationsData } = { Authentications: { diff --git a/x-pack/plugins/siem/public/components/page/hosts/authentications_table/translations.ts b/x-pack/plugins/siem/public/hosts/components/authentications_table/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/page/hosts/authentications_table/translations.ts rename to x-pack/plugins/siem/public/hosts/components/authentications_table/translations.ts diff --git a/x-pack/plugins/siem/public/components/page/hosts/first_last_seen_host/index.test.tsx b/x-pack/plugins/siem/public/hosts/components/first_last_seen_host/index.test.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/page/hosts/first_last_seen_host/index.test.tsx rename to x-pack/plugins/siem/public/hosts/components/first_last_seen_host/index.test.tsx index 4a836333f3311..9715c1cb5c8b4 100644 --- a/x-pack/plugins/siem/public/components/page/hosts/first_last_seen_host/index.test.tsx +++ b/x-pack/plugins/siem/public/hosts/components/first_last_seen_host/index.test.tsx @@ -9,9 +9,9 @@ import React from 'react'; import { MockedProvider } from 'react-apollo/test-utils'; import { render, act } from '@testing-library/react'; -import { mockFirstLastSeenHostQuery } from '../../../../containers/hosts/first_last_seen/mock'; -import { wait } from '../../../../lib/helpers'; -import { TestProviders } from '../../../../mock'; +import { mockFirstLastSeenHostQuery } from '../../containers/hosts/first_last_seen/mock'; +import { wait } from '../../../common/lib/helpers'; +import { TestProviders } from '../../../common/mock'; import { FirstLastSeenHost, FirstLastSeenHostType } from '.'; diff --git a/x-pack/plugins/siem/public/components/page/hosts/first_last_seen_host/index.tsx b/x-pack/plugins/siem/public/hosts/components/first_last_seen_host/index.tsx similarity index 89% rename from x-pack/plugins/siem/public/components/page/hosts/first_last_seen_host/index.tsx rename to x-pack/plugins/siem/public/hosts/components/first_last_seen_host/index.tsx index 70dff5eda5939..05e65b496fae0 100644 --- a/x-pack/plugins/siem/public/components/page/hosts/first_last_seen_host/index.tsx +++ b/x-pack/plugins/siem/public/hosts/components/first_last_seen_host/index.tsx @@ -8,9 +8,9 @@ import { EuiIcon, EuiLoadingSpinner, EuiText, EuiToolTip } from '@elastic/eui'; import React from 'react'; import { ApolloConsumer } from 'react-apollo'; -import { useFirstLastSeenHostQuery } from '../../../../containers/hosts/first_last_seen'; -import { getEmptyTagValue } from '../../../empty_value'; -import { FormattedRelativePreferenceDate } from '../../../formatted_date'; +import { useFirstLastSeenHostQuery } from '../../containers/hosts/first_last_seen'; +import { getEmptyTagValue } from '../../../common/components/empty_value'; +import { FormattedRelativePreferenceDate } from '../../../common/components/formatted_date'; export enum FirstLastSeenHostType { FIRST_SEEN = 'first-seen', diff --git a/x-pack/plugins/siem/public/components/page/hosts/hosts_table/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/hosts/components/hosts_table/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/page/hosts/hosts_table/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/hosts/components/hosts_table/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/page/hosts/hosts_table/columns.tsx b/x-pack/plugins/siem/public/hosts/components/hosts_table/columns.tsx similarity index 79% rename from x-pack/plugins/siem/public/components/page/hosts/hosts_table/columns.tsx rename to x-pack/plugins/siem/public/hosts/components/hosts_table/columns.tsx index 6bd82f3192f9b..6b3097e1feabb 100644 --- a/x-pack/plugins/siem/public/components/page/hosts/hosts_table/columns.tsx +++ b/x-pack/plugins/siem/public/hosts/components/hosts_table/columns.tsx @@ -6,14 +6,20 @@ import { EuiIcon, EuiToolTip } from '@elastic/eui'; import React from 'react'; -import { DragEffects, DraggableWrapper } from '../../../drag_and_drop/draggable_wrapper'; -import { escapeDataProviderId } from '../../../drag_and_drop/helpers'; -import { getEmptyTagValue } from '../../../empty_value'; -import { HostDetailsLink } from '../../../links'; -import { FormattedRelativePreferenceDate } from '../../../formatted_date'; -import { IS_OPERATOR } from '../../../timeline/data_providers/data_provider'; -import { Provider } from '../../../timeline/data_providers/provider'; -import { AddFilterToGlobalSearchBar, createFilter } from '../../add_filter_to_global_search_bar'; +import { + DragEffects, + DraggableWrapper, +} from '../../../common/components/drag_and_drop/draggable_wrapper'; +import { escapeDataProviderId } from '../../../common/components/drag_and_drop/helpers'; +import { getEmptyTagValue } from '../../../common/components/empty_value'; +import { HostDetailsLink } from '../../../common/components/links'; +import { FormattedRelativePreferenceDate } from '../../../common/components/formatted_date'; +import { IS_OPERATOR } from '../../../timelines/components/timeline/data_providers/data_provider'; +import { Provider } from '../../../timelines/components/timeline/data_providers/provider'; +import { + AddFilterToGlobalSearchBar, + createFilter, +} from '../../../common/components/add_filter_to_global_search_bar'; import { HostsTableColumns } from './'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/components/page/hosts/hosts_table/index.test.tsx b/x-pack/plugins/siem/public/hosts/components/hosts_table/index.test.tsx similarity index 87% rename from x-pack/plugins/siem/public/components/page/hosts/hosts_table/index.test.tsx rename to x-pack/plugins/siem/public/hosts/components/hosts_table/index.test.tsx index e561594013dea..8c1429174bd78 100644 --- a/x-pack/plugins/siem/public/components/page/hosts/hosts_table/index.test.tsx +++ b/x-pack/plugins/siem/public/hosts/components/hosts_table/index.test.tsx @@ -14,19 +14,21 @@ import { mockIndexPattern, mockGlobalState, TestProviders, -} from '../../../../mock'; -import { useMountAppended } from '../../../../utils/use_mount_appended'; -import { createStore, hostsModel, State } from '../../../../store'; -import { HostsTableType } from '../../../../store/hosts/model'; + SUB_PLUGINS_REDUCER, +} from '../../../common/mock'; +import { useMountAppended } from '../../../common/utils/use_mount_appended'; +import { createStore, State } from '../../../common/store'; +import { hostsModel } from '../../../hosts/store'; +import { HostsTableType } from '../../../hosts/store/model'; import { HostsTable } from './index'; import { mockData } from './mock'; // Test will fail because we will to need to mock some core services to make the test work // For now let's forget about SiemSearchBar and QueryBar -jest.mock('../../../search_bar', () => ({ +jest.mock('../../../common/components/search_bar', () => ({ SiemSearchBar: () => null, })); -jest.mock('../../../query_bar', () => ({ +jest.mock('../../../common/components/query_bar', () => ({ QueryBar: () => null, })); @@ -34,11 +36,11 @@ describe('Hosts Table', () => { const loadPage = jest.fn(); const state: State = mockGlobalState; - let store = createStore(state, apolloClientObservable); + let store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); const mount = useMountAppended(); beforeEach(() => { - store = createStore(state, apolloClientObservable); + store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); }); describe('rendering', () => { diff --git a/x-pack/plugins/siem/public/components/page/hosts/hosts_table/index.tsx b/x-pack/plugins/siem/public/hosts/components/hosts_table/index.tsx similarity index 94% rename from x-pack/plugins/siem/public/components/page/hosts/hosts_table/index.tsx rename to x-pack/plugins/siem/public/hosts/components/hosts_table/index.tsx index f09834d87e423..550ee24f60922 100644 --- a/x-pack/plugins/siem/public/components/page/hosts/hosts_table/index.tsx +++ b/x-pack/plugins/siem/public/hosts/components/hosts_table/index.tsx @@ -8,7 +8,6 @@ import React, { useMemo, useCallback } from 'react'; import { connect, ConnectedProps } from 'react-redux'; import { IIndexPattern } from 'src/plugins/data/public'; -import { hostsActions } from '../../../../store/actions'; import { Direction, HostFields, @@ -17,17 +16,17 @@ import { HostsFields, HostsSortField, OsFields, -} from '../../../../graphql/types'; -import { assertUnreachable } from '../../../../lib/helpers'; -import { hostsModel, hostsSelectors, State } from '../../../../store'; +} from '../../../graphql/types'; +import { assertUnreachable } from '../../../common/lib/helpers'; +import { State } from '../../../common/store'; import { Columns, Criteria, ItemsPerRow, PaginatedTable, SortingBasicTable, -} from '../../../paginated_table'; - +} from '../../../common/components/paginated_table'; +import { hostsActions, hostsModel, hostsSelectors } from '../../store'; import { getHostsColumns } from './columns'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/components/page/hosts/hosts_table/mock.ts b/x-pack/plugins/siem/public/hosts/components/hosts_table/mock.ts similarity index 96% rename from x-pack/plugins/siem/public/components/page/hosts/hosts_table/mock.ts rename to x-pack/plugins/siem/public/hosts/components/hosts_table/mock.ts index b5a9c925c599a..a3dd69be75cc6 100644 --- a/x-pack/plugins/siem/public/components/page/hosts/hosts_table/mock.ts +++ b/x-pack/plugins/siem/public/hosts/components/hosts_table/mock.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { HostsData } from '../../../../graphql/types'; +import { HostsData } from '../../../graphql/types'; export const mockData: { Hosts: HostsData } = { Hosts: { diff --git a/x-pack/plugins/siem/public/components/page/hosts/hosts_table/translations.ts b/x-pack/plugins/siem/public/hosts/components/hosts_table/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/page/hosts/hosts_table/translations.ts rename to x-pack/plugins/siem/public/hosts/components/hosts_table/translations.ts diff --git a/x-pack/plugins/siem/public/components/page/hosts/kpi_hosts/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/hosts/components/kpi_hosts/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/page/hosts/kpi_hosts/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/hosts/components/kpi_hosts/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/page/hosts/kpi_hosts/index.test.tsx b/x-pack/plugins/siem/public/hosts/components/kpi_hosts/index.test.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/page/hosts/kpi_hosts/index.test.tsx rename to x-pack/plugins/siem/public/hosts/components/kpi_hosts/index.test.tsx index dc2340d42ebd9..09e253ae56747 100644 --- a/x-pack/plugins/siem/public/components/page/hosts/kpi_hosts/index.test.tsx +++ b/x-pack/plugins/siem/public/hosts/components/kpi_hosts/index.test.tsx @@ -8,7 +8,7 @@ import { mockKpiHostsData, mockKpiHostDetailsData } from './mock'; import React from 'react'; import { shallow, ShallowWrapper } from 'enzyme'; import { KpiHostsComponentBase } from '.'; -import * as statItems from '../../../stat_items'; +import * as statItems from '../../../common/components/stat_items'; import { kpiHostsMapping } from './kpi_hosts_mapping'; import { kpiHostDetailsMapping } from './kpi_host_details_mapping'; diff --git a/x-pack/plugins/siem/public/components/page/hosts/kpi_hosts/index.tsx b/x-pack/plugins/siem/public/hosts/components/kpi_hosts/index.tsx similarity index 87% rename from x-pack/plugins/siem/public/components/page/hosts/kpi_hosts/index.tsx rename to x-pack/plugins/siem/public/hosts/components/kpi_hosts/index.tsx index 65d5924821844..ba70df7d361d4 100644 --- a/x-pack/plugins/siem/public/components/page/hosts/kpi_hosts/index.tsx +++ b/x-pack/plugins/siem/public/hosts/components/kpi_hosts/index.tsx @@ -8,11 +8,15 @@ import { EuiFlexGroup, EuiFlexItem, EuiLoadingSpinner } from '@elastic/eui'; import React from 'react'; import styled from 'styled-components'; -import { KpiHostsData, KpiHostDetailsData } from '../../../../graphql/types'; -import { StatItemsComponent, StatItemsProps, useKpiMatrixStatus } from '../../../stat_items'; +import { KpiHostsData, KpiHostDetailsData } from '../../../graphql/types'; +import { + StatItemsComponent, + StatItemsProps, + useKpiMatrixStatus, +} from '../../../common/components/stat_items'; import { kpiHostsMapping } from './kpi_hosts_mapping'; import { kpiHostDetailsMapping } from './kpi_host_details_mapping'; -import { UpdateDateRange } from '../../../charts/common'; +import { UpdateDateRange } from '../../../common/components/charts/common'; const kpiWidgetHeight = 247; diff --git a/x-pack/plugins/siem/public/components/page/hosts/kpi_hosts/kpi_host_details_mapping.ts b/x-pack/plugins/siem/public/hosts/components/kpi_hosts/kpi_host_details_mapping.ts similarity index 96% rename from x-pack/plugins/siem/public/components/page/hosts/kpi_hosts/kpi_host_details_mapping.ts rename to x-pack/plugins/siem/public/hosts/components/kpi_hosts/kpi_host_details_mapping.ts index 59f8e55c46106..b3e98b70c4cb0 100644 --- a/x-pack/plugins/siem/public/components/page/hosts/kpi_hosts/kpi_host_details_mapping.ts +++ b/x-pack/plugins/siem/public/hosts/components/kpi_hosts/kpi_host_details_mapping.ts @@ -5,7 +5,7 @@ */ import * as i18n from './translations'; -import { StatItems } from '../../../stat_items'; +import { StatItems } from '../../../common/components/stat_items'; import { KpiHostsChartColors } from './types'; export const kpiHostDetailsMapping: Readonly = [ diff --git a/x-pack/plugins/siem/public/components/page/hosts/kpi_hosts/kpi_hosts_mapping.ts b/x-pack/plugins/siem/public/hosts/components/kpi_hosts/kpi_hosts_mapping.ts similarity index 96% rename from x-pack/plugins/siem/public/components/page/hosts/kpi_hosts/kpi_hosts_mapping.ts rename to x-pack/plugins/siem/public/hosts/components/kpi_hosts/kpi_hosts_mapping.ts index e2d6348d05840..78a9fd5b84d1f 100644 --- a/x-pack/plugins/siem/public/components/page/hosts/kpi_hosts/kpi_hosts_mapping.ts +++ b/x-pack/plugins/siem/public/hosts/components/kpi_hosts/kpi_hosts_mapping.ts @@ -5,8 +5,8 @@ */ import * as i18n from './translations'; -import { StatItems } from '../../../stat_items'; import { KpiHostsChartColors } from './types'; +import { StatItems } from '../../../common/components/stat_items'; export const kpiHostsMapping: Readonly = [ { diff --git a/x-pack/plugins/siem/public/components/page/hosts/kpi_hosts/mock.tsx b/x-pack/plugins/siem/public/hosts/components/kpi_hosts/mock.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/page/hosts/kpi_hosts/mock.tsx rename to x-pack/plugins/siem/public/hosts/components/kpi_hosts/mock.tsx diff --git a/x-pack/plugins/siem/public/components/page/hosts/kpi_hosts/translations.ts b/x-pack/plugins/siem/public/hosts/components/kpi_hosts/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/page/hosts/kpi_hosts/translations.ts rename to x-pack/plugins/siem/public/hosts/components/kpi_hosts/translations.ts diff --git a/x-pack/plugins/siem/public/components/page/hosts/kpi_hosts/types.ts b/x-pack/plugins/siem/public/hosts/components/kpi_hosts/types.ts similarity index 100% rename from x-pack/plugins/siem/public/components/page/hosts/kpi_hosts/types.ts rename to x-pack/plugins/siem/public/hosts/components/kpi_hosts/types.ts diff --git a/x-pack/plugins/siem/public/components/page/hosts/uncommon_process_table/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/hosts/components/uncommon_process_table/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/page/hosts/uncommon_process_table/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/hosts/components/uncommon_process_table/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/page/hosts/uncommon_process_table/index.test.tsx b/x-pack/plugins/siem/public/hosts/components/uncommon_process_table/index.test.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/page/hosts/uncommon_process_table/index.test.tsx rename to x-pack/plugins/siem/public/hosts/components/uncommon_process_table/index.test.tsx index 76fc2a0c389c3..1fcb9b5ef621f 100644 --- a/x-pack/plugins/siem/public/components/page/hosts/uncommon_process_table/index.test.tsx +++ b/x-pack/plugins/siem/public/hosts/components/uncommon_process_table/index.test.tsx @@ -8,14 +8,14 @@ import { shallow } from 'enzyme'; import { getOr } from 'lodash/fp'; import React from 'react'; -import { TestProviders } from '../../../../mock'; -import { hostsModel } from '../../../../store'; -import { getEmptyValue } from '../../../empty_value'; -import { useMountAppended } from '../../../../utils/use_mount_appended'; +import { TestProviders } from '../../../common/mock'; +import { hostsModel } from '../../store'; +import { getEmptyValue } from '../../../common/components/empty_value'; +import { useMountAppended } from '../../../common/utils/use_mount_appended'; import { getArgs, UncommonProcessTable, getUncommonColumnsCurated } from '.'; import { mockData } from './mock'; -import { HostsType } from '../../../../store/hosts/model'; +import { HostsType } from '../../store/model'; import * as i18n from './translations'; describe('Uncommon Process Table Component', () => { diff --git a/x-pack/plugins/siem/public/components/page/hosts/uncommon_process_table/index.tsx b/x-pack/plugins/siem/public/hosts/components/uncommon_process_table/index.tsx similarity index 92% rename from x-pack/plugins/siem/public/components/page/hosts/uncommon_process_table/index.tsx rename to x-pack/plugins/siem/public/hosts/components/uncommon_process_table/index.tsx index 2e59afcba4ac8..a34cfe3327a9d 100644 --- a/x-pack/plugins/siem/public/components/page/hosts/uncommon_process_table/index.tsx +++ b/x-pack/plugins/siem/public/hosts/components/uncommon_process_table/index.tsx @@ -9,16 +9,16 @@ import React, { useCallback, useMemo } from 'react'; import { connect, ConnectedProps } from 'react-redux'; -import { hostsActions } from '../../../../store/actions'; -import { UncommonProcessesEdges, UncommonProcessItem } from '../../../../graphql/types'; -import { hostsModel, hostsSelectors, State } from '../../../../store'; -import { defaultToEmptyTag, getEmptyValue } from '../../../empty_value'; -import { HostDetailsLink } from '../../../links'; -import { Columns, ItemsPerRow, PaginatedTable } from '../../../paginated_table'; +import { UncommonProcessesEdges, UncommonProcessItem } from '../../../graphql/types'; +import { State } from '../../../common/store'; +import { hostsActions, hostsModel, hostsSelectors } from '../../store'; +import { defaultToEmptyTag, getEmptyValue } from '../../../common/components/empty_value'; +import { HostDetailsLink } from '../../../common/components/links'; +import { Columns, ItemsPerRow, PaginatedTable } from '../../../common/components/paginated_table'; import * as i18n from './translations'; -import { getRowItemDraggables } from '../../../tables/helpers'; -import { HostsType } from '../../../../store/hosts/model'; +import { getRowItemDraggables } from '../../../common/components/tables/helpers'; +import { HostsType } from '../../store/model'; const tableType = hostsModel.HostsTableType.uncommonProcesses; interface OwnProps { data: UncommonProcessesEdges[]; diff --git a/x-pack/plugins/siem/public/components/page/hosts/uncommon_process_table/mock.ts b/x-pack/plugins/siem/public/hosts/components/uncommon_process_table/mock.ts similarity index 97% rename from x-pack/plugins/siem/public/components/page/hosts/uncommon_process_table/mock.ts rename to x-pack/plugins/siem/public/hosts/components/uncommon_process_table/mock.ts index bcd76706e3035..52b835278634b 100644 --- a/x-pack/plugins/siem/public/components/page/hosts/uncommon_process_table/mock.ts +++ b/x-pack/plugins/siem/public/hosts/components/uncommon_process_table/mock.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { UncommonProcessesData } from '../../../../graphql/types'; +import { UncommonProcessesData } from '../../../graphql/types'; export const mockData: { UncommonProcess: UncommonProcessesData } = { UncommonProcess: { diff --git a/x-pack/plugins/siem/public/components/page/hosts/uncommon_process_table/translations.ts b/x-pack/plugins/siem/public/hosts/components/uncommon_process_table/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/page/hosts/uncommon_process_table/translations.ts rename to x-pack/plugins/siem/public/hosts/components/uncommon_process_table/translations.ts diff --git a/x-pack/plugins/siem/public/containers/authentications/index.gql_query.ts b/x-pack/plugins/siem/public/hosts/containers/authentications/index.gql_query.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/authentications/index.gql_query.ts rename to x-pack/plugins/siem/public/hosts/containers/authentications/index.gql_query.ts diff --git a/x-pack/plugins/siem/public/containers/authentications/index.tsx b/x-pack/plugins/siem/public/hosts/containers/authentications/index.tsx similarity index 87% rename from x-pack/plugins/siem/public/containers/authentications/index.tsx rename to x-pack/plugins/siem/public/hosts/containers/authentications/index.tsx index 6d4a88c45a768..bfada0583f8e9 100644 --- a/x-pack/plugins/siem/public/containers/authentications/index.tsx +++ b/x-pack/plugins/siem/public/hosts/containers/authentications/index.tsx @@ -10,18 +10,21 @@ import { Query } from 'react-apollo'; import { connect } from 'react-redux'; import { compose } from 'redux'; -import { DEFAULT_INDEX_KEY } from '../../../common/constants'; +import { DEFAULT_INDEX_KEY } from '../../../../common/constants'; import { AuthenticationsEdges, GetAuthenticationsQuery, PageInfoPaginated, -} from '../../graphql/types'; -import { hostsModel, hostsSelectors, inputsModel, State, inputsSelectors } from '../../store'; -import { createFilter, getDefaultFetchPolicy } from '../helpers'; -import { generateTablePaginationOptions } from '../../components/paginated_table/helpers'; -import { withKibana, WithKibanaProps } from '../../lib/kibana'; -import { QueryTemplatePaginated, QueryTemplatePaginatedProps } from '../query_template_paginated'; - +} from '../../../graphql/types'; +import { inputsModel, State, inputsSelectors } from '../../../common/store'; +import { createFilter, getDefaultFetchPolicy } from '../../../common/containers/helpers'; +import { generateTablePaginationOptions } from '../../../common/components/paginated_table/helpers'; +import { withKibana, WithKibanaProps } from '../../../common/lib/kibana'; +import { + QueryTemplatePaginated, + QueryTemplatePaginatedProps, +} from '../../../common/containers/query_template_paginated'; +import { hostsModel, hostsSelectors } from '../../store'; import { authenticationsQuery } from './index.gql_query'; const ID = 'authenticationQuery'; diff --git a/x-pack/plugins/siem/public/containers/hosts/first_last_seen/first_last_seen.gql_query.ts b/x-pack/plugins/siem/public/hosts/containers/hosts/first_last_seen/first_last_seen.gql_query.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/hosts/first_last_seen/first_last_seen.gql_query.ts rename to x-pack/plugins/siem/public/hosts/containers/hosts/first_last_seen/first_last_seen.gql_query.ts diff --git a/x-pack/plugins/siem/public/containers/hosts/first_last_seen/index.ts b/x-pack/plugins/siem/public/hosts/containers/hosts/first_last_seen/index.ts similarity index 87% rename from x-pack/plugins/siem/public/containers/hosts/first_last_seen/index.ts rename to x-pack/plugins/siem/public/hosts/containers/hosts/first_last_seen/index.ts index a460fa8999b57..54e9147be17c0 100644 --- a/x-pack/plugins/siem/public/containers/hosts/first_last_seen/index.ts +++ b/x-pack/plugins/siem/public/hosts/containers/hosts/first_last_seen/index.ts @@ -8,11 +8,11 @@ import ApolloClient from 'apollo-client'; import { get } from 'lodash/fp'; import React, { useEffect, useState } from 'react'; -import { DEFAULT_INDEX_KEY } from '../../../../common/constants'; -import { useUiSetting$ } from '../../../lib/kibana'; -import { GetHostFirstLastSeenQuery } from '../../../graphql/types'; -import { inputsModel } from '../../../store'; -import { QueryTemplateProps } from '../../query_template'; +import { DEFAULT_INDEX_KEY } from '../../../../../common/constants'; +import { useUiSetting$ } from '../../../../common/lib/kibana'; +import { GetHostFirstLastSeenQuery } from '../../../../graphql/types'; +import { inputsModel } from '../../../../common/store'; +import { QueryTemplateProps } from '../../../../common/containers/query_template'; import { HostFirstLastSeenGqlQuery } from './first_last_seen.gql_query'; diff --git a/x-pack/plugins/siem/public/containers/hosts/first_last_seen/mock.ts b/x-pack/plugins/siem/public/hosts/containers/hosts/first_last_seen/mock.ts similarity index 89% rename from x-pack/plugins/siem/public/containers/hosts/first_last_seen/mock.ts rename to x-pack/plugins/siem/public/hosts/containers/hosts/first_last_seen/mock.ts index f59df84dacc1b..51e484ffbd859 100644 --- a/x-pack/plugins/siem/public/containers/hosts/first_last_seen/mock.ts +++ b/x-pack/plugins/siem/public/hosts/containers/hosts/first_last_seen/mock.ts @@ -4,8 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import { DEFAULT_INDEX_PATTERN } from '../../../../common/constants'; -import { GetHostFirstLastSeenQuery } from '../../../graphql/types'; +import { DEFAULT_INDEX_PATTERN } from '../../../../../common/constants'; +import { GetHostFirstLastSeenQuery } from '../../../../graphql/types'; import { HostFirstLastSeenGqlQuery } from './first_last_seen.gql_query'; diff --git a/x-pack/plugins/siem/public/containers/hosts/hosts_table.gql_query.ts b/x-pack/plugins/siem/public/hosts/containers/hosts/hosts_table.gql_query.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/hosts/hosts_table.gql_query.ts rename to x-pack/plugins/siem/public/hosts/containers/hosts/hosts_table.gql_query.ts diff --git a/x-pack/plugins/siem/public/containers/hosts/index.tsx b/x-pack/plugins/siem/public/hosts/containers/hosts/index.tsx similarity index 88% rename from x-pack/plugins/siem/public/containers/hosts/index.tsx rename to x-pack/plugins/siem/public/hosts/containers/hosts/index.tsx index 733c2224d840a..70f21b6f23cc0 100644 --- a/x-pack/plugins/siem/public/containers/hosts/index.tsx +++ b/x-pack/plugins/siem/public/hosts/containers/hosts/index.tsx @@ -11,21 +11,24 @@ import { Query } from 'react-apollo'; import { connect } from 'react-redux'; import { compose } from 'redux'; -import { DEFAULT_INDEX_KEY } from '../../../common/constants'; +import { DEFAULT_INDEX_KEY } from '../../../../common/constants'; import { Direction, GetHostsTableQuery, HostsEdges, HostsFields, PageInfoPaginated, -} from '../../graphql/types'; -import { hostsModel, hostsSelectors, inputsModel, State, inputsSelectors } from '../../store'; -import { createFilter, getDefaultFetchPolicy } from '../helpers'; -import { QueryTemplatePaginated, QueryTemplatePaginatedProps } from '../query_template_paginated'; -import { withKibana, WithKibanaProps } from '../../lib/kibana'; - +} from '../../../graphql/types'; +import { inputsModel, State, inputsSelectors } from '../../../common/store'; +import { createFilter, getDefaultFetchPolicy } from '../../../common/containers/helpers'; +import { + QueryTemplatePaginated, + QueryTemplatePaginatedProps, +} from '../../../common/containers/query_template_paginated'; +import { withKibana, WithKibanaProps } from '../../../common/lib/kibana'; +import { hostsModel, hostsSelectors } from '../../store'; import { HostsTableQuery } from './hosts_table.gql_query'; -import { generateTablePaginationOptions } from '../../components/paginated_table/helpers'; +import { generateTablePaginationOptions } from '../../../common/components/paginated_table/helpers'; const ID = 'hostsQuery'; diff --git a/x-pack/plugins/siem/public/containers/hosts/overview/host_overview.gql_query.ts b/x-pack/plugins/siem/public/hosts/containers/hosts/overview/host_overview.gql_query.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/hosts/overview/host_overview.gql_query.ts rename to x-pack/plugins/siem/public/hosts/containers/hosts/overview/host_overview.gql_query.ts diff --git a/x-pack/plugins/siem/public/containers/hosts/overview/index.tsx b/x-pack/plugins/siem/public/hosts/containers/hosts/overview/index.tsx similarity index 85% rename from x-pack/plugins/siem/public/containers/hosts/overview/index.tsx rename to x-pack/plugins/siem/public/hosts/containers/hosts/overview/index.tsx index 5057e872b5313..5267fff3a26d6 100644 --- a/x-pack/plugins/siem/public/containers/hosts/overview/index.tsx +++ b/x-pack/plugins/siem/public/hosts/containers/hosts/overview/index.tsx @@ -10,14 +10,14 @@ import { Query } from 'react-apollo'; import { connect } from 'react-redux'; import { compose } from 'redux'; -import { DEFAULT_INDEX_KEY } from '../../../../common/constants'; -import { inputsModel, inputsSelectors, State } from '../../../store'; -import { getDefaultFetchPolicy } from '../../helpers'; -import { QueryTemplate, QueryTemplateProps } from '../../query_template'; -import { withKibana, WithKibanaProps } from '../../../lib/kibana'; +import { DEFAULT_INDEX_KEY } from '../../../../../common/constants'; +import { inputsModel, inputsSelectors, State } from '../../../../common/store'; +import { getDefaultFetchPolicy } from '../../../../common/containers/helpers'; +import { QueryTemplate, QueryTemplateProps } from '../../../../common/containers/query_template'; +import { withKibana, WithKibanaProps } from '../../../../common/lib/kibana'; import { HostOverviewQuery } from './host_overview.gql_query'; -import { GetHostOverviewQuery, HostItem } from '../../../graphql/types'; +import { GetHostOverviewQuery, HostItem } from '../../../../graphql/types'; const ID = 'hostOverviewQuery'; diff --git a/x-pack/plugins/siem/public/containers/kpi_host_details/index.gql_query.tsx b/x-pack/plugins/siem/public/hosts/containers/kpi_host_details/index.gql_query.tsx similarity index 100% rename from x-pack/plugins/siem/public/containers/kpi_host_details/index.gql_query.tsx rename to x-pack/plugins/siem/public/hosts/containers/kpi_host_details/index.gql_query.tsx diff --git a/x-pack/plugins/siem/public/containers/kpi_host_details/index.tsx b/x-pack/plugins/siem/public/hosts/containers/kpi_host_details/index.tsx similarity index 86% rename from x-pack/plugins/siem/public/containers/kpi_host_details/index.tsx rename to x-pack/plugins/siem/public/hosts/containers/kpi_host_details/index.tsx index de9d54b1a185c..1551e7d706714 100644 --- a/x-pack/plugins/siem/public/containers/kpi_host_details/index.tsx +++ b/x-pack/plugins/siem/public/hosts/containers/kpi_host_details/index.tsx @@ -9,12 +9,12 @@ import React from 'react'; import { Query } from 'react-apollo'; import { connect, ConnectedProps } from 'react-redux'; -import { DEFAULT_INDEX_KEY } from '../../../common/constants'; -import { KpiHostDetailsData, GetKpiHostDetailsQuery } from '../../graphql/types'; -import { inputsModel, inputsSelectors, State } from '../../store'; -import { useUiSetting } from '../../lib/kibana'; -import { createFilter, getDefaultFetchPolicy } from '../helpers'; -import { QueryTemplateProps } from '../query_template'; +import { DEFAULT_INDEX_KEY } from '../../../../common/constants'; +import { KpiHostDetailsData, GetKpiHostDetailsQuery } from '../../../graphql/types'; +import { inputsModel, inputsSelectors, State } from '../../../common/store'; +import { useUiSetting } from '../../../common/lib/kibana'; +import { createFilter, getDefaultFetchPolicy } from '../../../common/containers/helpers'; +import { QueryTemplateProps } from '../../../common/containers/query_template'; import { kpiHostDetailsQuery } from './index.gql_query'; diff --git a/x-pack/plugins/siem/public/containers/kpi_hosts/index.gql_query.ts b/x-pack/plugins/siem/public/hosts/containers/kpi_hosts/index.gql_query.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/kpi_hosts/index.gql_query.ts rename to x-pack/plugins/siem/public/hosts/containers/kpi_hosts/index.gql_query.ts diff --git a/x-pack/plugins/siem/public/containers/kpi_hosts/index.tsx b/x-pack/plugins/siem/public/hosts/containers/kpi_hosts/index.tsx similarity index 83% rename from x-pack/plugins/siem/public/containers/kpi_hosts/index.tsx rename to x-pack/plugins/siem/public/hosts/containers/kpi_hosts/index.tsx index 5be2423e8a162..1a6df58f04597 100644 --- a/x-pack/plugins/siem/public/containers/kpi_hosts/index.tsx +++ b/x-pack/plugins/siem/public/hosts/containers/kpi_hosts/index.tsx @@ -9,12 +9,12 @@ import React from 'react'; import { Query } from 'react-apollo'; import { connect, ConnectedProps } from 'react-redux'; -import { DEFAULT_INDEX_KEY } from '../../../common/constants'; -import { GetKpiHostsQuery, KpiHostsData } from '../../graphql/types'; -import { inputsModel, inputsSelectors, State } from '../../store'; -import { useUiSetting } from '../../lib/kibana'; -import { createFilter, getDefaultFetchPolicy } from '../helpers'; -import { QueryTemplateProps } from '../query_template'; +import { DEFAULT_INDEX_KEY } from '../../../../common/constants'; +import { GetKpiHostsQuery, KpiHostsData } from '../../../graphql/types'; +import { inputsModel, inputsSelectors, State } from '../../../common/store'; +import { useUiSetting } from '../../../common/lib/kibana'; +import { createFilter, getDefaultFetchPolicy } from '../../../common/containers/helpers'; +import { QueryTemplateProps } from '../../../common/containers/query_template'; import { kpiHostsQuery } from './index.gql_query'; diff --git a/x-pack/plugins/siem/public/containers/uncommon_processes/index.gql_query.ts b/x-pack/plugins/siem/public/hosts/containers/uncommon_processes/index.gql_query.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/uncommon_processes/index.gql_query.ts rename to x-pack/plugins/siem/public/hosts/containers/uncommon_processes/index.gql_query.ts diff --git a/x-pack/plugins/siem/public/containers/uncommon_processes/index.tsx b/x-pack/plugins/siem/public/hosts/containers/uncommon_processes/index.tsx similarity index 87% rename from x-pack/plugins/siem/public/containers/uncommon_processes/index.tsx rename to x-pack/plugins/siem/public/hosts/containers/uncommon_processes/index.tsx index 0a2ce67d9be80..f8e5b1bed73cd 100644 --- a/x-pack/plugins/siem/public/containers/uncommon_processes/index.tsx +++ b/x-pack/plugins/siem/public/hosts/containers/uncommon_processes/index.tsx @@ -10,18 +10,21 @@ import { Query } from 'react-apollo'; import { connect, ConnectedProps } from 'react-redux'; import { compose } from 'redux'; -import { DEFAULT_INDEX_KEY } from '../../../common/constants'; +import { DEFAULT_INDEX_KEY } from '../../../../common/constants'; import { GetUncommonProcessesQuery, PageInfoPaginated, UncommonProcessesEdges, -} from '../../graphql/types'; -import { hostsModel, hostsSelectors, inputsModel, State, inputsSelectors } from '../../store'; -import { withKibana, WithKibanaProps } from '../../lib/kibana'; -import { generateTablePaginationOptions } from '../../components/paginated_table/helpers'; -import { createFilter, getDefaultFetchPolicy } from '../helpers'; -import { QueryTemplatePaginated, QueryTemplatePaginatedProps } from '../query_template_paginated'; - +} from '../../../graphql/types'; +import { inputsModel, State, inputsSelectors } from '../../../common/store'; +import { withKibana, WithKibanaProps } from '../../../common/lib/kibana'; +import { generateTablePaginationOptions } from '../../../common/components/paginated_table/helpers'; +import { createFilter, getDefaultFetchPolicy } from '../../../common/containers/helpers'; +import { + QueryTemplatePaginated, + QueryTemplatePaginatedProps, +} from '../../../common/containers/query_template_paginated'; +import { hostsModel, hostsSelectors } from '../../store'; import { uncommonProcessesQuery } from './index.gql_query'; const ID = 'uncommonProcessesQuery'; diff --git a/x-pack/plugins/siem/public/hosts/index.ts b/x-pack/plugins/siem/public/hosts/index.ts new file mode 100644 index 0000000000000..6f27428e71c27 --- /dev/null +++ b/x-pack/plugins/siem/public/hosts/index.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { SecuritySubPluginWithStore } from '../app/types'; +import { getHostsRoutes } from './routes'; +import { initialHostsState, hostsReducer, HostsState } from './store'; + +export class Hosts { + public setup() {} + + public start(): SecuritySubPluginWithStore<'hosts', HostsState> { + return { + routes: getHostsRoutes(), + store: { + initialState: { hosts: initialHostsState }, + reducer: { hosts: hostsReducer }, + }, + }; + } +} diff --git a/x-pack/plugins/siem/public/pages/hosts/details/details_tabs.test.tsx b/x-pack/plugins/siem/public/hosts/pages/details/details_tabs.test.tsx similarity index 92% rename from x-pack/plugins/siem/public/pages/hosts/details/details_tabs.test.tsx rename to x-pack/plugins/siem/public/hosts/pages/details/details_tabs.test.tsx index 81c1b317d4596..fa76dc93375e0 100644 --- a/x-pack/plugins/siem/public/pages/hosts/details/details_tabs.test.tsx +++ b/x-pack/plugins/siem/public/hosts/pages/details/details_tabs.test.tsx @@ -9,16 +9,16 @@ import { IIndexPattern } from 'src/plugins/data/public'; import { MemoryRouter } from 'react-router-dom'; import useResizeObserver from 'use-resize-observer/polyfilled'; -import { mockIndexPattern } from '../../../mock/index_pattern'; -import { TestProviders } from '../../../mock/test_providers'; +import { mockIndexPattern } from '../../../common/mock/index_pattern'; +import { TestProviders } from '../../../common/mock/test_providers'; import { HostDetailsTabs } from './details_tabs'; import { HostDetailsTabsProps, SetAbsoluteRangeDatePicker } from './types'; import { hostDetailsPagePath } from '../types'; import { type } from './utils'; -import { useMountAppended } from '../../../utils/use_mount_appended'; +import { useMountAppended } from '../../../common/utils/use_mount_appended'; import { getHostDetailsPageFilters } from './helpers'; -jest.mock('../../../containers/source', () => ({ +jest.mock('../../../common/containers/source', () => ({ indicesExistOrDataTemporarilyUnavailable: () => true, WithSource: ({ children, @@ -29,10 +29,10 @@ jest.mock('../../../containers/source', () => ({ // Test will fail because we will to need to mock some core services to make the test work // For now let's forget about SiemSearchBar and QueryBar -jest.mock('../../../components/search_bar', () => ({ +jest.mock('../../../common/components/search_bar', () => ({ SiemSearchBar: () => null, })); -jest.mock('../../../components/query_bar', () => ({ +jest.mock('../../../common/components/query_bar', () => ({ QueryBar: () => null, })); diff --git a/x-pack/plugins/siem/public/pages/hosts/details/details_tabs.tsx b/x-pack/plugins/siem/public/hosts/pages/details/details_tabs.tsx similarity index 85% rename from x-pack/plugins/siem/public/pages/hosts/details/details_tabs.tsx rename to x-pack/plugins/siem/public/hosts/pages/details/details_tabs.tsx index d6c0211901ff0..505d0f37ca039 100644 --- a/x-pack/plugins/siem/public/pages/hosts/details/details_tabs.tsx +++ b/x-pack/plugins/siem/public/hosts/pages/details/details_tabs.tsx @@ -7,12 +7,12 @@ import React, { useCallback } from 'react'; import { Route, Switch } from 'react-router-dom'; -import { UpdateDateRange } from '../../../components/charts/common'; -import { scoreIntervalToDateTime } from '../../../components/ml/score/score_interval_to_datetime'; -import { Anomaly } from '../../../components/ml/types'; -import { HostsTableType } from '../../../store/hosts/model'; -import { AnomaliesQueryTabBody } from '../../../containers/anomalies/anomalies_query_tab_body'; -import { AnomaliesHostTable } from '../../../components/ml/tables/anomalies_host_table'; +import { UpdateDateRange } from '../../../common/components/charts/common'; +import { scoreIntervalToDateTime } from '../../../common/components/ml/score/score_interval_to_datetime'; +import { Anomaly } from '../../../common/components/ml/types'; +import { HostsTableType } from '../../store/model'; +import { AnomaliesQueryTabBody } from '../../../common/containers/anomalies/anomalies_query_tab_body'; +import { AnomaliesHostTable } from '../../../common/components/ml/tables/anomalies_host_table'; import { HostDetailsTabsProps } from './types'; import { type } from './utils'; diff --git a/x-pack/plugins/siem/public/pages/hosts/details/helpers.test.ts b/x-pack/plugins/siem/public/hosts/pages/details/helpers.test.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/hosts/details/helpers.test.ts rename to x-pack/plugins/siem/public/hosts/pages/details/helpers.test.ts diff --git a/x-pack/plugins/siem/public/pages/hosts/details/helpers.ts b/x-pack/plugins/siem/public/hosts/pages/details/helpers.ts similarity index 95% rename from x-pack/plugins/siem/public/pages/hosts/details/helpers.ts rename to x-pack/plugins/siem/public/hosts/pages/details/helpers.ts index 6da76f2fb5cac..9ec0084d708a0 100644 --- a/x-pack/plugins/siem/public/pages/hosts/details/helpers.ts +++ b/x-pack/plugins/siem/public/hosts/pages/details/helpers.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { escapeQueryValue } from '../../../lib/keury'; +import { escapeQueryValue } from '../../../common/lib/keury'; import { Filter } from '../../../../../../../src/plugins/data/public'; /** Returns the kqlQueryExpression for the `Events` widget on the `Host Details` page */ diff --git a/x-pack/plugins/siem/public/pages/hosts/details/index.tsx b/x-pack/plugins/siem/public/hosts/pages/details/index.tsx similarity index 81% rename from x-pack/plugins/siem/public/pages/hosts/details/index.tsx rename to x-pack/plugins/siem/public/hosts/pages/details/index.tsx index afed0fab0ade7..a5fabf4d515f8 100644 --- a/x-pack/plugins/siem/public/pages/hosts/details/index.tsx +++ b/x-pack/plugins/siem/public/hosts/pages/details/index.tsx @@ -9,31 +9,34 @@ import React, { useEffect, useCallback, useMemo } from 'react'; import { connect, ConnectedProps } from 'react-redux'; import { StickyContainer } from 'react-sticky'; -import { UpdateDateRange } from '../../../components/charts/common'; -import { FiltersGlobal } from '../../../components/filters_global'; -import { HeaderPage } from '../../../components/header_page'; -import { LastEventTime } from '../../../components/last_event_time'; -import { AnomalyTableProvider } from '../../../components/ml/anomaly/anomaly_table_provider'; -import { hostToCriteria } from '../../../components/ml/criteria/host_to_criteria'; +import { UpdateDateRange } from '../../../common/components/charts/common'; +import { FiltersGlobal } from '../../../common/components/filters_global'; +import { HeaderPage } from '../../../common/components/header_page'; +import { LastEventTime } from '../../../common/components/last_event_time'; +import { AnomalyTableProvider } from '../../../common/components/ml/anomaly/anomaly_table_provider'; +import { hostToCriteria } from '../../../common/components/ml/criteria/host_to_criteria'; import { hasMlUserPermissions } from '../../../../common/machine_learning/has_ml_user_permissions'; -import { useMlCapabilities } from '../../../components/ml_popover/hooks/use_ml_capabilities'; -import { scoreIntervalToDateTime } from '../../../components/ml/score/score_interval_to_datetime'; -import { SiemNavigation } from '../../../components/navigation'; -import { KpiHostsComponent } from '../../../components/page/hosts'; -import { HostOverview } from '../../../components/page/hosts/host_overview'; -import { manageQuery } from '../../../components/page/manage_query'; -import { SiemSearchBar } from '../../../components/search_bar'; -import { WrapperPage } from '../../../components/wrapper_page'; -import { HostOverviewByNameQuery } from '../../../containers/hosts/overview'; -import { KpiHostDetailsQuery } from '../../../containers/kpi_host_details'; -import { indicesExistOrDataTemporarilyUnavailable, WithSource } from '../../../containers/source'; +import { useMlCapabilities } from '../../../common/components/ml_popover/hooks/use_ml_capabilities'; +import { scoreIntervalToDateTime } from '../../../common/components/ml/score/score_interval_to_datetime'; +import { SiemNavigation } from '../../../common/components/navigation'; +import { KpiHostsComponent } from '../../components/kpi_hosts'; +import { HostOverview } from '../../../overview/components/host_overview'; +import { manageQuery } from '../../../common/components/page/manage_query'; +import { SiemSearchBar } from '../../../common/components/search_bar'; +import { WrapperPage } from '../../../common/components/wrapper_page'; +import { HostOverviewByNameQuery } from '../../containers/hosts/overview'; +import { KpiHostDetailsQuery } from '../../containers/kpi_host_details'; +import { + indicesExistOrDataTemporarilyUnavailable, + WithSource, +} from '../../../common/containers/source'; import { LastEventIndexKey } from '../../../graphql/types'; -import { useKibana } from '../../../lib/kibana'; -import { convertToBuildEsQuery } from '../../../lib/keury'; -import { inputsSelectors, State } from '../../../store'; -import { setHostDetailsTablesActivePageToZero as dispatchHostDetailsTablesActivePageToZero } from '../../../store/hosts/actions'; -import { setAbsoluteRangeDatePicker as dispatchAbsoluteRangeDatePicker } from '../../../store/inputs/actions'; -import { SpyRoute } from '../../../utils/route/spy_routes'; +import { useKibana } from '../../../common/lib/kibana'; +import { convertToBuildEsQuery } from '../../../common/lib/keury'; +import { inputsSelectors, State } from '../../../common/store'; +import { setHostDetailsTablesActivePageToZero as dispatchHostDetailsTablesActivePageToZero } from '../../store/actions'; +import { setAbsoluteRangeDatePicker as dispatchAbsoluteRangeDatePicker } from '../../../common/store/inputs/actions'; +import { SpyRoute } from '../../../common/utils/route/spy_routes'; import { esQuery, Filter } from '../../../../../../../src/plugins/data/public'; import { HostsEmptyPage } from '../hosts_empty_page'; diff --git a/x-pack/plugins/siem/public/pages/hosts/details/nav_tabs.test.tsx b/x-pack/plugins/siem/public/hosts/pages/details/nav_tabs.test.tsx similarity index 94% rename from x-pack/plugins/siem/public/pages/hosts/details/nav_tabs.test.tsx rename to x-pack/plugins/siem/public/hosts/pages/details/nav_tabs.test.tsx index 6710edb7b20fa..0dd31dc9abce7 100644 --- a/x-pack/plugins/siem/public/pages/hosts/details/nav_tabs.test.tsx +++ b/x-pack/plugins/siem/public/hosts/pages/details/nav_tabs.test.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { HostsTableType } from '../../../store/hosts/model'; +import { HostsTableType } from '../../store/model'; import { navTabsHostDetails } from './nav_tabs'; describe('navTabsHostDetails', () => { diff --git a/x-pack/plugins/siem/public/pages/hosts/details/nav_tabs.tsx b/x-pack/plugins/siem/public/hosts/pages/details/nav_tabs.tsx similarity index 93% rename from x-pack/plugins/siem/public/pages/hosts/details/nav_tabs.tsx rename to x-pack/plugins/siem/public/hosts/pages/details/nav_tabs.tsx index f828dc250f0d3..4d04d16580a63 100644 --- a/x-pack/plugins/siem/public/pages/hosts/details/nav_tabs.tsx +++ b/x-pack/plugins/siem/public/hosts/pages/details/nav_tabs.tsx @@ -5,10 +5,10 @@ */ import { omit } from 'lodash/fp'; -import * as i18n from './../translations'; +import * as i18n from '../translations'; import { HostDetailsNavTab } from './types'; -import { HostsTableType } from '../../../store/hosts/model'; -import { SiemPageName } from '../../home/types'; +import { HostsTableType } from '../../store/model'; +import { SiemPageName } from '../../../app/types'; const getTabsOnHostDetailsUrl = (hostName: string, tabName: HostsTableType) => `#/${SiemPageName.hosts}/${hostName}/${tabName}`; diff --git a/x-pack/plugins/siem/public/pages/hosts/details/types.ts b/x-pack/plugins/siem/public/hosts/pages/details/types.ts similarity index 85% rename from x-pack/plugins/siem/public/pages/hosts/details/types.ts rename to x-pack/plugins/siem/public/hosts/pages/details/types.ts index 03c8646bae147..f145abed2d8ff 100644 --- a/x-pack/plugins/siem/public/pages/hosts/details/types.ts +++ b/x-pack/plugins/siem/public/hosts/pages/details/types.ts @@ -6,13 +6,13 @@ import { ActionCreator } from 'typescript-fsa'; import { Query, IIndexPattern, Filter } from 'src/plugins/data/public'; -import { InputsModelId } from '../../../store/inputs/constants'; -import { HostComponentProps } from '../../../components/link_to/redirect_to_hosts'; -import { HostsTableType } from '../../../store/hosts/model'; +import { InputsModelId } from '../../../common/store/inputs/constants'; +import { HostComponentProps } from '../../../common/components/link_to/redirect_to_hosts'; +import { HostsTableType } from '../../store/model'; import { HostsQueryProps } from '../types'; -import { NavTab } from '../../../components/navigation/types'; +import { NavTab } from '../../../common/components/navigation/types'; import { KeyHostsNavTabWithoutMlPermission } from '../navigation/types'; -import { hostsModel } from '../../../store'; +import { hostsModel } from '../../store'; interface HostDetailsComponentReduxProps { query: Query; diff --git a/x-pack/plugins/siem/public/pages/hosts/details/utils.ts b/x-pack/plugins/siem/public/hosts/pages/details/utils.ts similarity index 83% rename from x-pack/plugins/siem/public/pages/hosts/details/utils.ts rename to x-pack/plugins/siem/public/hosts/pages/details/utils.ts index af4ba8eb091e2..d45cb3368b4e1 100644 --- a/x-pack/plugins/siem/public/pages/hosts/details/utils.ts +++ b/x-pack/plugins/siem/public/hosts/pages/details/utils.ts @@ -6,13 +6,17 @@ import { get, isEmpty } from 'lodash/fp'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { ChromeBreadcrumb } from '../../../../../../../src/core/public'; -import { hostsModel } from '../../../store'; -import { HostsTableType } from '../../../store/hosts/model'; -import { getHostsUrl, getHostDetailsUrl } from '../../../components/link_to/redirect_to_hosts'; +import { hostsModel } from '../../store'; +import { HostsTableType } from '../../store/model'; +import { + getHostsUrl, + getHostDetailsUrl, +} from '../../../common/components/link_to/redirect_to_hosts'; import * as i18n from '../translations'; -import { HostRouteSpyState } from '../../../utils/route/types'; +import { HostRouteSpyState } from '../../../common/utils/route/types'; export const type = hostsModel.HostsType.details; diff --git a/x-pack/plugins/siem/public/pages/hosts/hosts.test.tsx b/x-pack/plugins/siem/public/hosts/pages/hosts.test.tsx similarity index 88% rename from x-pack/plugins/siem/public/pages/hosts/hosts.test.tsx rename to x-pack/plugins/siem/public/hosts/pages/hosts.test.tsx index 6134c1dd6911a..5cb35eaa775b6 100644 --- a/x-pack/plugins/siem/public/pages/hosts/hosts.test.tsx +++ b/x-pack/plugins/siem/public/hosts/pages/hosts.test.tsx @@ -11,23 +11,28 @@ import { Router } from 'react-router-dom'; import { MockedProvider } from 'react-apollo/test-utils'; import { Filter } from '../../../../../../src/plugins/data/common/es_query'; -import '../../mock/match_media'; -import { mocksSource } from '../../containers/source/mock'; -import { wait } from '../../lib/helpers'; -import { apolloClientObservable, TestProviders, mockGlobalState } from '../../mock'; -import { SiemNavigation } from '../../components/navigation'; -import { inputsActions } from '../../store/inputs'; -import { State, createStore } from '../../store'; +import '../../common/mock/match_media'; +import { mocksSource } from '../../common/containers/source/mock'; +import { wait } from '../../common/lib/helpers'; +import { + apolloClientObservable, + TestProviders, + mockGlobalState, + SUB_PLUGINS_REDUCER, +} from '../../common/mock'; +import { SiemNavigation } from '../../common/components/navigation'; +import { inputsActions } from '../../common/store/inputs'; +import { State, createStore } from '../../common/store'; import { HostsComponentProps } from './types'; import { Hosts } from './hosts'; import { HostsTabs } from './hosts_tabs'; // Test will fail because we will to need to mock some core services to make the test work // For now let's forget about SiemSearchBar and QueryBar -jest.mock('../../components/search_bar', () => ({ +jest.mock('../../common/components/search_bar', () => ({ SiemSearchBar: () => null, })); -jest.mock('../../components/query_bar', () => ({ +jest.mock('../../common/components/query_bar', () => ({ QueryBar: () => null, })); @@ -166,7 +171,7 @@ describe('Hosts - rendering', () => { ]; localSource[0].result.data.source.status.indicesExist = true; const myState: State = mockGlobalState; - const myStore = createStore(myState, apolloClientObservable); + const myStore = createStore(myState, SUB_PLUGINS_REDUCER, apolloClientObservable); const wrapper = mount( diff --git a/x-pack/plugins/siem/public/pages/hosts/hosts.tsx b/x-pack/plugins/siem/public/hosts/pages/hosts.tsx similarity index 81% rename from x-pack/plugins/siem/public/pages/hosts/hosts.tsx rename to x-pack/plugins/siem/public/hosts/pages/hosts.tsx index 0e29d634d07a6..f7583f65a4fcd 100644 --- a/x-pack/plugins/siem/public/pages/hosts/hosts.tsx +++ b/x-pack/plugins/siem/public/hosts/pages/hosts.tsx @@ -10,34 +10,38 @@ import { connect, ConnectedProps } from 'react-redux'; import { StickyContainer } from 'react-sticky'; import { useParams } from 'react-router-dom'; -import { UpdateDateRange } from '../../components/charts/common'; -import { FiltersGlobal } from '../../components/filters_global'; -import { HeaderPage } from '../../components/header_page'; -import { LastEventTime } from '../../components/last_event_time'; +import { UpdateDateRange } from '../../common/components/charts/common'; +import { FiltersGlobal } from '../../common/components/filters_global'; +import { HeaderPage } from '../../common/components/header_page'; +import { LastEventTime } from '../../common/components/last_event_time'; import { hasMlUserPermissions } from '../../../common/machine_learning/has_ml_user_permissions'; -import { SiemNavigation } from '../../components/navigation'; -import { KpiHostsComponent } from '../../components/page/hosts'; -import { manageQuery } from '../../components/page/manage_query'; -import { SiemSearchBar } from '../../components/search_bar'; -import { WrapperPage } from '../../components/wrapper_page'; -import { KpiHostsQuery } from '../../containers/kpi_hosts'; -import { indicesExistOrDataTemporarilyUnavailable, WithSource } from '../../containers/source'; +import { SiemNavigation } from '../../common/components/navigation'; +import { KpiHostsComponent } from '../components/kpi_hosts'; +import { manageQuery } from '../../common/components/page/manage_query'; +import { SiemSearchBar } from '../../common/components/search_bar'; +import { WrapperPage } from '../../common/components/wrapper_page'; +import { KpiHostsQuery } from '../containers/kpi_hosts'; +import { + indicesExistOrDataTemporarilyUnavailable, + WithSource, +} from '../../common/containers/source'; import { LastEventIndexKey } from '../../graphql/types'; -import { useKibana } from '../../lib/kibana'; -import { convertToBuildEsQuery } from '../../lib/keury'; -import { inputsSelectors, State, hostsModel } from '../../store'; -import { setAbsoluteRangeDatePicker as dispatchSetAbsoluteRangeDatePicker } from '../../store/inputs/actions'; +import { useKibana } from '../../common/lib/kibana'; +import { convertToBuildEsQuery } from '../../common/lib/keury'; +import { inputsSelectors, State } from '../../common/store'; +import { setAbsoluteRangeDatePicker as dispatchSetAbsoluteRangeDatePicker } from '../../common/store/inputs/actions'; -import { SpyRoute } from '../../utils/route/spy_routes'; +import { SpyRoute } from '../../common/utils/route/spy_routes'; import { esQuery } from '../../../../../../src/plugins/data/public'; -import { useMlCapabilities } from '../../components/ml_popover/hooks/use_ml_capabilities'; +import { useMlCapabilities } from '../../common/components/ml_popover/hooks/use_ml_capabilities'; import { HostsEmptyPage } from './hosts_empty_page'; import { HostsTabs } from './hosts_tabs'; import { navTabsHosts } from './nav_tabs'; import * as i18n from './translations'; import { HostsComponentProps } from './types'; import { filterHostData } from './navigation'; -import { HostsTableType } from '../../store/hosts/model'; +import { hostsModel } from '../store'; +import { HostsTableType } from '../store/model'; const KpiHostsComponentManage = manageQuery(KpiHostsComponent); diff --git a/x-pack/plugins/siem/public/pages/hosts/hosts_empty_page.tsx b/x-pack/plugins/siem/public/hosts/pages/hosts_empty_page.tsx similarity index 85% rename from x-pack/plugins/siem/public/pages/hosts/hosts_empty_page.tsx rename to x-pack/plugins/siem/public/hosts/pages/hosts_empty_page.tsx index bded0b90e187b..e52fc89678038 100644 --- a/x-pack/plugins/siem/public/pages/hosts/hosts_empty_page.tsx +++ b/x-pack/plugins/siem/public/hosts/pages/hosts_empty_page.tsx @@ -6,10 +6,9 @@ import React from 'react'; -import { EmptyPage } from '../../components/empty_page'; -import { useKibana } from '../../lib/kibana'; - -import * as i18n from '../common/translations'; +import { EmptyPage } from '../../common/components/empty_page'; +import { useKibana } from '../../common/lib/kibana'; +import * as i18n from '../../common/translations'; export const HostsEmptyPage = React.memo(() => { const { http, docLinks } = useKibana().services; diff --git a/x-pack/plugins/siem/public/pages/hosts/hosts_tabs.tsx b/x-pack/plugins/siem/public/hosts/pages/hosts_tabs.tsx similarity index 84% rename from x-pack/plugins/siem/public/pages/hosts/hosts_tabs.tsx rename to x-pack/plugins/siem/public/hosts/pages/hosts_tabs.tsx index de25deeb5b477..549c198a43526 100644 --- a/x-pack/plugins/siem/public/pages/hosts/hosts_tabs.tsx +++ b/x-pack/plugins/siem/public/hosts/pages/hosts_tabs.tsx @@ -8,12 +8,12 @@ import React, { memo, useCallback } from 'react'; import { Route, Switch } from 'react-router-dom'; import { HostsTabsProps } from './types'; -import { scoreIntervalToDateTime } from '../../components/ml/score/score_interval_to_datetime'; -import { Anomaly } from '../../components/ml/types'; -import { HostsTableType } from '../../store/hosts/model'; -import { AnomaliesQueryTabBody } from '../../containers/anomalies/anomalies_query_tab_body'; -import { AnomaliesHostTable } from '../../components/ml/tables/anomalies_host_table'; -import { UpdateDateRange } from '../../components/charts/common'; +import { scoreIntervalToDateTime } from '../../common/components/ml/score/score_interval_to_datetime'; +import { Anomaly } from '../../common/components/ml/types'; +import { HostsTableType } from '../store/model'; +import { AnomaliesQueryTabBody } from '../../common/containers/anomalies/anomalies_query_tab_body'; +import { AnomaliesHostTable } from '../../common/components/ml/tables/anomalies_host_table'; +import { UpdateDateRange } from '../../common/components/charts/common'; import { HostsQueryTabBody, diff --git a/x-pack/plugins/siem/public/pages/hosts/index.tsx b/x-pack/plugins/siem/public/hosts/pages/index.tsx similarity index 94% rename from x-pack/plugins/siem/public/pages/hosts/index.tsx rename to x-pack/plugins/siem/public/hosts/pages/index.tsx index 699b1441905c3..336abc60e5ba1 100644 --- a/x-pack/plugins/siem/public/pages/hosts/index.tsx +++ b/x-pack/plugins/siem/public/hosts/pages/index.tsx @@ -8,10 +8,10 @@ import React from 'react'; import { Redirect, Route, Switch, RouteComponentProps } from 'react-router-dom'; import { HostDetails } from './details'; -import { HostsTableType } from '../../store/hosts/model'; +import { HostsTableType } from '../store/model'; -import { GlobalTime } from '../../containers/global_time'; -import { SiemPageName } from '../home/types'; +import { GlobalTime } from '../../common/containers/global_time'; +import { SiemPageName } from '../../app/types'; import { Hosts } from './hosts'; import { hostsPagePath, hostDetailsPagePath } from './types'; diff --git a/x-pack/plugins/siem/public/pages/hosts/nav_tabs.test.tsx b/x-pack/plugins/siem/public/hosts/pages/nav_tabs.test.tsx similarity index 95% rename from x-pack/plugins/siem/public/pages/hosts/nav_tabs.test.tsx rename to x-pack/plugins/siem/public/hosts/pages/nav_tabs.test.tsx index a42e83c835c61..745c454e13f5a 100644 --- a/x-pack/plugins/siem/public/pages/hosts/nav_tabs.test.tsx +++ b/x-pack/plugins/siem/public/hosts/pages/nav_tabs.test.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { HostsTableType } from '../../store/hosts/model'; +import { HostsTableType } from '../store/model'; import { navTabsHosts } from './nav_tabs'; describe('navTabsHosts', () => { diff --git a/x-pack/plugins/siem/public/pages/hosts/nav_tabs.tsx b/x-pack/plugins/siem/public/hosts/pages/nav_tabs.tsx similarity index 95% rename from x-pack/plugins/siem/public/pages/hosts/nav_tabs.tsx rename to x-pack/plugins/siem/public/hosts/pages/nav_tabs.tsx index 4109feff099e0..9bab3f7efe74a 100644 --- a/x-pack/plugins/siem/public/pages/hosts/nav_tabs.tsx +++ b/x-pack/plugins/siem/public/hosts/pages/nav_tabs.tsx @@ -6,9 +6,9 @@ import { omit } from 'lodash/fp'; import * as i18n from './translations'; -import { HostsTableType } from '../../store/hosts/model'; +import { HostsTableType } from '../store/model'; import { HostsNavTab } from './navigation/types'; -import { SiemPageName } from '../home/types'; +import { SiemPageName } from '../../app/types'; const getTabsOnHostsUrl = (tabName: HostsTableType) => `#/${SiemPageName.hosts}/${tabName}`; diff --git a/x-pack/plugins/siem/public/pages/hosts/navigation/alerts_query_tab_body.tsx b/x-pack/plugins/siem/public/hosts/pages/navigation/alerts_query_tab_body.tsx similarity index 95% rename from x-pack/plugins/siem/public/pages/hosts/navigation/alerts_query_tab_body.tsx rename to x-pack/plugins/siem/public/hosts/pages/navigation/alerts_query_tab_body.tsx index ec33834b1bf73..a0d8df6b87514 100644 --- a/x-pack/plugins/siem/public/pages/hosts/navigation/alerts_query_tab_body.tsx +++ b/x-pack/plugins/siem/public/hosts/pages/navigation/alerts_query_tab_body.tsx @@ -7,7 +7,7 @@ import React, { useMemo } from 'react'; import { Filter } from '../../../../../../../src/plugins/data/public'; -import { AlertsView } from '../../../components/alerts_viewer'; +import { AlertsView } from '../../../common/components/alerts_viewer'; import { AlertsComponentQueryProps } from './types'; export const filterHostData: Filter[] = [ diff --git a/x-pack/plugins/siem/public/pages/hosts/navigation/authentications_query_tab_body.tsx b/x-pack/plugins/siem/public/hosts/pages/navigation/authentications_query_tab_body.tsx similarity index 86% rename from x-pack/plugins/siem/public/pages/hosts/navigation/authentications_query_tab_body.tsx rename to x-pack/plugins/siem/public/hosts/pages/navigation/authentications_query_tab_body.tsx index 5a6759fd07221..ae7c0205acf56 100644 --- a/x-pack/plugins/siem/public/pages/hosts/navigation/authentications_query_tab_body.tsx +++ b/x-pack/plugins/siem/public/hosts/pages/navigation/authentications_query_tab_body.tsx @@ -6,18 +6,18 @@ import { getOr } from 'lodash/fp'; import React, { useEffect } from 'react'; -import { AuthenticationTable } from '../../../components/page/hosts/authentications_table'; -import { manageQuery } from '../../../components/page/manage_query'; -import { AuthenticationsQuery } from '../../../containers/authentications'; +import { AuthenticationTable } from '../../components/authentications_table'; +import { manageQuery } from '../../../common/components/page/manage_query'; +import { AuthenticationsQuery } from '../../containers/authentications'; import { HostsComponentsQueryProps } from './types'; -import { hostsModel } from '../../../store/hosts'; +import { hostsModel } from '../../store'; import { MatrixHistogramOption, MatrixHistogramMappingTypes, MatrixHisrogramConfigs, -} from '../../../components/matrix_histogram/types'; -import { MatrixHistogramContainer } from '../../../components/matrix_histogram'; -import { KpiHostsChartColors } from '../../../components/page/hosts/kpi_hosts/types'; +} from '../../../common/components/matrix_histogram/types'; +import { MatrixHistogramContainer } from '../../../common/components/matrix_histogram'; +import { KpiHostsChartColors } from '../../components/kpi_hosts/types'; import * as i18n from '../translations'; import { HistogramType } from '../../../graphql/types'; diff --git a/x-pack/plugins/siem/public/pages/hosts/navigation/events_query_tab_body.tsx b/x-pack/plugins/siem/public/hosts/pages/navigation/events_query_tab_body.tsx similarity index 85% rename from x-pack/plugins/siem/public/pages/hosts/navigation/events_query_tab_body.tsx rename to x-pack/plugins/siem/public/hosts/pages/navigation/events_query_tab_body.tsx index cb2c19c642bc4..6d2183a3a38d9 100644 --- a/x-pack/plugins/siem/public/pages/hosts/navigation/events_query_tab_body.tsx +++ b/x-pack/plugins/siem/public/hosts/pages/navigation/events_query_tab_body.tsx @@ -5,15 +5,15 @@ */ import React, { useEffect } from 'react'; -import { StatefulEventsViewer } from '../../../components/events_viewer'; +import { StatefulEventsViewer } from '../../../common/components/events_viewer'; import { HostsComponentsQueryProps } from './types'; -import { hostsModel } from '../../../store/hosts'; -import { eventsDefaultModel } from '../../../components/events_viewer/default_model'; +import { hostsModel } from '../../store'; +import { eventsDefaultModel } from '../../../common/components/events_viewer/default_model'; import { MatrixHistogramOption, MatrixHisrogramConfigs, -} from '../../../components/matrix_histogram/types'; -import { MatrixHistogramContainer } from '../../../components/matrix_histogram'; +} from '../../../common/components/matrix_histogram/types'; +import { MatrixHistogramContainer } from '../../../common/components/matrix_histogram'; import * as i18n from '../translations'; import { HistogramType } from '../../../graphql/types'; diff --git a/x-pack/plugins/siem/public/pages/hosts/navigation/hosts_query_tab_body.tsx b/x-pack/plugins/siem/public/hosts/pages/navigation/hosts_query_tab_body.tsx similarity index 88% rename from x-pack/plugins/siem/public/pages/hosts/navigation/hosts_query_tab_body.tsx rename to x-pack/plugins/siem/public/hosts/pages/navigation/hosts_query_tab_body.tsx index 6c301d692d0e1..95be25a6c4fec 100644 --- a/x-pack/plugins/siem/public/pages/hosts/navigation/hosts_query_tab_body.tsx +++ b/x-pack/plugins/siem/public/hosts/pages/navigation/hosts_query_tab_body.tsx @@ -6,10 +6,10 @@ import { getOr } from 'lodash/fp'; import React from 'react'; -import { HostsQuery } from '../../../containers/hosts'; +import { HostsQuery } from '../../containers/hosts'; import { HostsComponentsQueryProps } from './types'; -import { HostsTable } from '../../../components/page/hosts'; -import { manageQuery } from '../../../components/page/manage_query'; +import { HostsTable } from '../../components/hosts_table'; +import { manageQuery } from '../../../common/components/page/manage_query'; const HostsTableManage = manageQuery(HostsTable); diff --git a/x-pack/plugins/siem/public/pages/hosts/navigation/index.ts b/x-pack/plugins/siem/public/hosts/pages/navigation/index.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/hosts/navigation/index.ts rename to x-pack/plugins/siem/public/hosts/pages/navigation/index.ts diff --git a/x-pack/plugins/siem/public/pages/hosts/navigation/types.ts b/x-pack/plugins/siem/public/hosts/pages/navigation/types.ts similarity index 81% rename from x-pack/plugins/siem/public/pages/hosts/navigation/types.ts rename to x-pack/plugins/siem/public/hosts/pages/navigation/types.ts index 20d4d4e463a7f..76f56fe1718aa 100644 --- a/x-pack/plugins/siem/public/pages/hosts/navigation/types.ts +++ b/x-pack/plugins/siem/public/hosts/pages/navigation/types.ts @@ -6,12 +6,12 @@ import { ESTermQuery } from '../../../../common/typed_json'; import { Filter, IIndexPattern } from '../../../../../../../src/plugins/data/public'; -import { NarrowDateRange } from '../../../components/ml/types'; -import { InspectQuery, Refetch } from '../../../store/inputs/model'; +import { NarrowDateRange } from '../../../common/components/ml/types'; +import { InspectQuery, Refetch } from '../../../common/store/inputs/model'; -import { HostsTableType, HostsType } from '../../../store/hosts/model'; -import { NavTab } from '../../../components/navigation/types'; -import { UpdateDateRange } from '../../../components/charts/common'; +import { HostsTableType, HostsType } from '../../store/model'; +import { NavTab } from '../../../common/components/navigation/types'; +import { UpdateDateRange } from '../../../common/components/charts/common'; export type KeyHostsNavTabWithoutMlPermission = HostsTableType.hosts & HostsTableType.authentications & diff --git a/x-pack/plugins/siem/public/pages/hosts/navigation/uncommon_process_query_tab_body.tsx b/x-pack/plugins/siem/public/hosts/pages/navigation/uncommon_process_query_tab_body.tsx similarity index 86% rename from x-pack/plugins/siem/public/pages/hosts/navigation/uncommon_process_query_tab_body.tsx rename to x-pack/plugins/siem/public/hosts/pages/navigation/uncommon_process_query_tab_body.tsx index 141e2e5a63684..f1691dbaa04b4 100644 --- a/x-pack/plugins/siem/public/pages/hosts/navigation/uncommon_process_query_tab_body.tsx +++ b/x-pack/plugins/siem/public/hosts/pages/navigation/uncommon_process_query_tab_body.tsx @@ -6,10 +6,10 @@ import { getOr } from 'lodash/fp'; import React from 'react'; -import { UncommonProcessesQuery } from '../../../containers/uncommon_processes'; +import { UncommonProcessesQuery } from '../../containers/uncommon_processes'; import { HostsComponentsQueryProps } from './types'; -import { UncommonProcessTable } from '../../../components/page/hosts'; -import { manageQuery } from '../../../components/page/manage_query'; +import { UncommonProcessTable } from '../../components/uncommon_process_table'; +import { manageQuery } from '../../../common/components/page/manage_query'; const UncommonProcessTableManage = manageQuery(UncommonProcessTable); diff --git a/x-pack/plugins/siem/public/pages/hosts/translations.ts b/x-pack/plugins/siem/public/hosts/pages/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/hosts/translations.ts rename to x-pack/plugins/siem/public/hosts/pages/translations.ts diff --git a/x-pack/plugins/siem/public/pages/hosts/types.ts b/x-pack/plugins/siem/public/hosts/pages/types.ts similarity index 79% rename from x-pack/plugins/siem/public/pages/hosts/types.ts rename to x-pack/plugins/siem/public/hosts/pages/types.ts index 408450aebebbd..229349f390ecd 100644 --- a/x-pack/plugins/siem/public/pages/hosts/types.ts +++ b/x-pack/plugins/siem/public/hosts/pages/types.ts @@ -7,10 +7,10 @@ import { IIndexPattern } from 'src/plugins/data/public'; import { ActionCreator } from 'typescript-fsa'; -import { SiemPageName } from '../home/types'; -import { hostsModel } from '../../store'; -import { GlobalTimeArgs } from '../../containers/global_time'; -import { InputsModelId } from '../../store/inputs/constants'; +import { SiemPageName } from '../../app/types'; +import { hostsModel } from '../store'; +import { GlobalTimeArgs } from '../../common/containers/global_time'; +import { InputsModelId } from '../../common/store/inputs/constants'; export const hostsPagePath = `/:pageName(${SiemPageName.hosts})`; export const hostDetailsPagePath = `${hostsPagePath}/:detailName`; diff --git a/x-pack/plugins/siem/public/hosts/routes.tsx b/x-pack/plugins/siem/public/hosts/routes.tsx new file mode 100644 index 0000000000000..93585fa0f8394 --- /dev/null +++ b/x-pack/plugins/siem/public/hosts/routes.tsx @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { Route } from 'react-router-dom'; + +import { HostsContainer } from './pages'; +import { SiemPageName } from '../app/types'; + +export const getHostsRoutes = () => [ + } + />, +]; diff --git a/x-pack/plugins/siem/public/store/hosts/actions.ts b/x-pack/plugins/siem/public/hosts/store/actions.ts similarity index 100% rename from x-pack/plugins/siem/public/store/hosts/actions.ts rename to x-pack/plugins/siem/public/hosts/store/actions.ts diff --git a/x-pack/plugins/siem/public/store/hosts/helpers.test.ts b/x-pack/plugins/siem/public/hosts/store/helpers.test.ts similarity index 97% rename from x-pack/plugins/siem/public/store/hosts/helpers.test.ts rename to x-pack/plugins/siem/public/hosts/store/helpers.test.ts index a4eddb31b3e31..4894e6d4c8c57 100644 --- a/x-pack/plugins/siem/public/store/hosts/helpers.test.ts +++ b/x-pack/plugins/siem/public/hosts/store/helpers.test.ts @@ -5,7 +5,7 @@ */ import { Direction, HostsFields } from '../../graphql/types'; -import { DEFAULT_TABLE_LIMIT } from '../constants'; +import { DEFAULT_TABLE_LIMIT } from '../../common/store/constants'; import { HostsModel, HostsTableType, HostsType } from './model'; import { setHostsQueriesActivePageToZero } from './helpers'; diff --git a/x-pack/plugins/siem/public/store/hosts/helpers.ts b/x-pack/plugins/siem/public/hosts/store/helpers.ts similarity index 96% rename from x-pack/plugins/siem/public/store/hosts/helpers.ts rename to x-pack/plugins/siem/public/hosts/store/helpers.ts index f6b5596b382f6..771c3b1061b6c 100644 --- a/x-pack/plugins/siem/public/store/hosts/helpers.ts +++ b/x-pack/plugins/siem/public/hosts/store/helpers.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { DEFAULT_TABLE_ACTIVE_PAGE } from '../constants'; +import { DEFAULT_TABLE_ACTIVE_PAGE } from '../../common/store/constants'; import { HostsModel, HostsTableType, Queries, HostsType } from './model'; diff --git a/x-pack/plugins/siem/public/store/hosts/index.ts b/x-pack/plugins/siem/public/hosts/store/index.ts similarity index 68% rename from x-pack/plugins/siem/public/store/hosts/index.ts rename to x-pack/plugins/siem/public/hosts/store/index.ts index 93bdde791a7ac..89ad4a7602fe1 100644 --- a/x-pack/plugins/siem/public/store/hosts/index.ts +++ b/x-pack/plugins/siem/public/hosts/store/index.ts @@ -4,9 +4,18 @@ * you may not use this file except in compliance with the Elastic License. */ +import { Reducer, AnyAction } from 'redux'; import * as hostsActions from './actions'; import * as hostsModel from './model'; import * as hostsSelectors from './selectors'; export { hostsActions, hostsModel, hostsSelectors }; export * from './reducer'; + +export interface HostsPluginState { + hosts: hostsModel.HostsModel; +} + +export interface HostsPluginReducer { + hosts: Reducer; +} diff --git a/x-pack/plugins/siem/public/store/hosts/model.ts b/x-pack/plugins/siem/public/hosts/store/model.ts similarity index 100% rename from x-pack/plugins/siem/public/store/hosts/model.ts rename to x-pack/plugins/siem/public/hosts/store/model.ts diff --git a/x-pack/plugins/siem/public/store/hosts/reducer.ts b/x-pack/plugins/siem/public/hosts/store/reducer.ts similarity index 99% rename from x-pack/plugins/siem/public/store/hosts/reducer.ts rename to x-pack/plugins/siem/public/hosts/store/reducer.ts index 53fe9a3ea6a2c..59277f64650e6 100644 --- a/x-pack/plugins/siem/public/store/hosts/reducer.ts +++ b/x-pack/plugins/siem/public/hosts/store/reducer.ts @@ -7,7 +7,7 @@ import { reducerWithInitialState } from 'typescript-fsa-reducers'; import { Direction, HostsFields } from '../../graphql/types'; -import { DEFAULT_TABLE_ACTIVE_PAGE, DEFAULT_TABLE_LIMIT } from '../constants'; +import { DEFAULT_TABLE_ACTIVE_PAGE, DEFAULT_TABLE_LIMIT } from '../../common/store/constants'; import { setHostDetailsTablesActivePageToZero, diff --git a/x-pack/plugins/siem/public/store/hosts/selectors.ts b/x-pack/plugins/siem/public/hosts/store/selectors.ts similarity index 95% rename from x-pack/plugins/siem/public/store/hosts/selectors.ts rename to x-pack/plugins/siem/public/hosts/store/selectors.ts index e50968db31f60..96cae534bb352 100644 --- a/x-pack/plugins/siem/public/store/hosts/selectors.ts +++ b/x-pack/plugins/siem/public/hosts/store/selectors.ts @@ -7,7 +7,7 @@ import { get } from 'lodash/fp'; import { createSelector } from 'reselect'; -import { State } from '../reducer'; +import { State } from '../../common/store/reducer'; import { GenericHostsModel, HostsType, HostsTableType } from './model'; diff --git a/x-pack/plugins/siem/public/components/arrows/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/network/components/arrows/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/arrows/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/network/components/arrows/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/arrows/helpers.test.ts b/x-pack/plugins/siem/public/network/components/arrows/helpers.test.ts similarity index 100% rename from x-pack/plugins/siem/public/components/arrows/helpers.test.ts rename to x-pack/plugins/siem/public/network/components/arrows/helpers.test.ts diff --git a/x-pack/plugins/siem/public/components/arrows/helpers.ts b/x-pack/plugins/siem/public/network/components/arrows/helpers.ts similarity index 100% rename from x-pack/plugins/siem/public/components/arrows/helpers.ts rename to x-pack/plugins/siem/public/network/components/arrows/helpers.ts diff --git a/x-pack/plugins/siem/public/components/arrows/index.test.tsx b/x-pack/plugins/siem/public/network/components/arrows/index.test.tsx similarity index 95% rename from x-pack/plugins/siem/public/components/arrows/index.test.tsx rename to x-pack/plugins/siem/public/network/components/arrows/index.test.tsx index 5404a1ac43844..e5fa1131c7c47 100644 --- a/x-pack/plugins/siem/public/components/arrows/index.test.tsx +++ b/x-pack/plugins/siem/public/network/components/arrows/index.test.tsx @@ -7,7 +7,7 @@ import { mount } from 'enzyme'; import React from 'react'; -import { TestProviders } from '../../mock'; +import { TestProviders } from '../../../common/mock'; import { ArrowBody, ArrowHead } from '.'; diff --git a/x-pack/plugins/siem/public/components/arrows/index.tsx b/x-pack/plugins/siem/public/network/components/arrows/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/arrows/index.tsx rename to x-pack/plugins/siem/public/network/components/arrows/index.tsx diff --git a/x-pack/plugins/siem/public/components/direction/direction.test.tsx b/x-pack/plugins/siem/public/network/components/direction/direction.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/direction/direction.test.tsx rename to x-pack/plugins/siem/public/network/components/direction/direction.test.tsx diff --git a/x-pack/plugins/siem/public/components/direction/index.tsx b/x-pack/plugins/siem/public/network/components/direction/index.tsx similarity index 93% rename from x-pack/plugins/siem/public/components/direction/index.tsx rename to x-pack/plugins/siem/public/network/components/direction/index.tsx index ad1e63dbd7e6a..c8e8f009339c1 100644 --- a/x-pack/plugins/siem/public/components/direction/index.tsx +++ b/x-pack/plugins/siem/public/network/components/direction/index.tsx @@ -6,8 +6,8 @@ import React from 'react'; -import { NetworkDirectionEcs } from '../../graphql/types'; -import { DraggableBadge } from '../draggables'; +import { NetworkDirectionEcs } from '../../../graphql/types'; +import { DraggableBadge } from '../../../common/components/draggables'; import { NETWORK_DIRECTION_FIELD_NAME } from '../source_destination/field_names'; export const INBOUND = 'inbound'; diff --git a/x-pack/plugins/siem/public/components/embeddables/__mocks__/mock.ts b/x-pack/plugins/siem/public/network/components/embeddables/__mocks__/mock.ts similarity index 99% rename from x-pack/plugins/siem/public/components/embeddables/__mocks__/mock.ts rename to x-pack/plugins/siem/public/network/components/embeddables/__mocks__/mock.ts index 19ad0d452feb1..bc1de567b60ae 100644 --- a/x-pack/plugins/siem/public/components/embeddables/__mocks__/mock.ts +++ b/x-pack/plugins/siem/public/network/components/embeddables/__mocks__/mock.ts @@ -5,7 +5,7 @@ */ import { IndexPatternMapping } from '../types'; -import { IndexPatternSavedObject } from '../../../hooks/types'; +import { IndexPatternSavedObject } from '../../../../common/hooks/types'; export const mockIndexPatternIds: IndexPatternMapping[] = [ { title: 'filebeat-*', id: '8c7323ac-97ad-4b53-ac0a-40f8f691a918' }, diff --git a/x-pack/plugins/siem/public/components/embeddables/__snapshots__/embeddable.test.tsx.snap b/x-pack/plugins/siem/public/network/components/embeddables/__snapshots__/embeddable.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/embeddables/__snapshots__/embeddable.test.tsx.snap rename to x-pack/plugins/siem/public/network/components/embeddables/__snapshots__/embeddable.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/embeddables/__snapshots__/embeddable_header.test.tsx.snap b/x-pack/plugins/siem/public/network/components/embeddables/__snapshots__/embeddable_header.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/embeddables/__snapshots__/embeddable_header.test.tsx.snap rename to x-pack/plugins/siem/public/network/components/embeddables/__snapshots__/embeddable_header.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/embeddables/__snapshots__/embedded_map.test.tsx.snap b/x-pack/plugins/siem/public/network/components/embeddables/__snapshots__/embedded_map.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/embeddables/__snapshots__/embedded_map.test.tsx.snap rename to x-pack/plugins/siem/public/network/components/embeddables/__snapshots__/embedded_map.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/embeddables/__snapshots__/index_patterns_missing_prompt.test.tsx.snap b/x-pack/plugins/siem/public/network/components/embeddables/__snapshots__/index_patterns_missing_prompt.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/embeddables/__snapshots__/index_patterns_missing_prompt.test.tsx.snap rename to x-pack/plugins/siem/public/network/components/embeddables/__snapshots__/index_patterns_missing_prompt.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/embeddables/embeddable.test.tsx b/x-pack/plugins/siem/public/network/components/embeddables/embeddable.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/embeddables/embeddable.test.tsx rename to x-pack/plugins/siem/public/network/components/embeddables/embeddable.test.tsx diff --git a/x-pack/plugins/siem/public/components/embeddables/embeddable.tsx b/x-pack/plugins/siem/public/network/components/embeddables/embeddable.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/embeddables/embeddable.tsx rename to x-pack/plugins/siem/public/network/components/embeddables/embeddable.tsx diff --git a/x-pack/plugins/siem/public/components/embeddables/embeddable_header.test.tsx b/x-pack/plugins/siem/public/network/components/embeddables/embeddable_header.test.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/embeddables/embeddable_header.test.tsx rename to x-pack/plugins/siem/public/network/components/embeddables/embeddable_header.test.tsx index 3b8e137618ab0..ecbff02353fef 100644 --- a/x-pack/plugins/siem/public/components/embeddables/embeddable_header.test.tsx +++ b/x-pack/plugins/siem/public/network/components/embeddables/embeddable_header.test.tsx @@ -7,7 +7,7 @@ import { mount, shallow } from 'enzyme'; import React from 'react'; -import { TestProviders } from '../../mock'; +import { TestProviders } from '../../../common/mock'; import { EmbeddableHeader } from './embeddable_header'; describe('EmbeddableHeader', () => { diff --git a/x-pack/plugins/siem/public/components/embeddables/embeddable_header.tsx b/x-pack/plugins/siem/public/network/components/embeddables/embeddable_header.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/embeddables/embeddable_header.tsx rename to x-pack/plugins/siem/public/network/components/embeddables/embeddable_header.tsx diff --git a/x-pack/plugins/siem/public/components/embeddables/embedded_map.test.tsx b/x-pack/plugins/siem/public/network/components/embeddables/embedded_map.test.tsx similarity index 85% rename from x-pack/plugins/siem/public/components/embeddables/embedded_map.test.tsx rename to x-pack/plugins/siem/public/network/components/embeddables/embedded_map.test.tsx index a807b4d6a838b..33eadad9aa774 100644 --- a/x-pack/plugins/siem/public/components/embeddables/embedded_map.test.tsx +++ b/x-pack/plugins/siem/public/network/components/embeddables/embedded_map.test.tsx @@ -7,15 +7,15 @@ import { shallow } from 'enzyme'; import React from 'react'; -import { useIndexPatterns } from '../../hooks/use_index_patterns'; +import { useIndexPatterns } from '../../../common/hooks/use_index_patterns'; import { EmbeddedMapComponent } from './embedded_map'; import { SetQuery } from './types'; const mockUseIndexPatterns = useIndexPatterns as jest.Mock; -jest.mock('../../hooks/use_index_patterns'); +jest.mock('../../../common/hooks/use_index_patterns'); mockUseIndexPatterns.mockImplementation(() => [true, []]); -jest.mock('../../lib/kibana'); +jest.mock('../../../common/lib/kibana'); describe('EmbeddedMapComponent', () => { let setQuery: SetQuery; diff --git a/x-pack/plugins/siem/public/components/embeddables/embedded_map.tsx b/x-pack/plugins/siem/public/network/components/embeddables/embedded_map.tsx similarity index 89% rename from x-pack/plugins/siem/public/components/embeddables/embedded_map.tsx rename to x-pack/plugins/siem/public/network/components/embeddables/embedded_map.tsx index d2dd3e5429341..2e9e13839d769 100644 --- a/x-pack/plugins/siem/public/components/embeddables/embedded_map.tsx +++ b/x-pack/plugins/siem/public/network/components/embeddables/embedded_map.tsx @@ -9,12 +9,15 @@ import React, { useEffect, useState } from 'react'; import { createPortalNode, InPortal } from 'react-reverse-portal'; import styled, { css } from 'styled-components'; -import { EmbeddablePanel, ErrorEmbeddable } from '../../../../../../src/plugins/embeddable/public'; -import { DEFAULT_INDEX_KEY } from '../../../common/constants'; -import { getIndexPatternTitleIdMapping } from '../../hooks/api/helpers'; -import { useIndexPatterns } from '../../hooks/use_index_patterns'; -import { Loader } from '../loader'; -import { displayErrorToast, useStateToaster } from '../toasters'; +import { + EmbeddablePanel, + ErrorEmbeddable, +} from '../../../../../../../src/plugins/embeddable/public'; +import { DEFAULT_INDEX_KEY } from '../../../../common/constants'; +import { getIndexPatternTitleIdMapping } from '../../../common/hooks/api/helpers'; +import { useIndexPatterns } from '../../../common/hooks/use_index_patterns'; +import { Loader } from '../../../common/components/loader'; +import { displayErrorToast, useStateToaster } from '../../../common/components/toasters'; import { Embeddable } from './embeddable'; import { EmbeddableHeader } from './embeddable_header'; import { createEmbeddable, findMatchingIndexPatterns } from './embedded_map_helpers'; @@ -22,10 +25,10 @@ import { IndexPatternsMissingPrompt } from './index_patterns_missing_prompt'; import { MapToolTip } from './map_tool_tip/map_tool_tip'; import * as i18n from './translations'; import { SetQuery } from './types'; -import { MapEmbeddable } from '../../../../../legacy/plugins/maps/public'; -import { Query, Filter } from '../../../../../../src/plugins/data/public'; -import { useKibana, useUiSetting$ } from '../../lib/kibana'; -import { getSavedObjectFinder } from '../../../../../../src/plugins/saved_objects/public'; +import { MapEmbeddable } from '../../../../../../legacy/plugins/maps/public'; +import { Query, Filter } from '../../../../../../../src/plugins/data/public'; +import { useKibana, useUiSetting$ } from '../../../common/lib/kibana'; +import { getSavedObjectFinder } from '../../../../../../../src/plugins/saved_objects/public'; interface EmbeddableMapProps { maintainRatio?: boolean; diff --git a/x-pack/plugins/siem/public/components/embeddables/embedded_map_helpers.test.tsx b/x-pack/plugins/siem/public/network/components/embeddables/embedded_map_helpers.test.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/embeddables/embedded_map_helpers.test.tsx rename to x-pack/plugins/siem/public/network/components/embeddables/embedded_map_helpers.test.tsx index aaae43d9684af..d42ac919e9af0 100644 --- a/x-pack/plugins/siem/public/components/embeddables/embedded_map_helpers.test.tsx +++ b/x-pack/plugins/siem/public/network/components/embeddables/embedded_map_helpers.test.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { embeddablePluginMock } from '../../../../../../src/plugins/embeddable/public/mocks'; +import { embeddablePluginMock } from '../../../../../../../src/plugins/embeddable/public/mocks'; import { createEmbeddable, findMatchingIndexPatterns } from './embedded_map_helpers'; import { createPortalNode } from 'react-reverse-portal'; import { diff --git a/x-pack/plugins/siem/public/components/embeddables/embedded_map_helpers.tsx b/x-pack/plugins/siem/public/network/components/embeddables/embedded_map_helpers.tsx similarity index 92% rename from x-pack/plugins/siem/public/components/embeddables/embedded_map_helpers.tsx rename to x-pack/plugins/siem/public/network/components/embeddables/embedded_map_helpers.tsx index dd7e1cd6ea9ba..37da8abc029b1 100644 --- a/x-pack/plugins/siem/public/components/embeddables/embedded_map_helpers.tsx +++ b/x-pack/plugins/siem/public/network/components/embeddables/embedded_map_helpers.tsx @@ -10,22 +10,22 @@ import { OutPortal, PortalNode } from 'react-reverse-portal'; import minimatch from 'minimatch'; import { IndexPatternMapping, SetQuery } from './types'; import { getLayerList } from './map_config'; -import { MAP_SAVED_OBJECT_TYPE } from '../../../../maps/public'; +import { MAP_SAVED_OBJECT_TYPE } from '../../../../../maps/public'; import { MapEmbeddable, RenderTooltipContentParams, MapEmbeddableInput, -} from '../../../../../legacy/plugins/maps/public'; +} from '../../../../../../legacy/plugins/maps/public'; import * as i18n from './translations'; -import { Query, Filter } from '../../../../../../src/plugins/data/public'; +import { Query, Filter } from '../../../../../../../src/plugins/data/public'; import { EmbeddableStart, isErrorEmbeddable, EmbeddableOutput, ViewMode, ErrorEmbeddable, -} from '../../../../../../src/plugins/embeddable/public'; -import { IndexPatternSavedObject } from '../../hooks/types'; +} from '../../../../../../../src/plugins/embeddable/public'; +import { IndexPatternSavedObject } from '../../../common/hooks/types'; /** * Creates MapEmbeddable with provided initial configuration diff --git a/x-pack/plugins/siem/public/components/embeddables/index_patterns_missing_prompt.test.tsx b/x-pack/plugins/siem/public/network/components/embeddables/index_patterns_missing_prompt.test.tsx similarity index 93% rename from x-pack/plugins/siem/public/components/embeddables/index_patterns_missing_prompt.test.tsx rename to x-pack/plugins/siem/public/network/components/embeddables/index_patterns_missing_prompt.test.tsx index 4f617644a1fe1..af31cf64df84e 100644 --- a/x-pack/plugins/siem/public/components/embeddables/index_patterns_missing_prompt.test.tsx +++ b/x-pack/plugins/siem/public/network/components/embeddables/index_patterns_missing_prompt.test.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { IndexPatternsMissingPromptComponent } from './index_patterns_missing_prompt'; -jest.mock('../../lib/kibana'); +jest.mock('../../../common/lib/kibana'); describe('IndexPatternsMissingPrompt', () => { test('renders correctly against snapshot', () => { diff --git a/x-pack/plugins/siem/public/components/embeddables/index_patterns_missing_prompt.tsx b/x-pack/plugins/siem/public/network/components/embeddables/index_patterns_missing_prompt.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/embeddables/index_patterns_missing_prompt.tsx rename to x-pack/plugins/siem/public/network/components/embeddables/index_patterns_missing_prompt.tsx index abd33505b67b9..aeed6fb2fe20e 100644 --- a/x-pack/plugins/siem/public/components/embeddables/index_patterns_missing_prompt.tsx +++ b/x-pack/plugins/siem/public/network/components/embeddables/index_patterns_missing_prompt.tsx @@ -8,7 +8,7 @@ import { EuiButton, EuiCode, EuiEmptyPrompt } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; import React from 'react'; -import { useKibana, useBasePath } from '../../lib/kibana'; +import { useKibana, useBasePath } from '../../../common/lib/kibana'; import * as i18n from './translations'; export const IndexPatternsMissingPromptComponent = () => { diff --git a/x-pack/plugins/siem/public/components/embeddables/map_config.test.ts b/x-pack/plugins/siem/public/network/components/embeddables/map_config.test.ts similarity index 100% rename from x-pack/plugins/siem/public/components/embeddables/map_config.test.ts rename to x-pack/plugins/siem/public/network/components/embeddables/map_config.test.ts diff --git a/x-pack/plugins/siem/public/components/embeddables/map_config.ts b/x-pack/plugins/siem/public/network/components/embeddables/map_config.ts similarity index 99% rename from x-pack/plugins/siem/public/components/embeddables/map_config.ts rename to x-pack/plugins/siem/public/network/components/embeddables/map_config.ts index 0d1cd515820c5..88bc6e6994984 100644 --- a/x-pack/plugins/siem/public/components/embeddables/map_config.ts +++ b/x-pack/plugins/siem/public/network/components/embeddables/map_config.ts @@ -13,7 +13,7 @@ import { LayerMappingDetails, } from './types'; import * as i18n from './translations'; -import { SOURCE_TYPES } from '../../../../maps/common/constants'; +import { SOURCE_TYPES } from '../../../../../maps/common/constants'; const euiVisColorPalette = euiPaletteColorBlind(); // Update field mappings to modify what fields will be returned to map tooltip diff --git a/x-pack/plugins/siem/public/components/embeddables/map_tool_tip/__snapshots__/line_tool_tip_content.test.tsx.snap b/x-pack/plugins/siem/public/network/components/embeddables/map_tool_tip/__snapshots__/line_tool_tip_content.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/embeddables/map_tool_tip/__snapshots__/line_tool_tip_content.test.tsx.snap rename to x-pack/plugins/siem/public/network/components/embeddables/map_tool_tip/__snapshots__/line_tool_tip_content.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/embeddables/map_tool_tip/__snapshots__/map_tool_tip.test.tsx.snap b/x-pack/plugins/siem/public/network/components/embeddables/map_tool_tip/__snapshots__/map_tool_tip.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/embeddables/map_tool_tip/__snapshots__/map_tool_tip.test.tsx.snap rename to x-pack/plugins/siem/public/network/components/embeddables/map_tool_tip/__snapshots__/map_tool_tip.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/embeddables/map_tool_tip/__snapshots__/point_tool_tip_content.test.tsx.snap b/x-pack/plugins/siem/public/network/components/embeddables/map_tool_tip/__snapshots__/point_tool_tip_content.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/embeddables/map_tool_tip/__snapshots__/point_tool_tip_content.test.tsx.snap rename to x-pack/plugins/siem/public/network/components/embeddables/map_tool_tip/__snapshots__/point_tool_tip_content.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/embeddables/map_tool_tip/__snapshots__/tooltip_footer.test.tsx.snap b/x-pack/plugins/siem/public/network/components/embeddables/map_tool_tip/__snapshots__/tooltip_footer.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/embeddables/map_tool_tip/__snapshots__/tooltip_footer.test.tsx.snap rename to x-pack/plugins/siem/public/network/components/embeddables/map_tool_tip/__snapshots__/tooltip_footer.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/embeddables/map_tool_tip/line_tool_tip_content.test.tsx b/x-pack/plugins/siem/public/network/components/embeddables/map_tool_tip/line_tool_tip_content.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/embeddables/map_tool_tip/line_tool_tip_content.test.tsx rename to x-pack/plugins/siem/public/network/components/embeddables/map_tool_tip/line_tool_tip_content.test.tsx diff --git a/x-pack/plugins/siem/public/components/embeddables/map_tool_tip/line_tool_tip_content.tsx b/x-pack/plugins/siem/public/network/components/embeddables/map_tool_tip/line_tool_tip_content.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/embeddables/map_tool_tip/line_tool_tip_content.tsx rename to x-pack/plugins/siem/public/network/components/embeddables/map_tool_tip/line_tool_tip_content.tsx diff --git a/x-pack/plugins/siem/public/components/embeddables/map_tool_tip/map_tool_tip.test.tsx b/x-pack/plugins/siem/public/network/components/embeddables/map_tool_tip/map_tool_tip.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/embeddables/map_tool_tip/map_tool_tip.test.tsx rename to x-pack/plugins/siem/public/network/components/embeddables/map_tool_tip/map_tool_tip.test.tsx diff --git a/x-pack/plugins/siem/public/components/embeddables/map_tool_tip/map_tool_tip.tsx b/x-pack/plugins/siem/public/network/components/embeddables/map_tool_tip/map_tool_tip.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/embeddables/map_tool_tip/map_tool_tip.tsx rename to x-pack/plugins/siem/public/network/components/embeddables/map_tool_tip/map_tool_tip.tsx index fc55e3437dc21..0f38c350986b4 100644 --- a/x-pack/plugins/siem/public/components/embeddables/map_tool_tip/map_tool_tip.tsx +++ b/x-pack/plugins/siem/public/network/components/embeddables/map_tool_tip/map_tool_tip.tsx @@ -15,7 +15,7 @@ import { FeatureGeometry, FeatureProperty, MapToolTipProps } from '../types'; import { ToolTipFooter } from './tooltip_footer'; import { LineToolTipContent } from './line_tool_tip_content'; import { PointToolTipContent } from './point_tool_tip_content'; -import { Loader } from '../../loader'; +import { Loader } from '../../../../common/components/loader'; import * as i18n from '../translations'; export const MapToolTipComponent = ({ diff --git a/x-pack/plugins/siem/public/components/embeddables/map_tool_tip/point_tool_tip_content.test.tsx b/x-pack/plugins/siem/public/network/components/embeddables/map_tool_tip/point_tool_tip_content.test.tsx similarity index 89% rename from x-pack/plugins/siem/public/components/embeddables/map_tool_tip/point_tool_tip_content.test.tsx rename to x-pack/plugins/siem/public/network/components/embeddables/map_tool_tip/point_tool_tip_content.test.tsx index c90af16b0d99a..d5a7c51ccdeb8 100644 --- a/x-pack/plugins/siem/public/components/embeddables/map_tool_tip/point_tool_tip_content.test.tsx +++ b/x-pack/plugins/siem/public/network/components/embeddables/map_tool_tip/point_tool_tip_content.test.tsx @@ -8,11 +8,11 @@ import { shallow } from 'enzyme'; import React from 'react'; import { FeatureProperty } from '../types'; import { getRenderedFieldValue, PointToolTipContentComponent } from './point_tool_tip_content'; -import { TestProviders } from '../../../mock'; -import { getEmptyStringTag } from '../../empty_value'; -import { HostDetailsLink, IPDetailsLink } from '../../links'; -import { useMountAppended } from '../../../utils/use_mount_appended'; -import { FlowTarget } from '../../../graphql/types'; +import { TestProviders } from '../../../../common/mock'; +import { getEmptyStringTag } from '../../../../common/components/empty_value'; +import { HostDetailsLink, IPDetailsLink } from '../../../../common/components/links'; +import { useMountAppended } from '../../../../common/utils/use_mount_appended'; +import { FlowTarget } from '../../../../graphql/types'; describe('PointToolTipContent', () => { const mount = useMountAppended(); diff --git a/x-pack/plugins/siem/public/components/embeddables/map_tool_tip/point_tool_tip_content.tsx b/x-pack/plugins/siem/public/network/components/embeddables/map_tool_tip/point_tool_tip_content.tsx similarity index 81% rename from x-pack/plugins/siem/public/components/embeddables/map_tool_tip/point_tool_tip_content.tsx rename to x-pack/plugins/siem/public/network/components/embeddables/map_tool_tip/point_tool_tip_content.tsx index c635061ca7b7a..c691407f6166e 100644 --- a/x-pack/plugins/siem/public/components/embeddables/map_tool_tip/point_tool_tip_content.tsx +++ b/x-pack/plugins/siem/public/network/components/embeddables/map_tool_tip/point_tool_tip_content.tsx @@ -9,13 +9,16 @@ import { sourceDestinationFieldMappings } from '../map_config'; import { AddFilterToGlobalSearchBar, createFilter, -} from '../../page/add_filter_to_global_search_bar'; -import { getEmptyTagValue, getOrEmptyTagFromValue } from '../../empty_value'; -import { DescriptionListStyled } from '../../page'; +} from '../../../../common/components/add_filter_to_global_search_bar'; +import { + getEmptyTagValue, + getOrEmptyTagFromValue, +} from '../../../../common/components/empty_value'; +import { DescriptionListStyled } from '../../../../common/components/page'; import { FeatureProperty } from '../types'; -import { HostDetailsLink, IPDetailsLink } from '../../links'; -import { DefaultFieldRenderer } from '../../field_renderers/field_renderers'; -import { FlowTarget } from '../../../graphql/types'; +import { HostDetailsLink, IPDetailsLink } from '../../../../common/components/links'; +import { DefaultFieldRenderer } from '../../../../timelines/components/field_renderers/field_renderers'; +import { FlowTarget } from '../../../../graphql/types'; interface PointToolTipContentProps { contextId: string; diff --git a/x-pack/plugins/siem/public/components/embeddables/map_tool_tip/tooltip_footer.test.tsx b/x-pack/plugins/siem/public/network/components/embeddables/map_tool_tip/tooltip_footer.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/embeddables/map_tool_tip/tooltip_footer.test.tsx rename to x-pack/plugins/siem/public/network/components/embeddables/map_tool_tip/tooltip_footer.test.tsx diff --git a/x-pack/plugins/siem/public/components/embeddables/map_tool_tip/tooltip_footer.tsx b/x-pack/plugins/siem/public/network/components/embeddables/map_tool_tip/tooltip_footer.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/embeddables/map_tool_tip/tooltip_footer.tsx rename to x-pack/plugins/siem/public/network/components/embeddables/map_tool_tip/tooltip_footer.tsx diff --git a/x-pack/plugins/siem/public/components/embeddables/translations.ts b/x-pack/plugins/siem/public/network/components/embeddables/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/embeddables/translations.ts rename to x-pack/plugins/siem/public/network/components/embeddables/translations.ts diff --git a/x-pack/plugins/siem/public/components/embeddables/types.ts b/x-pack/plugins/siem/public/network/components/embeddables/types.ts similarity index 88% rename from x-pack/plugins/siem/public/components/embeddables/types.ts rename to x-pack/plugins/siem/public/network/components/embeddables/types.ts index d8e20c7f47b4e..e111c2728ba7e 100644 --- a/x-pack/plugins/siem/public/components/embeddables/types.ts +++ b/x-pack/plugins/siem/public/network/components/embeddables/types.ts @@ -4,8 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import { RenderTooltipContentParams } from '../../../../../legacy/plugins/maps/public'; -import { inputsModel } from '../../store/inputs'; +import { RenderTooltipContentParams } from '../../../../../../legacy/plugins/maps/public'; +import { inputsModel } from '../../../common/store/inputs'; export interface IndexPatternMapping { title: string; diff --git a/x-pack/plugins/siem/public/components/flow_controls/__snapshots__/flow_direction_select.test.tsx.snap b/x-pack/plugins/siem/public/network/components/flow_controls/__snapshots__/flow_direction_select.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/flow_controls/__snapshots__/flow_direction_select.test.tsx.snap rename to x-pack/plugins/siem/public/network/components/flow_controls/__snapshots__/flow_direction_select.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/flow_controls/__snapshots__/flow_target_select.test.tsx.snap b/x-pack/plugins/siem/public/network/components/flow_controls/__snapshots__/flow_target_select.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/flow_controls/__snapshots__/flow_target_select.test.tsx.snap rename to x-pack/plugins/siem/public/network/components/flow_controls/__snapshots__/flow_target_select.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/flow_controls/flow_direction_select.test.tsx b/x-pack/plugins/siem/public/network/components/flow_controls/flow_direction_select.test.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/flow_controls/flow_direction_select.test.tsx rename to x-pack/plugins/siem/public/network/components/flow_controls/flow_direction_select.test.tsx index f984b534c188d..0a35b28db8ce4 100644 --- a/x-pack/plugins/siem/public/components/flow_controls/flow_direction_select.test.tsx +++ b/x-pack/plugins/siem/public/network/components/flow_controls/flow_direction_select.test.tsx @@ -7,7 +7,7 @@ import { mount, shallow } from 'enzyme'; import React from 'react'; -import { FlowDirection } from '../../graphql/types'; +import { FlowDirection } from '../../../graphql/types'; import { FlowDirectionSelect } from './flow_direction_select'; diff --git a/x-pack/plugins/siem/public/components/flow_controls/flow_direction_select.tsx b/x-pack/plugins/siem/public/network/components/flow_controls/flow_direction_select.tsx similarity index 95% rename from x-pack/plugins/siem/public/components/flow_controls/flow_direction_select.tsx rename to x-pack/plugins/siem/public/network/components/flow_controls/flow_direction_select.tsx index 2b826164063be..d3698a772300b 100644 --- a/x-pack/plugins/siem/public/components/flow_controls/flow_direction_select.tsx +++ b/x-pack/plugins/siem/public/network/components/flow_controls/flow_direction_select.tsx @@ -7,7 +7,7 @@ import { EuiFilterButton, EuiFilterGroup } from '@elastic/eui'; import React from 'react'; -import { FlowDirection } from '../../graphql/types'; +import { FlowDirection } from '../../../graphql/types'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/components/flow_controls/flow_target_select.test.tsx b/x-pack/plugins/siem/public/network/components/flow_controls/flow_target_select.test.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/flow_controls/flow_target_select.test.tsx rename to x-pack/plugins/siem/public/network/components/flow_controls/flow_target_select.test.tsx index 67006d8a7a121..d033ffc09a82d 100644 --- a/x-pack/plugins/siem/public/components/flow_controls/flow_target_select.test.tsx +++ b/x-pack/plugins/siem/public/network/components/flow_controls/flow_target_select.test.tsx @@ -8,7 +8,7 @@ import { mount, shallow } from 'enzyme'; import { clone } from 'lodash/fp'; import React from 'react'; -import { FlowDirection, FlowTarget } from '../../graphql/types'; +import { FlowDirection, FlowTarget } from '../../../graphql/types'; import { FlowTargetSelect } from './flow_target_select'; diff --git a/x-pack/plugins/siem/public/components/flow_controls/flow_target_select.tsx b/x-pack/plugins/siem/public/network/components/flow_controls/flow_target_select.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/flow_controls/flow_target_select.tsx rename to x-pack/plugins/siem/public/network/components/flow_controls/flow_target_select.tsx index 15d1c66363837..6d6dcfd33b870 100644 --- a/x-pack/plugins/siem/public/components/flow_controls/flow_target_select.tsx +++ b/x-pack/plugins/siem/public/network/components/flow_controls/flow_target_select.tsx @@ -7,7 +7,7 @@ import { EuiSuperSelect } from '@elastic/eui'; import React from 'react'; -import { FlowDirection, FlowTarget } from '../../graphql/types'; +import { FlowDirection, FlowTarget } from '../../../graphql/types'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/components/flow_controls/translations.ts b/x-pack/plugins/siem/public/network/components/flow_controls/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/flow_controls/translations.ts rename to x-pack/plugins/siem/public/network/components/flow_controls/translations.ts diff --git a/x-pack/plugins/siem/public/components/page/network/flow_target_select_connected/index.test.tsx b/x-pack/plugins/siem/public/network/components/flow_target_select_connected/index.test.tsx similarity index 92% rename from x-pack/plugins/siem/public/components/page/network/flow_target_select_connected/index.test.tsx rename to x-pack/plugins/siem/public/network/components/flow_target_select_connected/index.test.tsx index e71be5a51e505..edf9e69eeed56 100644 --- a/x-pack/plugins/siem/public/components/page/network/flow_target_select_connected/index.test.tsx +++ b/x-pack/plugins/siem/public/network/components/flow_target_select_connected/index.test.tsx @@ -8,9 +8,9 @@ import { mount } from 'enzyme'; import React from 'react'; import { MemoryRouter } from 'react-router-dom'; -import { TestProviders } from '../../../../mock'; +import { TestProviders } from '../../../common/mock'; import { FlowTargetSelectConnectedComponent } from './index'; -import { FlowTarget } from '../../../../graphql/types'; +import { FlowTarget } from '../../../graphql/types'; describe('Flow Target Select Connected', () => { test('renders correctly against snapshot flowTarget source', () => { diff --git a/x-pack/plugins/siem/public/components/page/network/flow_target_select_connected/index.tsx b/x-pack/plugins/siem/public/network/components/flow_target_select_connected/index.tsx similarity index 88% rename from x-pack/plugins/siem/public/components/page/network/flow_target_select_connected/index.tsx rename to x-pack/plugins/siem/public/network/components/flow_target_select_connected/index.tsx index 2651c31e0a2c9..3ce623cfc97b8 100644 --- a/x-pack/plugins/siem/public/components/page/network/flow_target_select_connected/index.tsx +++ b/x-pack/plugins/siem/public/network/components/flow_target_select_connected/index.tsx @@ -10,11 +10,11 @@ import React, { useCallback } from 'react'; import { useHistory, useLocation } from 'react-router-dom'; import styled from 'styled-components'; -import { FlowDirection, FlowTarget } from '../../../../graphql/types'; +import { FlowDirection, FlowTarget } from '../../../graphql/types'; import * as i18nIp from '../ip_overview/translations'; -import { FlowTargetSelect } from '../../../flow_controls/flow_target_select'; -import { IpOverviewId } from '../../../field_renderers/field_renderers'; +import { FlowTargetSelect } from '../flow_controls/flow_target_select'; +import { IpOverviewId } from '../../../timelines/components/field_renderers/field_renderers'; const SelectTypeItem = styled(EuiFlexItem)` min-width: 180px; diff --git a/x-pack/plugins/siem/public/components/ip/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/network/components/ip/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/ip/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/network/components/ip/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/ip/index.test.tsx b/x-pack/plugins/siem/public/network/components/ip/index.test.tsx similarity index 90% rename from x-pack/plugins/siem/public/components/ip/index.test.tsx rename to x-pack/plugins/siem/public/network/components/ip/index.test.tsx index 209fc63c7355c..78ba0bb530c9d 100644 --- a/x-pack/plugins/siem/public/components/ip/index.test.tsx +++ b/x-pack/plugins/siem/public/network/components/ip/index.test.tsx @@ -7,8 +7,8 @@ import { shallow } from 'enzyme'; import React from 'react'; -import { TestProviders } from '../../mock/test_providers'; -import { useMountAppended } from '../../utils/use_mount_appended'; +import { TestProviders } from '../../../common/mock/test_providers'; +import { useMountAppended } from '../../../common/utils/use_mount_appended'; import { Ip } from '.'; diff --git a/x-pack/plugins/siem/public/components/ip/index.tsx b/x-pack/plugins/siem/public/network/components/ip/index.tsx similarity index 89% rename from x-pack/plugins/siem/public/components/ip/index.tsx rename to x-pack/plugins/siem/public/network/components/ip/index.tsx index 49237c3bb1bb9..21e2dd3ebc04d 100644 --- a/x-pack/plugins/siem/public/components/ip/index.tsx +++ b/x-pack/plugins/siem/public/network/components/ip/index.tsx @@ -6,7 +6,7 @@ import React from 'react'; -import { FormattedFieldValue } from '../timeline/body/renderers/formatted_field'; +import { FormattedFieldValue } from '../../../timelines/components/timeline/body/renderers/formatted_field'; export const SOURCE_IP_FIELD_NAME = 'source.ip'; export const DESTINATION_IP_FIELD_NAME = 'destination.ip'; diff --git a/x-pack/plugins/siem/public/components/page/network/ip_overview/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/network/components/ip_overview/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/page/network/ip_overview/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/network/components/ip_overview/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/page/network/ip_overview/index.test.tsx b/x-pack/plugins/siem/public/network/components/ip_overview/index.test.tsx similarity index 71% rename from x-pack/plugins/siem/public/components/page/network/ip_overview/index.test.tsx rename to x-pack/plugins/siem/public/network/components/ip_overview/index.test.tsx index 3038d7f41c632..bce811c58e436 100644 --- a/x-pack/plugins/siem/public/components/page/network/ip_overview/index.test.tsx +++ b/x-pack/plugins/siem/public/network/components/ip_overview/index.test.tsx @@ -8,22 +8,28 @@ import { shallow } from 'enzyme'; import React from 'react'; import { ActionCreator } from 'typescript-fsa'; -import { FlowTarget } from '../../../../graphql/types'; -import { apolloClientObservable, mockGlobalState, TestProviders } from '../../../../mock'; -import { createStore, networkModel, State } from '../../../../store'; +import { FlowTarget } from '../../../graphql/types'; +import { + apolloClientObservable, + mockGlobalState, + TestProviders, + SUB_PLUGINS_REDUCER, +} from '../../../common/mock'; +import { createStore, State } from '../../../common/store'; +import { networkModel } from '../../store'; import { IpOverview } from './index'; import { mockData } from './mock'; -import { mockAnomalies } from '../../../ml/mock'; -import { NarrowDateRange } from '../../../ml/types'; +import { mockAnomalies } from '../../../common/components/ml/mock'; +import { NarrowDateRange } from '../../../common/components/ml/types'; describe('IP Overview Component', () => { const state: State = mockGlobalState; - let store = createStore(state, apolloClientObservable); + let store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); beforeEach(() => { - store = createStore(state, apolloClientObservable); + store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); }); describe('rendering', () => { diff --git a/x-pack/plugins/siem/public/components/page/network/ip_overview/index.tsx b/x-pack/plugins/siem/public/network/components/ip_overview/index.tsx similarity index 80% rename from x-pack/plugins/siem/public/components/page/network/ip_overview/index.tsx rename to x-pack/plugins/siem/public/network/components/ip_overview/index.tsx index 456deaac0fb15..56f6d27dc28ca 100644 --- a/x-pack/plugins/siem/public/components/page/network/ip_overview/index.tsx +++ b/x-pack/plugins/siem/public/network/components/ip_overview/index.tsx @@ -9,12 +9,12 @@ import darkTheme from '@elastic/eui/dist/eui_theme_dark.json'; import lightTheme from '@elastic/eui/dist/eui_theme_light.json'; import React from 'react'; -import { DEFAULT_DARK_MODE } from '../../../../../common/constants'; -import { DescriptionList } from '../../../../../common/utility_types'; -import { useUiSetting$ } from '../../../../lib/kibana'; -import { FlowTarget, IpOverviewData, Overview } from '../../../../graphql/types'; -import { networkModel } from '../../../../store'; -import { getEmptyTagValue } from '../../../empty_value'; +import { DEFAULT_DARK_MODE } from '../../../../common/constants'; +import { DescriptionList } from '../../../../common/utility_types'; +import { useUiSetting$ } from '../../../common/lib/kibana'; +import { FlowTarget, IpOverviewData, Overview } from '../../../graphql/types'; +import { networkModel } from '../../store'; +import { getEmptyTagValue } from '../../../common/components/empty_value'; import { autonomousSystemRenderer, @@ -24,15 +24,15 @@ import { locationRenderer, reputationRenderer, whoisRenderer, -} from '../../../field_renderers/field_renderers'; +} from '../../../timelines/components/field_renderers/field_renderers'; import * as i18n from './translations'; -import { DescriptionListStyled, OverviewWrapper } from '../../index'; -import { Loader } from '../../../loader'; -import { Anomalies, NarrowDateRange } from '../../../ml/types'; -import { AnomalyScores } from '../../../ml/score/anomaly_scores'; -import { useMlCapabilities } from '../../../ml_popover/hooks/use_ml_capabilities'; -import { hasMlUserPermissions } from '../../../../../common/machine_learning/has_ml_user_permissions'; -import { InspectButton, InspectButtonContainer } from '../../../inspect'; +import { DescriptionListStyled, OverviewWrapper } from '../../../common/components/page'; +import { Loader } from '../../../common/components/loader'; +import { Anomalies, NarrowDateRange } from '../../../common/components/ml/types'; +import { AnomalyScores } from '../../../common/components/ml/score/anomaly_scores'; +import { useMlCapabilities } from '../../../common/components/ml_popover/hooks/use_ml_capabilities'; +import { hasMlUserPermissions } from '../../../../common/machine_learning/has_ml_user_permissions'; +import { InspectButton, InspectButtonContainer } from '../../../common/components/inspect'; interface OwnProps { data: IpOverviewData; diff --git a/x-pack/plugins/siem/public/components/page/network/ip_overview/mock.ts b/x-pack/plugins/siem/public/network/components/ip_overview/mock.ts similarity index 96% rename from x-pack/plugins/siem/public/components/page/network/ip_overview/mock.ts rename to x-pack/plugins/siem/public/network/components/ip_overview/mock.ts index aaacdae70aef7..aa86fb177b02a 100644 --- a/x-pack/plugins/siem/public/components/page/network/ip_overview/mock.ts +++ b/x-pack/plugins/siem/public/network/components/ip_overview/mock.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { IpOverviewData } from '../../../../graphql/types'; +import { IpOverviewData } from '../../../graphql/types'; export const mockData: Readonly> = { complete: { diff --git a/x-pack/plugins/siem/public/components/page/network/ip_overview/translations.ts b/x-pack/plugins/siem/public/network/components/ip_overview/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/page/network/ip_overview/translations.ts rename to x-pack/plugins/siem/public/network/components/ip_overview/translations.ts diff --git a/x-pack/plugins/siem/public/components/page/network/kpi_network/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/network/components/kpi_network/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/page/network/kpi_network/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/network/components/kpi_network/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/page/network/kpi_network/index.test.tsx b/x-pack/plugins/siem/public/network/components/kpi_network/index.test.tsx similarity index 84% rename from x-pack/plugins/siem/public/components/page/network/kpi_network/index.test.tsx rename to x-pack/plugins/siem/public/network/components/kpi_network/index.test.tsx index 48d3b25f59e4a..70c952b110745 100644 --- a/x-pack/plugins/siem/public/components/page/network/kpi_network/index.test.tsx +++ b/x-pack/plugins/siem/public/network/components/kpi_network/index.test.tsx @@ -8,9 +8,8 @@ import { shallow } from 'enzyme'; import React from 'react'; import { Provider as ReduxStoreProvider } from 'react-redux'; -import { apolloClientObservable, mockGlobalState } from '../../../../mock'; -import { createStore, State } from '../../../../store'; - +import { apolloClientObservable, mockGlobalState, SUB_PLUGINS_REDUCER } from '../../../common/mock'; +import { createStore, State } from '../../../common/store'; import { KpiNetworkComponent } from '.'; import { mockData } from './mock'; @@ -20,10 +19,10 @@ describe('KpiNetwork Component', () => { const to = new Date('2019-06-18T06:00:00.000Z').valueOf(); const narrowDateRange = jest.fn(); - let store = createStore(state, apolloClientObservable); + let store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); beforeEach(() => { - store = createStore(state, apolloClientObservable); + store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); }); describe('rendering', () => { diff --git a/x-pack/plugins/siem/public/components/page/network/kpi_network/index.tsx b/x-pack/plugins/siem/public/network/components/kpi_network/index.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/page/network/kpi_network/index.tsx rename to x-pack/plugins/siem/public/network/components/kpi_network/index.tsx index e81c65fbc6afb..ac7381160515d 100644 --- a/x-pack/plugins/siem/public/components/page/network/kpi_network/index.tsx +++ b/x-pack/plugins/siem/public/network/components/kpi_network/index.tsx @@ -21,11 +21,11 @@ import { StatItemsProps, useKpiMatrixStatus, StatItems, -} from '../../../../components/stat_items'; -import { KpiNetworkData } from '../../../../graphql/types'; +} from '../../../common/components/stat_items'; +import { KpiNetworkData } from '../../../graphql/types'; import * as i18n from './translations'; -import { UpdateDateRange } from '../../../charts/common'; +import { UpdateDateRange } from '../../../common/components/charts/common'; const kipsPerRow = 2; const kpiWidgetHeight = 228; diff --git a/x-pack/plugins/siem/public/components/page/network/kpi_network/mock.ts b/x-pack/plugins/siem/public/network/components/kpi_network/mock.ts similarity index 97% rename from x-pack/plugins/siem/public/components/page/network/kpi_network/mock.ts rename to x-pack/plugins/siem/public/network/components/kpi_network/mock.ts index 4edaf76bb4820..a8b04ff29f4b6 100644 --- a/x-pack/plugins/siem/public/components/page/network/kpi_network/mock.ts +++ b/x-pack/plugins/siem/public/network/components/kpi_network/mock.ts @@ -4,8 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import { KpiNetworkData } from '../../../../graphql/types'; -import { StatItems } from '../../../stat_items'; +import { KpiNetworkData } from '../../../graphql/types'; +import { StatItems } from '../../../common/components/stat_items'; export const mockNarrowDateRange = jest.fn(); diff --git a/x-pack/plugins/siem/public/components/page/network/kpi_network/translations.ts b/x-pack/plugins/siem/public/network/components/kpi_network/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/page/network/kpi_network/translations.ts rename to x-pack/plugins/siem/public/network/components/kpi_network/translations.ts diff --git a/x-pack/plugins/siem/public/components/page/network/network_dns_table/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/network/components/network_dns_table/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/page/network/network_dns_table/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/network/components/network_dns_table/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/page/network/network_dns_table/__snapshots__/is_ptr_included.test.tsx.snap b/x-pack/plugins/siem/public/network/components/network_dns_table/__snapshots__/is_ptr_included.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/page/network/network_dns_table/__snapshots__/is_ptr_included.test.tsx.snap rename to x-pack/plugins/siem/public/network/components/network_dns_table/__snapshots__/is_ptr_included.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/page/network/network_dns_table/columns.tsx b/x-pack/plugins/siem/public/network/components/network_dns_table/columns.tsx similarity index 81% rename from x-pack/plugins/siem/public/components/page/network/network_dns_table/columns.tsx rename to x-pack/plugins/siem/public/network/components/network_dns_table/columns.tsx index 83a902d7bbde4..dbc09daaf0abc 100644 --- a/x-pack/plugins/siem/public/components/page/network/network_dns_table/columns.tsx +++ b/x-pack/plugins/siem/public/network/components/network_dns_table/columns.tsx @@ -7,14 +7,17 @@ import numeral from '@elastic/numeral'; import React from 'react'; -import { NetworkDnsFields, NetworkDnsItem } from '../../../../graphql/types'; -import { DragEffects, DraggableWrapper } from '../../../drag_and_drop/draggable_wrapper'; -import { escapeDataProviderId } from '../../../drag_and_drop/helpers'; -import { defaultToEmptyTag, getEmptyTagValue } from '../../../empty_value'; -import { Columns } from '../../../paginated_table'; -import { IS_OPERATOR } from '../../../timeline/data_providers/data_provider'; -import { PreferenceFormattedBytes } from '../../../formatted_bytes'; -import { Provider } from '../../../timeline/data_providers/provider'; +import { NetworkDnsFields, NetworkDnsItem } from '../../../graphql/types'; +import { + DragEffects, + DraggableWrapper, +} from '../../../common/components/drag_and_drop/draggable_wrapper'; +import { escapeDataProviderId } from '../../../common/components/drag_and_drop/helpers'; +import { defaultToEmptyTag, getEmptyTagValue } from '../../../common/components/empty_value'; +import { Columns } from '../../../common/components/paginated_table'; +import { IS_OPERATOR } from '../../../timelines/components/timeline/data_providers/data_provider'; +import { PreferenceFormattedBytes } from '../../../common/components/formatted_bytes'; +import { Provider } from '../../../timelines/components/timeline/data_providers/provider'; import * as i18n from './translations'; export type NetworkDnsColumns = [ diff --git a/x-pack/plugins/siem/public/components/page/network/network_dns_table/index.test.tsx b/x-pack/plugins/siem/public/network/components/network_dns_table/index.test.tsx similarity index 86% rename from x-pack/plugins/siem/public/components/page/network/network_dns_table/index.test.tsx rename to x-pack/plugins/siem/public/network/components/network_dns_table/index.test.tsx index e425057dd0f75..f2d8ce6cb6c44 100644 --- a/x-pack/plugins/siem/public/components/page/network/network_dns_table/index.test.tsx +++ b/x-pack/plugins/siem/public/network/components/network_dns_table/index.test.tsx @@ -10,9 +10,15 @@ import React from 'react'; import { MockedProvider } from 'react-apollo/test-utils'; import { Provider as ReduxStoreProvider } from 'react-redux'; -import { apolloClientObservable, mockGlobalState, TestProviders } from '../../../../mock'; -import { createStore, networkModel, State } from '../../../../store'; -import { useMountAppended } from '../../../../utils/use_mount_appended'; +import { + apolloClientObservable, + mockGlobalState, + TestProviders, + SUB_PLUGINS_REDUCER, +} from '../../../common/mock'; +import { State, createStore } from '../../../common/store'; +import { networkModel } from '../../store'; +import { useMountAppended } from '../../../common/utils/use_mount_appended'; import { NetworkDnsTable } from '.'; import { mockData } from './mock'; @@ -20,11 +26,11 @@ import { mockData } from './mock'; describe('NetworkTopNFlow Table Component', () => { const loadPage = jest.fn(); const state: State = mockGlobalState; - let store = createStore(state, apolloClientObservable); + let store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); const mount = useMountAppended(); beforeEach(() => { - store = createStore(state, apolloClientObservable); + store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); }); describe('rendering', () => { diff --git a/x-pack/plugins/siem/public/components/page/network/network_dns_table/index.tsx b/x-pack/plugins/siem/public/network/components/network_dns_table/index.tsx similarity index 95% rename from x-pack/plugins/siem/public/components/page/network/network_dns_table/index.tsx rename to x-pack/plugins/siem/public/network/components/network_dns_table/index.tsx index c1dd96c5c96f9..fc763298f08f4 100644 --- a/x-pack/plugins/siem/public/components/page/network/network_dns_table/index.tsx +++ b/x-pack/plugins/siem/public/network/components/network_dns_table/index.tsx @@ -8,15 +8,15 @@ import React, { useCallback, useMemo } from 'react'; import { connect, ConnectedProps } from 'react-redux'; import deepEqual from 'fast-deep-equal'; -import { networkActions } from '../../../../store/actions'; +import { networkActions, networkModel, networkSelectors } from '../../store'; import { Direction, NetworkDnsEdges, NetworkDnsFields, NetworkDnsSortField, -} from '../../../../graphql/types'; -import { networkModel, networkSelectors, State } from '../../../../store'; -import { Criteria, ItemsPerRow, PaginatedTable } from '../../../paginated_table'; +} from '../../../graphql/types'; +import { State } from '../../../common/store'; +import { Criteria, ItemsPerRow, PaginatedTable } from '../../../common/components/paginated_table'; import { getNetworkDnsColumns } from './columns'; import { IsPtrIncluded } from './is_ptr_included'; diff --git a/x-pack/plugins/siem/public/components/page/network/network_dns_table/is_ptr_included.test.tsx b/x-pack/plugins/siem/public/network/components/network_dns_table/is_ptr_included.test.tsx similarity index 95% rename from x-pack/plugins/siem/public/components/page/network/network_dns_table/is_ptr_included.test.tsx rename to x-pack/plugins/siem/public/network/components/network_dns_table/is_ptr_included.test.tsx index 31a1b1667087a..36dca6981a7ae 100644 --- a/x-pack/plugins/siem/public/components/page/network/network_dns_table/is_ptr_included.test.tsx +++ b/x-pack/plugins/siem/public/network/components/network_dns_table/is_ptr_included.test.tsx @@ -7,7 +7,7 @@ import { mount, shallow } from 'enzyme'; import React from 'react'; -import { FlowDirection } from '../../../../graphql/types'; +import { FlowDirection } from '../../../graphql/types'; import { IsPtrIncluded } from './is_ptr_included'; diff --git a/x-pack/plugins/siem/public/components/page/network/network_dns_table/is_ptr_included.tsx b/x-pack/plugins/siem/public/network/components/network_dns_table/is_ptr_included.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/page/network/network_dns_table/is_ptr_included.tsx rename to x-pack/plugins/siem/public/network/components/network_dns_table/is_ptr_included.tsx diff --git a/x-pack/plugins/siem/public/components/page/network/network_dns_table/mock.ts b/x-pack/plugins/siem/public/network/components/network_dns_table/mock.ts similarity index 98% rename from x-pack/plugins/siem/public/components/page/network/network_dns_table/mock.ts rename to x-pack/plugins/siem/public/network/components/network_dns_table/mock.ts index 281125edb9dc4..d094256fa4026 100644 --- a/x-pack/plugins/siem/public/components/page/network/network_dns_table/mock.ts +++ b/x-pack/plugins/siem/public/network/components/network_dns_table/mock.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { NetworkDnsData } from '../../../../graphql/types'; +import { NetworkDnsData } from '../../../graphql/types'; export const mockData: { NetworkDns: NetworkDnsData } = { NetworkDns: { diff --git a/x-pack/plugins/siem/public/components/page/network/network_dns_table/translations.ts b/x-pack/plugins/siem/public/network/components/network_dns_table/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/page/network/network_dns_table/translations.ts rename to x-pack/plugins/siem/public/network/components/network_dns_table/translations.ts diff --git a/x-pack/plugins/siem/public/components/page/network/network_http_table/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/network/components/network_http_table/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/page/network/network_http_table/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/network/components/network_http_table/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/page/network/network_http_table/columns.tsx b/x-pack/plugins/siem/public/network/components/network_http_table/columns.tsx similarity index 88% rename from x-pack/plugins/siem/public/components/page/network/network_http_table/columns.tsx rename to x-pack/plugins/siem/public/network/components/network_http_table/columns.tsx index bffc7235b6804..4642fdd2f2c93 100644 --- a/x-pack/plugins/siem/public/components/page/network/network_http_table/columns.tsx +++ b/x-pack/plugins/siem/public/network/components/network_http_table/columns.tsx @@ -8,14 +8,17 @@ import React from 'react'; import numeral from '@elastic/numeral'; -import { NetworkHttpEdges, NetworkHttpFields, NetworkHttpItem } from '../../../../graphql/types'; -import { escapeDataProviderId } from '../../../drag_and_drop/helpers'; -import { getEmptyTagValue } from '../../../empty_value'; -import { IPDetailsLink } from '../../../links'; -import { Columns } from '../../../paginated_table'; +import { NetworkHttpEdges, NetworkHttpFields, NetworkHttpItem } from '../../../graphql/types'; +import { escapeDataProviderId } from '../../../common/components/drag_and_drop/helpers'; +import { getEmptyTagValue } from '../../../common/components/empty_value'; +import { IPDetailsLink } from '../../../common/components/links'; +import { Columns } from '../../../common/components/paginated_table'; import * as i18n from './translations'; -import { getRowItemDraggable, getRowItemDraggables } from '../../../tables/helpers'; +import { + getRowItemDraggable, + getRowItemDraggables, +} from '../../../common/components/tables/helpers'; export type NetworkHttpColumns = [ Columns, Columns, diff --git a/x-pack/plugins/siem/public/components/page/network/network_http_table/index.test.tsx b/x-pack/plugins/siem/public/network/components/network_http_table/index.test.tsx similarity index 86% rename from x-pack/plugins/siem/public/components/page/network/network_http_table/index.test.tsx rename to x-pack/plugins/siem/public/network/components/network_http_table/index.test.tsx index c4596ada5c74d..3c4e1559e9f7b 100644 --- a/x-pack/plugins/siem/public/components/page/network/network_http_table/index.test.tsx +++ b/x-pack/plugins/siem/public/network/components/network_http_table/index.test.tsx @@ -10,9 +10,15 @@ import React from 'react'; import { MockedProvider } from 'react-apollo/test-utils'; import { Provider as ReduxStoreProvider } from 'react-redux'; -import { apolloClientObservable, mockGlobalState, TestProviders } from '../../../../mock'; -import { useMountAppended } from '../../../../utils/use_mount_appended'; -import { createStore, networkModel, State } from '../../../../store'; +import { + apolloClientObservable, + mockGlobalState, + TestProviders, + SUB_PLUGINS_REDUCER, +} from '../../../common/mock'; +import { useMountAppended } from '../../../common/utils/use_mount_appended'; +import { createStore, State } from '../../../common/store'; +import { networkModel } from '../../store'; import { NetworkHttpTable } from '.'; import { mockData } from './mock'; @@ -21,11 +27,11 @@ describe('NetworkHttp Table Component', () => { const loadPage = jest.fn(); const state: State = mockGlobalState; - let store = createStore(state, apolloClientObservable); + let store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); const mount = useMountAppended(); beforeEach(() => { - store = createStore(state, apolloClientObservable); + store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); }); describe('rendering', () => { diff --git a/x-pack/plugins/siem/public/components/page/network/network_http_table/index.tsx b/x-pack/plugins/siem/public/network/components/network_http_table/index.tsx similarity index 95% rename from x-pack/plugins/siem/public/components/page/network/network_http_table/index.tsx rename to x-pack/plugins/siem/public/network/components/network_http_table/index.tsx index 6a8b1308f1d36..cab7106584e0f 100644 --- a/x-pack/plugins/siem/public/components/page/network/network_http_table/index.tsx +++ b/x-pack/plugins/siem/public/network/components/network_http_table/index.tsx @@ -7,10 +7,10 @@ import React, { useCallback, useMemo } from 'react'; import { connect, ConnectedProps } from 'react-redux'; -import { networkActions } from '../../../../store/actions'; -import { Direction, NetworkHttpEdges, NetworkHttpFields } from '../../../../graphql/types'; -import { networkModel, networkSelectors, State } from '../../../../store'; -import { Criteria, ItemsPerRow, PaginatedTable } from '../../../paginated_table'; +import { networkActions, networkModel, networkSelectors } from '../../store'; +import { Direction, NetworkHttpEdges, NetworkHttpFields } from '../../../graphql/types'; +import { State } from '../../../common/store'; +import { Criteria, ItemsPerRow, PaginatedTable } from '../../../common/components/paginated_table'; import { getNetworkHttpColumns } from './columns'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/components/page/network/network_http_table/mock.ts b/x-pack/plugins/siem/public/network/components/network_http_table/mock.ts similarity index 97% rename from x-pack/plugins/siem/public/components/page/network/network_http_table/mock.ts rename to x-pack/plugins/siem/public/network/components/network_http_table/mock.ts index ed9b00ba8e49e..f82f911d601ff 100644 --- a/x-pack/plugins/siem/public/components/page/network/network_http_table/mock.ts +++ b/x-pack/plugins/siem/public/network/components/network_http_table/mock.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { NetworkHttpData } from '../../../../graphql/types'; +import { NetworkHttpData } from '../../../graphql/types'; export const mockData: { NetworkHttp: NetworkHttpData } = { NetworkHttp: { diff --git a/x-pack/plugins/siem/public/components/page/network/network_http_table/translations.ts b/x-pack/plugins/siem/public/network/components/network_http_table/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/page/network/network_http_table/translations.ts rename to x-pack/plugins/siem/public/network/components/network_http_table/translations.ts diff --git a/x-pack/plugins/siem/public/components/page/network/network_top_countries_table/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/network/components/network_top_countries_table/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/page/network/network_top_countries_table/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/network/components/network_top_countries_table/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/page/network/network_top_countries_table/columns.tsx b/x-pack/plugins/siem/public/network/components/network_top_countries_table/columns.tsx similarity index 85% rename from x-pack/plugins/siem/public/components/page/network/network_top_countries_table/columns.tsx rename to x-pack/plugins/siem/public/network/components/network_top_countries_table/columns.tsx index ae2723e006509..60d691f48deb8 100644 --- a/x-pack/plugins/siem/public/components/page/network/network_top_countries_table/columns.tsx +++ b/x-pack/plugins/siem/public/network/components/network_top_countries_table/columns.tsx @@ -9,21 +9,24 @@ import numeral from '@elastic/numeral'; import React from 'react'; import { IIndexPattern } from 'src/plugins/data/public'; -import { CountryFlagAndName } from '../../../source_destination/country_flag'; +import { CountryFlagAndName } from '../source_destination/country_flag'; import { FlowTargetSourceDest, NetworkTopCountriesEdges, TopNetworkTablesEcsField, -} from '../../../../graphql/types'; -import { networkModel } from '../../../../store'; -import { DragEffects, DraggableWrapper } from '../../../drag_and_drop/draggable_wrapper'; -import { escapeDataProviderId } from '../../../drag_and_drop/helpers'; -import { getEmptyTagValue } from '../../../empty_value'; -import { Columns } from '../../../paginated_table'; -import { IS_OPERATOR } from '../../../timeline/data_providers/data_provider'; -import { Provider } from '../../../timeline/data_providers/provider'; +} from '../../../graphql/types'; +import { networkModel } from '../../store'; +import { + DragEffects, + DraggableWrapper, +} from '../../../common/components/drag_and_drop/draggable_wrapper'; +import { escapeDataProviderId } from '../../../common/components/drag_and_drop/helpers'; +import { getEmptyTagValue } from '../../../common/components/empty_value'; +import { Columns } from '../../../common/components/paginated_table'; +import { IS_OPERATOR } from '../../../timelines/components/timeline/data_providers/data_provider'; +import { Provider } from '../../../timelines/components/timeline/data_providers/provider'; import * as i18n from './translations'; -import { PreferenceFormattedBytes } from '../../../formatted_bytes'; +import { PreferenceFormattedBytes } from '../../../common/components/formatted_bytes'; export type NetworkTopCountriesColumns = [ Columns, diff --git a/x-pack/plugins/siem/public/components/page/network/network_top_countries_table/index.test.tsx b/x-pack/plugins/siem/public/network/components/network_top_countries_table/index.test.tsx similarity index 91% rename from x-pack/plugins/siem/public/components/page/network/network_top_countries_table/index.test.tsx rename to x-pack/plugins/siem/public/network/components/network_top_countries_table/index.test.tsx index 764e440a5a4be..a449ed8dfa9ce 100644 --- a/x-pack/plugins/siem/public/components/page/network/network_top_countries_table/index.test.tsx +++ b/x-pack/plugins/siem/public/network/components/network_top_countries_table/index.test.tsx @@ -10,15 +10,17 @@ import React from 'react'; import { MockedProvider } from 'react-apollo/test-utils'; import { Provider as ReduxStoreProvider } from 'react-redux'; -import { FlowTargetSourceDest } from '../../../../graphql/types'; +import { FlowTargetSourceDest } from '../../../graphql/types'; import { apolloClientObservable, mockGlobalState, mockIndexPattern, TestProviders, -} from '../../../../mock'; -import { useMountAppended } from '../../../../utils/use_mount_appended'; -import { createStore, networkModel, State } from '../../../../store'; + SUB_PLUGINS_REDUCER, +} from '../../../common/mock'; +import { useMountAppended } from '../../../common/utils/use_mount_appended'; +import { createStore, State } from '../../../common/store'; +import { networkModel } from '../../store'; import { NetworkTopCountriesTable } from '.'; import { mockData } from './mock'; @@ -28,10 +30,10 @@ describe('NetworkTopCountries Table Component', () => { const state: State = mockGlobalState; const mount = useMountAppended(); - let store = createStore(state, apolloClientObservable); + let store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); beforeEach(() => { - store = createStore(state, apolloClientObservable); + store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); }); describe('rendering', () => { diff --git a/x-pack/plugins/siem/public/components/page/network/network_top_countries_table/index.tsx b/x-pack/plugins/siem/public/network/components/network_top_countries_table/index.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/page/network/network_top_countries_table/index.tsx rename to x-pack/plugins/siem/public/network/components/network_top_countries_table/index.tsx index 30f7d5ad82390..c2a280d30d106 100644 --- a/x-pack/plugins/siem/public/components/page/network/network_top_countries_table/index.tsx +++ b/x-pack/plugins/siem/public/network/components/network_top_countries_table/index.tsx @@ -10,16 +10,17 @@ import { connect, ConnectedProps } from 'react-redux'; import deepEqual from 'fast-deep-equal'; import { IIndexPattern } from 'src/plugins/data/public'; -import { networkActions } from '../../../../store/actions'; +import { networkActions, networkModel, networkSelectors } from '../../store'; import { Direction, FlowTargetSourceDest, NetworkTopCountriesEdges, NetworkTopTablesFields, NetworkTopTablesSortField, -} from '../../../../graphql/types'; -import { networkModel, networkSelectors, State } from '../../../../store'; -import { Criteria, ItemsPerRow, PaginatedTable } from '../../../paginated_table'; +} from '../../../graphql/types'; +import { State } from '../../../common/store'; + +import { Criteria, ItemsPerRow, PaginatedTable } from '../../../common/components/paginated_table'; import { getCountriesColumnsCurated } from './columns'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/components/page/network/network_top_countries_table/mock.ts b/x-pack/plugins/siem/public/network/components/network_top_countries_table/mock.ts similarity index 94% rename from x-pack/plugins/siem/public/components/page/network/network_top_countries_table/mock.ts rename to x-pack/plugins/siem/public/network/components/network_top_countries_table/mock.ts index 42b933c7fba6d..cee775c93d66f 100644 --- a/x-pack/plugins/siem/public/components/page/network/network_top_countries_table/mock.ts +++ b/x-pack/plugins/siem/public/network/components/network_top_countries_table/mock.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { NetworkTopCountriesData } from '../../../../graphql/types'; +import { NetworkTopCountriesData } from '../../../graphql/types'; export const mockData: { NetworkTopCountries: NetworkTopCountriesData } = { NetworkTopCountries: { diff --git a/x-pack/plugins/siem/public/components/page/network/network_top_countries_table/translations.ts b/x-pack/plugins/siem/public/network/components/network_top_countries_table/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/page/network/network_top_countries_table/translations.ts rename to x-pack/plugins/siem/public/network/components/network_top_countries_table/translations.ts diff --git a/x-pack/plugins/siem/public/components/page/network/network_top_n_flow_table/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/network/components/network_top_n_flow_table/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/page/network/network_top_n_flow_table/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/network/components/network_top_n_flow_table/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/page/network/network_top_n_flow_table/columns.tsx b/x-pack/plugins/siem/public/network/components/network_top_n_flow_table/columns.tsx similarity index 87% rename from x-pack/plugins/siem/public/components/page/network/network_top_n_flow_table/columns.tsx rename to x-pack/plugins/siem/public/network/components/network_top_n_flow_table/columns.tsx index 3ed377c7ba4b0..64626c450b9ec 100644 --- a/x-pack/plugins/siem/public/components/page/network/network_top_n_flow_table/columns.tsx +++ b/x-pack/plugins/siem/public/network/components/network_top_n_flow_table/columns.tsx @@ -8,24 +8,30 @@ import { get } from 'lodash/fp'; import numeral from '@elastic/numeral'; import React from 'react'; -import { CountryFlag } from '../../../source_destination/country_flag'; +import { CountryFlag } from '../source_destination/country_flag'; import { AutonomousSystemItem, FlowTargetSourceDest, NetworkTopNFlowEdges, TopNetworkTablesEcsField, -} from '../../../../graphql/types'; -import { networkModel } from '../../../../store'; -import { DragEffects, DraggableWrapper } from '../../../drag_and_drop/draggable_wrapper'; -import { escapeDataProviderId } from '../../../drag_and_drop/helpers'; -import { getEmptyTagValue } from '../../../empty_value'; -import { IPDetailsLink } from '../../../links'; -import { Columns } from '../../../paginated_table'; -import { IS_OPERATOR } from '../../../timeline/data_providers/data_provider'; -import { Provider } from '../../../timeline/data_providers/provider'; +} from '../../../graphql/types'; +import { networkModel } from '../../store'; +import { + DragEffects, + DraggableWrapper, +} from '../../../common/components/drag_and_drop/draggable_wrapper'; +import { escapeDataProviderId } from '../../../common/components/drag_and_drop/helpers'; +import { getEmptyTagValue } from '../../../common/components/empty_value'; +import { IPDetailsLink } from '../../../common/components/links'; +import { Columns } from '../../../common/components/paginated_table'; +import { IS_OPERATOR } from '../../../timelines/components/timeline/data_providers/data_provider'; +import { Provider } from '../../../timelines/components/timeline/data_providers/provider'; import * as i18n from './translations'; -import { getRowItemDraggable, getRowItemDraggables } from '../../../tables/helpers'; -import { PreferenceFormattedBytes } from '../../../formatted_bytes'; +import { + getRowItemDraggable, + getRowItemDraggables, +} from '../../../common/components/tables/helpers'; +import { PreferenceFormattedBytes } from '../../../common/components/formatted_bytes'; export type NetworkTopNFlowColumns = [ Columns, diff --git a/x-pack/plugins/siem/public/components/page/network/network_top_n_flow_table/index.test.tsx b/x-pack/plugins/siem/public/network/components/network_top_n_flow_table/index.test.tsx similarity index 89% rename from x-pack/plugins/siem/public/components/page/network/network_top_n_flow_table/index.test.tsx rename to x-pack/plugins/siem/public/network/components/network_top_n_flow_table/index.test.tsx index 78e8b15005f43..58a7ef744adee 100644 --- a/x-pack/plugins/siem/public/components/page/network/network_top_n_flow_table/index.test.tsx +++ b/x-pack/plugins/siem/public/network/components/network_top_n_flow_table/index.test.tsx @@ -10,11 +10,16 @@ import React from 'react'; import { MockedProvider } from 'react-apollo/test-utils'; import { Provider as ReduxStoreProvider } from 'react-redux'; -import { FlowTargetSourceDest } from '../../../../graphql/types'; -import { apolloClientObservable, mockGlobalState, TestProviders } from '../../../../mock'; -import { useMountAppended } from '../../../../utils/use_mount_appended'; -import { createStore, networkModel, State } from '../../../../store'; - +import { FlowTargetSourceDest } from '../../../graphql/types'; +import { + apolloClientObservable, + mockGlobalState, + TestProviders, + SUB_PLUGINS_REDUCER, +} from '../../../common/mock'; +import { useMountAppended } from '../../../common/utils/use_mount_appended'; +import { createStore, State } from '../../../common/store'; +import { networkModel } from '../../store'; import { NetworkTopNFlowTable } from '.'; import { mockData } from './mock'; @@ -22,11 +27,11 @@ describe('NetworkTopNFlow Table Component', () => { const loadPage = jest.fn(); const state: State = mockGlobalState; - let store = createStore(state, apolloClientObservable); + let store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); const mount = useMountAppended(); beforeEach(() => { - store = createStore(state, apolloClientObservable); + store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); }); describe('rendering', () => { diff --git a/x-pack/plugins/siem/public/components/page/network/network_top_n_flow_table/index.tsx b/x-pack/plugins/siem/public/network/components/network_top_n_flow_table/index.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/page/network/network_top_n_flow_table/index.tsx rename to x-pack/plugins/siem/public/network/components/network_top_n_flow_table/index.tsx index 8e49db04a546c..617dd9d08a9db 100644 --- a/x-pack/plugins/siem/public/components/page/network/network_top_n_flow_table/index.tsx +++ b/x-pack/plugins/siem/public/network/components/network_top_n_flow_table/index.tsx @@ -8,17 +8,16 @@ import React, { useCallback, useMemo } from 'react'; import { connect, ConnectedProps } from 'react-redux'; import deepEqual from 'fast-deep-equal'; -import { networkActions } from '../../../../store/actions'; import { Direction, FlowTargetSourceDest, NetworkTopNFlowEdges, NetworkTopTablesFields, NetworkTopTablesSortField, -} from '../../../../graphql/types'; -import { networkModel, networkSelectors, State } from '../../../../store'; -import { Criteria, ItemsPerRow, PaginatedTable } from '../../../paginated_table'; - +} from '../../../graphql/types'; +import { State } from '../../../common/store'; +import { Criteria, ItemsPerRow, PaginatedTable } from '../../../common/components/paginated_table'; +import { networkActions, networkModel, networkSelectors } from '../../store'; import { getNFlowColumnsCurated } from './columns'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/components/page/network/network_top_n_flow_table/mock.ts b/x-pack/plugins/siem/public/network/components/network_top_n_flow_table/mock.ts similarity index 99% rename from x-pack/plugins/siem/public/components/page/network/network_top_n_flow_table/mock.ts rename to x-pack/plugins/siem/public/network/components/network_top_n_flow_table/mock.ts index 9ef63bf6d3167..bd21d78ba77c5 100644 --- a/x-pack/plugins/siem/public/components/page/network/network_top_n_flow_table/mock.ts +++ b/x-pack/plugins/siem/public/network/components/network_top_n_flow_table/mock.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { NetworkTopNFlowData, FlowTargetSourceDest } from '../../../../graphql/types'; +import { NetworkTopNFlowData, FlowTargetSourceDest } from '../../../graphql/types'; export const mockData: { NetworkTopNFlow: NetworkTopNFlowData } = { NetworkTopNFlow: { diff --git a/x-pack/plugins/siem/public/components/page/network/network_top_n_flow_table/translations.ts b/x-pack/plugins/siem/public/network/components/network_top_n_flow_table/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/page/network/network_top_n_flow_table/translations.ts rename to x-pack/plugins/siem/public/network/components/network_top_n_flow_table/translations.ts diff --git a/x-pack/plugins/siem/public/components/port/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/network/components/port/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/port/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/network/components/port/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/port/index.test.tsx b/x-pack/plugins/siem/public/network/components/port/index.test.tsx similarity index 92% rename from x-pack/plugins/siem/public/components/port/index.test.tsx rename to x-pack/plugins/siem/public/network/components/port/index.test.tsx index 6ab587f266a8a..1f78f1d96cdae 100644 --- a/x-pack/plugins/siem/public/components/port/index.test.tsx +++ b/x-pack/plugins/siem/public/network/components/port/index.test.tsx @@ -7,8 +7,8 @@ import { shallow } from 'enzyme'; import React from 'react'; -import { TestProviders } from '../../mock/test_providers'; -import { useMountAppended } from '../../utils/use_mount_appended'; +import { TestProviders } from '../../../common/mock/test_providers'; +import { useMountAppended } from '../../../common/utils/use_mount_appended'; import { Port } from '.'; diff --git a/x-pack/plugins/siem/public/components/port/index.tsx b/x-pack/plugins/siem/public/network/components/port/index.tsx similarity index 80% rename from x-pack/plugins/siem/public/components/port/index.tsx rename to x-pack/plugins/siem/public/network/components/port/index.tsx index bd6289547d0dc..6f54f11ccfbe1 100644 --- a/x-pack/plugins/siem/public/components/port/index.tsx +++ b/x-pack/plugins/siem/public/network/components/port/index.tsx @@ -6,10 +6,10 @@ import React from 'react'; -import { DefaultDraggable } from '../draggables'; -import { getEmptyValue } from '../empty_value'; -import { ExternalLinkIcon } from '../external_link_icon'; -import { PortOrServiceNameLink } from '../links'; +import { DefaultDraggable } from '../../../common/components/draggables'; +import { getEmptyValue } from '../../../common/components/empty_value'; +import { ExternalLinkIcon } from '../../../common/components/external_link_icon'; +import { PortOrServiceNameLink } from '../../../common/components/links'; export const CLIENT_PORT_FIELD_NAME = 'client.port'; export const DESTINATION_PORT_FIELD_NAME = 'destination.port'; diff --git a/x-pack/plugins/siem/public/components/source_destination/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/network/components/source_destination/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/source_destination/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/network/components/source_destination/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/source_destination/country_flag.tsx b/x-pack/plugins/siem/public/network/components/source_destination/country_flag.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/source_destination/country_flag.tsx rename to x-pack/plugins/siem/public/network/components/source_destination/country_flag.tsx diff --git a/x-pack/plugins/siem/public/components/source_destination/field_names.ts b/x-pack/plugins/siem/public/network/components/source_destination/field_names.ts similarity index 100% rename from x-pack/plugins/siem/public/components/source_destination/field_names.ts rename to x-pack/plugins/siem/public/network/components/source_destination/field_names.ts diff --git a/x-pack/plugins/siem/public/components/source_destination/geo_fields.tsx b/x-pack/plugins/siem/public/network/components/source_destination/geo_fields.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/source_destination/geo_fields.tsx rename to x-pack/plugins/siem/public/network/components/source_destination/geo_fields.tsx index baeca10ee0fae..3618ee40dc8d5 100644 --- a/x-pack/plugins/siem/public/components/source_destination/geo_fields.tsx +++ b/x-pack/plugins/siem/public/network/components/source_destination/geo_fields.tsx @@ -9,7 +9,7 @@ import { get, uniq } from 'lodash/fp'; import React from 'react'; import styled from 'styled-components'; -import { DefaultDraggable } from '../draggables'; +import { DefaultDraggable } from '../../../common/components/draggables'; import { CountryFlag } from './country_flag'; import { GeoFieldsProps, SourceDestinationType } from './types'; diff --git a/x-pack/plugins/siem/public/components/source_destination/index.test.tsx b/x-pack/plugins/siem/public/network/components/source_destination/index.test.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/source_destination/index.test.tsx rename to x-pack/plugins/siem/public/network/components/source_destination/index.test.tsx index 3dee668d66a70..96545813bbbab 100644 --- a/x-pack/plugins/siem/public/components/source_destination/index.test.tsx +++ b/x-pack/plugins/siem/public/network/components/source_destination/index.test.tsx @@ -9,11 +9,11 @@ import { shallow } from 'enzyme'; import { get } from 'lodash/fp'; import React from 'react'; -import { asArrayIfExists } from '../../lib/helpers'; -import { getMockNetflowData } from '../../mock'; -import { TestProviders } from '../../mock/test_providers'; -import { ID_FIELD_NAME } from '../event_details/event_id'; -import { useMountAppended } from '../../utils/use_mount_appended'; +import { asArrayIfExists } from '../../../common/lib/helpers'; +import { getMockNetflowData } from '../../../common/mock'; +import { TestProviders } from '../../../common/mock/test_providers'; +import { ID_FIELD_NAME } from '../../../common/components/event_details/event_id'; +import { useMountAppended } from '../../../common/utils/use_mount_appended'; import { DESTINATION_IP_FIELD_NAME, SOURCE_IP_FIELD_NAME } from '../ip'; import { DESTINATION_PORT_FIELD_NAME, SOURCE_PORT_FIELD_NAME } from '../port'; import { @@ -22,7 +22,7 @@ import { SOURCE_BYTES_FIELD_NAME, SOURCE_PACKETS_FIELD_NAME, } from '../source_destination/source_destination_arrows'; -import * as i18n from '../timeline/body/renderers/translations'; +import * as i18n from '../../../timelines/components/timeline/body/renderers/translations'; import { SourceDestination } from '.'; import { diff --git a/x-pack/plugins/siem/public/components/source_destination/index.tsx b/x-pack/plugins/siem/public/network/components/source_destination/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/source_destination/index.tsx rename to x-pack/plugins/siem/public/network/components/source_destination/index.tsx diff --git a/x-pack/plugins/siem/public/components/source_destination/ip_with_port.tsx b/x-pack/plugins/siem/public/network/components/source_destination/ip_with_port.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/source_destination/ip_with_port.tsx rename to x-pack/plugins/siem/public/network/components/source_destination/ip_with_port.tsx diff --git a/x-pack/plugins/siem/public/components/source_destination/label.tsx b/x-pack/plugins/siem/public/network/components/source_destination/label.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/source_destination/label.tsx rename to x-pack/plugins/siem/public/network/components/source_destination/label.tsx diff --git a/x-pack/plugins/siem/public/components/source_destination/network.tsx b/x-pack/plugins/siem/public/network/components/source_destination/network.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/source_destination/network.tsx rename to x-pack/plugins/siem/public/network/components/source_destination/network.tsx index a0b86b3e9a133..cb1f72bca02c6 100644 --- a/x-pack/plugins/siem/public/components/source_destination/network.tsx +++ b/x-pack/plugins/siem/public/network/components/source_destination/network.tsx @@ -10,7 +10,7 @@ import React from 'react'; import styled from 'styled-components'; import { DirectionBadge } from '../direction'; -import { DefaultDraggable, DraggableBadge } from '../draggables'; +import { DefaultDraggable, DraggableBadge } from '../../../common/components/draggables'; import * as i18n from './translations'; import { @@ -20,7 +20,7 @@ import { NETWORK_PROTOCOL_FIELD_NAME, NETWORK_TRANSPORT_FIELD_NAME, } from './field_names'; -import { PreferenceFormattedBytes } from '../formatted_bytes'; +import { PreferenceFormattedBytes } from '../../../common/components/formatted_bytes'; const EuiFlexItemMarginRight = styled(EuiFlexItem)` margin-right: 3px; diff --git a/x-pack/plugins/siem/public/components/source_destination/source_destination_arrows.tsx b/x-pack/plugins/siem/public/network/components/source_destination/source_destination_arrows.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/source_destination/source_destination_arrows.tsx rename to x-pack/plugins/siem/public/network/components/source_destination/source_destination_arrows.tsx index 005ebc14dcdcc..95cc76a349c17 100644 --- a/x-pack/plugins/siem/public/components/source_destination/source_destination_arrows.tsx +++ b/x-pack/plugins/siem/public/network/components/source_destination/source_destination_arrows.tsx @@ -16,8 +16,8 @@ import { getPercent, hasOneValue, } from '../arrows/helpers'; -import { DefaultDraggable } from '../draggables'; -import { PreferenceFormattedBytes } from '../formatted_bytes'; +import { DefaultDraggable } from '../../../common/components/draggables'; +import { PreferenceFormattedBytes } from '../../../common/components/formatted_bytes'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/components/source_destination/source_destination_ip.test.tsx b/x-pack/plugins/siem/public/network/components/source_destination/source_destination_ip.test.tsx similarity index 99% rename from x-pack/plugins/siem/public/components/source_destination/source_destination_ip.test.tsx rename to x-pack/plugins/siem/public/network/components/source_destination/source_destination_ip.test.tsx index 60ab59c3796ff..18459352f89f0 100644 --- a/x-pack/plugins/siem/public/components/source_destination/source_destination_ip.test.tsx +++ b/x-pack/plugins/siem/public/network/components/source_destination/source_destination_ip.test.tsx @@ -7,14 +7,14 @@ import { get } from 'lodash/fp'; import React from 'react'; -import { asArrayIfExists } from '../../lib/helpers'; -import { getMockNetflowData } from '../../mock'; -import { TestProviders } from '../../mock/test_providers'; -import { ID_FIELD_NAME } from '../event_details/event_id'; +import { asArrayIfExists } from '../../../common/lib/helpers'; +import { getMockNetflowData } from '../../../common/mock'; +import { TestProviders } from '../../../common/mock/test_providers'; +import { ID_FIELD_NAME } from '../../../common/components/event_details/event_id'; import { DESTINATION_IP_FIELD_NAME, SOURCE_IP_FIELD_NAME } from '../ip'; import { DESTINATION_PORT_FIELD_NAME, SOURCE_PORT_FIELD_NAME } from '../port'; -import * as i18n from '../timeline/body/renderers/translations'; -import { useMountAppended } from '../../utils/use_mount_appended'; +import * as i18n from '../../../timelines/components/timeline/body/renderers/translations'; +import { useMountAppended } from '../../../common/utils/use_mount_appended'; import { getPorts, diff --git a/x-pack/plugins/siem/public/components/source_destination/source_destination_ip.tsx b/x-pack/plugins/siem/public/network/components/source_destination/source_destination_ip.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/source_destination/source_destination_ip.tsx rename to x-pack/plugins/siem/public/network/components/source_destination/source_destination_ip.tsx index 62f01dfc020f5..4a242961d91fd 100644 --- a/x-pack/plugins/siem/public/components/source_destination/source_destination_ip.tsx +++ b/x-pack/plugins/siem/public/network/components/source_destination/source_destination_ip.tsx @@ -11,7 +11,7 @@ import deepEqual from 'fast-deep-equal'; import { DESTINATION_IP_FIELD_NAME, SOURCE_IP_FIELD_NAME } from '../ip'; import { DESTINATION_PORT_FIELD_NAME, SOURCE_PORT_FIELD_NAME, Port } from '../port'; -import * as i18n from '../timeline/body/renderers/translations'; +import * as i18n from '../../../timelines/components/timeline/body/renderers/translations'; import { GeoFields } from './geo_fields'; import { IpWithPort } from './ip_with_port'; diff --git a/x-pack/plugins/siem/public/components/source_destination/source_destination_with_arrows.tsx b/x-pack/plugins/siem/public/network/components/source_destination/source_destination_with_arrows.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/source_destination/source_destination_with_arrows.tsx rename to x-pack/plugins/siem/public/network/components/source_destination/source_destination_with_arrows.tsx diff --git a/x-pack/plugins/siem/public/components/source_destination/translations.ts b/x-pack/plugins/siem/public/network/components/source_destination/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/source_destination/translations.ts rename to x-pack/plugins/siem/public/network/components/source_destination/translations.ts diff --git a/x-pack/plugins/siem/public/components/source_destination/types.ts b/x-pack/plugins/siem/public/network/components/source_destination/types.ts similarity index 100% rename from x-pack/plugins/siem/public/components/source_destination/types.ts rename to x-pack/plugins/siem/public/network/components/source_destination/types.ts diff --git a/x-pack/plugins/siem/public/components/page/network/tls_table/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/network/components/tls_table/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/page/network/tls_table/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/network/components/tls_table/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/page/network/tls_table/columns.tsx b/x-pack/plugins/siem/public/network/components/tls_table/columns.tsx similarity index 85% rename from x-pack/plugins/siem/public/components/page/network/tls_table/columns.tsx rename to x-pack/plugins/siem/public/network/components/tls_table/columns.tsx index f95475819abc9..5a6317291430e 100644 --- a/x-pack/plugins/siem/public/components/page/network/tls_table/columns.tsx +++ b/x-pack/plugins/siem/public/network/components/tls_table/columns.tsx @@ -8,12 +8,15 @@ import React from 'react'; import moment from 'moment'; -import { TlsNode } from '../../../../graphql/types'; -import { Columns } from '../../../paginated_table'; +import { TlsNode } from '../../../graphql/types'; +import { Columns } from '../../../common/components/paginated_table'; -import { getRowItemDraggables, getRowItemDraggable } from '../../../tables/helpers'; -import { LocalizedDateTooltip } from '../../../localized_date_tooltip'; -import { PreferenceFormattedDate } from '../../../formatted_date'; +import { + getRowItemDraggables, + getRowItemDraggable, +} from '../../../common/components/tables/helpers'; +import { LocalizedDateTooltip } from '../../../common/components/localized_date_tooltip'; +import { PreferenceFormattedDate } from '../../../common/components/formatted_date'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/components/page/network/tls_table/index.test.tsx b/x-pack/plugins/siem/public/network/components/tls_table/index.test.tsx similarity index 85% rename from x-pack/plugins/siem/public/components/page/network/tls_table/index.test.tsx rename to x-pack/plugins/siem/public/network/components/tls_table/index.test.tsx index 81a472f3175e5..7f2cfc8ba9ba4 100644 --- a/x-pack/plugins/siem/public/components/page/network/tls_table/index.test.tsx +++ b/x-pack/plugins/siem/public/network/components/tls_table/index.test.tsx @@ -10,10 +10,15 @@ import React from 'react'; import { MockedProvider } from 'react-apollo/test-utils'; import { Provider as ReduxStoreProvider } from 'react-redux'; -import { apolloClientObservable, mockGlobalState, TestProviders } from '../../../../mock'; -import { useMountAppended } from '../../../../utils/use_mount_appended'; -import { createStore, networkModel, State } from '../../../../store'; - +import { + apolloClientObservable, + mockGlobalState, + TestProviders, + SUB_PLUGINS_REDUCER, +} from '../../../common/mock'; +import { useMountAppended } from '../../../common/utils/use_mount_appended'; +import { createStore, State } from '../../../common/store'; +import { networkModel } from '../../store'; import { TlsTable } from '.'; import { mockTlsData } from './mock'; @@ -21,11 +26,11 @@ describe('Tls Table Component', () => { const loadPage = jest.fn(); const state: State = mockGlobalState; - let store = createStore(state, apolloClientObservable); + let store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); const mount = useMountAppended(); beforeEach(() => { - store = createStore(state, apolloClientObservable); + store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); }); describe('Rendering', () => { diff --git a/x-pack/plugins/siem/public/components/page/network/tls_table/index.tsx b/x-pack/plugins/siem/public/network/components/tls_table/index.tsx similarity index 93% rename from x-pack/plugins/siem/public/components/page/network/tls_table/index.tsx rename to x-pack/plugins/siem/public/network/components/tls_table/index.tsx index d1512699cc709..34bde8f42eaf9 100644 --- a/x-pack/plugins/siem/public/components/page/network/tls_table/index.tsx +++ b/x-pack/plugins/siem/public/network/components/tls_table/index.tsx @@ -8,10 +8,15 @@ import React, { useCallback, useMemo } from 'react'; import { connect, ConnectedProps } from 'react-redux'; import deepEqual from 'fast-deep-equal'; -import { networkActions } from '../../../../store/network'; -import { TlsEdges, TlsSortField, TlsFields, Direction } from '../../../../graphql/types'; -import { networkModel, networkSelectors, State } from '../../../../store'; -import { Criteria, ItemsPerRow, PaginatedTable, SortingBasicTable } from '../../../paginated_table'; +import { networkActions, networkModel, networkSelectors } from '../../store'; +import { TlsEdges, TlsSortField, TlsFields, Direction } from '../../../graphql/types'; +import { State } from '../../../common/store'; +import { + Criteria, + ItemsPerRow, + PaginatedTable, + SortingBasicTable, +} from '../../../common/components/paginated_table'; import { getTlsColumns } from './columns'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/components/page/network/tls_table/mock.ts b/x-pack/plugins/siem/public/network/components/tls_table/mock.ts similarity index 96% rename from x-pack/plugins/siem/public/components/page/network/tls_table/mock.ts rename to x-pack/plugins/siem/public/network/components/tls_table/mock.ts index 453bd8fc84dfa..a90907eb38854 100644 --- a/x-pack/plugins/siem/public/components/page/network/tls_table/mock.ts +++ b/x-pack/plugins/siem/public/network/components/tls_table/mock.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { TlsData } from '../../../../graphql/types'; +import { TlsData } from '../../../graphql/types'; export const mockTlsData: TlsData = { totalCount: 2, diff --git a/x-pack/plugins/siem/public/components/page/network/tls_table/translations.ts b/x-pack/plugins/siem/public/network/components/tls_table/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/page/network/tls_table/translations.ts rename to x-pack/plugins/siem/public/network/components/tls_table/translations.ts diff --git a/x-pack/plugins/siem/public/components/page/network/users_table/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/network/components/users_table/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/page/network/users_table/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/network/components/users_table/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/page/network/users_table/columns.tsx b/x-pack/plugins/siem/public/network/components/users_table/columns.tsx similarity index 86% rename from x-pack/plugins/siem/public/components/page/network/users_table/columns.tsx rename to x-pack/plugins/siem/public/network/components/users_table/columns.tsx index b732ac5bfd5fa..d3ad2cd707ecd 100644 --- a/x-pack/plugins/siem/public/components/page/network/users_table/columns.tsx +++ b/x-pack/plugins/siem/public/network/components/users_table/columns.tsx @@ -4,12 +4,15 @@ * you may not use this file except in compliance with the Elastic License. */ -import { FlowTarget, UsersItem } from '../../../../graphql/types'; -import { defaultToEmptyTag } from '../../../empty_value'; -import { Columns } from '../../../paginated_table'; +import { FlowTarget, UsersItem } from '../../../graphql/types'; +import { defaultToEmptyTag } from '../../../common/components/empty_value'; +import { Columns } from '../../../common/components/paginated_table'; import * as i18n from './translations'; -import { getRowItemDraggables, getRowItemDraggable } from '../../../tables/helpers'; +import { + getRowItemDraggables, + getRowItemDraggable, +} from '../../../common/components/tables/helpers'; export type UsersColumns = [ Columns, diff --git a/x-pack/plugins/siem/public/components/page/network/users_table/index.test.tsx b/x-pack/plugins/siem/public/network/components/users_table/index.test.tsx similarity index 85% rename from x-pack/plugins/siem/public/components/page/network/users_table/index.test.tsx rename to x-pack/plugins/siem/public/network/components/users_table/index.test.tsx index 8dc3704a089ea..2597249797da5 100644 --- a/x-pack/plugins/siem/public/components/page/network/users_table/index.test.tsx +++ b/x-pack/plugins/siem/public/network/components/users_table/index.test.tsx @@ -10,10 +10,16 @@ import React from 'react'; import { MockedProvider } from 'react-apollo/test-utils'; import { Provider as ReduxStoreProvider } from 'react-redux'; -import { FlowTarget } from '../../../../graphql/types'; -import { apolloClientObservable, mockGlobalState, TestProviders } from '../../../../mock'; -import { useMountAppended } from '../../../../utils/use_mount_appended'; -import { createStore, networkModel, State } from '../../../../store'; +import { FlowTarget } from '../../../graphql/types'; +import { + apolloClientObservable, + mockGlobalState, + TestProviders, + SUB_PLUGINS_REDUCER, +} from '../../../common/mock'; +import { useMountAppended } from '../../../common/utils/use_mount_appended'; +import { createStore, State } from '../../../common/store'; +import { networkModel } from '../../store'; import { UsersTable } from '.'; import { mockUsersData } from './mock'; @@ -22,11 +28,11 @@ describe('Users Table Component', () => { const loadPage = jest.fn(); const state: State = mockGlobalState; - let store = createStore(state, apolloClientObservable); + let store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); const mount = useMountAppended(); beforeEach(() => { - store = createStore(state, apolloClientObservable); + store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); }); describe('Rendering', () => { diff --git a/x-pack/plugins/siem/public/components/page/network/users_table/index.tsx b/x-pack/plugins/siem/public/network/components/users_table/index.tsx similarity index 92% rename from x-pack/plugins/siem/public/components/page/network/users_table/index.tsx rename to x-pack/plugins/siem/public/network/components/users_table/index.tsx index b585b835f31cd..5e5bac20141bc 100644 --- a/x-pack/plugins/siem/public/components/page/network/users_table/index.tsx +++ b/x-pack/plugins/siem/public/network/components/users_table/index.tsx @@ -8,20 +8,25 @@ import React, { useCallback, useMemo } from 'react'; import { connect, ConnectedProps } from 'react-redux'; import deepEqual from 'fast-deep-equal'; -import { networkActions } from '../../../../store/network'; +import { networkActions, networkModel, networkSelectors } from '../../store'; import { Direction, FlowTarget, UsersEdges, UsersFields, UsersSortField, -} from '../../../../graphql/types'; -import { networkModel, networkSelectors, State } from '../../../../store'; -import { Criteria, ItemsPerRow, PaginatedTable, SortingBasicTable } from '../../../paginated_table'; +} from '../../../graphql/types'; +import { State } from '../../../common/store'; +import { + Criteria, + ItemsPerRow, + PaginatedTable, + SortingBasicTable, +} from '../../../common/components/paginated_table'; import { getUsersColumns } from './columns'; import * as i18n from './translations'; -import { assertUnreachable } from '../../../../lib/helpers'; +import { assertUnreachable } from '../../../common/lib/helpers'; const tableType = networkModel.IpDetailsTableType.users; interface OwnProps { diff --git a/x-pack/plugins/siem/public/components/page/network/users_table/mock.ts b/x-pack/plugins/siem/public/network/components/users_table/mock.ts similarity index 95% rename from x-pack/plugins/siem/public/components/page/network/users_table/mock.ts rename to x-pack/plugins/siem/public/network/components/users_table/mock.ts index 9a5de66a91a3e..50bef1867aa3b 100644 --- a/x-pack/plugins/siem/public/components/page/network/users_table/mock.ts +++ b/x-pack/plugins/siem/public/network/components/users_table/mock.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { UsersData } from '../../../../graphql/types'; +import { UsersData } from '../../../graphql/types'; export const mockUsersData: UsersData = { edges: [ diff --git a/x-pack/plugins/siem/public/components/page/network/users_table/translations.ts b/x-pack/plugins/siem/public/network/components/users_table/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/page/network/users_table/translations.ts rename to x-pack/plugins/siem/public/network/components/users_table/translations.ts diff --git a/x-pack/plugins/siem/public/containers/ip_overview/index.gql_query.ts b/x-pack/plugins/siem/public/network/containers/ip_overview/index.gql_query.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/ip_overview/index.gql_query.ts rename to x-pack/plugins/siem/public/network/containers/ip_overview/index.gql_query.ts diff --git a/x-pack/plugins/siem/public/containers/ip_overview/index.tsx b/x-pack/plugins/siem/public/network/containers/ip_overview/index.tsx similarity index 82% rename from x-pack/plugins/siem/public/containers/ip_overview/index.tsx rename to x-pack/plugins/siem/public/network/containers/ip_overview/index.tsx index ade94c430c6ef..551ecebf2c05a 100644 --- a/x-pack/plugins/siem/public/containers/ip_overview/index.tsx +++ b/x-pack/plugins/siem/public/network/containers/ip_overview/index.tsx @@ -9,13 +9,13 @@ import React from 'react'; import { Query } from 'react-apollo'; import { connect, ConnectedProps } from 'react-redux'; -import { DEFAULT_INDEX_KEY } from '../../../common/constants'; -import { GetIpOverviewQuery, IpOverviewData } from '../../graphql/types'; -import { networkModel, inputsModel, inputsSelectors, State } from '../../store'; -import { useUiSetting } from '../../lib/kibana'; -import { createFilter, getDefaultFetchPolicy } from '../helpers'; -import { QueryTemplateProps } from '../query_template'; - +import { DEFAULT_INDEX_KEY } from '../../../../common/constants'; +import { GetIpOverviewQuery, IpOverviewData } from '../../../graphql/types'; +import { inputsModel, inputsSelectors, State } from '../../../common/store'; +import { useUiSetting } from '../../../common/lib/kibana'; +import { createFilter, getDefaultFetchPolicy } from '../../../common/containers/helpers'; +import { QueryTemplateProps } from '../../../common/containers/query_template'; +import { networkModel } from '../../store'; import { ipOverviewQuery } from './index.gql_query'; const ID = 'ipOverviewQuery'; diff --git a/x-pack/plugins/siem/public/containers/kpi_network/index.gql_query.ts b/x-pack/plugins/siem/public/network/containers/kpi_network/index.gql_query.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/kpi_network/index.gql_query.ts rename to x-pack/plugins/siem/public/network/containers/kpi_network/index.gql_query.ts diff --git a/x-pack/plugins/siem/public/containers/kpi_network/index.tsx b/x-pack/plugins/siem/public/network/containers/kpi_network/index.tsx similarity index 83% rename from x-pack/plugins/siem/public/containers/kpi_network/index.tsx rename to x-pack/plugins/siem/public/network/containers/kpi_network/index.tsx index 338cdc39b178c..edba8b4c2e65c 100644 --- a/x-pack/plugins/siem/public/containers/kpi_network/index.tsx +++ b/x-pack/plugins/siem/public/network/containers/kpi_network/index.tsx @@ -9,12 +9,12 @@ import React from 'react'; import { Query } from 'react-apollo'; import { connect, ConnectedProps } from 'react-redux'; -import { DEFAULT_INDEX_KEY } from '../../../common/constants'; -import { GetKpiNetworkQuery, KpiNetworkData } from '../../graphql/types'; -import { inputsModel, inputsSelectors, State } from '../../store'; -import { useUiSetting } from '../../lib/kibana'; -import { createFilter, getDefaultFetchPolicy } from '../helpers'; -import { QueryTemplateProps } from '../query_template'; +import { DEFAULT_INDEX_KEY } from '../../../../common/constants'; +import { GetKpiNetworkQuery, KpiNetworkData } from '../../../graphql/types'; +import { inputsModel, inputsSelectors, State } from '../../../common/store'; +import { useUiSetting } from '../../../common/lib/kibana'; +import { createFilter, getDefaultFetchPolicy } from '../../../common/containers/helpers'; +import { QueryTemplateProps } from '../../../common/containers/query_template'; import { kpiNetworkQuery } from './index.gql_query'; diff --git a/x-pack/plugins/siem/public/containers/network_dns/index.gql_query.ts b/x-pack/plugins/siem/public/network/containers/network_dns/index.gql_query.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/network_dns/index.gql_query.ts rename to x-pack/plugins/siem/public/network/containers/network_dns/index.gql_query.ts diff --git a/x-pack/plugins/siem/public/containers/network_dns/index.tsx b/x-pack/plugins/siem/public/network/containers/network_dns/index.tsx similarity index 85% rename from x-pack/plugins/siem/public/containers/network_dns/index.tsx rename to x-pack/plugins/siem/public/network/containers/network_dns/index.tsx index 04c8783c30a0f..2bae19ce89aec 100644 --- a/x-pack/plugins/siem/public/containers/network_dns/index.tsx +++ b/x-pack/plugins/siem/public/network/containers/network_dns/index.tsx @@ -12,25 +12,32 @@ import { compose } from 'redux'; import { DocumentNode } from 'graphql'; import { ScaleType } from '@elastic/charts'; -import { DEFAULT_INDEX_KEY } from '../../../common/constants'; +import { DEFAULT_INDEX_KEY } from '../../../../common/constants'; import { GetNetworkDnsQuery, NetworkDnsEdges, NetworkDnsSortField, PageInfoPaginated, MatrixOverOrdinalHistogramData, -} from '../../graphql/types'; -import { inputsModel, networkModel, networkSelectors, State, inputsSelectors } from '../../store'; -import { withKibana, WithKibanaProps } from '../../lib/kibana'; -import { generateTablePaginationOptions } from '../../components/paginated_table/helpers'; -import { createFilter, getDefaultFetchPolicy } from '../helpers'; -import { QueryTemplatePaginated, QueryTemplatePaginatedProps } from '../query_template_paginated'; +} from '../../../graphql/types'; +import { inputsModel, State, inputsSelectors } from '../../../common/store'; +import { withKibana, WithKibanaProps } from '../../../common/lib/kibana'; +import { generateTablePaginationOptions } from '../../../common/components/paginated_table/helpers'; +import { createFilter, getDefaultFetchPolicy } from '../../../common/containers/helpers'; +import { + QueryTemplatePaginated, + QueryTemplatePaginatedProps, +} from '../../../common/containers/query_template_paginated'; import { networkDnsQuery } from './index.gql_query'; -import { DEFAULT_TABLE_ACTIVE_PAGE, DEFAULT_TABLE_LIMIT } from '../../store/constants'; -import { MatrixHistogram } from '../../components/matrix_histogram'; -import { MatrixHistogramOption, GetSubTitle } from '../../components/matrix_histogram/types'; -import { UpdateDateRange } from '../../components/charts/common'; -import { SetQuery } from '../../pages/hosts/navigation/types'; +import { DEFAULT_TABLE_ACTIVE_PAGE, DEFAULT_TABLE_LIMIT } from '../../../common/store/constants'; +import { MatrixHistogram } from '../../../common/components/matrix_histogram'; +import { + MatrixHistogramOption, + GetSubTitle, +} from '../../../common/components/matrix_histogram/types'; +import { UpdateDateRange } from '../../../common/components/charts/common'; +import { SetQuery } from '../../../hosts/pages/navigation/types'; +import { networkModel, networkSelectors } from '../../store'; const ID = 'networkDnsQuery'; export const HISTOGRAM_ID = 'networkDnsHistogramQuery'; diff --git a/x-pack/plugins/siem/public/containers/network_http/index.gql_query.ts b/x-pack/plugins/siem/public/network/containers/network_http/index.gql_query.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/network_http/index.gql_query.ts rename to x-pack/plugins/siem/public/network/containers/network_http/index.gql_query.ts diff --git a/x-pack/plugins/siem/public/containers/network_http/index.tsx b/x-pack/plugins/siem/public/network/containers/network_http/index.tsx similarity index 87% rename from x-pack/plugins/siem/public/containers/network_http/index.tsx rename to x-pack/plugins/siem/public/network/containers/network_http/index.tsx index bf4e64f63d559..60845d452d69e 100644 --- a/x-pack/plugins/siem/public/containers/network_http/index.tsx +++ b/x-pack/plugins/siem/public/network/containers/network_http/index.tsx @@ -10,18 +10,22 @@ import { Query } from 'react-apollo'; import { connect } from 'react-redux'; import { compose } from 'redux'; -import { DEFAULT_INDEX_KEY } from '../../../common/constants'; +import { DEFAULT_INDEX_KEY } from '../../../../common/constants'; import { GetNetworkHttpQuery, NetworkHttpEdges, NetworkHttpSortField, PageInfoPaginated, -} from '../../graphql/types'; -import { inputsModel, inputsSelectors, networkModel, networkSelectors, State } from '../../store'; -import { withKibana, WithKibanaProps } from '../../lib/kibana'; -import { generateTablePaginationOptions } from '../../components/paginated_table/helpers'; -import { createFilter, getDefaultFetchPolicy } from '../helpers'; -import { QueryTemplatePaginated, QueryTemplatePaginatedProps } from '../query_template_paginated'; +} from '../../../graphql/types'; +import { inputsModel, inputsSelectors, State } from '../../../common/store'; +import { withKibana, WithKibanaProps } from '../../../common/lib/kibana'; +import { generateTablePaginationOptions } from '../../../common/components/paginated_table/helpers'; +import { createFilter, getDefaultFetchPolicy } from '../../../common/containers/helpers'; +import { + QueryTemplatePaginated, + QueryTemplatePaginatedProps, +} from '../../../common/containers/query_template_paginated'; +import { networkModel, networkSelectors } from '../../store'; import { networkHttpQuery } from './index.gql_query'; const ID = 'networkHttpQuery'; diff --git a/x-pack/plugins/siem/public/containers/network_top_countries/index.gql_query.ts b/x-pack/plugins/siem/public/network/containers/network_top_countries/index.gql_query.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/network_top_countries/index.gql_query.ts rename to x-pack/plugins/siem/public/network/containers/network_top_countries/index.gql_query.ts diff --git a/x-pack/plugins/siem/public/containers/network_top_countries/index.tsx b/x-pack/plugins/siem/public/network/containers/network_top_countries/index.tsx similarity index 88% rename from x-pack/plugins/siem/public/containers/network_top_countries/index.tsx rename to x-pack/plugins/siem/public/network/containers/network_top_countries/index.tsx index bd1e1a002bbcd..b167cba460818 100644 --- a/x-pack/plugins/siem/public/containers/network_top_countries/index.tsx +++ b/x-pack/plugins/siem/public/network/containers/network_top_countries/index.tsx @@ -10,20 +10,24 @@ import { Query } from 'react-apollo'; import { connect } from 'react-redux'; import { compose } from 'redux'; -import { DEFAULT_INDEX_KEY } from '../../../common/constants'; +import { DEFAULT_INDEX_KEY } from '../../../../common/constants'; import { FlowTargetSourceDest, GetNetworkTopCountriesQuery, NetworkTopCountriesEdges, NetworkTopTablesSortField, PageInfoPaginated, -} from '../../graphql/types'; -import { inputsModel, inputsSelectors, networkModel, networkSelectors, State } from '../../store'; -import { withKibana, WithKibanaProps } from '../../lib/kibana'; -import { generateTablePaginationOptions } from '../../components/paginated_table/helpers'; -import { createFilter, getDefaultFetchPolicy } from '../helpers'; -import { QueryTemplatePaginated, QueryTemplatePaginatedProps } from '../query_template_paginated'; +} from '../../../graphql/types'; +import { inputsModel, inputsSelectors, State } from '../../../common/store'; +import { withKibana, WithKibanaProps } from '../../../common/lib/kibana'; +import { generateTablePaginationOptions } from '../../../common/components/paginated_table/helpers'; +import { createFilter, getDefaultFetchPolicy } from '../../../common/containers/helpers'; +import { + QueryTemplatePaginated, + QueryTemplatePaginatedProps, +} from '../../../common/containers/query_template_paginated'; import { networkTopCountriesQuery } from './index.gql_query'; +import { networkModel, networkSelectors } from '../../store'; const ID = 'networkTopCountriesQuery'; diff --git a/x-pack/plugins/siem/public/containers/network_top_n_flow/index.gql_query.ts b/x-pack/plugins/siem/public/network/containers/network_top_n_flow/index.gql_query.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/network_top_n_flow/index.gql_query.ts rename to x-pack/plugins/siem/public/network/containers/network_top_n_flow/index.gql_query.ts diff --git a/x-pack/plugins/siem/public/containers/network_top_n_flow/index.tsx b/x-pack/plugins/siem/public/network/containers/network_top_n_flow/index.tsx similarity index 88% rename from x-pack/plugins/siem/public/containers/network_top_n_flow/index.tsx rename to x-pack/plugins/siem/public/network/containers/network_top_n_flow/index.tsx index f0f1f8257f29f..770574b0813c1 100644 --- a/x-pack/plugins/siem/public/containers/network_top_n_flow/index.tsx +++ b/x-pack/plugins/siem/public/network/containers/network_top_n_flow/index.tsx @@ -10,20 +10,24 @@ import { Query } from 'react-apollo'; import { connect } from 'react-redux'; import { compose } from 'redux'; -import { DEFAULT_INDEX_KEY } from '../../../common/constants'; +import { DEFAULT_INDEX_KEY } from '../../../../common/constants'; import { FlowTargetSourceDest, GetNetworkTopNFlowQuery, NetworkTopNFlowEdges, NetworkTopTablesSortField, PageInfoPaginated, -} from '../../graphql/types'; -import { withKibana, WithKibanaProps } from '../../lib/kibana'; -import { inputsModel, inputsSelectors, networkModel, networkSelectors, State } from '../../store'; -import { generateTablePaginationOptions } from '../../components/paginated_table/helpers'; -import { createFilter, getDefaultFetchPolicy } from '../helpers'; -import { QueryTemplatePaginated, QueryTemplatePaginatedProps } from '../query_template_paginated'; +} from '../../../graphql/types'; +import { withKibana, WithKibanaProps } from '../../../common/lib/kibana'; +import { inputsModel, inputsSelectors, State } from '../../../common/store'; +import { generateTablePaginationOptions } from '../../../common/components/paginated_table/helpers'; +import { createFilter, getDefaultFetchPolicy } from '../../../common/containers/helpers'; +import { + QueryTemplatePaginated, + QueryTemplatePaginatedProps, +} from '../../../common/containers/query_template_paginated'; import { networkTopNFlowQuery } from './index.gql_query'; +import { networkModel, networkSelectors } from '../../store'; const ID = 'networkTopNFlowQuery'; diff --git a/x-pack/plugins/siem/public/containers/tls/index.gql_query.ts b/x-pack/plugins/siem/public/network/containers/tls/index.gql_query.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/tls/index.gql_query.ts rename to x-pack/plugins/siem/public/network/containers/tls/index.gql_query.ts diff --git a/x-pack/plugins/siem/public/containers/tls/index.tsx b/x-pack/plugins/siem/public/network/containers/tls/index.tsx similarity index 87% rename from x-pack/plugins/siem/public/containers/tls/index.tsx rename to x-pack/plugins/siem/public/network/containers/tls/index.tsx index 3738355c8846e..a50f2a131b75b 100644 --- a/x-pack/plugins/siem/public/containers/tls/index.tsx +++ b/x-pack/plugins/siem/public/network/containers/tls/index.tsx @@ -10,19 +10,23 @@ import { Query } from 'react-apollo'; import { connect } from 'react-redux'; import { compose } from 'redux'; -import { DEFAULT_INDEX_KEY } from '../../../common/constants'; +import { DEFAULT_INDEX_KEY } from '../../../../common/constants'; import { PageInfoPaginated, TlsEdges, TlsSortField, GetTlsQuery, FlowTargetSourceDest, -} from '../../graphql/types'; -import { inputsModel, networkModel, networkSelectors, State, inputsSelectors } from '../../store'; -import { withKibana, WithKibanaProps } from '../../lib/kibana'; -import { createFilter, getDefaultFetchPolicy } from '../helpers'; -import { generateTablePaginationOptions } from '../../components/paginated_table/helpers'; -import { QueryTemplatePaginated, QueryTemplatePaginatedProps } from '../query_template_paginated'; +} from '../../../graphql/types'; +import { inputsModel, State, inputsSelectors } from '../../../common/store'; +import { withKibana, WithKibanaProps } from '../../../common/lib/kibana'; +import { createFilter, getDefaultFetchPolicy } from '../../../common/containers/helpers'; +import { generateTablePaginationOptions } from '../../../common/components/paginated_table/helpers'; +import { + QueryTemplatePaginated, + QueryTemplatePaginatedProps, +} from '../../../common/containers/query_template_paginated'; +import { networkModel, networkSelectors } from '../../store'; import { tlsQuery } from './index.gql_query'; const ID = 'tlsQuery'; diff --git a/x-pack/plugins/siem/public/containers/users/index.gql_query.ts b/x-pack/plugins/siem/public/network/containers/users/index.gql_query.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/users/index.gql_query.ts rename to x-pack/plugins/siem/public/network/containers/users/index.gql_query.ts diff --git a/x-pack/plugins/siem/public/containers/users/index.tsx b/x-pack/plugins/siem/public/network/containers/users/index.tsx similarity index 87% rename from x-pack/plugins/siem/public/containers/users/index.tsx rename to x-pack/plugins/siem/public/network/containers/users/index.tsx index 5f71449c52460..efbeb3eb00542 100644 --- a/x-pack/plugins/siem/public/containers/users/index.tsx +++ b/x-pack/plugins/siem/public/network/containers/users/index.tsx @@ -10,13 +10,17 @@ import { Query } from 'react-apollo'; import { connect, ConnectedProps } from 'react-redux'; import { compose } from 'redux'; -import { DEFAULT_INDEX_KEY } from '../../../common/constants'; -import { GetUsersQuery, FlowTarget, PageInfoPaginated, UsersEdges } from '../../graphql/types'; -import { inputsModel, networkModel, networkSelectors, State, inputsSelectors } from '../../store'; -import { withKibana, WithKibanaProps } from '../../lib/kibana'; -import { createFilter, getDefaultFetchPolicy } from '../helpers'; -import { generateTablePaginationOptions } from '../../components/paginated_table/helpers'; -import { QueryTemplatePaginated, QueryTemplatePaginatedProps } from '../query_template_paginated'; +import { DEFAULT_INDEX_KEY } from '../../../../common/constants'; +import { GetUsersQuery, FlowTarget, PageInfoPaginated, UsersEdges } from '../../../graphql/types'; +import { inputsModel, State, inputsSelectors } from '../../../common/store'; +import { withKibana, WithKibanaProps } from '../../../common/lib/kibana'; +import { createFilter, getDefaultFetchPolicy } from '../../../common/containers/helpers'; +import { generateTablePaginationOptions } from '../../../common/components/paginated_table/helpers'; +import { + QueryTemplatePaginated, + QueryTemplatePaginatedProps, +} from '../../../common/containers/query_template_paginated'; +import { networkModel, networkSelectors } from '../../store'; import { usersQuery } from './index.gql_query'; diff --git a/x-pack/plugins/siem/public/network/index.ts b/x-pack/plugins/siem/public/network/index.ts new file mode 100644 index 0000000000000..6590e5ee5161c --- /dev/null +++ b/x-pack/plugins/siem/public/network/index.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { SecuritySubPluginWithStore } from '../app/types'; +import { getNetworkRoutes } from './routes'; +import { initialNetworkState, networkReducer, NetworkState } from './store'; + +export class Network { + public setup() {} + + public start(): SecuritySubPluginWithStore<'network', NetworkState> { + return { + routes: getNetworkRoutes(), + store: { + initialState: { network: initialNetworkState }, + reducer: { network: networkReducer }, + }, + }; + } +} diff --git a/x-pack/plugins/siem/public/pages/network/index.tsx b/x-pack/plugins/siem/public/network/pages/index.tsx similarity index 93% rename from x-pack/plugins/siem/public/pages/network/index.tsx rename to x-pack/plugins/siem/public/network/pages/index.tsx index 412e51e74059e..c6f13c118c309 100644 --- a/x-pack/plugins/siem/public/pages/network/index.tsx +++ b/x-pack/plugins/siem/public/network/pages/index.tsx @@ -7,14 +7,14 @@ import React, { useMemo } from 'react'; import { Redirect, Route, Switch, RouteComponentProps } from 'react-router-dom'; -import { useMlCapabilities } from '../../components/ml_popover/hooks/use_ml_capabilities'; +import { useMlCapabilities } from '../../common/components/ml_popover/hooks/use_ml_capabilities'; import { hasMlUserPermissions } from '../../../common/machine_learning/has_ml_user_permissions'; import { FlowTarget } from '../../graphql/types'; import { IPDetails } from './ip_details'; import { Network } from './network'; -import { GlobalTime } from '../../containers/global_time'; -import { SiemPageName } from '../home/types'; +import { GlobalTime } from '../../common/containers/global_time'; +import { SiemPageName } from '../../app/types'; import { getNetworkRoutePath } from './navigation'; import { NetworkRouteType } from './navigation/types'; diff --git a/x-pack/plugins/siem/public/pages/network/ip_details/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/network/pages/ip_details/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/pages/network/ip_details/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/network/pages/ip_details/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/pages/network/ip_details/index.test.tsx b/x-pack/plugins/siem/public/network/pages/ip_details/index.test.tsx similarity index 84% rename from x-pack/plugins/siem/public/pages/network/ip_details/index.test.tsx rename to x-pack/plugins/siem/public/network/pages/ip_details/index.test.tsx index 02132d790796c..79af38f0cf887 100644 --- a/x-pack/plugins/siem/public/pages/network/ip_details/index.test.tsx +++ b/x-pack/plugins/siem/public/network/pages/ip_details/index.test.tsx @@ -11,15 +11,19 @@ import { Router } from 'react-router-dom'; import { MockedProvider } from 'react-apollo/test-utils'; import { ActionCreator } from 'typescript-fsa'; -import '../../../mock/match_media'; +import '../../../common/mock/match_media'; -import { mocksSource } from '../../../containers/source/mock'; +import { mocksSource } from '../../../common/containers/source/mock'; import { FlowTarget } from '../../../graphql/types'; -import { apolloClientObservable, mockGlobalState, TestProviders } from '../../../mock'; -import { useMountAppended } from '../../../utils/use_mount_appended'; -import { createStore, State } from '../../../store'; -import { InputsModelId } from '../../../store/inputs/constants'; - +import { + apolloClientObservable, + mockGlobalState, + TestProviders, + SUB_PLUGINS_REDUCER, +} from '../../../common/mock'; +import { useMountAppended } from '../../../common/utils/use_mount_appended'; +import { createStore, State } from '../../../common/store'; +import { InputsModelId } from '../../../common/store/inputs/constants'; import { IPDetailsComponent, IPDetails } from './index'; type Action = 'PUSH' | 'POP' | 'REPLACE'; @@ -29,10 +33,10 @@ type GlobalWithFetch = NodeJS.Global & { fetch: jest.Mock }; // Test will fail because we will to need to mock some core services to make the test work // For now let's forget about SiemSearchBar and QueryBar -jest.mock('../../../components/search_bar', () => ({ +jest.mock('../../../common/components/search_bar', () => ({ SiemSearchBar: () => null, })); -jest.mock('../../../components/query_bar', () => ({ +jest.mock('../../../common/components/query_bar', () => ({ QueryBar: () => null, })); @@ -114,10 +118,10 @@ describe('Ip Details', () => { }); const state: State = mockGlobalState; - let store = createStore(state, apolloClientObservable); + let store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); beforeEach(() => { - store = createStore(state, apolloClientObservable); + store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); localSource = cloneDeep(mocksSource); }); diff --git a/x-pack/plugins/siem/public/pages/network/ip_details/index.tsx b/x-pack/plugins/siem/public/network/pages/ip_details/index.tsx similarity index 84% rename from x-pack/plugins/siem/public/pages/network/ip_details/index.tsx rename to x-pack/plugins/siem/public/network/pages/ip_details/index.tsx index 350d6e34c1c0f..9ae09d6c6cec7 100644 --- a/x-pack/plugins/siem/public/pages/network/ip_details/index.tsx +++ b/x-pack/plugins/siem/public/network/pages/ip_details/index.tsx @@ -9,29 +9,32 @@ import React, { useCallback, useEffect } from 'react'; import { connect, ConnectedProps } from 'react-redux'; import { StickyContainer } from 'react-sticky'; -import { FiltersGlobal } from '../../../components/filters_global'; -import { HeaderPage } from '../../../components/header_page'; -import { LastEventTime } from '../../../components/last_event_time'; -import { AnomalyTableProvider } from '../../../components/ml/anomaly/anomaly_table_provider'; -import { networkToCriteria } from '../../../components/ml/criteria/network_to_criteria'; -import { scoreIntervalToDateTime } from '../../../components/ml/score/score_interval_to_datetime'; -import { AnomaliesNetworkTable } from '../../../components/ml/tables/anomalies_network_table'; -import { manageQuery } from '../../../components/page/manage_query'; -import { FlowTargetSelectConnected } from '../../../components/page/network/flow_target_select_connected'; -import { IpOverview } from '../../../components/page/network/ip_overview'; -import { SiemSearchBar } from '../../../components/search_bar'; -import { WrapperPage } from '../../../components/wrapper_page'; -import { IpOverviewQuery } from '../../../containers/ip_overview'; -import { indicesExistOrDataTemporarilyUnavailable, WithSource } from '../../../containers/source'; +import { FiltersGlobal } from '../../../common/components/filters_global'; +import { HeaderPage } from '../../../common/components/header_page'; +import { LastEventTime } from '../../../common/components/last_event_time'; +import { AnomalyTableProvider } from '../../../common/components/ml/anomaly/anomaly_table_provider'; +import { networkToCriteria } from '../../../common/components/ml/criteria/network_to_criteria'; +import { scoreIntervalToDateTime } from '../../../common/components/ml/score/score_interval_to_datetime'; +import { AnomaliesNetworkTable } from '../../../common/components/ml/tables/anomalies_network_table'; +import { manageQuery } from '../../../common/components/page/manage_query'; +import { FlowTargetSelectConnected } from '../../components/flow_target_select_connected'; +import { IpOverview } from '../../components/ip_overview'; +import { SiemSearchBar } from '../../../common/components/search_bar'; +import { WrapperPage } from '../../../common/components/wrapper_page'; +import { IpOverviewQuery } from '../../containers/ip_overview'; +import { + indicesExistOrDataTemporarilyUnavailable, + WithSource, +} from '../../../common/containers/source'; import { FlowTargetSourceDest, LastEventIndexKey } from '../../../graphql/types'; -import { useKibana } from '../../../lib/kibana'; -import { decodeIpv6 } from '../../../lib/helpers'; -import { convertToBuildEsQuery } from '../../../lib/keury'; -import { ConditionalFlexGroup } from '../../../pages/network/navigation/conditional_flex_group'; -import { networkModel, State, inputsSelectors } from '../../../store'; -import { setAbsoluteRangeDatePicker as dispatchAbsoluteRangeDatePicker } from '../../../store/inputs/actions'; -import { setIpDetailsTablesActivePageToZero as dispatchIpDetailsTablesActivePageToZero } from '../../../store/network/actions'; -import { SpyRoute } from '../../../utils/route/spy_routes'; +import { useKibana } from '../../../common/lib/kibana'; +import { decodeIpv6 } from '../../../common/lib/helpers'; +import { convertToBuildEsQuery } from '../../../common/lib/keury'; +import { ConditionalFlexGroup } from '../../pages/navigation/conditional_flex_group'; +import { State, inputsSelectors } from '../../../common/store'; +import { setAbsoluteRangeDatePicker as dispatchAbsoluteRangeDatePicker } from '../../../common/store/inputs/actions'; +import { setIpDetailsTablesActivePageToZero as dispatchIpDetailsTablesActivePageToZero } from '../../store/actions'; +import { SpyRoute } from '../../../common/utils/route/spy_routes'; import { NetworkEmptyPage } from '../network_empty_page'; import { NetworkHttpQueryTable } from './network_http_query_table'; import { NetworkTopCountriesQueryTable } from './network_top_countries_query_table'; @@ -39,9 +42,9 @@ import { NetworkTopNFlowQueryTable } from './network_top_n_flow_query_table'; import { TlsQueryTable } from './tls_query_table'; import { IPDetailsComponentProps } from './types'; import { UsersQueryTable } from './users_query_table'; -import { AnomaliesQueryTabBody } from '../../../containers/anomalies/anomalies_query_tab_body'; +import { AnomaliesQueryTabBody } from '../../../common/containers/anomalies/anomalies_query_tab_body'; import { esQuery } from '../../../../../../../src/plugins/data/public'; - +import { networkModel } from '../../store'; export { getBreadcrumbs } from './utils'; const IpOverviewManage = manageQuery(IpOverview); diff --git a/x-pack/plugins/siem/public/pages/network/ip_details/network_http_query_table.tsx b/x-pack/plugins/siem/public/network/pages/ip_details/network_http_query_table.tsx similarity index 86% rename from x-pack/plugins/siem/public/pages/network/ip_details/network_http_query_table.tsx rename to x-pack/plugins/siem/public/network/pages/ip_details/network_http_query_table.tsx index d071cc67414c9..551de698cfa08 100644 --- a/x-pack/plugins/siem/public/pages/network/ip_details/network_http_query_table.tsx +++ b/x-pack/plugins/siem/public/network/pages/ip_details/network_http_query_table.tsx @@ -6,10 +6,10 @@ import React from 'react'; import { getOr } from 'lodash/fp'; -import { manageQuery } from '../../../components/page/manage_query'; +import { manageQuery } from '../../../common/components/page/manage_query'; import { OwnProps } from './types'; -import { NetworkHttpQuery } from '../../../containers/network_http'; -import { NetworkHttpTable } from '../../../components/page/network/network_http_table'; +import { NetworkHttpQuery } from '../../containers/network_http'; +import { NetworkHttpTable } from '../../components/network_http_table'; const NetworkHttpTableManage = manageQuery(NetworkHttpTable); diff --git a/x-pack/plugins/siem/public/pages/network/ip_details/network_top_countries_query_table.tsx b/x-pack/plugins/siem/public/network/pages/ip_details/network_top_countries_query_table.tsx similarity index 86% rename from x-pack/plugins/siem/public/pages/network/ip_details/network_top_countries_query_table.tsx rename to x-pack/plugins/siem/public/network/pages/ip_details/network_top_countries_query_table.tsx index 8f3505009b9a5..6bc80ef1a6aae 100644 --- a/x-pack/plugins/siem/public/pages/network/ip_details/network_top_countries_query_table.tsx +++ b/x-pack/plugins/siem/public/network/pages/ip_details/network_top_countries_query_table.tsx @@ -6,10 +6,10 @@ import React from 'react'; import { getOr } from 'lodash/fp'; -import { manageQuery } from '../../../components/page/manage_query'; +import { manageQuery } from '../../../common/components/page/manage_query'; import { NetworkWithIndexComponentsQueryTableProps } from './types'; -import { NetworkTopCountriesQuery } from '../../../containers/network_top_countries'; -import { NetworkTopCountriesTable } from '../../../components/page/network/network_top_countries_table'; +import { NetworkTopCountriesQuery } from '../../containers/network_top_countries'; +import { NetworkTopCountriesTable } from '../../components/network_top_countries_table'; const NetworkTopCountriesTableManage = manageQuery(NetworkTopCountriesTable); diff --git a/x-pack/plugins/siem/public/pages/network/ip_details/network_top_n_flow_query_table.tsx b/x-pack/plugins/siem/public/network/pages/ip_details/network_top_n_flow_query_table.tsx similarity index 86% rename from x-pack/plugins/siem/public/pages/network/ip_details/network_top_n_flow_query_table.tsx rename to x-pack/plugins/siem/public/network/pages/ip_details/network_top_n_flow_query_table.tsx index 06ae3160415d9..158b4057a7d5e 100644 --- a/x-pack/plugins/siem/public/pages/network/ip_details/network_top_n_flow_query_table.tsx +++ b/x-pack/plugins/siem/public/network/pages/ip_details/network_top_n_flow_query_table.tsx @@ -6,9 +6,9 @@ import { getOr } from 'lodash/fp'; import React from 'react'; -import { manageQuery } from '../../../components/page/manage_query'; -import { NetworkTopNFlowTable } from '../../../components/page/network/network_top_n_flow_table'; -import { NetworkTopNFlowQuery } from '../../../containers/network_top_n_flow'; +import { manageQuery } from '../../../common/components/page/manage_query'; +import { NetworkTopNFlowTable } from '../../components/network_top_n_flow_table'; +import { NetworkTopNFlowQuery } from '../../containers/network_top_n_flow'; import { NetworkWithIndexComponentsQueryTableProps } from './types'; const NetworkTopNFlowTableManage = manageQuery(NetworkTopNFlowTable); diff --git a/x-pack/plugins/siem/public/pages/network/ip_details/tls_query_table.tsx b/x-pack/plugins/siem/public/network/pages/ip_details/tls_query_table.tsx similarity index 87% rename from x-pack/plugins/siem/public/pages/network/ip_details/tls_query_table.tsx rename to x-pack/plugins/siem/public/network/pages/ip_details/tls_query_table.tsx index ad3ffb8cb0a57..f0c3628af78d8 100644 --- a/x-pack/plugins/siem/public/pages/network/ip_details/tls_query_table.tsx +++ b/x-pack/plugins/siem/public/network/pages/ip_details/tls_query_table.tsx @@ -6,9 +6,9 @@ import { getOr } from 'lodash/fp'; import React from 'react'; -import { manageQuery } from '../../../components/page/manage_query'; -import { TlsTable } from '../../../components/page/network/tls_table'; -import { TlsQuery } from '../../../containers/tls'; +import { manageQuery } from '../../../common/components/page/manage_query'; +import { TlsTable } from '../../components/tls_table'; +import { TlsQuery } from '../../containers/tls'; import { TlsQueryTableComponentProps } from './types'; const TlsTableManage = manageQuery(TlsTable); diff --git a/x-pack/plugins/siem/public/pages/network/ip_details/types.ts b/x-pack/plugins/siem/public/network/pages/ip_details/types.ts similarity index 86% rename from x-pack/plugins/siem/public/pages/network/ip_details/types.ts rename to x-pack/plugins/siem/public/network/pages/ip_details/types.ts index 11c41fc74515e..02d83208884b4 100644 --- a/x-pack/plugins/siem/public/pages/network/ip_details/types.ts +++ b/x-pack/plugins/siem/public/network/pages/ip_details/types.ts @@ -7,10 +7,10 @@ import { IIndexPattern } from 'src/plugins/data/public'; import { ESTermQuery } from '../../../../common/typed_json'; -import { NetworkType } from '../../../store/network/model'; -import { InspectQuery, Refetch } from '../../../store/inputs/model'; +import { NetworkType } from '../../store/model'; +import { InspectQuery, Refetch } from '../../../common/store/inputs/model'; import { FlowTarget, FlowTargetSourceDest } from '../../../graphql/types'; -import { GlobalTimeArgs } from '../../../containers/global_time'; +import { GlobalTimeArgs } from '../../../common/containers/global_time'; export const type = NetworkType.details; diff --git a/x-pack/plugins/siem/public/pages/network/ip_details/users_query_table.tsx b/x-pack/plugins/siem/public/network/pages/ip_details/users_query_table.tsx similarity index 87% rename from x-pack/plugins/siem/public/pages/network/ip_details/users_query_table.tsx rename to x-pack/plugins/siem/public/network/pages/ip_details/users_query_table.tsx index d2f6102e86595..4071790b4208a 100644 --- a/x-pack/plugins/siem/public/pages/network/ip_details/users_query_table.tsx +++ b/x-pack/plugins/siem/public/network/pages/ip_details/users_query_table.tsx @@ -6,10 +6,10 @@ import React from 'react'; import { getOr } from 'lodash/fp'; -import { manageQuery } from '../../../components/page/manage_query'; -import { UsersQuery } from '../../../containers/users'; +import { manageQuery } from '../../../common/components/page/manage_query'; +import { UsersQuery } from '../../containers/users'; import { NetworkComponentsQueryProps } from './types'; -import { UsersTable } from '../../../components/page/network/users_table'; +import { UsersTable } from '../../components/users_table'; const UsersTableManage = manageQuery(UsersTable); diff --git a/x-pack/plugins/siem/public/pages/network/ip_details/utils.ts b/x-pack/plugins/siem/public/network/pages/ip_details/utils.ts similarity index 82% rename from x-pack/plugins/siem/public/pages/network/ip_details/utils.ts rename to x-pack/plugins/siem/public/network/pages/ip_details/utils.ts index 9d15d7ee250c9..b1f986f20778f 100644 --- a/x-pack/plugins/siem/public/pages/network/ip_details/utils.ts +++ b/x-pack/plugins/siem/public/network/pages/ip_details/utils.ts @@ -6,13 +6,17 @@ import { get, isEmpty } from 'lodash/fp'; +// eslint-disable-next-line @kbn/eslint/no-restricted-paths import { ChromeBreadcrumb } from '../../../../../../../src/core/public'; -import { decodeIpv6 } from '../../../lib/helpers'; -import { getNetworkUrl, getIPDetailsUrl } from '../../../components/link_to/redirect_to_network'; -import { networkModel } from '../../../store/network'; +import { decodeIpv6 } from '../../../common/lib/helpers'; +import { + getNetworkUrl, + getIPDetailsUrl, +} from '../../../common/components/link_to/redirect_to_network'; +import { networkModel } from '../../store'; import * as i18n from '../translations'; import { NetworkRouteType } from '../navigation/types'; -import { NetworkRouteSpyState } from '../../../utils/route/types'; +import { NetworkRouteSpyState } from '../../../common/utils/route/types'; export const type = networkModel.NetworkType.details; const TabNameMappedToI18nKey: Record = { diff --git a/x-pack/plugins/siem/public/pages/network/navigation/alerts_query_tab_body.tsx b/x-pack/plugins/siem/public/network/pages/navigation/alerts_query_tab_body.tsx similarity index 96% rename from x-pack/plugins/siem/public/pages/network/navigation/alerts_query_tab_body.tsx rename to x-pack/plugins/siem/public/network/pages/navigation/alerts_query_tab_body.tsx index 4c4f6c06ce1e1..c5f59e751ca9a 100644 --- a/x-pack/plugins/siem/public/pages/network/navigation/alerts_query_tab_body.tsx +++ b/x-pack/plugins/siem/public/network/pages/navigation/alerts_query_tab_body.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { Filter } from '../../../../../../../src/plugins/data/common/es_query'; -import { AlertsView } from '../../../components/alerts_viewer'; +import { AlertsView } from '../../../common/components/alerts_viewer'; import { NetworkComponentQueryProps } from './types'; export const filterNetworkData: Filter[] = [ diff --git a/x-pack/plugins/siem/public/pages/network/navigation/conditional_flex_group.tsx b/x-pack/plugins/siem/public/network/pages/navigation/conditional_flex_group.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/network/navigation/conditional_flex_group.tsx rename to x-pack/plugins/siem/public/network/pages/navigation/conditional_flex_group.tsx diff --git a/x-pack/plugins/siem/public/pages/network/navigation/countries_query_tab_body.tsx b/x-pack/plugins/siem/public/network/pages/navigation/countries_query_tab_body.tsx similarity index 85% rename from x-pack/plugins/siem/public/pages/network/navigation/countries_query_tab_body.tsx rename to x-pack/plugins/siem/public/network/pages/navigation/countries_query_tab_body.tsx index 6ddd3bbec3a32..0c569952458e4 100644 --- a/x-pack/plugins/siem/public/pages/network/navigation/countries_query_tab_body.tsx +++ b/x-pack/plugins/siem/public/network/pages/navigation/countries_query_tab_body.tsx @@ -7,10 +7,10 @@ import React from 'react'; import { getOr } from 'lodash/fp'; -import { NetworkTopCountriesTable } from '../../../components/page/network'; -import { NetworkTopCountriesQuery } from '../../../containers/network_top_countries'; -import { networkModel } from '../../../store'; -import { manageQuery } from '../../../components/page/manage_query'; +import { NetworkTopCountriesTable } from '../../components/network_top_countries_table'; +import { NetworkTopCountriesQuery } from '../../containers/network_top_countries'; +import { networkModel } from '../../store'; +import { manageQuery } from '../../../common/components/page/manage_query'; import { IPsQueryTabBodyProps as CountriesQueryTabBodyProps } from './types'; diff --git a/x-pack/plugins/siem/public/pages/network/navigation/dns_query_tab_body.tsx b/x-pack/plugins/siem/public/network/pages/navigation/dns_query_tab_body.tsx similarity index 88% rename from x-pack/plugins/siem/public/pages/network/navigation/dns_query_tab_body.tsx rename to x-pack/plugins/siem/public/network/pages/navigation/dns_query_tab_body.tsx index fe456afcc7189..acabdd1d3608e 100644 --- a/x-pack/plugins/siem/public/pages/network/navigation/dns_query_tab_body.tsx +++ b/x-pack/plugins/siem/public/network/pages/navigation/dns_query_tab_body.tsx @@ -7,19 +7,19 @@ import React, { useEffect, useCallback, useMemo } from 'react'; import { getOr } from 'lodash/fp'; -import { NetworkDnsTable } from '../../../components/page/network/network_dns_table'; -import { NetworkDnsQuery, HISTOGRAM_ID } from '../../../containers/network_dns'; -import { manageQuery } from '../../../components/page/manage_query'; +import { NetworkDnsTable } from '../../components/network_dns_table'; +import { NetworkDnsQuery, HISTOGRAM_ID } from '../../containers/network_dns'; +import { manageQuery } from '../../../common/components/page/manage_query'; import { NetworkComponentQueryProps } from './types'; -import { networkModel } from '../../../store'; +import { networkModel } from '../../store'; import { MatrixHistogramOption, MatrixHisrogramConfigs, -} from '../../../components/matrix_histogram/types'; +} from '../../../common/components/matrix_histogram/types'; import * as i18n from '../translations'; -import { MatrixHistogramContainer } from '../../../components/matrix_histogram'; +import { MatrixHistogramContainer } from '../../../common/components/matrix_histogram'; import { HistogramType } from '../../../graphql/types'; const NetworkDnsTableManage = manageQuery(NetworkDnsTable); diff --git a/x-pack/plugins/siem/public/pages/network/navigation/http_query_tab_body.tsx b/x-pack/plugins/siem/public/network/pages/navigation/http_query_tab_body.tsx similarity index 84% rename from x-pack/plugins/siem/public/pages/network/navigation/http_query_tab_body.tsx rename to x-pack/plugins/siem/public/network/pages/navigation/http_query_tab_body.tsx index 639a14d354ced..7e0c4025d6cac 100644 --- a/x-pack/plugins/siem/public/pages/network/navigation/http_query_tab_body.tsx +++ b/x-pack/plugins/siem/public/network/pages/navigation/http_query_tab_body.tsx @@ -7,10 +7,10 @@ import React from 'react'; import { getOr } from 'lodash/fp'; -import { NetworkHttpTable } from '../../../components/page/network'; -import { NetworkHttpQuery } from '../../../containers/network_http'; -import { networkModel } from '../../../store'; -import { manageQuery } from '../../../components/page/manage_query'; +import { NetworkHttpTable } from '../../components/network_http_table'; +import { NetworkHttpQuery } from '../../containers/network_http'; +import { networkModel } from '../../store'; +import { manageQuery } from '../../../common/components/page/manage_query'; import { HttpQueryTabBodyProps } from './types'; diff --git a/x-pack/plugins/siem/public/pages/network/navigation/index.ts b/x-pack/plugins/siem/public/network/pages/navigation/index.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/network/navigation/index.ts rename to x-pack/plugins/siem/public/network/pages/navigation/index.ts diff --git a/x-pack/plugins/siem/public/pages/network/navigation/ips_query_tab_body.tsx b/x-pack/plugins/siem/public/network/pages/navigation/ips_query_tab_body.tsx similarity index 84% rename from x-pack/plugins/siem/public/pages/network/navigation/ips_query_tab_body.tsx rename to x-pack/plugins/siem/public/network/pages/navigation/ips_query_tab_body.tsx index c4391ba2ec90a..a9f4d504847a0 100644 --- a/x-pack/plugins/siem/public/pages/network/navigation/ips_query_tab_body.tsx +++ b/x-pack/plugins/siem/public/network/pages/navigation/ips_query_tab_body.tsx @@ -7,10 +7,10 @@ import React from 'react'; import { getOr } from 'lodash/fp'; -import { NetworkTopNFlowTable } from '../../../components/page/network'; -import { NetworkTopNFlowQuery } from '../../../containers/network_top_n_flow'; -import { networkModel } from '../../../store'; -import { manageQuery } from '../../../components/page/manage_query'; +import { NetworkTopNFlowTable } from '../../components/network_top_n_flow_table'; +import { NetworkTopNFlowQuery } from '../../containers/network_top_n_flow'; +import { networkModel } from '../../store'; +import { manageQuery } from '../../../common/components/page/manage_query'; import { IPsQueryTabBodyProps } from './types'; diff --git a/x-pack/plugins/siem/public/pages/network/navigation/nav_tabs.tsx b/x-pack/plugins/siem/public/network/pages/navigation/nav_tabs.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/network/navigation/nav_tabs.tsx rename to x-pack/plugins/siem/public/network/pages/navigation/nav_tabs.tsx diff --git a/x-pack/plugins/siem/public/pages/network/navigation/network_routes.tsx b/x-pack/plugins/siem/public/network/pages/navigation/network_routes.tsx similarity index 90% rename from x-pack/plugins/siem/public/pages/network/navigation/network_routes.tsx rename to x-pack/plugins/siem/public/network/pages/navigation/network_routes.tsx index fc8b632f87c59..08ed0d9769be8 100644 --- a/x-pack/plugins/siem/public/pages/network/navigation/network_routes.tsx +++ b/x-pack/plugins/siem/public/network/pages/navigation/network_routes.tsx @@ -9,20 +9,20 @@ import { Route, Switch } from 'react-router-dom'; import { EuiFlexItem, EuiSpacer } from '@elastic/eui'; import { FlowTargetSourceDest } from '../../../graphql/types'; -import { scoreIntervalToDateTime } from '../../../components/ml/score/score_interval_to_datetime'; +import { scoreIntervalToDateTime } from '../../../common/components/ml/score/score_interval_to_datetime'; import { IPsQueryTabBody } from './ips_query_tab_body'; import { CountriesQueryTabBody } from './countries_query_tab_body'; import { HttpQueryTabBody } from './http_query_tab_body'; -import { AnomaliesQueryTabBody } from '../../../containers/anomalies/anomalies_query_tab_body'; -import { AnomaliesNetworkTable } from '../../../components/ml/tables/anomalies_network_table'; +import { AnomaliesQueryTabBody } from '../../../common/containers/anomalies/anomalies_query_tab_body'; +import { AnomaliesNetworkTable } from '../../../common/components/ml/tables/anomalies_network_table'; import { DnsQueryTabBody } from './dns_query_tab_body'; import { ConditionalFlexGroup } from './conditional_flex_group'; import { NetworkRoutesProps, NetworkRouteType } from './types'; import { TlsQueryTabBody } from './tls_query_tab_body'; -import { Anomaly } from '../../../components/ml/types'; +import { Anomaly } from '../../../common/components/ml/types'; import { NetworkAlertsQueryTabBody } from './alerts_query_tab_body'; -import { UpdateDateRange } from '../../../components/charts/common'; +import { UpdateDateRange } from '../../../common/components/charts/common'; export const NetworkRoutes = React.memo( ({ diff --git a/x-pack/plugins/siem/public/pages/network/navigation/network_routes_loading.tsx b/x-pack/plugins/siem/public/network/pages/navigation/network_routes_loading.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/network/navigation/network_routes_loading.tsx rename to x-pack/plugins/siem/public/network/pages/navigation/network_routes_loading.tsx diff --git a/x-pack/plugins/siem/public/pages/network/navigation/tls_query_tab_body.tsx b/x-pack/plugins/siem/public/network/pages/navigation/tls_query_tab_body.tsx similarity index 87% rename from x-pack/plugins/siem/public/pages/network/navigation/tls_query_tab_body.tsx rename to x-pack/plugins/siem/public/network/pages/navigation/tls_query_tab_body.tsx index 0adfec203e0a6..00da5496e5440 100644 --- a/x-pack/plugins/siem/public/pages/network/navigation/tls_query_tab_body.tsx +++ b/x-pack/plugins/siem/public/network/pages/navigation/tls_query_tab_body.tsx @@ -5,9 +5,9 @@ */ import React from 'react'; import { getOr } from 'lodash/fp'; -import { manageQuery } from '../../../components/page/manage_query'; -import { TlsQuery } from '../../../containers/tls'; -import { TlsTable } from '../../../components/page/network/tls_table'; +import { manageQuery } from '../../../common/components/page/manage_query'; +import { TlsQuery } from '../../../network/containers/tls'; +import { TlsTable } from '../../components/tls_table'; import { TlsQueryTabBodyProps } from './types'; const TlsTableManage = manageQuery(TlsTable); diff --git a/x-pack/plugins/siem/public/pages/network/navigation/types.ts b/x-pack/plugins/siem/public/network/pages/navigation/types.ts similarity index 89% rename from x-pack/plugins/siem/public/pages/network/navigation/types.ts rename to x-pack/plugins/siem/public/network/pages/navigation/types.ts index ee03bff99b967..0f48aad57b3a8 100644 --- a/x-pack/plugins/siem/public/pages/network/navigation/types.ts +++ b/x-pack/plugins/siem/public/network/pages/navigation/types.ts @@ -7,13 +7,13 @@ import { ESTermQuery } from '../../../../common/typed_json'; import { IIndexPattern } from '../../../../../../../src/plugins/data/common'; -import { NavTab } from '../../../components/navigation/types'; +import { NavTab } from '../../../common/components/navigation/types'; import { FlowTargetSourceDest } from '../../../graphql/types'; -import { networkModel } from '../../../store'; -import { GlobalTimeArgs } from '../../../containers/global_time'; +import { networkModel } from '../../store'; +import { GlobalTimeArgs } from '../../../common/containers/global_time'; import { SetAbsoluteRangeDatePicker } from '../types'; -import { NarrowDateRange } from '../../../components/ml/types'; +import { NarrowDateRange } from '../../../common/components/ml/types'; interface QueryTabBodyProps extends Pick { skip: boolean; diff --git a/x-pack/plugins/siem/public/pages/network/navigation/utils.ts b/x-pack/plugins/siem/public/network/pages/navigation/utils.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/network/navigation/utils.ts rename to x-pack/plugins/siem/public/network/pages/navigation/utils.ts diff --git a/x-pack/plugins/siem/public/pages/network/network.test.tsx b/x-pack/plugins/siem/public/network/pages/network.test.tsx similarity index 89% rename from x-pack/plugins/siem/public/pages/network/network.test.tsx rename to x-pack/plugins/siem/public/network/pages/network.test.tsx index 300cb83c4ce75..1a8313db92b61 100644 --- a/x-pack/plugins/siem/public/pages/network/network.test.tsx +++ b/x-pack/plugins/siem/public/network/pages/network.test.tsx @@ -10,21 +10,27 @@ import React from 'react'; import { Router } from 'react-router-dom'; import { MockedProvider } from 'react-apollo/test-utils'; -import '../../mock/match_media'; +import '../../common/mock/match_media'; import { Filter } from '../../../../../../src/plugins/data/common/es_query'; -import { mocksSource } from '../../containers/source/mock'; -import { TestProviders, mockGlobalState, apolloClientObservable } from '../../mock'; -import { State, createStore } from '../../store'; -import { inputsActions } from '../../store/inputs'; +import { mocksSource } from '../../common/containers/source/mock'; +import { + TestProviders, + mockGlobalState, + apolloClientObservable, + SUB_PLUGINS_REDUCER, +} from '../../common/mock'; +import { State, createStore } from '../../common/store'; +import { inputsActions } from '../../common/store/inputs'; + import { Network } from './network'; import { NetworkRoutes } from './navigation'; // Test will fail because we will to need to mock some core services to make the test work // For now let's forget about SiemSearchBar and QueryBar -jest.mock('../../components/search_bar', () => ({ +jest.mock('../../common/components/search_bar', () => ({ SiemSearchBar: () => null, })); -jest.mock('../../components/query_bar', () => ({ +jest.mock('../../common/components/query_bar', () => ({ QueryBar: () => null, })); @@ -149,7 +155,7 @@ describe('rendering - rendering', () => { ]; localSource[0].result.data.source.status.indicesExist = true; const myState: State = mockGlobalState; - const myStore = createStore(myState, apolloClientObservable); + const myStore = createStore(myState, SUB_PLUGINS_REDUCER, apolloClientObservable); const wrapper = mount( diff --git a/x-pack/plugins/siem/public/pages/network/network.tsx b/x-pack/plugins/siem/public/network/pages/network.tsx similarity index 83% rename from x-pack/plugins/siem/public/pages/network/network.tsx rename to x-pack/plugins/siem/public/network/pages/network.tsx index 698f51efbb451..2f7a97ed3d19e 100644 --- a/x-pack/plugins/siem/public/pages/network/network.tsx +++ b/x-pack/plugins/siem/public/network/pages/network.tsx @@ -11,24 +11,28 @@ import { useParams } from 'react-router-dom'; import { StickyContainer } from 'react-sticky'; import { esQuery } from '../../../../../../src/plugins/data/public'; -import { UpdateDateRange } from '../../components/charts/common'; -import { EmbeddedMap } from '../../components/embeddables/embedded_map'; -import { FiltersGlobal } from '../../components/filters_global'; -import { HeaderPage } from '../../components/header_page'; -import { LastEventTime } from '../../components/last_event_time'; -import { SiemNavigation } from '../../components/navigation'; -import { manageQuery } from '../../components/page/manage_query'; -import { KpiNetworkComponent } from '../../components/page/network'; -import { SiemSearchBar } from '../../components/search_bar'; -import { WrapperPage } from '../../components/wrapper_page'; -import { KpiNetworkQuery } from '../../containers/kpi_network'; -import { indicesExistOrDataTemporarilyUnavailable, WithSource } from '../../containers/source'; +import { UpdateDateRange } from '../../common/components/charts/common'; +import { EmbeddedMap } from '../components/embeddables/embedded_map'; +import { FiltersGlobal } from '../../common/components/filters_global'; +import { HeaderPage } from '../../common/components/header_page'; +import { LastEventTime } from '../../common/components/last_event_time'; +import { SiemNavigation } from '../../common/components/navigation'; +import { manageQuery } from '../../common/components/page/manage_query'; +import { KpiNetworkComponent } from '..//components/kpi_network'; +import { SiemSearchBar } from '../../common/components/search_bar'; +import { WrapperPage } from '../../common/components/wrapper_page'; +import { KpiNetworkQuery } from '../../network/containers/kpi_network'; +import { + indicesExistOrDataTemporarilyUnavailable, + WithSource, +} from '../../common/containers/source'; import { LastEventIndexKey } from '../../graphql/types'; -import { useKibana } from '../../lib/kibana'; -import { convertToBuildEsQuery } from '../../lib/keury'; -import { networkModel, State, inputsSelectors } from '../../store'; -import { setAbsoluteRangeDatePicker as dispatchSetAbsoluteRangeDatePicker } from '../../store/inputs/actions'; -import { SpyRoute } from '../../utils/route/spy_routes'; +import { useKibana } from '../../common/lib/kibana'; +import { convertToBuildEsQuery } from '../../common/lib/keury'; +import { State, inputsSelectors } from '../../common/store'; +import { setAbsoluteRangeDatePicker as dispatchSetAbsoluteRangeDatePicker } from '../../common/store/inputs/actions'; +import { SpyRoute } from '../../common/utils/route/spy_routes'; +import { networkModel } from '../store'; import { navTabsNetwork, NetworkRoutes, NetworkRoutesLoading } from './navigation'; import { filterNetworkData } from './navigation/alerts_query_tab_body'; import { NetworkEmptyPage } from './network_empty_page'; diff --git a/x-pack/plugins/siem/public/pages/network/network_empty_page.tsx b/x-pack/plugins/siem/public/network/pages/network_empty_page.tsx similarity index 85% rename from x-pack/plugins/siem/public/pages/network/network_empty_page.tsx rename to x-pack/plugins/siem/public/network/pages/network_empty_page.tsx index 22db00400bf8a..0dbcddd5d2872 100644 --- a/x-pack/plugins/siem/public/pages/network/network_empty_page.tsx +++ b/x-pack/plugins/siem/public/network/pages/network_empty_page.tsx @@ -6,9 +6,9 @@ import React from 'react'; -import { useKibana } from '../../lib/kibana'; -import { EmptyPage } from '../../components/empty_page'; -import * as i18n from '../common/translations'; +import { useKibana } from '../../common/lib/kibana'; +import { EmptyPage } from '../../common/components/empty_page'; +import * as i18n from '../../common/translations'; export const NetworkEmptyPage = React.memo(() => { const { http, docLinks } = useKibana().services; diff --git a/x-pack/plugins/siem/public/pages/network/translations.ts b/x-pack/plugins/siem/public/network/pages/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/network/translations.ts rename to x-pack/plugins/siem/public/network/pages/translations.ts diff --git a/x-pack/plugins/siem/public/pages/network/types.ts b/x-pack/plugins/siem/public/network/pages/types.ts similarity index 82% rename from x-pack/plugins/siem/public/pages/network/types.ts rename to x-pack/plugins/siem/public/network/pages/types.ts index 01d3fb6b48c63..e4170ee4b908b 100644 --- a/x-pack/plugins/siem/public/pages/network/types.ts +++ b/x-pack/plugins/siem/public/network/pages/types.ts @@ -6,8 +6,8 @@ import { RouteComponentProps } from 'react-router-dom'; import { ActionCreator } from 'typescript-fsa'; -import { InputsModelId } from '../../store/inputs/constants'; -import { GlobalTimeArgs } from '../../containers/global_time'; +import { InputsModelId } from '../../common/store/inputs/constants'; +import { GlobalTimeArgs } from '../../common/containers/global_time'; export type SetAbsoluteRangeDatePicker = ActionCreator<{ id: InputsModelId; diff --git a/x-pack/plugins/siem/public/network/routes.tsx b/x-pack/plugins/siem/public/network/routes.tsx new file mode 100644 index 0000000000000..6f3fd28ec53b7 --- /dev/null +++ b/x-pack/plugins/siem/public/network/routes.tsx @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { Route } from 'react-router-dom'; + +import { NetworkContainer } from './pages'; +import { SiemPageName } from '../app/types'; + +export const getNetworkRoutes = () => [ + } + />, +]; diff --git a/x-pack/plugins/siem/public/store/network/actions.ts b/x-pack/plugins/siem/public/network/store/actions.ts similarity index 95% rename from x-pack/plugins/siem/public/store/network/actions.ts rename to x-pack/plugins/siem/public/network/store/actions.ts index be7d9b1ad4518..2a9766f959222 100644 --- a/x-pack/plugins/siem/public/store/network/actions.ts +++ b/x-pack/plugins/siem/public/network/store/actions.ts @@ -5,8 +5,7 @@ */ import actionCreatorFactory from 'typescript-fsa'; - -import { networkModel } from '../model'; +import { networkModel } from '.'; const actionCreator = actionCreatorFactory('x-pack/siem/local/network'); diff --git a/x-pack/plugins/siem/public/store/network/helpers.test.ts b/x-pack/plugins/siem/public/network/store/helpers.test.ts similarity index 99% rename from x-pack/plugins/siem/public/store/network/helpers.test.ts rename to x-pack/plugins/siem/public/network/store/helpers.test.ts index 933c2f05a57ba..a3a2a9b7f5393 100644 --- a/x-pack/plugins/siem/public/store/network/helpers.test.ts +++ b/x-pack/plugins/siem/public/network/store/helpers.test.ts @@ -12,7 +12,7 @@ import { TlsFields, UsersFields, } from '../../graphql/types'; -import { DEFAULT_TABLE_LIMIT } from '../constants'; +import { DEFAULT_TABLE_LIMIT } from '../../common/store/constants'; import { NetworkModel, NetworkTableType, IpDetailsTableType, NetworkType } from './model'; import { setNetworkQueriesActivePageToZero } from './helpers'; diff --git a/x-pack/plugins/siem/public/store/network/helpers.ts b/x-pack/plugins/siem/public/network/store/helpers.ts similarity index 97% rename from x-pack/plugins/siem/public/store/network/helpers.ts rename to x-pack/plugins/siem/public/network/store/helpers.ts index 0b3a5e65346b8..938de1dedf0b7 100644 --- a/x-pack/plugins/siem/public/store/network/helpers.ts +++ b/x-pack/plugins/siem/public/network/store/helpers.ts @@ -12,7 +12,7 @@ import { NetworkQueries, IpOverviewQueries, } from './model'; -import { DEFAULT_TABLE_ACTIVE_PAGE } from '../constants'; +import { DEFAULT_TABLE_ACTIVE_PAGE } from '../../common/store/constants'; export const setNetworkPageQueriesActivePageToZero = (state: NetworkModel): NetworkQueries => ({ ...state.page.queries, diff --git a/x-pack/plugins/siem/public/store/network/index.ts b/x-pack/plugins/siem/public/network/store/index.ts similarity index 64% rename from x-pack/plugins/siem/public/store/network/index.ts rename to x-pack/plugins/siem/public/network/store/index.ts index dcd32fe17ac97..85268509ae9c5 100644 --- a/x-pack/plugins/siem/public/store/network/index.ts +++ b/x-pack/plugins/siem/public/network/store/index.ts @@ -4,9 +4,19 @@ * you may not use this file except in compliance with the Elastic License. */ +import { Reducer, AnyAction } from 'redux'; import * as networkActions from './actions'; import * as networkModel from './model'; import * as networkSelectors from './selectors'; +import { NetworkState } from './reducer'; export { networkActions, networkModel, networkSelectors }; export * from './reducer'; + +export interface NetworkPluginState { + network: NetworkState; +} + +export interface NetworkPluginReducer { + network: Reducer; +} diff --git a/x-pack/plugins/siem/public/store/network/model.ts b/x-pack/plugins/siem/public/network/store/model.ts similarity index 100% rename from x-pack/plugins/siem/public/store/network/model.ts rename to x-pack/plugins/siem/public/network/store/model.ts diff --git a/x-pack/plugins/siem/public/store/network/reducer.ts b/x-pack/plugins/siem/public/network/store/reducer.ts similarity index 99% rename from x-pack/plugins/siem/public/store/network/reducer.ts rename to x-pack/plugins/siem/public/network/store/reducer.ts index e6d7efc9cbb5f..26458229da296 100644 --- a/x-pack/plugins/siem/public/store/network/reducer.ts +++ b/x-pack/plugins/siem/public/network/store/reducer.ts @@ -14,7 +14,7 @@ import { TlsFields, UsersFields, } from '../../graphql/types'; -import { DEFAULT_TABLE_ACTIVE_PAGE, DEFAULT_TABLE_LIMIT } from '../constants'; +import { DEFAULT_TABLE_ACTIVE_PAGE, DEFAULT_TABLE_LIMIT } from '../../common/store/constants'; import { setIpDetailsTablesActivePageToZero, diff --git a/x-pack/plugins/siem/public/store/network/selectors.ts b/x-pack/plugins/siem/public/network/store/selectors.ts similarity index 98% rename from x-pack/plugins/siem/public/store/network/selectors.ts rename to x-pack/plugins/siem/public/network/store/selectors.ts index 273eaf7c0ee7f..0b48fa2170535 100644 --- a/x-pack/plugins/siem/public/store/network/selectors.ts +++ b/x-pack/plugins/siem/public/network/store/selectors.ts @@ -8,7 +8,7 @@ import { createSelector } from 'reselect'; import { get } from 'lodash/fp'; import { FlowTargetSourceDest } from '../../graphql/types'; -import { State } from '../reducer'; +import { State } from '../../common/store/reducer'; import { initialNetworkState } from './reducer'; import { IpDetailsTableType, diff --git a/x-pack/plugins/siem/public/pages/overview/alerts_by_category/index.test.tsx b/x-pack/plugins/siem/public/overview/components/alerts_by_category/index.test.tsx similarity index 92% rename from x-pack/plugins/siem/public/pages/overview/alerts_by_category/index.test.tsx rename to x-pack/plugins/siem/public/overview/components/alerts_by_category/index.test.tsx index bd9743bdccb4b..c032b21f73290 100644 --- a/x-pack/plugins/siem/public/pages/overview/alerts_by_category/index.test.tsx +++ b/x-pack/plugins/siem/public/overview/components/alerts_by_category/index.test.tsx @@ -11,15 +11,15 @@ import { mount, ReactWrapper } from 'enzyme'; import React from 'react'; import { ThemeProvider } from 'styled-components'; -import { useQuery } from '../../../containers/matrix_histogram'; -import { wait } from '../../../lib/helpers'; -import { mockIndexPattern, TestProviders } from '../../../mock'; +import { useQuery } from '../../../common/containers/matrix_histogram'; +import { wait } from '../../../common/lib/helpers'; +import { mockIndexPattern, TestProviders } from '../../../common/mock'; import { AlertsByCategory } from '.'; -jest.mock('../../../lib/kibana'); +jest.mock('../../../common/lib/kibana'); -jest.mock('../../../containers/matrix_histogram', () => { +jest.mock('../../../common/containers/matrix_histogram', () => { return { useQuery: jest.fn(), }; diff --git a/x-pack/plugins/siem/public/pages/overview/alerts_by_category/index.tsx b/x-pack/plugins/siem/public/overview/components/alerts_by_category/index.tsx similarity index 76% rename from x-pack/plugins/siem/public/pages/overview/alerts_by_category/index.tsx rename to x-pack/plugins/siem/public/overview/components/alerts_by_category/index.tsx index a1936cf9221f8..92f55aa1aa36d 100644 --- a/x-pack/plugins/siem/public/pages/overview/alerts_by_category/index.tsx +++ b/x-pack/plugins/siem/public/overview/components/alerts_by_category/index.tsx @@ -10,28 +10,28 @@ import React, { useEffect, useMemo } from 'react'; import { Position } from '@elastic/charts'; import { DEFAULT_NUMBER_FORMAT } from '../../../../common/constants'; -import { SHOWING, UNIT } from '../../../components/alerts_viewer/translations'; -import { getDetectionEngineAlertUrl } from '../../../components/link_to/redirect_to_detection_engine'; -import { MatrixHistogramContainer } from '../../../components/matrix_histogram'; -import { useKibana, useUiSetting$ } from '../../../lib/kibana'; -import { convertToBuildEsQuery } from '../../../lib/keury'; +import { SHOWING, UNIT } from '../../../common/components/alerts_viewer/translations'; +import { getDetectionEngineAlertUrl } from '../../../common/components/link_to/redirect_to_detection_engine'; +import { MatrixHistogramContainer } from '../../../common/components/matrix_histogram'; +import { useKibana, useUiSetting$ } from '../../../common/lib/kibana'; +import { convertToBuildEsQuery } from '../../../common/lib/keury'; import { Filter, esQuery, IIndexPattern, Query, } from '../../../../../../../src/plugins/data/public'; -import { inputsModel } from '../../../store'; -import { HostsType } from '../../../store/hosts/model'; +import { inputsModel } from '../../../common/store'; +import { HostsType } from '../../../hosts/store/model'; -import * as i18n from '../translations'; +import * as i18n from '../../pages/translations'; import { alertsStackByOptions, histogramConfigs, -} from '../../../components/alerts_viewer/histogram_configs'; -import { MatrixHisrogramConfigs } from '../../../components/matrix_histogram/types'; -import { useGetUrlSearch } from '../../../components/navigation/use_get_url_search'; -import { navTabs } from '../../home/home_navigations'; +} from '../../../common/components/alerts_viewer/histogram_configs'; +import { MatrixHisrogramConfigs } from '../../../common/components/matrix_histogram/types'; +import { useGetUrlSearch } from '../../../common/components/navigation/use_get_url_search'; +import { navTabs } from '../../../app/home/home_navigations'; const ID = 'alertsByCategoryOverview'; diff --git a/x-pack/plugins/siem/public/pages/overview/event_counts/index.test.tsx b/x-pack/plugins/siem/public/overview/components/event_counts/index.test.tsx similarity index 87% rename from x-pack/plugins/siem/public/pages/overview/event_counts/index.test.tsx rename to x-pack/plugins/siem/public/overview/components/event_counts/index.test.tsx index f5419a3ff50e9..628cd28979083 100644 --- a/x-pack/plugins/siem/public/pages/overview/event_counts/index.test.tsx +++ b/x-pack/plugins/siem/public/overview/components/event_counts/index.test.tsx @@ -7,9 +7,9 @@ import { mount } from 'enzyme'; import React from 'react'; -import { OverviewHostProps } from '../../../components/page/overview/overview_host'; -import { OverviewNetworkProps } from '../../../components/page/overview/overview_network'; -import { mockIndexPattern, TestProviders } from '../../../mock'; +import { OverviewHostProps } from '../overview_host'; +import { OverviewNetworkProps } from '../overview_network'; +import { mockIndexPattern, TestProviders } from '../../../common/mock'; import { EventCounts } from '.'; diff --git a/x-pack/plugins/siem/public/pages/overview/event_counts/index.tsx b/x-pack/plugins/siem/public/overview/components/event_counts/index.tsx similarity index 81% rename from x-pack/plugins/siem/public/pages/overview/event_counts/index.tsx rename to x-pack/plugins/siem/public/overview/components/event_counts/index.tsx index f242b0d84d7c1..1773af86a382f 100644 --- a/x-pack/plugins/siem/public/pages/overview/event_counts/index.tsx +++ b/x-pack/plugins/siem/public/overview/components/event_counts/index.tsx @@ -8,19 +8,19 @@ import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import React from 'react'; import styled from 'styled-components'; -import { OverviewHost } from '../../../components/page/overview/overview_host'; -import { OverviewNetwork } from '../../../components/page/overview/overview_network'; -import { filterHostData } from '../../hosts/navigation/alerts_query_tab_body'; -import { useKibana } from '../../../lib/kibana'; -import { convertToBuildEsQuery } from '../../../lib/keury'; -import { filterNetworkData } from '../../network/navigation/alerts_query_tab_body'; +import { OverviewHost } from '../overview_host'; +import { OverviewNetwork } from '../overview_network'; +import { filterHostData } from '../../../hosts/pages/navigation/alerts_query_tab_body'; +import { useKibana } from '../../../common/lib/kibana'; +import { convertToBuildEsQuery } from '../../../common/lib/keury'; +import { filterNetworkData } from '../../../network/pages/navigation/alerts_query_tab_body'; import { Filter, esQuery, IIndexPattern, Query, } from '../../../../../../../src/plugins/data/public'; -import { inputsModel } from '../../../store'; +import { inputsModel } from '../../../common/store'; const HorizontalSpacer = styled(EuiFlexItem)` width: 24px; diff --git a/x-pack/plugins/siem/public/pages/overview/events_by_dataset/__mocks__/index.tsx b/x-pack/plugins/siem/public/overview/components/events_by_dataset/__mocks__/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/overview/events_by_dataset/__mocks__/index.tsx rename to x-pack/plugins/siem/public/overview/components/events_by_dataset/__mocks__/index.tsx diff --git a/x-pack/plugins/siem/public/pages/overview/events_by_dataset/index.tsx b/x-pack/plugins/siem/public/overview/components/events_by_dataset/index.tsx similarity index 82% rename from x-pack/plugins/siem/public/pages/overview/events_by_dataset/index.tsx rename to x-pack/plugins/siem/public/overview/components/events_by_dataset/index.tsx index 77d6da7a7efc4..ebd005e7cb0b3 100644 --- a/x-pack/plugins/siem/public/pages/overview/events_by_dataset/index.tsx +++ b/x-pack/plugins/siem/public/overview/components/events_by_dataset/index.tsx @@ -11,30 +11,30 @@ import React, { useEffect, useMemo } from 'react'; import uuid from 'uuid'; import { DEFAULT_NUMBER_FORMAT } from '../../../../common/constants'; -import { SHOWING, UNIT } from '../../../components/events_viewer/translations'; -import { getTabsOnHostsUrl } from '../../../components/link_to/redirect_to_hosts'; -import { MatrixHistogramContainer } from '../../../components/matrix_histogram'; +import { SHOWING, UNIT } from '../../../common/components/events_viewer/translations'; +import { getTabsOnHostsUrl } from '../../../common/components/link_to/redirect_to_hosts'; +import { MatrixHistogramContainer } from '../../../common/components/matrix_histogram'; import { MatrixHisrogramConfigs, MatrixHistogramOption, -} from '../../../components/matrix_histogram/types'; -import { useGetUrlSearch } from '../../../components/navigation/use_get_url_search'; -import { navTabs } from '../../home/home_navigations'; -import { eventsStackByOptions } from '../../hosts/navigation'; -import { convertToBuildEsQuery } from '../../../lib/keury'; -import { useKibana, useUiSetting$ } from '../../../lib/kibana'; -import { histogramConfigs } from '../../../pages/hosts/navigation/events_query_tab_body'; +} from '../../../common/components/matrix_histogram/types'; +import { useGetUrlSearch } from '../../../common/components/navigation/use_get_url_search'; +import { navTabs } from '../../../app/home/home_navigations'; +import { eventsStackByOptions } from '../../../hosts/pages/navigation'; +import { convertToBuildEsQuery } from '../../../common/lib/keury'; +import { useKibana, useUiSetting$ } from '../../../common/lib/kibana'; +import { histogramConfigs } from '../../../hosts/pages/navigation/events_query_tab_body'; import { Filter, esQuery, IIndexPattern, Query, } from '../../../../../../../src/plugins/data/public'; -import { inputsModel } from '../../../store'; -import { HostsTableType, HostsType } from '../../../store/hosts/model'; -import { InputsModelId } from '../../../store/inputs/constants'; +import { inputsModel } from '../../../common/store'; +import { HostsTableType, HostsType } from '../../../hosts/store/model'; +import { InputsModelId } from '../../../common/store/inputs/constants'; -import * as i18n from '../translations'; +import * as i18n from '../../pages/translations'; const NO_FILTERS: Filter[] = []; const DEFAULT_QUERY: Query = { query: '', language: 'kuery' }; diff --git a/x-pack/plugins/siem/public/components/page/hosts/host_overview/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/overview/components/host_overview/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/page/hosts/host_overview/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/overview/components/host_overview/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/page/hosts/host_overview/index.test.tsx b/x-pack/plugins/siem/public/overview/components/host_overview/index.test.tsx similarity index 89% rename from x-pack/plugins/siem/public/components/page/hosts/host_overview/index.test.tsx rename to x-pack/plugins/siem/public/overview/components/host_overview/index.test.tsx index 90cfe696610d9..56c232158ac02 100644 --- a/x-pack/plugins/siem/public/components/page/hosts/host_overview/index.test.tsx +++ b/x-pack/plugins/siem/public/overview/components/host_overview/index.test.tsx @@ -6,11 +6,11 @@ import { shallow } from 'enzyme'; import React from 'react'; -import { TestProviders } from '../../../../mock'; +import { TestProviders } from '../../../common/mock'; import { HostOverview } from './index'; import { mockData } from './mock'; -import { mockAnomalies } from '../../../ml/mock'; +import { mockAnomalies } from '../../../common/components/ml/mock'; describe('Host Summary Component', () => { describe('rendering', () => { diff --git a/x-pack/plugins/siem/public/components/page/hosts/host_overview/index.tsx b/x-pack/plugins/siem/public/overview/components/host_overview/index.tsx similarity index 81% rename from x-pack/plugins/siem/public/components/page/hosts/host_overview/index.tsx rename to x-pack/plugins/siem/public/overview/components/host_overview/index.tsx index 223a16fec77a0..4440147c35f2f 100644 --- a/x-pack/plugins/siem/public/components/page/hosts/host_overview/index.tsx +++ b/x-pack/plugins/siem/public/overview/components/host_overview/index.tsx @@ -10,21 +10,27 @@ import lightTheme from '@elastic/eui/dist/eui_theme_light.json'; import { getOr } from 'lodash/fp'; import React from 'react'; -import { DEFAULT_DARK_MODE } from '../../../../../common/constants'; -import { DescriptionList } from '../../../../../common/utility_types'; -import { useUiSetting$ } from '../../../../lib/kibana'; -import { getEmptyTagValue } from '../../../empty_value'; -import { DefaultFieldRenderer, hostIdRenderer } from '../../../field_renderers/field_renderers'; -import { InspectButton, InspectButtonContainer } from '../../../inspect'; -import { HostItem } from '../../../../graphql/types'; -import { Loader } from '../../../loader'; -import { IPDetailsLink } from '../../../links'; -import { hasMlUserPermissions } from '../../../../../common/machine_learning/has_ml_user_permissions'; -import { useMlCapabilities } from '../../../ml_popover/hooks/use_ml_capabilities'; -import { AnomalyScores } from '../../../ml/score/anomaly_scores'; -import { Anomalies, NarrowDateRange } from '../../../ml/types'; -import { DescriptionListStyled, OverviewWrapper } from '../../index'; -import { FirstLastSeenHost, FirstLastSeenHostType } from '../first_last_seen_host'; +import { DEFAULT_DARK_MODE } from '../../../../common/constants'; +import { DescriptionList } from '../../../../common/utility_types'; +import { useUiSetting$ } from '../../../common/lib/kibana'; +import { getEmptyTagValue } from '../../../common/components/empty_value'; +import { + DefaultFieldRenderer, + hostIdRenderer, +} from '../../../timelines/components/field_renderers/field_renderers'; +import { InspectButton, InspectButtonContainer } from '../../../common/components/inspect'; +import { HostItem } from '../../../graphql/types'; +import { Loader } from '../../../common/components/loader'; +import { IPDetailsLink } from '../../../common/components/links'; +import { hasMlUserPermissions } from '../../../../common/machine_learning/has_ml_user_permissions'; +import { useMlCapabilities } from '../../../common/components/ml_popover/hooks/use_ml_capabilities'; +import { AnomalyScores } from '../../../common/components/ml/score/anomaly_scores'; +import { Anomalies, NarrowDateRange } from '../../../common/components/ml/types'; +import { DescriptionListStyled, OverviewWrapper } from '../../../common/components/page'; +import { + FirstLastSeenHost, + FirstLastSeenHostType, +} from '../../../hosts/components/first_last_seen_host'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/components/page/hosts/host_overview/mock.ts b/x-pack/plugins/siem/public/overview/components/host_overview/mock.ts similarity index 96% rename from x-pack/plugins/siem/public/components/page/hosts/host_overview/mock.ts rename to x-pack/plugins/siem/public/overview/components/host_overview/mock.ts index d9a93272c0986..c24cb20e9087c 100644 --- a/x-pack/plugins/siem/public/components/page/hosts/host_overview/mock.ts +++ b/x-pack/plugins/siem/public/overview/components/host_overview/mock.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { HostsData } from '../../../../graphql/types'; +import { HostsData } from '../../../graphql/types'; export const mockData: { Hosts: HostsData; DateFields: string[] } = { Hosts: { diff --git a/x-pack/plugins/siem/public/components/page/hosts/host_overview/translations.ts b/x-pack/plugins/siem/public/overview/components/host_overview/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/page/hosts/host_overview/translations.ts rename to x-pack/plugins/siem/public/overview/components/host_overview/translations.ts diff --git a/x-pack/plugins/siem/public/components/page/overview/loading_placeholders/index.tsx b/x-pack/plugins/siem/public/overview/components/loading_placeholders/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/page/overview/loading_placeholders/index.tsx rename to x-pack/plugins/siem/public/overview/components/loading_placeholders/index.tsx diff --git a/x-pack/plugins/siem/public/pages/overview/overview_empty/index.tsx b/x-pack/plugins/siem/public/overview/components/overview_empty/index.tsx similarity index 85% rename from x-pack/plugins/siem/public/pages/overview/overview_empty/index.tsx rename to x-pack/plugins/siem/public/overview/components/overview_empty/index.tsx index 1325826f172c7..85a8988202774 100644 --- a/x-pack/plugins/siem/public/pages/overview/overview_empty/index.tsx +++ b/x-pack/plugins/siem/public/overview/components/overview_empty/index.tsx @@ -6,9 +6,9 @@ import React from 'react'; -import * as i18nCommon from '../../common/translations'; -import { EmptyPage } from '../../../components/empty_page'; -import { useKibana } from '../../../lib/kibana'; +import * as i18nCommon from '../../../common/translations'; +import { EmptyPage } from '../../../common/components/empty_page'; +import { useKibana } from '../../../common/lib/kibana'; const OverviewEmptyComponent: React.FC = () => { const { http, docLinks } = useKibana().services; diff --git a/x-pack/plugins/siem/public/components/page/overview/overview_host/index.test.tsx b/x-pack/plugins/siem/public/overview/components/overview_host/index.test.tsx similarity index 85% rename from x-pack/plugins/siem/public/components/page/overview/overview_host/index.test.tsx rename to x-pack/plugins/siem/public/overview/components/overview_host/index.test.tsx index 568cf032fb01c..137f5d1dc245d 100644 --- a/x-pack/plugins/siem/public/components/page/overview/overview_host/index.test.tsx +++ b/x-pack/plugins/siem/public/overview/components/overview_host/index.test.tsx @@ -7,17 +7,23 @@ import { cloneDeep } from 'lodash/fp'; import { mount } from 'enzyme'; import React from 'react'; +import { MockedProvider } from 'react-apollo/test-utils'; -import { apolloClientObservable, mockGlobalState, TestProviders } from '../../../../mock'; +import { + apolloClientObservable, + mockGlobalState, + TestProviders, + SUB_PLUGINS_REDUCER, +} from '../../../common/mock'; import { OverviewHost } from '.'; -import { createStore, State } from '../../../../store'; -import { overviewHostQuery } from '../../../../containers/overview/overview_host/index.gql_query'; -import { GetOverviewHostQuery } from '../../../../graphql/types'; -import { MockedProvider } from 'react-apollo/test-utils'; -import { wait } from '../../../../lib/helpers'; +import { createStore, State } from '../../../common/store'; +import { overviewHostQuery } from '../../containers/overview_host/index.gql_query'; +import { GetOverviewHostQuery } from '../../../graphql/types'; + +import { wait } from '../../../common/lib/helpers'; -jest.mock('../../../../lib/kibana'); +jest.mock('../../../common/lib/kibana'); const startDate = 1579553397080; const endDate = 1579639797080; @@ -86,11 +92,11 @@ const mockOpenTimelineQueryResults: MockedProvidedQuery[] = [ describe('OverviewHost', () => { const state: State = mockGlobalState; - let store = createStore(state, apolloClientObservable); + let store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); beforeEach(() => { const myState = cloneDeep(state); - store = createStore(myState, apolloClientObservable); + store = createStore(myState, SUB_PLUGINS_REDUCER, apolloClientObservable); }); test('it renders the expected widget title', () => { diff --git a/x-pack/plugins/siem/public/components/page/overview/overview_host/index.tsx b/x-pack/plugins/siem/public/overview/components/overview_host/index.tsx similarity index 82% rename from x-pack/plugins/siem/public/components/page/overview/overview_host/index.tsx rename to x-pack/plugins/siem/public/overview/components/overview_host/index.tsx index 52c142ceff480..111c128293194 100644 --- a/x-pack/plugins/siem/public/components/page/overview/overview_host/index.tsx +++ b/x-pack/plugins/siem/public/overview/components/overview_host/index.tsx @@ -10,21 +10,18 @@ import numeral from '@elastic/numeral'; import { FormattedMessage } from '@kbn/i18n/react'; import React, { useMemo } from 'react'; -import { DEFAULT_NUMBER_FORMAT } from '../../../../../common/constants'; -import { ESQuery } from '../../../../../common/typed_json'; -import { - ID as OverviewHostQueryId, - OverviewHostQuery, -} from '../../../../containers/overview/overview_host'; -import { HeaderSection } from '../../../header_section'; -import { useUiSetting$ } from '../../../../lib/kibana'; -import { getHostsUrl } from '../../../link_to'; +import { DEFAULT_NUMBER_FORMAT } from '../../../../common/constants'; +import { ESQuery } from '../../../../common/typed_json'; +import { ID as OverviewHostQueryId, OverviewHostQuery } from '../../containers/overview_host'; +import { HeaderSection } from '../../../common/components/header_section'; +import { useUiSetting$ } from '../../../common/lib/kibana'; +import { getHostsUrl } from '../../../common/components/link_to'; import { getOverviewHostStats, OverviewHostStats } from '../overview_host_stats'; -import { manageQuery } from '../../../page/manage_query'; -import { inputsModel } from '../../../../store/inputs'; -import { InspectButtonContainer } from '../../../inspect'; -import { useGetUrlSearch } from '../../../navigation/use_get_url_search'; -import { navTabs } from '../../../../pages/home/home_navigations'; +import { manageQuery } from '../../../common/components/page/manage_query'; +import { inputsModel } from '../../../common/store/inputs'; +import { InspectButtonContainer } from '../../../common/components/inspect'; +import { useGetUrlSearch } from '../../../common/components/navigation/use_get_url_search'; +import { navTabs } from '../../../app/home/home_navigations'; export interface OwnProps { startDate: number; diff --git a/x-pack/plugins/siem/public/components/page/overview/overview_host_stats/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/overview/components/overview_host_stats/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/page/overview/overview_host_stats/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/overview/components/overview_host_stats/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/page/overview/overview_host_stats/index.test.tsx b/x-pack/plugins/siem/public/overview/components/overview_host_stats/index.test.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/page/overview/overview_host_stats/index.test.tsx rename to x-pack/plugins/siem/public/overview/components/overview_host_stats/index.test.tsx index 4240ea441284c..fcbe0c5272dae 100644 --- a/x-pack/plugins/siem/public/components/page/overview/overview_host_stats/index.test.tsx +++ b/x-pack/plugins/siem/public/overview/components/overview_host_stats/index.test.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { OverviewHostStats } from '.'; import { mockData } from './mock'; -import { TestProviders } from '../../../../mock/test_providers'; +import { TestProviders } from '../../../common/mock/test_providers'; describe('Overview Host Stat Data', () => { describe('rendering', () => { diff --git a/x-pack/plugins/siem/public/components/page/overview/overview_host_stats/index.tsx b/x-pack/plugins/siem/public/overview/components/overview_host_stats/index.tsx similarity index 99% rename from x-pack/plugins/siem/public/components/page/overview/overview_host_stats/index.tsx rename to x-pack/plugins/siem/public/overview/components/overview_host_stats/index.tsx index 4756e4c826574..ab2e12f2110b8 100644 --- a/x-pack/plugins/siem/public/components/page/overview/overview_host_stats/index.tsx +++ b/x-pack/plugins/siem/public/overview/components/overview_host_stats/index.tsx @@ -9,7 +9,7 @@ import { FormattedMessage } from '@kbn/i18n/react'; import React from 'react'; import styled from 'styled-components'; -import { OverviewHostData } from '../../../../graphql/types'; +import { OverviewHostData } from '../../../graphql/types'; import { FormattedStat, StatGroup } from '../types'; import { StatValue } from '../stat_value'; diff --git a/x-pack/plugins/siem/public/components/page/overview/overview_host_stats/mock.ts b/x-pack/plugins/siem/public/overview/components/overview_host_stats/mock.ts similarity index 92% rename from x-pack/plugins/siem/public/components/page/overview/overview_host_stats/mock.ts rename to x-pack/plugins/siem/public/overview/components/overview_host_stats/mock.ts index 60e653caab8c1..63b3a484c1eaa 100644 --- a/x-pack/plugins/siem/public/components/page/overview/overview_host_stats/mock.ts +++ b/x-pack/plugins/siem/public/overview/components/overview_host_stats/mock.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { OverviewHostData } from '../../../../graphql/types'; +import { OverviewHostData } from '../../../graphql/types'; export const mockData: { OverviewHost: OverviewHostData } = { OverviewHost: { diff --git a/x-pack/plugins/siem/public/components/page/overview/overview_network/index.test.tsx b/x-pack/plugins/siem/public/overview/components/overview_network/index.test.tsx similarity index 84% rename from x-pack/plugins/siem/public/components/page/overview/overview_network/index.test.tsx rename to x-pack/plugins/siem/public/overview/components/overview_network/index.test.tsx index 151bb444cfe75..e28681a3320f5 100644 --- a/x-pack/plugins/siem/public/components/page/overview/overview_network/index.test.tsx +++ b/x-pack/plugins/siem/public/overview/components/overview_network/index.test.tsx @@ -7,17 +7,21 @@ import { cloneDeep } from 'lodash/fp'; import { mount } from 'enzyme'; import React from 'react'; - -import { apolloClientObservable, mockGlobalState, TestProviders } from '../../../../mock'; +import { MockedProvider } from 'react-apollo/test-utils'; +import { + apolloClientObservable, + mockGlobalState, + TestProviders, + SUB_PLUGINS_REDUCER, +} from '../../../common/mock'; import { OverviewNetwork } from '.'; -import { createStore, State } from '../../../../store'; -import { overviewNetworkQuery } from '../../../../containers/overview/overview_network/index.gql_query'; -import { GetOverviewHostQuery } from '../../../../graphql/types'; -import { MockedProvider } from 'react-apollo/test-utils'; -import { wait } from '../../../../lib/helpers'; +import { createStore, State } from '../../../common/store'; +import { overviewNetworkQuery } from '../../containers/overview_network/index.gql_query'; +import { GetOverviewHostQuery } from '../../../graphql/types'; +import { wait } from '../../../common/lib/helpers'; -jest.mock('../../../../lib/kibana'); +jest.mock('../../../common/lib/kibana'); const startDate = 1579553397080; const endDate = 1579639797080; @@ -79,11 +83,11 @@ const mockOpenTimelineQueryResults: MockedProvidedQuery[] = [ describe('OverviewNetwork', () => { const state: State = mockGlobalState; - let store = createStore(state, apolloClientObservable); + let store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); beforeEach(() => { const myState = cloneDeep(state); - store = createStore(myState, apolloClientObservable); + store = createStore(myState, SUB_PLUGINS_REDUCER, apolloClientObservable); }); test('it renders the expected widget title', () => { diff --git a/x-pack/plugins/siem/public/components/page/overview/overview_network/index.tsx b/x-pack/plugins/siem/public/overview/components/overview_network/index.tsx similarity index 84% rename from x-pack/plugins/siem/public/components/page/overview/overview_network/index.tsx rename to x-pack/plugins/siem/public/overview/components/overview_network/index.tsx index d649a0dd9e923..cd70831fddfba 100644 --- a/x-pack/plugins/siem/public/components/page/overview/overview_network/index.tsx +++ b/x-pack/plugins/siem/public/overview/components/overview_network/index.tsx @@ -10,21 +10,21 @@ import numeral from '@elastic/numeral'; import { FormattedMessage } from '@kbn/i18n/react'; import React, { useMemo } from 'react'; -import { DEFAULT_NUMBER_FORMAT } from '../../../../../common/constants'; -import { ESQuery } from '../../../../../common/typed_json'; -import { HeaderSection } from '../../../header_section'; -import { useUiSetting$ } from '../../../../lib/kibana'; -import { manageQuery } from '../../../page/manage_query'; +import { DEFAULT_NUMBER_FORMAT } from '../../../../common/constants'; +import { ESQuery } from '../../../../common/typed_json'; +import { HeaderSection } from '../../../common/components/header_section'; +import { useUiSetting$ } from '../../../common/lib/kibana'; +import { manageQuery } from '../../../common/components/page/manage_query'; import { ID as OverviewNetworkQueryId, OverviewNetworkQuery, -} from '../../../../containers/overview/overview_network'; -import { inputsModel } from '../../../../store/inputs'; +} from '../../containers/overview_network'; +import { inputsModel } from '../../../common/store/inputs'; import { getOverviewNetworkStats, OverviewNetworkStats } from '../overview_network_stats'; -import { getNetworkUrl } from '../../../link_to'; -import { InspectButtonContainer } from '../../../inspect'; -import { useGetUrlSearch } from '../../../navigation/use_get_url_search'; -import { navTabs } from '../../../../pages/home/home_navigations'; +import { getNetworkUrl } from '../../../common/components/link_to'; +import { InspectButtonContainer } from '../../../common/components/inspect'; +import { useGetUrlSearch } from '../../../common/components/navigation/use_get_url_search'; +import { navTabs } from '../../../app/home/home_navigations'; export interface OverviewNetworkProps { startDate: number; diff --git a/x-pack/plugins/siem/public/components/page/overview/overview_network_stats/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/overview/components/overview_network_stats/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/page/overview/overview_network_stats/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/overview/components/overview_network_stats/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/page/overview/overview_network_stats/index.test.tsx b/x-pack/plugins/siem/public/overview/components/overview_network_stats/index.test.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/page/overview/overview_network_stats/index.test.tsx rename to x-pack/plugins/siem/public/overview/components/overview_network_stats/index.test.tsx index cf1a7d20b73ec..bff6ee7d7469d 100644 --- a/x-pack/plugins/siem/public/components/page/overview/overview_network_stats/index.test.tsx +++ b/x-pack/plugins/siem/public/overview/components/overview_network_stats/index.test.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { OverviewNetworkStats } from '.'; import { mockData } from './mock'; -import { TestProviders } from '../../../../mock/test_providers'; +import { TestProviders } from '../../../common/mock/test_providers'; describe('Overview Network Stat Data', () => { describe('rendering', () => { diff --git a/x-pack/plugins/siem/public/components/page/overview/overview_network_stats/index.tsx b/x-pack/plugins/siem/public/overview/components/overview_network_stats/index.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/page/overview/overview_network_stats/index.tsx rename to x-pack/plugins/siem/public/overview/components/overview_network_stats/index.tsx index ca947c29bc382..709f1ffbe5cae 100644 --- a/x-pack/plugins/siem/public/components/page/overview/overview_network_stats/index.tsx +++ b/x-pack/plugins/siem/public/overview/components/overview_network_stats/index.tsx @@ -9,7 +9,7 @@ import { FormattedMessage } from '@kbn/i18n/react'; import React from 'react'; import styled from 'styled-components'; -import { OverviewNetworkData } from '../../../../graphql/types'; +import { OverviewNetworkData } from '../../../graphql/types'; import { FormattedStat, StatGroup } from '../types'; import { StatValue } from '../stat_value'; diff --git a/x-pack/plugins/siem/public/components/page/overview/overview_network_stats/mock.ts b/x-pack/plugins/siem/public/overview/components/overview_network_stats/mock.ts similarity index 89% rename from x-pack/plugins/siem/public/components/page/overview/overview_network_stats/mock.ts rename to x-pack/plugins/siem/public/overview/components/overview_network_stats/mock.ts index cc4c639f85deb..f55d6a1577ccd 100644 --- a/x-pack/plugins/siem/public/components/page/overview/overview_network_stats/mock.ts +++ b/x-pack/plugins/siem/public/overview/components/overview_network_stats/mock.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { OverviewNetworkData } from '../../../../graphql/types'; +import { OverviewNetworkData } from '../../../graphql/types'; export const mockData: { OverviewNetwork: OverviewNetworkData } = { OverviewNetwork: { diff --git a/x-pack/plugins/siem/public/components/recent_cases/filters/index.tsx b/x-pack/plugins/siem/public/overview/components/recent_cases/filters/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/recent_cases/filters/index.tsx rename to x-pack/plugins/siem/public/overview/components/recent_cases/filters/index.tsx diff --git a/x-pack/plugins/siem/public/components/recent_cases/index.tsx b/x-pack/plugins/siem/public/overview/components/recent_cases/index.tsx similarity index 82% rename from x-pack/plugins/siem/public/components/recent_cases/index.tsx rename to x-pack/plugins/siem/public/overview/components/recent_cases/index.tsx index 07246c6c6ec88..03c1754f1b8d5 100644 --- a/x-pack/plugins/siem/public/components/recent_cases/index.tsx +++ b/x-pack/plugins/siem/public/overview/components/recent_cases/index.tsx @@ -7,13 +7,12 @@ import { EuiHorizontalRule, EuiLink, EuiText } from '@elastic/eui'; import React, { useEffect, useMemo, useRef } from 'react'; -import { FilterOptions, QueryParams } from '../../containers/case/types'; -import { DEFAULT_QUERY_PARAMS, useGetCases } from '../../containers/case/use_get_cases'; -import { getCaseUrl } from '../link_to/redirect_to_case'; -import { useGetUrlSearch } from '../navigation/use_get_url_search'; -import { LoadingPlaceholders } from '../page/overview/loading_placeholders'; -import { navTabs } from '../../pages/home/home_navigations'; - +import { FilterOptions, QueryParams } from '../../../cases/containers/types'; +import { DEFAULT_QUERY_PARAMS, useGetCases } from '../../../cases/containers/use_get_cases'; +import { getCaseUrl } from '../../../common/components/link_to/redirect_to_case'; +import { useGetUrlSearch } from '../../../common/components/navigation/use_get_url_search'; +import { navTabs } from '../../../app/home/home_navigations'; +import { LoadingPlaceholders } from '../loading_placeholders'; import { NoCases } from './no_cases'; import { RecentCases } from './recent_cases'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/components/recent_cases/no_cases/index.tsx b/x-pack/plugins/siem/public/overview/components/recent_cases/no_cases/index.tsx similarity index 76% rename from x-pack/plugins/siem/public/components/recent_cases/no_cases/index.tsx rename to x-pack/plugins/siem/public/overview/components/recent_cases/no_cases/index.tsx index 9f0361311b7b6..e29223ca07e65 100644 --- a/x-pack/plugins/siem/public/components/recent_cases/no_cases/index.tsx +++ b/x-pack/plugins/siem/public/overview/components/recent_cases/no_cases/index.tsx @@ -7,9 +7,9 @@ import { EuiLink } from '@elastic/eui'; import React, { useMemo } from 'react'; -import { getCreateCaseUrl } from '../../link_to/redirect_to_case'; -import { useGetUrlSearch } from '../../navigation/use_get_url_search'; -import { navTabs } from '../../../pages/home/home_navigations'; +import { getCreateCaseUrl } from '../../../../common/components/link_to/redirect_to_case'; +import { useGetUrlSearch } from '../../../../common/components/navigation/use_get_url_search'; +import { navTabs } from '../../../../app/home/home_navigations'; import * as i18n from '../translations'; diff --git a/x-pack/plugins/siem/public/components/recent_cases/recent_cases.tsx b/x-pack/plugins/siem/public/overview/components/recent_cases/recent_cases.tsx similarity index 82% rename from x-pack/plugins/siem/public/components/recent_cases/recent_cases.tsx rename to x-pack/plugins/siem/public/overview/components/recent_cases/recent_cases.tsx index eb17c75f4111b..9618ddb05716d 100644 --- a/x-pack/plugins/siem/public/components/recent_cases/recent_cases.tsx +++ b/x-pack/plugins/siem/public/overview/components/recent_cases/recent_cases.tsx @@ -8,11 +8,11 @@ import { EuiFlexGroup, EuiFlexItem, EuiLink, EuiSpacer, EuiText } from '@elastic import React from 'react'; import styled from 'styled-components'; -import { Case } from '../../containers/case/types'; -import { getCaseDetailsUrl } from '../link_to/redirect_to_case'; -import { Markdown } from '../markdown'; -import { useGetUrlSearch } from '../navigation/use_get_url_search'; -import { navTabs } from '../../pages/home/home_navigations'; +import { Case } from '../../../cases/containers/types'; +import { getCaseDetailsUrl } from '../../../common/components/link_to/redirect_to_case'; +import { Markdown } from '../../../common/components/markdown'; +import { useGetUrlSearch } from '../../../common/components/navigation/use_get_url_search'; +import { navTabs } from '../../../app/home/home_navigations'; import { IconWithCount } from '../recent_timelines/counts'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/components/recent_cases/translations.ts b/x-pack/plugins/siem/public/overview/components/recent_cases/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/recent_cases/translations.ts rename to x-pack/plugins/siem/public/overview/components/recent_cases/translations.ts diff --git a/x-pack/plugins/siem/public/components/recent_cases/types.ts b/x-pack/plugins/siem/public/overview/components/recent_cases/types.ts similarity index 100% rename from x-pack/plugins/siem/public/components/recent_cases/types.ts rename to x-pack/plugins/siem/public/overview/components/recent_cases/types.ts diff --git a/x-pack/plugins/siem/public/components/recent_timelines/counts/index.tsx b/x-pack/plugins/siem/public/overview/components/recent_timelines/counts/index.tsx similarity index 88% rename from x-pack/plugins/siem/public/components/recent_timelines/counts/index.tsx rename to x-pack/plugins/siem/public/overview/components/recent_timelines/counts/index.tsx index c80530b245cf3..bdb75f8800647 100644 --- a/x-pack/plugins/siem/public/components/recent_timelines/counts/index.tsx +++ b/x-pack/plugins/siem/public/overview/components/recent_timelines/counts/index.tsx @@ -8,8 +8,11 @@ import { EuiFlexGroup, EuiFlexItem, EuiIcon, EuiText, EuiToolTip } from '@elasti import React from 'react'; import styled from 'styled-components'; -import { getPinnedEventCount, getNotesCount } from '../../open_timeline/helpers'; -import { OpenTimelineResult } from '../../open_timeline/types'; +import { + getPinnedEventCount, + getNotesCount, +} from '../../../../timelines/components/open_timeline/helpers'; +import { OpenTimelineResult } from '../../../../timelines/components/open_timeline/types'; import * as i18n from '../translations'; diff --git a/x-pack/plugins/siem/public/components/recent_timelines/filters/index.tsx b/x-pack/plugins/siem/public/overview/components/recent_timelines/filters/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/recent_timelines/filters/index.tsx rename to x-pack/plugins/siem/public/overview/components/recent_timelines/filters/index.tsx diff --git a/x-pack/plugins/siem/public/components/recent_timelines/header/index.tsx b/x-pack/plugins/siem/public/overview/components/recent_timelines/header/index.tsx similarity index 82% rename from x-pack/plugins/siem/public/components/recent_timelines/header/index.tsx rename to x-pack/plugins/siem/public/overview/components/recent_timelines/header/index.tsx index 89c7ae6f1eed9..07144840dae11 100644 --- a/x-pack/plugins/siem/public/components/recent_timelines/header/index.tsx +++ b/x-pack/plugins/siem/public/overview/components/recent_timelines/header/index.tsx @@ -7,8 +7,11 @@ import { EuiText, EuiLink } from '@elastic/eui'; import React, { useCallback } from 'react'; -import { isUntitled } from '../../open_timeline/helpers'; -import { OnOpenTimeline, OpenTimelineResult } from '../../open_timeline/types'; +import { isUntitled } from '../../../../timelines/components/open_timeline/helpers'; +import { + OnOpenTimeline, + OpenTimelineResult, +} from '../../../../timelines/components/open_timeline/types'; import * as i18n from '../translations'; export const RecentTimelineHeader = React.memo<{ diff --git a/x-pack/plugins/siem/public/components/recent_timelines/index.tsx b/x-pack/plugins/siem/public/overview/components/recent_timelines/index.tsx similarity index 81% rename from x-pack/plugins/siem/public/components/recent_timelines/index.tsx rename to x-pack/plugins/siem/public/overview/components/recent_timelines/index.tsx index d3532d9fd1025..75b157a282eeb 100644 --- a/x-pack/plugins/siem/public/components/recent_timelines/index.tsx +++ b/x-pack/plugins/siem/public/overview/components/recent_timelines/index.tsx @@ -10,21 +10,23 @@ import React, { useCallback, useMemo, useEffect } from 'react'; import { connect, ConnectedProps } from 'react-redux'; import { Dispatch } from 'redux'; -import { TimelineType } from '../../../common/types/timeline'; - -import { useGetAllTimeline } from '../../containers/timeline/all'; -import { SortFieldTimeline, Direction } from '../../graphql/types'; -import { queryTimelineById, dispatchUpdateTimeline } from '../open_timeline/helpers'; -import { OnOpenTimeline } from '../open_timeline/types'; -import { LoadingPlaceholders } from '../page/overview/loading_placeholders'; -import { updateIsLoading as dispatchUpdateIsLoading } from '../../store/timeline/actions'; +import { TimelineType } from '../../../../common/types/timeline'; +import { useGetAllTimeline } from '../../../timelines/containers/all'; +import { SortFieldTimeline, Direction } from '../../../graphql/types'; +import { + queryTimelineById, + dispatchUpdateTimeline, +} from '../../../timelines/components/open_timeline/helpers'; +import { OnOpenTimeline } from '../../../timelines/components/open_timeline/types'; +import { updateIsLoading as dispatchUpdateIsLoading } from '../../../timelines/store/timeline/actions'; import { RecentTimelines } from './recent_timelines'; import * as i18n from './translations'; import { FilterMode } from './types'; -import { useGetUrlSearch } from '../navigation/use_get_url_search'; -import { navTabs } from '../../pages/home/home_navigations'; -import { getTimelinesUrl } from '../link_to/redirect_to_timelines'; +import { useGetUrlSearch } from '../../../common/components/navigation/use_get_url_search'; +import { navTabs } from '../../../app/home/home_navigations'; +import { getTimelinesUrl } from '../../../common/components/link_to/redirect_to_timelines'; +import { LoadingPlaceholders } from '../loading_placeholders'; interface OwnProps { apolloClient: ApolloClient<{}>; diff --git a/x-pack/plugins/siem/public/components/recent_timelines/recent_timelines.tsx b/x-pack/plugins/siem/public/overview/components/recent_timelines/recent_timelines.tsx similarity index 93% rename from x-pack/plugins/siem/public/components/recent_timelines/recent_timelines.tsx rename to x-pack/plugins/siem/public/overview/components/recent_timelines/recent_timelines.tsx index dbcd3fe721ea3..ba6fcad2a03e9 100644 --- a/x-pack/plugins/siem/public/components/recent_timelines/recent_timelines.tsx +++ b/x-pack/plugins/siem/public/overview/components/recent_timelines/recent_timelines.tsx @@ -15,8 +15,11 @@ import { import React from 'react'; import { RecentTimelineHeader } from './header'; -import { OnOpenTimeline, OpenTimelineResult } from '../open_timeline/types'; -import { WithHoverActions } from '../with_hover_actions'; +import { + OnOpenTimeline, + OpenTimelineResult, +} from '../../../timelines/components/open_timeline/types'; +import { WithHoverActions } from '../../../common/components/with_hover_actions'; import { RecentTimelineCounts } from './counts'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/components/recent_timelines/translations.ts b/x-pack/plugins/siem/public/overview/components/recent_timelines/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/recent_timelines/translations.ts rename to x-pack/plugins/siem/public/overview/components/recent_timelines/translations.ts diff --git a/x-pack/plugins/siem/public/components/recent_timelines/types.ts b/x-pack/plugins/siem/public/overview/components/recent_timelines/types.ts similarity index 100% rename from x-pack/plugins/siem/public/components/recent_timelines/types.ts rename to x-pack/plugins/siem/public/overview/components/recent_timelines/types.ts diff --git a/x-pack/plugins/siem/public/pages/overview/sidebar/index.tsx b/x-pack/plugins/siem/public/overview/components/sidebar/index.tsx similarity index 82% rename from x-pack/plugins/siem/public/pages/overview/sidebar/index.tsx rename to x-pack/plugins/siem/public/overview/components/sidebar/index.tsx index 3797eae2bb853..773750f3d0cc5 100644 --- a/x-pack/plugins/siem/public/pages/overview/sidebar/index.tsx +++ b/x-pack/plugins/siem/public/overview/components/sidebar/index.tsx @@ -6,8 +6,8 @@ import React, { useState } from 'react'; -import { FilterMode as RecentTimelinesFilterMode } from '../../../components/recent_timelines/types'; -import { FilterMode as RecentCasesFilterMode } from '../../../components/recent_cases/types'; +import { FilterMode as RecentTimelinesFilterMode } from '../recent_timelines/types'; +import { FilterMode as RecentCasesFilterMode } from '../recent_cases/types'; import { Sidebar } from './sidebar'; diff --git a/x-pack/plugins/siem/public/pages/overview/sidebar/sidebar.tsx b/x-pack/plugins/siem/public/overview/components/sidebar/sidebar.tsx similarity index 78% rename from x-pack/plugins/siem/public/pages/overview/sidebar/sidebar.tsx rename to x-pack/plugins/siem/public/overview/components/sidebar/sidebar.tsx index c972fd83cc88f..81de0ed503595 100644 --- a/x-pack/plugins/siem/public/pages/overview/sidebar/sidebar.tsx +++ b/x-pack/plugins/siem/public/overview/components/sidebar/sidebar.tsx @@ -9,19 +9,19 @@ import React, { useMemo } from 'react'; import styled from 'styled-components'; import { ENABLE_NEWS_FEED_SETTING, NEWS_FEED_URL_SETTING } from '../../../../common/constants'; -import { Filters as RecentCasesFilters } from '../../../components/recent_cases/filters'; -import { Filters as RecentTimelinesFilters } from '../../../components/recent_timelines/filters'; -import { StatefulRecentCases } from '../../../components/recent_cases'; -import { StatefulRecentTimelines } from '../../../components/recent_timelines'; -import { StatefulNewsFeed } from '../../../components/news_feed'; -import { FilterMode as RecentTimelinesFilterMode } from '../../../components/recent_timelines/types'; -import { FilterMode as RecentCasesFilterMode } from '../../../components/recent_cases/types'; -import { DEFAULT_FILTER_OPTIONS } from '../../../containers/case/use_get_cases'; -import { SidebarHeader } from '../../../components/sidebar_header'; -import { useCurrentUser } from '../../../lib/kibana'; -import { useApolloClient } from '../../../utils/apollo_context'; +import { Filters as RecentCasesFilters } from '../recent_cases/filters'; +import { Filters as RecentTimelinesFilters } from '../recent_timelines/filters'; +import { StatefulRecentCases } from '../recent_cases'; +import { StatefulRecentTimelines } from '../recent_timelines'; +import { StatefulNewsFeed } from '../../../common/components/news_feed'; +import { FilterMode as RecentTimelinesFilterMode } from '../recent_timelines/types'; +import { FilterMode as RecentCasesFilterMode } from '../recent_cases/types'; +import { DEFAULT_FILTER_OPTIONS } from '../../../cases/containers/use_get_cases'; +import { SidebarHeader } from '../../../common/components/sidebar_header'; +import { useCurrentUser } from '../../../common/lib/kibana'; +import { useApolloClient } from '../../../common/utils/apollo_context'; -import * as i18n from '../translations'; +import * as i18n from '../../pages/translations'; const SidebarFlexGroup = styled(EuiFlexGroup)` width: 305px; diff --git a/x-pack/plugins/siem/public/pages/overview/signals_by_category/index.tsx b/x-pack/plugins/siem/public/overview/components/signals_by_category/index.tsx similarity index 80% rename from x-pack/plugins/siem/public/pages/overview/signals_by_category/index.tsx rename to x-pack/plugins/siem/public/overview/components/signals_by_category/index.tsx index e5863effa906d..def7342ff76b2 100644 --- a/x-pack/plugins/siem/public/pages/overview/signals_by_category/index.tsx +++ b/x-pack/plugins/siem/public/overview/components/signals_by_category/index.tsx @@ -6,15 +6,15 @@ import React, { useCallback } from 'react'; -import { SignalsHistogramPanel } from '../../detection_engine/components/signals_histogram_panel'; -import { signalsHistogramOptions } from '../../detection_engine/components/signals_histogram_panel/config'; -import { useSignalIndex } from '../../../containers/detection_engine/signals/use_signal_index'; -import { SetAbsoluteRangeDatePicker } from '../../network/types'; +import { SignalsHistogramPanel } from '../../../alerts/components/signals_histogram_panel'; +import { signalsHistogramOptions } from '../../../alerts/components/signals_histogram_panel/config'; +import { useSignalIndex } from '../../../alerts/containers/detection_engine/signals/use_signal_index'; +import { SetAbsoluteRangeDatePicker } from '../../../network/pages/types'; import { Filter, IIndexPattern, Query } from '../../../../../../../src/plugins/data/public'; -import { inputsModel } from '../../../store'; -import { InputsModelId } from '../../../store/inputs/constants'; -import * as i18n from '../translations'; -import { UpdateDateRange } from '../../../components/charts/common'; +import { inputsModel } from '../../../common/store'; +import { InputsModelId } from '../../../common/store/inputs/constants'; +import * as i18n from '../../pages/translations'; +import { UpdateDateRange } from '../../../common/components/charts/common'; const DEFAULT_QUERY: Query = { query: '', language: 'kuery' }; const DEFAULT_STACK_BY = 'signal.rule.threat.tactic.name'; diff --git a/x-pack/plugins/siem/public/components/page/overview/stat_value.tsx b/x-pack/plugins/siem/public/overview/components/stat_value.tsx similarity index 94% rename from x-pack/plugins/siem/public/components/page/overview/stat_value.tsx rename to x-pack/plugins/siem/public/overview/components/stat_value.tsx index 7615001eec9da..dd50a9599e142 100644 --- a/x-pack/plugins/siem/public/components/page/overview/stat_value.tsx +++ b/x-pack/plugins/siem/public/overview/components/stat_value.tsx @@ -9,8 +9,8 @@ import numeral from '@elastic/numeral'; import React, { useEffect, useState } from 'react'; import styled from 'styled-components'; -import { DEFAULT_NUMBER_FORMAT } from '../../../../common/constants'; -import { useUiSetting$ } from '../../../lib/kibana'; +import { DEFAULT_NUMBER_FORMAT } from '../../../common/constants'; +import { useUiSetting$ } from '../../common/lib/kibana'; const ProgressContainer = styled.div` margin-left: 8px; diff --git a/x-pack/plugins/siem/public/components/page/overview/types.ts b/x-pack/plugins/siem/public/overview/components/types.ts similarity index 100% rename from x-pack/plugins/siem/public/components/page/overview/types.ts rename to x-pack/plugins/siem/public/overview/components/types.ts diff --git a/x-pack/plugins/siem/public/containers/overview/overview_host/index.gql_query.ts b/x-pack/plugins/siem/public/overview/containers/overview_host/index.gql_query.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/overview/overview_host/index.gql_query.ts rename to x-pack/plugins/siem/public/overview/containers/overview_host/index.gql_query.ts diff --git a/x-pack/plugins/siem/public/containers/overview/overview_host/index.tsx b/x-pack/plugins/siem/public/overview/containers/overview_host/index.tsx similarity index 87% rename from x-pack/plugins/siem/public/containers/overview/overview_host/index.tsx rename to x-pack/plugins/siem/public/overview/containers/overview_host/index.tsx index 2dd9ccf24d802..89761e104d70f 100644 --- a/x-pack/plugins/siem/public/containers/overview/overview_host/index.tsx +++ b/x-pack/plugins/siem/public/overview/containers/overview_host/index.tsx @@ -11,11 +11,11 @@ import { connect, ConnectedProps } from 'react-redux'; import { DEFAULT_INDEX_KEY } from '../../../../common/constants'; import { GetOverviewHostQuery, OverviewHostData } from '../../../graphql/types'; -import { useUiSetting } from '../../../lib/kibana'; -import { inputsModel, inputsSelectors } from '../../../store/inputs'; -import { State } from '../../../store'; -import { createFilter, getDefaultFetchPolicy } from '../../helpers'; -import { QueryTemplateProps } from '../../query_template'; +import { useUiSetting } from '../../../common/lib/kibana'; +import { inputsModel, inputsSelectors } from '../../../common/store/inputs'; +import { State } from '../../../common/store'; +import { createFilter, getDefaultFetchPolicy } from '../../../common/containers/helpers'; +import { QueryTemplateProps } from '../../../common/containers/query_template'; import { overviewHostQuery } from './index.gql_query'; diff --git a/x-pack/plugins/siem/public/containers/overview/overview_network/index.gql_query.ts b/x-pack/plugins/siem/public/overview/containers/overview_network/index.gql_query.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/overview/overview_network/index.gql_query.ts rename to x-pack/plugins/siem/public/overview/containers/overview_network/index.gql_query.ts diff --git a/x-pack/plugins/siem/public/containers/overview/overview_network/index.tsx b/x-pack/plugins/siem/public/overview/containers/overview_network/index.tsx similarity index 88% rename from x-pack/plugins/siem/public/containers/overview/overview_network/index.tsx rename to x-pack/plugins/siem/public/overview/containers/overview_network/index.tsx index d0acd41c224a5..86242adf3f47f 100644 --- a/x-pack/plugins/siem/public/containers/overview/overview_network/index.tsx +++ b/x-pack/plugins/siem/public/overview/containers/overview_network/index.tsx @@ -11,11 +11,11 @@ import { connect, ConnectedProps } from 'react-redux'; import { DEFAULT_INDEX_KEY } from '../../../../common/constants'; import { GetOverviewNetworkQuery, OverviewNetworkData } from '../../../graphql/types'; -import { useUiSetting } from '../../../lib/kibana'; -import { State } from '../../../store'; -import { inputsModel, inputsSelectors } from '../../../store/inputs'; -import { createFilter, getDefaultFetchPolicy } from '../../helpers'; -import { QueryTemplateProps } from '../../query_template'; +import { useUiSetting } from '../../../common/lib/kibana'; +import { State } from '../../../common/store'; +import { inputsModel, inputsSelectors } from '../../../common/store/inputs'; +import { createFilter, getDefaultFetchPolicy } from '../../../common/containers/helpers'; +import { QueryTemplateProps } from '../../../common/containers/query_template'; import { overviewNetworkQuery } from './index.gql_query'; diff --git a/x-pack/plugins/siem/public/overview/index.ts b/x-pack/plugins/siem/public/overview/index.ts new file mode 100644 index 0000000000000..bdf855b3851c8 --- /dev/null +++ b/x-pack/plugins/siem/public/overview/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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { SecuritySubPlugin } from '../app/types'; +import { getOverviewRoutes } from './routes'; + +export class Overview { + public setup() {} + + public start(): SecuritySubPlugin { + return { + routes: getOverviewRoutes(), + }; + } +} diff --git a/x-pack/plugins/siem/public/pages/overview/index.tsx b/x-pack/plugins/siem/public/overview/pages/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/pages/overview/index.tsx rename to x-pack/plugins/siem/public/overview/pages/index.tsx diff --git a/x-pack/plugins/siem/public/pages/overview/overview.test.tsx b/x-pack/plugins/siem/public/overview/pages/overview.test.tsx similarity index 88% rename from x-pack/plugins/siem/public/pages/overview/overview.test.tsx rename to x-pack/plugins/siem/public/overview/pages/overview.test.tsx index c129258fa2e87..36174bdb94a3f 100644 --- a/x-pack/plugins/siem/public/pages/overview/overview.test.tsx +++ b/x-pack/plugins/siem/public/overview/pages/overview.test.tsx @@ -10,19 +10,19 @@ import React from 'react'; import { MockedProvider } from 'react-apollo/test-utils'; import { MemoryRouter } from 'react-router-dom'; -import '../../mock/match_media'; -import { TestProviders } from '../../mock'; -import { mocksSource } from '../../containers/source/mock'; +import '../../common/mock/match_media'; +import { TestProviders } from '../../common/mock'; +import { mocksSource } from '../../common/containers/source/mock'; import { Overview } from './index'; -jest.mock('../../lib/kibana'); +jest.mock('../../common/lib/kibana'); // Test will fail because we will to need to mock some core services to make the test work // For now let's forget about SiemSearchBar and QueryBar -jest.mock('../../components/search_bar', () => ({ +jest.mock('../../common/components/search_bar', () => ({ SiemSearchBar: () => null, })); -jest.mock('../../components/query_bar', () => ({ +jest.mock('../../common/components/query_bar', () => ({ QueryBar: () => null, })); diff --git a/x-pack/plugins/siem/public/pages/overview/overview.tsx b/x-pack/plugins/siem/public/overview/pages/overview.tsx similarity index 82% rename from x-pack/plugins/siem/public/pages/overview/overview.tsx rename to x-pack/plugins/siem/public/overview/pages/overview.tsx index 82f4444728902..57a82f6f254f2 100644 --- a/x-pack/plugins/siem/public/pages/overview/overview.tsx +++ b/x-pack/plugins/siem/public/overview/pages/overview.tsx @@ -11,20 +11,23 @@ import { StickyContainer } from 'react-sticky'; import { Query, Filter } from 'src/plugins/data/public'; import styled from 'styled-components'; -import { AlertsByCategory } from './alerts_by_category'; -import { FiltersGlobal } from '../../components/filters_global'; -import { SiemSearchBar } from '../../components/search_bar'; -import { WrapperPage } from '../../components/wrapper_page'; -import { GlobalTime } from '../../containers/global_time'; -import { WithSource, indicesExistOrDataTemporarilyUnavailable } from '../../containers/source'; -import { EventsByDataset } from './events_by_dataset'; -import { EventCounts } from './event_counts'; -import { OverviewEmpty } from './overview_empty'; -import { StatefulSidebar } from './sidebar'; -import { SignalsByCategory } from './signals_by_category'; -import { inputsSelectors, State } from '../../store'; -import { setAbsoluteRangeDatePicker as dispatchSetAbsoluteRangeDatePicker } from '../../store/inputs/actions'; -import { SpyRoute } from '../../utils/route/spy_routes'; +import { AlertsByCategory } from '../components/alerts_by_category'; +import { FiltersGlobal } from '../../common/components/filters_global'; +import { SiemSearchBar } from '../../common/components/search_bar'; +import { WrapperPage } from '../../common/components/wrapper_page'; +import { GlobalTime } from '../../common/containers/global_time'; +import { + WithSource, + indicesExistOrDataTemporarilyUnavailable, +} from '../../common/containers/source'; +import { EventsByDataset } from '../components/events_by_dataset'; +import { EventCounts } from '../components/event_counts'; +import { OverviewEmpty } from '../components/overview_empty'; +import { StatefulSidebar } from '../components/sidebar'; +import { SignalsByCategory } from '../components/signals_by_category'; +import { inputsSelectors, State } from '../../common/store'; +import { setAbsoluteRangeDatePicker as dispatchSetAbsoluteRangeDatePicker } from '../../common/store/inputs/actions'; +import { SpyRoute } from '../../common/utils/route/spy_routes'; const DEFAULT_QUERY: Query = { query: '', language: 'kuery' }; const NO_FILTERS: Filter[] = []; diff --git a/x-pack/plugins/siem/public/pages/overview/summary.tsx b/x-pack/plugins/siem/public/overview/pages/summary.tsx similarity index 98% rename from x-pack/plugins/siem/public/pages/overview/summary.tsx rename to x-pack/plugins/siem/public/overview/pages/summary.tsx index da16cb28c6171..1e08a2cdca8e7 100644 --- a/x-pack/plugins/siem/public/pages/overview/summary.tsx +++ b/x-pack/plugins/siem/public/overview/pages/summary.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { EuiFlexItem, EuiLink, EuiText } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n/react'; -import { useKibana } from '../../lib/kibana'; +import { useKibana } from '../../common/lib/kibana'; export const Summary = React.memo(() => { const docLinks = useKibana().services.docLinks; diff --git a/x-pack/plugins/siem/public/pages/overview/translations.ts b/x-pack/plugins/siem/public/overview/pages/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/overview/translations.ts rename to x-pack/plugins/siem/public/overview/pages/translations.ts diff --git a/x-pack/plugins/siem/public/overview/routes.tsx b/x-pack/plugins/siem/public/overview/routes.tsx new file mode 100644 index 0000000000000..fc41227b27c04 --- /dev/null +++ b/x-pack/plugins/siem/public/overview/routes.tsx @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { Route } from 'react-router-dom'; + +import { Overview } from './pages'; +import { SiemPageName } from '../app/types'; + +export const getOverviewRoutes = () => [ + } />, +]; diff --git a/x-pack/plugins/siem/public/pages/home/types.ts b/x-pack/plugins/siem/public/pages/home/types.ts deleted file mode 100644 index 6445ac91d9e13..0000000000000 --- a/x-pack/plugins/siem/public/pages/home/types.ts +++ /dev/null @@ -1,26 +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; - * you may not use this file except in compliance with the Elastic License. - */ - -import { NavTab } from '../../components/navigation/types'; - -export enum SiemPageName { - overview = 'overview', - hosts = 'hosts', - network = 'network', - detections = 'detections', - timelines = 'timelines', - case = 'case', -} - -export type SiemNavTabKey = - | SiemPageName.overview - | SiemPageName.hosts - | SiemPageName.network - | SiemPageName.detections - | SiemPageName.timelines - | SiemPageName.case; - -export type SiemNavTab = Record; diff --git a/x-pack/plugins/siem/public/plugin.tsx b/x-pack/plugins/siem/public/plugin.tsx index f4310e1b073ab..cc46025ddc4a6 100644 --- a/x-pack/plugins/siem/public/plugin.tsx +++ b/x-pack/plugins/siem/public/plugin.tsx @@ -30,9 +30,9 @@ import { } from '../../triggers_actions_ui/public'; import { SecurityPluginSetup } from '../../security/public'; import { APP_ID, APP_NAME, APP_PATH, APP_ICON } from '../common/constants'; -import { initTelemetry } from './lib/telemetry'; -import { KibanaServices } from './lib/kibana/services'; -import { serviceNowActionType, jiraActionType } from './lib/connectors'; +import { initTelemetry } from './common/lib/telemetry'; +import { KibanaServices } from './common/lib/kibana/services'; +import { serviceNowActionType, jiraActionType } from './common/lib/connectors'; export interface SetupPlugins { home: HomePublicPluginSetup; @@ -87,6 +87,53 @@ export class Plugin implements IPlugin { + const [coreStart, startPlugins] = await core.getStartServices(); + const { renderApp } = await import('./app'); + const services = { + ...coreStart, + ...startPlugins, + security: plugins.security, + } as StartServices; + + const alertsSubPlugin = new (await import('./alerts')).Alerts(); + const casesSubPlugin = new (await import('./cases')).Cases(); + const hostsSubPlugin = new (await import('./hosts')).Hosts(); + const networkSubPlugin = new (await import('./network')).Network(); + const overviewSubPlugin = new (await import('./overview')).Overview(); + const timelinesSubPlugin = new (await import('./timelines')).Timelines(); + + const alertsStart = alertsSubPlugin.start(); + const casesStart = casesSubPlugin.start(); + const hostsStart = hostsSubPlugin.start(); + const networkStart = networkSubPlugin.start(); + const overviewStart = overviewSubPlugin.start(); + const timelinesStart = timelinesSubPlugin.start(); + + return renderApp(services, params, { + routes: [ + ...alertsStart.routes, + ...casesStart.routes, + ...hostsStart.routes, + ...networkStart.routes, + ...overviewStart.routes, + ...timelinesStart.routes, + ], + store: { + initialState: { + ...hostsStart.store.initialState, + ...networkStart.store.initialState, + ...timelinesStart.store.initialState, + }, + reducer: { + ...hostsStart.store.reducer, + ...networkStart.store.reducer, + ...timelinesStart.store.reducer, + }, + }, + }); + }; + core.application.register({ id: APP_ID, title: APP_NAME, @@ -94,15 +141,7 @@ export class Plugin implements IPlugin ({ - ...initialState, - inputs: createInitialInputsState(), -}); - -export const reducer = combineReducers({ - app: appReducer, - dragAndDrop: dragAndDropReducer, - hosts: hostsReducer, - inputs: inputsReducer, - network: networkReducer, - timeline: timelineReducer, -}); diff --git a/x-pack/plugins/siem/public/components/certificate_fingerprint/index.test.tsx b/x-pack/plugins/siem/public/timelines/components/certificate_fingerprint/index.test.tsx similarity index 94% rename from x-pack/plugins/siem/public/components/certificate_fingerprint/index.test.tsx rename to x-pack/plugins/siem/public/timelines/components/certificate_fingerprint/index.test.tsx index 9cd0af062c54a..16d4d3b6c7cba 100644 --- a/x-pack/plugins/siem/public/components/certificate_fingerprint/index.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/certificate_fingerprint/index.test.tsx @@ -6,8 +6,8 @@ import React from 'react'; -import { TestProviders } from '../../mock'; -import { useMountAppended } from '../../utils/use_mount_appended'; +import { TestProviders } from '../../../common/mock'; +import { useMountAppended } from '../../../common/utils/use_mount_appended'; import { CertificateFingerprint } from '.'; diff --git a/x-pack/plugins/siem/public/components/certificate_fingerprint/index.tsx b/x-pack/plugins/siem/public/timelines/components/certificate_fingerprint/index.tsx similarity index 89% rename from x-pack/plugins/siem/public/components/certificate_fingerprint/index.tsx rename to x-pack/plugins/siem/public/timelines/components/certificate_fingerprint/index.tsx index 181d92dce06f9..dc3b6ea61b9c3 100644 --- a/x-pack/plugins/siem/public/components/certificate_fingerprint/index.tsx +++ b/x-pack/plugins/siem/public/timelines/components/certificate_fingerprint/index.tsx @@ -8,9 +8,9 @@ import { EuiText } from '@elastic/eui'; import React from 'react'; import styled from 'styled-components'; -import { DraggableBadge } from '../draggables'; -import { ExternalLinkIcon } from '../external_link_icon'; -import { CertificateFingerprintLink } from '../links'; +import { DraggableBadge } from '../../../common/components/draggables'; +import { ExternalLinkIcon } from '../../../common/components/external_link_icon'; +import { CertificateFingerprintLink } from '../../../common/components/links'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/components/certificate_fingerprint/translations.ts b/x-pack/plugins/siem/public/timelines/components/certificate_fingerprint/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/certificate_fingerprint/translations.ts rename to x-pack/plugins/siem/public/timelines/components/certificate_fingerprint/translations.ts diff --git a/x-pack/plugins/siem/public/components/duration/index.test.tsx b/x-pack/plugins/siem/public/timelines/components/duration/index.test.tsx similarity index 87% rename from x-pack/plugins/siem/public/components/duration/index.test.tsx rename to x-pack/plugins/siem/public/timelines/components/duration/index.test.tsx index 0dbc60ad9ae52..8063921668c90 100644 --- a/x-pack/plugins/siem/public/components/duration/index.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/duration/index.test.tsx @@ -6,9 +6,9 @@ import React from 'react'; -import { TestProviders } from '../../mock'; +import { TestProviders } from '../../../common/mock'; import { ONE_MILLISECOND_AS_NANOSECONDS } from '../formatted_duration/helpers'; -import { useMountAppended } from '../../utils/use_mount_appended'; +import { useMountAppended } from '../../../common/utils/use_mount_appended'; import { Duration } from '.'; diff --git a/x-pack/plugins/siem/public/components/duration/index.tsx b/x-pack/plugins/siem/public/timelines/components/duration/index.tsx similarity index 93% rename from x-pack/plugins/siem/public/components/duration/index.tsx rename to x-pack/plugins/siem/public/timelines/components/duration/index.tsx index 76712b789ffbe..1106ee63a03cb 100644 --- a/x-pack/plugins/siem/public/components/duration/index.tsx +++ b/x-pack/plugins/siem/public/timelines/components/duration/index.tsx @@ -6,7 +6,7 @@ import React from 'react'; -import { DefaultDraggable } from '../draggables'; +import { DefaultDraggable } from '../../../common/components/draggables'; import { FormattedDuration } from '../formatted_duration'; export const EVENT_DURATION_FIELD_NAME = 'event.duration'; diff --git a/x-pack/plugins/siem/public/components/edit_data_provider/helpers.test.tsx b/x-pack/plugins/siem/public/timelines/components/edit_data_provider/helpers.test.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/edit_data_provider/helpers.test.tsx rename to x-pack/plugins/siem/public/timelines/components/edit_data_provider/helpers.test.tsx index 7443087306428..87388960dc5d8 100644 --- a/x-pack/plugins/siem/public/components/edit_data_provider/helpers.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/edit_data_provider/helpers.test.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { mockBrowserFields } from '../../containers/source/mock'; +import { mockBrowserFields } from '../../../common/containers/source/mock'; import { EXISTS_OPERATOR, IS_OPERATOR } from '../timeline/data_providers/data_provider'; import { diff --git a/x-pack/plugins/siem/public/components/edit_data_provider/helpers.tsx b/x-pack/plugins/siem/public/timelines/components/edit_data_provider/helpers.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/edit_data_provider/helpers.tsx rename to x-pack/plugins/siem/public/timelines/components/edit_data_provider/helpers.tsx index e6afc86a7ee67..03eb4f9bb515e 100644 --- a/x-pack/plugins/siem/public/components/edit_data_provider/helpers.tsx +++ b/x-pack/plugins/siem/public/timelines/components/edit_data_provider/helpers.tsx @@ -6,7 +6,7 @@ import { findIndex } from 'lodash/fp'; import { EuiComboBoxOptionOption } from '@elastic/eui'; -import { BrowserField, BrowserFields, getAllFieldsByName } from '../../containers/source'; +import { BrowserField, BrowserFields, getAllFieldsByName } from '../../../common/containers/source'; import { QueryOperator, EXISTS_OPERATOR, diff --git a/x-pack/plugins/siem/public/components/edit_data_provider/index.test.tsx b/x-pack/plugins/siem/public/timelines/components/edit_data_provider/index.test.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/edit_data_provider/index.test.tsx rename to x-pack/plugins/siem/public/timelines/components/edit_data_provider/index.test.tsx index 1786905a4bb48..035d1bb59796e 100644 --- a/x-pack/plugins/siem/public/components/edit_data_provider/index.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/edit_data_provider/index.test.tsx @@ -7,8 +7,8 @@ import { mount } from 'enzyme'; import React from 'react'; -import { mockBrowserFields } from '../../containers/source/mock'; -import { TestProviders } from '../../mock'; +import { mockBrowserFields } from '../../../common/containers/source/mock'; +import { TestProviders } from '../../../common/mock'; import { IS_OPERATOR, EXISTS_OPERATOR } from '../timeline/data_providers/data_provider'; import { StatefulEditDataProvider } from '.'; diff --git a/x-pack/plugins/siem/public/components/edit_data_provider/index.tsx b/x-pack/plugins/siem/public/timelines/components/edit_data_provider/index.tsx similarity index 99% rename from x-pack/plugins/siem/public/components/edit_data_provider/index.tsx rename to x-pack/plugins/siem/public/timelines/components/edit_data_provider/index.tsx index 5ecc96187532d..95f3ec3b31649 100644 --- a/x-pack/plugins/siem/public/components/edit_data_provider/index.tsx +++ b/x-pack/plugins/siem/public/timelines/components/edit_data_provider/index.tsx @@ -20,7 +20,7 @@ import { import React, { useEffect, useState, useCallback } from 'react'; import styled from 'styled-components'; -import { BrowserFields } from '../../containers/source'; +import { BrowserFields } from '../../../common/containers/source'; import { OnDataProviderEdited } from '../timeline/events'; import { QueryOperator } from '../timeline/data_providers/data_provider'; diff --git a/x-pack/plugins/siem/public/components/edit_data_provider/translations.ts b/x-pack/plugins/siem/public/timelines/components/edit_data_provider/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/edit_data_provider/translations.ts rename to x-pack/plugins/siem/public/timelines/components/edit_data_provider/translations.ts diff --git a/x-pack/plugins/siem/public/components/field_renderers/__snapshots__/field_renderers.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/field_renderers/__snapshots__/field_renderers.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/field_renderers/__snapshots__/field_renderers.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/field_renderers/__snapshots__/field_renderers.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/field_renderers/field_renderers.test.tsx b/x-pack/plugins/siem/public/timelines/components/field_renderers/field_renderers.test.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/field_renderers/field_renderers.test.tsx rename to x-pack/plugins/siem/public/timelines/components/field_renderers/field_renderers.test.tsx index 88d03d8db6761..b853a978c15e2 100644 --- a/x-pack/plugins/siem/public/components/field_renderers/field_renderers.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/field_renderers/field_renderers.test.tsx @@ -7,9 +7,9 @@ import { shallow } from 'enzyme'; import React from 'react'; -import { FlowTarget, GetIpOverviewQuery, HostEcsFields } from '../../graphql/types'; -import { TestProviders } from '../../mock'; -import { getEmptyValue } from '../empty_value'; +import { FlowTarget, GetIpOverviewQuery, HostEcsFields } from '../../../graphql/types'; +import { TestProviders } from '../../../common/mock'; +import { getEmptyValue } from '../../../common/components/empty_value'; import { autonomousSystemRenderer, @@ -22,8 +22,8 @@ import { DEFAULT_MORE_MAX_HEIGHT, MoreContainer, } from './field_renderers'; -import { mockData } from '../page/network/ip_overview/mock'; -import { useMountAppended } from '../../utils/use_mount_appended'; +import { mockData } from '../../../network/components/ip_overview/mock'; +import { useMountAppended } from '../../../common/utils/use_mount_appended'; type AutonomousSystem = GetIpOverviewQuery.AutonomousSystem; diff --git a/x-pack/plugins/siem/public/components/field_renderers/field_renderers.tsx b/x-pack/plugins/siem/public/timelines/components/field_renderers/field_renderers.tsx similarity index 92% rename from x-pack/plugins/siem/public/components/field_renderers/field_renderers.tsx rename to x-pack/plugins/siem/public/timelines/components/field_renderers/field_renderers.tsx index 222eef515958c..1d53299c0975e 100644 --- a/x-pack/plugins/siem/public/components/field_renderers/field_renderers.tsx +++ b/x-pack/plugins/siem/public/timelines/components/field_renderers/field_renderers.tsx @@ -10,14 +10,24 @@ import { getOr } from 'lodash/fp'; import React, { Fragment, useState } from 'react'; import styled from 'styled-components'; -import { AutonomousSystem, FlowTarget, HostEcsFields, IpOverviewData } from '../../graphql/types'; -import { escapeDataProviderId } from '../drag_and_drop/helpers'; -import { DefaultDraggable } from '../draggables'; -import { getEmptyTagValue } from '../empty_value'; -import { FormattedRelativePreferenceDate } from '../formatted_date'; -import { HostDetailsLink, ReputationLink, WhoIsLink, ReputationLinkSetting } from '../links'; -import { Spacer } from '../page'; -import * as i18n from '../page/network/ip_overview/translations'; +import { + AutonomousSystem, + FlowTarget, + HostEcsFields, + IpOverviewData, +} from '../../../graphql/types'; +import { escapeDataProviderId } from '../../../common/components/drag_and_drop/helpers'; +import { DefaultDraggable } from '../../../common/components/draggables'; +import { getEmptyTagValue } from '../../../common/components/empty_value'; +import { FormattedRelativePreferenceDate } from '../../../common/components/formatted_date'; +import { + HostDetailsLink, + ReputationLink, + WhoIsLink, + ReputationLinkSetting, +} from '../../../common/components/links'; +import { Spacer } from '../../../common/components/page'; +import * as i18n from '../../../network/components/ip_overview/translations'; const DraggableContainerFlexGroup = styled(EuiFlexGroup)` flex-grow: unset; diff --git a/x-pack/plugins/siem/public/components/fields_browser/categories_pane.test.tsx b/x-pack/plugins/siem/public/timelines/components/fields_browser/categories_pane.test.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/fields_browser/categories_pane.test.tsx rename to x-pack/plugins/siem/public/timelines/components/fields_browser/categories_pane.test.tsx index 361a0789135e4..9a1f9a9d07357 100644 --- a/x-pack/plugins/siem/public/components/fields_browser/categories_pane.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/fields_browser/categories_pane.test.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { ThemeProvider } from 'styled-components'; import euiDarkVars from '@elastic/eui/dist/eui_theme_dark.json'; -import { mockBrowserFields } from '../../containers/source/mock'; +import { mockBrowserFields } from '../../../common/containers/source/mock'; import { CATEGORY_PANE_WIDTH } from './helpers'; import { CategoriesPane } from './categories_pane'; diff --git a/x-pack/plugins/siem/public/components/fields_browser/categories_pane.tsx b/x-pack/plugins/siem/public/timelines/components/fields_browser/categories_pane.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/fields_browser/categories_pane.tsx rename to x-pack/plugins/siem/public/timelines/components/fields_browser/categories_pane.tsx index d6972625821cf..93407e4373910 100644 --- a/x-pack/plugins/siem/public/components/fields_browser/categories_pane.tsx +++ b/x-pack/plugins/siem/public/timelines/components/fields_browser/categories_pane.tsx @@ -8,7 +8,7 @@ import { EuiInMemoryTable, EuiTitle } from '@elastic/eui'; import React from 'react'; import styled from 'styled-components'; -import { BrowserFields } from '../../containers/source'; +import { BrowserFields } from '../../../common/containers/source'; import { FieldBrowserProps } from './types'; import { getCategoryColumns } from './category_columns'; diff --git a/x-pack/plugins/siem/public/components/fields_browser/category.test.tsx b/x-pack/plugins/siem/public/timelines/components/fields_browser/category.test.tsx similarity index 94% rename from x-pack/plugins/siem/public/components/fields_browser/category.test.tsx rename to x-pack/plugins/siem/public/timelines/components/fields_browser/category.test.tsx index 38eaf43977fa2..177ce5648e79b 100644 --- a/x-pack/plugins/siem/public/components/fields_browser/category.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/fields_browser/category.test.tsx @@ -6,13 +6,13 @@ import React from 'react'; -import { mockBrowserFields } from '../../containers/source/mock'; +import { mockBrowserFields } from '../../../common/containers/source/mock'; import { Category } from './category'; import { getFieldItems } from './field_items'; import { FIELDS_PANE_WIDTH } from './helpers'; -import { TestProviders } from '../../mock'; -import { useMountAppended } from '../../utils/use_mount_appended'; +import { TestProviders } from '../../../common/mock'; +import { useMountAppended } from '../../../common/utils/use_mount_appended'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/components/fields_browser/category.tsx b/x-pack/plugins/siem/public/timelines/components/fields_browser/category.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/fields_browser/category.tsx rename to x-pack/plugins/siem/public/timelines/components/fields_browser/category.tsx index 9d2a7da9b2d00..fc91693039449 100644 --- a/x-pack/plugins/siem/public/components/fields_browser/category.tsx +++ b/x-pack/plugins/siem/public/timelines/components/fields_browser/category.tsx @@ -8,7 +8,7 @@ import { EuiInMemoryTable } from '@elastic/eui'; import React from 'react'; import styled from 'styled-components'; -import { BrowserFields } from '../../containers/source'; +import { BrowserFields } from '../../../common/containers/source'; import { CategoryTitle } from './category_title'; import { FieldItem, getFieldColumns } from './field_items'; diff --git a/x-pack/plugins/siem/public/components/fields_browser/category_columns.test.tsx b/x-pack/plugins/siem/public/timelines/components/fields_browser/category_columns.test.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/fields_browser/category_columns.test.tsx rename to x-pack/plugins/siem/public/timelines/components/fields_browser/category_columns.test.tsx index e116209ba5d6a..ec2156bb609fd 100644 --- a/x-pack/plugins/siem/public/components/fields_browser/category_columns.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/fields_browser/category_columns.test.tsx @@ -7,7 +7,7 @@ import { mount } from 'enzyme'; import React from 'react'; -import { mockBrowserFields } from '../../containers/source/mock'; +import { mockBrowserFields } from '../../../common/containers/source/mock'; import { CATEGORY_PANE_WIDTH, getFieldCount } from './helpers'; import { CategoriesPane } from './categories_pane'; diff --git a/x-pack/plugins/siem/public/components/fields_browser/category_columns.tsx b/x-pack/plugins/siem/public/timelines/components/fields_browser/category_columns.tsx similarity index 92% rename from x-pack/plugins/siem/public/components/fields_browser/category_columns.tsx rename to x-pack/plugins/siem/public/timelines/components/fields_browser/category_columns.tsx index 7133e9b848c5c..2e952dc24dbd8 100644 --- a/x-pack/plugins/siem/public/components/fields_browser/category_columns.tsx +++ b/x-pack/plugins/siem/public/timelines/components/fields_browser/category_columns.tsx @@ -10,12 +10,12 @@ import { EuiIcon, EuiFlexGroup, EuiFlexItem, EuiLink, EuiText, EuiToolTip } from import React, { useContext } from 'react'; import styled from 'styled-components'; -import { BrowserFields } from '../../containers/source'; -import { getColumnsWithTimestamp } from '../event_details/helpers'; -import { CountBadge } from '../page'; +import { BrowserFields } from '../../../common/containers/source'; +import { getColumnsWithTimestamp } from '../../../common/components/event_details/helpers'; +import { CountBadge } from '../../../common/components/page'; import { OnUpdateColumns } from '../timeline/events'; import { TimelineContext } from '../timeline/timeline_context'; -import { WithHoverActions } from '../with_hover_actions'; +import { WithHoverActions } from '../../../common/components/with_hover_actions'; import { LoadingSpinner, getCategoryPaneCategoryClassName, getFieldCount } from './helpers'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/components/fields_browser/category_title.test.tsx b/x-pack/plugins/siem/public/timelines/components/fields_browser/category_title.test.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/fields_browser/category_title.test.tsx rename to x-pack/plugins/siem/public/timelines/components/fields_browser/category_title.test.tsx index 792e0342a6d59..8ad9cea9b2941 100644 --- a/x-pack/plugins/siem/public/components/fields_browser/category_title.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/fields_browser/category_title.test.tsx @@ -7,7 +7,7 @@ import { mount } from 'enzyme'; import React from 'react'; -import { mockBrowserFields } from '../../containers/source/mock'; +import { mockBrowserFields } from '../../../common/containers/source/mock'; import { CategoryTitle } from './category_title'; import { getFieldCount } from './helpers'; diff --git a/x-pack/plugins/siem/public/components/fields_browser/category_title.tsx b/x-pack/plugins/siem/public/timelines/components/fields_browser/category_title.tsx similarity index 93% rename from x-pack/plugins/siem/public/components/fields_browser/category_title.tsx rename to x-pack/plugins/siem/public/timelines/components/fields_browser/category_title.tsx index cd14cef328a7e..c8d59f5c0dfa4 100644 --- a/x-pack/plugins/siem/public/components/fields_browser/category_title.tsx +++ b/x-pack/plugins/siem/public/timelines/components/fields_browser/category_title.tsx @@ -8,9 +8,9 @@ import { EuiFlexGroup, EuiFlexItem, EuiTitle } from '@elastic/eui'; import React from 'react'; import styled from 'styled-components'; -import { BrowserFields } from '../../containers/source'; +import { BrowserFields } from '../../../common/containers/source'; import { getFieldBrowserCategoryTitleClassName, getFieldCount } from './helpers'; -import { CountBadge } from '../page'; +import { CountBadge } from '../../../common/components/page'; const CountBadgeContainer = styled.div` position: relative; diff --git a/x-pack/plugins/siem/public/components/fields_browser/field_browser.test.tsx b/x-pack/plugins/siem/public/timelines/components/fields_browser/field_browser.test.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/fields_browser/field_browser.test.tsx rename to x-pack/plugins/siem/public/timelines/components/fields_browser/field_browser.test.tsx index 9214fd5f2540c..d4a6d85c7ccdd 100644 --- a/x-pack/plugins/siem/public/components/fields_browser/field_browser.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/fields_browser/field_browser.test.tsx @@ -7,8 +7,8 @@ import { mount } from 'enzyme'; import React from 'react'; -import { mockBrowserFields } from '../../containers/source/mock'; -import { TestProviders } from '../../mock'; +import { mockBrowserFields } from '../../../common/containers/source/mock'; +import { TestProviders } from '../../../common/mock'; import { FieldsBrowser } from './field_browser'; import { FIELD_BROWSER_HEIGHT, FIELD_BROWSER_WIDTH } from './helpers'; diff --git a/x-pack/plugins/siem/public/components/fields_browser/field_browser.tsx b/x-pack/plugins/siem/public/timelines/components/fields_browser/field_browser.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/fields_browser/field_browser.tsx rename to x-pack/plugins/siem/public/timelines/components/fields_browser/field_browser.tsx index 02aeab74f8bab..c255bd062bb4c 100644 --- a/x-pack/plugins/siem/public/components/fields_browser/field_browser.tsx +++ b/x-pack/plugins/siem/public/timelines/components/fields_browser/field_browser.tsx @@ -9,8 +9,8 @@ import React, { useEffect, useCallback } from 'react'; import { noop } from 'lodash/fp'; import styled from 'styled-components'; -import { BrowserFields } from '../../containers/source'; -import { ColumnHeaderOptions } from '../../store/timeline/model'; +import { BrowserFields } from '../../../common/containers/source'; +import { ColumnHeaderOptions } from '../../../timelines/store/timeline/model'; import { CategoriesPane } from './categories_pane'; import { FieldsPane } from './fields_pane'; import { Header } from './header'; diff --git a/x-pack/plugins/siem/public/components/fields_browser/field_items.test.tsx b/x-pack/plugins/siem/public/timelines/components/fields_browser/field_items.test.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/fields_browser/field_items.test.tsx rename to x-pack/plugins/siem/public/timelines/components/fields_browser/field_items.test.tsx index 226b56dad8c4f..3b9e5368ff196 100644 --- a/x-pack/plugins/siem/public/components/fields_browser/field_items.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/fields_browser/field_items.test.tsx @@ -7,16 +7,16 @@ import { omit } from 'lodash/fp'; import React from 'react'; -import { mockBrowserFields } from '../../containers/source/mock'; -import { TestProviders } from '../../mock'; -import { ColumnHeaderOptions } from '../../store/timeline/model'; +import { mockBrowserFields } from '../../../common/containers/source/mock'; +import { TestProviders } from '../../../common/mock'; +import { ColumnHeaderOptions } from '../../../timelines/store/timeline/model'; import { defaultColumnHeaderType } from '../timeline/body/column_headers/default_headers'; import { DEFAULT_DATE_COLUMN_MIN_WIDTH } from '../timeline/body/constants'; import { Category } from './category'; import { getFieldColumns, getFieldItems } from './field_items'; import { FIELDS_PANE_WIDTH } from './helpers'; -import { useMountAppended } from '../../utils/use_mount_appended'; +import { useMountAppended } from '../../../common/utils/use_mount_appended'; const selectedCategoryId = 'base'; const selectedCategoryFields = mockBrowserFields[selectedCategoryId].fields; diff --git a/x-pack/plugins/siem/public/components/fields_browser/field_items.tsx b/x-pack/plugins/siem/public/timelines/components/fields_browser/field_items.tsx similarity index 85% rename from x-pack/plugins/siem/public/components/fields_browser/field_items.tsx rename to x-pack/plugins/siem/public/timelines/components/fields_browser/field_items.tsx index 62f9297c38ef5..9abcc909a161f 100644 --- a/x-pack/plugins/siem/public/components/fields_browser/field_items.tsx +++ b/x-pack/plugins/siem/public/timelines/components/fields_browser/field_items.tsx @@ -12,19 +12,27 @@ import React from 'react'; import { Draggable } from 'react-beautiful-dnd'; import styled from 'styled-components'; -import { BrowserField, BrowserFields } from '../../containers/source'; -import { ColumnHeaderOptions } from '../../store/timeline/model'; -import { DragEffects } from '../drag_and_drop/draggable_wrapper'; -import { DroppableWrapper } from '../drag_and_drop/droppable_wrapper'; -import { getDraggableFieldId, getDroppableId, DRAG_TYPE_FIELD } from '../drag_and_drop/helpers'; -import { DraggableFieldBadge } from '../draggables/field_badge'; -import { getEmptyValue } from '../empty_value'; -import { getColumnsWithTimestamp, getExampleText, getIconFromType } from '../event_details/helpers'; -import { SelectableText } from '../selectable_text'; +import { BrowserField, BrowserFields } from '../../../common/containers/source'; +import { ColumnHeaderOptions } from '../../../timelines/store/timeline/model'; +import { DragEffects } from '../../../common/components/drag_and_drop/draggable_wrapper'; +import { DroppableWrapper } from '../../../common/components/drag_and_drop/droppable_wrapper'; +import { + getDraggableFieldId, + getDroppableId, + DRAG_TYPE_FIELD, +} from '../../../common/components/drag_and_drop/helpers'; +import { DraggableFieldBadge } from '../../../common/components/draggables/field_badge'; +import { getEmptyValue } from '../../../common/components/empty_value'; +import { + getColumnsWithTimestamp, + getExampleText, + getIconFromType, +} from '../../../common/components/event_details/helpers'; +import { SelectableText } from '../../../common/components/selectable_text'; import { defaultColumnHeaderType } from '../timeline/body/column_headers/default_headers'; import { DEFAULT_COLUMN_MIN_WIDTH } from '../timeline/body/constants'; import { OnUpdateColumns } from '../timeline/events'; -import { TruncatableText } from '../truncatable_text'; +import { TruncatableText } from '../../../common/components/truncatable_text'; import { FieldName } from './field_name'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/components/fields_browser/field_name.test.tsx b/x-pack/plugins/siem/public/timelines/components/fields_browser/field_name.test.tsx similarity index 91% rename from x-pack/plugins/siem/public/components/fields_browser/field_name.test.tsx rename to x-pack/plugins/siem/public/timelines/components/fields_browser/field_name.test.tsx index 31f1e7678aa45..473dd9eca4d1e 100644 --- a/x-pack/plugins/siem/public/components/fields_browser/field_name.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/fields_browser/field_name.test.tsx @@ -7,9 +7,9 @@ import { mount } from 'enzyme'; import React from 'react'; -import { mockBrowserFields } from '../../containers/source/mock'; -import { TestProviders } from '../../mock'; -import { getColumnsWithTimestamp } from '../event_details/helpers'; +import { mockBrowserFields } from '../../../common/containers/source/mock'; +import { TestProviders } from '../../../common/mock'; +import { getColumnsWithTimestamp } from '../../../common/components/event_details/helpers'; import { FieldName } from './field_name'; diff --git a/x-pack/plugins/siem/public/components/fields_browser/field_name.tsx b/x-pack/plugins/siem/public/timelines/components/fields_browser/field_name.tsx similarity index 93% rename from x-pack/plugins/siem/public/components/fields_browser/field_name.tsx rename to x-pack/plugins/siem/public/timelines/components/fields_browser/field_name.tsx index fc9633b6f8748..4043623f5d4a4 100644 --- a/x-pack/plugins/siem/public/components/fields_browser/field_name.tsx +++ b/x-pack/plugins/siem/public/timelines/components/fields_browser/field_name.tsx @@ -8,13 +8,13 @@ import { EuiButtonIcon, EuiHighlight, EuiIcon, EuiText, EuiToolTip } from '@elas import React, { useCallback, useContext, useState, useMemo } from 'react'; import styled from 'styled-components'; -import { ColumnHeaderOptions } from '../../store/timeline/model'; +import { ColumnHeaderOptions } from '../../../timelines/store/timeline/model'; import { OnUpdateColumns } from '../timeline/events'; import { TimelineContext } from '../timeline/timeline_context'; -import { WithHoverActions } from '../with_hover_actions'; +import { WithHoverActions } from '../../../common/components/with_hover_actions'; import { LoadingSpinner } from './helpers'; import * as i18n from './translations'; -import { DraggableWrapperHoverContent } from '../drag_and_drop/draggable_wrapper_hover_content'; +import { DraggableWrapperHoverContent } from '../../../common/components/drag_and_drop/draggable_wrapper_hover_content'; /** * The name of a (draggable) field diff --git a/x-pack/plugins/siem/public/components/fields_browser/fields_pane.test.tsx b/x-pack/plugins/siem/public/timelines/components/fields_browser/fields_pane.test.tsx similarity index 94% rename from x-pack/plugins/siem/public/components/fields_browser/fields_pane.test.tsx rename to x-pack/plugins/siem/public/timelines/components/fields_browser/fields_pane.test.tsx index f3ec87a96d46b..be77b62d2d0a4 100644 --- a/x-pack/plugins/siem/public/components/fields_browser/fields_pane.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/fields_browser/fields_pane.test.tsx @@ -6,9 +6,9 @@ import React from 'react'; -import { mockBrowserFields } from '../../containers/source/mock'; -import { TestProviders } from '../../mock'; -import { useMountAppended } from '../../utils/use_mount_appended'; +import { mockBrowserFields } from '../../../common/containers/source/mock'; +import { TestProviders } from '../../../common/mock'; +import { useMountAppended } from '../../../common/utils/use_mount_appended'; import { FIELDS_PANE_WIDTH } from './helpers'; import { FieldsPane } from './fields_pane'; diff --git a/x-pack/plugins/siem/public/components/fields_browser/fields_pane.tsx b/x-pack/plugins/siem/public/timelines/components/fields_browser/fields_pane.tsx similarity index 95% rename from x-pack/plugins/siem/public/components/fields_browser/fields_pane.tsx rename to x-pack/plugins/siem/public/timelines/components/fields_browser/fields_pane.tsx index 354b2ae5e5eb8..9829a63101f82 100644 --- a/x-pack/plugins/siem/public/components/fields_browser/fields_pane.tsx +++ b/x-pack/plugins/siem/public/timelines/components/fields_browser/fields_pane.tsx @@ -8,8 +8,8 @@ import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import React from 'react'; import styled from 'styled-components'; -import { BrowserFields } from '../../containers/source'; -import { ColumnHeaderOptions } from '../../store/timeline/model'; +import { BrowserFields } from '../../../common/containers/source'; +import { ColumnHeaderOptions } from '../../../timelines/store/timeline/model'; import { Category } from './category'; import { FieldBrowserProps } from './types'; diff --git a/x-pack/plugins/siem/public/components/fields_browser/header.test.tsx b/x-pack/plugins/siem/public/timelines/components/fields_browser/header.test.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/fields_browser/header.test.tsx rename to x-pack/plugins/siem/public/timelines/components/fields_browser/header.test.tsx index 2abc2fd1046e0..ca05d075e5616 100644 --- a/x-pack/plugins/siem/public/components/fields_browser/header.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/fields_browser/header.test.tsx @@ -6,8 +6,8 @@ import { mount } from 'enzyme'; import React from 'react'; -import { mockBrowserFields } from '../../containers/source/mock'; -import { TestProviders } from '../../mock'; +import { mockBrowserFields } from '../../../common/containers/source/mock'; +import { TestProviders } from '../../../common/mock'; import { defaultHeaders } from '../timeline/body/column_headers/default_headers'; import { Header } from './header'; diff --git a/x-pack/plugins/siem/public/components/fields_browser/header.tsx b/x-pack/plugins/siem/public/timelines/components/fields_browser/header.tsx similarity index 93% rename from x-pack/plugins/siem/public/components/fields_browser/header.tsx rename to x-pack/plugins/siem/public/timelines/components/fields_browser/header.tsx index ccf6ec67521b0..1136b7c8d0dc4 100644 --- a/x-pack/plugins/siem/public/components/fields_browser/header.tsx +++ b/x-pack/plugins/siem/public/timelines/components/fields_browser/header.tsx @@ -15,10 +15,10 @@ import { import React, { useCallback } from 'react'; import styled from 'styled-components'; -import { BrowserFields } from '../../containers/source'; -import { signalsHeaders } from '../../pages/detection_engine/components/signals/default_config'; -import { alertsHeaders } from '../alerts_viewer/default_headers'; -import { defaultHeaders as eventsDefaultHeaders } from '../events_viewer/default_headers'; +import { BrowserFields } from '../../../common/containers/source'; +import { signalsHeaders } from '../../../alerts/components/signals/default_config'; +import { alertsHeaders } from '../../../common/components/alerts_viewer/default_headers'; +import { defaultHeaders as eventsDefaultHeaders } from '../../../common/components/events_viewer/default_headers'; import { defaultHeaders } from '../timeline/body/column_headers/default_headers'; import { OnUpdateColumns } from '../timeline/events'; import { useTimelineTypeContext } from '../timeline/timeline_context'; diff --git a/x-pack/plugins/siem/public/components/fields_browser/helpers.test.tsx b/x-pack/plugins/siem/public/timelines/components/fields_browser/helpers.test.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/fields_browser/helpers.test.tsx rename to x-pack/plugins/siem/public/timelines/components/fields_browser/helpers.test.tsx index db9daacb21fa8..0e1b00dd9b864 100644 --- a/x-pack/plugins/siem/public/components/fields_browser/helpers.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/fields_browser/helpers.test.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { mockBrowserFields } from '../../containers/source/mock'; +import { mockBrowserFields } from '../../../common/containers/source/mock'; import { categoryHasFields, @@ -15,7 +15,7 @@ import { getFieldCount, filterBrowserFieldsByFieldName, } from './helpers'; -import { BrowserFields } from '../../containers/source'; +import { BrowserFields } from '../../../common/containers/source'; const timelineId = 'test'; diff --git a/x-pack/plugins/siem/public/components/fields_browser/helpers.tsx b/x-pack/plugins/siem/public/timelines/components/fields_browser/helpers.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/fields_browser/helpers.tsx rename to x-pack/plugins/siem/public/timelines/components/fields_browser/helpers.tsx index e198d802d8a2e..d176e68bc8414 100644 --- a/x-pack/plugins/siem/public/components/fields_browser/helpers.tsx +++ b/x-pack/plugins/siem/public/timelines/components/fields_browser/helpers.tsx @@ -8,7 +8,7 @@ import { EuiLoadingSpinner } from '@elastic/eui'; import { filter, get, pickBy } from 'lodash/fp'; import styled from 'styled-components'; -import { BrowserField, BrowserFields } from '../../containers/source'; +import { BrowserField, BrowserFields } from '../../../common/containers/source'; import { DEFAULT_CATEGORY_NAME, defaultHeaders, diff --git a/x-pack/plugins/siem/public/components/fields_browser/index.test.tsx b/x-pack/plugins/siem/public/timelines/components/fields_browser/index.test.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/fields_browser/index.test.tsx rename to x-pack/plugins/siem/public/timelines/components/fields_browser/index.test.tsx index 9e513b890e722..798fa53e607ed 100644 --- a/x-pack/plugins/siem/public/components/fields_browser/index.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/fields_browser/index.test.tsx @@ -8,9 +8,9 @@ import { mount } from 'enzyme'; import React from 'react'; import { ActionCreator } from 'typescript-fsa'; -import { mockBrowserFields } from '../../containers/source/mock'; -import { TestProviders } from '../../mock'; -import { ColumnHeaderOptions } from '../../store/timeline/model'; +import { mockBrowserFields } from '../../../common/containers/source/mock'; +import { TestProviders } from '../../../common/mock'; +import { ColumnHeaderOptions } from '../../../timelines/store/timeline/model'; import { FIELD_BROWSER_HEIGHT, FIELD_BROWSER_WIDTH } from './helpers'; diff --git a/x-pack/plugins/siem/public/components/fields_browser/index.tsx b/x-pack/plugins/siem/public/timelines/components/fields_browser/index.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/fields_browser/index.tsx rename to x-pack/plugins/siem/public/timelines/components/fields_browser/index.tsx index 3e19ba383b4ec..11c44cce89956 100644 --- a/x-pack/plugins/siem/public/components/fields_browser/index.tsx +++ b/x-pack/plugins/siem/public/timelines/components/fields_browser/index.tsx @@ -10,9 +10,9 @@ import React, { useEffect, useRef, useState, useCallback, useMemo } from 'react' import { connect, ConnectedProps } from 'react-redux'; import styled from 'styled-components'; -import { BrowserFields } from '../../containers/source'; -import { timelineActions } from '../../store/actions'; -import { ColumnHeaderOptions } from '../../store/timeline/model'; +import { BrowserFields } from '../../../common/containers/source'; +import { timelineActions } from '../../store/timeline'; +import { ColumnHeaderOptions } from '../../../timelines/store/timeline/model'; import { DEFAULT_CATEGORY_NAME } from '../timeline/body/column_headers/default_headers'; import { FieldsBrowser } from './field_browser'; import { filterBrowserFieldsByFieldName, mergeBrowserFieldsWithDefaultCategory } from './helpers'; diff --git a/x-pack/plugins/siem/public/components/fields_browser/translations.ts b/x-pack/plugins/siem/public/timelines/components/fields_browser/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/fields_browser/translations.ts rename to x-pack/plugins/siem/public/timelines/components/fields_browser/translations.ts diff --git a/x-pack/plugins/siem/public/components/fields_browser/types.ts b/x-pack/plugins/siem/public/timelines/components/fields_browser/types.ts similarity index 90% rename from x-pack/plugins/siem/public/components/fields_browser/types.ts rename to x-pack/plugins/siem/public/timelines/components/fields_browser/types.ts index d6b1936fcc52f..2b9889ec13e79 100644 --- a/x-pack/plugins/siem/public/components/fields_browser/types.ts +++ b/x-pack/plugins/siem/public/timelines/components/fields_browser/types.ts @@ -4,8 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import { BrowserFields } from '../../containers/source'; -import { ColumnHeaderOptions } from '../../store/timeline/model'; +import { BrowserFields } from '../../../common/containers/source'; +import { ColumnHeaderOptions } from '../../../timelines/store/timeline/model'; import { OnUpdateColumns } from '../timeline/events'; export type OnFieldSelected = (fieldId: string) => void; diff --git a/x-pack/plugins/siem/public/components/flyout/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/flyout/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/flyout/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/flyout/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/flyout/button/index.tsx b/x-pack/plugins/siem/public/timelines/components/flyout/button/index.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/flyout/button/index.tsx rename to x-pack/plugins/siem/public/timelines/components/flyout/button/index.tsx index d0debbca4dec3..a80b8de435167 100644 --- a/x-pack/plugins/siem/public/components/flyout/button/index.tsx +++ b/x-pack/plugins/siem/public/timelines/components/flyout/button/index.tsx @@ -10,12 +10,11 @@ import { rgba } from 'polished'; import React, { useMemo } from 'react'; import styled from 'styled-components'; -import { WithSource } from '../../../containers/source'; -import { IS_DRAGGING_CLASS_NAME } from '../../drag_and_drop/helpers'; -import { DataProviders } from '../../timeline/data_providers'; +import { WithSource } from '../../../../common/containers/source'; +import { IS_DRAGGING_CLASS_NAME } from '../../../../common/components/drag_and_drop/helpers'; import { DataProvider } from '../../timeline/data_providers/data_provider'; import { flattenIntoAndGroups } from '../../timeline/data_providers/helpers'; - +import { DataProviders } from '../../timeline/data_providers'; import * as i18n from './translations'; export const FLYOUT_BUTTON_CLASS_NAME = 'timeline-flyout-button'; diff --git a/x-pack/plugins/siem/public/components/flyout/button/translations.ts b/x-pack/plugins/siem/public/timelines/components/flyout/button/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/flyout/button/translations.ts rename to x-pack/plugins/siem/public/timelines/components/flyout/button/translations.ts diff --git a/x-pack/plugins/siem/public/components/flyout/header/index.tsx b/x-pack/plugins/siem/public/timelines/components/flyout/header/index.tsx similarity index 87% rename from x-pack/plugins/siem/public/components/flyout/header/index.tsx rename to x-pack/plugins/siem/public/timelines/components/flyout/header/index.tsx index 27a8a83a0850a..b332260597f22 100644 --- a/x-pack/plugins/siem/public/components/flyout/header/index.tsx +++ b/x-pack/plugins/siem/public/timelines/components/flyout/header/index.tsx @@ -9,23 +9,17 @@ import { connect, ConnectedProps } from 'react-redux'; import { Dispatch } from 'redux'; import { isEmpty, get } from 'lodash/fp'; -import { History } from '../../../lib/history'; -import { Note } from '../../../lib/note'; -import { - appSelectors, - inputsModel, - inputsSelectors, - State, - timelineSelectors, -} from '../../../store'; +import { History } from '../../../../common/lib/history'; +import { Note } from '../../../../common/lib/note'; +import { appSelectors, inputsModel, inputsSelectors, State } from '../../../../common/store'; import { defaultHeaders } from '../../timeline/body/column_headers/default_headers'; import { Properties } from '../../timeline/properties'; -import { appActions } from '../../../store/app'; -import { inputsActions } from '../../../store/inputs'; -import { timelineActions } from '../../../store/actions'; -import { TimelineModel } from '../../../store/timeline/model'; -import { timelineDefaults } from '../../../store/timeline/defaults'; -import { InputsModelId } from '../../../store/inputs/constants'; +import { appActions } from '../../../../common/store/app'; +import { inputsActions } from '../../../../common/store/inputs'; +import { timelineActions, timelineSelectors } from '../../../store/timeline'; +import { TimelineModel } from '../../../../timelines/store/timeline/model'; +import { timelineDefaults } from '../../../../timelines/store/timeline/defaults'; +import { InputsModelId } from '../../../../common/store/inputs/constants'; interface OwnProps { timelineId: string; diff --git a/x-pack/plugins/siem/public/components/flyout/header_with_close_button/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/flyout/header_with_close_button/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/flyout/header_with_close_button/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/flyout/header_with_close_button/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/flyout/header_with_close_button/index.test.tsx b/x-pack/plugins/siem/public/timelines/components/flyout/header_with_close_button/index.test.tsx similarity index 95% rename from x-pack/plugins/siem/public/components/flyout/header_with_close_button/index.test.tsx rename to x-pack/plugins/siem/public/timelines/components/flyout/header_with_close_button/index.test.tsx index e0eace2ad5b10..57fd61561c65b 100644 --- a/x-pack/plugins/siem/public/components/flyout/header_with_close_button/index.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/flyout/header_with_close_button/index.test.tsx @@ -7,7 +7,7 @@ import { mount, shallow } from 'enzyme'; import React from 'react'; -import { TestProviders } from '../../../mock'; +import { TestProviders } from '../../../../common/mock'; import { FlyoutHeaderWithCloseButton } from '.'; describe('FlyoutHeaderWithCloseButton', () => { diff --git a/x-pack/plugins/siem/public/components/flyout/header_with_close_button/index.tsx b/x-pack/plugins/siem/public/timelines/components/flyout/header_with_close_button/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/flyout/header_with_close_button/index.tsx rename to x-pack/plugins/siem/public/timelines/components/flyout/header_with_close_button/index.tsx diff --git a/x-pack/plugins/siem/public/components/flyout/header_with_close_button/translations.ts b/x-pack/plugins/siem/public/timelines/components/flyout/header_with_close_button/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/flyout/header_with_close_button/translations.ts rename to x-pack/plugins/siem/public/timelines/components/flyout/header_with_close_button/translations.ts diff --git a/x-pack/plugins/siem/public/components/flyout/index.test.tsx b/x-pack/plugins/siem/public/timelines/components/flyout/index.test.tsx similarity index 90% rename from x-pack/plugins/siem/public/components/flyout/index.test.tsx rename to x-pack/plugins/siem/public/timelines/components/flyout/index.test.tsx index ab41b4617894e..b73f2f943bb0a 100644 --- a/x-pack/plugins/siem/public/components/flyout/index.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/flyout/index.test.tsx @@ -9,8 +9,13 @@ import { set } from 'lodash/fp'; import React from 'react'; import { ActionCreator } from 'typescript-fsa'; -import { apolloClientObservable, mockGlobalState, TestProviders } from '../../mock'; -import { createStore, State } from '../../store'; +import { + apolloClientObservable, + mockGlobalState, + TestProviders, + SUB_PLUGINS_REDUCER, +} from '../../../common/mock'; +import { createStore, State } from '../../../common/store'; import { mockDataProviders } from '../timeline/data_providers/mock/mock_data_providers'; import { Flyout, FlyoutComponent } from '.'; @@ -54,7 +59,11 @@ describe('Flyout', () => { test('it does NOT render the fly out button when its state is set to flyout is true', () => { const stateShowIsTrue = set('timeline.timelineById.test.show', true, state); - const storeShowIsTrue = createStore(stateShowIsTrue, apolloClientObservable); + const storeShowIsTrue = createStore( + stateShowIsTrue, + SUB_PLUGINS_REDUCER, + apolloClientObservable + ); const wrapper = mount( @@ -73,7 +82,11 @@ describe('Flyout', () => { mockDataProviders, state ); - const storeWithDataProviders = createStore(stateWithDataProviders, apolloClientObservable); + const storeWithDataProviders = createStore( + stateWithDataProviders, + SUB_PLUGINS_REDUCER, + apolloClientObservable + ); const wrapper = mount( @@ -90,7 +103,11 @@ describe('Flyout', () => { mockDataProviders, state ); - const storeWithDataProviders = createStore(stateWithDataProviders, apolloClientObservable); + const storeWithDataProviders = createStore( + stateWithDataProviders, + SUB_PLUGINS_REDUCER, + apolloClientObservable + ); const wrapper = mount( @@ -127,7 +144,11 @@ describe('Flyout', () => { mockDataProviders, state ); - const storeWithDataProviders = createStore(stateWithDataProviders, apolloClientObservable); + const storeWithDataProviders = createStore( + stateWithDataProviders, + SUB_PLUGINS_REDUCER, + apolloClientObservable + ); const wrapper = mount( diff --git a/x-pack/plugins/siem/public/components/flyout/index.tsx b/x-pack/plugins/siem/public/timelines/components/flyout/index.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/flyout/index.tsx rename to x-pack/plugins/siem/public/timelines/components/flyout/index.tsx index 404ca4a16e0f1..c556c2d53f7c2 100644 --- a/x-pack/plugins/siem/public/components/flyout/index.tsx +++ b/x-pack/plugins/siem/public/timelines/components/flyout/index.tsx @@ -9,11 +9,11 @@ import React, { useCallback } from 'react'; import { connect, ConnectedProps } from 'react-redux'; import styled from 'styled-components'; -import { State, timelineSelectors } from '../../store'; +import { State } from '../../../common/store'; import { DataProvider } from '../timeline/data_providers/data_provider'; import { FlyoutButton } from './button'; import { Pane } from './pane'; -import { timelineActions } from '../../store/actions'; +import { timelineActions, timelineSelectors } from '../../store/timeline'; import { DEFAULT_TIMELINE_WIDTH } from '../timeline/body/constants'; import { StatefulTimeline } from '../timeline'; import { TimelineById } from '../../store/timeline/types'; diff --git a/x-pack/plugins/siem/public/components/flyout/pane/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/flyout/pane/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/flyout/pane/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/flyout/pane/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/flyout/pane/index.test.tsx b/x-pack/plugins/siem/public/timelines/components/flyout/pane/index.test.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/flyout/pane/index.test.tsx rename to x-pack/plugins/siem/public/timelines/components/flyout/pane/index.test.tsx index 53cf8f95de0ce..29606d7685d97 100644 --- a/x-pack/plugins/siem/public/components/flyout/pane/index.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/flyout/pane/index.test.tsx @@ -7,7 +7,7 @@ import { mount, shallow } from 'enzyme'; import React from 'react'; -import { TestProviders } from '../../../mock'; +import { TestProviders } from '../../../../common/mock'; import { Pane } from '.'; const testFlyoutHeight = 980; diff --git a/x-pack/plugins/siem/public/components/flyout/pane/index.tsx b/x-pack/plugins/siem/public/timelines/components/flyout/pane/index.tsx similarity index 94% rename from x-pack/plugins/siem/public/components/flyout/pane/index.tsx rename to x-pack/plugins/siem/public/timelines/components/flyout/pane/index.tsx index 3b5041c1ee346..33aca80b940fe 100644 --- a/x-pack/plugins/siem/public/components/flyout/pane/index.tsx +++ b/x-pack/plugins/siem/public/timelines/components/flyout/pane/index.tsx @@ -11,10 +11,10 @@ import styled from 'styled-components'; import { Resizable, ResizeCallback } from 're-resizable'; import { TimelineResizeHandle } from './timeline_resize_handle'; -import { EventDetailsWidthProvider } from '../../events_viewer/event_details_width_context'; +import { EventDetailsWidthProvider } from '../../../../common/components/events_viewer/event_details_width_context'; import * as i18n from './translations'; -import { timelineActions } from '../../../store/actions'; +import { timelineActions } from '../../../store/timeline'; const minWidthPixels = 550; // do not allow the flyout to shrink below this width (pixels) const maxWidthPercent = 95; // do not allow the flyout to grow past this percentage of the view diff --git a/x-pack/plugins/siem/public/components/flyout/pane/timeline_resize_handle.tsx b/x-pack/plugins/siem/public/timelines/components/flyout/pane/timeline_resize_handle.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/flyout/pane/timeline_resize_handle.tsx rename to x-pack/plugins/siem/public/timelines/components/flyout/pane/timeline_resize_handle.tsx diff --git a/x-pack/plugins/siem/public/components/flyout/pane/translations.ts b/x-pack/plugins/siem/public/timelines/components/flyout/pane/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/flyout/pane/translations.ts rename to x-pack/plugins/siem/public/timelines/components/flyout/pane/translations.ts diff --git a/x-pack/plugins/siem/public/components/formatted_duration/helpers.test.ts b/x-pack/plugins/siem/public/timelines/components/formatted_duration/helpers.test.ts similarity index 99% rename from x-pack/plugins/siem/public/components/formatted_duration/helpers.test.ts rename to x-pack/plugins/siem/public/timelines/components/formatted_duration/helpers.test.ts index 30254c49c9f3b..dcf77f06defe3 100644 --- a/x-pack/plugins/siem/public/components/formatted_duration/helpers.test.ts +++ b/x-pack/plugins/siem/public/timelines/components/formatted_duration/helpers.test.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { getEmptyValue } from '../empty_value'; +import { getEmptyValue } from '../../../common/components/empty_value'; import { getFormattedDurationString, getHumanizedDuration, diff --git a/x-pack/plugins/siem/public/components/formatted_duration/helpers.tsx b/x-pack/plugins/siem/public/timelines/components/formatted_duration/helpers.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/formatted_duration/helpers.tsx rename to x-pack/plugins/siem/public/timelines/components/formatted_duration/helpers.tsx index 44bd76bc6beb0..113ed70776034 100644 --- a/x-pack/plugins/siem/public/components/formatted_duration/helpers.tsx +++ b/x-pack/plugins/siem/public/timelines/components/formatted_duration/helpers.tsx @@ -6,7 +6,7 @@ import moment from 'moment'; -import { getEmptyValue } from '../empty_value'; +import { getEmptyValue } from '../../../common/components/empty_value'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/components/formatted_duration/index.tsx b/x-pack/plugins/siem/public/timelines/components/formatted_duration/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/formatted_duration/index.tsx rename to x-pack/plugins/siem/public/timelines/components/formatted_duration/index.tsx diff --git a/x-pack/plugins/siem/public/components/formatted_duration/tooltip/index.tsx b/x-pack/plugins/siem/public/timelines/components/formatted_duration/tooltip/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/formatted_duration/tooltip/index.tsx rename to x-pack/plugins/siem/public/timelines/components/formatted_duration/tooltip/index.tsx diff --git a/x-pack/plugins/siem/public/components/formatted_duration/translations.ts b/x-pack/plugins/siem/public/timelines/components/formatted_duration/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/formatted_duration/translations.ts rename to x-pack/plugins/siem/public/timelines/components/formatted_duration/translations.ts diff --git a/x-pack/plugins/siem/public/components/formatted_ip/index.tsx b/x-pack/plugins/siem/public/timelines/components/formatted_ip/index.tsx similarity index 86% rename from x-pack/plugins/siem/public/components/formatted_ip/index.tsx rename to x-pack/plugins/siem/public/timelines/components/formatted_ip/index.tsx index ba97e8d61451c..e3a722214d472 100644 --- a/x-pack/plugins/siem/public/components/formatted_ip/index.tsx +++ b/x-pack/plugins/siem/public/timelines/components/formatted_ip/index.tsx @@ -7,13 +7,19 @@ import { isArray, isEmpty, isString, uniq } from 'lodash/fp'; import React from 'react'; -import { DragEffects, DraggableWrapper } from '../drag_and_drop/draggable_wrapper'; -import { escapeDataProviderId } from '../drag_and_drop/helpers'; -import { getOrEmptyTagFromValue } from '../empty_value'; -import { IPDetailsLink } from '../links'; -import { parseQueryValue } from '../timeline/body/renderers/parse_query_value'; -import { DataProvider, IS_OPERATOR } from '../timeline/data_providers/data_provider'; -import { Provider } from '../timeline/data_providers/provider'; +import { + DragEffects, + DraggableWrapper, +} from '../../../common/components/drag_and_drop/draggable_wrapper'; +import { escapeDataProviderId } from '../../../common/components/drag_and_drop/helpers'; +import { getOrEmptyTagFromValue } from '../../../common/components/empty_value'; +import { IPDetailsLink } from '../../../common/components/links'; +import { parseQueryValue } from '../../../timelines/components/timeline/body/renderers/parse_query_value'; +import { + DataProvider, + IS_OPERATOR, +} from '../../../timelines/components/timeline/data_providers/data_provider'; +import { Provider } from '../../../timelines/components/timeline/data_providers/provider'; const getUniqueId = ({ contextId, diff --git a/x-pack/plugins/siem/public/components/ja3_fingerprint/index.test.tsx b/x-pack/plugins/siem/public/timelines/components/ja3_fingerprint/index.test.tsx similarity index 93% rename from x-pack/plugins/siem/public/components/ja3_fingerprint/index.test.tsx rename to x-pack/plugins/siem/public/timelines/components/ja3_fingerprint/index.test.tsx index c4ea6ff63a0a7..4ca1e7cc1bad4 100644 --- a/x-pack/plugins/siem/public/components/ja3_fingerprint/index.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/ja3_fingerprint/index.test.tsx @@ -6,8 +6,8 @@ import React from 'react'; -import { TestProviders } from '../../mock'; -import { useMountAppended } from '../../utils/use_mount_appended'; +import { TestProviders } from '../../../common/mock'; +import { useMountAppended } from '../../../common/utils/use_mount_appended'; import { Ja3Fingerprint } from '.'; diff --git a/x-pack/plugins/siem/public/components/ja3_fingerprint/index.tsx b/x-pack/plugins/siem/public/timelines/components/ja3_fingerprint/index.tsx similarity index 86% rename from x-pack/plugins/siem/public/components/ja3_fingerprint/index.tsx rename to x-pack/plugins/siem/public/timelines/components/ja3_fingerprint/index.tsx index 955a57576dc8e..2bb4e7471eba8 100644 --- a/x-pack/plugins/siem/public/components/ja3_fingerprint/index.tsx +++ b/x-pack/plugins/siem/public/timelines/components/ja3_fingerprint/index.tsx @@ -7,9 +7,9 @@ import React from 'react'; import styled from 'styled-components'; -import { DraggableBadge } from '../draggables'; -import { ExternalLinkIcon } from '../external_link_icon'; -import { Ja3FingerprintLink } from '../links'; +import { DraggableBadge } from '../../../common/components/draggables'; +import { ExternalLinkIcon } from '../../../common/components/external_link_icon'; +import { Ja3FingerprintLink } from '../../../common/components/links'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/components/ja3_fingerprint/translations.ts b/x-pack/plugins/siem/public/timelines/components/ja3_fingerprint/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/ja3_fingerprint/translations.ts rename to x-pack/plugins/siem/public/timelines/components/ja3_fingerprint/translations.ts diff --git a/x-pack/plugins/siem/public/components/lazy_accordion/index.tsx b/x-pack/plugins/siem/public/timelines/components/lazy_accordion/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/lazy_accordion/index.tsx rename to x-pack/plugins/siem/public/timelines/components/lazy_accordion/index.tsx diff --git a/x-pack/plugins/siem/public/components/loading/index.tsx b/x-pack/plugins/siem/public/timelines/components/loading/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/loading/index.tsx rename to x-pack/plugins/siem/public/timelines/components/loading/index.tsx diff --git a/x-pack/plugins/siem/public/components/netflow/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/netflow/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/netflow/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/netflow/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/netflow/fingerprints/index.tsx b/x-pack/plugins/siem/public/timelines/components/netflow/fingerprints/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/netflow/fingerprints/index.tsx rename to x-pack/plugins/siem/public/timelines/components/netflow/fingerprints/index.tsx diff --git a/x-pack/plugins/siem/public/components/netflow/index.test.tsx b/x-pack/plugins/siem/public/timelines/components/netflow/index.test.tsx similarity index 95% rename from x-pack/plugins/siem/public/components/netflow/index.test.tsx rename to x-pack/plugins/siem/public/timelines/components/netflow/index.test.tsx index ecf162ebf2739..0a6d2f8ab3178 100644 --- a/x-pack/plugins/siem/public/components/netflow/index.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/netflow/index.test.tsx @@ -8,18 +8,21 @@ import { get } from 'lodash/fp'; import React from 'react'; import { shallow } from 'enzyme'; -import { asArrayIfExists } from '../../lib/helpers'; -import { getMockNetflowData } from '../../mock'; -import { TestProviders } from '../../mock/test_providers'; +import { asArrayIfExists } from '../../../common/lib/helpers'; +import { getMockNetflowData } from '../../../common/mock'; +import { TestProviders } from '../../../common/mock/test_providers'; import { TLS_CLIENT_CERTIFICATE_FINGERPRINT_SHA1_FIELD_NAME, TLS_SERVER_CERTIFICATE_FINGERPRINT_SHA1_FIELD_NAME, } from '../certificate_fingerprint'; import { EVENT_DURATION_FIELD_NAME } from '../duration'; -import { ID_FIELD_NAME } from '../event_details/event_id'; -import { DESTINATION_IP_FIELD_NAME, SOURCE_IP_FIELD_NAME } from '../ip'; +import { ID_FIELD_NAME } from '../../../common/components/event_details/event_id'; +import { DESTINATION_IP_FIELD_NAME, SOURCE_IP_FIELD_NAME } from '../../../network/components/ip'; import { JA3_HASH_FIELD_NAME } from '../ja3_fingerprint'; -import { DESTINATION_PORT_FIELD_NAME, SOURCE_PORT_FIELD_NAME } from '../port'; +import { + DESTINATION_PORT_FIELD_NAME, + SOURCE_PORT_FIELD_NAME, +} from '../../../network/components/port'; import { DESTINATION_GEO_CITY_NAME_FIELD_NAME, DESTINATION_GEO_CONTINENT_NAME_FIELD_NAME, @@ -31,13 +34,13 @@ import { SOURCE_GEO_COUNTRY_ISO_CODE_FIELD_NAME, SOURCE_GEO_COUNTRY_NAME_FIELD_NAME, SOURCE_GEO_REGION_NAME_FIELD_NAME, -} from '../source_destination/geo_fields'; +} from '../../../network/components/source_destination/geo_fields'; import { DESTINATION_BYTES_FIELD_NAME, DESTINATION_PACKETS_FIELD_NAME, SOURCE_BYTES_FIELD_NAME, SOURCE_PACKETS_FIELD_NAME, -} from '../source_destination/source_destination_arrows'; +} from '../../../network/components/source_destination/source_destination_arrows'; import * as i18n from '../timeline/body/renderers/translations'; import { Netflow } from '.'; @@ -53,8 +56,8 @@ import { NETWORK_PACKETS_FIELD_NAME, NETWORK_PROTOCOL_FIELD_NAME, NETWORK_TRANSPORT_FIELD_NAME, -} from '../source_destination/field_names'; -import { useMountAppended } from '../../utils/use_mount_appended'; +} from '../../../network/components/source_destination/field_names'; +import { useMountAppended } from '../../../common/utils/use_mount_appended'; const getNetflowInstance = () => ( void; diff --git a/x-pack/plugins/siem/public/components/notes/index.tsx b/x-pack/plugins/siem/public/timelines/components/notes/index.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/notes/index.tsx rename to x-pack/plugins/siem/public/timelines/components/notes/index.tsx index b5fef9a5e4d41..42f28f0340679 100644 --- a/x-pack/plugins/siem/public/components/notes/index.tsx +++ b/x-pack/plugins/siem/public/timelines/components/notes/index.tsx @@ -15,7 +15,7 @@ import { import React, { useState } from 'react'; import styled from 'styled-components'; -import { Note } from '../../lib/note'; +import { Note } from '../../../common/lib/note'; import { AddNote } from './add_note'; import { columns } from './columns'; diff --git a/x-pack/plugins/siem/public/components/notes/note_card/__snapshots__/note_card_body.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/notes/note_card/__snapshots__/note_card_body.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/notes/note_card/__snapshots__/note_card_body.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/notes/note_card/__snapshots__/note_card_body.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/notes/note_card/index.test.tsx b/x-pack/plugins/siem/public/timelines/components/notes/note_card/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/notes/note_card/index.test.tsx rename to x-pack/plugins/siem/public/timelines/components/notes/note_card/index.test.tsx diff --git a/x-pack/plugins/siem/public/components/notes/note_card/index.tsx b/x-pack/plugins/siem/public/timelines/components/notes/note_card/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/notes/note_card/index.tsx rename to x-pack/plugins/siem/public/timelines/components/notes/note_card/index.tsx diff --git a/x-pack/plugins/siem/public/components/notes/note_card/note_card_body.test.tsx b/x-pack/plugins/siem/public/timelines/components/notes/note_card/note_card_body.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/notes/note_card/note_card_body.test.tsx rename to x-pack/plugins/siem/public/timelines/components/notes/note_card/note_card_body.test.tsx diff --git a/x-pack/plugins/siem/public/components/notes/note_card/note_card_body.tsx b/x-pack/plugins/siem/public/timelines/components/notes/note_card/note_card_body.tsx similarity index 82% rename from x-pack/plugins/siem/public/components/notes/note_card/note_card_body.tsx rename to x-pack/plugins/siem/public/timelines/components/notes/note_card/note_card_body.tsx index 4463f8d4ff602..f846ead810ff2 100644 --- a/x-pack/plugins/siem/public/components/notes/note_card/note_card_body.tsx +++ b/x-pack/plugins/siem/public/timelines/components/notes/note_card/note_card_body.tsx @@ -8,9 +8,9 @@ import { EuiPanel, EuiToolTip } from '@elastic/eui'; import React, { useCallback, useMemo } from 'react'; import styled from 'styled-components'; -import { WithCopyToClipboard } from '../../../lib/clipboard/with_copy_to_clipboard'; -import { Markdown } from '../../markdown'; -import { WithHoverActions } from '../../with_hover_actions'; +import { WithCopyToClipboard } from '../../../../common/lib/clipboard/with_copy_to_clipboard'; +import { Markdown } from '../../../../common/components/markdown'; +import { WithHoverActions } from '../../../../common/components/with_hover_actions'; import * as i18n from '../translations'; const BodyContainer = styled(EuiPanel)` diff --git a/x-pack/plugins/siem/public/components/notes/note_card/note_card_header.test.tsx b/x-pack/plugins/siem/public/timelines/components/notes/note_card/note_card_header.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/notes/note_card/note_card_header.test.tsx rename to x-pack/plugins/siem/public/timelines/components/notes/note_card/note_card_header.test.tsx diff --git a/x-pack/plugins/siem/public/components/notes/note_card/note_card_header.tsx b/x-pack/plugins/siem/public/timelines/components/notes/note_card/note_card_header.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/notes/note_card/note_card_header.tsx rename to x-pack/plugins/siem/public/timelines/components/notes/note_card/note_card_header.tsx diff --git a/x-pack/plugins/siem/public/components/notes/note_card/note_created.test.tsx b/x-pack/plugins/siem/public/timelines/components/notes/note_card/note_created.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/notes/note_card/note_created.test.tsx rename to x-pack/plugins/siem/public/timelines/components/notes/note_card/note_created.test.tsx diff --git a/x-pack/plugins/siem/public/components/notes/note_card/note_created.tsx b/x-pack/plugins/siem/public/timelines/components/notes/note_card/note_created.tsx similarity index 89% rename from x-pack/plugins/siem/public/components/notes/note_card/note_created.tsx rename to x-pack/plugins/siem/public/timelines/components/notes/note_card/note_created.tsx index cdd0406c71450..dc97373660bd1 100644 --- a/x-pack/plugins/siem/public/components/notes/note_card/note_created.tsx +++ b/x-pack/plugins/siem/public/timelines/components/notes/note_card/note_created.tsx @@ -8,7 +8,7 @@ import { FormattedRelative } from '@kbn/i18n/react'; import React from 'react'; import styled from 'styled-components'; -import { LocalizedDateTooltip } from '../../localized_date_tooltip'; +import { LocalizedDateTooltip } from '../../../../common/components/localized_date_tooltip'; const NoteCreatedContainer = styled.span` user-select: none; diff --git a/x-pack/plugins/siem/public/components/notes/note_cards/index.test.tsx b/x-pack/plugins/siem/public/timelines/components/notes/note_cards/index.test.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/notes/note_cards/index.test.tsx rename to x-pack/plugins/siem/public/timelines/components/notes/note_cards/index.test.tsx index f70e841d1eefd..fa63eb625f283 100644 --- a/x-pack/plugins/siem/public/components/notes/note_cards/index.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/notes/note_cards/index.test.tsx @@ -9,7 +9,7 @@ import { mountWithIntl } from 'test_utils/enzyme_helpers'; import { ThemeProvider } from 'styled-components'; import euiDarkVars from '@elastic/eui/dist/eui_theme_dark.json'; -import { Note } from '../../../lib/note'; +import { Note } from '../../../../common/lib/note'; import { NoteCards } from '.'; diff --git a/x-pack/plugins/siem/public/components/notes/note_cards/index.tsx b/x-pack/plugins/siem/public/timelines/components/notes/note_cards/index.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/notes/note_cards/index.tsx rename to x-pack/plugins/siem/public/timelines/components/notes/note_cards/index.tsx index 6664660eb6bdc..346d77b14cd90 100644 --- a/x-pack/plugins/siem/public/components/notes/note_cards/index.tsx +++ b/x-pack/plugins/siem/public/timelines/components/notes/note_cards/index.tsx @@ -8,7 +8,7 @@ import { EuiFlexGroup, EuiPanel } from '@elastic/eui'; import React, { useState, useCallback } from 'react'; import styled from 'styled-components'; -import { Note } from '../../../lib/note'; +import { Note } from '../../../../common/lib/note'; import { AddNote } from '../add_note'; import { AssociateNote, GetNewNoteId, UpdateNote } from '../helpers'; import { NoteCard } from '../note_card'; diff --git a/x-pack/plugins/siem/public/components/notes/translations.ts b/x-pack/plugins/siem/public/timelines/components/notes/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/notes/translations.ts rename to x-pack/plugins/siem/public/timelines/components/notes/translations.ts diff --git a/x-pack/plugins/siem/public/components/open_timeline/constants.ts b/x-pack/plugins/siem/public/timelines/components/open_timeline/constants.ts similarity index 100% rename from x-pack/plugins/siem/public/components/open_timeline/constants.ts rename to x-pack/plugins/siem/public/timelines/components/open_timeline/constants.ts diff --git a/x-pack/plugins/siem/public/components/open_timeline/delete_timeline_modal/delete_timeline_modal.test.tsx b/x-pack/plugins/siem/public/timelines/components/open_timeline/delete_timeline_modal/delete_timeline_modal.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/open_timeline/delete_timeline_modal/delete_timeline_modal.test.tsx rename to x-pack/plugins/siem/public/timelines/components/open_timeline/delete_timeline_modal/delete_timeline_modal.test.tsx diff --git a/x-pack/plugins/siem/public/components/open_timeline/delete_timeline_modal/delete_timeline_modal.tsx b/x-pack/plugins/siem/public/timelines/components/open_timeline/delete_timeline_modal/delete_timeline_modal.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/open_timeline/delete_timeline_modal/delete_timeline_modal.tsx rename to x-pack/plugins/siem/public/timelines/components/open_timeline/delete_timeline_modal/delete_timeline_modal.tsx diff --git a/x-pack/plugins/siem/public/components/open_timeline/delete_timeline_modal/index.test.tsx b/x-pack/plugins/siem/public/timelines/components/open_timeline/delete_timeline_modal/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/open_timeline/delete_timeline_modal/index.test.tsx rename to x-pack/plugins/siem/public/timelines/components/open_timeline/delete_timeline_modal/index.test.tsx diff --git a/x-pack/plugins/siem/public/components/open_timeline/delete_timeline_modal/index.tsx b/x-pack/plugins/siem/public/timelines/components/open_timeline/delete_timeline_modal/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/open_timeline/delete_timeline_modal/index.tsx rename to x-pack/plugins/siem/public/timelines/components/open_timeline/delete_timeline_modal/index.tsx diff --git a/x-pack/plugins/siem/public/components/open_timeline/edit_timeline_actions.tsx b/x-pack/plugins/siem/public/timelines/components/open_timeline/edit_timeline_actions.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/open_timeline/edit_timeline_actions.tsx rename to x-pack/plugins/siem/public/timelines/components/open_timeline/edit_timeline_actions.tsx diff --git a/x-pack/plugins/siem/public/components/open_timeline/edit_timeline_batch_actions.tsx b/x-pack/plugins/siem/public/timelines/components/open_timeline/edit_timeline_batch_actions.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/open_timeline/edit_timeline_batch_actions.tsx rename to x-pack/plugins/siem/public/timelines/components/open_timeline/edit_timeline_batch_actions.tsx diff --git a/x-pack/plugins/siem/public/components/open_timeline/export_timeline/export_timeline.test.tsx b/x-pack/plugins/siem/public/timelines/components/open_timeline/export_timeline/export_timeline.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/open_timeline/export_timeline/export_timeline.test.tsx rename to x-pack/plugins/siem/public/timelines/components/open_timeline/export_timeline/export_timeline.test.tsx diff --git a/x-pack/plugins/siem/public/components/open_timeline/export_timeline/export_timeline.tsx b/x-pack/plugins/siem/public/timelines/components/open_timeline/export_timeline/export_timeline.tsx similarity index 90% rename from x-pack/plugins/siem/public/components/open_timeline/export_timeline/export_timeline.tsx rename to x-pack/plugins/siem/public/timelines/components/open_timeline/export_timeline/export_timeline.tsx index ebfd5c18bd5dc..43ef3bccbea56 100644 --- a/x-pack/plugins/siem/public/components/open_timeline/export_timeline/export_timeline.tsx +++ b/x-pack/plugins/siem/public/timelines/components/open_timeline/export_timeline/export_timeline.tsx @@ -6,9 +6,12 @@ import React, { useCallback } from 'react'; import uuid from 'uuid'; -import { GenericDownloader, ExportSelectedData } from '../../generic_downloader'; +import { + GenericDownloader, + ExportSelectedData, +} from '../../../../common/components/generic_downloader'; import * as i18n from '../translations'; -import { useStateToaster } from '../../toasters'; +import { useStateToaster } from '../../../../common/components/toasters'; const ExportTimeline: React.FC<{ exportedIds: string[] | undefined; diff --git a/x-pack/plugins/siem/public/components/open_timeline/export_timeline/index.test.tsx b/x-pack/plugins/siem/public/timelines/components/open_timeline/export_timeline/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/open_timeline/export_timeline/index.test.tsx rename to x-pack/plugins/siem/public/timelines/components/open_timeline/export_timeline/index.test.tsx diff --git a/x-pack/plugins/siem/public/components/open_timeline/export_timeline/index.tsx b/x-pack/plugins/siem/public/timelines/components/open_timeline/export_timeline/index.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/open_timeline/export_timeline/index.tsx rename to x-pack/plugins/siem/public/timelines/components/open_timeline/export_timeline/index.tsx index 12cf952bb1ff8..7bac3229c8173 100644 --- a/x-pack/plugins/siem/public/components/open_timeline/export_timeline/index.tsx +++ b/x-pack/plugins/siem/public/timelines/components/open_timeline/export_timeline/index.tsx @@ -9,7 +9,7 @@ import { DeleteTimelines } from '../types'; import { TimelineDownloader } from './export_timeline'; import { DeleteTimelineModalOverlay } from '../delete_timeline_modal'; -import { exportSelectedTimeline } from '../../../containers/timeline/api'; +import { exportSelectedTimeline } from '../../../containers/api'; export interface ExportTimeline { disableExportTimelineDownloader: () => void; diff --git a/x-pack/plugins/siem/public/components/open_timeline/export_timeline/mocks.ts b/x-pack/plugins/siem/public/timelines/components/open_timeline/export_timeline/mocks.ts similarity index 100% rename from x-pack/plugins/siem/public/components/open_timeline/export_timeline/mocks.ts rename to x-pack/plugins/siem/public/timelines/components/open_timeline/export_timeline/mocks.ts diff --git a/x-pack/plugins/siem/public/components/open_timeline/helpers.test.ts b/x-pack/plugins/siem/public/timelines/components/open_timeline/helpers.test.ts similarity index 97% rename from x-pack/plugins/siem/public/components/open_timeline/helpers.test.ts rename to x-pack/plugins/siem/public/timelines/components/open_timeline/helpers.test.ts index a7c0b08fc8a21..e6db9df61b902 100644 --- a/x-pack/plugins/siem/public/components/open_timeline/helpers.test.ts +++ b/x-pack/plugins/siem/public/timelines/components/open_timeline/helpers.test.ts @@ -10,19 +10,19 @@ import { mockTimelineResults, mockTimelineResult, mockTimelineModel, -} from '../../mock/timeline_results'; -import { timelineDefaults } from '../../store/timeline/defaults'; -import { setTimelineRangeDatePicker as dispatchSetTimelineRangeDatePicker } from '../../store/inputs/actions'; +} from '../../../common/mock/timeline_results'; +import { timelineDefaults } from '../../../timelines/store/timeline/defaults'; +import { setTimelineRangeDatePicker as dispatchSetTimelineRangeDatePicker } from '../../../common/store/inputs/actions'; import { setKqlFilterQueryDraft as dispatchSetKqlFilterQueryDraft, applyKqlFilterQuery as dispatchApplyKqlFilterQuery, addTimeline as dispatchAddTimeline, addNote as dispatchAddGlobalTimelineNote, -} from '../../store/timeline/actions'; +} from '../../../timelines/store/timeline/actions'; import { addNotes as dispatchAddNotes, updateNote as dispatchUpdateNote, -} from '../../store/app/actions'; +} from '../../../common/store/app/actions'; import { defaultTimelineToTimelineModel, getNotesCount, @@ -32,15 +32,15 @@ import { dispatchUpdateTimeline, } from './helpers'; import { OpenTimelineResult, DispatchUpdateTimeline } from './types'; -import { KueryFilterQueryKind } from '../../store/model'; -import { Note } from '../../lib/note'; +import { KueryFilterQueryKind } from '../../../common/store/model'; +import { Note } from '../../../common/lib/note'; import moment from 'moment'; import sinon from 'sinon'; -import { TimelineType } from '../../../common/types/timeline'; +import { TimelineType } from '../../../../common/types/timeline'; -jest.mock('../../store/inputs/actions'); -jest.mock('../../store/timeline/actions'); -jest.mock('../../store/app/actions'); +jest.mock('../../../common/store/inputs/actions'); +jest.mock('../../../timelines/store/timeline/actions'); +jest.mock('../../../common/store/app/actions'); jest.mock('uuid', () => { return { v1: jest.fn(() => 'uuid.v1()'), diff --git a/x-pack/plugins/siem/public/components/open_timeline/helpers.ts b/x-pack/plugins/siem/public/timelines/components/open_timeline/helpers.ts similarity index 95% rename from x-pack/plugins/siem/public/components/open_timeline/helpers.ts rename to x-pack/plugins/siem/public/timelines/components/open_timeline/helpers.ts index 681d39feb09f8..df433f147490e 100644 --- a/x-pack/plugins/siem/public/components/open_timeline/helpers.ts +++ b/x-pack/plugins/siem/public/timelines/components/open_timeline/helpers.ts @@ -9,23 +9,22 @@ import { getOr, set, isEmpty } from 'lodash/fp'; import { Action } from 'typescript-fsa'; import uuid from 'uuid'; import { Dispatch } from 'redux'; - -import { oneTimelineQuery } from '../../containers/timeline/one/index.gql_query'; -import { TimelineResult, GetOneTimeline, NoteResult } from '../../graphql/types'; +import { oneTimelineQuery } from '../../containers/one/index.gql_query'; +import { TimelineResult, GetOneTimeline, NoteResult } from '../../../graphql/types'; import { addNotes as dispatchAddNotes, updateNote as dispatchUpdateNote, -} from '../../store/app/actions'; -import { setTimelineRangeDatePicker as dispatchSetTimelineRangeDatePicker } from '../../store/inputs/actions'; +} from '../../../common/store/app/actions'; +import { setTimelineRangeDatePicker as dispatchSetTimelineRangeDatePicker } from '../../../common/store/inputs/actions'; import { setKqlFilterQueryDraft as dispatchSetKqlFilterQueryDraft, applyKqlFilterQuery as dispatchApplyKqlFilterQuery, addTimeline as dispatchAddTimeline, addNote as dispatchAddGlobalTimelineNote, -} from '../../store/timeline/actions'; +} from '../../../timelines/store/timeline/actions'; -import { ColumnHeaderOptions, TimelineModel } from '../../store/timeline/model'; -import { timelineDefaults } from '../../store/timeline/defaults'; +import { ColumnHeaderOptions, TimelineModel } from '../../../timelines/store/timeline/model'; +import { timelineDefaults } from '../../../timelines/store/timeline/defaults'; import { defaultColumnHeaderType, defaultHeaders, @@ -36,7 +35,7 @@ import { } from '../timeline/body/constants'; import { OpenTimelineResult, UpdateTimeline, DispatchUpdateTimeline } from './types'; -import { getTimeRangeSettings } from '../../utils/default_date_settings'; +import { getTimeRangeSettings } from '../../../common/utils/default_date_settings'; import { createNote } from '../notes/helpers'; export const OPEN_TIMELINE_CLASS_NAME = 'open-timeline'; diff --git a/x-pack/plugins/siem/public/components/open_timeline/index.test.tsx b/x-pack/plugins/siem/public/timelines/components/open_timeline/index.test.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/open_timeline/index.test.tsx rename to x-pack/plugins/siem/public/timelines/components/open_timeline/index.test.tsx index 731c6d1ca9806..52197b92bdfb1 100644 --- a/x-pack/plugins/siem/public/components/open_timeline/index.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/open_timeline/index.test.tsx @@ -10,20 +10,20 @@ import { MockedProvider } from 'react-apollo/test-utils'; import React from 'react'; import { ThemeProvider } from 'styled-components'; -import { wait } from '../../lib/helpers'; -import { TestProviderWithoutDragAndDrop, apolloClient } from '../../mock/test_providers'; -import { mockOpenTimelineQueryResults } from '../../mock/timeline_results'; -import { DEFAULT_SEARCH_RESULTS_PER_PAGE } from '../../pages/timelines/timelines_page'; +import { wait } from '../../../common/lib/helpers'; +import { TestProviderWithoutDragAndDrop, apolloClient } from '../../../common/mock/test_providers'; +import { mockOpenTimelineQueryResults } from '../../../common/mock/timeline_results'; +import { DEFAULT_SEARCH_RESULTS_PER_PAGE } from '../../pages/timelines_page'; import { NotePreviews } from './note_previews'; import { OPEN_TIMELINE_CLASS_NAME } from './helpers'; import { TimelineTabsStyle } from './types'; import { StatefulOpenTimeline } from '.'; -import { useGetAllTimeline, getAllTimeline } from '../../containers/timeline/all'; -jest.mock('../../lib/kibana'); -jest.mock('../../containers/timeline/all', () => { - const originalModule = jest.requireActual('../../containers/timeline/all'); +import { useGetAllTimeline, getAllTimeline } from '../../containers/all'; +jest.mock('../../../common/lib/kibana'); +jest.mock('../../containers/all', () => { + const originalModule = jest.requireActual('../../containers/all'); return { ...originalModule, useGetAllTimeline: jest.fn(), diff --git a/x-pack/plugins/siem/public/components/open_timeline/index.tsx b/x-pack/plugins/siem/public/timelines/components/open_timeline/index.tsx similarity index 95% rename from x-pack/plugins/siem/public/components/open_timeline/index.tsx rename to x-pack/plugins/siem/public/timelines/components/open_timeline/index.tsx index ed22673f07a78..735ccdd19a561 100644 --- a/x-pack/plugins/siem/public/components/open_timeline/index.tsx +++ b/x-pack/plugins/siem/public/timelines/components/open_timeline/index.tsx @@ -9,18 +9,18 @@ import React, { useEffect, useState, useCallback } from 'react'; import { connect, ConnectedProps } from 'react-redux'; import { Dispatch } from 'redux'; - -import { defaultHeaders } from '../../components/timeline/body/column_headers/default_headers'; -import { deleteTimelineMutation } from '../../containers/timeline/delete/persist.gql_query'; -import { useGetAllTimeline } from '../../containers/timeline/all'; -import { DeleteTimelineMutation, SortFieldTimeline, Direction } from '../../graphql/types'; -import { State, timelineSelectors } from '../../store'; -import { ColumnHeaderOptions, TimelineModel } from '../../store/timeline/model'; -import { timelineDefaults } from '../../store/timeline/defaults'; +import { defaultHeaders } from '../timeline/body/column_headers/default_headers'; +import { deleteTimelineMutation } from '../../containers/delete/persist.gql_query'; +import { useGetAllTimeline } from '../../containers/all'; +import { DeleteTimelineMutation, SortFieldTimeline, Direction } from '../../../graphql/types'; +import { State } from '../../../common/store'; +import { ColumnHeaderOptions, TimelineModel } from '../../../timelines/store/timeline/model'; +import { timelineSelectors } from '../../../timelines/store/timeline'; +import { timelineDefaults } from '../../../timelines/store/timeline/defaults'; import { createTimeline as dispatchCreateNewTimeline, updateIsLoading as dispatchUpdateIsLoading, -} from '../../store/timeline/actions'; +} from '../../../timelines/store/timeline/actions'; import { OpenTimeline } from './open_timeline'; import { OPEN_TIMELINE_CLASS_NAME, queryTimelineById, dispatchUpdateTimeline } from './helpers'; import { OpenTimelineModalBody } from './open_timeline_modal/open_timeline_modal_body'; diff --git a/x-pack/plugins/siem/public/components/open_timeline/note_previews/index.test.tsx b/x-pack/plugins/siem/public/timelines/components/open_timeline/note_previews/index.test.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/open_timeline/note_previews/index.test.tsx rename to x-pack/plugins/siem/public/timelines/components/open_timeline/note_previews/index.test.tsx index 463111bd9735f..318e50bb67d2d 100644 --- a/x-pack/plugins/siem/public/components/open_timeline/note_previews/index.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/open_timeline/note_previews/index.test.tsx @@ -11,7 +11,7 @@ import { mountWithIntl } from 'test_utils/enzyme_helpers'; import React from 'react'; import { ThemeProvider } from 'styled-components'; -import { mockTimelineResults } from '../../../mock/timeline_results'; +import { mockTimelineResults } from '../../../../common/mock/timeline_results'; import { OpenTimelineResult, TimelineResultNote } from '../types'; import { NotePreviews } from '.'; diff --git a/x-pack/plugins/siem/public/components/open_timeline/note_previews/index.tsx b/x-pack/plugins/siem/public/timelines/components/open_timeline/note_previews/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/open_timeline/note_previews/index.tsx rename to x-pack/plugins/siem/public/timelines/components/open_timeline/note_previews/index.tsx diff --git a/x-pack/plugins/siem/public/components/open_timeline/note_previews/note_preview.test.tsx b/x-pack/plugins/siem/public/timelines/components/open_timeline/note_previews/note_preview.test.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/open_timeline/note_previews/note_preview.test.tsx rename to x-pack/plugins/siem/public/timelines/components/open_timeline/note_previews/note_preview.test.tsx index 7cefaf08d76cb..c0046e43eef30 100644 --- a/x-pack/plugins/siem/public/components/open_timeline/note_previews/note_preview.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/open_timeline/note_previews/note_preview.test.tsx @@ -9,7 +9,7 @@ import { mountWithIntl } from 'test_utils/enzyme_helpers'; import React from 'react'; import { ThemeProvider } from 'styled-components'; -import { getEmptyValue } from '../../empty_value'; +import { getEmptyValue } from '../../../../common/components/empty_value'; import { NotePreview } from './note_preview'; import * as i18n from '../translations'; diff --git a/x-pack/plugins/siem/public/components/open_timeline/note_previews/note_preview.tsx b/x-pack/plugins/siem/public/timelines/components/open_timeline/note_previews/note_preview.tsx similarity index 90% rename from x-pack/plugins/siem/public/components/open_timeline/note_previews/note_preview.tsx rename to x-pack/plugins/siem/public/timelines/components/open_timeline/note_previews/note_preview.tsx index bb4a032734b5b..d079a4bedcbaf 100644 --- a/x-pack/plugins/siem/public/components/open_timeline/note_previews/note_preview.tsx +++ b/x-pack/plugins/siem/public/timelines/components/open_timeline/note_previews/note_preview.tsx @@ -9,9 +9,9 @@ import { FormattedRelative } from '@kbn/i18n/react'; import React from 'react'; import styled from 'styled-components'; -import { getEmptyValue, defaultToEmptyTag } from '../../empty_value'; -import { FormattedDate } from '../../formatted_date'; -import { Markdown } from '../../markdown'; +import { getEmptyValue, defaultToEmptyTag } from '../../../../common/components/empty_value'; +import { FormattedDate } from '../../../../common/components/formatted_date'; +import { Markdown } from '../../../../common/components/markdown'; import * as i18n from '../translations'; import { TimelineResultNote } from '../types'; diff --git a/x-pack/plugins/siem/public/components/open_timeline/open_timeline.test.tsx b/x-pack/plugins/siem/public/timelines/components/open_timeline/open_timeline.test.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/open_timeline/open_timeline.test.tsx rename to x-pack/plugins/siem/public/timelines/components/open_timeline/open_timeline.test.tsx index 449e1b169cea6..787da4ed6cf41 100644 --- a/x-pack/plugins/siem/public/components/open_timeline/open_timeline.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/open_timeline/open_timeline.test.tsx @@ -10,14 +10,14 @@ import { mountWithIntl } from 'test_utils/enzyme_helpers'; import React from 'react'; import { ThemeProvider } from 'styled-components'; -import { DEFAULT_SEARCH_RESULTS_PER_PAGE } from '../../pages/timelines/timelines_page'; +import { DEFAULT_SEARCH_RESULTS_PER_PAGE } from '../../pages/timelines_page'; import { OpenTimelineResult, OpenTimelineProps } from './types'; import { TimelinesTableProps } from './timelines_table'; -import { mockTimelineResults } from '../../mock/timeline_results'; +import { mockTimelineResults } from '../../../common/mock/timeline_results'; import { OpenTimeline } from './open_timeline'; import { DEFAULT_SORT_DIRECTION, DEFAULT_SORT_FIELD } from './constants'; -jest.mock('../../lib/kibana'); +jest.mock('../../../common/lib/kibana'); describe('OpenTimeline', () => { const theme = () => ({ eui: euiDarkVars, darkMode: true }); diff --git a/x-pack/plugins/siem/public/components/open_timeline/open_timeline.tsx b/x-pack/plugins/siem/public/timelines/components/open_timeline/open_timeline.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/open_timeline/open_timeline.tsx rename to x-pack/plugins/siem/public/timelines/components/open_timeline/open_timeline.tsx index e172a006abe4b..cdbba307a1154 100644 --- a/x-pack/plugins/siem/public/components/open_timeline/open_timeline.tsx +++ b/x-pack/plugins/siem/public/timelines/components/open_timeline/open_timeline.tsx @@ -11,9 +11,9 @@ import { OPEN_TIMELINE_CLASS_NAME } from './helpers'; import { OpenTimelineProps, OpenTimelineResult } from './types'; import { SearchRow } from './search_row'; import { TimelinesTable } from './timelines_table'; -import { ImportDataModal } from '../import_data_modal'; +import { ImportDataModal } from '../../../common/components/import_data_modal'; import * as i18n from './translations'; -import { importTimelines } from '../../containers/timeline/api'; +import { importTimelines } from '../../containers/api'; import { UtilityBarGroup, @@ -21,7 +21,7 @@ import { UtilityBar, UtilityBarSection, UtilityBarAction, -} from '../utility_bar'; +} from '../../../common/components/utility_bar'; import { useEditTimelinBatchActions } from './edit_timeline_batch_actions'; import { useEditTimelineActions } from './edit_timeline_actions'; import { EditOneTimelineAction } from './export_timeline'; diff --git a/x-pack/plugins/siem/public/components/open_timeline/open_timeline_modal/index.test.tsx b/x-pack/plugins/siem/public/timelines/components/open_timeline/open_timeline_modal/index.test.tsx similarity index 83% rename from x-pack/plugins/siem/public/components/open_timeline/open_timeline_modal/index.test.tsx rename to x-pack/plugins/siem/public/timelines/components/open_timeline/open_timeline_modal/index.test.tsx index 178c69e6957e1..8382af6056ca7 100644 --- a/x-pack/plugins/siem/public/components/open_timeline/open_timeline_modal/index.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/open_timeline/open_timeline_modal/index.test.tsx @@ -10,19 +10,19 @@ import React from 'react'; import { MockedProvider } from 'react-apollo/test-utils'; import { ThemeProvider } from 'styled-components'; -import { wait } from '../../../lib/helpers'; -import { TestProviderWithoutDragAndDrop } from '../../../mock/test_providers'; -import { mockOpenTimelineQueryResults } from '../../../mock/timeline_results'; -import { useGetAllTimeline, getAllTimeline } from '../../../containers/timeline/all'; +import { wait } from '../../../../common/lib/helpers'; +import { TestProviderWithoutDragAndDrop } from '../../../../common/mock/test_providers'; +import { mockOpenTimelineQueryResults } from '../../../../common/mock/timeline_results'; +import { useGetAllTimeline, getAllTimeline } from '../../../containers/all'; import { OpenTimelineModal } from '.'; -jest.mock('../../../lib/kibana'); -jest.mock('../../../utils/apollo_context', () => ({ +jest.mock('../../../../common/lib/kibana'); +jest.mock('../../../../common/utils/apollo_context', () => ({ useApolloClient: () => ({}), })); -jest.mock('../../../containers/timeline/all', () => { - const originalModule = jest.requireActual('../../../containers/timeline/all'); +jest.mock('../../../containers/all', () => { + const originalModule = jest.requireActual('../../../containers/all'); return { useGetAllTimeline: jest.fn(), getAllTimeline: originalModule.getAllTimeline, diff --git a/x-pack/plugins/siem/public/components/open_timeline/open_timeline_modal/index.tsx b/x-pack/plugins/siem/public/timelines/components/open_timeline/open_timeline_modal/index.tsx similarity index 91% rename from x-pack/plugins/siem/public/components/open_timeline/open_timeline_modal/index.tsx rename to x-pack/plugins/siem/public/timelines/components/open_timeline/open_timeline_modal/index.tsx index c530929a3c96e..901ae955cbfe9 100644 --- a/x-pack/plugins/siem/public/components/open_timeline/open_timeline_modal/index.tsx +++ b/x-pack/plugins/siem/public/timelines/components/open_timeline/open_timeline_modal/index.tsx @@ -7,8 +7,8 @@ import { EuiModal, EuiOverlayMask } from '@elastic/eui'; import React from 'react'; -import { TimelineModel } from '../../../store/timeline/model'; -import { useApolloClient } from '../../../utils/apollo_context'; +import { TimelineModel } from '../../../../timelines/store/timeline/model'; +import { useApolloClient } from '../../../../common/utils/apollo_context'; import * as i18n from '../translations'; import { ActionTimelineToShow } from '../types'; diff --git a/x-pack/plugins/siem/public/components/open_timeline/open_timeline_modal/open_timeline_modal_body.test.tsx b/x-pack/plugins/siem/public/timelines/components/open_timeline/open_timeline_modal/open_timeline_modal_body.test.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/open_timeline/open_timeline_modal/open_timeline_modal_body.test.tsx rename to x-pack/plugins/siem/public/timelines/components/open_timeline/open_timeline_modal/open_timeline_modal_body.test.tsx index a610884d287a6..1b320c9ebd755 100644 --- a/x-pack/plugins/siem/public/components/open_timeline/open_timeline_modal/open_timeline_modal_body.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/open_timeline/open_timeline_modal/open_timeline_modal_body.test.tsx @@ -10,14 +10,14 @@ import { mountWithIntl } from 'test_utils/enzyme_helpers'; import React from 'react'; import { ThemeProvider } from 'styled-components'; -import { DEFAULT_SEARCH_RESULTS_PER_PAGE } from '../../../pages/timelines/timelines_page'; +import { DEFAULT_SEARCH_RESULTS_PER_PAGE } from '../../../pages/timelines_page'; import { OpenTimelineResult, OpenTimelineProps } from '../types'; import { TimelinesTableProps } from '../timelines_table'; -import { mockTimelineResults } from '../../../mock/timeline_results'; +import { mockTimelineResults } from '../../../../common/mock/timeline_results'; import { OpenTimelineModalBody } from './open_timeline_modal_body'; import { DEFAULT_SORT_DIRECTION, DEFAULT_SORT_FIELD } from '../constants'; -jest.mock('../../../lib/kibana'); +jest.mock('../../../../common/lib/kibana'); describe('OpenTimelineModal', () => { const theme = () => ({ eui: euiDarkVars, darkMode: true }); diff --git a/x-pack/plugins/siem/public/components/open_timeline/open_timeline_modal/open_timeline_modal_body.tsx b/x-pack/plugins/siem/public/timelines/components/open_timeline/open_timeline_modal/open_timeline_modal_body.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/open_timeline/open_timeline_modal/open_timeline_modal_body.tsx rename to x-pack/plugins/siem/public/timelines/components/open_timeline/open_timeline_modal/open_timeline_modal_body.tsx diff --git a/x-pack/plugins/siem/public/components/open_timeline/open_timeline_modal/open_timeline_modal_button.test.tsx b/x-pack/plugins/siem/public/timelines/components/open_timeline/open_timeline_modal/open_timeline_modal_button.test.tsx similarity index 89% rename from x-pack/plugins/siem/public/components/open_timeline/open_timeline_modal/open_timeline_modal_button.test.tsx rename to x-pack/plugins/siem/public/timelines/components/open_timeline/open_timeline_modal/open_timeline_modal_button.test.tsx index 66947a313f5e5..0244bdda0d826 100644 --- a/x-pack/plugins/siem/public/components/open_timeline/open_timeline_modal/open_timeline_modal_button.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/open_timeline/open_timeline_modal/open_timeline_modal_button.test.tsx @@ -10,9 +10,9 @@ import React from 'react'; import { MockedProvider } from 'react-apollo/test-utils'; import { ThemeProvider } from 'styled-components'; -import { wait } from '../../../lib/helpers'; -import { TestProviderWithoutDragAndDrop } from '../../../mock/test_providers'; -import { mockOpenTimelineQueryResults } from '../../../mock/timeline_results'; +import { wait } from '../../../../common/lib/helpers'; +import { TestProviderWithoutDragAndDrop } from '../../../../common/mock/test_providers'; +import { mockOpenTimelineQueryResults } from '../../../../common/mock/timeline_results'; import * as i18n from '../translations'; import { OpenTimelineModalButton } from './open_timeline_modal_button'; diff --git a/x-pack/plugins/siem/public/components/open_timeline/open_timeline_modal/open_timeline_modal_button.tsx b/x-pack/plugins/siem/public/timelines/components/open_timeline/open_timeline_modal/open_timeline_modal_button.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/open_timeline/open_timeline_modal/open_timeline_modal_button.tsx rename to x-pack/plugins/siem/public/timelines/components/open_timeline/open_timeline_modal/open_timeline_modal_button.tsx diff --git a/x-pack/plugins/siem/public/components/open_timeline/search_row/index.test.tsx b/x-pack/plugins/siem/public/timelines/components/open_timeline/search_row/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/open_timeline/search_row/index.test.tsx rename to x-pack/plugins/siem/public/timelines/components/open_timeline/search_row/index.test.tsx diff --git a/x-pack/plugins/siem/public/components/open_timeline/search_row/index.tsx b/x-pack/plugins/siem/public/timelines/components/open_timeline/search_row/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/open_timeline/search_row/index.tsx rename to x-pack/plugins/siem/public/timelines/components/open_timeline/search_row/index.tsx diff --git a/x-pack/plugins/siem/public/components/open_timeline/timelines_table/actions_columns.test.tsx b/x-pack/plugins/siem/public/timelines/components/open_timeline/timelines_table/actions_columns.test.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/open_timeline/timelines_table/actions_columns.test.tsx rename to x-pack/plugins/siem/public/timelines/components/open_timeline/timelines_table/actions_columns.test.tsx index b0f8963dd501e..0560bcf2b08ca 100644 --- a/x-pack/plugins/siem/public/components/open_timeline/timelines_table/actions_columns.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/open_timeline/timelines_table/actions_columns.test.tsx @@ -11,12 +11,12 @@ import { mountWithIntl } from 'test_utils/enzyme_helpers'; import React from 'react'; import { ThemeProvider } from 'styled-components'; -import { mockTimelineResults } from '../../../mock/timeline_results'; +import { mockTimelineResults } from '../../../../common/mock/timeline_results'; import { OpenTimelineResult } from '../types'; import { TimelinesTableProps } from '.'; import { getMockTimelinesTableProps } from './mocks'; -jest.mock('../../../lib/kibana'); +jest.mock('../../../../common/lib/kibana'); const { TimelinesTable } = jest.requireActual('.'); diff --git a/x-pack/plugins/siem/public/components/open_timeline/timelines_table/actions_columns.tsx b/x-pack/plugins/siem/public/timelines/components/open_timeline/timelines_table/actions_columns.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/open_timeline/timelines_table/actions_columns.tsx rename to x-pack/plugins/siem/public/timelines/components/open_timeline/timelines_table/actions_columns.tsx diff --git a/x-pack/plugins/siem/public/components/open_timeline/timelines_table/common_columns.test.tsx b/x-pack/plugins/siem/public/timelines/components/open_timeline/timelines_table/common_columns.test.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/open_timeline/timelines_table/common_columns.test.tsx rename to x-pack/plugins/siem/public/timelines/components/open_timeline/timelines_table/common_columns.test.tsx index a312c72ecc25b..4fb6a4d84f7db 100644 --- a/x-pack/plugins/siem/public/components/open_timeline/timelines_table/common_columns.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/open_timeline/timelines_table/common_columns.test.tsx @@ -11,16 +11,16 @@ import React from 'react'; import { ThemeProvider } from 'styled-components'; import { mountWithIntl } from 'test_utils/enzyme_helpers'; -import { getEmptyValue } from '../../empty_value'; +import { getEmptyValue } from '../../../../common/components/empty_value'; import { OpenTimelineResult } from '../types'; -import { mockTimelineResults } from '../../../mock/timeline_results'; +import { mockTimelineResults } from '../../../../common/mock/timeline_results'; import { NotePreviews } from '../note_previews'; import { TimelinesTable, TimelinesTableProps } from '.'; import * as i18n from '../translations'; import { getMockTimelinesTableProps } from './mocks'; -jest.mock('../../../lib/kibana'); +jest.mock('../../../../common/lib/kibana'); describe('#getCommonColumns', () => { const theme = () => ({ eui: euiDarkVars, darkMode: true }); diff --git a/x-pack/plugins/siem/public/components/open_timeline/timelines_table/common_columns.tsx b/x-pack/plugins/siem/public/timelines/components/open_timeline/timelines_table/common_columns.tsx similarity index 95% rename from x-pack/plugins/siem/public/components/open_timeline/timelines_table/common_columns.tsx rename to x-pack/plugins/siem/public/timelines/components/open_timeline/timelines_table/common_columns.tsx index 0d3a73a389050..e0c7ab68f6bf5 100644 --- a/x-pack/plugins/siem/public/components/open_timeline/timelines_table/common_columns.tsx +++ b/x-pack/plugins/siem/public/timelines/components/open_timeline/timelines_table/common_columns.tsx @@ -15,8 +15,8 @@ import { isUntitled } from '../helpers'; import { NotePreviews } from '../note_previews'; import * as i18n from '../translations'; import { OnOpenTimeline, OnToggleShowNotes, OpenTimelineResult } from '../types'; -import { getEmptyTagValue } from '../../empty_value'; -import { FormattedRelativePreferenceDate } from '../../formatted_date'; +import { getEmptyTagValue } from '../../../../common/components/empty_value'; +import { FormattedRelativePreferenceDate } from '../../../../common/components/formatted_date'; /** * Returns the column definitions (passed as the `columns` prop to diff --git a/x-pack/plugins/siem/public/components/open_timeline/timelines_table/common_styles.ts b/x-pack/plugins/siem/public/timelines/components/open_timeline/timelines_table/common_styles.ts similarity index 100% rename from x-pack/plugins/siem/public/components/open_timeline/timelines_table/common_styles.ts rename to x-pack/plugins/siem/public/timelines/components/open_timeline/timelines_table/common_styles.ts diff --git a/x-pack/plugins/siem/public/components/open_timeline/timelines_table/extended_columns.test.tsx b/x-pack/plugins/siem/public/timelines/components/open_timeline/timelines_table/extended_columns.test.tsx similarity index 92% rename from x-pack/plugins/siem/public/components/open_timeline/timelines_table/extended_columns.test.tsx rename to x-pack/plugins/siem/public/timelines/components/open_timeline/timelines_table/extended_columns.test.tsx index 14409a6bbb5ae..be7127668f7f1 100644 --- a/x-pack/plugins/siem/public/components/open_timeline/timelines_table/extended_columns.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/open_timeline/timelines_table/extended_columns.test.tsx @@ -10,8 +10,8 @@ import { mountWithIntl } from 'test_utils/enzyme_helpers'; import React from 'react'; import { ThemeProvider } from 'styled-components'; -import { getEmptyValue } from '../../empty_value'; -import { mockTimelineResults } from '../../../mock/timeline_results'; +import { getEmptyValue } from '../../../../common/components/empty_value'; +import { mockTimelineResults } from '../../../../common/mock/timeline_results'; import { OpenTimelineResult } from '../types'; import { TimelinesTable, TimelinesTableProps } from '.'; @@ -19,7 +19,7 @@ import { TimelinesTable, TimelinesTableProps } from '.'; import * as i18n from '../translations'; import { getMockTimelinesTableProps } from './mocks'; -jest.mock('../../../lib/kibana'); +jest.mock('../../../../common/lib/kibana'); describe('#getExtendedColumns', () => { const theme = () => ({ eui: euiDarkVars, darkMode: true }); diff --git a/x-pack/plugins/siem/public/components/open_timeline/timelines_table/extended_columns.tsx b/x-pack/plugins/siem/public/timelines/components/open_timeline/timelines_table/extended_columns.tsx similarity index 91% rename from x-pack/plugins/siem/public/components/open_timeline/timelines_table/extended_columns.tsx rename to x-pack/plugins/siem/public/timelines/components/open_timeline/timelines_table/extended_columns.tsx index b6d874fa0c4d1..e50336f5169e8 100644 --- a/x-pack/plugins/siem/public/components/open_timeline/timelines_table/extended_columns.tsx +++ b/x-pack/plugins/siem/public/timelines/components/open_timeline/timelines_table/extended_columns.tsx @@ -8,7 +8,7 @@ import React from 'react'; -import { defaultToEmptyTag } from '../../empty_value'; +import { defaultToEmptyTag } from '../../../../common/components/empty_value'; import * as i18n from '../translations'; import { OpenTimelineResult } from '../types'; diff --git a/x-pack/plugins/siem/public/components/open_timeline/timelines_table/icon_header_columns.test.tsx b/x-pack/plugins/siem/public/timelines/components/open_timeline/timelines_table/icon_header_columns.test.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/open_timeline/timelines_table/icon_header_columns.test.tsx rename to x-pack/plugins/siem/public/timelines/components/open_timeline/timelines_table/icon_header_columns.test.tsx index 658dd96faa986..f1df605c072dd 100644 --- a/x-pack/plugins/siem/public/components/open_timeline/timelines_table/icon_header_columns.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/open_timeline/timelines_table/icon_header_columns.test.tsx @@ -10,11 +10,11 @@ import { mountWithIntl } from 'test_utils/enzyme_helpers'; import React from 'react'; import { ThemeProvider } from 'styled-components'; -import { mockTimelineResults } from '../../../mock/timeline_results'; +import { mockTimelineResults } from '../../../../common/mock/timeline_results'; import { TimelinesTable, TimelinesTableProps } from '.'; import { OpenTimelineResult } from '../types'; import { getMockTimelinesTableProps } from './mocks'; -jest.mock('../../../lib/kibana'); +jest.mock('../../../../common/lib/kibana'); describe('#getActionsColumns', () => { const theme = () => ({ eui: euiDarkVars, darkMode: true }); diff --git a/x-pack/plugins/siem/public/components/open_timeline/timelines_table/icon_header_columns.tsx b/x-pack/plugins/siem/public/timelines/components/open_timeline/timelines_table/icon_header_columns.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/open_timeline/timelines_table/icon_header_columns.tsx rename to x-pack/plugins/siem/public/timelines/components/open_timeline/timelines_table/icon_header_columns.tsx diff --git a/x-pack/plugins/siem/public/components/open_timeline/timelines_table/index.test.tsx b/x-pack/plugins/siem/public/timelines/components/open_timeline/timelines_table/index.test.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/open_timeline/timelines_table/index.test.tsx rename to x-pack/plugins/siem/public/timelines/components/open_timeline/timelines_table/index.test.tsx index 44e6218b5ad25..1ebde8488e46c 100644 --- a/x-pack/plugins/siem/public/components/open_timeline/timelines_table/index.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/open_timeline/timelines_table/index.test.tsx @@ -10,14 +10,14 @@ import { mountWithIntl } from 'test_utils/enzyme_helpers'; import React from 'react'; import { ThemeProvider } from 'styled-components'; -import { mockTimelineResults } from '../../../mock/timeline_results'; +import { mockTimelineResults } from '../../../../common/mock/timeline_results'; import { OpenTimelineResult } from '../types'; import { TimelinesTable, TimelinesTableProps } from '.'; import { getMockTimelinesTableProps } from './mocks'; import * as i18n from '../translations'; -jest.mock('../../../lib/kibana'); +jest.mock('../../../../common/lib/kibana'); describe('TimelinesTable', () => { const theme = () => ({ eui: euiDarkVars, darkMode: true }); diff --git a/x-pack/plugins/siem/public/components/open_timeline/timelines_table/index.tsx b/x-pack/plugins/siem/public/timelines/components/open_timeline/timelines_table/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/open_timeline/timelines_table/index.tsx rename to x-pack/plugins/siem/public/timelines/components/open_timeline/timelines_table/index.tsx diff --git a/x-pack/plugins/siem/public/components/open_timeline/timelines_table/mocks.ts b/x-pack/plugins/siem/public/timelines/components/open_timeline/timelines_table/mocks.ts similarity index 97% rename from x-pack/plugins/siem/public/components/open_timeline/timelines_table/mocks.ts rename to x-pack/plugins/siem/public/timelines/components/open_timeline/timelines_table/mocks.ts index 519dfc1b66efe..78ca898cc407e 100644 --- a/x-pack/plugins/siem/public/components/open_timeline/timelines_table/mocks.ts +++ b/x-pack/plugins/siem/public/timelines/components/open_timeline/timelines_table/mocks.ts @@ -3,7 +3,7 @@ * or more contributor license agreements. Licensed under the Elastic License; * you may not use this file except in compliance with the Elastic License. */ -import { DEFAULT_SEARCH_RESULTS_PER_PAGE } from '../../../pages/timelines/timelines_page'; +import { DEFAULT_SEARCH_RESULTS_PER_PAGE } from '../../../pages/timelines_page'; import { DEFAULT_SORT_DIRECTION, DEFAULT_SORT_FIELD } from '../constants'; import { OpenTimelineResult } from '../types'; import { TimelinesTableProps } from '.'; diff --git a/x-pack/plugins/siem/public/components/open_timeline/title_row/index.test.tsx b/x-pack/plugins/siem/public/timelines/components/open_timeline/title_row/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/open_timeline/title_row/index.test.tsx rename to x-pack/plugins/siem/public/timelines/components/open_timeline/title_row/index.test.tsx diff --git a/x-pack/plugins/siem/public/components/open_timeline/title_row/index.tsx b/x-pack/plugins/siem/public/timelines/components/open_timeline/title_row/index.tsx similarity index 95% rename from x-pack/plugins/siem/public/components/open_timeline/title_row/index.tsx rename to x-pack/plugins/siem/public/timelines/components/open_timeline/title_row/index.tsx index 559bbc3eecb82..e5f921e397b03 100644 --- a/x-pack/plugins/siem/public/components/open_timeline/title_row/index.tsx +++ b/x-pack/plugins/siem/public/timelines/components/open_timeline/title_row/index.tsx @@ -9,7 +9,7 @@ import React from 'react'; import * as i18n from '../translations'; import { OpenTimelineProps } from '../types'; -import { HeaderSection } from '../../header_section'; +import { HeaderSection } from '../../../../common/components/header_section'; type Props = Pick & { /** The number of timelines currently selected */ diff --git a/x-pack/plugins/siem/public/components/open_timeline/translations.ts b/x-pack/plugins/siem/public/timelines/components/open_timeline/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/open_timeline/translations.ts rename to x-pack/plugins/siem/public/timelines/components/open_timeline/translations.ts diff --git a/x-pack/plugins/siem/public/components/open_timeline/types.ts b/x-pack/plugins/siem/public/timelines/components/open_timeline/types.ts similarity index 96% rename from x-pack/plugins/siem/public/components/open_timeline/types.ts rename to x-pack/plugins/siem/public/timelines/components/open_timeline/types.ts index 4d953f6fa775e..f874b5f58d985 100644 --- a/x-pack/plugins/siem/public/components/open_timeline/types.ts +++ b/x-pack/plugins/siem/public/timelines/components/open_timeline/types.ts @@ -5,10 +5,10 @@ */ import { SetStateAction, Dispatch } from 'react'; -import { AllTimelinesVariables } from '../../containers/timeline/all'; -import { TimelineModel } from '../../store/timeline/model'; -import { NoteResult } from '../../graphql/types'; -import { TimelineType, TimelineTypeLiteral } from '../../../common/types/timeline'; +import { AllTimelinesVariables } from '../../containers/all'; +import { TimelineModel } from '../../../timelines/store/timeline/model'; +import { NoteResult } from '../../../graphql/types'; +import { TimelineType, TimelineTypeLiteral } from '../../../../common/types/timeline'; /** The users who added a timeline to favorites */ export interface FavoriteTimelineResult { diff --git a/x-pack/plugins/siem/public/components/open_timeline/use_timeline_types.tsx b/x-pack/plugins/siem/public/timelines/components/open_timeline/use_timeline_types.tsx similarity index 92% rename from x-pack/plugins/siem/public/components/open_timeline/use_timeline_types.tsx rename to x-pack/plugins/siem/public/timelines/components/open_timeline/use_timeline_types.tsx index 1e23bc5bdda3c..f99d8c566c4a5 100644 --- a/x-pack/plugins/siem/public/components/open_timeline/use_timeline_types.tsx +++ b/x-pack/plugins/siem/public/timelines/components/open_timeline/use_timeline_types.tsx @@ -7,12 +7,11 @@ import React, { useState, useCallback, useMemo } from 'react'; import { useParams } from 'react-router-dom'; import { EuiTabs, EuiTab, EuiSpacer, EuiFilterButton } from '@elastic/eui'; -import { TimelineTypeLiteralWithNull, TimelineType } from '../../../common/types/timeline'; - -import { getTimelineTabsUrl } from '../link_to'; -import { useGetUrlSearch } from '../navigation/use_get_url_search'; -import { navTabs } from '../../pages/home/home_navigations'; +import { TimelineTypeLiteralWithNull, TimelineType } from '../../../../common/types/timeline'; +import { getTimelineTabsUrl } from '../../../common/components/link_to'; +import { navTabs } from '../../../app/home/home_navigations'; +import { useGetUrlSearch } from '../../../common/components/navigation/use_get_url_search'; import * as i18n from './translations'; import { TimelineTabsStyle, TimelineTab } from './types'; diff --git a/x-pack/plugins/siem/public/components/timeline/__snapshots__/timeline.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/__snapshots__/timeline.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/__snapshots__/timeline.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/__snapshots__/timeline.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/and_or_badge/__examples__/index.stories.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/and_or_badge/__examples__/index.stories.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/and_or_badge/__examples__/index.stories.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/and_or_badge/__examples__/index.stories.tsx diff --git a/x-pack/plugins/siem/public/components/and_or_badge/index.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/and_or_badge/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/and_or_badge/index.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/and_or_badge/index.tsx diff --git a/x-pack/plugins/siem/public/components/and_or_badge/translations.ts b/x-pack/plugins/siem/public/timelines/components/timeline/and_or_badge/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/and_or_badge/translations.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/and_or_badge/translations.ts diff --git a/x-pack/plugins/siem/public/components/timeline/auto_save_warning/index.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/auto_save_warning/index.tsx similarity index 91% rename from x-pack/plugins/siem/public/components/timeline/auto_save_warning/index.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/auto_save_warning/index.tsx index 90d0738aba72f..210af7a571569 100644 --- a/x-pack/plugins/siem/public/components/timeline/auto_save_warning/index.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/auto_save_warning/index.tsx @@ -14,13 +14,12 @@ import { getOr } from 'lodash/fp'; import React from 'react'; import { connect, ConnectedProps } from 'react-redux'; -import { State, timelineSelectors } from '../../../store'; -import { setTimelineRangeDatePicker as dispatchSetTimelineRangeDatePicker } from '../../../store/inputs/actions'; - -import * as i18n from './translations'; -import { timelineActions } from '../../../store/timeline'; +import { State } from '../../../../common/store'; +import { setTimelineRangeDatePicker as dispatchSetTimelineRangeDatePicker } from '../../../../common/store/inputs/actions'; +import { timelineActions, timelineSelectors } from '../../../store/timeline'; import { AutoSavedWarningMsg } from '../../../store/timeline/types'; -import { useStateToaster } from '../../toasters'; +import { useStateToaster } from '../../../../common/components/toasters'; +import * as i18n from './translations'; const AutoSaveWarningMsgComponent = React.memo( ({ diff --git a/x-pack/plugins/siem/public/components/timeline/auto_save_warning/translations.ts b/x-pack/plugins/siem/public/timelines/components/timeline/auto_save_warning/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/auto_save_warning/translations.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/auto_save_warning/translations.ts diff --git a/x-pack/plugins/siem/public/components/timeline/body/actions/index.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/actions/index.test.tsx similarity index 99% rename from x-pack/plugins/siem/public/components/timeline/body/actions/index.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/actions/index.test.tsx index 6055745e9378e..ee177f4aba05e 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/actions/index.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/actions/index.test.tsx @@ -6,7 +6,7 @@ import { mount } from 'enzyme'; import React from 'react'; -import { TestProviders } from '../../../../mock'; +import { TestProviders } from '../../../../../common/mock'; import { DEFAULT_ACTIONS_COLUMN_WIDTH } from '../constants'; import { Actions } from '.'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/actions/index.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/actions/index.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/timeline/body/actions/index.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/actions/index.tsx index 030e9be7703ed..d36a064b6cc7d 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/actions/index.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/actions/index.tsx @@ -6,15 +6,15 @@ import { EuiButtonIcon, EuiCheckbox, EuiLoadingSpinner, EuiToolTip } from '@elastic/eui'; import React from 'react'; -import { Note } from '../../../../lib/note'; +import { Note } from '../../../../../common/lib/note'; import { AssociateNote, UpdateNote } from '../../../notes/helpers'; -import { Pin } from '../../../pin'; +import { Pin } from '../../pin'; import { NotesButton } from '../../properties/helpers'; import { EventsLoading, EventsTd, EventsTdContent, EventsTdGroupActions } from '../../styles'; import { eventHasNotes, getPinTooltip } from '../helpers'; import * as i18n from '../translations'; import { OnRowSelected } from '../../events'; -import { Ecs } from '../../../../graphql/types'; +import { Ecs } from '../../../../../graphql/types'; export interface TimelineActionProps { eventId: string; diff --git a/x-pack/plugins/siem/public/components/timeline/body/column_headers/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/column_headers/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/body/column_headers/actions/index.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/actions/index.tsx similarity index 95% rename from x-pack/plugins/siem/public/components/timeline/body/column_headers/actions/index.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/actions/index.tsx index 7a2898d465b22..8ec7c52179b99 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/column_headers/actions/index.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/actions/index.tsx @@ -7,7 +7,7 @@ import { EuiButtonIcon } from '@elastic/eui'; import React from 'react'; -import { ColumnHeaderOptions } from '../../../../../store/timeline/model'; +import { ColumnHeaderOptions } from '../../../../../../timelines/store/timeline/model'; import { OnColumnRemoved } from '../../../events'; import { EventsHeadingExtra, EventsLoading } from '../../../styles'; import { useTimelineContext } from '../../../timeline_context'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/column_headers/column_header.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/column_header.tsx similarity index 95% rename from x-pack/plugins/siem/public/components/timeline/body/column_headers/column_header.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/column_header.tsx index e070ed8fa1d2a..10f2d264d65d2 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/column_headers/column_header.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/column_header.tsx @@ -9,8 +9,8 @@ import { Draggable } from 'react-beautiful-dnd'; import { Resizable, ResizeCallback } from 're-resizable'; import deepEqual from 'fast-deep-equal'; -import { ColumnHeaderOptions } from '../../../../store/timeline/model'; -import { getDraggableFieldId } from '../../../drag_and_drop/helpers'; +import { ColumnHeaderOptions } from '../../../../../timelines/store/timeline/model'; +import { getDraggableFieldId } from '../../../../../common/components/drag_and_drop/helpers'; import { OnColumnRemoved, OnColumnSorted, OnFilterChange, OnColumnResized } from '../../events'; import { EventsTh, EventsThContent, EventsHeadingHandle } from '../../styles'; import { Sort } from '../sort'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/column_headers/common/dragging_container.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/common/dragging_container.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/column_headers/common/dragging_container.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/common/dragging_container.tsx diff --git a/x-pack/plugins/siem/public/components/timeline/body/column_headers/common/styles.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/common/styles.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/column_headers/common/styles.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/common/styles.tsx diff --git a/x-pack/plugins/siem/public/components/timeline/body/column_headers/default_headers.ts b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/default_headers.ts similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/column_headers/default_headers.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/default_headers.ts diff --git a/x-pack/plugins/siem/public/components/timeline/body/column_headers/events_select/helpers.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/events_select/helpers.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/timeline/body/column_headers/events_select/helpers.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/events_select/helpers.tsx index 853c1ec24b703..9b2cb2e97b98a 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/column_headers/events_select/helpers.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/events_select/helpers.tsx @@ -8,7 +8,7 @@ import { EuiText } from '@elastic/eui'; import React from 'react'; import styled from 'styled-components'; -import { Pin } from '../../../../pin'; +import { Pin } from '../../../pin'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/column_headers/events_select/index.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/events_select/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/column_headers/events_select/index.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/events_select/index.tsx diff --git a/x-pack/plugins/siem/public/components/timeline/body/column_headers/events_select/translations.ts b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/events_select/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/column_headers/events_select/translations.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/events_select/translations.ts diff --git a/x-pack/plugins/siem/public/components/timeline/body/column_headers/filter/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/filter/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/column_headers/filter/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/filter/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/body/column_headers/filter/index.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/filter/index.test.tsx similarity index 95% rename from x-pack/plugins/siem/public/components/timeline/body/column_headers/filter/index.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/filter/index.test.tsx index f0f6ce8d0ed6f..9d1920b03c9be 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/column_headers/filter/index.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/filter/index.test.tsx @@ -7,7 +7,7 @@ import { mount, shallow } from 'enzyme'; import React from 'react'; -import { ColumnHeaderType } from '../../../../../store/timeline/model'; +import { ColumnHeaderType } from '../../../../../../timelines/store/timeline/model'; import { defaultHeaders } from '../default_headers'; import { Filter } from '.'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/column_headers/filter/index.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/filter/index.tsx similarity index 92% rename from x-pack/plugins/siem/public/components/timeline/body/column_headers/filter/index.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/filter/index.tsx index 911a309edfd98..9daccf27399fb 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/column_headers/filter/index.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/filter/index.tsx @@ -8,7 +8,7 @@ import { noop } from 'lodash/fp'; import React from 'react'; import { OnFilterChange } from '../../../events'; -import { ColumnHeaderOptions } from '../../../../../store/timeline/model'; +import { ColumnHeaderOptions } from '../../../../../../timelines/store/timeline/model'; import { TextFilter } from '../text_filter'; interface Props { diff --git a/x-pack/plugins/siem/public/components/timeline/body/column_headers/header/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/header/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/column_headers/header/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/header/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/body/column_headers/header/header_content.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/header/header_content.tsx similarity index 93% rename from x-pack/plugins/siem/public/components/timeline/body/column_headers/header/header_content.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/header/header_content.tsx index 0a69cef618570..83e3728c14901 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/column_headers/header/header_content.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/header/header_content.tsx @@ -8,8 +8,8 @@ import { EuiToolTip } from '@elastic/eui'; import { noop } from 'lodash/fp'; import React from 'react'; -import { ColumnHeaderOptions } from '../../../../../store/timeline/model'; -import { TruncatableText } from '../../../../truncatable_text'; +import { ColumnHeaderOptions } from '../../../../../../timelines/store/timeline/model'; +import { TruncatableText } from '../../../../../../common/components/truncatable_text'; import { EventsHeading, EventsHeadingTitleButton, EventsHeadingTitleSpan } from '../../../styles'; import { useTimelineContext } from '../../../timeline_context'; import { Sort } from '../../sort'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/column_headers/header/helpers.ts b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/header/helpers.ts similarity index 86% rename from x-pack/plugins/siem/public/components/timeline/body/column_headers/header/helpers.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/header/helpers.ts index 47ce21e4c9637..6d70795c422d9 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/column_headers/header/helpers.ts +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/header/helpers.ts @@ -4,9 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ -import { Direction } from '../../../../../graphql/types'; -import { assertUnreachable } from '../../../../../lib/helpers'; -import { ColumnHeaderOptions } from '../../../../../store/timeline/model'; +import { Direction } from '../../../../../../graphql/types'; +import { assertUnreachable } from '../../../../../../common/lib/helpers'; +import { ColumnHeaderOptions } from '../../../../../../timelines/store/timeline/model'; import { Sort, SortDirection } from '../../sort'; interface GetNewSortDirectionOnClickParams { diff --git a/x-pack/plugins/siem/public/components/timeline/body/column_headers/header/index.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/header/index.test.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/timeline/body/column_headers/header/index.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/header/index.test.tsx index 80ae2aab0a19c..dfbb5508f27c7 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/column_headers/header/index.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/header/index.test.tsx @@ -7,9 +7,9 @@ import { mount, shallow } from 'enzyme'; import React from 'react'; -import { Direction } from '../../../../../graphql/types'; -import { TestProviders } from '../../../../../mock'; -import { ColumnHeaderType } from '../../../../../store/timeline/model'; +import { Direction } from '../../../../../../graphql/types'; +import { TestProviders } from '../../../../../../common/mock'; +import { ColumnHeaderType } from '../../../../../../timelines/store/timeline/model'; import { Sort } from '../../sort'; import { CloseButton } from '../actions'; import { defaultHeaders } from '../default_headers'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/column_headers/header/index.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/header/index.tsx similarity index 94% rename from x-pack/plugins/siem/public/components/timeline/body/column_headers/header/index.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/header/index.tsx index 82c5d7eb73f02..854d45449c92c 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/column_headers/header/index.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/header/index.tsx @@ -7,7 +7,7 @@ import { noop } from 'lodash/fp'; import React, { useCallback } from 'react'; -import { ColumnHeaderOptions } from '../../../../../store/timeline/model'; +import { ColumnHeaderOptions } from '../../../../../../timelines/store/timeline/model'; import { OnColumnRemoved, OnColumnSorted, OnFilterChange } from '../../../events'; import { Sort } from '../../sort'; import { Actions } from '../actions'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/column_headers/header_tooltip_content/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/header_tooltip_content/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/column_headers/header_tooltip_content/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/header_tooltip_content/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/body/column_headers/header_tooltip_content/index.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/header_tooltip_content/index.test.tsx similarity index 94% rename from x-pack/plugins/siem/public/components/timeline/body/column_headers/header_tooltip_content/index.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/header_tooltip_content/index.test.tsx index 9afc852373bc6..534dd7bc9b73c 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/column_headers/header_tooltip_content/index.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/header_tooltip_content/index.test.tsx @@ -8,8 +8,8 @@ import { mount, shallow } from 'enzyme'; import { cloneDeep } from 'lodash/fp'; import React from 'react'; -import { ColumnHeaderOptions } from '../../../../../store/timeline/model'; -import { defaultHeaders } from '../../../../../mock'; +import { ColumnHeaderOptions } from '../../../../../../timelines/store/timeline/model'; +import { defaultHeaders } from '../../../../../../common/mock'; import { HeaderToolTipContent } from '.'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/column_headers/header_tooltip_content/index.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/header_tooltip_content/index.tsx similarity index 92% rename from x-pack/plugins/siem/public/components/timeline/body/column_headers/header_tooltip_content/index.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/header_tooltip_content/index.tsx index bef4bcc42b0c7..efad85775a9e4 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/column_headers/header_tooltip_content/index.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/header_tooltip_content/index.tsx @@ -9,8 +9,8 @@ import { isEmpty } from 'lodash/fp'; import React from 'react'; import styled from 'styled-components'; -import { ColumnHeaderOptions } from '../../../../../store/timeline/model'; -import { getIconFromType } from '../../../../event_details/helpers'; +import { ColumnHeaderOptions } from '../../../../../../timelines/store/timeline/model'; +import { getIconFromType } from '../../../../../../common/components/event_details/helpers'; import * as i18n from '../translations'; const IconType = styled(EuiIcon)` diff --git a/x-pack/plugins/siem/public/components/timeline/body/column_headers/helpers.test.ts b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/helpers.test.ts similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/column_headers/helpers.test.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/helpers.test.ts diff --git a/x-pack/plugins/siem/public/components/timeline/body/column_headers/helpers.ts b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/helpers.ts similarity index 90% rename from x-pack/plugins/siem/public/components/timeline/body/column_headers/helpers.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/helpers.ts index 6923831f9ef63..7c29f1498d0df 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/column_headers/helpers.ts +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/helpers.ts @@ -6,8 +6,8 @@ import { get } from 'lodash/fp'; -import { BrowserFields } from '../../../../containers/source'; -import { ColumnHeaderOptions } from '../../../../store/timeline/model'; +import { BrowserFields } from '../../../../../common/containers/source'; +import { ColumnHeaderOptions } from '../../../../../timelines/store/timeline/model'; import { DEFAULT_COLUMN_MIN_WIDTH, DEFAULT_DATE_COLUMN_MIN_WIDTH, diff --git a/x-pack/plugins/siem/public/components/timeline/body/column_headers/index.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/index.test.tsx similarity index 92% rename from x-pack/plugins/siem/public/components/timeline/body/column_headers/index.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/index.test.tsx index 4fafacfd01633..446e6f2758e4c 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/column_headers/index.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/index.test.tsx @@ -9,11 +9,11 @@ import React from 'react'; import { DEFAULT_ACTIONS_COLUMN_WIDTH } from '../constants'; import { defaultHeaders } from './default_headers'; -import { Direction } from '../../../../graphql/types'; -import { mockBrowserFields } from '../../../../../public/containers/source/mock'; +import { Direction } from '../../../../../graphql/types'; +import { mockBrowserFields } from '../../../../../common/containers/source/mock'; import { Sort } from '../sort'; -import { TestProviders } from '../../../../mock/test_providers'; -import { useMountAppended } from '../../../../utils/use_mount_appended'; +import { TestProviders } from '../../../../../common/mock/test_providers'; +import { useMountAppended } from '../../../../../common/utils/use_mount_appended'; import { ColumnHeadersComponent } from '.'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/column_headers/index.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/index.tsx similarity index 94% rename from x-pack/plugins/siem/public/components/timeline/body/column_headers/index.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/index.tsx index 7a072f1dbf578..7a5ce5ac3c7c9 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/column_headers/index.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/index.tsx @@ -10,11 +10,14 @@ import React, { useState, useEffect, useCallback, useMemo } from 'react'; import { Droppable, DraggableChildrenFn } from 'react-beautiful-dnd'; import deepEqual from 'fast-deep-equal'; -import { DragEffects } from '../../../drag_and_drop/draggable_wrapper'; -import { DraggableFieldBadge } from '../../../draggables/field_badge'; -import { BrowserFields } from '../../../../containers/source'; -import { ColumnHeaderOptions } from '../../../../store/timeline/model'; -import { DRAG_TYPE_FIELD, droppableTimelineColumnsPrefix } from '../../../drag_and_drop/helpers'; +import { DragEffects } from '../../../../../common/components/drag_and_drop/draggable_wrapper'; +import { DraggableFieldBadge } from '../../../../../common/components/draggables/field_badge'; +import { BrowserFields } from '../../../../../common/containers/source'; +import { ColumnHeaderOptions } from '../../../../../timelines/store/timeline/model'; +import { + DRAG_TYPE_FIELD, + droppableTimelineColumnsPrefix, +} from '../../../../../common/components/drag_and_drop/helpers'; import { StatefulFieldsBrowser } from '../../../fields_browser'; import { FIELD_BROWSER_HEIGHT, FIELD_BROWSER_WIDTH } from '../../../fields_browser/helpers'; import { diff --git a/x-pack/plugins/siem/public/components/timeline/body/column_headers/range_picker/index.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/range_picker/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/column_headers/range_picker/index.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/range_picker/index.test.tsx diff --git a/x-pack/plugins/siem/public/components/timeline/body/column_headers/range_picker/index.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/range_picker/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/column_headers/range_picker/index.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/range_picker/index.tsx diff --git a/x-pack/plugins/siem/public/components/timeline/body/column_headers/range_picker/ranges.ts b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/range_picker/ranges.ts similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/column_headers/range_picker/ranges.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/range_picker/ranges.ts diff --git a/x-pack/plugins/siem/public/components/timeline/body/column_headers/range_picker/translations.ts b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/range_picker/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/column_headers/range_picker/translations.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/range_picker/translations.ts diff --git a/x-pack/plugins/siem/public/components/timeline/body/column_headers/text_filter/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/text_filter/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/column_headers/text_filter/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/text_filter/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/body/column_headers/text_filter/index.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/text_filter/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/column_headers/text_filter/index.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/text_filter/index.test.tsx diff --git a/x-pack/plugins/siem/public/components/timeline/body/column_headers/text_filter/index.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/text_filter/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/column_headers/text_filter/index.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/text_filter/index.tsx diff --git a/x-pack/plugins/siem/public/components/timeline/body/column_headers/translations.ts b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/column_headers/translations.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/body/column_headers/translations.ts diff --git a/x-pack/plugins/siem/public/components/timeline/body/column_id.ts b/x-pack/plugins/siem/public/timelines/components/timeline/body/column_id.ts similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/column_id.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/body/column_id.ts diff --git a/x-pack/plugins/siem/public/components/timeline/body/constants.ts b/x-pack/plugins/siem/public/timelines/components/timeline/body/constants.ts similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/constants.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/body/constants.ts diff --git a/x-pack/plugins/siem/public/components/timeline/body/data_driven_columns/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/body/data_driven_columns/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/data_driven_columns/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/body/data_driven_columns/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/body/data_driven_columns/index.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/data_driven_columns/index.test.tsx similarity index 94% rename from x-pack/plugins/siem/public/components/timeline/body/data_driven_columns/index.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/data_driven_columns/index.test.tsx index 098bd3108dba1..8a2cc88eea910 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/data_driven_columns/index.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/data_driven_columns/index.test.tsx @@ -7,7 +7,7 @@ import { shallow } from 'enzyme'; import React from 'react'; -import { mockTimelineData } from '../../../../mock'; +import { mockTimelineData } from '../../../../../common/mock'; import { defaultHeaders } from '../column_headers/default_headers'; import { columnRenderers } from '../renderers'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/data_driven_columns/index.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/data_driven_columns/index.tsx similarity index 92% rename from x-pack/plugins/siem/public/components/timeline/body/data_driven_columns/index.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/data_driven_columns/index.tsx index c15c468373c5a..da00e4054a763 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/data_driven_columns/index.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/data_driven_columns/index.tsx @@ -7,8 +7,8 @@ import React from 'react'; import { getOr } from 'lodash/fp'; -import { Ecs, TimelineNonEcsData } from '../../../../graphql/types'; -import { ColumnHeaderOptions } from '../../../../store/timeline/model'; +import { Ecs, TimelineNonEcsData } from '../../../../../graphql/types'; +import { ColumnHeaderOptions } from '../../../../../timelines/store/timeline/model'; import { OnColumnResized } from '../../events'; import { EventsTd, EventsTdContent, EventsTdGroupData } from '../../styles'; import { ColumnRenderer } from '../renderers/column_renderer'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/events/event_column_view.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/events/event_column_view.tsx similarity index 95% rename from x-pack/plugins/siem/public/components/timeline/body/events/event_column_view.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/events/event_column_view.tsx index daf9c3d8b1f96..2b143d34d3814 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/events/event_column_view.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/events/event_column_view.tsx @@ -7,9 +7,9 @@ import React, { useMemo } from 'react'; import uuid from 'uuid'; -import { TimelineNonEcsData, Ecs } from '../../../../graphql/types'; -import { Note } from '../../../../lib/note'; -import { ColumnHeaderOptions } from '../../../../store/timeline/model'; +import { TimelineNonEcsData, Ecs } from '../../../../../graphql/types'; +import { Note } from '../../../../../common/lib/note'; +import { ColumnHeaderOptions } from '../../../../../timelines/store/timeline/model'; import { AssociateNote, UpdateNote } from '../../../notes/helpers'; import { OnColumnResized, OnPinEvent, OnRowSelected, OnUnPinEvent } from '../../events'; import { EventsTdContent, EventsTrData } from '../../styles'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/events/index.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/events/index.tsx similarity index 89% rename from x-pack/plugins/siem/public/components/timeline/body/events/index.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/events/index.tsx index 4178bc656f32d..fc892f5b8e6b1 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/events/index.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/events/index.tsx @@ -6,11 +6,11 @@ import React from 'react'; -import { BrowserFields } from '../../../../containers/source'; -import { TimelineItem, TimelineNonEcsData } from '../../../../graphql/types'; -import { ColumnHeaderOptions } from '../../../../store/timeline/model'; -import { maxDelay } from '../../../../lib/helpers/scheduler'; -import { Note } from '../../../../lib/note'; +import { BrowserFields } from '../../../../../common/containers/source'; +import { TimelineItem, TimelineNonEcsData } from '../../../../../graphql/types'; +import { ColumnHeaderOptions } from '../../../../../timelines/store/timeline/model'; +import { maxDelay } from '../../../../../common/lib/helpers/scheduler'; +import { Note } from '../../../../../common/lib/note'; import { AddNoteToEvent, UpdateNote } from '../../../notes/helpers'; import { OnColumnResized, diff --git a/x-pack/plugins/siem/public/components/timeline/body/events/stateful_event.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/events/stateful_event.tsx similarity index 94% rename from x-pack/plugins/siem/public/components/timeline/body/events/stateful_event.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/events/stateful_event.tsx index 6e5c292064dc6..61c5809518928 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/events/stateful_event.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/events/stateful_event.tsx @@ -8,14 +8,14 @@ import React, { useEffect, useRef, useState, useCallback } from 'react'; import uuid from 'uuid'; import VisibilitySensor from 'react-visibility-sensor'; -import { BrowserFields } from '../../../../containers/source'; -import { TimelineDetailsQuery } from '../../../../containers/timeline/details'; -import { TimelineItem, DetailItem, TimelineNonEcsData } from '../../../../graphql/types'; -import { requestIdleCallbackViaScheduler } from '../../../../lib/helpers/scheduler'; -import { Note } from '../../../../lib/note'; -import { ColumnHeaderOptions } from '../../../../store/timeline/model'; +import { BrowserFields } from '../../../../../common/containers/source'; +import { TimelineDetailsQuery } from '../../../../containers/details'; +import { TimelineItem, DetailItem, TimelineNonEcsData } from '../../../../../graphql/types'; +import { requestIdleCallbackViaScheduler } from '../../../../../common/lib/helpers/scheduler'; +import { Note } from '../../../../../common/lib/note'; +import { ColumnHeaderOptions } from '../../../../../timelines/store/timeline/model'; import { AddNoteToEvent, UpdateNote } from '../../../notes/helpers'; -import { SkeletonRow } from '../../../skeleton_row'; +import { SkeletonRow } from '../../skeleton_row'; import { OnColumnResized, OnPinEvent, @@ -31,7 +31,7 @@ import { getRowRenderer } from '../renderers/get_row_renderer'; import { RowRenderer } from '../renderers/row_renderer'; import { getEventType } from '../helpers'; import { NoteCards } from '../../../notes/note_cards'; -import { useEventDetailsWidthContext } from '../../../events_viewer/event_details_width_context'; +import { useEventDetailsWidthContext } from '../../../../../common/components/events_viewer/event_details_width_context'; import { EventColumnView } from './event_column_view'; interface Props { diff --git a/x-pack/plugins/siem/public/components/timeline/body/helpers.test.ts b/x-pack/plugins/siem/public/timelines/components/timeline/body/helpers.test.ts similarity index 99% rename from x-pack/plugins/siem/public/components/timeline/body/helpers.test.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/body/helpers.test.ts index f021bf38b56c2..e237e99df9ada 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/helpers.test.ts +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/helpers.test.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { Ecs } from '../../../graphql/types'; +import { Ecs } from '../../../../graphql/types'; import { eventHasNotes, eventIsPinned, getPinTooltip, stringifyEvent } from './helpers'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/helpers.ts b/x-pack/plugins/siem/public/timelines/components/timeline/body/helpers.ts similarity index 96% rename from x-pack/plugins/siem/public/components/timeline/body/helpers.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/body/helpers.ts index 3d1d165ef4fa6..a3eb3cc651f7a 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/helpers.ts +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/helpers.ts @@ -5,8 +5,8 @@ */ import { isEmpty, noop } from 'lodash/fp'; -import { Ecs, TimelineItem, TimelineNonEcsData } from '../../../graphql/types'; -import { EventType } from '../../../store/timeline/model'; +import { Ecs, TimelineItem, TimelineNonEcsData } from '../../../../graphql/types'; +import { EventType } from '../../../../timelines/store/timeline/model'; import { OnPinEvent, OnUnPinEvent } from '../events'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/index.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/index.test.tsx similarity index 95% rename from x-pack/plugins/siem/public/components/timeline/body/index.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/index.test.tsx index cf35c8e565bbc..c2c3f4dd7f12e 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/index.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/index.test.tsx @@ -6,16 +6,16 @@ import React from 'react'; -import { mockBrowserFields } from '../../../containers/source/mock'; -import { Direction } from '../../../graphql/types'; -import { defaultHeaders, mockTimelineData } from '../../../mock'; -import { TestProviders } from '../../../mock/test_providers'; +import { mockBrowserFields } from '../../../../common/containers/source/mock'; +import { Direction } from '../../../../graphql/types'; +import { defaultHeaders, mockTimelineData } from '../../../../common/mock'; +import { TestProviders } from '../../../../common/mock/test_providers'; import { Body, BodyProps } from '.'; import { columnRenderers, rowRenderers } from './renderers'; import { Sort } from './sort'; -import { wait } from '../../../lib/helpers'; -import { useMountAppended } from '../../../utils/use_mount_appended'; +import { wait } from '../../../../common/lib/helpers'; +import { useMountAppended } from '../../../../common/utils/use_mount_appended'; const testBodyHeight = 700; const mockGetNotesByIds = (eventId: string[]) => []; @@ -30,7 +30,7 @@ jest.mock( children({ isVisible: true }) ); -jest.mock('../../../lib/helpers/scheduler', () => ({ +jest.mock('../../../../common/lib/helpers/scheduler', () => ({ requestIdleCallbackViaScheduler: (callback: () => void, opts?: unknown) => { callback(); }, diff --git a/x-pack/plugins/siem/public/components/timeline/body/index.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/index.tsx similarity index 95% rename from x-pack/plugins/siem/public/components/timeline/body/index.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/index.tsx index fac8cc61cddd2..391d19cb7855c 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/index.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/index.tsx @@ -6,10 +6,10 @@ import React, { useMemo, useRef } from 'react'; -import { BrowserFields } from '../../../containers/source'; -import { TimelineItem, TimelineNonEcsData } from '../../../graphql/types'; -import { Note } from '../../../lib/note'; -import { ColumnHeaderOptions } from '../../../store/timeline/model'; +import { BrowserFields } from '../../../../common/containers/source'; +import { TimelineItem, TimelineNonEcsData } from '../../../../graphql/types'; +import { Note } from '../../../../common/lib/note'; +import { ColumnHeaderOptions } from '../../../../timelines/store/timeline/model'; import { AddNoteToEvent, UpdateNote } from '../../notes/helpers'; import { OnColumnRemoved, diff --git a/x-pack/plugins/siem/public/components/timeline/body/mini_map/date_ranges.test.ts b/x-pack/plugins/siem/public/timelines/components/timeline/body/mini_map/date_ranges.test.ts similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/mini_map/date_ranges.test.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/body/mini_map/date_ranges.test.ts diff --git a/x-pack/plugins/siem/public/components/timeline/body/mini_map/date_ranges.ts b/x-pack/plugins/siem/public/timelines/components/timeline/body/mini_map/date_ranges.ts similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/mini_map/date_ranges.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/body/mini_map/date_ranges.ts diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/__snapshots__/args.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/__snapshots__/args.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/__snapshots__/args.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/__snapshots__/args.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/__snapshots__/empty_column_renderer.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/__snapshots__/empty_column_renderer.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/__snapshots__/empty_column_renderer.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/__snapshots__/empty_column_renderer.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/__snapshots__/formatted_field.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/__snapshots__/formatted_field.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/__snapshots__/formatted_field.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/__snapshots__/formatted_field.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/__snapshots__/get_column_renderer.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/__snapshots__/get_column_renderer.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/__snapshots__/get_column_renderer.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/__snapshots__/get_column_renderer.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/__snapshots__/get_row_renderer.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/__snapshots__/get_row_renderer.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/__snapshots__/get_row_renderer.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/__snapshots__/get_row_renderer.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/__snapshots__/host_working_dir.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/__snapshots__/host_working_dir.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/__snapshots__/host_working_dir.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/__snapshots__/host_working_dir.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/__snapshots__/plain_column_renderer.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/__snapshots__/plain_column_renderer.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/__snapshots__/plain_column_renderer.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/__snapshots__/plain_column_renderer.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/__snapshots__/plain_row_renderer.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/__snapshots__/plain_row_renderer.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/__snapshots__/plain_row_renderer.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/__snapshots__/plain_row_renderer.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/__snapshots__/process_draggable.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/__snapshots__/process_draggable.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/__snapshots__/process_draggable.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/__snapshots__/process_draggable.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/__snapshots__/unknown_column_renderer.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/__snapshots__/unknown_column_renderer.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/__snapshots__/unknown_column_renderer.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/__snapshots__/unknown_column_renderer.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/__snapshots__/user_host_working_dir.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/__snapshots__/user_host_working_dir.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/__snapshots__/user_host_working_dir.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/__snapshots__/user_host_working_dir.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/args.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/args.test.tsx similarity index 95% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/args.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/args.test.tsx index 53a2054412440..e7e7d1d47f478 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/args.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/args.test.tsx @@ -7,8 +7,8 @@ import { shallow } from 'enzyme'; import React from 'react'; -import { useMountAppended } from '../../../../utils/use_mount_appended'; -import { TestProviders } from '../../../../mock'; +import { useMountAppended } from '../../../../../common/utils/use_mount_appended'; +import { TestProviders } from '../../../../../common/mock'; import { ArgsComponent } from './args'; describe('Args', () => { diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/args.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/args.tsx similarity index 95% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/args.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/args.tsx index 22367ec879851..f421b471282be 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/args.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/args.tsx @@ -6,7 +6,7 @@ import React from 'react'; -import { DraggableBadge } from '../../../draggables'; +import { DraggableBadge } from '../../../../../common/components/draggables'; import { isNillEmptyOrNotFinite, TokensFlexItem } from './helpers'; interface Props { diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/__snapshots__/generic_details.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/__snapshots__/generic_details.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/__snapshots__/generic_details.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/__snapshots__/generic_details.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/__snapshots__/generic_file_details.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/__snapshots__/generic_file_details.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/__snapshots__/generic_file_details.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/__snapshots__/generic_file_details.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/__snapshots__/generic_row_renderer.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/__snapshots__/generic_row_renderer.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/__snapshots__/generic_row_renderer.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/__snapshots__/generic_row_renderer.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/__snapshots__/primary_secondary_user_info.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/__snapshots__/primary_secondary_user_info.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/__snapshots__/primary_secondary_user_info.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/__snapshots__/primary_secondary_user_info.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/__snapshots__/session_user_host_working_dir.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/__snapshots__/session_user_host_working_dir.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/__snapshots__/session_user_host_working_dir.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/__snapshots__/session_user_host_working_dir.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/generic_details.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/generic_details.test.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/generic_details.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/generic_details.test.tsx index 21cccc88f4fbc..b4c95d383593a 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/generic_details.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/generic_details.test.tsx @@ -7,11 +7,11 @@ import { shallow } from 'enzyme'; import React from 'react'; -import { BrowserFields } from '../../../../../containers/source'; -import { mockBrowserFields } from '../../../../../containers/source/mock'; -import { mockTimelineData, TestProviders } from '../../../../../mock'; +import { BrowserFields } from '../../../../../../common/containers/source'; +import { mockBrowserFields } from '../../../../../../common/containers/source/mock'; +import { mockTimelineData, TestProviders } from '../../../../../../common/mock'; import { AuditdGenericDetails, AuditdGenericLine } from './generic_details'; -import { useMountAppended } from '../../../../../utils/use_mount_appended'; +import { useMountAppended } from '../../../../../../common/utils/use_mount_appended'; describe('GenericDetails', () => { const mount = useMountAppended(); diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/generic_details.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/generic_details.tsx similarity index 95% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/generic_details.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/generic_details.tsx index c25c656b75e41..1e82519285da3 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/generic_details.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/generic_details.tsx @@ -8,9 +8,9 @@ import { EuiFlexGroup, EuiSpacer } from '@elastic/eui'; import { get } from 'lodash/fp'; import React from 'react'; -import { BrowserFields } from '../../../../../containers/source'; -import { Ecs } from '../../../../../graphql/types'; -import { DraggableBadge } from '../../../../draggables'; +import { BrowserFields } from '../../../../../../common/containers/source'; +import { Ecs } from '../../../../../../graphql/types'; +import { DraggableBadge } from '../../../../../../common/components/draggables'; import * as i18n from './translations'; import { NetflowRenderer } from '../netflow'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/generic_file_details.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/generic_file_details.test.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/generic_file_details.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/generic_file_details.test.tsx index fce0e1d645e16..0990280879a14 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/generic_file_details.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/generic_file_details.test.tsx @@ -7,11 +7,11 @@ import { shallow } from 'enzyme'; import React from 'react'; -import { BrowserFields } from '../../../../../containers/source'; -import { mockBrowserFields } from '../../../../../containers/source/mock'; -import { mockTimelineData, TestProviders } from '../../../../../mock'; +import { BrowserFields } from '../../../../../../common/containers/source'; +import { mockBrowserFields } from '../../../../../../common/containers/source/mock'; +import { mockTimelineData, TestProviders } from '../../../../../../common/mock'; import { AuditdGenericFileDetails, AuditdGenericFileLine } from './generic_file_details'; -import { useMountAppended } from '../../../../../utils/use_mount_appended'; +import { useMountAppended } from '../../../../../../common/utils/use_mount_appended'; describe('GenericFileDetails', () => { const mount = useMountAppended(); diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/generic_file_details.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/generic_file_details.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/generic_file_details.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/generic_file_details.tsx index 797361878e6c5..d9149bae89190 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/generic_file_details.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/generic_file_details.tsx @@ -8,9 +8,9 @@ import { EuiFlexGroup, EuiSpacer, IconType } from '@elastic/eui'; import { get } from 'lodash/fp'; import React from 'react'; -import { BrowserFields } from '../../../../../containers/source'; -import { Ecs } from '../../../../../graphql/types'; -import { DraggableBadge } from '../../../../draggables'; +import { BrowserFields } from '../../../../../../common/containers/source'; +import { Ecs } from '../../../../../../graphql/types'; +import { DraggableBadge } from '../../../../../../common/components/draggables'; import * as i18n from './translations'; import { NetflowRenderer } from '../netflow'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/generic_row_renderer.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/generic_row_renderer.test.tsx similarity index 92% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/generic_row_renderer.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/generic_row_renderer.test.tsx index 417a078a08150..ae5e7e2ef789b 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/generic_row_renderer.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/generic_row_renderer.test.tsx @@ -8,18 +8,18 @@ import { shallow } from 'enzyme'; import { cloneDeep } from 'lodash/fp'; import React from 'react'; -import { BrowserFields } from '../../../../../containers/source'; -import { mockBrowserFields } from '../../../../../containers/source/mock'; -import { Ecs } from '../../../../../graphql/types'; -import { mockTimelineData, TestProviders } from '../../../../../mock'; -import { useMountAppended } from '../../../../../utils/use_mount_appended'; +import { BrowserFields } from '../../../../../../common/containers/source'; +import { mockBrowserFields } from '../../../../../../common/containers/source/mock'; +import { Ecs } from '../../../../../../graphql/types'; +import { mockTimelineData, TestProviders } from '../../../../../../common/mock'; +import { useMountAppended } from '../../../../../../common/utils/use_mount_appended'; import { RowRenderer } from '../row_renderer'; import { createGenericAuditRowRenderer, createGenericFileRowRenderer, } from './generic_row_renderer'; -jest.mock('../../../../../pages/overview/events_by_dataset'); +jest.mock('../../../../../../overview/components/events_by_dataset'); describe('GenericRowRenderer', () => { const mount = useMountAppended(); diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/generic_row_renderer.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/generic_row_renderer.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/generic_row_renderer.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/generic_row_renderer.tsx diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/primary_secondary_user_info.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/primary_secondary_user_info.test.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/primary_secondary_user_info.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/primary_secondary_user_info.test.tsx index 598769e854b42..41e35427ae254 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/primary_secondary_user_info.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/primary_secondary_user_info.test.tsx @@ -7,9 +7,9 @@ import { shallow } from 'enzyme'; import React from 'react'; -import { TestProviders } from '../../../../../mock'; +import { TestProviders } from '../../../../../../common/mock'; import { PrimarySecondaryUserInfo, nilOrUnSet } from './primary_secondary_user_info'; -import { useMountAppended } from '../../../../../utils/use_mount_appended'; +import { useMountAppended } from '../../../../../../common/utils/use_mount_appended'; describe('UserPrimarySecondary', () => { const mount = useMountAppended(); diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/primary_secondary_user_info.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/primary_secondary_user_info.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/primary_secondary_user_info.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/primary_secondary_user_info.tsx index a54042d3de9d8..8c9191181d93b 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/primary_secondary_user_info.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/primary_secondary_user_info.tsx @@ -7,7 +7,7 @@ import { EuiFlexGroup } from '@elastic/eui'; import React from 'react'; -import { DraggableBadge } from '../../../../draggables'; +import { DraggableBadge } from '../../../../../../common/components/draggables'; import * as i18n from './translations'; import { TokensFlexItem } from '../helpers'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/session_user_host_working_dir.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/session_user_host_working_dir.test.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/session_user_host_working_dir.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/session_user_host_working_dir.test.tsx index a0a9977f5765e..d1e67c25bd79c 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/session_user_host_working_dir.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/session_user_host_working_dir.test.tsx @@ -8,9 +8,9 @@ import { EuiFlexItem } from '@elastic/eui'; import { shallow } from 'enzyme'; import React from 'react'; -import { TestProviders } from '../../../../../mock'; +import { TestProviders } from '../../../../../../common/mock'; import { SessionUserHostWorkingDir } from './session_user_host_working_dir'; -import { useMountAppended } from '../../../../../utils/use_mount_appended'; +import { useMountAppended } from '../../../../../../common/utils/use_mount_appended'; describe('SessionUserHostWorkingDir', () => { const mount = useMountAppended(); diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/session_user_host_working_dir.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/session_user_host_working_dir.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/session_user_host_working_dir.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/session_user_host_working_dir.tsx index 6a6b55bb817c8..fb2fd7a4b04b0 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/session_user_host_working_dir.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/session_user_host_working_dir.tsx @@ -6,7 +6,7 @@ import React from 'react'; -import { DraggableBadge } from '../../../../draggables'; +import { DraggableBadge } from '../../../../../../common/components/draggables'; import * as i18n from './translations'; import { TokensFlexItem } from '../helpers'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/translations.ts b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/auditd/translations.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/auditd/translations.ts diff --git a/x-pack/plugins/siem/public/components/bytes/index.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/bytes/index.test.tsx similarity index 74% rename from x-pack/plugins/siem/public/components/bytes/index.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/bytes/index.test.tsx index d99a909efad10..06f392683cbf1 100644 --- a/x-pack/plugins/siem/public/components/bytes/index.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/bytes/index.test.tsx @@ -6,9 +6,9 @@ import React from 'react'; -import { TestProviders } from '../../mock'; -import { PreferenceFormattedBytes } from '../formatted_bytes'; -import { useMountAppended } from '../../utils/use_mount_appended'; +import { TestProviders } from '../../../../../../common/mock'; +import { PreferenceFormattedBytes } from '../../../../../../common/components/formatted_bytes'; +import { useMountAppended } from '../../../../../../common/utils/use_mount_appended'; import { Bytes } from '.'; diff --git a/x-pack/plugins/siem/public/components/bytes/index.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/bytes/index.tsx similarity index 83% rename from x-pack/plugins/siem/public/components/bytes/index.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/bytes/index.tsx index 94c6ecba68be5..a8dfe939d28dd 100644 --- a/x-pack/plugins/siem/public/components/bytes/index.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/bytes/index.tsx @@ -6,8 +6,8 @@ import React from 'react'; -import { DefaultDraggable } from '../draggables'; -import { PreferenceFormattedBytes } from '../formatted_bytes'; +import { DefaultDraggable } from '../../../../../../common/components/draggables'; +import { PreferenceFormattedBytes } from '../../../../../../common/components/formatted_bytes'; export const BYTES_FORMAT = 'bytes'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/column_renderer.ts b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/column_renderer.ts similarity index 82% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/column_renderer.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/column_renderer.ts index a13de90e7aed3..4a89fea8c5106 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/column_renderer.ts +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/column_renderer.ts @@ -4,8 +4,8 @@ * you may not use this file except in compliance with the Elastic License. */ -import { TimelineNonEcsData } from '../../../../graphql/types'; -import { ColumnHeaderOptions } from '../../../../store/timeline/model'; +import { TimelineNonEcsData } from '../../../../../graphql/types'; +import { ColumnHeaderOptions } from '../../../../../timelines/store/timeline/model'; export interface ColumnRenderer { isInstance: (columnName: string, data: TimelineNonEcsData[]) => boolean; diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/constants.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/constants.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/constants.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/constants.tsx diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/dns/dns_request_event_details.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/dns/dns_request_event_details.test.tsx similarity index 82% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/dns/dns_request_event_details.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/dns/dns_request_event_details.test.tsx index a7c9d10e82a2f..ba77709459c28 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/dns/dns_request_event_details.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/dns/dns_request_event_details.test.tsx @@ -11,10 +11,10 @@ import React from 'react'; -import { TestProviders } from '../../../../../mock'; -import { mockBrowserFields } from '../../../../../../public/containers/source/mock'; -import { mockEndgameDnsRequest } from '../../../../../../public/mock/mock_endgame_ecs_data'; -import { useMountAppended } from '../../../../../utils/use_mount_appended'; +import { TestProviders } from '../../../../../../common/mock'; +import { mockBrowserFields } from '../../../../../../common/containers/source/mock'; +import { mockEndgameDnsRequest } from '../../../../../../common/mock/mock_endgame_ecs_data'; +import { useMountAppended } from '../../../../../../common/utils/use_mount_appended'; import { DnsRequestEventDetails } from './dns_request_event_details'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/dns/dns_request_event_details.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/dns/dns_request_event_details.tsx similarity index 94% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/dns/dns_request_event_details.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/dns/dns_request_event_details.tsx index 824e8c00de307..74ed5b2a6587f 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/dns/dns_request_event_details.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/dns/dns_request_event_details.tsx @@ -8,9 +8,9 @@ import { EuiSpacer } from '@elastic/eui'; import { get } from 'lodash/fp'; import React from 'react'; -import { BrowserFields } from '../../../../../containers/source'; +import { BrowserFields } from '../../../../../../common/containers/source'; import { Details } from '../helpers'; -import { Ecs } from '../../../../../graphql/types'; +import { Ecs } from '../../../../../../graphql/types'; import { NetflowRenderer } from '../netflow'; import { DnsRequestEventDetailsLine } from './dns_request_event_details_line'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/dns/dns_request_event_details_line.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/dns/dns_request_event_details_line.test.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/dns/dns_request_event_details_line.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/dns/dns_request_event_details_line.test.tsx index e12eacd73559d..1d46e4c3eb02d 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/dns/dns_request_event_details_line.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/dns/dns_request_event_details_line.test.tsx @@ -11,10 +11,10 @@ import React from 'react'; -import { TestProviders } from '../../../../../mock'; +import { TestProviders } from '../../../../../../common/mock'; import { DnsRequestEventDetailsLine } from './dns_request_event_details_line'; -import { useMountAppended } from '../../../../../utils/use_mount_appended'; +import { useMountAppended } from '../../../../../../common/utils/use_mount_appended'; describe('DnsRequestEventDetailsLine', () => { const mount = useMountAppended(); diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/dns/dns_request_event_details_line.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/dns/dns_request_event_details_line.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/dns/dns_request_event_details_line.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/dns/dns_request_event_details_line.tsx index c7a08620bebbb..eafe64f13c25c 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/dns/dns_request_event_details_line.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/dns/dns_request_event_details_line.tsx @@ -7,7 +7,7 @@ import { EuiFlexGroup } from '@elastic/eui'; import React from 'react'; -import { DraggableBadge } from '../../../../draggables'; +import { DraggableBadge } from '../../../../../../common/components/draggables'; import { isNillEmptyOrNotFinite, TokensFlexItem } from '../helpers'; import { ProcessDraggableWithNonExistentProcess } from '../process_draggable'; import { UserHostWorkingDir } from '../user_host_working_dir'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/dns/translations.ts b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/dns/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/dns/translations.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/dns/translations.ts diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/empty_column_renderer.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/empty_column_renderer.test.tsx similarity index 91% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/empty_column_renderer.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/empty_column_renderer.test.tsx index b31d01b8e94a0..4514ce5e9bb06 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/empty_column_renderer.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/empty_column_renderer.test.tsx @@ -8,10 +8,10 @@ import { shallow } from 'enzyme'; import { cloneDeep } from 'lodash/fp'; import React from 'react'; -import { TimelineNonEcsData } from '../../../../graphql/types'; -import { defaultHeaders, mockTimelineData, TestProviders } from '../../../../mock'; -import { useMountAppended } from '../../../../utils/use_mount_appended'; -import { getEmptyValue } from '../../../empty_value'; +import { TimelineNonEcsData } from '../../../../../graphql/types'; +import { defaultHeaders, mockTimelineData, TestProviders } from '../../../../../common/mock'; +import { useMountAppended } from '../../../../../common/utils/use_mount_appended'; +import { getEmptyValue } from '../../../../../common/components/empty_value'; import { deleteItemIdx, findItem } from './helpers'; import { emptyColumnRenderer } from './empty_column_renderer'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/empty_column_renderer.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/empty_column_renderer.tsx similarity index 81% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/empty_column_renderer.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/empty_column_renderer.tsx index 45ef46616718d..9769e23b57aff 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/empty_column_renderer.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/empty_column_renderer.tsx @@ -8,11 +8,14 @@ import React from 'react'; -import { TimelineNonEcsData } from '../../../../graphql/types'; -import { ColumnHeaderOptions } from '../../../../store/timeline/model'; -import { DraggableWrapper, DragEffects } from '../../../drag_and_drop/draggable_wrapper'; -import { escapeDataProviderId } from '../../../drag_and_drop/helpers'; -import { getEmptyValue } from '../../../empty_value'; +import { TimelineNonEcsData } from '../../../../../graphql/types'; +import { ColumnHeaderOptions } from '../../../../../timelines/store/timeline/model'; +import { + DraggableWrapper, + DragEffects, +} from '../../../../../common/components/drag_and_drop/draggable_wrapper'; +import { escapeDataProviderId } from '../../../../../common/components/drag_and_drop/helpers'; +import { getEmptyValue } from '../../../../../common/components/empty_value'; import { EXISTS_OPERATOR } from '../../data_providers/data_provider'; import { Provider } from '../../data_providers/provider'; import { ColumnRenderer } from './column_renderer'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/endgame/endgame_security_event_details.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/endgame/endgame_security_event_details.test.tsx similarity index 92% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/endgame/endgame_security_event_details.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/endgame/endgame_security_event_details.test.tsx index 72b879d4ade78..e84cb93b87178 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/endgame/endgame_security_event_details.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/endgame/endgame_security_event_details.test.tsx @@ -11,15 +11,15 @@ import React from 'react'; -import { TestProviders } from '../../../../../mock'; -import { mockBrowserFields } from '../../../../../../public/containers/source/mock'; +import { TestProviders } from '../../../../../../common/mock'; +import { mockBrowserFields } from '../../../../../../common/containers/source/mock'; import { mockEndgameAdminLogon, mockEndgameExplicitUserLogon, mockEndgameUserLogon, mockEndgameUserLogoff, -} from '../../../../../../public/mock/mock_endgame_ecs_data'; -import { useMountAppended } from '../../../../../utils/use_mount_appended'; +} from '../../../../../../common/mock/mock_endgame_ecs_data'; +import { useMountAppended } from '../../../../../../common/utils/use_mount_appended'; import { EndgameSecurityEventDetails } from './endgame_security_event_details'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/endgame/endgame_security_event_details.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/endgame/endgame_security_event_details.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/endgame/endgame_security_event_details.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/endgame/endgame_security_event_details.tsx index 35a88f52f05a3..11580e2536ff7 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/endgame/endgame_security_event_details.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/endgame/endgame_security_event_details.tsx @@ -8,8 +8,8 @@ import { EuiSpacer } from '@elastic/eui'; import { get } from 'lodash/fp'; import React from 'react'; -import { BrowserFields } from '../../../../../containers/source'; -import { Ecs } from '../../../../../graphql/types'; +import { BrowserFields } from '../../../../../../common/containers/source'; +import { Ecs } from '../../../../../../graphql/types'; import { NetflowRenderer } from '../netflow'; import { EndgameSecurityEventDetailsLine } from './endgame_security_event_details_line'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/endgame/endgame_security_event_details_line.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/endgame/endgame_security_event_details_line.test.tsx similarity index 99% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/endgame/endgame_security_event_details_line.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/endgame/endgame_security_event_details_line.test.tsx index 4e522f6ed5c94..b2b4b021e5db5 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/endgame/endgame_security_event_details_line.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/endgame/endgame_security_event_details_line.test.tsx @@ -11,10 +11,10 @@ import React from 'react'; -import { TestProviders } from '../../../../../mock'; +import { TestProviders } from '../../../../../../common/mock'; import { EndgameSecurityEventDetailsLine } from './endgame_security_event_details_line'; -import { useMountAppended } from '../../../../../utils/use_mount_appended'; +import { useMountAppended } from '../../../../../../common/utils/use_mount_appended'; describe('EndgameSecurityEventDetailsLine', () => { const mount = useMountAppended(); diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/endgame/endgame_security_event_details_line.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/endgame/endgame_security_event_details_line.tsx similarity index 99% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/endgame/endgame_security_event_details_line.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/endgame/endgame_security_event_details_line.tsx index c2c42ba0e4ddc..c2bccc24fd994 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/endgame/endgame_security_event_details_line.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/endgame/endgame_security_event_details_line.tsx @@ -7,7 +7,7 @@ import { EuiFlexGroup } from '@elastic/eui'; import React from 'react'; -import { DraggableBadge } from '../../../../draggables'; +import { DraggableBadge } from '../../../../../../common/components/draggables'; import { isNillEmptyOrNotFinite, TokensFlexItem } from '../helpers'; import { ProcessDraggableWithNonExistentProcess } from '../process_draggable'; import { UserHostWorkingDir } from '../user_host_working_dir'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/endgame/helpers.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/endgame/helpers.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/endgame/helpers.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/endgame/helpers.test.tsx diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/endgame/helpers.ts b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/endgame/helpers.ts similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/endgame/helpers.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/endgame/helpers.ts diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/endgame/translations.ts b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/endgame/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/endgame/translations.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/endgame/translations.ts diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/exit_code_draggable.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/exit_code_draggable.test.tsx similarity index 95% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/exit_code_draggable.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/exit_code_draggable.test.tsx index 4da236bfa34c3..4471c26ef8fd7 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/exit_code_draggable.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/exit_code_draggable.test.tsx @@ -6,8 +6,8 @@ import React from 'react'; -import { TestProviders } from '../../../../mock'; -import { useMountAppended } from '../../../../utils/use_mount_appended'; +import { TestProviders } from '../../../../../common/mock'; +import { useMountAppended } from '../../../../../common/utils/use_mount_appended'; import { ExitCodeDraggable } from './exit_code_draggable'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/exit_code_draggable.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/exit_code_draggable.tsx similarity index 94% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/exit_code_draggable.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/exit_code_draggable.tsx index 7671e3f0509a5..8aba73f5373e9 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/exit_code_draggable.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/exit_code_draggable.tsx @@ -6,7 +6,7 @@ import React from 'react'; -import { DraggableBadge } from '../../../draggables'; +import { DraggableBadge } from '../../../../../common/components/draggables'; import { isNillEmptyOrNotFinite, TokensFlexItem } from './helpers'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/file_draggable.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/file_draggable.test.tsx similarity index 95% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/file_draggable.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/file_draggable.test.tsx index d800821f8d8a5..70e0e74675cd2 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/file_draggable.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/file_draggable.test.tsx @@ -6,10 +6,10 @@ import React from 'react'; -import { TestProviders } from '../../../../mock'; +import { TestProviders } from '../../../../../common/mock'; import { FileDraggable } from './file_draggable'; -import { useMountAppended } from '../../../../utils/use_mount_appended'; +import { useMountAppended } from '../../../../../common/utils/use_mount_appended'; describe('FileDraggable', () => { const mount = useMountAppended(); diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/file_draggable.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/file_draggable.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/file_draggable.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/file_draggable.tsx index e4871c6479c6b..bdf223d215a1c 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/file_draggable.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/file_draggable.tsx @@ -6,7 +6,7 @@ import React from 'react'; -import { DraggableBadge } from '../../../draggables'; +import { DraggableBadge } from '../../../../../common/components/draggables'; import { isNillEmptyOrNotFinite, TokensFlexItem } from './helpers'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/formatted_field.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/formatted_field.test.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/formatted_field.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/formatted_field.test.tsx index 73f7b004ca3f7..64f4656e7e790 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/formatted_field.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/formatted_field.test.tsx @@ -8,14 +8,14 @@ import { shallow } from 'enzyme'; import { get } from 'lodash/fp'; import React from 'react'; -import { mockTimelineData, TestProviders } from '../../../../mock'; -import { getEmptyValue } from '../../../empty_value'; -import { useMountAppended } from '../../../../utils/use_mount_appended'; +import { mockTimelineData, TestProviders } from '../../../../../common/mock'; +import { getEmptyValue } from '../../../../../common/components/empty_value'; +import { useMountAppended } from '../../../../../common/utils/use_mount_appended'; import { FormattedFieldValue } from './formatted_field'; import { HOST_NAME_FIELD_NAME } from './constants'; -jest.mock('../../../../lib/kibana'); +jest.mock('../../../../../common/lib/kibana'); describe('Events', () => { const mount = useMountAppended(); diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/formatted_field.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/formatted_field.tsx similarity index 88% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/formatted_field.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/formatted_field.tsx index 0f650d6386194..d03f0573dc2b0 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/formatted_field.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/formatted_field.tsx @@ -8,16 +8,19 @@ import { EuiFlexGroup, EuiFlexItem, EuiToolTip } from '@elastic/eui'; import { isNumber, isString, isEmpty } from 'lodash/fp'; import React from 'react'; -import { DefaultDraggable } from '../../../draggables'; -import { Bytes, BYTES_FORMAT } from '../../../bytes'; +import { DefaultDraggable } from '../../../../../common/components/draggables'; +import { Bytes, BYTES_FORMAT } from './bytes'; import { Duration, EVENT_DURATION_FIELD_NAME } from '../../../duration'; -import { getOrEmptyTagFromValue, getEmptyTagValue } from '../../../empty_value'; -import { FormattedDate } from '../../../formatted_date'; -import { FormattedIp } from '../../../formatted_ip'; -import { HostDetailsLink } from '../../../links'; +import { + getOrEmptyTagFromValue, + getEmptyTagValue, +} from '../../../../../common/components/empty_value'; +import { FormattedDate } from '../../../../../common/components/formatted_date'; +import { FormattedIp } from '../../../../components/formatted_ip'; +import { HostDetailsLink } from '../../../../../common/components/links'; -import { Port, PORT_NAMES } from '../../../port'; -import { TruncatableText } from '../../../truncatable_text'; +import { Port, PORT_NAMES } from '../../../../../network/components/port'; +import { TruncatableText } from '../../../../../common/components/truncatable_text'; import { DATE_FIELD_TYPE, HOST_NAME_FIELD_NAME, diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/formatted_field_helpers.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/formatted_field_helpers.tsx similarity index 89% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/formatted_field_helpers.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/formatted_field_helpers.tsx index 7c9accd4cef49..bbf8c5af3be97 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/formatted_field_helpers.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/formatted_field_helpers.tsx @@ -9,13 +9,13 @@ import { isString, isEmpty } from 'lodash/fp'; import React from 'react'; import styled from 'styled-components'; -import { DefaultDraggable } from '../../../draggables'; -import { getEmptyTagValue } from '../../../empty_value'; -import { getRuleDetailsUrl } from '../../../link_to/redirect_to_detection_engine'; -import { TruncatableText } from '../../../truncatable_text'; +import { DefaultDraggable } from '../../../../../common/components/draggables'; +import { getEmptyTagValue } from '../../../../../common/components/empty_value'; +import { getRuleDetailsUrl } from '../../../../../common/components/link_to/redirect_to_detection_engine'; +import { TruncatableText } from '../../../../../common/components/truncatable_text'; -import { isUrlInvalid } from '../../../../pages/detection_engine/rules/components/step_about_rule/helpers'; -import endPointSvg from '../../../../utils/logo_endpoint/64_color.svg'; +import { isUrlInvalid } from '../../../../../alerts/components/rules/step_about_rule/helpers'; +import endPointSvg from '../../../../../common/utils/logo_endpoint/64_color.svg'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/get_column_renderer.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/get_column_renderer.test.tsx similarity index 89% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/get_column_renderer.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/get_column_renderer.test.tsx index 25d5c71caf48a..12b093bd517c8 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/get_column_renderer.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/get_column_renderer.test.tsx @@ -8,16 +8,16 @@ import { shallow } from 'enzyme'; import { cloneDeep } from 'lodash/fp'; import React from 'react'; -import { TimelineNonEcsData } from '../../../../graphql/types'; -import { mockTimelineData } from '../../../../mock'; -import { TestProviders } from '../../../../mock/test_providers'; -import { getEmptyValue } from '../../../empty_value'; +import { TimelineNonEcsData } from '../../../../../graphql/types'; +import { mockTimelineData } from '../../../../../common/mock'; +import { TestProviders } from '../../../../../common/mock/test_providers'; +import { getEmptyValue } from '../../../../../common/components/empty_value'; import { defaultHeaders } from '../column_headers/default_headers'; import { columnRenderers } from '.'; import { getColumnRenderer } from './get_column_renderer'; import { getValues, findItem, deleteItemIdx } from './helpers'; -import { useMountAppended } from '../../../../utils/use_mount_appended'; +import { useMountAppended } from '../../../../../common/utils/use_mount_appended'; describe('get_column_renderer', () => { let nonSuricata: TimelineNonEcsData[]; diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/get_column_renderer.ts b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/get_column_renderer.ts similarity index 91% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/get_column_renderer.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/get_column_renderer.ts index 22aa14d598c13..03d041aef1e70 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/get_column_renderer.ts +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/get_column_renderer.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { TimelineNonEcsData } from '../../../../graphql/types'; +import { TimelineNonEcsData } from '../../../../../graphql/types'; import { ColumnRenderer } from './column_renderer'; const unhandledColumnRenderer = (): never => { diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/get_row_renderer.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/get_row_renderer.test.tsx similarity index 93% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/get_row_renderer.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/get_row_renderer.test.tsx index 7ad8cfed5256b..3222f8a2362db 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/get_row_renderer.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/get_row_renderer.test.tsx @@ -8,11 +8,11 @@ import { shallow } from 'enzyme'; import { cloneDeep } from 'lodash'; import React from 'react'; -import { mockBrowserFields } from '../../../../containers/source/mock'; -import { Ecs } from '../../../../graphql/types'; -import { mockTimelineData } from '../../../../mock'; -import { TestProviders } from '../../../../mock/test_providers'; -import { useMountAppended } from '../../../../utils/use_mount_appended'; +import { mockBrowserFields } from '../../../../../common/containers/source/mock'; +import { Ecs } from '../../../../../graphql/types'; +import { mockTimelineData } from '../../../../../common/mock'; +import { TestProviders } from '../../../../../common/mock/test_providers'; +import { useMountAppended } from '../../../../../common/utils/use_mount_appended'; import { rowRenderers } from '.'; import { getRowRenderer } from './get_row_renderer'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/get_row_renderer.ts b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/get_row_renderer.ts similarity index 92% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/get_row_renderer.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/get_row_renderer.ts index b5a585d463819..2e90c589e6532 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/get_row_renderer.ts +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/get_row_renderer.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { Ecs } from '../../../../graphql/types'; +import { Ecs } from '../../../../../graphql/types'; import { RowRenderer } from './row_renderer'; const unhandledRowRenderer = (): never => { diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/helpers.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/helpers.test.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/helpers.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/helpers.test.tsx index 98a99cb6e4089..82704d544b8b9 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/helpers.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/helpers.test.tsx @@ -6,8 +6,8 @@ import { cloneDeep } from 'lodash/fp'; -import { TimelineNonEcsData } from '../../../../graphql/types'; -import { mockTimelineData } from '../../../../mock'; +import { TimelineNonEcsData } from '../../../../../graphql/types'; +import { mockTimelineData } from '../../../../../common/mock'; import { deleteItemIdx, findItem, diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/helpers.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/helpers.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/helpers.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/helpers.tsx index 26aa5cea51ce7..7cda5aa3c59f7 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/helpers.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/helpers.tsx @@ -8,7 +8,7 @@ import { EuiFlexItem } from '@elastic/eui'; import { isNumber, isEmpty } from 'lodash/fp'; import styled from 'styled-components'; -import { TimelineNonEcsData } from '../../../../graphql/types'; +import { TimelineNonEcsData } from '../../../../../graphql/types'; export const deleteItemIdx = (data: TimelineNonEcsData[], idx: number) => [ ...data.slice(0, idx), diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/host_working_dir.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/host_working_dir.test.tsx similarity index 94% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/host_working_dir.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/host_working_dir.test.tsx index d84dfcc561882..85a000bbcaf63 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/host_working_dir.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/host_working_dir.test.tsx @@ -7,8 +7,8 @@ import { shallow } from 'enzyme'; import React from 'react'; -import { mockTimelineData, TestProviders } from '../../../../mock'; -import { useMountAppended } from '../../../../utils/use_mount_appended'; +import { mockTimelineData, TestProviders } from '../../../../../common/mock'; +import { useMountAppended } from '../../../../../common/utils/use_mount_appended'; import { HostWorkingDir } from './host_working_dir'; describe('HostWorkingDir', () => { diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/host_working_dir.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/host_working_dir.tsx similarity index 94% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/host_working_dir.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/host_working_dir.tsx index db49df30be473..89d46dd287ffd 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/host_working_dir.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/host_working_dir.tsx @@ -6,7 +6,7 @@ import React from 'react'; -import { DraggableBadge } from '../../../draggables'; +import { DraggableBadge } from '../../../../../common/components/draggables'; import * as i18n from './translations'; import { TokensFlexItem } from './helpers'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/index.ts b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/index.ts similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/index.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/index.ts diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/netflow.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/netflow.tsx similarity index 86% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/netflow.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/netflow.tsx index 0990301b6e2b9..0492450df5134 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/netflow.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/netflow.tsx @@ -7,22 +7,28 @@ import { get } from 'lodash/fp'; import React from 'react'; -import { Ecs } from '../../../../graphql/types'; -import { asArrayIfExists } from '../../../../lib/helpers'; +import { Ecs } from '../../../../../graphql/types'; +import { asArrayIfExists } from '../../../../../common/lib/helpers'; import { TLS_CLIENT_CERTIFICATE_FINGERPRINT_SHA1_FIELD_NAME, TLS_SERVER_CERTIFICATE_FINGERPRINT_SHA1_FIELD_NAME, } from '../../../certificate_fingerprint'; import { EVENT_DURATION_FIELD_NAME } from '../../../duration'; -import { ID_FIELD_NAME } from '../../../event_details/event_id'; -import { DESTINATION_IP_FIELD_NAME, SOURCE_IP_FIELD_NAME } from '../../../ip'; +import { ID_FIELD_NAME } from '../../../../../common/components/event_details/event_id'; +import { + DESTINATION_IP_FIELD_NAME, + SOURCE_IP_FIELD_NAME, +} from '../../../../../network/components/ip'; import { JA3_HASH_FIELD_NAME } from '../../../ja3_fingerprint'; import { Netflow } from '../../../netflow'; import { EVENT_END_FIELD_NAME, EVENT_START_FIELD_NAME, } from '../../../netflow/netflow_columns/duration_event_start_end'; -import { DESTINATION_PORT_FIELD_NAME, SOURCE_PORT_FIELD_NAME } from '../../../port'; +import { + DESTINATION_PORT_FIELD_NAME, + SOURCE_PORT_FIELD_NAME, +} from '../../../../../network/components/port'; import { DESTINATION_GEO_CITY_NAME_FIELD_NAME, DESTINATION_GEO_CONTINENT_NAME_FIELD_NAME, @@ -34,13 +40,13 @@ import { SOURCE_GEO_COUNTRY_ISO_CODE_FIELD_NAME, SOURCE_GEO_COUNTRY_NAME_FIELD_NAME, SOURCE_GEO_REGION_NAME_FIELD_NAME, -} from '../../../source_destination/geo_fields'; +} from '../../../../../network/components/source_destination/geo_fields'; import { DESTINATION_BYTES_FIELD_NAME, DESTINATION_PACKETS_FIELD_NAME, SOURCE_BYTES_FIELD_NAME, SOURCE_PACKETS_FIELD_NAME, -} from '../../../source_destination/source_destination_arrows'; +} from '../../../../../network/components/source_destination/source_destination_arrows'; import { NETWORK_BYTES_FIELD_NAME, NETWORK_COMMUNITY_ID_FIELD_NAME, @@ -48,7 +54,7 @@ import { NETWORK_PACKETS_FIELD_NAME, NETWORK_PROTOCOL_FIELD_NAME, NETWORK_TRANSPORT_FIELD_NAME, -} from '../../../source_destination/field_names'; +} from '../../../../../network/components/source_destination/field_names'; interface NetflowRendererProps { data: Ecs; diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/netflow/__snapshots__/netflow_row_renderer.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/netflow/__snapshots__/netflow_row_renderer.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/netflow/__snapshots__/netflow_row_renderer.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/netflow/__snapshots__/netflow_row_renderer.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/netflow/netflow_row_renderer.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/netflow/netflow_row_renderer.test.tsx similarity index 91% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/netflow/netflow_row_renderer.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/netflow/netflow_row_renderer.test.tsx index e5375302f5bab..9c620f5cf6701 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/netflow/netflow_row_renderer.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/netflow/netflow_row_renderer.test.tsx @@ -7,11 +7,11 @@ import { shallow } from 'enzyme'; import React from 'react'; -import { BrowserFields } from '../../../../../containers/source'; -import { mockBrowserFields } from '../../../../../containers/source/mock'; -import { Ecs } from '../../../../../graphql/types'; -import { getMockNetflowData, TestProviders } from '../../../../../mock'; -import { useMountAppended } from '../../../../../utils/use_mount_appended'; +import { BrowserFields } from '../../../../../../common/containers/source'; +import { mockBrowserFields } from '../../../../../../common/containers/source/mock'; +import { Ecs } from '../../../../../../graphql/types'; +import { getMockNetflowData, TestProviders } from '../../../../../../common/mock'; +import { useMountAppended } from '../../../../../../common/utils/use_mount_appended'; import { eventActionMatches, diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/netflow/netflow_row_renderer.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/netflow/netflow_row_renderer.tsx similarity index 90% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/netflow/netflow_row_renderer.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/netflow/netflow_row_renderer.tsx index 10d80e1952f40..7926b447196fb 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/netflow/netflow_row_renderer.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/netflow/netflow_row_renderer.tsx @@ -10,14 +10,17 @@ import { get } from 'lodash/fp'; import React from 'react'; import styled from 'styled-components'; -import { asArrayIfExists } from '../../../../../lib/helpers'; +import { asArrayIfExists } from '../../../../../../common/lib/helpers'; import { TLS_CLIENT_CERTIFICATE_FINGERPRINT_SHA1_FIELD_NAME, TLS_SERVER_CERTIFICATE_FINGERPRINT_SHA1_FIELD_NAME, } from '../../../../certificate_fingerprint'; import { EVENT_DURATION_FIELD_NAME } from '../../../../duration'; -import { ID_FIELD_NAME } from '../../../../event_details/event_id'; -import { DESTINATION_IP_FIELD_NAME, SOURCE_IP_FIELD_NAME } from '../../../../ip'; +import { ID_FIELD_NAME } from '../../../../../../common/components/event_details/event_id'; +import { + DESTINATION_IP_FIELD_NAME, + SOURCE_IP_FIELD_NAME, +} from '../../../../../../network/components/ip'; import { JA3_HASH_FIELD_NAME } from '../../../../ja3_fingerprint'; import { Netflow } from '../../../../netflow'; import { @@ -28,7 +31,10 @@ import { PROCESS_NAME_FIELD_NAME, USER_NAME_FIELD_NAME, } from '../../../../netflow/netflow_columns/user_process'; -import { DESTINATION_PORT_FIELD_NAME, SOURCE_PORT_FIELD_NAME } from '../../../../port'; +import { + DESTINATION_PORT_FIELD_NAME, + SOURCE_PORT_FIELD_NAME, +} from '../../../../../../network/components/port'; import { NETWORK_BYTES_FIELD_NAME, NETWORK_COMMUNITY_ID_FIELD_NAME, @@ -36,7 +42,7 @@ import { NETWORK_PACKETS_FIELD_NAME, NETWORK_PROTOCOL_FIELD_NAME, NETWORK_TRANSPORT_FIELD_NAME, -} from '../../../../source_destination/field_names'; +} from '../../../../../../network/components/source_destination/field_names'; import { DESTINATION_GEO_CITY_NAME_FIELD_NAME, DESTINATION_GEO_CONTINENT_NAME_FIELD_NAME, @@ -48,13 +54,13 @@ import { SOURCE_GEO_COUNTRY_ISO_CODE_FIELD_NAME, SOURCE_GEO_COUNTRY_NAME_FIELD_NAME, SOURCE_GEO_REGION_NAME_FIELD_NAME, -} from '../../../../source_destination/geo_fields'; +} from '../../../../../../network/components/source_destination/geo_fields'; import { DESTINATION_BYTES_FIELD_NAME, DESTINATION_PACKETS_FIELD_NAME, SOURCE_BYTES_FIELD_NAME, SOURCE_PACKETS_FIELD_NAME, -} from '../../../../source_destination/source_destination_arrows'; +} from '../../../../../../network/components/source_destination/source_destination_arrows'; import { RowRenderer, RowRendererContainer } from '../row_renderer'; const Details = styled.div` diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/parent_process_draggable.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/parent_process_draggable.test.tsx similarity index 95% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/parent_process_draggable.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/parent_process_draggable.test.tsx index 684def7386da0..0a173f766ae19 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/parent_process_draggable.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/parent_process_draggable.test.tsx @@ -6,10 +6,10 @@ import React from 'react'; -import { TestProviders } from '../../../../mock'; +import { TestProviders } from '../../../../../common/mock'; import { ParentProcessDraggable } from './parent_process_draggable'; -import { useMountAppended } from '../../../../utils/use_mount_appended'; +import { useMountAppended } from '../../../../../common/utils/use_mount_appended'; describe('ParentProcessDraggable', () => { const mount = useMountAppended(); diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/parent_process_draggable.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/parent_process_draggable.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/parent_process_draggable.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/parent_process_draggable.tsx index 1402743ef8a51..12d23e2f0b604 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/parent_process_draggable.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/parent_process_draggable.tsx @@ -6,7 +6,7 @@ import React from 'react'; -import { DraggableBadge } from '../../../draggables'; +import { DraggableBadge } from '../../../../../common/components/draggables'; import { isNillEmptyOrNotFinite, TokensFlexItem } from './helpers'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/parse_query_value.test.ts b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/parse_query_value.test.ts similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/parse_query_value.test.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/parse_query_value.test.ts diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/parse_query_value.ts b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/parse_query_value.ts similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/parse_query_value.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/parse_query_value.ts diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/parse_value.test.ts b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/parse_value.test.ts similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/parse_value.test.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/parse_value.test.ts diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/parse_value.ts b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/parse_value.ts similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/parse_value.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/parse_value.ts diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/plain_column_renderer.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/plain_column_renderer.test.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/plain_column_renderer.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/plain_column_renderer.test.tsx index 8a22307767a40..b80b3cf9a375a 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/plain_column_renderer.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/plain_column_renderer.test.tsx @@ -8,10 +8,10 @@ import { shallow } from 'enzyme'; import { cloneDeep } from 'lodash/fp'; import React from 'react'; -import { TimelineNonEcsData } from '../../../../graphql/types'; -import { defaultHeaders, mockTimelineData, TestProviders } from '../../../../mock'; -import { getEmptyValue } from '../../../empty_value'; -import { useMountAppended } from '../../../../utils/use_mount_appended'; +import { TimelineNonEcsData } from '../../../../../graphql/types'; +import { defaultHeaders, mockTimelineData, TestProviders } from '../../../../../common/mock'; +import { getEmptyValue } from '../../../../../common/components/empty_value'; +import { useMountAppended } from '../../../../../common/utils/use_mount_appended'; import { plainColumnRenderer } from './plain_column_renderer'; import { getValues, deleteItemIdx, findItem } from './helpers'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/plain_column_renderer.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/plain_column_renderer.tsx similarity index 88% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/plain_column_renderer.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/plain_column_renderer.tsx index f6a61889c501b..d2881382b1701 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/plain_column_renderer.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/plain_column_renderer.tsx @@ -7,9 +7,9 @@ import { head } from 'lodash/fp'; import React from 'react'; -import { TimelineNonEcsData } from '../../../../graphql/types'; -import { ColumnHeaderOptions } from '../../../../store/timeline/model'; -import { getEmptyTagValue } from '../../../empty_value'; +import { TimelineNonEcsData } from '../../../../../graphql/types'; +import { ColumnHeaderOptions } from '../../../../../timelines/store/timeline/model'; +import { getEmptyTagValue } from '../../../../../common/components/empty_value'; import { ColumnRenderer } from './column_renderer'; import { FormattedFieldValue } from './formatted_field'; import { parseValue } from './parse_value'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/plain_row_renderer.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/plain_row_renderer.test.tsx similarity index 88% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/plain_row_renderer.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/plain_row_renderer.test.tsx index 467f507e8be7d..82d42988ef34f 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/plain_row_renderer.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/plain_row_renderer.test.tsx @@ -10,9 +10,9 @@ import { cloneDeep } from 'lodash'; import React from 'react'; import { ThemeProvider } from 'styled-components'; -import { mockBrowserFields } from '../../../../containers/source/mock'; -import { Ecs } from '../../../../graphql/types'; -import { mockTimelineData } from '../../../../mock'; +import { mockBrowserFields } from '../../../../../common/containers/source/mock'; +import { Ecs } from '../../../../../graphql/types'; +import { mockTimelineData } from '../../../../../common/mock'; import { plainRowRenderer } from './plain_row_renderer'; describe('plain_row_renderer', () => { diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/plain_row_renderer.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/plain_row_renderer.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/plain_row_renderer.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/plain_row_renderer.tsx diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/process_draggable.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/process_draggable.test.tsx similarity index 99% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/process_draggable.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/process_draggable.test.tsx index 8cc7323ed358f..91ae94940f7f4 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/process_draggable.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/process_draggable.test.tsx @@ -7,9 +7,9 @@ import { shallow } from 'enzyme'; import React from 'react'; -import { TestProviders } from '../../../../mock'; +import { TestProviders } from '../../../../../common/mock'; import { ProcessDraggable, ProcessDraggableWithNonExistentProcess } from './process_draggable'; -import { useMountAppended } from '../../../../utils/use_mount_appended'; +import { useMountAppended } from '../../../../../common/utils/use_mount_appended'; describe('ProcessDraggable', () => { const mount = useMountAppended(); diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/process_draggable.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/process_draggable.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/process_draggable.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/process_draggable.tsx index 35512c60629dd..6e900fb3cab4d 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/process_draggable.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/process_draggable.tsx @@ -6,7 +6,7 @@ import React from 'react'; -import { DraggableBadge } from '../../../draggables'; +import { DraggableBadge } from '../../../../../common/components/draggables'; import { isNillEmptyOrNotFinite } from './helpers'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/process_hash.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/process_hash.test.tsx similarity index 94% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/process_hash.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/process_hash.test.tsx index 08a9d29967db2..55cc61edb064e 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/process_hash.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/process_hash.test.tsx @@ -6,8 +6,8 @@ import React from 'react'; -import { TestProviders } from '../../../../mock'; -import { useMountAppended } from '../../../../utils/use_mount_appended'; +import { TestProviders } from '../../../../../common/mock'; +import { useMountAppended } from '../../../../../common/utils/use_mount_appended'; import { ProcessHash } from './process_hash'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/process_hash.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/process_hash.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/process_hash.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/process_hash.tsx index b6696d38dc1c5..9658ed89a6087 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/process_hash.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/process_hash.tsx @@ -8,7 +8,7 @@ import { EuiFlexGroup } from '@elastic/eui'; import React from 'react'; import styled from 'styled-components'; -import { DraggableBadge } from '../../../draggables'; +import { DraggableBadge } from '../../../../../common/components/draggables'; import { isNillEmptyOrNotFinite, TokensFlexItem } from './helpers'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/row_renderer.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/row_renderer.tsx similarity index 87% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/row_renderer.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/row_renderer.tsx index 2d9f877fe4af0..5cee0a0118dd2 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/row_renderer.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/row_renderer.tsx @@ -6,8 +6,8 @@ import React from 'react'; -import { BrowserFields } from '../../../../containers/source'; -import { Ecs } from '../../../../graphql/types'; +import { BrowserFields } from '../../../../../common/containers/source'; +import { Ecs } from '../../../../../graphql/types'; import { EventsTrSupplement } from '../../styles'; interface RowRendererContainerProps { diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/suricata/__snapshots__/suricata_details.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/suricata/__snapshots__/suricata_details.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/suricata/__snapshots__/suricata_details.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/suricata/__snapshots__/suricata_details.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/suricata/__snapshots__/suricata_row_renderer.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/suricata/__snapshots__/suricata_row_renderer.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/suricata/__snapshots__/suricata_row_renderer.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/suricata/__snapshots__/suricata_row_renderer.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/suricata/__snapshots__/suricata_signature.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/suricata/__snapshots__/suricata_signature.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/suricata/__snapshots__/suricata_signature.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/suricata/__snapshots__/suricata_signature.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/suricata/suricata_details.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/suricata/suricata_details.test.tsx similarity index 83% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/suricata/suricata_details.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/suricata/suricata_details.test.tsx index 027aa0df8bcdd..d5040cb252370 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/suricata/suricata_details.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/suricata/suricata_details.test.tsx @@ -7,10 +7,10 @@ import { shallow } from 'enzyme'; import React from 'react'; -import { mockBrowserFields } from '../../../../../containers/source/mock'; -import { mockTimelineData } from '../../../../../mock'; -import { TestProviders } from '../../../../../mock/test_providers'; -import { useMountAppended } from '../../../../../utils/use_mount_appended'; +import { mockBrowserFields } from '../../../../../../common/containers/source/mock'; +import { mockTimelineData } from '../../../../../../common/mock'; +import { TestProviders } from '../../../../../../common/mock/test_providers'; +import { useMountAppended } from '../../../../../../common/utils/use_mount_appended'; import { SuricataDetails } from './suricata_details'; describe('SuricataDetails', () => { diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/suricata/suricata_details.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/suricata/suricata_details.tsx similarity index 91% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/suricata/suricata_details.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/suricata/suricata_details.tsx index 17f5f236265ed..c21b609a0f91e 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/suricata/suricata_details.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/suricata/suricata_details.tsx @@ -9,8 +9,8 @@ import { get } from 'lodash/fp'; import React from 'react'; import styled from 'styled-components'; -import { BrowserFields } from '../../../../../containers/source'; -import { Ecs } from '../../../../../graphql/types'; +import { BrowserFields } from '../../../../../../common/containers/source'; +import { Ecs } from '../../../../../../graphql/types'; import { NetflowRenderer } from '../netflow'; import { SuricataSignature } from './suricata_signature'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/suricata/suricata_links.test.ts b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/suricata/suricata_links.test.ts similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/suricata/suricata_links.test.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/suricata/suricata_links.test.ts diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/suricata/suricata_links.ts b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/suricata/suricata_links.ts similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/suricata/suricata_links.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/suricata/suricata_links.ts diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/suricata/suricata_refs.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/suricata/suricata_refs.tsx similarity index 92% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/suricata/suricata_refs.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/suricata/suricata_refs.tsx index dd773bb88ef68..08992216bf74d 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/suricata/suricata_refs.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/suricata/suricata_refs.tsx @@ -8,7 +8,7 @@ import { EuiFlexGroup, EuiFlexItem, EuiLink } from '@elastic/eui'; import React from 'react'; import styled from 'styled-components'; -import { ExternalLinkIcon } from '../../../../external_link_icon'; +import { ExternalLinkIcon } from '../../../../../../common/components/external_link_icon'; import { getLinksFromSignature } from './suricata_links'; const LinkEuiFlexItem = styled(EuiFlexItem)` diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/suricata/suricata_row_renderer.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/suricata/suricata_row_renderer.test.tsx similarity index 85% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/suricata/suricata_row_renderer.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/suricata/suricata_row_renderer.test.tsx index b26d8ce3693b4..a10cd9dc97f6d 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/suricata/suricata_row_renderer.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/suricata/suricata_row_renderer.test.tsx @@ -8,12 +8,12 @@ import { shallow } from 'enzyme'; import { cloneDeep } from 'lodash/fp'; import React from 'react'; -import { mockBrowserFields } from '../../../../../containers/source/mock'; -import { Ecs } from '../../../../../graphql/types'; -import { mockTimelineData } from '../../../../../mock'; -import { TestProviders } from '../../../../../mock/test_providers'; +import { mockBrowserFields } from '../../../../../../common/containers/source/mock'; +import { Ecs } from '../../../../../../graphql/types'; +import { mockTimelineData } from '../../../../../../common/mock'; +import { TestProviders } from '../../../../../../common/mock/test_providers'; import { suricataRowRenderer } from './suricata_row_renderer'; -import { useMountAppended } from '../../../../../utils/use_mount_appended'; +import { useMountAppended } from '../../../../../../common/utils/use_mount_appended'; describe('suricata_row_renderer', () => { const mount = useMountAppended(); diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/suricata/suricata_row_renderer.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/suricata/suricata_row_renderer.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/suricata/suricata_row_renderer.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/suricata/suricata_row_renderer.tsx diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/suricata/suricata_signature.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/suricata/suricata_signature.test.tsx similarity index 93% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/suricata/suricata_signature.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/suricata/suricata_signature.test.tsx index beae16af558ed..245e538f69193 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/suricata/suricata_signature.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/suricata/suricata_signature.test.tsx @@ -7,8 +7,8 @@ import { shallow } from 'enzyme'; import React from 'react'; -import { TestProviders } from '../../../../../mock'; -import { useMountAppended } from '../../../../../utils/use_mount_appended'; +import { TestProviders } from '../../../../../../common/mock'; +import { useMountAppended } from '../../../../../../common/utils/use_mount_appended'; import { SuricataSignature, Tokens, diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/suricata/suricata_signature.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/suricata/suricata_signature.tsx similarity index 87% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/suricata/suricata_signature.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/suricata/suricata_signature.tsx index 66c559729cccd..3ae88a1e7c57d 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/suricata/suricata_signature.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/suricata/suricata_signature.tsx @@ -8,15 +8,18 @@ import { EuiBadge, EuiFlexGroup, EuiFlexItem, EuiToolTip } from '@elastic/eui'; import React from 'react'; import styled from 'styled-components'; -import { DragEffects, DraggableWrapper } from '../../../../drag_and_drop/draggable_wrapper'; -import { escapeDataProviderId } from '../../../../drag_and_drop/helpers'; -import { ExternalLinkIcon } from '../../../../external_link_icon'; -import { GoogleLink } from '../../../../links'; -import { Provider } from '../../../../timeline/data_providers/provider'; +import { + DragEffects, + DraggableWrapper, +} from '../../../../../../common/components/drag_and_drop/draggable_wrapper'; +import { escapeDataProviderId } from '../../../../../../common/components/drag_and_drop/helpers'; +import { ExternalLinkIcon } from '../../../../../../common/components/external_link_icon'; +import { GoogleLink } from '../../../../../../common/components/links'; +import { Provider } from '../../../data_providers/provider'; import { TokensFlexItem } from '../helpers'; import { getBeginningTokens } from './suricata_links'; -import { DefaultDraggable } from '../../../../draggables'; +import { DefaultDraggable } from '../../../../../../common/components/draggables'; import { IS_OPERATOR } from '../../../data_providers/data_provider'; export const SURICATA_SIGNATURE_FIELD_NAME = 'suricata.eve.alert.signature'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/system/__snapshots__/auth_ssh.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/system/__snapshots__/auth_ssh.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/system/__snapshots__/auth_ssh.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/system/__snapshots__/auth_ssh.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/system/__snapshots__/generic_details.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/system/__snapshots__/generic_details.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/system/__snapshots__/generic_details.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/system/__snapshots__/generic_details.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/system/__snapshots__/generic_file_details.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/system/__snapshots__/generic_file_details.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/system/__snapshots__/generic_file_details.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/system/__snapshots__/generic_file_details.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/system/__snapshots__/generic_row_renderer.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/system/__snapshots__/generic_row_renderer.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/system/__snapshots__/generic_row_renderer.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/system/__snapshots__/generic_row_renderer.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/system/__snapshots__/package.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/system/__snapshots__/package.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/system/__snapshots__/package.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/system/__snapshots__/package.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/system/auth_ssh.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/system/auth_ssh.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/system/auth_ssh.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/system/auth_ssh.test.tsx diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/system/auth_ssh.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/system/auth_ssh.tsx similarity index 93% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/system/auth_ssh.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/system/auth_ssh.tsx index 0ff2eec35314d..431f1b5e974d5 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/system/auth_ssh.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/system/auth_ssh.tsx @@ -6,7 +6,7 @@ import React from 'react'; -import { DraggableBadge } from '../../../../draggables'; +import { DraggableBadge } from '../../../../../../common/components/draggables'; import { TokensFlexItem } from '../helpers'; interface Props { diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/system/generic_details.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/system/generic_details.test.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/system/generic_details.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/system/generic_details.test.tsx index 19113d93f7cb0..e622c91e8b870 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/system/generic_details.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/system/generic_details.test.tsx @@ -7,11 +7,11 @@ import { shallow } from 'enzyme'; import React from 'react'; -import { BrowserFields } from '../../../../../containers/source'; -import { mockBrowserFields } from '../../../../../containers/source/mock'; -import { mockTimelineData, TestProviders } from '../../../../../mock'; +import { BrowserFields } from '../../../../../../common/containers/source'; +import { mockBrowserFields } from '../../../../../../common/containers/source/mock'; +import { mockTimelineData, TestProviders } from '../../../../../../common/mock'; import { SystemGenericDetails, SystemGenericLine } from './generic_details'; -import { useMountAppended } from '../../../../../utils/use_mount_appended'; +import { useMountAppended } from '../../../../../../common/utils/use_mount_appended'; describe('SystemGenericDetails', () => { const mount = useMountAppended(); diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/system/generic_details.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/system/generic_details.tsx similarity index 94% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/system/generic_details.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/system/generic_details.tsx index 2ad3eb4681454..e849732d07f6f 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/system/generic_details.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/system/generic_details.tsx @@ -8,10 +8,10 @@ import { EuiFlexGroup, EuiSpacer } from '@elastic/eui'; import { get } from 'lodash/fp'; import React from 'react'; -import { BrowserFields } from '../../../../../containers/source'; -import { Ecs } from '../../../../../graphql/types'; -import { DraggableBadge } from '../../../../draggables'; -import { OverflowField } from '../../../../tables/helpers'; +import { BrowserFields } from '../../../../../../common/containers/source'; +import { Ecs } from '../../../../../../graphql/types'; +import { DraggableBadge } from '../../../../../../common/components/draggables'; +import { OverflowField } from '../../../../../../common/components/tables/helpers'; import * as i18n from './translations'; import { NetflowRenderer } from '../netflow'; @@ -20,7 +20,7 @@ import { Details, TokensFlexItem } from '../helpers'; import { ProcessDraggable } from '../process_draggable'; import { Package } from './package'; import { AuthSsh } from './auth_ssh'; -import { Badge } from '../../../../page'; +import { Badge } from '../../../../../../common/components/page'; interface Props { contextId: string; diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/system/generic_file_details.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/system/generic_file_details.test.tsx similarity index 99% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/system/generic_file_details.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/system/generic_file_details.test.tsx index cab7191c13aef..d8784233b664d 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/system/generic_file_details.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/system/generic_file_details.test.tsx @@ -7,11 +7,11 @@ import { shallow } from 'enzyme'; import React from 'react'; -import { BrowserFields } from '../../../../../containers/source'; -import { mockBrowserFields } from '../../../../../containers/source/mock'; -import { mockTimelineData, TestProviders } from '../../../../../mock'; +import { BrowserFields } from '../../../../../../common/containers/source'; +import { mockBrowserFields } from '../../../../../../common/containers/source/mock'; +import { mockTimelineData, TestProviders } from '../../../../../../common/mock'; import { SystemGenericFileDetails, SystemGenericFileLine } from './generic_file_details'; -import { useMountAppended } from '../../../../../utils/use_mount_appended'; +import { useMountAppended } from '../../../../../../common/utils/use_mount_appended'; describe('SystemGenericFileDetails', () => { const mount = useMountAppended(); diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/system/generic_file_details.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/system/generic_file_details.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/system/generic_file_details.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/system/generic_file_details.tsx index ef7c3b3ccf859..8dd513539a96a 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/system/generic_file_details.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/system/generic_file_details.tsx @@ -8,10 +8,10 @@ import { EuiFlexGroup, EuiSpacer } from '@elastic/eui'; import { get } from 'lodash/fp'; import React from 'react'; -import { BrowserFields } from '../../../../../containers/source'; -import { Ecs } from '../../../../../graphql/types'; -import { DraggableBadge } from '../../../../draggables'; -import { OverflowField } from '../../../../tables/helpers'; +import { BrowserFields } from '../../../../../../common/containers/source'; +import { Ecs } from '../../../../../../graphql/types'; +import { DraggableBadge } from '../../../../../../common/components/draggables'; +import { OverflowField } from '../../../../../../common/components/tables/helpers'; import * as i18n from './translations'; import { NetflowRenderer } from '../netflow'; @@ -23,7 +23,7 @@ import { AuthSsh } from './auth_ssh'; import { ExitCodeDraggable } from '../exit_code_draggable'; import { FileDraggable } from '../file_draggable'; import { Package } from './package'; -import { Badge } from '../../../../page'; +import { Badge } from '../../../../../../common/components/page'; import { ParentProcessDraggable } from '../parent_process_draggable'; import { ProcessHash } from '../process_hash'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/system/generic_row_renderer.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/system/generic_row_renderer.test.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/system/generic_row_renderer.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/system/generic_row_renderer.test.tsx index 2f5fa76855f2b..26cccc82896ea 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/system/generic_row_renderer.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/system/generic_row_renderer.test.tsx @@ -8,9 +8,9 @@ import { shallow } from 'enzyme'; import { cloneDeep } from 'lodash/fp'; import React from 'react'; -import { BrowserFields } from '../../../../../containers/source'; -import { mockBrowserFields } from '../../../../../containers/source/mock'; -import { Ecs } from '../../../../../graphql/types'; +import { BrowserFields } from '../../../../../../common/containers/source'; +import { mockBrowserFields } from '../../../../../../common/containers/source/mock'; +import { Ecs } from '../../../../../../graphql/types'; import { mockDnsEvent, mockFimFileCreatedEvent, @@ -19,7 +19,7 @@ import { mockSocketOpenedEvent, mockTimelineData, TestProviders, -} from '../../../../../mock'; +} from '../../../../../../common/mock'; import { mockEndgameAdminLogon, mockEndgameCreationEvent, @@ -34,8 +34,8 @@ import { mockEndgameTerminationEvent, mockEndgameUserLogoff, mockEndgameUserLogon, -} from '../../../../../mock/mock_endgame_ecs_data'; -import { useMountAppended } from '../../../../../utils/use_mount_appended'; +} from '../../../../../../common/mock/mock_endgame_ecs_data'; +import { useMountAppended } from '../../../../../../common/utils/use_mount_appended'; import { RowRenderer } from '../row_renderer'; import { createDnsRowRenderer, @@ -48,7 +48,7 @@ import { } from './generic_row_renderer'; import * as i18n from './translations'; -jest.mock('../../../../../pages/overview/events_by_dataset'); +jest.mock('../../../../../../overview/components/events_by_dataset'); describe('GenericRowRenderer', () => { const mount = useMountAppended(); diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/system/generic_row_renderer.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/system/generic_row_renderer.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/system/generic_row_renderer.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/system/generic_row_renderer.tsx diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/system/package.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/system/package.test.tsx similarity index 95% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/system/package.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/system/package.test.tsx index 100c8fbe5a988..56f9452ba40b8 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/system/package.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/system/package.test.tsx @@ -7,8 +7,8 @@ import { shallow } from 'enzyme'; import React from 'react'; -import { TestProviders } from '../../../../../mock'; -import { useMountAppended } from '../../../../../utils/use_mount_appended'; +import { TestProviders } from '../../../../../../common/mock'; +import { useMountAppended } from '../../../../../../common/utils/use_mount_appended'; import { Package } from './package'; describe('Package', () => { diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/system/package.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/system/package.tsx similarity index 95% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/system/package.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/system/package.tsx index a28e850e2af96..7aa66f8db8830 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/system/package.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/system/package.tsx @@ -6,7 +6,7 @@ import React from 'react'; -import { DraggableBadge } from '../../../../draggables'; +import { DraggableBadge } from '../../../../../../common/components/draggables'; import { TokensFlexItem } from '../helpers'; interface Props { diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/system/translations.ts b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/system/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/system/translations.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/system/translations.ts diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/translations.ts b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/translations.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/translations.ts diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/unknown_column_renderer.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/unknown_column_renderer.test.tsx similarity index 91% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/unknown_column_renderer.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/unknown_column_renderer.test.tsx index 73d1d5cb441ef..f49318171e8b6 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/unknown_column_renderer.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/unknown_column_renderer.test.tsx @@ -10,9 +10,9 @@ import { cloneDeep } from 'lodash'; import React from 'react'; import { ThemeProvider } from 'styled-components'; -import { TimelineNonEcsData } from '../../../../graphql/types'; -import { defaultHeaders, mockTimelineData } from '../../../../mock'; -import { getEmptyValue } from '../../../empty_value'; +import { TimelineNonEcsData } from '../../../../../graphql/types'; +import { defaultHeaders, mockTimelineData } from '../../../../../common/mock'; +import { getEmptyValue } from '../../../../../common/components/empty_value'; import { unknownColumnRenderer } from './unknown_column_renderer'; import { getValues } from './helpers'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/unknown_column_renderer.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/unknown_column_renderer.tsx similarity index 83% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/unknown_column_renderer.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/unknown_column_renderer.tsx index 4b4a4a3d43780..49bc61f00a63e 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/unknown_column_renderer.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/unknown_column_renderer.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { getEmptyTagValue } from '../../../empty_value'; +import { getEmptyTagValue } from '../../../../../common/components/empty_value'; import { ColumnRenderer } from './column_renderer'; export const unknownColumnRenderer: ColumnRenderer = { diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/user_host_working_dir.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/user_host_working_dir.test.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/user_host_working_dir.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/user_host_working_dir.test.tsx index 45b670acb569a..7f460d30d709c 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/user_host_working_dir.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/user_host_working_dir.test.tsx @@ -7,9 +7,9 @@ import { shallow } from 'enzyme'; import React from 'react'; -import { TestProviders } from '../../../../mock'; +import { TestProviders } from '../../../../../common/mock'; import { UserHostWorkingDir } from './user_host_working_dir'; -import { useMountAppended } from '../../../../utils/use_mount_appended'; +import { useMountAppended } from '../../../../../common/utils/use_mount_appended'; describe('UserHostWorkingDir', () => { const mount = useMountAppended(); diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/user_host_working_dir.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/user_host_working_dir.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/user_host_working_dir.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/user_host_working_dir.tsx index d370afee2585f..80585b37cfd9e 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/user_host_working_dir.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/user_host_working_dir.tsx @@ -6,7 +6,7 @@ import React from 'react'; -import { DraggableBadge } from '../../../draggables'; +import { DraggableBadge } from '../../../../../common/components/draggables'; import { TokensFlexItem } from './helpers'; import { HostWorkingDir } from './host_working_dir'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/zeek/__snapshots__/zeek_details.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/zeek/__snapshots__/zeek_details.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/zeek/__snapshots__/zeek_details.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/zeek/__snapshots__/zeek_details.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/zeek/__snapshots__/zeek_row_renderer.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/zeek/__snapshots__/zeek_row_renderer.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/zeek/__snapshots__/zeek_row_renderer.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/zeek/__snapshots__/zeek_row_renderer.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/zeek/__snapshots__/zeek_signature.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/zeek/__snapshots__/zeek_signature.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/zeek/__snapshots__/zeek_signature.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/zeek/__snapshots__/zeek_signature.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/zeek/translations.ts b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/zeek/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/zeek/translations.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/zeek/translations.ts diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/zeek/zeek_details.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/zeek/zeek_details.test.tsx similarity index 95% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/zeek/zeek_details.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/zeek/zeek_details.test.tsx index b45e4c41762bc..d3ec7922342c3 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/zeek/zeek_details.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/zeek/zeek_details.test.tsx @@ -6,9 +6,9 @@ import React from 'react'; -import { mockBrowserFields } from '../../../../../containers/source/mock'; -import { mockTimelineData, TestProviders } from '../../../../../mock'; -import { useMountAppended } from '../../../../../utils/use_mount_appended'; +import { mockBrowserFields } from '../../../../../../common/containers/source/mock'; +import { mockTimelineData, TestProviders } from '../../../../../../common/mock'; +import { useMountAppended } from '../../../../../../common/utils/use_mount_appended'; import { ZeekDetails } from './zeek_details'; describe('ZeekDetails', () => { diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/zeek/zeek_details.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/zeek/zeek_details.tsx similarity index 88% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/zeek/zeek_details.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/zeek/zeek_details.tsx index d8561186b4546..4f991429d6a4d 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/zeek/zeek_details.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/zeek/zeek_details.tsx @@ -8,8 +8,8 @@ import { EuiSpacer } from '@elastic/eui'; import React from 'react'; import styled from 'styled-components'; -import { BrowserFields } from '../../../../../containers/source'; -import { Ecs } from '../../../../../graphql/types'; +import { BrowserFields } from '../../../../../../common/containers/source'; +import { Ecs } from '../../../../../../graphql/types'; import { NetflowRenderer } from '../netflow'; import { ZeekSignature } from './zeek_signature'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/zeek/zeek_row_renderer.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/zeek/zeek_row_renderer.test.tsx similarity index 87% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/zeek/zeek_row_renderer.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/zeek/zeek_row_renderer.test.tsx index 456b93eb829ee..2197ccb0ce2e0 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/zeek/zeek_row_renderer.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/zeek/zeek_row_renderer.test.tsx @@ -8,10 +8,10 @@ import { shallow } from 'enzyme'; import { cloneDeep } from 'lodash/fp'; import React from 'react'; -import { mockBrowserFields } from '../../../../../containers/source/mock'; -import { Ecs } from '../../../../../graphql/types'; -import { mockTimelineData, TestProviders } from '../../../../../mock'; -import { useMountAppended } from '../../../../../utils/use_mount_appended'; +import { mockBrowserFields } from '../../../../../../common/containers/source/mock'; +import { Ecs } from '../../../../../../graphql/types'; +import { mockTimelineData, TestProviders } from '../../../../../../common/mock'; +import { useMountAppended } from '../../../../../../common/utils/use_mount_appended'; import { zeekRowRenderer } from './zeek_row_renderer'; describe('zeek_row_renderer', () => { diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/zeek/zeek_row_renderer.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/zeek/zeek_row_renderer.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/zeek/zeek_row_renderer.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/zeek/zeek_row_renderer.tsx diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/zeek/zeek_signature.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/zeek/zeek_signature.test.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/zeek/zeek_signature.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/zeek/zeek_signature.test.tsx index f199b537f1be0..f416da5625042 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/zeek/zeek_signature.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/zeek/zeek_signature.test.tsx @@ -8,9 +8,9 @@ import { shallow } from 'enzyme'; import { cloneDeep } from 'lodash/fp'; import React from 'react'; -import { Ecs } from '../../../../../graphql/types'; -import { mockTimelineData, TestProviders } from '../../../../../mock'; -import { useMountAppended } from '../../../../../utils/use_mount_appended'; +import { Ecs } from '../../../../../../graphql/types'; +import { mockTimelineData, TestProviders } from '../../../../../../common/mock'; +import { useMountAppended } from '../../../../../../common/utils/use_mount_appended'; import { ZeekSignature, extractStateValue, diff --git a/x-pack/plugins/siem/public/components/timeline/body/renderers/zeek/zeek_signature.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/zeek/zeek_signature.tsx similarity index 94% rename from x-pack/plugins/siem/public/components/timeline/body/renderers/zeek/zeek_signature.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/zeek/zeek_signature.tsx index 4cb8140e22cef..cdf4a8cba68ab 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/renderers/zeek/zeek_signature.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/renderers/zeek/zeek_signature.tsx @@ -9,12 +9,15 @@ import { get } from 'lodash/fp'; import React from 'react'; import styled from 'styled-components'; -import { Ecs } from '../../../../../graphql/types'; -import { DragEffects, DraggableWrapper } from '../../../../drag_and_drop/draggable_wrapper'; -import { escapeDataProviderId } from '../../../../drag_and_drop/helpers'; -import { ExternalLinkIcon } from '../../../../external_link_icon'; -import { GoogleLink, ReputationLink } from '../../../../links'; -import { Provider } from '../../../../timeline/data_providers/provider'; +import { Ecs } from '../../../../../../graphql/types'; +import { + DragEffects, + DraggableWrapper, +} from '../../../../../../common/components/drag_and_drop/draggable_wrapper'; +import { escapeDataProviderId } from '../../../../../../common/components/drag_and_drop/helpers'; +import { ExternalLinkIcon } from '../../../../../../common/components/external_link_icon'; +import { GoogleLink, ReputationLink } from '../../../../../../common/components/links'; +import { Provider } from '../../../data_providers/provider'; import { IS_OPERATOR } from '../../../data_providers/data_provider'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/sort/__snapshots__/sort_indicator.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/body/sort/__snapshots__/sort_indicator.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/sort/__snapshots__/sort_indicator.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/body/sort/__snapshots__/sort_indicator.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/body/sort/index.ts b/x-pack/plugins/siem/public/timelines/components/timeline/body/sort/index.ts similarity index 89% rename from x-pack/plugins/siem/public/components/timeline/body/sort/index.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/body/sort/index.ts index 4a55ba8e1e8ee..93fbe314e1dad 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/sort/index.ts +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/sort/index.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { Direction } from '../../../../graphql/types'; +import { Direction } from '../../../../../graphql/types'; import { ColumnId } from '../column_id'; /** Specifies a column's sort direction */ diff --git a/x-pack/plugins/siem/public/components/timeline/body/sort/sort_indicator.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/sort/sort_indicator.test.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/timeline/body/sort/sort_indicator.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/sort/sort_indicator.test.tsx index db3e96a4e2650..43738da44b17f 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/sort/sort_indicator.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/sort/sort_indicator.test.tsx @@ -7,7 +7,7 @@ import { mount, shallow } from 'enzyme'; import React from 'react'; -import { Direction } from '../../../../graphql/types'; +import { Direction } from '../../../../../graphql/types'; import { getDirection, SortIndicator } from './sort_indicator'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/sort/sort_indicator.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/sort/sort_indicator.tsx similarity index 95% rename from x-pack/plugins/siem/public/components/timeline/body/sort/sort_indicator.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/sort/sort_indicator.tsx index 74fb1e5e4034c..c148e2f6c6295 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/sort/sort_indicator.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/sort/sort_indicator.tsx @@ -7,7 +7,7 @@ import { EuiIcon } from '@elastic/eui'; import React from 'react'; -import { Direction } from '../../../../graphql/types'; +import { Direction } from '../../../../../graphql/types'; import { SortDirection } from '.'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/stateful_body.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/stateful_body.test.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/timeline/body/stateful_body.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/stateful_body.test.tsx index 4945939ac2bdc..126f3439f4636 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/stateful_body.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/stateful_body.test.tsx @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { mockBrowserFields } from '../../../containers/source/mock'; +import { mockBrowserFields } from '../../../../common/containers/source/mock'; import { defaultHeaders } from './column_headers/default_headers'; import { getColumnHeaders } from './column_headers/helpers'; diff --git a/x-pack/plugins/siem/public/components/timeline/body/stateful_body.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/body/stateful_body.tsx similarity index 95% rename from x-pack/plugins/siem/public/components/timeline/body/stateful_body.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/body/stateful_body.tsx index 76f26d3dda5af..1aed63ff71d6d 100644 --- a/x-pack/plugins/siem/public/components/timeline/body/stateful_body.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/body/stateful_body.tsx @@ -10,13 +10,14 @@ import React, { useCallback, useEffect } from 'react'; import { connect, ConnectedProps } from 'react-redux'; import deepEqual from 'fast-deep-equal'; -import { BrowserFields } from '../../../containers/source'; -import { TimelineItem } from '../../../graphql/types'; -import { Note } from '../../../lib/note'; -import { appSelectors, State, timelineSelectors } from '../../../store'; -import { timelineActions, appActions } from '../../../store/actions'; +import { BrowserFields } from '../../../../common/containers/source'; +import { TimelineItem } from '../../../../graphql/types'; +import { Note } from '../../../../common/lib/note'; +import { appSelectors, State } from '../../../../common/store'; +import { appActions } from '../../../../common/store/actions'; import { ColumnHeaderOptions, TimelineModel } from '../../../store/timeline/model'; import { timelineDefaults } from '../../../store/timeline/defaults'; +import { timelineActions, timelineSelectors } from '../../../store/timeline'; import { AddNoteToEvent, UpdateNote } from '../../notes/helpers'; import { OnColumnRemoved, diff --git a/x-pack/plugins/siem/public/components/timeline/body/translations.ts b/x-pack/plugins/siem/public/timelines/components/timeline/body/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/body/translations.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/body/translations.ts diff --git a/x-pack/plugins/siem/public/components/timeline/data_providers/__snapshots__/data_providers.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/data_providers/__snapshots__/data_providers.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/data_providers/__snapshots__/data_providers.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/data_providers/__snapshots__/data_providers.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/data_providers/__snapshots__/empty.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/data_providers/__snapshots__/empty.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/data_providers/__snapshots__/empty.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/data_providers/__snapshots__/empty.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/data_providers/__snapshots__/provider.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/data_providers/__snapshots__/provider.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/data_providers/__snapshots__/provider.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/data_providers/__snapshots__/provider.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/data_providers/__snapshots__/providers.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/data_providers/__snapshots__/providers.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/data_providers/__snapshots__/providers.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/data_providers/__snapshots__/providers.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/data_providers/data_provider.ts b/x-pack/plugins/siem/public/timelines/components/timeline/data_providers/data_provider.ts similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/data_providers/data_provider.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/data_providers/data_provider.ts diff --git a/x-pack/plugins/siem/public/components/timeline/data_providers/data_providers.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/data_providers/data_providers.test.tsx similarity index 94% rename from x-pack/plugins/siem/public/components/timeline/data_providers/data_providers.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/data_providers/data_providers.test.tsx index b77d37e8e31ab..54e7cb20aeed3 100644 --- a/x-pack/plugins/siem/public/components/timeline/data_providers/data_providers.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/data_providers/data_providers.test.tsx @@ -7,8 +7,8 @@ import { shallow } from 'enzyme'; import React from 'react'; -import { TestProviders } from '../../../mock/test_providers'; -import { useMountAppended } from '../../../utils/use_mount_appended'; +import { TestProviders } from '../../../../common/mock/test_providers'; +import { useMountAppended } from '../../../../common/utils/use_mount_appended'; import { DataProviders } from '.'; import { DataProvider } from './data_provider'; diff --git a/x-pack/plugins/siem/public/components/timeline/data_providers/empty.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/data_providers/empty.test.tsx similarity index 92% rename from x-pack/plugins/siem/public/components/timeline/data_providers/empty.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/data_providers/empty.test.tsx index 10586657b52a3..9cc5704808c66 100644 --- a/x-pack/plugins/siem/public/components/timeline/data_providers/empty.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/data_providers/empty.test.tsx @@ -8,7 +8,7 @@ import { mount, shallow } from 'enzyme'; import React from 'react'; import { Empty } from './empty'; -import { TestProviders } from '../../../mock/test_providers'; +import { TestProviders } from '../../../../common/mock/test_providers'; describe('Empty', () => { describe('rendering', () => { diff --git a/x-pack/plugins/siem/public/components/timeline/data_providers/empty.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/data_providers/empty.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/timeline/data_providers/empty.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/data_providers/empty.tsx index 1c225eba20b4f..84f533977a9a3 100644 --- a/x-pack/plugins/siem/public/components/timeline/data_providers/empty.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/data_providers/empty.tsx @@ -8,7 +8,7 @@ import { EuiBadge, EuiText } from '@elastic/eui'; import React from 'react'; import styled from 'styled-components'; -import { AndOrBadge } from '../../and_or_badge'; +import { AndOrBadge } from '../and_or_badge'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/components/timeline/data_providers/helpers.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/data_providers/helpers.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/data_providers/helpers.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/data_providers/helpers.tsx diff --git a/x-pack/plugins/siem/public/components/timeline/data_providers/index.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/data_providers/index.tsx similarity index 94% rename from x-pack/plugins/siem/public/components/timeline/data_providers/index.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/data_providers/index.tsx index caead394db051..13c91f25c8800 100644 --- a/x-pack/plugins/siem/public/components/timeline/data_providers/index.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/data_providers/index.tsx @@ -8,12 +8,12 @@ import { rgba } from 'polished'; import React from 'react'; import styled from 'styled-components'; -import { BrowserFields } from '../../../containers/source'; -import { DroppableWrapper } from '../../drag_and_drop/droppable_wrapper'; +import { BrowserFields } from '../../../../common/containers/source'; +import { DroppableWrapper } from '../../../../common/components/drag_and_drop/droppable_wrapper'; import { droppableTimelineProvidersPrefix, IS_DRAGGING_CLASS_NAME, -} from '../../drag_and_drop/helpers'; +} from '../../../../common/components/drag_and_drop/helpers'; import { OnDataProviderEdited, OnDataProviderRemoved, diff --git a/x-pack/plugins/siem/public/components/timeline/data_providers/mock/mock_data_providers.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/data_providers/mock/mock_data_providers.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/data_providers/mock/mock_data_providers.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/data_providers/mock/mock_data_providers.tsx diff --git a/x-pack/plugins/siem/public/components/timeline/data_providers/provider.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/data_providers/provider.test.tsx similarity index 92% rename from x-pack/plugins/siem/public/components/timeline/data_providers/provider.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/data_providers/provider.test.tsx index f0d7ca83fb391..d6d337bb3e1d7 100644 --- a/x-pack/plugins/siem/public/components/timeline/data_providers/provider.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/data_providers/provider.test.tsx @@ -7,7 +7,7 @@ import { mount, shallow } from 'enzyme'; import React from 'react'; -import { TestProviders } from '../../../mock/test_providers'; +import { TestProviders } from '../../../../common/mock/test_providers'; import { mockDataProviders } from './mock/mock_data_providers'; import { Provider } from './provider'; diff --git a/x-pack/plugins/siem/public/components/timeline/data_providers/provider.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/data_providers/provider.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/data_providers/provider.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/data_providers/provider.tsx diff --git a/x-pack/plugins/siem/public/components/timeline/data_providers/provider_badge.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/data_providers/provider_badge.tsx similarity index 95% rename from x-pack/plugins/siem/public/components/timeline/data_providers/provider_badge.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/data_providers/provider_badge.tsx index 859ced39ebc4f..b3682c0d55147 100644 --- a/x-pack/plugins/siem/public/components/timeline/data_providers/provider_badge.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/data_providers/provider_badge.tsx @@ -10,8 +10,8 @@ import { isString } from 'lodash/fp'; import React, { useCallback, useMemo } from 'react'; import styled from 'styled-components'; -import { ProviderContainer } from '../../drag_and_drop/provider_container'; -import { getEmptyString } from '../../empty_value'; +import { getEmptyString } from '../../../../common/components/empty_value'; +import { ProviderContainer } from '../../../../common/components/drag_and_drop/provider_container'; import { EXISTS_OPERATOR, QueryOperator } from './data_provider'; diff --git a/x-pack/plugins/siem/public/components/timeline/data_providers/provider_item_actions.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/data_providers/provider_item_actions.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/timeline/data_providers/provider_item_actions.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/data_providers/provider_item_actions.tsx index 121f832221d3e..540b1b80259a0 100644 --- a/x-pack/plugins/siem/public/components/timeline/data_providers/provider_item_actions.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/data_providers/provider_item_actions.tsx @@ -12,7 +12,7 @@ import { import React, { FunctionComponent } from 'react'; import styled from 'styled-components'; -import { BrowserFields } from '../../../containers/source'; +import { BrowserFields } from '../../../../common/containers/source'; import { OnDataProviderEdited } from '../events'; import { QueryOperator, EXISTS_OPERATOR } from './data_provider'; import { StatefulEditDataProvider } from '../../edit_data_provider'; diff --git a/x-pack/plugins/siem/public/timelines/components/timeline/data_providers/provider_item_and.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/data_providers/provider_item_and.tsx new file mode 100644 index 0000000000000..171112b28d789 --- /dev/null +++ b/x-pack/plugins/siem/public/timelines/components/timeline/data_providers/provider_item_and.tsx @@ -0,0 +1,95 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { EuiFlexItem } from '@elastic/eui'; +import React from 'react'; + +import { AndOrBadge } from '../and_or_badge'; +import { BrowserFields } from '../../../../common/containers/source'; +import { + OnChangeDataProviderKqlQuery, + OnDataProviderEdited, + OnDataProviderRemoved, + OnToggleDataProviderEnabled, + OnToggleDataProviderExcluded, +} from '../events'; + +import { DataProvidersAnd, IS_OPERATOR } from './data_provider'; +import { ProviderItemBadge } from './provider_item_badge'; + +interface ProviderItemAndPopoverProps { + browserFields: BrowserFields; + dataProvidersAnd: DataProvidersAnd[]; + onChangeDataProviderKqlQuery: OnChangeDataProviderKqlQuery; + onDataProviderEdited: OnDataProviderEdited; + onDataProviderRemoved: OnDataProviderRemoved; + onToggleDataProviderEnabled: OnToggleDataProviderEnabled; + onToggleDataProviderExcluded: OnToggleDataProviderExcluded; + providerId: string; + timelineId: string; +} + +export class ProviderItemAnd extends React.PureComponent { + public render() { + const { + browserFields, + dataProvidersAnd, + onDataProviderEdited, + providerId, + timelineId, + } = this.props; + + return dataProvidersAnd.map((providerAnd: DataProvidersAnd, index: number) => ( + + + + + + this.deleteAndProvider(providerId, providerAnd.id)} + field={providerAnd.queryMatch.displayField || providerAnd.queryMatch.field} + kqlQuery={providerAnd.kqlQuery} + isEnabled={providerAnd.enabled} + isExcluded={providerAnd.excluded} + onDataProviderEdited={onDataProviderEdited} + operator={providerAnd.queryMatch.operator || IS_OPERATOR} + providerId={providerId} + timelineId={timelineId} + toggleEnabledProvider={() => + this.toggleEnabledAndProvider(providerId, !providerAnd.enabled, providerAnd.id) + } + toggleExcludedProvider={() => + this.toggleExcludedAndProvider(providerId, !providerAnd.excluded, providerAnd.id) + } + val={providerAnd.queryMatch.displayValue || providerAnd.queryMatch.value} + /> + + + )); + } + + private deleteAndProvider = (providerId: string, andProviderId: string) => { + this.props.onDataProviderRemoved(providerId, andProviderId); + }; + + private toggleEnabledAndProvider = ( + providerId: string, + enabled: boolean, + andProviderId: string + ) => { + this.props.onToggleDataProviderEnabled({ providerId, enabled, andProviderId }); + }; + + private toggleExcludedAndProvider = ( + providerId: string, + excluded: boolean, + andProviderId: string + ) => { + this.props.onToggleDataProviderExcluded({ providerId, excluded, andProviderId }); + }; +} diff --git a/x-pack/plugins/siem/public/timelines/components/timeline/data_providers/provider_item_and_drag_drop.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/data_providers/provider_item_and_drag_drop.tsx new file mode 100644 index 0000000000000..4a9358befc51f --- /dev/null +++ b/x-pack/plugins/siem/public/timelines/components/timeline/data_providers/provider_item_and_drag_drop.tsx @@ -0,0 +1,136 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import { EuiBadge, EuiFlexGroup, EuiFlexItem, EuiText } from '@elastic/eui'; +import { rgba } from 'polished'; +import React, { useCallback } from 'react'; +import styled from 'styled-components'; + +import { AndOrBadge } from '../and_or_badge'; +import { + OnChangeDataProviderKqlQuery, + OnChangeDroppableAndProvider, + OnDataProviderEdited, + OnDataProviderRemoved, + OnToggleDataProviderEnabled, + OnToggleDataProviderExcluded, +} from '../events'; + +import { BrowserFields } from '../../../../common/containers/source'; + +import { DataProvider } from './data_provider'; +import { ProviderItemAnd } from './provider_item_and'; + +import * as i18n from './translations'; + +const DropAndTargetDataProvidersContainer = styled(EuiFlexItem)` + margin: 0px 8px; +`; + +DropAndTargetDataProvidersContainer.displayName = 'DropAndTargetDataProvidersContainer'; + +const DropAndTargetDataProviders = styled.div<{ hasAndItem: boolean }>` + min-width: 230px; + width: auto; + border: 0.1rem dashed ${props => props.theme.eui.euiColorSuccess}; + border-radius: 5px; + text-align: center; + padding: 3px 10px; + display: flex; + justify-content: center; + align-items: center; + ${props => + props.hasAndItem + ? `&:hover { + transition: background-color 0.7s ease; + background-color: ${() => rgba(props.theme.eui.euiColorSuccess, 0.2)}; + }` + : ''}; + cursor: ${({ hasAndItem }) => (!hasAndItem ? `default` : 'inherit')}; +`; + +DropAndTargetDataProviders.displayName = 'DropAndTargetDataProviders'; + +const NumberProviderAndBadge = (styled(EuiBadge)` + margin: 0px 5px; +` as unknown) as typeof EuiBadge; + +NumberProviderAndBadge.displayName = 'NumberProviderAndBadge'; + +interface ProviderItemDropProps { + browserFields: BrowserFields; + dataProvider: DataProvider; + mousePosition?: { x: number; y: number; boundLeft: number; boundTop: number }; + onChangeDataProviderKqlQuery: OnChangeDataProviderKqlQuery; + onChangeDroppableAndProvider: OnChangeDroppableAndProvider; + onDataProviderEdited: OnDataProviderEdited; + onDataProviderRemoved: OnDataProviderRemoved; + onToggleDataProviderEnabled: OnToggleDataProviderEnabled; + onToggleDataProviderExcluded: OnToggleDataProviderExcluded; + timelineId: string; +} + +export const ProviderItemAndDragDrop = React.memo( + ({ + browserFields, + dataProvider, + onChangeDataProviderKqlQuery, + onChangeDroppableAndProvider, + onDataProviderEdited, + onDataProviderRemoved, + onToggleDataProviderEnabled, + onToggleDataProviderExcluded, + timelineId, + }) => { + const onMouseEnter = useCallback(() => onChangeDroppableAndProvider(dataProvider.id), [ + onChangeDroppableAndProvider, + dataProvider.id, + ]); + const onMouseLeave = useCallback(() => onChangeDroppableAndProvider(''), [ + onChangeDroppableAndProvider, + ]); + const hasAndItem = dataProvider.and.length > 0; + return ( + + + + {hasAndItem && ( + + {dataProvider.and.length} + + )} + + {i18n.DROP_HERE_TO_ADD_AN} + + + + + + + ); + } +); + +ProviderItemAndDragDrop.displayName = 'ProviderItemAndDragDrop'; diff --git a/x-pack/plugins/siem/public/components/timeline/data_providers/provider_item_badge.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/data_providers/provider_item_badge.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/timeline/data_providers/provider_item_badge.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/data_providers/provider_item_badge.tsx index b268315efb919..b53c08a8bb10d 100644 --- a/x-pack/plugins/siem/public/components/timeline/data_providers/provider_item_badge.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/data_providers/provider_item_badge.tsx @@ -8,13 +8,13 @@ import { noop } from 'lodash/fp'; import React, { useCallback, useEffect, useState } from 'react'; import { useDispatch } from 'react-redux'; -import { BrowserFields } from '../../../containers/source'; +import { BrowserFields } from '../../../../common/containers/source'; import { OnDataProviderEdited } from '../events'; import { ProviderBadge } from './provider_badge'; import { ProviderItemActions } from './provider_item_actions'; import { DataProvidersAnd, QueryOperator } from './data_provider'; -import { dragAndDropActions } from '../../../store/drag_and_drop'; +import { dragAndDropActions } from '../../../../common/store/drag_and_drop'; import { TimelineContext } from '../timeline_context'; interface ProviderItemBadgeProps { diff --git a/x-pack/plugins/siem/public/components/timeline/data_providers/providers.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/data_providers/providers.test.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/timeline/data_providers/providers.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/data_providers/providers.test.tsx index 43e84bac508ea..34202d090e06f 100644 --- a/x-pack/plugins/siem/public/components/timeline/data_providers/providers.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/data_providers/providers.test.tsx @@ -7,16 +7,16 @@ import { shallow } from 'enzyme'; import React from 'react'; -import { createKibanaCoreStartMock } from '../../../mock/kibana_core'; -import { TestProviders } from '../../../mock/test_providers'; -import { DroppableWrapper } from '../../drag_and_drop/droppable_wrapper'; -import { FilterManager } from '../../../../../../../src/plugins/data/public'; +import { createKibanaCoreStartMock } from '../../../../common/mock/kibana_core'; +import { TestProviders } from '../../../../common/mock/test_providers'; +import { DroppableWrapper } from '../../../../common/components/drag_and_drop/droppable_wrapper'; +import { FilterManager } from '../../../../../../../../src/plugins/data/public'; import { TimelineContext } from '../timeline_context'; import { mockDataProviders } from './mock/mock_data_providers'; import { Providers } from './providers'; import { DELETE_CLASS_NAME, ENABLE_CLASS_NAME, EXCLUDE_CLASS_NAME } from './provider_item_actions'; -import { useMountAppended } from '../../../utils/use_mount_appended'; +import { useMountAppended } from '../../../../common/utils/use_mount_appended'; const mockUiSettingsForFilterManager = createKibanaCoreStartMock().uiSettings; diff --git a/x-pack/plugins/siem/public/components/timeline/data_providers/providers.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/data_providers/providers.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/timeline/data_providers/providers.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/data_providers/providers.tsx index 8d9d0c69d53cd..7f10a7b16c7b2 100644 --- a/x-pack/plugins/siem/public/components/timeline/data_providers/providers.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/data_providers/providers.tsx @@ -10,13 +10,13 @@ import React, { useMemo } from 'react'; import { Draggable, DraggingStyle, Droppable, NotDraggingStyle } from 'react-beautiful-dnd'; import styled, { css } from 'styled-components'; -import { AndOrBadge } from '../../and_or_badge'; -import { BrowserFields } from '../../../containers/source'; +import { AndOrBadge } from '../and_or_badge'; +import { BrowserFields } from '../../../../common/containers/source'; import { getTimelineProviderDroppableId, IS_DRAGGING_CLASS_NAME, getTimelineProviderDraggableId, -} from '../../drag_and_drop/helpers'; +} from '../../../../common/components/drag_and_drop/helpers'; import { OnDataProviderEdited, OnDataProviderRemoved, diff --git a/x-pack/plugins/siem/public/components/timeline/data_providers/translations.ts b/x-pack/plugins/siem/public/timelines/components/timeline/data_providers/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/data_providers/translations.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/data_providers/translations.ts diff --git a/x-pack/plugins/siem/public/components/timeline/events.ts b/x-pack/plugins/siem/public/timelines/components/timeline/events.ts similarity index 97% rename from x-pack/plugins/siem/public/components/timeline/events.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/events.ts index f977c03ed3053..6c9a9b8b89679 100644 --- a/x-pack/plugins/siem/public/components/timeline/events.ts +++ b/x-pack/plugins/siem/public/timelines/components/timeline/events.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { ColumnHeaderOptions } from '../../store/timeline/model'; +import { ColumnHeaderOptions } from '../../../timelines/store/timeline/model'; import { ColumnId } from './body/column_id'; import { SortDirection } from './body/sort'; import { QueryOperator } from './data_providers/data_provider'; diff --git a/x-pack/plugins/siem/public/components/timeline/expandable_event/index.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/expandable_event/index.tsx similarity index 84% rename from x-pack/plugins/siem/public/components/timeline/expandable_event/index.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/expandable_event/index.tsx index 218d4db9901cb..b08c6afcaf4a6 100644 --- a/x-pack/plugins/siem/public/components/timeline/expandable_event/index.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/expandable_event/index.tsx @@ -7,10 +7,10 @@ import React from 'react'; import styled from 'styled-components'; -import { BrowserFields } from '../../../containers/source'; -import { ColumnHeaderOptions } from '../../../store/timeline/model'; -import { DetailItem } from '../../../graphql/types'; -import { StatefulEventDetails } from '../../event_details/stateful_event_details'; +import { BrowserFields } from '../../../../common/containers/source'; +import { ColumnHeaderOptions } from '../../../../timelines/store/timeline/model'; +import { DetailItem } from '../../../../graphql/types'; +import { StatefulEventDetails } from '../../../../common/components/event_details/stateful_event_details'; import { LazyAccordion } from '../../lazy_accordion'; import { OnUpdateColumns } from '../events'; diff --git a/x-pack/plugins/siem/public/components/timeline/expandable_event/translations.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/expandable_event/translations.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/expandable_event/translations.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/expandable_event/translations.tsx diff --git a/x-pack/plugins/siem/public/components/timeline/fetch_kql_timeline.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/fetch_kql_timeline.tsx similarity index 88% rename from x-pack/plugins/siem/public/components/timeline/fetch_kql_timeline.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/fetch_kql_timeline.tsx index 16eaa80308205..e75f87e0d6011 100644 --- a/x-pack/plugins/siem/public/components/timeline/fetch_kql_timeline.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/fetch_kql_timeline.tsx @@ -9,11 +9,11 @@ import { connect, ConnectedProps } from 'react-redux'; import deepEqual from 'fast-deep-equal'; import { IIndexPattern } from 'src/plugins/data/public'; -import { timelineSelectors, State } from '../../store'; -import { inputsActions } from '../../store/actions'; -import { InputsModelId } from '../../store/inputs/constants'; -import { useUpdateKql } from '../../utils/kql/use_update_kql'; - +import { State } from '../../../common/store'; +import { inputsActions } from '../../../common/store/actions'; +import { InputsModelId } from '../../../common/store/inputs/constants'; +import { useUpdateKql } from '../../../common/utils/kql/use_update_kql'; +import { timelineSelectors } from '../../store/timeline'; export interface TimelineKqlFetchProps { id: string; indexPattern: IIndexPattern; diff --git a/x-pack/plugins/siem/public/components/timeline/footer/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/footer/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/footer/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/footer/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/footer/index.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/footer/index.test.tsx similarity index 99% rename from x-pack/plugins/siem/public/components/timeline/footer/index.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/footer/index.test.tsx index d54a4cee83e52..86b362aefca1a 100644 --- a/x-pack/plugins/siem/public/components/timeline/footer/index.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/footer/index.test.tsx @@ -8,7 +8,7 @@ import { mount, shallow } from 'enzyme'; import { getOr } from 'lodash/fp'; import React from 'react'; -import { TestProviders } from '../../../mock/test_providers'; +import { TestProviders } from '../../../../common/mock/test_providers'; import { FooterComponent, PagingControlComponent } from './index'; import { mockData } from './mock'; diff --git a/x-pack/plugins/siem/public/components/timeline/footer/index.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/footer/index.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/timeline/footer/index.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/footer/index.tsx index 7a025e96e57f2..556f7b043e3ab 100644 --- a/x-pack/plugins/siem/public/components/timeline/footer/index.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/footer/index.tsx @@ -28,7 +28,7 @@ import { OnChangeItemsPerPage, OnLoadMore } from '../events'; import { LastUpdatedAt } from './last_updated'; import * as i18n from './translations'; import { useTimelineTypeContext } from '../timeline_context'; -import { useEventDetailsWidthContext } from '../../events_viewer/event_details_width_context'; +import { useEventDetailsWidthContext } from '../../../../common/components/events_viewer/event_details_width_context'; export const isCompactFooter = (width: number): boolean => width < 600; diff --git a/x-pack/plugins/siem/public/components/timeline/footer/last_updated.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/footer/last_updated.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/footer/last_updated.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/footer/last_updated.tsx diff --git a/x-pack/plugins/siem/public/components/timeline/footer/mock.ts b/x-pack/plugins/siem/public/timelines/components/timeline/footer/mock.ts similarity index 96% rename from x-pack/plugins/siem/public/components/timeline/footer/mock.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/footer/mock.ts index f6aaf9475f2c4..fcd30ee2b8500 100644 --- a/x-pack/plugins/siem/public/components/timeline/footer/mock.ts +++ b/x-pack/plugins/siem/public/timelines/components/timeline/footer/mock.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -import { EventsTimelineData } from '../../../graphql/types'; +import { EventsTimelineData } from '../../../../graphql/types'; export const mockData: { Events: EventsTimelineData } = { Events: { diff --git a/x-pack/plugins/siem/public/components/timeline/footer/translations.ts b/x-pack/plugins/siem/public/timelines/components/timeline/footer/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/footer/translations.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/footer/translations.ts diff --git a/x-pack/plugins/siem/public/components/timeline/header/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/header/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/header/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/header/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/timeline/header/index.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/header/index.test.tsx similarity index 87% rename from x-pack/plugins/siem/public/components/timeline/header/index.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/header/index.test.tsx index 7da76df497768..a3855c848cf24 100644 --- a/x-pack/plugins/siem/public/components/timeline/header/index.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/header/index.test.tsx @@ -7,18 +7,18 @@ import { shallow } from 'enzyme'; import React from 'react'; -import { mockIndexPattern } from '../../../mock'; -import { createKibanaCoreStartMock } from '../../../mock/kibana_core'; -import { TestProviders } from '../../../mock/test_providers'; -import { FilterManager } from '../../../../../../../src/plugins/data/public'; +import { mockIndexPattern } from '../../../../common/mock'; +import { createKibanaCoreStartMock } from '../../../../common/mock/kibana_core'; +import { TestProviders } from '../../../../common/mock/test_providers'; +import { FilterManager } from '../../../../../../../../src/plugins/data/public'; import { mockDataProviders } from '../data_providers/mock/mock_data_providers'; -import { useMountAppended } from '../../../utils/use_mount_appended'; +import { useMountAppended } from '../../../../common/utils/use_mount_appended'; import { TimelineHeader } from '.'; const mockUiSettingsForFilterManager = createKibanaCoreStartMock().uiSettings; -jest.mock('../../../lib/kibana'); +jest.mock('../../../../common/lib/kibana'); describe('Header', () => { const indexPattern = mockIndexPattern; diff --git a/x-pack/plugins/siem/public/components/timeline/header/index.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/header/index.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/timeline/header/index.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/header/index.tsx index 58e6b6e837249..974b23bedac01 100644 --- a/x-pack/plugins/siem/public/components/timeline/header/index.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/header/index.tsx @@ -18,7 +18,7 @@ import { OnToggleDataProviderExcluded, } from '../events'; import { StatefulSearchOrFilter } from '../search_or_filter'; -import { BrowserFields } from '../../../containers/source'; +import { BrowserFields } from '../../../../common/containers/source'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/components/timeline/header/translations.ts b/x-pack/plugins/siem/public/timelines/components/timeline/header/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/header/translations.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/header/translations.ts diff --git a/x-pack/plugins/siem/public/components/timeline/helpers.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/helpers.test.tsx similarity index 99% rename from x-pack/plugins/siem/public/components/timeline/helpers.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/helpers.test.tsx index fc5a8ae924f82..87eb9cc45b98b 100644 --- a/x-pack/plugins/siem/public/components/timeline/helpers.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/helpers.test.tsx @@ -5,12 +5,12 @@ */ import { cloneDeep } from 'lodash/fp'; -import { mockIndexPattern } from '../../mock'; +import { mockIndexPattern } from '../../../common/mock'; import { mockDataProviders } from './data_providers/mock/mock_data_providers'; import { buildGlobalQuery, combineQueries } from './helpers'; -import { mockBrowserFields } from '../../containers/source/mock'; -import { EsQueryConfig, Filter, esFilters } from '../../../../../../src/plugins/data/public'; +import { mockBrowserFields } from '../../../common/containers/source/mock'; +import { EsQueryConfig, Filter, esFilters } from '../../../../../../../src/plugins/data/public'; const cleanUpKqlQuery = (str: string) => str.replace(/\n/g, '').replace(/\s\s+/g, ' '); const startDate = new Date('2018-03-23T18:49:23.132Z').valueOf(); diff --git a/x-pack/plugins/siem/public/components/timeline/helpers.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/helpers.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/timeline/helpers.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/helpers.tsx index 53ab7d81cadc2..776ff114734d9 100644 --- a/x-pack/plugins/siem/public/components/timeline/helpers.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/helpers.tsx @@ -7,16 +7,16 @@ import { isEmpty, isNumber, get } from 'lodash/fp'; import memoizeOne from 'memoize-one'; -import { escapeQueryValue, convertToBuildEsQuery } from '../../lib/keury'; +import { escapeQueryValue, convertToBuildEsQuery } from '../../../common/lib/keury'; import { DataProvider, DataProvidersAnd, EXISTS_OPERATOR } from './data_providers/data_provider'; -import { BrowserFields } from '../../containers/source'; +import { BrowserFields } from '../../../common/containers/source'; import { IIndexPattern, Query, EsQueryConfig, Filter, -} from '../../../../../../src/plugins/data/public'; +} from '../../../../../../../src/plugins/data/public'; const convertDateFieldToQuery = (field: string, value: string | number) => `${field}: ${isNumber(value) ? value : new Date(value).valueOf()}`; diff --git a/x-pack/plugins/siem/public/components/timeline/index.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/index.tsx similarity index 94% rename from x-pack/plugins/siem/public/components/timeline/index.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/index.tsx index bebc6f9b654c5..fca16ffadce84 100644 --- a/x-pack/plugins/siem/public/components/timeline/index.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/index.tsx @@ -8,12 +8,12 @@ import React, { useEffect, useCallback, useMemo } from 'react'; import { connect, ConnectedProps } from 'react-redux'; import deepEqual from 'fast-deep-equal'; -import { WithSource } from '../../containers/source'; -import { useSignalIndex } from '../../containers/detection_engine/signals/use_signal_index'; -import { inputsModel, inputsSelectors, State, timelineSelectors } from '../../store'; -import { timelineActions } from '../../store/actions'; -import { ColumnHeaderOptions, TimelineModel } from '../../store/timeline/model'; -import { timelineDefaults } from '../../store/timeline/defaults'; +import { WithSource } from '../../../common/containers/source'; +import { useSignalIndex } from '../../../alerts/containers/detection_engine/signals/use_signal_index'; +import { inputsModel, inputsSelectors, State } from '../../../common/store'; +import { timelineActions, timelineSelectors } from '../../store/timeline'; +import { ColumnHeaderOptions, TimelineModel } from '../../../timelines/store/timeline/model'; +import { timelineDefaults } from '../../../timelines/store/timeline/defaults'; import { defaultHeaders } from './body/column_headers/default_headers'; import { OnChangeItemsPerPage, diff --git a/x-pack/plugins/siem/public/components/timeline/insert_timeline_popover/index.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/insert_timeline_popover/index.test.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/timeline/insert_timeline_popover/index.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/insert_timeline_popover/index.test.tsx index c5aea833a4b2f..d5cfc397e1990 100644 --- a/x-pack/plugins/siem/public/components/timeline/insert_timeline_popover/index.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/insert_timeline_popover/index.test.tsx @@ -9,7 +9,7 @@ import { mount } from 'enzyme'; /* eslint-disable @kbn/eslint/module_migration */ import routeData from 'react-router'; /* eslint-enable @kbn/eslint/module_migration */ -import { InsertTimelinePopoverComponent } from './'; +import { InsertTimelinePopoverComponent } from '.'; const mockDispatch = jest.fn(); jest.mock('react-redux', () => { diff --git a/x-pack/plugins/siem/public/components/timeline/insert_timeline_popover/index.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/insert_timeline_popover/index.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/timeline/insert_timeline_popover/index.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/insert_timeline_popover/index.tsx index 573e010868bab..37b1125cd673a 100644 --- a/x-pack/plugins/siem/public/components/timeline/insert_timeline_popover/index.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/insert_timeline_popover/index.tsx @@ -12,7 +12,7 @@ import { useDispatch } from 'react-redux'; import { OpenTimelineResult } from '../../open_timeline/types'; import { SelectableTimeline } from '../selectable_timeline'; import * as i18n from '../translations'; -import { timelineActions } from '../../../store/timeline'; +import { timelineActions } from '../../../../timelines/store/timeline'; interface InsertTimelinePopoverProps { isDisabled: boolean; diff --git a/x-pack/plugins/siem/public/components/timeline/insert_timeline_popover/use_insert_timeline.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/insert_timeline_popover/use_insert_timeline.tsx similarity index 87% rename from x-pack/plugins/siem/public/components/timeline/insert_timeline_popover/use_insert_timeline.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/insert_timeline_popover/use_insert_timeline.tsx index e4d828b68f3dc..1a81c131de015 100644 --- a/x-pack/plugins/siem/public/components/timeline/insert_timeline_popover/use_insert_timeline.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/insert_timeline_popover/use_insert_timeline.tsx @@ -5,9 +5,9 @@ */ import { useCallback, useState } from 'react'; -import { useBasePath } from '../../../lib/kibana'; -import { CursorPosition } from '../../markdown_editor'; -import { FormData, FormHook } from '../../../shared_imports'; +import { useBasePath } from '../../../../common/lib/kibana'; +import { CursorPosition } from '../../../../common/components/markdown_editor'; +import { FormData, FormHook } from '../../../../shared_imports'; export const useInsertTimeline = (form: FormHook, fieldName: string) => { const basePath = window.location.origin + useBasePath(); diff --git a/x-pack/plugins/siem/public/components/pin/index.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/pin/index.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/pin/index.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/pin/index.test.tsx diff --git a/x-pack/plugins/siem/public/components/pin/index.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/pin/index.tsx similarity index 93% rename from x-pack/plugins/siem/public/components/pin/index.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/pin/index.tsx index 9f898f9acaf2e..800ea814fdd50 100644 --- a/x-pack/plugins/siem/public/components/pin/index.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/pin/index.tsx @@ -8,7 +8,7 @@ import { EuiButtonIcon, IconSize } from '@elastic/eui'; import { noop } from 'lodash/fp'; import React from 'react'; -import * as i18n from '../../components/timeline/body/translations'; +import * as i18n from '../body/translations'; export type PinIcon = 'pin' | 'pinFilled'; diff --git a/x-pack/plugins/siem/public/components/timeline/properties/helpers.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/properties/helpers.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/timeline/properties/helpers.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/properties/helpers.tsx index 4c64c8a100b41..1453d58c2ffd5 100644 --- a/x-pack/plugins/siem/public/components/timeline/properties/helpers.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/properties/helpers.tsx @@ -23,15 +23,15 @@ import styled from 'styled-components'; import { useHistory } from 'react-router-dom'; import { useSelector } from 'react-redux'; -import { Note } from '../../../lib/note'; +import { Note } from '../../../../common/lib/note'; import { Notes } from '../../notes'; import { AssociateNote, UpdateNote } from '../../notes/helpers'; import { NOTES_PANEL_WIDTH } from './notes_size'; import { ButtonContainer, DescriptionContainer, LabelText, NameField, StyledStar } from './styles'; import * as i18n from './translations'; -import { SiemPageName } from '../../../pages/home/types'; -import { timelineSelectors } from '../../../store/timeline'; -import { State } from '../../../store'; +import { SiemPageName } from '../../../../app/types'; +import { timelineSelectors } from '../../../../timelines/store/timeline'; +import { State } from '../../../../common/store'; export const historyToolTip = 'The chronological history of actions related to this timeline'; export const streamLiveToolTip = 'Update the Timeline as new data arrives'; diff --git a/x-pack/plugins/siem/public/components/timeline/properties/index.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/properties/index.test.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/timeline/properties/index.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/properties/index.test.tsx index e942c8f36dc83..17968a5977069 100644 --- a/x-pack/plugins/siem/public/components/timeline/properties/index.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/properties/index.test.tsx @@ -8,16 +8,19 @@ import { mount } from 'enzyme'; import React from 'react'; import { Provider as ReduxStoreProvider } from 'react-redux'; -import { mockGlobalState, apolloClientObservable } from '../../../mock'; -import { createStore, State } from '../../../store'; -import { useThrottledResizeObserver } from '../../utils'; - +import { + mockGlobalState, + apolloClientObservable, + SUB_PLUGINS_REDUCER, +} from '../../../../common/mock'; +import { createStore, State } from '../../../../common/store'; +import { useThrottledResizeObserver } from '../../../../common/components/utils'; import { Properties, showDescriptionThreshold, showNotesThreshold } from '.'; -jest.mock('../../../lib/kibana'); +jest.mock('../../../../common/lib/kibana'); let mockedWidth = 1000; -jest.mock('../../utils'); +jest.mock('../../../../common/components/utils'); (useThrottledResizeObserver as jest.Mock).mockImplementation(() => ({ width: mockedWidth, })); @@ -26,11 +29,11 @@ describe('Properties', () => { const usersViewing = ['elastic']; const state: State = mockGlobalState; - let store = createStore(state, apolloClientObservable); + let store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); beforeEach(() => { jest.clearAllMocks(); - store = createStore(state, apolloClientObservable); + store = createStore(state, SUB_PLUGINS_REDUCER, apolloClientObservable); mockedWidth = 1000; }); diff --git a/x-pack/plugins/siem/public/components/timeline/properties/index.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/properties/index.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/timeline/properties/index.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/properties/index.tsx index 0080fcb1e6924..502cc85ce907a 100644 --- a/x-pack/plugins/siem/public/components/timeline/properties/index.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/properties/index.tsx @@ -6,9 +6,9 @@ import React, { useState, useCallback, useMemo } from 'react'; -import { useThrottledResizeObserver } from '../../utils'; -import { Note } from '../../../lib/note'; -import { InputsModelId } from '../../../store/inputs/constants'; +import { useThrottledResizeObserver } from '../../../../common/components/utils'; +import { Note } from '../../../../common/lib/note'; +import { InputsModelId } from '../../../../common/store/inputs/constants'; import { AssociateNote, UpdateNote } from '../../notes/helpers'; import { TimelineProperties } from './styles'; diff --git a/x-pack/plugins/siem/public/components/timeline/properties/notes_size.ts b/x-pack/plugins/siem/public/timelines/components/timeline/properties/notes_size.ts similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/properties/notes_size.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/properties/notes_size.ts diff --git a/x-pack/plugins/siem/public/components/timeline/properties/properties_left.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/properties/properties_left.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/timeline/properties/properties_left.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/properties/properties_left.tsx index 3016def8a80b1..52766422e49c3 100644 --- a/x-pack/plugins/siem/public/components/timeline/properties/properties_left.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/properties/properties_left.tsx @@ -10,8 +10,8 @@ import React from 'react'; import styled from 'styled-components'; import { Description, Name, NotesButton, StarIcon } from './helpers'; import { AssociateNote, UpdateNote } from '../../notes/helpers'; -import { Note } from '../../../lib/note'; -import { SuperDatePicker } from '../../super_date_picker'; +import { Note } from '../../../../common/lib/note'; +import { SuperDatePicker } from '../../../../common/components/super_date_picker'; import * as i18n from './translations'; diff --git a/x-pack/plugins/siem/public/components/timeline/properties/properties_right.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/properties/properties_right.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/timeline/properties/properties_right.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/properties/properties_right.tsx index 59d268487cca7..3db64390b51b7 100644 --- a/x-pack/plugins/siem/public/components/timeline/properties/properties_right.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/properties/properties_right.tsx @@ -17,11 +17,11 @@ import { import { NewTimeline, Description, NotesButton, NewCase } from './helpers'; import { OpenTimelineModalButton } from '../../open_timeline/open_timeline_modal/open_timeline_modal_button'; import { OpenTimelineModal } from '../../open_timeline/open_timeline_modal'; -import { InspectButton, InspectButtonContainer } from '../../inspect'; +import { InspectButton, InspectButtonContainer } from '../../../../common/components/inspect'; import * as i18n from './translations'; import { AssociateNote } from '../../notes/helpers'; -import { Note } from '../../../lib/note'; +import { Note } from '../../../../common/lib/note'; export const PropertiesRightStyle = styled(EuiFlexGroup)` margin-right: 5px; diff --git a/x-pack/plugins/siem/public/components/timeline/properties/styles.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/properties/styles.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/properties/styles.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/properties/styles.tsx diff --git a/x-pack/plugins/siem/public/components/timeline/properties/translations.ts b/x-pack/plugins/siem/public/timelines/components/timeline/properties/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/properties/translations.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/properties/translations.ts diff --git a/x-pack/plugins/siem/public/components/timeline/query_bar/index.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/query_bar/index.test.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/timeline/query_bar/index.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/query_bar/index.test.tsx index a78e5b8e1d226..546f06b60cb56 100644 --- a/x-pack/plugins/siem/public/components/timeline/query_bar/index.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/query_bar/index.test.tsx @@ -7,13 +7,13 @@ import { mount } from 'enzyme'; import React from 'react'; -import { DEFAULT_FROM, DEFAULT_TO } from '../../../../common/constants'; -import { mockBrowserFields } from '../../../containers/source/mock'; -import { convertKueryToElasticSearchQuery } from '../../../lib/keury'; -import { mockIndexPattern, TestProviders } from '../../../mock'; -import { createKibanaCoreStartMock } from '../../../mock/kibana_core'; -import { QueryBar } from '../../query_bar'; -import { FilterManager } from '../../../../../../../src/plugins/data/public'; +import { DEFAULT_FROM, DEFAULT_TO } from '../../../../../common/constants'; +import { mockBrowserFields } from '../../../../common/containers/source/mock'; +import { convertKueryToElasticSearchQuery } from '../../../../common/lib/keury'; +import { mockIndexPattern, TestProviders } from '../../../../common/mock'; +import { createKibanaCoreStartMock } from '../../../../common/mock/kibana_core'; +import { QueryBar } from '../../../../common/components/query_bar'; +import { FilterManager } from '../../../../../../../../src/plugins/data/public'; import { mockDataProviders } from '../data_providers/mock/mock_data_providers'; import { buildGlobalQuery } from '../helpers'; @@ -21,7 +21,7 @@ import { QueryBarTimeline, QueryBarTimelineComponentProps, getDataProviderFilter const mockUiSettingsForFilterManager = createKibanaCoreStartMock().uiSettings; -jest.mock('../../../lib/kibana'); +jest.mock('../../../../common/lib/kibana'); describe('Timeline QueryBar ', () => { // We are doing that because we need to wrapped this component with redux diff --git a/x-pack/plugins/siem/public/components/timeline/query_bar/index.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/query_bar/index.tsx similarity index 94% rename from x-pack/plugins/siem/public/components/timeline/query_bar/index.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/query_bar/index.tsx index 7d2b4f71183dd..07a769751cb0f 100644 --- a/x-pack/plugins/siem/public/components/timeline/query_bar/index.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/query_bar/index.tsx @@ -17,15 +17,15 @@ import { FilterManager, SavedQuery, SavedQueryTimeFilter, -} from '../../../../../../../src/plugins/data/public'; +} from '../../../../../../../../src/plugins/data/public'; -import { BrowserFields } from '../../../containers/source'; -import { convertKueryToElasticSearchQuery } from '../../../lib/keury'; -import { KueryFilterQuery, KueryFilterQueryKind } from '../../../store'; -import { KqlMode } from '../../../store/timeline/model'; -import { useSavedQueryServices } from '../../../utils/saved_query_services'; -import { DispatchUpdateReduxTime } from '../../super_date_picker'; -import { QueryBar } from '../../query_bar'; +import { BrowserFields } from '../../../../common/containers/source'; +import { convertKueryToElasticSearchQuery } from '../../../../common/lib/keury'; +import { KueryFilterQuery, KueryFilterQueryKind } from '../../../../common/store'; +import { KqlMode } from '../../../../timelines/store/timeline/model'; +import { useSavedQueryServices } from '../../../../common/utils/saved_query_services'; +import { DispatchUpdateReduxTime } from '../../../../common/components/super_date_picker'; +import { QueryBar } from '../../../../common/components/query_bar'; import { DataProvider } from '../data_providers/data_provider'; import { buildGlobalQuery } from '../helpers'; diff --git a/x-pack/plugins/siem/public/components/timeline/refetch_timeline.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/refetch_timeline.tsx similarity index 83% rename from x-pack/plugins/siem/public/components/timeline/refetch_timeline.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/refetch_timeline.tsx index 73c20d9b9b6b4..aef6e0df604cb 100644 --- a/x-pack/plugins/siem/public/components/timeline/refetch_timeline.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/refetch_timeline.tsx @@ -7,9 +7,9 @@ import React, { useEffect } from 'react'; import { useDispatch } from 'react-redux'; -import { inputsModel } from '../../store'; -import { inputsActions } from '../../store/actions'; -import { InputsModelId } from '../../store/inputs/constants'; +import { inputsModel } from '../../../common/store'; +import { inputsActions } from '../../../common/store/actions'; +import { InputsModelId } from '../../../common/store/inputs/constants'; export interface TimelineRefetchProps { id: string; diff --git a/x-pack/plugins/siem/public/components/timeline/search_or_filter/helpers.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/search_or_filter/helpers.test.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/search_or_filter/helpers.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/search_or_filter/helpers.test.tsx diff --git a/x-pack/plugins/siem/public/components/timeline/search_or_filter/helpers.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/search_or_filter/helpers.tsx similarity index 95% rename from x-pack/plugins/siem/public/components/timeline/search_or_filter/helpers.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/search_or_filter/helpers.tsx index 5db453988cbb8..77257e367c6f5 100644 --- a/x-pack/plugins/siem/public/components/timeline/search_or_filter/helpers.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/search_or_filter/helpers.tsx @@ -8,10 +8,10 @@ import { EuiSpacer, EuiText } from '@elastic/eui'; import React from 'react'; import styled from 'styled-components'; -import { AndOrBadge } from '../../and_or_badge'; +import { AndOrBadge } from '../and_or_badge'; import * as i18n from './translations'; -import { KqlMode } from '../../../store/timeline/model'; +import { KqlMode } from '../../../../timelines/store/timeline/model'; const AndOrContainer = styled.div` position: relative; diff --git a/x-pack/plugins/siem/public/components/timeline/search_or_filter/index.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/search_or_filter/index.tsx similarity index 92% rename from x-pack/plugins/siem/public/components/timeline/search_or_filter/index.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/search_or_filter/index.tsx index fa92ef9ce5965..22fbaadf2e816 100644 --- a/x-pack/plugins/siem/public/components/timeline/search_or_filter/index.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/search_or_filter/index.tsx @@ -10,21 +10,24 @@ import { connect, ConnectedProps } from 'react-redux'; import { Dispatch } from 'redux'; import deepEqual from 'fast-deep-equal'; -import { Filter, FilterManager, IIndexPattern } from '../../../../../../../src/plugins/data/public'; -import { BrowserFields } from '../../../containers/source'; -import { convertKueryToElasticSearchQuery } from '../../../lib/keury'; +import { + Filter, + FilterManager, + IIndexPattern, +} from '../../../../../../../../src/plugins/data/public'; +import { BrowserFields } from '../../../../common/containers/source'; +import { convertKueryToElasticSearchQuery } from '../../../../common/lib/keury'; import { KueryFilterQuery, SerializedFilterQuery, State, - timelineSelectors, inputsModel, inputsSelectors, -} from '../../../store'; -import { timelineActions } from '../../../store/actions'; -import { KqlMode, TimelineModel, EventType } from '../../../store/timeline/model'; -import { timelineDefaults } from '../../../store/timeline/defaults'; -import { dispatchUpdateReduxTime } from '../../super_date_picker'; +} from '../../../../common/store'; +import { timelineActions, timelineSelectors } from '../../../store/timeline'; +import { KqlMode, TimelineModel, EventType } from '../../../../timelines/store/timeline/model'; +import { timelineDefaults } from '../../../../timelines/store/timeline/defaults'; +import { dispatchUpdateReduxTime } from '../../../../common/components/super_date_picker'; import { SearchOrFilter } from './search_or_filter'; interface OwnProps { diff --git a/x-pack/plugins/siem/public/components/timeline/search_or_filter/pick_events.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/search_or_filter/pick_events.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/timeline/search_or_filter/pick_events.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/search_or_filter/pick_events.tsx index 3117bae745286..85097f93464b3 100644 --- a/x-pack/plugins/siem/public/components/timeline/search_or_filter/pick_events.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/search_or_filter/pick_events.tsx @@ -8,7 +8,7 @@ import { EuiHealth, EuiSuperSelect } from '@elastic/eui'; import React, { memo } from 'react'; import styled from 'styled-components'; -import { EventType } from '../../../store/timeline/model'; +import { EventType } from '../../../../timelines/store/timeline/model'; import * as i18n from './translations'; interface EventTypeOptionItem { diff --git a/x-pack/plugins/siem/public/components/timeline/search_or_filter/search_or_filter.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/search_or_filter/search_or_filter.tsx similarity index 93% rename from x-pack/plugins/siem/public/components/timeline/search_or_filter/search_or_filter.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/search_or_filter/search_or_filter.tsx index 0b8ed71135744..388085d1361f3 100644 --- a/x-pack/plugins/siem/public/components/timeline/search_or_filter/search_or_filter.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/search_or_filter/search_or_filter.tsx @@ -8,11 +8,15 @@ import { EuiFlexGroup, EuiFlexItem, EuiSuperSelect, EuiToolTip } from '@elastic/ import React from 'react'; import styled, { createGlobalStyle } from 'styled-components'; -import { Filter, FilterManager, IIndexPattern } from '../../../../../../../src/plugins/data/public'; -import { BrowserFields } from '../../../containers/source'; -import { KueryFilterQuery, KueryFilterQueryKind } from '../../../store'; -import { KqlMode, EventType } from '../../../store/timeline/model'; -import { DispatchUpdateReduxTime } from '../../super_date_picker'; +import { + Filter, + FilterManager, + IIndexPattern, +} from '../../../../../../../../src/plugins/data/public'; +import { BrowserFields } from '../../../../common/containers/source'; +import { KueryFilterQuery, KueryFilterQueryKind } from '../../../../common/store'; +import { KqlMode, EventType } from '../../../../timelines/store/timeline/model'; +import { DispatchUpdateReduxTime } from '../../../../common/components/super_date_picker'; import { DataProvider } from '../data_providers/data_provider'; import { QueryBarTimeline } from '../query_bar'; diff --git a/x-pack/plugins/siem/public/components/timeline/search_or_filter/translations.ts b/x-pack/plugins/siem/public/timelines/components/timeline/search_or_filter/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/search_or_filter/translations.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/search_or_filter/translations.ts diff --git a/x-pack/plugins/siem/public/components/timeline/search_super_select/index.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/search_super_select/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/search_super_select/index.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/search_super_select/index.tsx diff --git a/x-pack/plugins/siem/public/components/timeline/selectable_timeline/index.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/selectable_timeline/index.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/timeline/selectable_timeline/index.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/selectable_timeline/index.tsx index 964bb2061333d..fb3cb3f177ca0 100644 --- a/x-pack/plugins/siem/public/components/timeline/selectable_timeline/index.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/selectable_timeline/index.tsx @@ -21,14 +21,14 @@ import React, { memo, useCallback, useMemo, useState, useEffect } from 'react'; import { ListProps } from 'react-virtualized'; import styled from 'styled-components'; -import { useGetAllTimeline } from '../../../containers/timeline/all'; -import { SortFieldTimeline, Direction } from '../../../graphql/types'; -import { TimelineType, TimelineTypeLiteralWithNull } from '../../../../common/types/timeline'; +import { TimelineType, TimelineTypeLiteralWithNull } from '../../../../../common/types/timeline'; +import { useGetAllTimeline } from '../../../containers/all'; +import { SortFieldTimeline, Direction } from '../../../../graphql/types'; import { isUntitled } from '../../open_timeline/helpers'; import * as i18nTimeline from '../../open_timeline/translations'; import { OpenTimelineResult } from '../../open_timeline/types'; -import { getEmptyTagValue } from '../../empty_value'; +import { getEmptyTagValue } from '../../../../common/components/empty_value'; import * as i18n from '../translations'; diff --git a/x-pack/plugins/siem/public/components/skeleton_row/__snapshots__/index.test.tsx.snap b/x-pack/plugins/siem/public/timelines/components/timeline/skeleton_row/__snapshots__/index.test.tsx.snap similarity index 100% rename from x-pack/plugins/siem/public/components/skeleton_row/__snapshots__/index.test.tsx.snap rename to x-pack/plugins/siem/public/timelines/components/timeline/skeleton_row/__snapshots__/index.test.tsx.snap diff --git a/x-pack/plugins/siem/public/components/skeleton_row/index.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/skeleton_row/index.test.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/skeleton_row/index.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/skeleton_row/index.test.tsx index 0ee54a1a20003..b63359077bf2c 100644 --- a/x-pack/plugins/siem/public/components/skeleton_row/index.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/skeleton_row/index.test.tsx @@ -7,7 +7,7 @@ import { mount, shallow } from 'enzyme'; import React from 'react'; -import { TestProviders } from '../../mock'; +import { TestProviders } from '../../../../common/mock'; import { SkeletonRow } from './index'; describe('SkeletonRow', () => { diff --git a/x-pack/plugins/siem/public/components/skeleton_row/index.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/skeleton_row/index.tsx similarity index 100% rename from x-pack/plugins/siem/public/components/skeleton_row/index.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/skeleton_row/index.tsx diff --git a/x-pack/plugins/siem/public/components/timeline/styles.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/styles.tsx similarity index 98% rename from x-pack/plugins/siem/public/components/timeline/styles.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/styles.tsx index 16fb57714829c..aad80cbdfe337 100644 --- a/x-pack/plugins/siem/public/components/timeline/styles.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/styles.tsx @@ -8,8 +8,8 @@ import { EuiLoadingSpinner } from '@elastic/eui'; import { rgba } from 'polished'; import styled, { createGlobalStyle } from 'styled-components'; -import { EventType } from '../../store/timeline/model'; -import { IS_TIMELINE_FIELD_DRAGGING_CLASS_NAME } from '../drag_and_drop/helpers'; +import { EventType } from '../../../timelines/store/timeline/model'; +import { IS_TIMELINE_FIELD_DRAGGING_CLASS_NAME } from '../../../common/components/drag_and_drop/helpers'; /** * TIMELINE BODY diff --git a/x-pack/plugins/siem/public/components/timeline/timeline.test.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/timeline.test.tsx similarity index 96% rename from x-pack/plugins/siem/public/components/timeline/timeline.test.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/timeline.test.tsx index 0d0ce79c77be7..578f85fe9ddff 100644 --- a/x-pack/plugins/siem/public/components/timeline/timeline.test.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/timeline.test.tsx @@ -9,11 +9,11 @@ import React from 'react'; import { MockedProvider } from 'react-apollo/test-utils'; import useResizeObserver from 'use-resize-observer/polyfilled'; -import { timelineQuery } from '../../containers/timeline/index.gql_query'; -import { mockBrowserFields } from '../../containers/source/mock'; -import { Direction } from '../../graphql/types'; -import { defaultHeaders, mockTimelineData, mockIndexPattern } from '../../mock'; -import { TestProviders } from '../../mock/test_providers'; +import { timelineQuery } from '../../containers/index.gql_query'; +import { mockBrowserFields } from '../../../common/containers/source/mock'; +import { Direction } from '../../../graphql/types'; +import { defaultHeaders, mockTimelineData, mockIndexPattern } from '../../../common/mock'; +import { TestProviders } from '../../../common/mock/test_providers'; import { DELETE_CLASS_NAME, @@ -23,9 +23,9 @@ import { import { TimelineComponent, Props as TimelineComponentProps } from './timeline'; import { Sort } from './body/sort'; import { mockDataProviders } from './data_providers/mock/mock_data_providers'; -import { useMountAppended } from '../../utils/use_mount_appended'; +import { useMountAppended } from '../../../common/utils/use_mount_appended'; -jest.mock('../../lib/kibana'); +jest.mock('../../../common/lib/kibana'); const mockUseResizeObserver: jest.Mock = useResizeObserver as jest.Mock; jest.mock('use-resize-observer/polyfilled'); diff --git a/x-pack/plugins/siem/public/components/timeline/timeline.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/timeline.tsx similarity index 95% rename from x-pack/plugins/siem/public/components/timeline/timeline.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/timeline.tsx index cc3116235557f..79d86e5b556d8 100644 --- a/x-pack/plugins/siem/public/components/timeline/timeline.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/timeline.tsx @@ -10,11 +10,11 @@ import React, { useState, useMemo } from 'react'; import styled from 'styled-components'; import { FlyoutHeaderWithCloseButton } from '../flyout/header_with_close_button'; -import { BrowserFields } from '../../containers/source'; -import { TimelineQuery } from '../../containers/timeline'; -import { Direction } from '../../graphql/types'; -import { useKibana } from '../../lib/kibana'; -import { ColumnHeaderOptions, KqlMode, EventType } from '../../store/timeline/model'; +import { BrowserFields } from '../../../common/containers/source'; +import { TimelineQuery } from '../../containers/index'; +import { Direction } from '../../../graphql/types'; +import { useKibana } from '../../../common/lib/kibana'; +import { ColumnHeaderOptions, KqlMode, EventType } from '../../../timelines/store/timeline/model'; import { defaultHeaders } from './body/column_headers/default_headers'; import { Sort } from './body/sort'; import { StatefulBody } from './body/stateful_body'; @@ -37,7 +37,7 @@ import { Filter, FilterManager, IIndexPattern, -} from '../../../../../../src/plugins/data/public'; +} from '../../../../../../../src/plugins/data/public'; const TimelineContainer = styled.div` height: 100%; diff --git a/x-pack/plugins/siem/public/components/timeline/timeline_context.tsx b/x-pack/plugins/siem/public/timelines/components/timeline/timeline_context.tsx similarity index 97% rename from x-pack/plugins/siem/public/components/timeline/timeline_context.tsx rename to x-pack/plugins/siem/public/timelines/components/timeline/timeline_context.tsx index 25a0078b6066a..7c1eadd8e8bed 100644 --- a/x-pack/plugins/siem/public/components/timeline/timeline_context.tsx +++ b/x-pack/plugins/siem/public/timelines/components/timeline/timeline_context.tsx @@ -6,7 +6,7 @@ import React, { createContext, memo, useContext, useEffect, useState } from 'react'; -import { FilterManager } from '../../../../../../src/plugins/data/public'; +import { FilterManager } from '../../../../../../../src/plugins/data/public'; import { TimelineAction } from './body/actions'; diff --git a/x-pack/plugins/siem/public/components/timeline/translations.ts b/x-pack/plugins/siem/public/timelines/components/timeline/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/components/timeline/translations.ts rename to x-pack/plugins/siem/public/timelines/components/timeline/translations.ts diff --git a/x-pack/plugins/siem/public/containers/timeline/all/index.gql_query.ts b/x-pack/plugins/siem/public/timelines/containers/all/index.gql_query.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/timeline/all/index.gql_query.ts rename to x-pack/plugins/siem/public/timelines/containers/all/index.gql_query.ts diff --git a/x-pack/plugins/siem/public/containers/timeline/all/index.tsx b/x-pack/plugins/siem/public/timelines/containers/all/index.tsx similarity index 93% rename from x-pack/plugins/siem/public/containers/timeline/all/index.tsx rename to x-pack/plugins/siem/public/timelines/containers/all/index.tsx index e1d1edc1a8cec..bdab29953a249 100644 --- a/x-pack/plugins/siem/public/containers/timeline/all/index.tsx +++ b/x-pack/plugins/siem/public/timelines/containers/all/index.tsx @@ -9,19 +9,19 @@ import memoizeOne from 'memoize-one'; import { useCallback, useState, useEffect } from 'react'; import { useDispatch } from 'react-redux'; -import { OpenTimelineResult } from '../../../components/open_timeline/types'; -import { errorToToaster, useStateToaster } from '../../../components/toasters'; +import { OpenTimelineResult } from '../../components/open_timeline/types'; +import { errorToToaster, useStateToaster } from '../../../common/components/toasters'; import { GetAllTimeline, PageInfoTimeline, SortTimeline, TimelineResult, } from '../../../graphql/types'; -import { inputsActions } from '../../../store/inputs'; -import { useApolloClient } from '../../../utils/apollo_context'; +import { inputsActions } from '../../../common/store/inputs'; +import { useApolloClient } from '../../../common/utils/apollo_context'; import { allTimelinesQuery } from './index.gql_query'; -import * as i18n from '../../../pages/timelines/translations'; +import * as i18n from '../../pages/translations'; import { TimelineTypeLiteralWithNull } from '../../../../common/types/timeline'; export interface AllTimelinesArgs { diff --git a/x-pack/plugins/siem/public/containers/timeline/api.ts b/x-pack/plugins/siem/public/timelines/containers/api.ts similarity index 90% rename from x-pack/plugins/siem/public/containers/timeline/api.ts rename to x-pack/plugins/siem/public/timelines/containers/api.ts index 023e2e6af9f88..8afbec05938eb 100644 --- a/x-pack/plugins/siem/public/containers/timeline/api.ts +++ b/x-pack/plugins/siem/public/timelines/containers/api.ts @@ -15,11 +15,14 @@ import { } from '../../../common/types/timeline'; import { TIMELINE_URL, TIMELINE_IMPORT_URL, TIMELINE_EXPORT_URL } from '../../../common/constants'; -import { KibanaServices } from '../../lib/kibana'; -import { ExportSelectedData } from '../../components/generic_downloader'; +import { KibanaServices } from '../../common/lib/kibana'; +import { ExportSelectedData } from '../../common/components/generic_downloader'; -import { createToasterPlainError } from '../case/utils'; -import { ImportDataProps, ImportDataResponse } from '../detection_engine/rules'; +import { createToasterPlainError } from '../../cases/containers/utils'; +import { + ImportDataProps, + ImportDataResponse, +} from '../../alerts/containers/detection_engine/rules'; interface RequestPostTimeline { timeline: SavedTimeline; diff --git a/x-pack/plugins/siem/public/containers/timeline/delete/persist.gql_query.ts b/x-pack/plugins/siem/public/timelines/containers/delete/persist.gql_query.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/timeline/delete/persist.gql_query.ts rename to x-pack/plugins/siem/public/timelines/containers/delete/persist.gql_query.ts diff --git a/x-pack/plugins/siem/public/containers/timeline/details/index.gql_query.ts b/x-pack/plugins/siem/public/timelines/containers/details/index.gql_query.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/timeline/details/index.gql_query.ts rename to x-pack/plugins/siem/public/timelines/containers/details/index.gql_query.ts diff --git a/x-pack/plugins/siem/public/containers/timeline/details/index.tsx b/x-pack/plugins/siem/public/timelines/containers/details/index.tsx similarity index 97% rename from x-pack/plugins/siem/public/containers/timeline/details/index.tsx rename to x-pack/plugins/siem/public/timelines/containers/details/index.tsx index cf1b8954307e7..1b84451b5cba6 100644 --- a/x-pack/plugins/siem/public/containers/timeline/details/index.tsx +++ b/x-pack/plugins/siem/public/timelines/containers/details/index.tsx @@ -11,7 +11,7 @@ import { Query } from 'react-apollo'; import { DEFAULT_INDEX_KEY } from '../../../../common/constants'; import { DetailItem, GetTimelineDetailsQuery } from '../../../graphql/types'; -import { useUiSetting } from '../../../lib/kibana'; +import { useUiSetting } from '../../../common/lib/kibana'; import { timelineDetailsQuery } from './index.gql_query'; diff --git a/x-pack/plugins/siem/public/containers/timeline/favorite/persist.gql_query.ts b/x-pack/plugins/siem/public/timelines/containers/favorite/persist.gql_query.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/timeline/favorite/persist.gql_query.ts rename to x-pack/plugins/siem/public/timelines/containers/favorite/persist.gql_query.ts diff --git a/x-pack/plugins/siem/public/containers/timeline/index.gql_query.ts b/x-pack/plugins/siem/public/timelines/containers/index.gql_query.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/timeline/index.gql_query.ts rename to x-pack/plugins/siem/public/timelines/containers/index.gql_query.ts diff --git a/x-pack/plugins/siem/public/containers/timeline/index.tsx b/x-pack/plugins/siem/public/timelines/containers/index.tsx similarity index 92% rename from x-pack/plugins/siem/public/containers/timeline/index.tsx rename to x-pack/plugins/siem/public/timelines/containers/index.tsx index 6e09e124696b6..76f6bdd36ecec 100644 --- a/x-pack/plugins/siem/public/containers/timeline/index.tsx +++ b/x-pack/plugins/siem/public/timelines/containers/index.tsx @@ -20,14 +20,14 @@ import { TimelineEdges, TimelineItem, } from '../../graphql/types'; -import { inputsModel, inputsSelectors, State } from '../../store'; -import { withKibana, WithKibanaProps } from '../../lib/kibana'; -import { createFilter } from '../helpers'; -import { QueryTemplate, QueryTemplateProps } from '../query_template'; -import { EventType } from '../../store/timeline/model'; +import { inputsModel, inputsSelectors, State } from '../../common/store'; +import { withKibana, WithKibanaProps } from '../../common/lib/kibana'; +import { createFilter } from '../../common/containers/helpers'; +import { QueryTemplate, QueryTemplateProps } from '../../common/containers/query_template'; +import { EventType } from '../../timelines/store/timeline/model'; import { timelineQuery } from './index.gql_query'; -import { timelineActions } from '../../store/timeline'; -import { SIGNALS_PAGE_TIMELINE_ID } from '../../pages/detection_engine/components/signals'; +import { timelineActions } from '../../timelines/store/timeline'; +import { SIGNALS_PAGE_TIMELINE_ID } from '../../alerts/components/signals'; export interface TimelineArgs { events: TimelineItem[]; diff --git a/x-pack/plugins/siem/public/containers/timeline/notes/persist.gql_query.ts b/x-pack/plugins/siem/public/timelines/containers/notes/persist.gql_query.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/timeline/notes/persist.gql_query.ts rename to x-pack/plugins/siem/public/timelines/containers/notes/persist.gql_query.ts diff --git a/x-pack/plugins/siem/public/containers/timeline/one/index.gql_query.ts b/x-pack/plugins/siem/public/timelines/containers/one/index.gql_query.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/timeline/one/index.gql_query.ts rename to x-pack/plugins/siem/public/timelines/containers/one/index.gql_query.ts diff --git a/x-pack/plugins/siem/public/containers/timeline/persist.gql_query.ts b/x-pack/plugins/siem/public/timelines/containers/persist.gql_query.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/timeline/persist.gql_query.ts rename to x-pack/plugins/siem/public/timelines/containers/persist.gql_query.ts diff --git a/x-pack/plugins/siem/public/containers/timeline/pinned_event/persist.gql_query.ts b/x-pack/plugins/siem/public/timelines/containers/pinned_event/persist.gql_query.ts similarity index 100% rename from x-pack/plugins/siem/public/containers/timeline/pinned_event/persist.gql_query.ts rename to x-pack/plugins/siem/public/timelines/containers/pinned_event/persist.gql_query.ts diff --git a/x-pack/plugins/siem/public/timelines/index.ts b/x-pack/plugins/siem/public/timelines/index.ts new file mode 100644 index 0000000000000..5cce258b10d16 --- /dev/null +++ b/x-pack/plugins/siem/public/timelines/index.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; + * you may not use this file except in compliance with the Elastic License. + */ + +import { SecuritySubPluginWithStore } from '../app/types'; +import { getTimelinesRoutes } from './routes'; +import { initialTimelineState, timelineReducer } from './store/timeline/reducer'; +import { TimelineState } from './store/timeline/types'; + +export class Timelines { + public setup() {} + + public start(): SecuritySubPluginWithStore<'timeline', TimelineState> { + return { + routes: getTimelinesRoutes(), + store: { + initialState: { timeline: initialTimelineState }, + reducer: { timeline: timelineReducer }, + }, + }; + } +} diff --git a/x-pack/plugins/siem/public/pages/timelines/index.tsx b/x-pack/plugins/siem/public/timelines/pages/index.tsx similarity index 84% rename from x-pack/plugins/siem/public/pages/timelines/index.tsx rename to x-pack/plugins/siem/public/timelines/pages/index.tsx index 343be5cbe3839..55b4dc16c2841 100644 --- a/x-pack/plugins/siem/public/pages/timelines/index.tsx +++ b/x-pack/plugins/siem/public/timelines/pages/index.tsx @@ -11,15 +11,15 @@ import { Switch, Route, Redirect } from 'react-router-dom'; import { ChromeBreadcrumb } from '../../../../../../src/core/public'; import { TimelineType } from '../../../common/types/timeline'; -import { TAB_TIMELINES, TAB_TEMPLATES } from '../../components/open_timeline/translations'; -import { getTimelinesUrl } from '../../components/link_to'; -import { TimelineRouteSpyState } from '../../utils/route/types'; +import { TAB_TIMELINES, TAB_TEMPLATES } from '../components/open_timeline/translations'; +import { getTimelinesUrl } from '../../common/components/link_to'; +import { TimelineRouteSpyState } from '../../common/utils/route/types'; -import { SiemPageName } from '../home/types'; +import { SiemPageName } from '../../app/types'; import { TimelinesPage } from './timelines_page'; import { PAGE_TITLE } from './translations'; -import { appendSearch } from '../../components/link_to/helpers'; +import { appendSearch } from '../../common/components/link_to/helpers'; const timelinesPagePath = `/:pageName(${SiemPageName.timelines})/:tabName(${TimelineType.default}|${TimelineType.template})`; const timelinesDefaultPath = `/${SiemPageName.timelines}/${TimelineType.default}`; diff --git a/x-pack/plugins/siem/public/pages/timelines/timelines_page.test.tsx b/x-pack/plugins/siem/public/timelines/pages/timelines_page.test.tsx similarity index 92% rename from x-pack/plugins/siem/public/pages/timelines/timelines_page.test.tsx rename to x-pack/plugins/siem/public/timelines/pages/timelines_page.test.tsx index ae95a1316a600..0338163d8b79f 100644 --- a/x-pack/plugins/siem/public/pages/timelines/timelines_page.test.tsx +++ b/x-pack/plugins/siem/public/timelines/pages/timelines_page.test.tsx @@ -4,15 +4,16 @@ * you may not use this file except in compliance with the Elastic License. */ -import { TimelinesPageComponent } from './timelines_page'; -import { useKibana } from '../../lib/kibana'; +import ApolloClient from 'apollo-client'; import { shallow, ShallowWrapper } from 'enzyme'; import React from 'react'; -import ApolloClient from 'apollo-client'; -jest.mock('../../pages/overview/events_by_dataset'); +import { useKibana } from '../../common/lib/kibana'; +import { TimelinesPageComponent } from './timelines_page'; + +jest.mock('../../overview/components/events_by_dataset'); -jest.mock('../../lib/kibana', () => { +jest.mock('../../common/lib/kibana', () => { return { useKibana: jest.fn(), }; @@ -21,7 +22,7 @@ describe('TimelinesPageComponent', () => { const mockAppollloClient = {} as ApolloClient; let wrapper: ShallowWrapper; - describe('If the user is authorised', () => { + describe('If the user is authorized', () => { beforeAll(() => { ((useKibana as unknown) as jest.Mock).mockReturnValue({ services: { diff --git a/x-pack/plugins/siem/public/pages/timelines/timelines_page.tsx b/x-pack/plugins/siem/public/timelines/pages/timelines_page.tsx similarity index 85% rename from x-pack/plugins/siem/public/pages/timelines/timelines_page.tsx rename to x-pack/plugins/siem/public/timelines/pages/timelines_page.tsx index 73070d2b94aac..d00aef6420451 100644 --- a/x-pack/plugins/siem/public/pages/timelines/timelines_page.tsx +++ b/x-pack/plugins/siem/public/timelines/pages/timelines_page.tsx @@ -4,17 +4,16 @@ * you may not use this file except in compliance with the Elastic License. */ +import { EuiButton } from '@elastic/eui'; import ApolloClient from 'apollo-client'; -import React, { useState, useCallback } from 'react'; +import React, { useCallback, useState } from 'react'; import styled from 'styled-components'; - -import { EuiButton } from '@elastic/eui'; -import { HeaderPage } from '../../components/header_page'; -import { StatefulOpenTimeline } from '../../components/open_timeline'; -import { WrapperPage } from '../../components/wrapper_page'; -import { SpyRoute } from '../../utils/route/spy_routes'; +import { HeaderPage } from '../../common/components/header_page'; +import { WrapperPage } from '../../common/components/wrapper_page'; +import { useKibana } from '../../common/lib/kibana'; +import { SpyRoute } from '../../common/utils/route/spy_routes'; +import { StatefulOpenTimeline } from '../components/open_timeline'; import * as i18n from './translations'; -import { useKibana } from '../../lib/kibana'; const TimelinesContainer = styled.div` width: 100%; diff --git a/x-pack/plugins/siem/public/pages/timelines/translations.ts b/x-pack/plugins/siem/public/timelines/pages/translations.ts similarity index 100% rename from x-pack/plugins/siem/public/pages/timelines/translations.ts rename to x-pack/plugins/siem/public/timelines/pages/translations.ts diff --git a/x-pack/plugins/siem/public/timelines/routes.tsx b/x-pack/plugins/siem/public/timelines/routes.tsx new file mode 100644 index 0000000000000..50b8e1b8a7118 --- /dev/null +++ b/x-pack/plugins/siem/public/timelines/routes.tsx @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License; + * you may not use this file except in compliance with the Elastic License. + */ + +import React from 'react'; +import { Route } from 'react-router-dom'; + +import { Timelines } from './pages'; +import { SiemPageName } from '../app/types'; + +export const getTimelinesRoutes = () => [ + } />, +]; diff --git a/x-pack/plugins/siem/public/store/timeline/actions.ts b/x-pack/plugins/siem/public/timelines/store/timeline/actions.ts similarity index 94% rename from x-pack/plugins/siem/public/store/timeline/actions.ts rename to x-pack/plugins/siem/public/timelines/store/timeline/actions.ts index 12155decf40d4..ba62c5b93012d 100644 --- a/x-pack/plugins/siem/public/store/timeline/actions.ts +++ b/x-pack/plugins/siem/public/timelines/store/timeline/actions.ts @@ -6,16 +6,16 @@ import actionCreatorFactory from 'typescript-fsa'; -import { Filter } from '../../../../../../src/plugins/data/public'; -import { Sort } from '../../components/timeline/body/sort'; +import { Filter } from '../../../../../../../src/plugins/data/public'; +import { Sort } from '../../../timelines/components/timeline/body/sort'; import { DataProvider, QueryOperator, -} from '../../components/timeline/data_providers/data_provider'; -import { KueryFilterQuery, SerializedFilterQuery } from '../types'; +} from '../../../timelines/components/timeline/data_providers/data_provider'; +import { KueryFilterQuery, SerializedFilterQuery } from '../../../common/store/types'; import { EventType, KqlMode, TimelineModel, ColumnHeaderOptions } from './model'; -import { TimelineNonEcsData } from '../../graphql/types'; +import { TimelineNonEcsData } from '../../../graphql/types'; const actionCreator = actionCreatorFactory('x-pack/siem/local/timeline'); diff --git a/x-pack/plugins/siem/public/store/timeline/defaults.ts b/x-pack/plugins/siem/public/timelines/store/timeline/defaults.ts similarity index 80% rename from x-pack/plugins/siem/public/store/timeline/defaults.ts rename to x-pack/plugins/siem/public/timelines/store/timeline/defaults.ts index 9203720e2e28c..e0f142bd61d03 100644 --- a/x-pack/plugins/siem/public/store/timeline/defaults.ts +++ b/x-pack/plugins/siem/public/timelines/store/timeline/defaults.ts @@ -4,11 +4,10 @@ * you may not use this file except in compliance with the Elastic License. */ -import { TimelineType } from '../../../common/types/timeline'; - -import { Direction } from '../../graphql/types'; -import { DEFAULT_TIMELINE_WIDTH } from '../../components/timeline/body/constants'; -import { defaultHeaders } from '../../components/timeline/body/column_headers/default_headers'; +import { TimelineType } from '../../../../common/types/timeline'; +import { Direction } from '../../../graphql/types'; +import { DEFAULT_TIMELINE_WIDTH } from '../../../timelines/components/timeline/body/constants'; +import { defaultHeaders } from '../../../timelines/components/timeline/body/column_headers/default_headers'; import { SubsetTimelineModel, TimelineModel } from './model'; export const timelineDefaults: SubsetTimelineModel & Pick = { diff --git a/x-pack/plugins/siem/public/store/timeline/epic.test.ts b/x-pack/plugins/siem/public/timelines/store/timeline/epic.test.ts similarity index 97% rename from x-pack/plugins/siem/public/store/timeline/epic.test.ts rename to x-pack/plugins/siem/public/timelines/store/timeline/epic.test.ts index 00aa20e078600..6bee579206de4 100644 --- a/x-pack/plugins/siem/public/store/timeline/epic.test.ts +++ b/x-pack/plugins/siem/public/timelines/store/timeline/epic.test.ts @@ -4,14 +4,11 @@ * you may not use this file except in compliance with the Elastic License. */ -import { Filter, esFilters } from '../../../../../../src/plugins/data/public'; - -import { TimelineType } from '../../../common/types/timeline'; - -import { Direction } from '../../graphql/types'; - -import { TimelineModel } from './model'; +import { Filter, esFilters } from '../../../../../../../src/plugins/data/public'; +import { TimelineType } from '../../../../common/types/timeline'; +import { Direction } from '../../../graphql/types'; import { convertTimelineAsInput } from './epic'; +import { TimelineModel } from './model'; describe('Epic Timeline', () => { describe('#convertTimelineAsInput ', () => { diff --git a/x-pack/plugins/siem/public/store/timeline/epic.ts b/x-pack/plugins/siem/public/timelines/store/timeline/epic.ts similarity index 96% rename from x-pack/plugins/siem/public/store/timeline/epic.ts rename to x-pack/plugins/siem/public/timelines/store/timeline/epic.ts index a7b8c48b45068..7bb890292adf4 100644 --- a/x-pack/plugins/siem/public/store/timeline/epic.ts +++ b/x-pack/plugins/siem/public/timelines/store/timeline/epic.ts @@ -28,13 +28,13 @@ import { takeUntil, } from 'rxjs/operators'; -import { esFilters, Filter, MatchAllFilter } from '../../../../../../src/plugins/data/public'; -import { TimelineType } from '../../../common/types/timeline'; -import { TimelineInput, ResponseTimeline, TimelineResult } from '../../graphql/types'; -import { AppApolloClient } from '../../lib/lib'; -import { addError } from '../app/actions'; -import { NotesById } from '../app/model'; -import { inputsModel } from '../inputs'; +import { esFilters, Filter, MatchAllFilter } from '../../../../../../../src/plugins/data/public'; +import { TimelineType } from '../../../../common/types/timeline'; +import { TimelineInput, ResponseTimeline, TimelineResult } from '../../../graphql/types'; +import { AppApolloClient } from '../../../common/lib/lib'; +import { addError } from '../../../common/store/app/actions'; +import { NotesById } from '../../../common/store/app/model'; +import { inputsModel } from '../../../common/store/inputs'; import { applyKqlFilterQuery, @@ -72,8 +72,8 @@ import { isNotNull } from './helpers'; import { dispatcherTimelinePersistQueue } from './epic_dispatcher_timeline_persistence_queue'; import { myEpicTimelineId } from './my_epic_timeline_id'; import { ActionTimeline, TimelineById } from './types'; -import { persistTimeline } from '../../containers/timeline/api'; -import { ALL_TIMELINE_QUERY_ID } from '../../containers/timeline/all'; +import { persistTimeline } from '../../containers/api'; +import { ALL_TIMELINE_QUERY_ID } from '../../containers/all'; interface TimelineEpicDependencies { timelineByIdSelector: (state: State) => TimelineById; diff --git a/x-pack/plugins/siem/public/store/timeline/epic_dispatcher_timeline_persistence_queue.ts b/x-pack/plugins/siem/public/timelines/store/timeline/epic_dispatcher_timeline_persistence_queue.ts similarity index 100% rename from x-pack/plugins/siem/public/store/timeline/epic_dispatcher_timeline_persistence_queue.ts rename to x-pack/plugins/siem/public/timelines/store/timeline/epic_dispatcher_timeline_persistence_queue.ts diff --git a/x-pack/plugins/siem/public/store/timeline/epic_favorite.ts b/x-pack/plugins/siem/public/timelines/store/timeline/epic_favorite.ts similarity index 95% rename from x-pack/plugins/siem/public/store/timeline/epic_favorite.ts rename to x-pack/plugins/siem/public/timelines/store/timeline/epic_favorite.ts index 6a1dadb8a59f5..0fd8e983085f7 100644 --- a/x-pack/plugins/siem/public/store/timeline/epic_favorite.ts +++ b/x-pack/plugins/siem/public/timelines/store/timeline/epic_favorite.ts @@ -12,9 +12,9 @@ import { Epic } from 'redux-observable'; import { from, Observable, empty } from 'rxjs'; import { filter, mergeMap, withLatestFrom, startWith, takeUntil } from 'rxjs/operators'; -import { persistTimelineFavoriteMutation } from '../../containers/timeline/favorite/persist.gql_query'; -import { PersistTimelineFavoriteMutation, ResponseFavoriteTimeline } from '../../graphql/types'; -import { addError } from '../app/actions'; +import { persistTimelineFavoriteMutation } from '../../containers/favorite/persist.gql_query'; +import { PersistTimelineFavoriteMutation, ResponseFavoriteTimeline } from '../../../graphql/types'; +import { addError } from '../../../common/store/app/actions'; import { endTimelineSaving, updateIsFavorite, @@ -26,7 +26,7 @@ import { dispatcherTimelinePersistQueue } from './epic_dispatcher_timeline_persi import { refetchQueries } from './refetch_queries'; import { myEpicTimelineId } from './my_epic_timeline_id'; import { ActionTimeline, TimelineById } from './types'; -import { inputsModel } from '../inputs'; +import { inputsModel } from '../../../common/store/inputs'; export const timelineFavoriteActionsType = [updateIsFavorite.type]; diff --git a/x-pack/plugins/siem/public/store/timeline/epic_note.ts b/x-pack/plugins/siem/public/timelines/store/timeline/epic_note.ts similarity index 93% rename from x-pack/plugins/siem/public/store/timeline/epic_note.ts rename to x-pack/plugins/siem/public/timelines/store/timeline/epic_note.ts index 3722a6ad8036c..30b2566de1468 100644 --- a/x-pack/plugins/siem/public/store/timeline/epic_note.ts +++ b/x-pack/plugins/siem/public/timelines/store/timeline/epic_note.ts @@ -12,11 +12,11 @@ import { Epic } from 'redux-observable'; import { from, empty, Observable } from 'rxjs'; import { filter, mergeMap, switchMap, withLatestFrom, startWith, takeUntil } from 'rxjs/operators'; -import { persistTimelineNoteMutation } from '../../containers/timeline/notes/persist.gql_query'; -import { PersistTimelineNoteMutation, ResponseNote } from '../../graphql/types'; -import { updateNote, addError } from '../app/actions'; -import { NotesById } from '../app/model'; -import { inputsModel } from '../inputs'; +import { persistTimelineNoteMutation } from '../../../timelines/containers/notes/persist.gql_query'; +import { PersistTimelineNoteMutation, ResponseNote } from '../../../graphql/types'; +import { updateNote, addError } from '../../../common/store/app/actions'; +import { NotesById } from '../../../common/store/app/model'; +import { inputsModel } from '../../../common/store/inputs'; import { addNote, diff --git a/x-pack/plugins/siem/public/store/timeline/epic_pinned_event.ts b/x-pack/plugins/siem/public/timelines/store/timeline/epic_pinned_event.ts similarity index 95% rename from x-pack/plugins/siem/public/store/timeline/epic_pinned_event.ts rename to x-pack/plugins/siem/public/timelines/store/timeline/epic_pinned_event.ts index a1281250ba72a..88c080bb78cca 100644 --- a/x-pack/plugins/siem/public/store/timeline/epic_pinned_event.ts +++ b/x-pack/plugins/siem/public/timelines/store/timeline/epic_pinned_event.ts @@ -12,10 +12,10 @@ import { Epic } from 'redux-observable'; import { from, Observable, empty } from 'rxjs'; import { filter, mergeMap, startWith, withLatestFrom, takeUntil } from 'rxjs/operators'; -import { persistTimelinePinnedEventMutation } from '../../containers/timeline/pinned_event/persist.gql_query'; -import { PersistTimelinePinnedEventMutation, PinnedEvent } from '../../graphql/types'; -import { addError } from '../app/actions'; -import { inputsModel } from '../inputs'; +import { persistTimelinePinnedEventMutation } from '../../../timelines/containers/pinned_event/persist.gql_query'; +import { PersistTimelinePinnedEventMutation, PinnedEvent } from '../../../graphql/types'; +import { addError } from '../../../common/store/app/actions'; +import { inputsModel } from '../../../common/store/inputs'; import { pinEvent, diff --git a/x-pack/plugins/siem/public/store/timeline/helpers.ts b/x-pack/plugins/siem/public/timelines/store/timeline/helpers.ts similarity index 98% rename from x-pack/plugins/siem/public/store/timeline/helpers.ts rename to x-pack/plugins/siem/public/timelines/store/timeline/helpers.ts index adab029c11150..a8821779169c7 100644 --- a/x-pack/plugins/siem/public/store/timeline/helpers.ts +++ b/x-pack/plugins/siem/public/timelines/store/timeline/helpers.ts @@ -6,21 +6,20 @@ import { getOr, omit, uniq, isEmpty, isEqualWith, union } from 'lodash/fp'; -import { Filter } from '../../../../../../src/plugins/data/public'; - -import { getColumnWidthFromType } from '../../components/timeline/body/column_headers/helpers'; -import { Sort } from '../../components/timeline/body/sort'; +import { Filter } from '../../../../../../../src/plugins/data/public'; +import { getColumnWidthFromType } from '../../../timelines/components/timeline/body/column_headers/helpers'; +import { Sort } from '../../../timelines/components/timeline/body/sort'; import { DataProvider, QueryOperator, QueryMatch, -} from '../../components/timeline/data_providers/data_provider'; -import { KueryFilterQuery, SerializedFilterQuery } from '../model'; +} from '../../../timelines/components/timeline/data_providers/data_provider'; +import { KueryFilterQuery, SerializedFilterQuery } from '../../../common/store/model'; import { timelineDefaults } from './defaults'; import { ColumnHeaderOptions, KqlMode, TimelineModel, EventType } from './model'; import { TimelineById, TimelineState } from './types'; -import { TimelineNonEcsData } from '../../graphql/types'; +import { TimelineNonEcsData } from '../../../graphql/types'; const EMPTY_TIMELINE_BY_ID: TimelineById = {}; // stable reference diff --git a/x-pack/plugins/siem/public/store/timeline/index.ts b/x-pack/plugins/siem/public/timelines/store/timeline/index.ts similarity index 61% rename from x-pack/plugins/siem/public/store/timeline/index.ts rename to x-pack/plugins/siem/public/timelines/store/timeline/index.ts index a1c51905e8d0b..48042ddf89910 100644 --- a/x-pack/plugins/siem/public/store/timeline/index.ts +++ b/x-pack/plugins/siem/public/timelines/store/timeline/index.ts @@ -4,7 +4,17 @@ * you may not use this file except in compliance with the Elastic License. */ +import { AnyAction, Reducer } from 'redux'; import * as timelineActions from './actions'; import * as timelineSelectors from './selectors'; +import { TimelineState } from './types'; export { timelineActions, timelineSelectors }; + +export interface TimelinePluginState { + timeline: TimelineState; +} + +export interface TimelinePluginReducer { + timeline: Reducer; +} diff --git a/x-pack/plugins/siem/public/store/timeline/manage_timeline_id.tsx b/x-pack/plugins/siem/public/timelines/store/timeline/manage_timeline_id.tsx similarity index 100% rename from x-pack/plugins/siem/public/store/timeline/manage_timeline_id.tsx rename to x-pack/plugins/siem/public/timelines/store/timeline/manage_timeline_id.tsx diff --git a/x-pack/plugins/siem/public/store/timeline/model.ts b/x-pack/plugins/siem/public/timelines/store/timeline/model.ts similarity index 91% rename from x-pack/plugins/siem/public/store/timeline/model.ts rename to x-pack/plugins/siem/public/timelines/store/timeline/model.ts index 54e19812634ac..1957abafbcc71 100644 --- a/x-pack/plugins/siem/public/store/timeline/model.ts +++ b/x-pack/plugins/siem/public/timelines/store/timeline/model.ts @@ -4,14 +4,13 @@ * you may not use this file except in compliance with the Elastic License. */ -import { Filter } from '../../../../../../src/plugins/data/public'; +import { Filter } from '../../../../../../../src/plugins/data/public'; -import { TimelineTypeLiteralWithNull } from '../../../common/types/timeline'; - -import { DataProvider } from '../../components/timeline/data_providers/data_provider'; -import { Sort } from '../../components/timeline/body/sort'; -import { PinnedEvent, TimelineNonEcsData } from '../../graphql/types'; -import { KueryFilterQuery, SerializedFilterQuery } from '../model'; +import { TimelineTypeLiteralWithNull } from '../../../../common/types/timeline'; +import { DataProvider } from '../../../timelines/components/timeline/data_providers/data_provider'; +import { Sort } from '../../../timelines/components/timeline/body/sort'; +import { PinnedEvent, TimelineNonEcsData } from '../../../graphql/types'; +import { KueryFilterQuery, SerializedFilterQuery } from '../../../common/store/model'; export const DEFAULT_PAGE_COUNT = 2; // Eui Pager will not render unless this is a minimum of 2 pages export type KqlMode = 'filter' | 'search'; diff --git a/x-pack/plugins/siem/public/store/timeline/my_epic_timeline_id.ts b/x-pack/plugins/siem/public/timelines/store/timeline/my_epic_timeline_id.ts similarity index 100% rename from x-pack/plugins/siem/public/store/timeline/my_epic_timeline_id.ts rename to x-pack/plugins/siem/public/timelines/store/timeline/my_epic_timeline_id.ts diff --git a/x-pack/plugins/siem/public/store/timeline/reducer.test.ts b/x-pack/plugins/siem/public/timelines/store/timeline/reducer.test.ts similarity index 99% rename from x-pack/plugins/siem/public/store/timeline/reducer.test.ts rename to x-pack/plugins/siem/public/timelines/store/timeline/reducer.test.ts index 42c6d6ecb0e51..65c78ca8efdb2 100644 --- a/x-pack/plugins/siem/public/store/timeline/reducer.test.ts +++ b/x-pack/plugins/siem/public/timelines/store/timeline/reducer.test.ts @@ -6,21 +6,21 @@ import { cloneDeep, set } from 'lodash/fp'; -import { TimelineType } from '../../../common/types/timeline'; +import { TimelineType } from '../../../../common/types/timeline'; import { IS_OPERATOR, DataProvider, DataProvidersAnd, -} from '../../components/timeline/data_providers/data_provider'; -import { defaultColumnHeaderType } from '../../components/timeline/body/column_headers/default_headers'; +} from '../../../timelines/components/timeline/data_providers/data_provider'; +import { defaultColumnHeaderType } from '../../../timelines/components/timeline/body/column_headers/default_headers'; import { DEFAULT_COLUMN_MIN_WIDTH, DEFAULT_TIMELINE_WIDTH, -} from '../../components/timeline/body/constants'; -import { getColumnWidthFromType } from '../../components/timeline/body/column_headers/helpers'; -import { Direction } from '../../graphql/types'; -import { defaultHeaders } from '../../mock'; +} from '../../../timelines/components/timeline/body/constants'; +import { getColumnWidthFromType } from '../../../timelines/components/timeline/body/column_headers/helpers'; +import { Direction } from '../../../graphql/types'; +import { defaultHeaders } from '../../../common/mock'; import { addNewTimeline, diff --git a/x-pack/plugins/siem/public/store/timeline/reducer.ts b/x-pack/plugins/siem/public/timelines/store/timeline/reducer.ts similarity index 100% rename from x-pack/plugins/siem/public/store/timeline/reducer.ts rename to x-pack/plugins/siem/public/timelines/store/timeline/reducer.ts diff --git a/x-pack/plugins/siem/public/store/timeline/refetch_queries.ts b/x-pack/plugins/siem/public/timelines/store/timeline/refetch_queries.ts similarity index 69% rename from x-pack/plugins/siem/public/store/timeline/refetch_queries.ts rename to x-pack/plugins/siem/public/timelines/store/timeline/refetch_queries.ts index a19f91aa530e8..f5a30ed831bd6 100644 --- a/x-pack/plugins/siem/public/store/timeline/refetch_queries.ts +++ b/x-pack/plugins/siem/public/timelines/store/timeline/refetch_queries.ts @@ -4,9 +4,9 @@ * you may not use this file except in compliance with the Elastic License. */ -import { allTimelinesQuery } from '../../containers/timeline/all/index.gql_query'; -import { Direction } from '../../graphql/types'; -import { DEFAULT_SORT_FIELD } from '../../components/open_timeline/constants'; +import { allTimelinesQuery } from '../../../timelines/containers/all/index.gql_query'; +import { Direction } from '../../../graphql/types'; +import { DEFAULT_SORT_FIELD } from '../../../timelines/components/open_timeline/constants'; export const refetchQueries = [ { diff --git a/x-pack/plugins/siem/public/store/timeline/selectors.ts b/x-pack/plugins/siem/public/timelines/store/timeline/selectors.ts similarity index 95% rename from x-pack/plugins/siem/public/store/timeline/selectors.ts rename to x-pack/plugins/siem/public/timelines/store/timeline/selectors.ts index 780145ebfa54c..03e9d722ac93e 100644 --- a/x-pack/plugins/siem/public/store/timeline/selectors.ts +++ b/x-pack/plugins/siem/public/timelines/store/timeline/selectors.ts @@ -6,8 +6,8 @@ import { createSelector } from 'reselect'; -import { isFromKueryExpressionValid } from '../../lib/keury'; -import { State } from '../reducer'; +import { isFromKueryExpressionValid } from '../../../common/lib/keury'; +import { State } from '../../../common/store/reducer'; import { TimelineModel } from './model'; import { AutoSavedWarningMsg, TimelineById } from './types'; diff --git a/x-pack/plugins/siem/public/store/timeline/types.ts b/x-pack/plugins/siem/public/timelines/store/timeline/types.ts similarity index 100% rename from x-pack/plugins/siem/public/store/timeline/types.ts rename to x-pack/plugins/siem/public/timelines/store/timeline/types.ts diff --git a/x-pack/test/api_integration/apis/siem/authentications.ts b/x-pack/test/api_integration/apis/siem/authentications.ts index b89a1448d5fe6..2a9a6d669f3fd 100644 --- a/x-pack/test/api_integration/apis/siem/authentications.ts +++ b/x-pack/test/api_integration/apis/siem/authentications.ts @@ -6,7 +6,7 @@ import expect from '@kbn/expect'; -import { authenticationsQuery } from '../../../../plugins/siem/public/containers/authentications/index.gql_query'; +import { authenticationsQuery } from '../../../../plugins/siem/public/hosts/containers/authentications/index.gql_query'; import { GetAuthenticationsQuery } from '../../../../plugins/siem/public/graphql/types'; import { FtrProviderContext } from '../../ftr_provider_context'; diff --git a/x-pack/test/api_integration/apis/siem/hosts.ts b/x-pack/test/api_integration/apis/siem/hosts.ts index 0a2ee9c82bce2..8acf87d88c5fa 100644 --- a/x-pack/test/api_integration/apis/siem/hosts.ts +++ b/x-pack/test/api_integration/apis/siem/hosts.ts @@ -13,9 +13,9 @@ import { GetHostsTableQuery, HostsFields, } from '../../../../plugins/siem/public/graphql/types'; -import { HostOverviewQuery } from '../../../../plugins/siem/public/containers/hosts/overview/host_overview.gql_query'; -import { HostFirstLastSeenGqlQuery } from '../../../../plugins/siem/public/containers/hosts/first_last_seen/first_last_seen.gql_query'; -import { HostsTableQuery } from '../../../../plugins/siem/public/containers/hosts/hosts_table.gql_query'; +import { HostOverviewQuery } from '../../../../plugins/siem/public/hosts/containers/hosts/overview/host_overview.gql_query'; +import { HostFirstLastSeenGqlQuery } from '../../../../plugins/siem/public/hosts/containers/hosts/first_last_seen/first_last_seen.gql_query'; +import { HostsTableQuery } from '../../../../plugins/siem/public/hosts/containers/hosts/hosts_table.gql_query'; import { FtrProviderContext } from '../../ftr_provider_context'; const FROM = new Date('2000-01-01T00:00:00.000Z').valueOf(); diff --git a/x-pack/test/api_integration/apis/siem/ip_overview.ts b/x-pack/test/api_integration/apis/siem/ip_overview.ts index 2f1a792aff25b..c0ed9cd2da842 100644 --- a/x-pack/test/api_integration/apis/siem/ip_overview.ts +++ b/x-pack/test/api_integration/apis/siem/ip_overview.ts @@ -5,7 +5,7 @@ */ import expect from '@kbn/expect'; -import { ipOverviewQuery } from '../../../../plugins/siem/public/containers/ip_overview/index.gql_query'; +import { ipOverviewQuery } from '../../../../plugins/siem/public/network/containers/ip_overview/index.gql_query'; import { GetIpOverviewQuery } from '../../../../plugins/siem/public/graphql/types'; import { FtrProviderContext } from '../../ftr_provider_context'; diff --git a/x-pack/test/api_integration/apis/siem/kpi_host_details.ts b/x-pack/test/api_integration/apis/siem/kpi_host_details.ts index 30f9f6f04a242..c108a6dcbc749 100644 --- a/x-pack/test/api_integration/apis/siem/kpi_host_details.ts +++ b/x-pack/test/api_integration/apis/siem/kpi_host_details.ts @@ -5,7 +5,7 @@ */ import expect from '@kbn/expect'; -import { kpiHostDetailsQuery } from '../../../../plugins/siem/public/containers/kpi_host_details/index.gql_query'; +import { kpiHostDetailsQuery } from '../../../../plugins/siem/public/hosts/containers/kpi_host_details/index.gql_query'; import { GetKpiHostDetailsQuery } from '../../../../plugins/siem/public/graphql/types'; import { FtrProviderContext } from '../../ftr_provider_context'; diff --git a/x-pack/test/api_integration/apis/siem/kpi_hosts.ts b/x-pack/test/api_integration/apis/siem/kpi_hosts.ts index 2303b9ecfb78f..ed4a19f2d7d99 100644 --- a/x-pack/test/api_integration/apis/siem/kpi_hosts.ts +++ b/x-pack/test/api_integration/apis/siem/kpi_hosts.ts @@ -5,7 +5,7 @@ */ import expect from '@kbn/expect'; -import { kpiHostsQuery } from '../../../../plugins/siem/public/containers/kpi_hosts/index.gql_query'; +import { kpiHostsQuery } from '../../../../plugins/siem/public/hosts/containers/kpi_hosts/index.gql_query'; import { GetKpiHostsQuery } from '../../../../plugins/siem/public/graphql/types'; import { FtrProviderContext } from '../../ftr_provider_context'; diff --git a/x-pack/test/api_integration/apis/siem/kpi_network.ts b/x-pack/test/api_integration/apis/siem/kpi_network.ts index 22e133e48bbd2..28f7c80eb3204 100644 --- a/x-pack/test/api_integration/apis/siem/kpi_network.ts +++ b/x-pack/test/api_integration/apis/siem/kpi_network.ts @@ -5,7 +5,7 @@ */ import expect from '@kbn/expect'; -import { kpiNetworkQuery } from '../../../../plugins/siem/public/containers/kpi_network/index.gql_query'; +import { kpiNetworkQuery } from '../../../../plugins/siem/public/network/containers/kpi_network/index.gql_query'; import { GetKpiNetworkQuery } from '../../../../plugins/siem/public/graphql/types'; import { FtrProviderContext } from '../../ftr_provider_context'; diff --git a/x-pack/test/api_integration/apis/siem/network_dns.ts b/x-pack/test/api_integration/apis/siem/network_dns.ts index 1eba41e238c81..590727362d7ae 100644 --- a/x-pack/test/api_integration/apis/siem/network_dns.ts +++ b/x-pack/test/api_integration/apis/siem/network_dns.ts @@ -5,7 +5,7 @@ */ import expect from '@kbn/expect'; -import { networkDnsQuery } from '../../../../plugins/siem/public/containers/network_dns/index.gql_query'; +import { networkDnsQuery } from '../../../../plugins/siem/public/network/containers/network_dns/index.gql_query'; import { Direction, GetNetworkDnsQuery, diff --git a/x-pack/test/api_integration/apis/siem/network_top_n_flow.ts b/x-pack/test/api_integration/apis/siem/network_top_n_flow.ts index 6ab7945e9000d..19948967c1809 100644 --- a/x-pack/test/api_integration/apis/siem/network_top_n_flow.ts +++ b/x-pack/test/api_integration/apis/siem/network_top_n_flow.ts @@ -5,7 +5,7 @@ */ import expect from '@kbn/expect'; -import { networkTopNFlowQuery } from '../../../../plugins/siem/public/containers/network_top_n_flow/index.gql_query'; +import { networkTopNFlowQuery } from '../../../../plugins/siem/public/network/containers/network_top_n_flow/index.gql_query'; import { Direction, FlowTargetSourceDest, diff --git a/x-pack/test/api_integration/apis/siem/overview_host.ts b/x-pack/test/api_integration/apis/siem/overview_host.ts index 95dbb44e30c41..fe9d04a16c626 100644 --- a/x-pack/test/api_integration/apis/siem/overview_host.ts +++ b/x-pack/test/api_integration/apis/siem/overview_host.ts @@ -7,7 +7,7 @@ import expect from '@kbn/expect'; import { DEFAULT_INDEX_PATTERN } from '../../../../plugins/siem/common/constants'; -import { overviewHostQuery } from '../../../../plugins/siem/public/containers/overview/overview_host/index.gql_query'; +import { overviewHostQuery } from '../../../../plugins/siem/public/overview/containers//overview_host/index.gql_query'; import { GetOverviewHostQuery } from '../../../../plugins/siem/public/graphql/types'; import { FtrProviderContext } from '../../ftr_provider_context'; diff --git a/x-pack/test/api_integration/apis/siem/overview_network.ts b/x-pack/test/api_integration/apis/siem/overview_network.ts index ef7d82d2ea8d9..1b8354e0632f1 100644 --- a/x-pack/test/api_integration/apis/siem/overview_network.ts +++ b/x-pack/test/api_integration/apis/siem/overview_network.ts @@ -5,7 +5,7 @@ */ import expect from '@kbn/expect'; -import { overviewNetworkQuery } from '../../../../plugins/siem/public/containers/overview/overview_network/index.gql_query'; +import { overviewNetworkQuery } from '../../../../plugins/siem/public/overview/containers/overview_network/index.gql_query'; import { GetOverviewNetworkQuery } from '../../../../plugins/siem/public/graphql/types'; import { FtrProviderContext } from '../../ftr_provider_context'; diff --git a/x-pack/test/api_integration/apis/siem/saved_objects/notes.ts b/x-pack/test/api_integration/apis/siem/saved_objects/notes.ts index 75670374b6f63..76c4afb08466e 100644 --- a/x-pack/test/api_integration/apis/siem/saved_objects/notes.ts +++ b/x-pack/test/api_integration/apis/siem/saved_objects/notes.ts @@ -8,7 +8,7 @@ import expect from '@kbn/expect'; import gql from 'graphql-tag'; import { FtrProviderContext } from '../../../ftr_provider_context'; -import { persistTimelineNoteMutation } from '../../../../../plugins/siem/public/containers/timeline/notes/persist.gql_query'; +import { persistTimelineNoteMutation } from '../../../../../plugins/siem/public/timelines/containers/notes/persist.gql_query'; export default function({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); diff --git a/x-pack/test/api_integration/apis/siem/saved_objects/pinned_events.ts b/x-pack/test/api_integration/apis/siem/saved_objects/pinned_events.ts index 39055e971d118..4d24ea9882152 100644 --- a/x-pack/test/api_integration/apis/siem/saved_objects/pinned_events.ts +++ b/x-pack/test/api_integration/apis/siem/saved_objects/pinned_events.ts @@ -7,7 +7,7 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../../ftr_provider_context'; -import { persistTimelinePinnedEventMutation } from '../../../../../plugins/siem/public/containers/timeline/pinned_event/persist.gql_query'; +import { persistTimelinePinnedEventMutation } from '../../../../../plugins/siem/public/timelines/containers/pinned_event/persist.gql_query'; export default function({ getService }: FtrProviderContext) { const esArchiver = getService('esArchiver'); diff --git a/x-pack/test/api_integration/apis/siem/saved_objects/timeline.ts b/x-pack/test/api_integration/apis/siem/saved_objects/timeline.ts index 2d9f576ef37e9..b6f272b8d7540 100644 --- a/x-pack/test/api_integration/apis/siem/saved_objects/timeline.ts +++ b/x-pack/test/api_integration/apis/siem/saved_objects/timeline.ts @@ -15,9 +15,9 @@ import ApolloClient from 'apollo-client'; import { FtrProviderContext } from '../../../ftr_provider_context'; -import { deleteTimelineMutation } from '../../../../../plugins/siem/public/containers/timeline/delete/persist.gql_query'; -import { persistTimelineFavoriteMutation } from '../../../../../plugins/siem/public/containers/timeline/favorite/persist.gql_query'; -import { persistTimelineMutation } from '../../../../../plugins/siem/public/containers/timeline/persist.gql_query'; +import { deleteTimelineMutation } from '../../../../../plugins/siem/public/timelines/containers/delete/persist.gql_query'; +import { persistTimelineFavoriteMutation } from '../../../../../plugins/siem/public/timelines/containers/favorite/persist.gql_query'; +import { persistTimelineMutation } from '../../../../../plugins/siem/public/timelines/containers/persist.gql_query'; import { TimelineResult } from '../../../../../plugins/siem/public/graphql/types'; export default function({ getService }: FtrProviderContext) { diff --git a/x-pack/test/api_integration/apis/siem/sources.ts b/x-pack/test/api_integration/apis/siem/sources.ts index 2338d4ce45c8d..b17280703c946 100644 --- a/x-pack/test/api_integration/apis/siem/sources.ts +++ b/x-pack/test/api_integration/apis/siem/sources.ts @@ -5,7 +5,7 @@ */ import expect from '@kbn/expect'; -import { sourceQuery } from '../../../../plugins/siem/public/containers/source/index.gql_query'; +import { sourceQuery } from '../../../../plugins/siem/public/common/containers/source/index.gql_query'; import { SourceQuery } from '../../../../plugins/siem/public/graphql/types'; import { FtrProviderContext } from '../../ftr_provider_context'; diff --git a/x-pack/test/api_integration/apis/siem/timeline.ts b/x-pack/test/api_integration/apis/siem/timeline.ts index de57b0c3f469f..14cc957d98eb8 100644 --- a/x-pack/test/api_integration/apis/siem/timeline.ts +++ b/x-pack/test/api_integration/apis/siem/timeline.ts @@ -6,7 +6,7 @@ import expect from '@kbn/expect'; -import { timelineQuery } from '../../../../plugins/siem/public/containers/timeline/index.gql_query'; +import { timelineQuery } from '../../../../plugins/siem/public/timelines/containers/index.gql_query'; import { Direction, GetTimelineQuery } from '../../../../plugins/siem/public/graphql/types'; import { FtrProviderContext } from '../../ftr_provider_context'; diff --git a/x-pack/test/api_integration/apis/siem/timeline_details.ts b/x-pack/test/api_integration/apis/siem/timeline_details.ts index f88d5355f22c1..920879cf9cf3e 100644 --- a/x-pack/test/api_integration/apis/siem/timeline_details.ts +++ b/x-pack/test/api_integration/apis/siem/timeline_details.ts @@ -7,7 +7,7 @@ import expect from '@kbn/expect'; import { sortBy } from 'lodash'; -import { timelineDetailsQuery } from '../../../../plugins/siem/public/containers/timeline/details/index.gql_query'; +import { timelineDetailsQuery } from '../../../../plugins/siem/public/timelines/containers/details/index.gql_query'; import { DetailItem, GetTimelineDetailsQuery } from '../../../../plugins/siem/public/graphql/types'; import { FtrProviderContext } from '../../ftr_provider_context'; diff --git a/x-pack/test/api_integration/apis/siem/tls.ts b/x-pack/test/api_integration/apis/siem/tls.ts index e4e8b5db3d7e3..8ee2ef43efe38 100644 --- a/x-pack/test/api_integration/apis/siem/tls.ts +++ b/x-pack/test/api_integration/apis/siem/tls.ts @@ -5,7 +5,7 @@ */ import expect from '@kbn/expect'; -import { tlsQuery } from '../../../../plugins/siem/public/containers/tls/index.gql_query'; +import { tlsQuery } from '../../../../plugins/siem/public/network/containers/tls/index.gql_query'; import { Direction, TlsFields, diff --git a/x-pack/test/api_integration/apis/siem/uncommon_processes.ts b/x-pack/test/api_integration/apis/siem/uncommon_processes.ts index c9674e740f76d..325f2f83e53df 100644 --- a/x-pack/test/api_integration/apis/siem/uncommon_processes.ts +++ b/x-pack/test/api_integration/apis/siem/uncommon_processes.ts @@ -6,7 +6,7 @@ import expect from '@kbn/expect'; -import { uncommonProcessesQuery } from '../../../../plugins/siem/public/containers/uncommon_processes/index.gql_query'; +import { uncommonProcessesQuery } from '../../../../plugins/siem/public/hosts/containers/uncommon_processes/index.gql_query'; import { GetUncommonProcessesQuery } from '../../../../plugins/siem/public/graphql/types'; import { FtrProviderContext } from '../../ftr_provider_context'; diff --git a/x-pack/test/api_integration/apis/siem/users.ts b/x-pack/test/api_integration/apis/siem/users.ts index c8ea1be7d3f11..c6ac571e86eb3 100644 --- a/x-pack/test/api_integration/apis/siem/users.ts +++ b/x-pack/test/api_integration/apis/siem/users.ts @@ -5,7 +5,7 @@ */ import expect from '@kbn/expect'; -import { usersQuery } from '../../../../plugins/siem/public/containers/users/index.gql_query'; +import { usersQuery } from '../../../../plugins/siem/public/network/containers/users/index.gql_query'; import { Direction, UsersFields, From 96bc66386201b503dc94c8497fed2c5784559635 Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Tue, 12 May 2020 10:35:39 +0300 Subject: [PATCH 096/102] [Flights] Delay Bucket - Error notification on opening sample visualization (#66028) Closes: #66024 --- .../data/common/es_query/es_query/migrate_filter.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/plugins/data/common/es_query/es_query/migrate_filter.ts b/src/plugins/data/common/es_query/es_query/migrate_filter.ts index 22fbfe0e1ab08..a0529d585879e 100644 --- a/src/plugins/data/common/es_query/es_query/migrate_filter.ts +++ b/src/plugins/data/common/es_query/es_query/migrate_filter.ts @@ -43,18 +43,25 @@ export function migrateFilter(filter: Filter, indexPattern?: IIndexPattern) { if (isDeprecatedMatchPhraseFilter(filter)) { const fieldName = Object.keys(filter.query.match)[0]; const params: Record = get(filter, ['query', 'match', fieldName]); + let query = params.query; if (indexPattern) { const field = indexPattern.fields.find(f => f.name === fieldName); if (field) { - params.query = getConvertedValueForField(field, params.query); + query = getConvertedValueForField(field, params.query); } } return { ...filter, query: { match_phrase: { - [fieldName]: omit(params, 'type'), + [fieldName]: omit( + { + ...params, + query, + }, + 'type' + ), }, }, }; From 2ad2bfa9069e66d183e3ce9c3146d953af56bdc2 Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Tue, 12 May 2020 09:37:03 +0200 Subject: [PATCH 097/102] Fix heigt calc in calc issue for ie11 (#66010) --- src/plugins/console/public/styles/_app.scss | 5 ++++- x-pack/plugins/painless_lab/public/styles/_index.scss | 7 +++++-- x-pack/plugins/searchprofiler/public/styles/_index.scss | 5 ++++- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/src/plugins/console/public/styles/_app.scss b/src/plugins/console/public/styles/_app.scss index 047db6e3ad877..c41df24912c2a 100644 --- a/src/plugins/console/public/styles/_app.scss +++ b/src/plugins/console/public/styles/_app.scss @@ -1,8 +1,11 @@ // TODO: Move all of the styles here (should be modularised by, e.g., CSS-in-JS or CSS modules). @import '@elastic/eui/src/components/header/variables'; +// This value is calculated to static value using SCSS because calc in calc has issues in IE11 +$headerHeightOffset: $euiHeaderHeightCompensation * 2; + #consoleRoot { - height: calc(100vh - calc(#{$euiHeaderChildSize} * 2)); + height: calc(100vh - #{$headerHeightOffset}); display: flex; flex: 1 1 auto; // Make sure the editor actions don't create scrollbars on this container diff --git a/x-pack/plugins/painless_lab/public/styles/_index.scss b/x-pack/plugins/painless_lab/public/styles/_index.scss index df68a6450c191..e6c9574161fd8 100644 --- a/x-pack/plugins/painless_lab/public/styles/_index.scss +++ b/x-pack/plugins/painless_lab/public/styles/_index.scss @@ -5,7 +5,7 @@ * This is a very brittle way of preventing the editor and other content from disappearing * behind the bottom bar. */ -$bottomBarHeight: calc(#{$euiSize} * 3); +$bottomBarHeight: $euiSize * 3; .painlessLabBottomBarPlaceholder { height: $bottomBarHeight; @@ -40,8 +40,11 @@ $bottomBarHeight: calc(#{$euiSize} * 3); line-height: 0; } +// This value is calculated to static value using SCSS because calc in calc has issues in IE11 +$headerHeightOffset: $euiHeaderHeightCompensation * 2; + .painlessLabMainContainer { - height: calc(100vh - calc(#{$euiHeaderChildSize} * 2) - #{$bottomBarHeight}); + height: calc(100vh - #{$headerHeightOffset} - #{$bottomBarHeight}); } .painlessLabPanelsContainer { diff --git a/x-pack/plugins/searchprofiler/public/styles/_index.scss b/x-pack/plugins/searchprofiler/public/styles/_index.scss index 5c35e9a23b8a1..e63042cf8fe2f 100644 --- a/x-pack/plugins/searchprofiler/public/styles/_index.scss +++ b/x-pack/plugins/searchprofiler/public/styles/_index.scss @@ -47,8 +47,11 @@ } } +// This value is calculated to static value using SCSS because calc in calc has issues in IE11 +$headerHeightOffset: $euiHeaderHeightCompensation * 2; + .appRoot { - height: calc(100vh - calc(#{$euiHeaderChildSize} * 2)); + height: calc(100vh - #{$headerHeightOffset}); overflow: hidden; flex-shrink: 1; } From f3548d6c838776b2e84138c7cc7500c46560d867 Mon Sep 17 00:00:00 2001 From: Alexey Antonov Date: Tue, 12 May 2020 11:24:03 +0300 Subject: [PATCH 098/102] Inspect action shows on dashboard for every chart (#65998) Closes: #60372 --- .../public/embeddable/visualize_embeddable.ts | 18 ++++-------------- 1 file changed, 4 insertions(+), 14 deletions(-) diff --git a/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts b/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts index 10704514ab8d5..f5a840c480aa1 100644 --- a/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts +++ b/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts @@ -71,6 +71,8 @@ export interface VisualizeOutput extends EmbeddableOutput { type ExpressionLoader = InstanceType; +const visTypesWithoutInspector = ['markdown', 'input_control_vis', 'metrics', 'vega', 'timelion']; + export class VisualizeEmbeddable extends Embeddable { private handler?: ExpressionLoader; private timefilter: TimefilterContract; @@ -126,7 +128,7 @@ export class VisualizeEmbeddable extends Embeddable { - if (!this.handler) { + if (!this.handler || visTypesWithoutInspector.includes(this.vis.type.name)) { return undefined; } return this.handler.inspect(); @@ -215,19 +217,7 @@ export class VisualizeEmbeddable extends Embeddable { - const visTypesWithoutInspector = [ - 'markdown', - 'input_control_vis', - 'metrics', - 'vega', - 'timelion', - ]; - if (visTypesWithoutInspector.includes(this.vis.type.name)) { - return false; - } - return this.getInspectorAdapters(); - }; + hasInspector = () => Boolean(this.getInspectorAdapters()); /** * From 724f2820599963708c58ccb4de265ab177f47898 Mon Sep 17 00:00:00 2001 From: Anton Dosov Date: Tue, 12 May 2020 10:30:19 +0200 Subject: [PATCH 099/102] [Drilldowns][IE] fix welcome bar layout in IE (#65676) * fix drilldown hello bar in IE * fix comment * use children instead of title for EuiCallOut content Co-authored-by: Elastic Machine --- .../drilldown_hello_bar.tsx | 53 +++++++++---------- 1 file changed, 25 insertions(+), 28 deletions(-) diff --git a/x-pack/plugins/drilldowns/public/components/drilldown_hello_bar/drilldown_hello_bar.tsx b/x-pack/plugins/drilldowns/public/components/drilldown_hello_bar/drilldown_hello_bar.tsx index 48e17dadc810f..99885e5cc40fe 100644 --- a/x-pack/plugins/drilldowns/public/components/drilldown_hello_bar/drilldown_hello_bar.tsx +++ b/x-pack/plugins/drilldowns/public/components/drilldown_hello_bar/drilldown_hello_bar.tsx @@ -30,33 +30,30 @@ export const DrilldownHelloBar: React.FC = ({ onHideClick = () => {}, }) => { return ( - - -
- -
-
- - - {txtHelpText} - - {docsLink && ( - <> - - {txtViewDocsLinkLabel} - - )} - - - - {txtHideHelpButtonLabel} - - - - } - /> + + + +
+ +
+
+ + + {txtHelpText} + + {docsLink && ( + <> + + {txtViewDocsLinkLabel} + + )} + + + + {txtHideHelpButtonLabel} + + +
+
); }; From 69a61d4ee78765bbccc3911c7d125ea35cf63b6c Mon Sep 17 00:00:00 2001 From: Dmitry Lemeshko Date: Tue, 12 May 2020 11:53:20 +0300 Subject: [PATCH 100/102] [functional/services] import By/until from module (#66015) Co-authored-by: Elastic Machine --- test/functional/services/find.ts | 10 +++------ .../web_element_wrapper.ts | 21 +++++++------------ test/functional/services/remote/remote.ts | 4 ++-- test/functional/services/remote/webdriver.ts | 4 ++-- 4 files changed, 14 insertions(+), 25 deletions(-) diff --git a/test/functional/services/find.ts b/test/functional/services/find.ts index 09fc32115f683..3697e94461074 100644 --- a/test/functional/services/find.ts +++ b/test/functional/services/find.ts @@ -17,20 +17,16 @@ * under the License. */ -import { WebDriver, WebElement, By } from 'selenium-webdriver'; +import { WebDriver, WebElement, By, until } from 'selenium-webdriver'; import { FtrProviderContext } from '../ftr_provider_context'; import { WebElementWrapper } from './lib/web_element_wrapper'; export async function FindProvider({ getService }: FtrProviderContext) { const log = getService('log'); const config = getService('config'); - const webdriver = await getService('__webdriver__').init(); + const { driver, browserType } = await getService('__webdriver__').init(); const retry = getService('retry'); - const driver = webdriver.driver; - const until = webdriver.until; - const browserType = webdriver.browserType; - const WAIT_FOR_EXISTS_TIME = config.get('timeouts.waitForExists'); const POLLING_TIME = 500; const defaultFindTimeout = config.get('timeouts.find'); @@ -40,7 +36,7 @@ export async function FindProvider({ getService }: FtrProviderContext) { WebElementWrapper.create( webElement, locator, - webdriver, + driver, defaultFindTimeout, fixedHeaderHeight, log, diff --git a/test/functional/services/lib/web_element_wrapper/web_element_wrapper.ts b/test/functional/services/lib/web_element_wrapper/web_element_wrapper.ts index 8b57ecd3c8235..615dc783601bc 100644 --- a/test/functional/services/lib/web_element_wrapper/web_element_wrapper.ts +++ b/test/functional/services/lib/web_element_wrapper/web_element_wrapper.ts @@ -18,7 +18,7 @@ */ import { delay } from 'bluebird'; -import { WebElement, WebDriver, By, Key, until } from 'selenium-webdriver'; +import { WebElement, WebDriver, By, Key } from 'selenium-webdriver'; import { PNG } from 'pngjs'; // @ts-ignore not supported yet import cheerio from 'cheerio'; @@ -29,12 +29,6 @@ import { CustomCheerio, CustomCheerioStatic } from './custom_cheerio_api'; import { scrollIntoViewIfNecessary } from './scroll_into_view_if_necessary'; import { Browsers } from '../../remote/browsers'; -interface Driver { - driver: WebDriver; - By: typeof By; - until: typeof until; -} - interface TypeOptions { charByChar: boolean; } @@ -51,16 +45,15 @@ const RETRY_CLICK_RETRY_ON_ERRORS = [ ]; export class WebElementWrapper { - private By = this.webDriver.By; - private driver: WebDriver = this.webDriver.driver; + private By = By; private Keys = Key; - public isW3CEnabled: boolean = (this.webDriver.driver as any).executor_.w3c === true; + public isW3CEnabled: boolean = (this.driver as any).executor_.w3c === true; public isChromium: boolean = [Browsers.Chrome, Browsers.ChromiumEdge].includes(this.browserType); public static create( webElement: WebElement | WebElementWrapper, locator: By | null, - webDriver: Driver, + driver: WebDriver, timeout: number, fixedHeaderHeight: number, logger: ToolingLog, @@ -73,7 +66,7 @@ export class WebElementWrapper { return new WebElementWrapper( webElement, locator, - webDriver, + driver, timeout, fixedHeaderHeight, logger, @@ -84,7 +77,7 @@ export class WebElementWrapper { constructor( public _webElement: WebElement, private locator: By | null, - private webDriver: Driver, + private driver: WebDriver, private timeout: number, private fixedHeaderHeight: number, private logger: ToolingLog, @@ -109,7 +102,7 @@ export class WebElementWrapper { return WebElementWrapper.create( otherWebElement, locator, - this.webDriver, + this.driver, this.timeout, this.fixedHeaderHeight, this.logger, diff --git a/test/functional/services/remote/remote.ts b/test/functional/services/remote/remote.ts index 933b08f7681e8..770e82ad461d2 100644 --- a/test/functional/services/remote/remote.ts +++ b/test/functional/services/remote/remote.ts @@ -58,7 +58,7 @@ export async function RemoteProvider({ getService }: FtrProviderContext) { Fs.writeFileSync(path, JSON.stringify(JSON.parse(coverageJson), null, 2)); }; - const { driver, By, until, consoleLog$ } = await initWebDriver( + const { driver, consoleLog$ } = await initWebDriver( log, browserType, lifecycle, @@ -153,5 +153,5 @@ export async function RemoteProvider({ getService }: FtrProviderContext) { await driver.quit(); }); - return { driver, By, until, browserType, consoleLog$ }; + return { driver, browserType, consoleLog$ }; } diff --git a/test/functional/services/remote/webdriver.ts b/test/functional/services/remote/webdriver.ts index df79db50b8683..27d17bf754659 100644 --- a/test/functional/services/remote/webdriver.ts +++ b/test/functional/services/remote/webdriver.ts @@ -28,7 +28,7 @@ import { delay } from 'bluebird'; import chromeDriver from 'chromedriver'; // @ts-ignore types not available import geckoDriver from 'geckodriver'; -import { Builder, Capabilities, By, logging, until } from 'selenium-webdriver'; +import { Builder, Capabilities, logging } from 'selenium-webdriver'; import chrome from 'selenium-webdriver/chrome'; import firefox from 'selenium-webdriver/firefox'; import edge from 'selenium-webdriver/edge'; @@ -310,7 +310,7 @@ async function attemptToCreateCommand( return; } // abort - return { driver: session, By, until, consoleLog$ }; + return { driver: session, consoleLog$ }; } export async function initWebDriver( From 0f5c1ed95ae4a295101eb3f12dbca843a60abd3f Mon Sep 17 00:00:00 2001 From: Anton Dosov Date: Tue, 12 May 2020 10:57:49 +0200 Subject: [PATCH 101/102] [Drilldowns][chore] Remove some any's from components. Remove `PlaceContext` from components (#65854) Co-authored-by: Elastic Machine --- .../public/drilldowns/drilldown_definition.ts | 5 ---- .../public/dynamic_actions/types.ts | 4 +-- .../flyout_create_drilldown.tsx | 1 - .../flyout_edit_drilldown.tsx | 1 - ...nnected_flyout_manage_drilldowns.story.tsx | 2 +- ...onnected_flyout_manage_drilldowns.test.tsx | 27 +++++-------------- .../connected_flyout_manage_drilldowns.tsx | 16 +++++------ .../flyout_drilldown_wizard.story.tsx | 19 ++++++++++--- .../flyout_drilldown_wizard.tsx | 2 +- 9 files changed, 31 insertions(+), 46 deletions(-) diff --git a/x-pack/plugins/advanced_ui_actions/public/drilldowns/drilldown_definition.ts b/x-pack/plugins/advanced_ui_actions/public/drilldowns/drilldown_definition.ts index 16c8077d727cb..f01dd22c06bc5 100644 --- a/x-pack/plugins/advanced_ui_actions/public/drilldowns/drilldown_definition.ts +++ b/x-pack/plugins/advanced_ui_actions/public/drilldowns/drilldown_definition.ts @@ -15,11 +15,6 @@ import { ActionFactoryDefinition } from '../dynamic_actions'; * `Config` is a serializable object containing the configuration that the * drilldown is able to collect using UI. * - * `PlaceContext` is an object that the app that opens drilldown management - * flyout provides to the React component, specifying the contextual information - * about that app. For example, on Dashboard app this context contains - * information about the current embeddable and dashboard. - * * `ExecutionContext` is an object created in response to user's interaction * and provided to the `execute` function of the drilldown. This object contains * information about the action user performed. diff --git a/x-pack/plugins/advanced_ui_actions/public/dynamic_actions/types.ts b/x-pack/plugins/advanced_ui_actions/public/dynamic_actions/types.ts index 9148d1ec7055a..fb513e892d413 100644 --- a/x-pack/plugins/advanced_ui_actions/public/dynamic_actions/types.ts +++ b/x-pack/plugins/advanced_ui_actions/public/dynamic_actions/types.ts @@ -4,7 +4,7 @@ * you may not use this file except in compliance with the Elastic License. */ -export interface SerializedAction { +export interface SerializedAction { readonly factoryId: string; readonly name: string; readonly config: Config; @@ -16,5 +16,5 @@ export interface SerializedAction { export interface SerializedEvent { eventId: string; triggers: string[]; - action: SerializedAction; + action: SerializedAction; } diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_create_drilldown/flyout_create_drilldown.tsx b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_create_drilldown/flyout_create_drilldown.tsx index 81f88e563a258..381cad443e3ad 100644 --- a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_create_drilldown/flyout_create_drilldown.tsx +++ b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_create_drilldown/flyout_create_drilldown.tsx @@ -72,7 +72,6 @@ export class FlyoutCreateDrilldownAction implements ActionByType handle.close()} - placeContext={context} viewMode={'create'} dynamicActionManager={embeddable.enhancements.dynamicActions} /> diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_edit_drilldown/flyout_edit_drilldown.tsx b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_edit_drilldown/flyout_edit_drilldown.tsx index a4499ba4d757d..5d2a90fdaff08 100644 --- a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_edit_drilldown/flyout_edit_drilldown.tsx +++ b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_edit_drilldown/flyout_edit_drilldown.tsx @@ -60,7 +60,6 @@ export class FlyoutEditDrilldownAction implements ActionByType handle.close()} - placeContext={context} viewMode={'manage'} dynamicActionManager={embeddable.enhancements.dynamicActions} /> diff --git a/x-pack/plugins/drilldowns/public/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.story.tsx b/x-pack/plugins/drilldowns/public/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.story.tsx index 16b4d3a25d9e5..a186feec33924 100644 --- a/x-pack/plugins/drilldowns/public/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.story.tsx +++ b/x-pack/plugins/drilldowns/public/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.story.tsx @@ -38,6 +38,6 @@ const FlyoutManageDrilldowns = createFlyoutManageDrilldowns({ storiesOf('components/FlyoutManageDrilldowns', module).add('default', () => ( {}}> - + )); diff --git a/x-pack/plugins/drilldowns/public/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.test.tsx b/x-pack/plugins/drilldowns/public/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.test.tsx index 52c53f32ff09b..152eaf18f16c1 100644 --- a/x-pack/plugins/drilldowns/public/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.test.tsx +++ b/x-pack/plugins/drilldowns/public/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.test.tsx @@ -43,9 +43,7 @@ beforeEach(() => { }); test('Allows to manage drilldowns', async () => { - const screen = render( - - ); + const screen = render(); // wait for initial render. It is async because resolving compatible action factories is async await wait(() => expect(screen.getByText(/Manage Drilldowns/i)).toBeVisible()); @@ -112,9 +110,7 @@ test('Allows to manage drilldowns', async () => { }); test('Can delete multiple drilldowns', async () => { - const screen = render( - - ); + const screen = render(); // wait for initial render. It is async because resolving compatible action factories is async await wait(() => expect(screen.getByText(/Manage Drilldowns/i)).toBeVisible()); @@ -151,7 +147,6 @@ test('Create only mode', async () => { const onClose = jest.fn(); const screen = render( { test('After switching between action factories state is restored', async () => { const screen = render( - + ); // wait for initial render. It is async because resolving compatible action factories is async await wait(() => expect(screen.getAllByText(/Create/i).length).toBeGreaterThan(0)); @@ -216,9 +207,7 @@ test("Error when can't save drilldown changes", async () => { jest.spyOn(mockDynamicActionManager, 'createEvent').mockImplementationOnce(async () => { throw error; }); - const screen = render( - - ); + const screen = render(); // wait for initial render. It is async because resolving compatible action factories is async await wait(() => expect(screen.getByText(/Manage Drilldowns/i)).toBeVisible()); fireEvent.click(screen.getByText(/Create new/i)); @@ -236,9 +225,7 @@ test("Error when can't save drilldown changes", async () => { }); test('Should show drilldown welcome message. Should be able to dismiss it', async () => { - let screen = render( - - ); + let screen = render(); // wait for initial render. It is async because resolving compatible action factories is async await wait(() => expect(screen.getByText(/Manage Drilldowns/i)).toBeVisible()); @@ -248,9 +235,7 @@ test('Should show drilldown welcome message. Should be able to dismiss it', asyn expect(screen.queryByTestId(WELCOME_MESSAGE_TEST_SUBJ)).toBeNull(); cleanup(); - screen = render( - - ); + screen = render(); // wait for initial render. It is async because resolving compatible action factories is async await wait(() => expect(screen.getByText(/Manage Drilldowns/i)).toBeVisible()); expect(screen.queryByTestId(WELCOME_MESSAGE_TEST_SUBJ)).toBeNull(); diff --git a/x-pack/plugins/drilldowns/public/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.tsx b/x-pack/plugins/drilldowns/public/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.tsx index 5ebda079a15bf..ba273e7d578ff 100644 --- a/x-pack/plugins/drilldowns/public/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.tsx +++ b/x-pack/plugins/drilldowns/public/components/connected_flyout_manage_drilldowns/connected_flyout_manage_drilldowns.tsx @@ -32,8 +32,7 @@ import { toastDrilldownsDeleted, } from './i18n'; -interface ConnectedFlyoutManageDrilldownsProps { - placeContext: Context; +interface ConnectedFlyoutManageDrilldownsProps { dynamicActionManager: DynamicActionManager; viewMode?: 'create' | 'manage'; onClose?: () => void; @@ -75,10 +74,9 @@ export function createFlyoutManageDrilldowns({ const factoryContext: object = React.useMemo( () => ({ - placeContext: props.placeContext, triggers: selectedTriggers, }), - [props.placeContext, selectedTriggers] + [selectedTriggers] ); const actionFactories = useCompatibleActionFactoriesForCurrentContext( @@ -222,12 +220,10 @@ export function createFlyoutManageDrilldowns({ } function useCompatibleActionFactoriesForCurrentContext( - actionFactories: Array>, + actionFactories: ActionFactory[], context: Context ) { - const [compatibleActionFactories, setCompatibleActionFactories] = useState< - Array> - >(); + const [compatibleActionFactories, setCompatibleActionFactories] = useState(); useEffect(() => { let canceled = false; async function updateCompatibleFactoriesForContext() { @@ -283,7 +279,7 @@ function useDrilldownsStateManager( } async function createDrilldown( - action: UiActionsEnhancedSerializedAction, + action: UiActionsEnhancedSerializedAction, selectedTriggers: Array ) { await run(async () => { @@ -297,7 +293,7 @@ function useDrilldownsStateManager( async function editDrilldown( drilldownId: string, - action: UiActionsEnhancedSerializedAction, + action: UiActionsEnhancedSerializedAction, selectedTriggers: Array ) { await run(async () => { diff --git a/x-pack/plugins/drilldowns/public/components/flyout_drilldown_wizard/flyout_drilldown_wizard.story.tsx b/x-pack/plugins/drilldowns/public/components/flyout_drilldown_wizard/flyout_drilldown_wizard.story.tsx index 152cd393b9d3e..add8b748afee9 100644 --- a/x-pack/plugins/drilldowns/public/components/flyout_drilldown_wizard/flyout_drilldown_wizard.story.tsx +++ b/x-pack/plugins/drilldowns/public/components/flyout_drilldown_wizard/flyout_drilldown_wizard.story.tsx @@ -15,17 +15,25 @@ import { urlFactory, // eslint-disable-next-line @kbn/eslint/no-restricted-paths } from '../../../../advanced_ui_actions/public/components/action_wizard/test_data'; +import { AdvancedUiActionsActionFactory as ActionFactory } from '../../../../advanced_ui_actions/public/'; storiesOf('components/FlyoutDrilldownWizard', module) .add('default', () => { - return ; + return ( + + ); }) .add('open in flyout - create', () => { return ( {}}> {}} - drilldownActionFactories={[urlFactory, dashboardFactory]} + drilldownActionFactories={[ + urlFactory as ActionFactory, + dashboardFactory as ActionFactory, + ]} /> ); @@ -35,7 +43,10 @@ storiesOf('components/FlyoutDrilldownWizard', module) {}}> {}} - drilldownActionFactories={[urlFactory, dashboardFactory]} + drilldownActionFactories={[ + urlFactory as ActionFactory, + dashboardFactory as ActionFactory, + ]} initialDrilldownWizardConfig={{ name: 'My fancy drilldown', actionFactory: urlFactory as any, @@ -54,7 +65,7 @@ storiesOf('components/FlyoutDrilldownWizard', module) {}}> {}} - drilldownActionFactories={[dashboardFactory]} + drilldownActionFactories={[dashboardFactory as ActionFactory]} initialDrilldownWizardConfig={{ name: 'My fancy drilldown', actionFactory: urlFactory as any, diff --git a/x-pack/plugins/drilldowns/public/components/flyout_drilldown_wizard/flyout_drilldown_wizard.tsx b/x-pack/plugins/drilldowns/public/components/flyout_drilldown_wizard/flyout_drilldown_wizard.tsx index 1f775a5ff103f..84c1a04a71d15 100644 --- a/x-pack/plugins/drilldowns/public/components/flyout_drilldown_wizard/flyout_drilldown_wizard.tsx +++ b/x-pack/plugins/drilldowns/public/components/flyout_drilldown_wizard/flyout_drilldown_wizard.tsx @@ -25,7 +25,7 @@ export interface DrilldownWizardConfig { } export interface FlyoutDrilldownWizardProps { - drilldownActionFactories: Array>; + drilldownActionFactories: ActionFactory[]; onSubmit?: (drilldownWizardConfig: Required) => void; onDelete?: () => void; From 592e23496f9b7072f252946502ace4692fb71ab8 Mon Sep 17 00:00:00 2001 From: Shahzad Date: Tue, 12 May 2020 11:16:32 +0200 Subject: [PATCH 102/102] [Uptime] Enable deselection of stale filters (#65523) --- .../overview/alerts/add_filter_btn.tsx | 4 +- .../filters_expression_select.tsx | 41 ++++++++++--------- .../filter_popover.test.tsx.snap | 12 +++--- .../overview/filter_group/filter_group.tsx | 15 +++---- .../overview/filter_group/filter_popover.tsx | 14 ++++++- .../uptime/public/hooks/use_filter_update.ts | 17 +++++++- 6 files changed, 64 insertions(+), 39 deletions(-) diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/add_filter_btn.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/add_filter_btn.tsx index c52489984dab4..c33cba73ee976 100644 --- a/x-pack/plugins/uptime/public/components/overview/alerts/add_filter_btn.tsx +++ b/x-pack/plugins/uptime/public/components/overview/alerts/add_filter_btn.tsx @@ -17,9 +17,9 @@ interface Props { export const AddFilterButton: React.FC = ({ newFilters, onNewFilter }) => { const [isPopoverOpen, setPopover] = useState(false); - const currentFilters = useFilterUpdate(); + const { selectedFilters } = useFilterUpdate(); - const getSelectedItems = (fieldName: string) => currentFilters.get(fieldName) || []; + const getSelectedItems = (fieldName: string) => selectedFilters.get(fieldName) || []; const onButtonClick = () => { setPopover(!isPopoverOpen); diff --git a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/filters_expression_select.tsx b/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/filters_expression_select.tsx index 8298f202b9458..a6728643146df 100644 --- a/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/filters_expression_select.tsx +++ b/x-pack/plugins/uptime/public/components/overview/alerts/monitor_expressions/filters_expression_select.tsx @@ -31,7 +31,10 @@ export const FiltersExpressionsSelect: React.FC = ({ values: string[]; }>({ fieldName: '', values: [] }); - const currentFilters = useFilterUpdate(updatedFieldValues.fieldName, updatedFieldValues.values); + const { selectedLocations, selectedPorts, selectedSchemes, selectedTags } = useFilterUpdate( + updatedFieldValues.fieldName, + updatedFieldValues.values + ); useEffect(() => { if (updatedFieldValues.fieldName === 'observer.geo.name') { @@ -45,13 +48,6 @@ export const FiltersExpressionsSelect: React.FC = ({ // eslint-disable-next-line react-hooks/exhaustive-deps }, []); - const selectedTags = currentFilters.get('tags'); - const selectedPorts = currentFilters.get('url.port'); - const selectedScheme = currentFilters.get('monitor.type'); - const selectedLocation = currentFilters.get('observer.geo.name'); - - const getSelectedItems = (fieldName: string) => currentFilters.get(fieldName) || []; - const onFilterFieldChange = (fieldName: string, values: string[]) => { setUpdatedFieldValues({ fieldName, values }); }; @@ -64,10 +60,11 @@ export const FiltersExpressionsSelect: React.FC = ({ id: 'filter_port', disabled: ports?.length === 0, items: ports?.map((p: number) => p.toString()) ?? [], - selectedItems: getSelectedItems('url.port'), + selectedItems: selectedPorts, title: filterLabels.PORT, - description: selectedPorts ? alertFilterLabels.USING_PORT : alertFilterLabels.USING, - value: selectedPorts?.join(',') ?? alertFilterLabels.ANY_PORT, + description: + selectedPorts.length === 0 ? alertFilterLabels.USING : alertFilterLabels.USING_PORT, + value: selectedPorts.length === 0 ? alertFilterLabels.ANY_PORT : selectedPorts?.join(','), }, { onFilterFieldChange, @@ -76,10 +73,10 @@ export const FiltersExpressionsSelect: React.FC = ({ id: 'filter_tags', disabled: tags?.length === 0, items: tags ?? [], - selectedItems: getSelectedItems('tags'), + selectedItems: selectedTags, title: filterLabels.TAGS, - description: selectedTags ? alertFilterLabels.WITH_TAG : alertFilterLabels.WITH, - value: selectedTags?.join(',') ?? alertFilterLabels.ANY_TAG, + description: selectedTags.length === 0 ? alertFilterLabels.WITH : alertFilterLabels.WITH_TAG, + value: selectedTags.length === 0 ? alertFilterLabels.ANY_TAG : selectedTags?.join(','), }, { onFilterFieldChange, @@ -88,10 +85,10 @@ export const FiltersExpressionsSelect: React.FC = ({ id: 'filter_scheme', disabled: schemes?.length === 0, items: schemes ?? [], - selectedItems: getSelectedItems('monitor.type'), + selectedItems: selectedSchemes, title: filterLabels.SCHEME, - description: selectedScheme ? alertFilterLabels.OF_TYPE : alertFilterLabels.OF, - value: selectedScheme?.join(',') ?? alertFilterLabels.ANY_TYPE, + description: selectedSchemes.length === 0 ? alertFilterLabels.OF : alertFilterLabels.OF_TYPE, + value: selectedSchemes.length === 0 ? alertFilterLabels.ANY_TYPE : selectedSchemes?.join(','), }, { onFilterFieldChange, @@ -100,10 +97,14 @@ export const FiltersExpressionsSelect: React.FC = ({ id: 'filter_location', disabled: locations?.length === 0, items: locations ?? [], - selectedItems: getSelectedItems('observer.geo.name'), + selectedItems: selectedLocations, title: filterLabels.SCHEME, - description: selectedLocation ? alertFilterLabels.FROM_LOCATION : alertFilterLabels.FROM, - value: selectedLocation?.join(',') ?? alertFilterLabels.ANY_LOCATION, + description: + selectedLocations.length === 0 ? alertFilterLabels.FROM : alertFilterLabels.FROM_LOCATION, + value: + selectedLocations.length === 0 + ? alertFilterLabels.ANY_LOCATION + : selectedLocations?.join(','), }, ]; diff --git a/x-pack/plugins/uptime/public/components/overview/filter_group/__tests__/__snapshots__/filter_popover.test.tsx.snap b/x-pack/plugins/uptime/public/components/overview/filter_group/__tests__/__snapshots__/filter_popover.test.tsx.snap index c7ffc36532b71..2677fd828c957 100644 --- a/x-pack/plugins/uptime/public/components/overview/filter_group/__tests__/__snapshots__/filter_popover.test.tsx.snap +++ b/x-pack/plugins/uptime/public/components/overview/filter_group/__tests__/__snapshots__/filter_popover.test.tsx.snap @@ -7,7 +7,7 @@ exports[`FilterPopover component does not show item list when loading 1`] = ` @@ -26,7 +26,7 @@ exports[`FilterPopover component does not show item list when loading 1`] = ` @@ -64,7 +64,7 @@ exports[`FilterPopover component renders without errors for valid props 1`] = ` - 3 + 1 diff --git a/x-pack/plugins/uptime/public/components/overview/filter_group/filter_group.tsx b/x-pack/plugins/uptime/public/components/overview/filter_group/filter_group.tsx index b881dfcdd2e00..f5527a17b0cda 100644 --- a/x-pack/plugins/uptime/public/components/overview/filter_group/filter_group.tsx +++ b/x-pack/plugins/uptime/public/components/overview/filter_group/filter_group.tsx @@ -27,14 +27,15 @@ export const FilterGroupComponent: React.FC = ({ values: string[]; }>({ fieldName: '', values: [] }); - const currentFilters = useFilterUpdate(updatedFieldValues.fieldName, updatedFieldValues.values); + const { selectedLocations, selectedPorts, selectedSchemes, selectedTags } = useFilterUpdate( + updatedFieldValues.fieldName, + updatedFieldValues.values + ); const onFilterFieldChange = (fieldName: string, values: string[]) => { setUpdatedFieldValues({ fieldName, values }); }; - const getSelectedItems = (fieldName: string) => currentFilters.get(fieldName) || []; - const filterPopoverProps: FilterPopoverProps[] = [ { loading, @@ -42,7 +43,7 @@ export const FilterGroupComponent: React.FC = ({ fieldName: 'observer.geo.name', id: 'location', items: locations, - selectedItems: getSelectedItems('observer.geo.name'), + selectedItems: selectedLocations, title: filterLabels.LOCATION, }, { @@ -52,7 +53,7 @@ export const FilterGroupComponent: React.FC = ({ id: 'port', disabled: ports.length === 0, items: ports.map((p: number) => p.toString()), - selectedItems: getSelectedItems('url.port'), + selectedItems: selectedPorts, title: filterLabels.PORT, }, { @@ -62,7 +63,7 @@ export const FilterGroupComponent: React.FC = ({ id: 'scheme', disabled: schemes.length === 0, items: schemes, - selectedItems: getSelectedItems('monitor.type'), + selectedItems: selectedSchemes, title: filterLabels.SCHEME, }, { @@ -72,7 +73,7 @@ export const FilterGroupComponent: React.FC = ({ id: 'tags', disabled: tags.length === 0, items: tags, - selectedItems: getSelectedItems('tags'), + selectedItems: selectedTags, title: filterLabels.TAGS, }, ]; diff --git a/x-pack/plugins/uptime/public/components/overview/filter_group/filter_popover.tsx b/x-pack/plugins/uptime/public/components/overview/filter_group/filter_popover.tsx index 18d40b83be369..c04460237f4f1 100644 --- a/x-pack/plugins/uptime/public/components/overview/filter_group/filter_popover.tsx +++ b/x-pack/plugins/uptime/public/components/overview/filter_group/filter_popover.tsx @@ -33,7 +33,7 @@ export const FilterPopover = ({ id, disabled, loading, - items, + items: allItems, onFilterFieldChange, selectedItems, title, @@ -46,6 +46,16 @@ export const FilterPopover = ({ const [searchQuery, setSearchQuery] = useState(''); const [tempSelectedItems, setTempSelectedItems] = useState(selectedItems); + const [items, setItems] = useState([]); + + useEffect(() => { + // Merge incoming items with selected items, to enable deselection + + const mItems = selectedItems.concat(allItems ?? []); + const newItems = mItems.filter((item, index) => mItems.indexOf(item) === index); + setItems(newItems); + }, [allItems, selectedItems]); + useEffect(() => { if (searchQuery !== '') { const toDisplay = items.filter(item => item.indexOf(searchQuery) >= 0); @@ -60,7 +70,7 @@ export const FilterPopover = ({ button={ btnContent ?? ( 0} numFilters={items.length} numActiveFilters={tempSelectedItems.length} diff --git a/x-pack/plugins/uptime/public/hooks/use_filter_update.ts b/x-pack/plugins/uptime/public/hooks/use_filter_update.ts index 97ef6b0e67ad2..e7e59ff2e22e6 100644 --- a/x-pack/plugins/uptime/public/hooks/use_filter_update.ts +++ b/x-pack/plugins/uptime/public/hooks/use_filter_update.ts @@ -12,8 +12,15 @@ import { useUrlParams } from './use_url_params'; * @param fieldName the name of the field to filter against * @param values the list of values to use when filter a field */ +interface SelectedFilters { + selectedTags: string[]; + selectedPorts: string[]; + selectedSchemes: string[]; + selectedLocations: string[]; + selectedFilters: Map; +} -export const useFilterUpdate = (fieldName?: string, values?: string[]) => { +export const useFilterUpdate = (fieldName?: string, values?: string[]): SelectedFilters => { const [getUrlParams, updateUrl] = useUrlParams(); const { filters: currentFilters } = getUrlParams(); @@ -52,5 +59,11 @@ export const useFilterUpdate = (fieldName?: string, values?: string[]) => { // eslint-disable-next-line react-hooks/exhaustive-deps }, [fieldName, values]); - return filterKueries; + return { + selectedTags: filterKueries.get('tags') || [], + selectedPorts: filterKueries.get('url.port') || [], + selectedSchemes: filterKueries.get('monitor.type') || [], + selectedLocations: filterKueries.get('observer.geo.name') || [], + selectedFilters: filterKueries, + }; };

{i18n.translate( 'xpack.apm.serviceDetails.enableAnomalyDetectionPanel.manageMLJobDescription.mlJobsPageLinkText', { - defaultMessage: 'Machine Learning jobs management page' + defaultMessage: 'Machine Learning Job Management page' } )} diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index e96f027445194..f6b645ee33ed1 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -4314,7 +4314,6 @@ "xpack.apm.serviceDetails.enableAnomalyDetectionPanel.callout.jobExistsDescription": "現在 {serviceName} ({transactionType}) の実行中のジョブがあります。", "xpack.apm.serviceDetails.enableAnomalyDetectionPanel.callout.jobExistsDescription.viewJobLinkText": "既存のジョブを表示", "xpack.apm.serviceDetails.enableAnomalyDetectionPanel.callout.jobExistsTitle": "ジョブが既に存在します", - "xpack.apm.serviceDetails.enableAnomalyDetectionPanel.createMLJobDescription": "ここでは、{serviceName} 数列内の APM トランザクションの期間の異常スコアを計算する機械学習ジョブを作成できます。有効にすると、{transactionDurationGraphText} が予測バウンドを表示し、異常スコアが >=75 の場合グラフに注釈が追加されます。", "xpack.apm.serviceDetails.enableAnomalyDetectionPanel.createMLJobDescription.transactionDurationGraphText": "トランザクション時間のグラフ", "xpack.apm.serviceDetails.enableAnomalyDetectionPanel.createNewJobButtonLabel": "ジョブを作成", "xpack.apm.serviceDetails.enableAnomalyDetectionPanel.enableAnomalyDetectionTitle": "異常検知を有効にする", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 1d73c4757c8e9..c9ed2111a4e7c 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -4315,7 +4315,6 @@ "xpack.apm.serviceDetails.enableAnomalyDetectionPanel.callout.jobExistsDescription": "当前有 {serviceName}({transactionType})的作业正在运行。", "xpack.apm.serviceDetails.enableAnomalyDetectionPanel.callout.jobExistsDescription.viewJobLinkText": "查看现有作业", "xpack.apm.serviceDetails.enableAnomalyDetectionPanel.callout.jobExistsTitle": "作业已存在", - "xpack.apm.serviceDetails.enableAnomalyDetectionPanel.createMLJobDescription": "在这里可以创建 Machine Learning 作业以基于 {serviceName} 服务内 APM 事务的持续时间计算异常分数。启用后,一旦异常分数 >=75,{transactionDurationGraphText}将显示预期边界并标注图表。", "xpack.apm.serviceDetails.enableAnomalyDetectionPanel.createMLJobDescription.transactionDurationGraphText": "事务持续时间图表", "xpack.apm.serviceDetails.enableAnomalyDetectionPanel.createNewJobButtonLabel": "创建作业", "xpack.apm.serviceDetails.enableAnomalyDetectionPanel.enableAnomalyDetectionTitle": "启用异常检测", From 4a207ae9b2ce924bc3e16a11ab7f07144bd77bc8 Mon Sep 17 00:00:00 2001 From: Frank Hassanabad Date: Thu, 7 May 2020 19:39:47 -0600 Subject: [PATCH 026/102] [SIEM] Add types to the mappings objects so extra keys cannot be introduced Add types to the mappings objects so extra keys cannot be introduced by accident and makes it easier to see mistakes as you type things within the mappings. --- .../lib/detection_engine/rule_actions/saved_object_mappings.ts | 2 +- .../server/lib/detection_engine/rules/saved_object_mappings.ts | 2 +- x-pack/plugins/siem/server/lib/note/saved_object_mappings.ts | 2 +- .../siem/server/lib/pinned_event/saved_object_mappings.ts | 2 +- .../plugins/siem/server/lib/timeline/saved_object_mappings.ts | 2 +- 5 files changed, 5 insertions(+), 5 deletions(-) diff --git a/x-pack/plugins/siem/server/lib/detection_engine/rule_actions/saved_object_mappings.ts b/x-pack/plugins/siem/server/lib/detection_engine/rule_actions/saved_object_mappings.ts index e50f82bb482a7..a7556d975da40 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/rule_actions/saved_object_mappings.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/rule_actions/saved_object_mappings.ts @@ -8,7 +8,7 @@ import { SavedObjectsType } from '../../../../../../../src/core/server'; export const ruleActionsSavedObjectType = 'siem-detection-engine-rule-actions'; -export const ruleActionsSavedObjectMappings = { +export const ruleActionsSavedObjectMappings: SavedObjectsType['mappings'] = { properties: { alertThrottle: { type: 'keyword', diff --git a/x-pack/plugins/siem/server/lib/detection_engine/rules/saved_object_mappings.ts b/x-pack/plugins/siem/server/lib/detection_engine/rules/saved_object_mappings.ts index 2dcc90240ad40..c01bc2497d677 100644 --- a/x-pack/plugins/siem/server/lib/detection_engine/rules/saved_object_mappings.ts +++ b/x-pack/plugins/siem/server/lib/detection_engine/rules/saved_object_mappings.ts @@ -8,7 +8,7 @@ import { SavedObjectsType } from '../../../../../../../src/core/server'; export const ruleStatusSavedObjectType = 'siem-detection-engine-rule-status'; -export const ruleStatusSavedObjectMappings = { +export const ruleStatusSavedObjectMappings: SavedObjectsType['mappings'] = { properties: { alertId: { type: 'keyword', diff --git a/x-pack/plugins/siem/server/lib/note/saved_object_mappings.ts b/x-pack/plugins/siem/server/lib/note/saved_object_mappings.ts index 0f079571b868b..de0bb3468e524 100644 --- a/x-pack/plugins/siem/server/lib/note/saved_object_mappings.ts +++ b/x-pack/plugins/siem/server/lib/note/saved_object_mappings.ts @@ -8,7 +8,7 @@ import { SavedObjectsType } from '../../../../../../src/core/server'; export const noteSavedObjectType = 'siem-ui-timeline-note'; -export const noteSavedObjectMappings = { +export const noteSavedObjectMappings: SavedObjectsType['mappings'] = { properties: { timelineId: { type: 'keyword', diff --git a/x-pack/plugins/siem/server/lib/pinned_event/saved_object_mappings.ts b/x-pack/plugins/siem/server/lib/pinned_event/saved_object_mappings.ts index 1a4cd3fce575d..d352764930d7f 100644 --- a/x-pack/plugins/siem/server/lib/pinned_event/saved_object_mappings.ts +++ b/x-pack/plugins/siem/server/lib/pinned_event/saved_object_mappings.ts @@ -8,7 +8,7 @@ import { SavedObjectsType } from '../../../../../../src/core/server'; export const pinnedEventSavedObjectType = 'siem-ui-timeline-pinned-event'; -export const pinnedEventSavedObjectMappings = { +export const pinnedEventSavedObjectMappings: SavedObjectsType['mappings'] = { properties: { timelineId: { type: 'keyword', diff --git a/x-pack/plugins/siem/server/lib/timeline/saved_object_mappings.ts b/x-pack/plugins/siem/server/lib/timeline/saved_object_mappings.ts index 1cab24d0879ff..4d9ae19bfd6a2 100644 --- a/x-pack/plugins/siem/server/lib/timeline/saved_object_mappings.ts +++ b/x-pack/plugins/siem/server/lib/timeline/saved_object_mappings.ts @@ -8,7 +8,7 @@ import { SavedObjectsType } from '../../../../../../src/core/server'; export const timelineSavedObjectType = 'siem-ui-timeline'; -export const timelineSavedObjectMappings = { +export const timelineSavedObjectMappings: SavedObjectsType['mappings'] = { properties: { columns: { properties: { From f9f242990d4149023ef810667ef91f0ec326a5e1 Mon Sep 17 00:00:00 2001 From: Walter Rafelsberger Date: Fri, 8 May 2020 08:25:10 +0200 Subject: [PATCH 027/102] [ML] Fix pagination reset on search query update. (#65668) Fixes pagination issue: When the query bar query changes, we need to check the selected page is still valid. Example: If you're on a last page (125), edit the filter, and it looks like the grid is trying to reload page 125 even though there are only 24 pages for the new query value you end up with an empty table. This brings over a fix already in place for the transform data grids: On every search query change we'll reset the pagination index. --- .../exploration_results_table/use_exploration_results.ts | 4 ++++ .../components/outlier_exploration/use_outlier_data.ts | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_results_table/use_exploration_results.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_results_table/use_exploration_results.ts index 6f9dc694d8172..e664a1ddbdbcc 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_results_table/use_exploration_results.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/exploration_results_table/use_exploration_results.ts @@ -51,6 +51,10 @@ export const useExplorationResults = ( d => !d.includes(`.${FEATURE_IMPORTANCE}.`) && d !== ML__ID_COPY ); + useEffect(() => { + dataGrid.resetPagination(); + }, [JSON.stringify(searchQuery)]); + useEffect(() => { getIndexData(jobConfig, dataGrid, searchQuery); // custom comparison diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/use_outlier_data.ts b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/use_outlier_data.ts index 0d06bc0d43307..75b2f6aa867df 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/use_outlier_data.ts +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/analytics_exploration/components/outlier_exploration/use_outlier_data.ts @@ -58,6 +58,10 @@ export const useOutlierData = ( d => !d.includes(`.${FEATURE_INFLUENCE}.`) && d !== ML__ID_COPY ); + useEffect(() => { + dataGrid.resetPagination(); + }, [JSON.stringify(searchQuery)]); + // initialize sorting: reverse sort on outlier score column useEffect(() => { if (jobConfig !== undefined) { From e35a74375a736cb637fb4369b02cfeedb44ba52a Mon Sep 17 00:00:00 2001 From: Mikhail Shustov Date: Fri, 8 May 2020 08:56:37 +0200 Subject: [PATCH 028/102] plugins logs start with "plugins." prefix (#65710) --- src/core/server/logging/README.md | 26 +++++++++++++------------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/core/server/logging/README.md b/src/core/server/logging/README.md index ed64e7c4ce0b1..553dc7c36e824 100644 --- a/src/core/server/logging/README.md +++ b/src/core/server/logging/README.md @@ -167,7 +167,7 @@ logging: - context: plugins appenders: [custom] level: warn - - context: plugins.pid + - context: plugins.myPlugin level: info - context: server level: fatal @@ -180,14 +180,14 @@ logging: Here is what we get with the config above: -| Context | Appenders | Level | -| ------------- |:------------------------:| -----:| -| root | console, file | error | -| plugins | custom | warn | -| plugins.pid | custom | info | -| server | console, file | fatal | -| optimize | console | error | -| telemetry | json-file-appender | all | +| Context | Appenders | Level | +| ---------------- |:------------------------:| -----:| +| root | console, file | error | +| plugins | custom | warn | +| plugins.myPlugin | custom | info | +| server | console, file | fatal | +| optimize | console | error | +| telemetry | json-file-appender | all | The `root` logger has a dedicated configuration node since this context is special and should always exist. By @@ -259,7 +259,7 @@ define a custom one. ```yaml logging: loggers: - - context: your-plugin + - context: plugins.myPlugin appenders: [console] ``` Logs in a *file* if given file path. You should define a custom appender with `kind: file` @@ -273,7 +273,7 @@ logging: layout: kind: pattern loggers: - - context: your-plugin + - context: plugins.myPlugin appenders: [file] ``` #### logging.json @@ -282,10 +282,10 @@ the output format with [layouts](#layouts). #### logging.quiet Suppresses all logging output other than error messages. With new logging, config can be achieved -with adjusting minimum required [logging level](#log-level) +with adjusting minimum required [logging level](#log-level). ```yaml loggers: - - context: my-plugin + - context: plugins.myPlugin appenders: [console] level: error # or for all output From 86bafec3a45316cb2c158918a7760b3c46c0ec2b Mon Sep 17 00:00:00 2001 From: Vadim Dalecky Date: Fri, 8 May 2020 10:05:27 +0200 Subject: [PATCH 029/102] Drilldown count tooltip (#65105) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * feat: 🎸 add tooltip ability to ui_actions * feat: 🎸 add tooltip support to drilldown count notification * test: 💍 add drilldown tooltip text tests * fix: 🐛 improve tooltip texts * fix: 🐛 put tooltip on top * fix: 🐛 add missing method to ActionFactory * fix: 🐛 improve handling of optional method --- .../lib/panel/panel_header/panel_header.tsx | 38 ++++++++++++++----- .../public/actions/action_internal.ts | 5 +++ .../ui_actions/public/util/presentable.ts | 6 +++ x-pack/.i18nrc.json | 1 + .../public/dynamic_actions/action_factory.ts | 4 ++ .../panel_notifications_action.test.ts | 34 +++++++++++++++++ .../actions/panel_notifications_action.ts | 21 ++++++++++ 7 files changed, 99 insertions(+), 10 deletions(-) diff --git a/src/plugins/embeddable/public/lib/panel/panel_header/panel_header.tsx b/src/plugins/embeddable/public/lib/panel/panel_header/panel_header.tsx index 35a10ed848e83..bb2eb52f9df72 100644 --- a/src/plugins/embeddable/public/lib/panel/panel_header/panel_header.tsx +++ b/src/plugins/embeddable/public/lib/panel/panel_header/panel_header.tsx @@ -62,16 +62,34 @@ function renderNotifications( notifications: Array>, embeddable: IEmbeddable ) { - return notifications.map(notification => ( - notification.execute({ embeddable })} - > - {notification.getDisplayName({ embeddable })} - - )); + return notifications.map(notification => { + const context = { embeddable }; + + let badge = ( + notification.execute(context)} + > + {notification.getDisplayName(context)} + + ); + + if (notification.getDisplayNameTooltip) { + const tooltip = notification.getDisplayNameTooltip(context); + + if (tooltip) { + badge = ( + + {badge} + + ); + } + } + + return badge; + }); } function renderTooltip(description: string) { diff --git a/src/plugins/ui_actions/public/actions/action_internal.ts b/src/plugins/ui_actions/public/actions/action_internal.ts index e3504c7c5d301..aba1e22fe09ee 100644 --- a/src/plugins/ui_actions/public/actions/action_internal.ts +++ b/src/plugins/ui_actions/public/actions/action_internal.ts @@ -48,6 +48,11 @@ export class ActionInternal return this.definition.getDisplayName(context); } + public getDisplayNameTooltip(context: Context): string { + if (!this.definition.getDisplayNameTooltip) return ''; + return this.definition.getDisplayNameTooltip(context); + } + public async isCompatible(context: Context): Promise { if (!this.definition.isCompatible) return true; return await this.definition.isCompatible(context); diff --git a/src/plugins/ui_actions/public/util/presentable.ts b/src/plugins/ui_actions/public/util/presentable.ts index f43b776e74658..57070f7673f61 100644 --- a/src/plugins/ui_actions/public/util/presentable.ts +++ b/src/plugins/ui_actions/public/util/presentable.ts @@ -50,6 +50,12 @@ export interface Presentable { */ getDisplayName(context: Context): string; + /** + * Returns tooltip text which should be displayed when user hovers this object. + * Should return empty string if tooltip should not be displayed. + */ + getDisplayNameTooltip(context: Context): string; + /** * This method should return a link if this item can be clicked on. The link * is used to navigate user if user middle-clicks it or Ctrl + clicks or diff --git a/x-pack/.i18nrc.json b/x-pack/.i18nrc.json index a033515fef8b0..7c464d44d5761 100644 --- a/x-pack/.i18nrc.json +++ b/x-pack/.i18nrc.json @@ -14,6 +14,7 @@ "xpack.dashboardMode": "legacy/plugins/dashboard_mode", "xpack.data": "plugins/data_enhanced", "xpack.drilldowns": "plugins/drilldowns", + "xpack.embeddableEnhanced": "plugins/embeddable_enhanced", "xpack.endpoint": "plugins/endpoint", "xpack.features": "plugins/features", "xpack.fileUpload": "plugins/file_upload", diff --git a/x-pack/plugins/advanced_ui_actions/public/dynamic_actions/action_factory.ts b/x-pack/plugins/advanced_ui_actions/public/dynamic_actions/action_factory.ts index f1aef5deff49e..262a5ef7d4561 100644 --- a/x-pack/plugins/advanced_ui_actions/public/dynamic_actions/action_factory.ts +++ b/x-pack/plugins/advanced_ui_actions/public/dynamic_actions/action_factory.ts @@ -42,6 +42,10 @@ export class ActionFactory< return this.def.getDisplayName(context); } + public getDisplayNameTooltip(context: FactoryContext): string { + return ''; + } + public async isCompatible(context: FactoryContext): Promise { if (!this.def.isCompatible) return true; return await this.def.isCompatible(context); diff --git a/x-pack/plugins/embeddable_enhanced/public/actions/panel_notifications_action.test.ts b/x-pack/plugins/embeddable_enhanced/public/actions/panel_notifications_action.test.ts index 839379387e094..158641cd97695 100644 --- a/x-pack/plugins/embeddable_enhanced/public/actions/panel_notifications_action.test.ts +++ b/x-pack/plugins/embeddable_enhanced/public/actions/panel_notifications_action.test.ts @@ -47,6 +47,40 @@ describe('PanelNotificationsAction', () => { }); }); + describe('getDisplayNameTooltip', () => { + test('returns empty string if embeddable has no event', async () => { + const context = createContext(); + const action = new PanelNotificationsAction(); + + const name = await action.getDisplayNameTooltip(context); + expect(name).toBe(''); + }); + + test('returns "1 drilldown" if embeddable has one event', async () => { + const context = createContext([{}]); + const action = new PanelNotificationsAction(); + + const name = await action.getDisplayNameTooltip(context); + expect(name).toBe('Panel has 1 drilldown'); + }); + + test('returns "2 drilldowns" if embeddable has two events', async () => { + const context = createContext([{}, {}]); + const action = new PanelNotificationsAction(); + + const name = await action.getDisplayNameTooltip(context); + expect(name).toBe('Panel has 2 drilldowns'); + }); + + test('returns "3 drilldowns" if embeddable has three events', async () => { + const context = createContext([{}, {}, {}]); + const action = new PanelNotificationsAction(); + + const name = await action.getDisplayNameTooltip(context); + expect(name).toBe('Panel has 3 drilldowns'); + }); + }); + describe('isCompatible', () => { test('returns false if not in "edit" mode', async () => { const context = createContext([{}]); diff --git a/x-pack/plugins/embeddable_enhanced/public/actions/panel_notifications_action.ts b/x-pack/plugins/embeddable_enhanced/public/actions/panel_notifications_action.ts index 19e0ac2a5a6d8..165ce24c13ea3 100644 --- a/x-pack/plugins/embeddable_enhanced/public/actions/panel_notifications_action.ts +++ b/x-pack/plugins/embeddable_enhanced/public/actions/panel_notifications_action.ts @@ -4,10 +4,26 @@ * you may not use this file except in compliance with the Elastic License. */ +import { i18n } from '@kbn/i18n'; import { UiActionsActionDefinition as ActionDefinition } from '../../../../../src/plugins/ui_actions/public'; import { ViewMode } from '../../../../../src/plugins/embeddable/public'; import { EnhancedEmbeddableContext, EnhancedEmbeddable } from '../types'; +export const txtOneDrilldown = i18n.translate( + 'xpack.embeddableEnhanced.actions.panelNotifications.oneDrilldown', + { + defaultMessage: 'Panel has 1 drilldown', + } +); + +export const txtManyDrilldowns = (count: number) => + i18n.translate('xpack.embeddableEnhanced.actions.panelNotifications.manyDrilldowns', { + defaultMessage: 'Panel has {count} drilldowns', + values: { + count: String(count), + }, + }); + export const ACTION_PANEL_NOTIFICATIONS = 'ACTION_PANEL_NOTIFICATIONS'; /** @@ -25,6 +41,11 @@ export class PanelNotificationsAction implements ActionDefinition { + const count = this.getEventCount(embeddable); + return !count ? '' : count === 1 ? txtOneDrilldown : txtManyDrilldowns(count); + }; + public readonly isCompatible = async ({ embeddable }: EnhancedEmbeddableContext) => { if (embeddable.getInput().viewMode !== ViewMode.EDIT) return false; return this.getEventCount(embeddable) > 0; From 1baf0b0e47816114300590eb096a7b85dac60097 Mon Sep 17 00:00:00 2001 From: Rudolf Meijering Date: Fri, 8 May 2020 10:07:59 +0200 Subject: [PATCH 030/102] SavedObjects bulkCreate API should return migrationVersion and strip the type & namespace from the id (#65150) * Deserialize bulkCreate response to remove namespace type from id * Index operations don't return _source in response * Fix integration tests * repository: make id generation and seq_no/primary_term spreading more explicit * API Integration test for bulk create without ids * Fix copy_to_space snapshot * Revert "Fix copy_to_space snapshot" This reverts commit 9c2b7433e3529236837c885108d0cc97d2e13169. * Move test into returns block * repository.test.js stricter regexp matching --- .../service/lib/repository.test.js | 59 +++++++++++++++++-- .../saved_objects/service/lib/repository.ts | 43 ++++++-------- .../apis/saved_objects/bulk_create.js | 21 +++++++ 3 files changed, 92 insertions(+), 31 deletions(-) diff --git a/src/core/server/saved_objects/service/lib/repository.test.js b/src/core/server/saved_objects/service/lib/repository.test.js index 927171438ae99..c46fcfbc6dbd7 100644 --- a/src/core/server/saved_objects/service/lib/repository.test.js +++ b/src/core/server/saved_objects/service/lib/repository.test.js @@ -23,6 +23,7 @@ import { SavedObjectsErrorHelpers } from './errors'; import { SavedObjectsSerializer } from '../../serialization'; import { encodeHitVersion } from '../../version'; import { SavedObjectTypeRegistry } from '../../saved_objects_type_registry'; +import { DocumentMigrator } from '../../migrations/core/document_migrator'; jest.mock('./search_dsl/search_dsl', () => ({ getSearchDsl: jest.fn() })); @@ -115,6 +116,7 @@ describe('SavedObjectsRepository', () => { const createType = type => ({ name: type, mappings: { properties: mappings.properties[type].properties }, + migrations: { '1.1.1': doc => doc }, }); const registry = new SavedObjectTypeRegistry(); @@ -144,6 +146,13 @@ describe('SavedObjectsRepository', () => { namespaceType: 'agnostic', }); + const documentMigrator = new DocumentMigrator({ + typeRegistry: registry, + kibanaVersion: '2.0.0', + log: {}, + validateDoc: jest.fn(), + }); + const getMockGetResponse = ({ type, id, references, namespace }) => ({ // NOTE: Elasticsearch returns more fields (_index, _type) but the SavedObjectsRepository method ignores these found: true, @@ -207,7 +216,7 @@ describe('SavedObjectsRepository', () => { beforeEach(() => { callAdminCluster = jest.fn(); migrator = { - migrateDocument: jest.fn(doc => doc), + migrateDocument: jest.fn().mockImplementation(documentMigrator.migrate), runMigrations: async () => ({ status: 'skipped' }), }; @@ -424,9 +433,17 @@ describe('SavedObjectsRepository', () => { const getMockBulkCreateResponse = (objects, namespace) => { return { - items: objects.map(({ type, id }) => ({ + items: objects.map(({ type, id, attributes, references, migrationVersion }) => ({ create: { _id: `${namespace ? `${namespace}:` : ''}${type}:${id}`, + _source: { + [type]: attributes, + type, + namespace, + references, + ...mockTimestampFields, + migrationVersion: migrationVersion || { [type]: '1.1.1' }, + }, ...mockVersionProps, }, })), @@ -474,7 +491,7 @@ describe('SavedObjectsRepository', () => { const expectSuccessResult = obj => ({ ...obj, - migrationVersion: undefined, + migrationVersion: { [obj.type]: '1.1.1' }, version: mockVersion, ...mockTimestampFields, }); @@ -619,13 +636,16 @@ describe('SavedObjectsRepository', () => { }; const bulkCreateError = async (obj, esError, expectedError) => { - const objects = [obj1, obj, obj2]; - const response = getMockBulkCreateResponse(objects); + let response; if (esError) { + response = getMockBulkCreateResponse([obj1, obj, obj2]); response.items[1].create = { error: esError }; + } else { + response = getMockBulkCreateResponse([obj1, obj2]); } callAdminCluster.mockResolvedValue(response); // this._writeToCluster('bulk', ...) + const objects = [obj1, obj, obj2]; const result = await savedObjectsRepository.bulkCreate(objects); expectClusterCalls('bulk'); const objCall = esError ? expectObjArgs(obj) : []; @@ -781,7 +801,7 @@ describe('SavedObjectsRepository', () => { id: 'three', }; const objects = [obj1, obj, obj2]; - const response = getMockBulkCreateResponse(objects); + const response = getMockBulkCreateResponse([obj1, obj2]); callAdminCluster.mockResolvedValue(response); // this._writeToCluster('bulk', ...) const result = await savedObjectsRepository.bulkCreate(objects); expect(callAdminCluster).toHaveBeenCalledTimes(1); @@ -789,6 +809,32 @@ describe('SavedObjectsRepository', () => { saved_objects: [expectSuccessResult(obj1), expectError(obj), expectSuccessResult(obj2)], }); }); + + it(`a deserialized saved object`, async () => { + // Test for fix to https://github.com/elastic/kibana/issues/65088 where + // we returned raw ID's when an object without an id was created. + const namespace = 'myspace'; + const response = getMockBulkCreateResponse([obj1, obj2], namespace); + callAdminCluster.mockResolvedValueOnce(response); // this._writeToCluster('bulk', ...) + + // Bulk create one object with id unspecified, and one with id specified + const result = await savedObjectsRepository.bulkCreate([{ ...obj1, id: undefined }, obj2], { + namespace, + }); + + // Assert that both raw docs from the ES response are deserialized + expect(serializer.rawToSavedObject).toHaveBeenNthCalledWith(1, { + ...response.items[0].create, + _id: expect.stringMatching(/^myspace:config:[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$/), + }); + expect(serializer.rawToSavedObject).toHaveBeenNthCalledWith(2, response.items[1].create); + + // Assert that ID's are deserialized to remove the type and namespace + expect(result.saved_objects[0].id).toEqual( + expect.stringMatching(/^[0-9a-f]{8}-([0-9a-f]{4}-){3}[0-9a-f]{12}$/) + ); + expect(result.saved_objects[1].id).toEqual(obj2.id); + }); }); }); @@ -1604,6 +1650,7 @@ describe('SavedObjectsRepository', () => { version: mockVersion, attributes, references, + migrationVersion: { [type]: '1.1.1' }, }); }); }); diff --git a/src/core/server/saved_objects/service/lib/repository.ts b/src/core/server/saved_objects/service/lib/repository.ts index bc8ad2cdb0058..61027130e0eb7 100644 --- a/src/core/server/saved_objects/service/lib/repository.ts +++ b/src/core/server/saved_objects/service/lib/repository.ts @@ -18,6 +18,7 @@ */ import { omit } from 'lodash'; +import uuid from 'uuid'; import { retryCallCluster } from '../../../elasticsearch/retry_call_cluster'; import { APICaller } from '../../../elasticsearch/'; @@ -299,6 +300,8 @@ export class SavedObjectsRepository { const requiresNamespacesCheck = method === 'index' && this._registry.isMultiNamespace(object.type); + if (object.id == null) object.id = uuid.v1(); + return { tag: 'Right' as 'Right', value: { @@ -404,35 +407,25 @@ export class SavedObjectsRepository { } const { requestedId, rawMigratedDoc, esRequestIndex } = expectedResult.value; - const response = bulkResponse.items[esRequestIndex]; - const { - error, - _id: responseId, - _seq_no: seqNo, - _primary_term: primaryTerm, - } = Object.values(response)[0] as any; - - const { - _source: { type, [type]: attributes, references = [], namespaces }, - } = rawMigratedDoc; - - const id = requestedId || responseId; + const { error, ...rawResponse } = Object.values( + bulkResponse.items[esRequestIndex] + )[0] as any; + if (error) { return { - id, - type, - error: getBulkOperationError(error, type, id), + id: requestedId, + type: rawMigratedDoc._source.type, + error: getBulkOperationError(error, rawMigratedDoc._source.type, requestedId), }; } - return { - id, - type, - ...(namespaces && { namespaces }), - updated_at: time, - version: encodeVersion(seqNo, primaryTerm), - attributes, - references, - }; + + // When method == 'index' the bulkResponse doesn't include the indexed + // _source so we return rawMigratedDoc but have to spread the latest + // _seq_no and _primary_term values from the rawResponse. + return this._serializer.rawToSavedObject({ + ...rawMigratedDoc, + ...{ _seq_no: rawResponse._seq_no, _primary_term: rawResponse._primary_term }, + }); }), }; } diff --git a/test/api_integration/apis/saved_objects/bulk_create.js b/test/api_integration/apis/saved_objects/bulk_create.js index 2d77fdf266793..a0d2717555150 100644 --- a/test/api_integration/apis/saved_objects/bulk_create.js +++ b/test/api_integration/apis/saved_objects/bulk_create.js @@ -72,11 +72,26 @@ export default function({ getService }) { attributes: { title: 'A great new dashboard', }, + migrationVersion: { + dashboard: resp.body.saved_objects[1].migrationVersion.dashboard, + }, references: [], }, ], }); })); + + it('should not return raw id when object id is unspecified', async () => + await supertest + .post(`/api/saved_objects/_bulk_create`) + // eslint-disable-next-line no-unused-vars + .send(BULK_REQUESTS.map(({ id, ...rest }) => rest)) + .expect(200) + .then(resp => { + resp.body.saved_objects.map(({ id }) => + expect(id).not.match(/visualization|dashboard/) + ); + })); }); describe('without kibana index', () => { @@ -106,6 +121,9 @@ export default function({ getService }) { title: 'An existing visualization', }, references: [], + migrationVersion: { + visualization: resp.body.saved_objects[0].migrationVersion.visualization, + }, }, { type: 'dashboard', @@ -116,6 +134,9 @@ export default function({ getService }) { title: 'A great new dashboard', }, references: [], + migrationVersion: { + dashboard: resp.body.saved_objects[1].migrationVersion.dashboard, + }, }, ], }); From 74255a3cba1b95b0c8cc586062d4763376e8657d Mon Sep 17 00:00:00 2001 From: Mohinder Saluja Date: Fri, 8 May 2020 14:24:12 +0530 Subject: [PATCH 031/102] [APM] Add tooltip explaining Group ID (#60425) * Add tooltip * Reimplement using EuiIconTip * Change styles of tooltip icon * Add EuiIconTip on Impact column in transactions table * Remove unused import * Update snashots * adding tooltip to errors and transactions overview pages Co-authored-by: Elastic Machine Co-authored-by: cauemarcondes --- .../__test__/__snapshots__/List.test.tsx.snap | 138 +++++++++++++++++- .../app/ErrorGroupOverview/List/index.tsx | 27 +++- .../app/TransactionOverview/List/index.tsx | 43 +++--- .../translations/translations/ja-JP.json | 1 + .../translations/translations/zh-CN.json | 1 + 5 files changed, 180 insertions(+), 30 deletions(-) diff --git a/x-pack/plugins/apm/public/components/app/ErrorGroupOverview/List/__test__/__snapshots__/List.test.tsx.snap b/x-pack/plugins/apm/public/components/app/ErrorGroupOverview/List/__test__/__snapshots__/List.test.tsx.snap index 0fbf0a5c7a27d..3de725dc58ea7 100644 --- a/x-pack/plugins/apm/public/components/app/ErrorGroupOverview/List/__test__/__snapshots__/List.test.tsx.snap +++ b/x-pack/plugins/apm/public/components/app/ErrorGroupOverview/List/__test__/__snapshots__/List.test.tsx.snap @@ -6,7 +6,21 @@ exports[`ErrorGroupOverview -> List should render empty state 1`] = ` Array [ Object { "field": "groupId", - "name": "Group ID", + "name": + Group ID + + + , "render": [Function], "sortable": false, "width": "96px", @@ -141,9 +155,26 @@ exports[`ErrorGroupOverview -> List should render empty state 1`] = ` > Group ID + + +

<<9w&%^ zd)|*UV#4`l3*!(b!v4|{7;caNs26Son1Xlw4LQ#JTkfF!vbDX6Og=*{96&n6lduT> zBukb1Ht5F}K8g^}N%{`9|IUOj!OwSk`3T(Y(}EC!@1u?$e69*UDIxxs2l#{CmcI!J z|I5zvw`k!0OL+BP!mHn$rXT0;zeno7N9w1_{-@>rFNfT3%;f)1tW**Ms+n9GnN0p0 z-{#wYg8_B^`P9reaf_n@ksaz{A1hIB|LAaZU1Wh|u`G@Ix5>hO)h`LprW#OAyT&2O zfTL5|yjqnKQA5y2c!@j|Iu8M~@6umqRCKqXdkN^(EyNmhe&aDtl>;{{Hl&vf-03A^ z@+&;}7l$xGlcA7Hn31x-?JEs+ zbVtvj_XU`bhYxW80qG~1beTc^3blIY;8iE~ANLniK)7Pg2v_)Ta4&vQy{gJii*CowBAp0(>0QNAWBG3cMCi5DbYjf4-`!s^xCq~{s`xCDhS~e zKjrQKfM${Je`64ZHpWmMW=KhVE`&*gC3oR2GSTo8qhI$#Fw70r>~j(3sq4q|K%A=h zQG&LoPZ3M|{YOkN{&yE*>?$WY5w$%9y<4Mt1hqMsh4;^W`@rs=^~Eo%$}fxTMgvE} zI?0s7ttVu?h$as^Aw;Lg-`ap{swMV>o+hE0qVsQlz3C^~K%6@1cA>N%i~Ldo;RIj1 zs~YngGMj&@+5Znf${%w7gBX7V76N~hT=Ur2j);|CcGG0iYva z2g+{0SY6vzWsf0#7+erZ`Y5e-%z4o`IC?BY?%0wWF!KgY{fv13WRd?@P4RD^?i2pN zlC&gBwNxGXh{+@71#OQNNwet7F|s_6gNH}LeKnC=#Yb>;vD*}B5E3erS`2jq!=nI-i1 zlSWPm@?@>!Q(EC z-U91Y8|4yhoAd(q;@Xe` zXmGYhTApqxut(iQUoSk@lFfqIlld@n< zf_30>VA;77?YP)KYd-mh9wN}d{Sn60+oLyV*Dx!|h(}7pRm&}skL%PJ&1Rc0mCKeM zZ_&RJ3};qZGDsVRgRaNNv>1PZg6aPvjXxfd1V^M0$zMJbCfc30MZ${@|8{wjkf9@z zy})$;Z4B^WwhK7_;EMjim7lUfy!1<9lG_#%&-_V3y1O5g#(mg($H&KadrCvOEsS1k zJepeP5@)YxM9lB+{~x^5f4;W~wn!i7Mj^K5R{wzHZ{=jp`RJl_$uFv<&izRwsu{yb zv82D3SKCphA`wyBDfQ$U*VkG(efgmESM123bbbm;o|MP45^ntp_M0>($VschRzNPKAqR_TfQ2rP?j;xE$IyzFa%5 zc9I$faiy@kHM+RG zfmn#qnBKF2jSZce}z}C7No-B)iDnD3qkiaAYL89}h;kRvQHhJg^$b3m?h`qHmQv9-S~o9NgStIoLFr|1qljn@dkv7$ z*F@g_?f3Y%A29Pks4>s???vAZc~KIVX!P8hSyb#N0we!KpZ;~m+h4<{-+rp|L&#FT z!5;TD0yaKn?}=Is(&g@&;#dJNfN$xp?_bvTzpt_a1%GRFC8HkQ;jg{NgvCs^@}A*U zm7J5avv%M6Fb4)?BBs`*3wD%lio_%2g=f!-*ZD*3Nfno<_ei=pGnd0|nNkzbzm)8# z7isk?mH0;$s`t#vAh!*HT>4pn* z!?K18J}Bxkw}y)Px;9}TaHW6!2LJipCl%NtrN~5#8f#<#$Tv%C7v=rI zJWBFGQsVp4Jv{}F-#!a&sx-X$zocQoIZU*TL%v;g{^juaSfso_M>Tf*sQbY+wzDG~ z#(Pi*W51S)%Wk~qbJYQIA{YDZifB>?#%IrR)r0h){M54=8w(a$m5&iEHuqOAc<*C> z_;!JTS}Yd*oIu9xf;&aLOnpi5DCgV0d0TsW#zN{bY6i)PM3ui71--dFlo1oULmwVG zZ9)ig4Wsv!ul~Nf|J%d+r<5f&;^c{h6pErf2I`nt^~#M4)+HkEL9(m0POR-E7y_Q~ z_3i~5)Kdgk>w@7^B=4xF%71NpL}2*#U-PmEniZ|L&^&>$Ci^OERz)$^XFx z@QZ+BA;!+=zP`jMgGzvhN2Avj8QR9qgA@a^2d*lD<822h5^4l?M?0u;&XLyQaEXUsg*F{@z@S1Rf!>}q*MFh@W4-T5#u@#e=`-vBhn6R8)kT86P zW~Cmyb4C&#r#aDn6JXHFZG=-&V77YA5{y}(MnMc#`P=7liWH35XzW@CMy~Is$**JA4xPRC1=#E!B(CX0G{&swGTy8qPYP+LOFT0X9HQp@|$sb0*f3KQ=H#jL# zDIac%U;f>#L+KKy5og+kcuD$*;b2j%U}iJHQgfef%gndQ<$6*{B8q`b{$;C~kJvQH zmXO14KOhusyHcr~#F^X)2_`LG7}E|CTQlFjj*gDbBl-iyjEu6h+bG$!q~gw0ax?-$ zZ&Q)n*3i%>cZQdI{WgxxoZBAEW;iG~Sf!PPpW3Y5Wm0(#TK~&!rGkt6M;5)l`&g_l zFxoH0qkVH>grI3!QNtQsc;_uP#_XLpywGuidF(AlvEogxQqs5yL}WO=Fa{G=LfRwz z2)l-uG-?sVKFZb#B&UU7Bu?qVW-8cx7CU8CG zl|Xgb%H$hYT!DmfMDnlf_G|fV#&HY4+B!ZT!u4QZQ)XfYj`k{@X8$+hAN4FJW$^V^pT#L+)H>g!~4+!;kH^!KgEf+~DBKxkAC{^l4XtxG`>owjX0p^%d{Vj!JuF%qc z7=3NnrK6oFErWii7m&EL!?O0z4+o4&nTW1&(d{fSg?6ZvyyEcThJcnGQ3w-p%!Y=f zNV=Dfp267+mH7Nr{UoF0u^I}y)#l*ySXaI?A|q~AGb%1*BJo-c@(^n0tl|YHURgk= zLgj<&OurJTQqq$+0pYfeEtZ?lt@UqF)aVE!e(cIV%HXxoK_K4jzi#!!C%L1ivZ8sh zQ!Q|6C;pl7tD5eyc{V?P{~#QC#pR=L_(%a3PV7z-VRiD?Ml9vX+f|uUfk!)d&;WiD z#1w>~UBygXvT6q#@!iLDy1lMx1y+mtM`o>0orO+c@ldP9($8+M`QMGlgqcj-!b!aO zvcwHP?KSW6_lT=U4t)=Yt){B13)9>_kaR&p*xAHCz|PTXm9XsKP~L+1(wE~!dSaFl zHOI`#)r(o4gqm34#shFn?V;%EZFqWSg?>*Uw@k_Bo!7C`JMZ=g489+349t~_xr8TE zewh?g%aNn2ZQoGr11p>s_$im2MAD4OAa2jMxPs&UD$DnK$+&~fQ)z4W-30vLX^SB; zsc)o(W!p>mUucBogp{m0yx3&W{qiXj$^W}y&vr*Zv-Y&YXjj0iBweq2z4>OK{zM<(zwNUNY$xRP8`-pWdLdCqicZQ2(e^itIuAyW> zz*tRcMi6Fl*N3@w(EXBuRi#b#yyPs}3GH})0GvkZNHCny=lo%5p*3iYrl6Q`6|SnP zGJ3CsX12RDAzu^C+nl1|^@2h5d+~LW?bx-EVwD5Q*hep7oeDBKIK`iPDeNwfYABv& z%7yFq@fBDtAAALA$DwBdvCc*dLyB^5pS|ohi+YX4MqP|+aJI-=+pl?TA6}G`=?u$M z8LgldfXIRz;X6&;_RnE;CPxL|WWbcu@w0DuO?vaI<=2{&IOd=bMZR;RNS^Oc9%D2+MIid%(B8Q#Af|)S$cJa)HyqWJQld4#;N{dozjDM$`^5&3s`;xDw&Fnl!7y zQ(dv%hddN_VZF?s)vVlRAQ6)BjZyyRK(D_iHSX5|X4yN6nFA#AE{_*-C>CMvD!e?JIhMGkkw1%X%+KNL~ zOAaOo@A(n(n)Yqdxlu5zz1v+I5YAEe>$a406J8%-`_`447R~GUVxd#z?Y?~4_s{Jo zPLUlW>BT=CcGcVnR=pSL8nrocK-r*R+zGsl=F&G!lp(v<5yzndyk70XbKh5@`bgg2 z#MKsQ;xg#?$}L*`qBxTKpzGGK4UPSlI(Gra#w3YlnQaNb6`AFapKjw=3*a)IDcm6S z#}a+%Y`H*reP;-SMEHmM4=nwf{Nf;VVe}tOO*FW6o8u4z(h74&>0>~Dm14UCXnfgS zfBeJ+eu_1ol2eJUzIBkxV7obiQ(SVas#L1g=~ z8CjmPP*Hcd$h`0*&men4_F%_%S@!moxgmyq(k#_VbCs3q!cLyT3aP`^Zg!mH*CwN8 z*Dc+A8a8T~#3u2#G)WAUl4XvP7qp%ydESaPr{fXBHQ^;!yr;E`4*X9!>H~*fT{ch@ z5cfvcO8aicSME%s@CmP-YLD(n^sxA?K97?Ji43Rd4Q18@ckMRq2=jC2KKC7#xygipWIqiYB5E(b4wV>{lsY`q}o?7+h~~SuVeKs$Tv)te7vzcjWMd zF{)VBP_yu}$0uu~W;u$(HwzUM7A;q=OOF;D#D;jI&s#hYpF8e&EMu#5!W%aUQ%SiC z`vOf`cgRXax}h^}u&c}ZNT4HKZ;V2U;3=tc6-#T%>7q`@MBzdW`xUmLYZUo6rt+@K zJf)M&#KGG;11i6uUWtNdCOlcC#y&H=WHLFA zM;nAW_mO_@OM^kXro&sV_N|d@;t4)6oaQpzw#)kdQTtoM+(dOo575cUo0B$IFVCgi zGWt?t3Tem2x$=5=?J}os$FZEZsnRjyW>3$<-m2$@mN6atIk!wrO~p%H6yvY>MOD4^ zAI>{NYYn4M?YOIlOawZNdJ~0Bx$IYpNOGTvR@koI1G3M)C@d%_5>*n@v9}0Jd|N1O zHhf(3;c??ufo_LG^@L&}Kg43b?K51#3zN_#6idh@ZIrvnlp?qGEK<@{C_9PTO{@D0 za__d6?u}(Y4`4EZMfYXF^?X&6l?lXJ6}GOD{>1$8qp)l>rka|Xh0lGd=i&a$wydjK z&AxYVUTRgZPrANTcb#P%PrAfDm~}RBxTZ6(7e=oLE!zsQQufMjKRLmsl}r1wXXRX* z1{X4>66ayiaAxZ}S(~V|m2%aU`{EmU?sx0v8)qj2|5qC8!jNWE&_vj^WFh2mG!0>8 zc~kEaC2O)j=dm4qi&Glt)~$|PuDnL5L-KEY-F(9n*`uDK=W;m8Rj}PRWL*)H^W8l^ z!DGGuMzu6Urq<%2rLQxRcP80;nBH1=+&MbTQvT2jy*_U;3kE;g(@Qc?9(8P1M)Kx{ zyudDP{g@|Gt(_|r(2|J>#h>&#kmbt}8V|>%;E1TdgMkJMvcQ@foE_KHbYd|KM;_W^-)u?33GvjYS6gV3#qVeuN9I5?jZO18i4 zw46LGwvNENh=7`m0x|w~A@he&%TIlU6fU-$9QhEx$T&5UOjpS*>1S~XjN^5*@z&xy znqvjkdX@2m`VR+5E~gbYnw8NgtB!1T%Fu*jq-QjMLy7+xuaZjg2oGz{#>71 zyAg(LirI7ON5CFfR~KJlbUMS}rUl=RVX+!A<9$T-<&zVSb;91G!m6J!s@i5xb>^+Q z?&pwk&8->nbt;~d1oh2k$xPx3Q@~^@7RE${h3i_!lj5tMS5y1`x{LU$qPHud+RF#@ z+Pz5u)~?kK)|79xzx3tPz1EtnIpuzx=v>Lpj(jCtbP#@~Jwll-lN_8Z&KJurfXjUL z0;b_yTxqqwT`;VtmRFNI;GDX_Uu?ZT0=<5qRJBA%yD=Aub^|N8Bg(bcvgYJXMJV(6 z2PSVXwLpdJ$14S{VQnnNBf{XV65g4+9O>kmk4cFDikR$57CHNYSk~<`p3$2(Fx=3m zUp~dB3ru`T(md%kdUiDgxzJ@m_7#kQym5p_Gs0xYW$naTpJRh&e1C2BxsF9HO^3^B zov-bPLa+iG2|IiZV-WccGmMtev|6cNx5b(wFkvIFxPq}Zw=|3N$mty%ri|1)IN3Ot z%{n0E47qiZME>CuY|EP$qJXFP ze+2x@4?y-C4f7foHN8R(iwEPHVhhl~yK7sY9+^%E0w313do0VIzTAQBnZ-go?dl+t zRJW-zJvX;dZ04k(qQ=`E2~;eS*UPt8k^DDnVwhcAo_FxU8%%4@$*Ua?`a1SjsIE)h zWz|i{dPRJmxI-&T4fyKL_QgK{w@f;*xpkzNaQ6_uFSQL@iYNAUPA00YQq}OLG4bJ- z{k~*NVG6hSkXsGY>jtH}_?HIB?}GfqT@p?S0`{ypx<(WXTxe>a-U{2=W$moZkMmGm z@f=mIkg8nE#ZK{2o0z>r;8%S>j|R*D<9H0G$C$n26hc+>m@BZpc|@inrUJ7=pVZ~h z{Z^VR#nYP}V7?b#L+*3vr#LBSFmY--*%im&oUX7S5a~ON82VIDGfCcs^*x zel0a}Z$s9$r5;<+>ZS*}cAgRN)9Afn5HxhoT8*E+>}onVIWf2Lro*^GbZ8MV)%7^M ztW~<3&rk%0Ogk@ePQ=w}D4Y_wGHL8*(uRr8m&UCWY}~+rJbu8vewoui;r>0++!NV_ z6FUhh%#}4}$qd|5W!=pl@$FhEo8^-CXIL%XYL~6bgqp9ZSgV}lk%V;awGFk4ip?L$ zD$a+sj_!4%%71DdQp||#%eu@N$$Rw0>AQtfnLk%u#%taZ4WH&DAM@P&3(3Ociz0Hu z8h`*!=0?UdmK#Kz_iN886iZHuBpVu;M;HbRbS&*1U-P$y(w+%V02a02W6a3qhjebU z#W05v-_l%($X!4$nJ_a8a^-S`qug#lJPhN92c(@VTDir@t!s!nLx8Upc>6+hBbP7%N&E zy`0DADz3{9->@W)7!^?cPq9(S3?m}YCK8X z_#P8B&!ooPcCNl258Y=5M>LYnlnP{%KwZa6d-%X-EwwzW68fy%^^txCgNDmwvqQ5K zue_u;O@I1MmbK-3W=9sc*}z)``MdD>0+-Vi!Ism}!k@5cEY%$H7{KN!uz0Fb(HT*gQOWafZZ9I_?158*SI zKm*n4>^CLq8vZN{=vD*!GcTs?t1M-p*_u}&Q<0WS5<7rcZ?B7buZV<4ak8<~~WsXKMQ|e4Mn;!Hdad ze&`0p*0eMR>Oi=#Z{D3^wJKajzxSryIygcFyD<(zpF=5W-2_mK876F=g%fDfaA<9; zutiswp-&zD%S%IJ zO-)@caMwIjBbr14T3f@ zW&j|wcksY|)kkA53*`A)y4knlDd~9T`{cc?D-C3w4ITq;#47qGDa*jQS96kOHA}_# zwgvE=mW@3fIMEepO+6h$SsG-;;Pc`7{3q$DU|Tqxm9<|#MAT9*?Hj2OPmaf zZnhV&wJjo``={*4;77$-tGuktu{XmS?HX2X8s52iA3s;iH|vbsiv-6cHeDzO*&R|f~mxD?Q1kG)m(Rbguw)g zzL=b8fWB}%fX#`tNb_!{GOmW;m`pQaz&-r^{K94dodc=&jn)j(!N}&+rs`t@+vSmY z9XKt1!Nx}<|D~n7_Bk%teXPLIwp!~}AaO3Lnrp=-{rrXdU=1_;>=bR;+!Sk#hPh_w z86+_wAxSe4&uX|f@PR`VEZ}1EW1aIY=&>27xRIMaa+RZlv@w6%UVH?G@Y!Vb-@QZHFiYpw$PI>* z8Oa~A%?0nCSwT$njjwoKho67HnMr=!r)er~v$?i?_CdPBg!tXmTW_HLFa0cF(8hHfD$yxqO}(w?W4Be}R2y3=v)zo% zQZIbbt-H}t;k&gh!CVuo>xhSz6eBU^NXC7O*oQ03) zi*jF60-qGVzT-iZ^KBewMKoRCjTvSxzdTgM(Ig#j?K7$7y+HHvj8EvQFGmA&_uEn~ zFIw9_pRz<0pwwP;ii=(1>{P8FXY_FCuhf5)UAC)#oc4$~UmCXFNVXR64TL@2xd&}c zr(26Gm9CQMaxAr{au91xHIMubl} z_mqUNXzHIR;p}dSofcec>b?-f*9im^+<{v_CHkO>V16ER9NYBmdlZg;ja8Tu8R;B>k41j(CE z!2*J!r%0m^<1W*sOBo{mYr{ItopILA9V?quQn5UPm8GXsUeeA~4?PGnlDX`vD)CX5GCib*1Wf4 z3@RLw&Qz%3er#A>d40uLitaW1kp-6)kG*%cTC>`N$2V!EhlDf2=Ty(p(-}{# z64z+xM;g>MNYZ2Y!g-H2T{-?kd5tshT$?ML7X?v5(z2Vhyyj=mPfEVIRb1Ead=8vF)WYdO^^qCBq1`92C`THvJuI|;)ps3KQ$lO4B@^A zl;U@dI|w9(Vi=Ntl6wt^e*w0nmL%)a!wE;*4~?V;q@Y^4S$*J+2!EQ{4Thdvy6heK zSX%Rz^YK1x&*^Bpt)CV<*=jjhx0Vh;_csYcYng7`;zxH~PR7%oQZbFxl0mE_8j4?- z^(sf?YTC1PJ;OF{QkU0#x*FzSSn)GnkYCkAC8;{nCDn(Ogmvs1!g8R{n2Oec%v%-C z3yX0gUg!ZU76y#{doN+njoU1G8n|X=XA@V$A+=}R_rT1Mo&n#x;jhi}Tn_}1n$!DS zp-^VqzDk4Mr1&a$=WF&x zsc|NS6 zG1i?HDtd2zJ%3R8X#OO+`_48l3!8+r}vhcK36g zSidVrv4ej%KiCjmCpX+S?h{2#!Q%Xk-NOKDKJ$5-svRWSL ziw1ao+W|HJr{TGe{Lh0%ER$*by zq`74A@tOsCn|#WZHXb^PEN{D!^pBpg7RCl)#9o~$(>pn=vG*C&9r}cxXO|*mjX>{3 zAHlQM#t9i#T=FJ>B9)sQu_n~+PcvW0^Cun^O{O7%0LtICjq%#HfT+^QY5et(;&6`1 zC1d|;fORqF-wy_YyTXps-IJ}NM=M(qI#zBeyuZnxCh(TQ{Q(xAlIjBCK@vpKNyH7k zQ@^hyq&&6)V#p(_CU*D04jnT zG#LrHuy)fc+H;{kus4)*Cv3w`5Bjf1y}Zo7MnHynYJ8b}aE+JV-O{7OIyQ5TW{(ah zcBd>2&q@6zFbpv3^OElh!!0QBt$aqDvZV(0zy&25Q&) zo~pqxzHuE^*0jRfN9nJ|QaTV?l=B}sv=>J+_DSxyG7{bi-Sb5X_7FO30tMmGEQk`g zO0`7EL|-k@(2@gyKpHfYV)wi=chyhb$)pS>|3s*yfh*I!eix z{3nXjxMyc!*uDY&{^3Cs%`Jn*k8ke|b8w=!i0C5;19VeWcR@CO;1_>$gwZz~%-XLk zPOn6tdU;v?emy988Y2q!NDUz3OnTdMk6kUj_;9DIv3GR8e>-)zp0Pq=Pdr8eEGe`ACB5yk8)J~B6>2RpPJ z%CXxXJ)x{UoAy4KSH+3bPp2G#Xm|iMj5{-W@29k&Tnn?y%ESLM4YGfJ3jwV~q-RC3 zkzaVydt3SFX*2Z#4+ee5*0v%cdc>! zag7f%9)f`i3c2buJATCg1R3>O_4L>}836fYQY0Ekvt7T}dlzWV1~_yskitHcmKq~H zefKSkfDcp?A|9K@n;>i^!ggk=H-AIz;($bPn6_c#kV5cTiO{f5j#t%>Rx-=CM>k!E z7=oEK)YH`}!*|zrGVT)!s~9l!I{=FC&~i(>Na{iO%X(6vNCshFD|izjuq7O#oQg96fVUh(T~>!!%qaNgRu+8q4vM5%C@a{HRDm;}kOH zTfX|eNWScuEd?h<{%ao%0jAbyNnxFXTcd{AxY+<2WaXUW+wW5K_MNkm_uI9|A-Sr; zk@wFjKffNx>$?iI+c|G!5yROFGxZ)QUa?lqVzcw(Q?!;Sgb!G8zCF;u(^)vCu=xHJ zC+h5^WbL$_euE5Ja(*i$CC?zme#rcK-z1l{(zDb64C?Wj^MmJjN7+v zkpm`pT$~5ry9Ka5K@@vkuefYZ@Jb_JUYP`mAZpHGldPVJ?IEcDDx>^=hFx0IO-8p_JP#2WxkRD!U4S zVer9o@R{u}dW)VzBO%pFCak-QAoAv)C1QE}cC*XUUl~7E*$Z3fblrQtGk+6Db<1>&Ni85eFSB&lHl8~GU=?Xr zADv;~mTrD+&F@~d*lRMTjpXn)mzoRCQqSS%{|N;1c1uI@r-9=1o8b95uAa=NczyPU(3g@sld>*VM#c`E)k>;~tm(rRM_N z1JDTGW2e4=3e6K#97L3X7YnL19tA`{9l|68H{hN8hu8kfGyfa>lO^p(LgxFwv|o@t z2k({i!B6z>JD_BN2qsap9WNU29>4ay(B4Kg4y0rq%61WtvOS>-Yl};;{_J_NF7N*{ z%__g_<3Afz#;&(nT)@iz#_4kNMr;Brs2u;VbO|Gb=kvda=!LiffY(S9;qqOV_-`-P zug8{$A#md|r$V-R>a|EV<2gO|**%RDemINRhO zigez#EZnmqa&;=N;mbuY0mhYHd8Fos=aa3W>3!dtX&~2KO+WPKsP(-!TOA}uGw=MUt5%8+Z)d>w3B%+(;sxrt-ATw*`oR6<_0w8p9@kT6P@0r+g1Eq%TmCP(keN z+s{VhB?9j}uvV~l4st0$luT83s5e|dE?06q!l*N{rFJof($7KGkn#G(Op6Vj=s5jN5_7`Qe2j^`7LoyZrkbg~Pb z5w!DdVOvWzYk0teQTM!%F*h(#b1~U91TQIC|Ju4q_BZ+mSd*9#QqPU*&qV4C1R1^*LJOvACbD1ct*S%mYi zHs(S;ZD9X~Oz9u;IgihYK9xqoDRLqn8obQwP#K-cEsW|HGGI6eJmN7+!j$T9cS;JycoKC=_;k@>&bpxQG#Z&3n%V(HdO9+@25j z>rFJdyez+I@9Y9v%RczlPzeikt!}y4?|js#IZ5dl%zmu>y?eU1MvWf7yEgY<7j6T= z`sEy+<@v+_(GiV6tSy6ZTYgAzcHyImMM*^wJ4^RC81>z`%qwCwHxN?Q#!J z6K7~@d`DjHJ7C<(l@ZmIh%?%tXGA|Q0W*$6H1+En_<)4FThVuGw&gDG4{<)Y!V+26 za3-Z&B)j1B_aCyw?9#j#t|VkJ8dxC@?<;K}t2hp71P*(jvPNnZ6H!AM7|)vcp}N>!E-}c+-Pv(SO zUz&tfy)I-o4P-7g3MH{76v=hyTHXK6d1-&`_Zxy9E|{|BcBqt2&rI^|!-?1WgGE7w znk4$?r6^{0SKOcf{dN0Q!+_m!4SJH|*c6W2Oh`aL&8V?*AL!Dca!cLFN(qpe6Cw`BS|km`w7L8b3i!{xN!`7`6l9_v!h6UN^tJF9}%2HX2JY%wq5h%73-Vrnqty_ z?tcGMt2ze;aCC%$gHhy^o`~?tz~CjD9sMCD*w0gqW_F1Glt{lk*&E6K>obmEf`p)O zlN*;GM|)b_YzhijeD8b#`H_EyAm1l{p+S@73w!PZ5&P-pk%XxMdc6o1>x$jAp63pG zPTvyY1sY?r$V8AF!M5zB(S;3kymrQk;R3ODd6;bXLT=^9H_-Q2W~?Yy;$^y2#-8V9 zh+Ow(CB`Z>sK&LI%@LkpQQ4kvrQ$0uh}!c+X@;{1aAgGy(1kW$pUK;hDl6-mv2$jV zi=b11E`;=fOZW2SWWR4XX>9pW^={6nZZtKCEqPtt`COpWaql_$Jo^f5<%@-9v`l4u zkivMycDU^Lr*A$B9Gjxel~&cUvs@ecn6*}tZ%iiH@aSK0=4yA$=nP`tQB_Sn%>Ni8 z{^s=B{#$m{Y8!zB6TzsxOGi$WdN)i9WAg%AYHmMm8D*aeB*_@&empEts$V|F#Yzq5Pkk2Y;CwO0;~*d z(d4w0b6RyExW%bC#L7^+pYdavOCM2CGe_#&euw5DHty|F#e1jeWlRqr+ESiuTkix~ zEVNLgY^QfYQcFVP!~uMm3(w{oPaZ?lYwxRFd73wLcic{HiQ4Pj@>Vj0p>U3C&uPI@#+L|-*KqK2|@0Zm~ z+J{Sa*nZrB))!`Bz`oXCsP67Cte(V*S2ge1B6k%qZ7Acp#@)7DR2~cqTy^XnaMk+G z5cMI3eqZp|F5G%cZE9vymM3#(wV}}H9!D(HWHHBp0P(e9xs%fwW# zx)0rxkKN14l~0Fy_ism0+-Bswz9V9#(0~ld5gIvJs`+pWH^JquQEmB|d)n#JVH|B# z_KIfPP;ljYuJdyYx|XS`tywc@IE?cJj!7^H$KK`r5Iv?y@06T#fp6%a_jVOH9ai3L z*>0R!)2SqgI6M~IvFr3yXKzs2_`DbV4MR+UVv3U2WJP!l@P!|+Hav4uLmfM@)Qfki zbDHiwB^_VnXs|;ka7SG>mqkWS&3?vcfgeweb*BSDf+bHX+tT`AXGrez^JQ=JD8#+2 z_k+{UTZ)ZVl+;kolu*wuZ^q+MP_nGJ)JdApl9&;j?O+kjoo~vVVnz5UAj_;2Ci7`6 zn^)SemP8k$7r&fTUa6$#H8D3gw^*|(vwu5W;2`>O29U2f&_^FWR^507hFjJar#rK6 z_j8T#Lo@X5M(HU_t#hKRQtv6Vqli~JqjwdU(6HgnDGw%@8M^B!ms&*nY%v(hlvURi zW{ryOz2kv8G==FYca>$x+lTM@GIkZjn#*SbF~?Vl)#06OE6mbU9mqgj6^^(H@gIuC zbl|G|dF4UY90Pf9l@=6n72@leuModA^y4bT*E19lSCt^XE}xC~EhEHL^#8+6e)A~* z*PEz}0vKTorOvbFQ0%TL^F&x_JT|Ox-N~-}+C9 zx(U7~lun#dl(@tvZMmBubo+U?phUyf4<79Yc;l?&eQNT~u#thvl$CLLc($73=E_Q} zYrWNaF>J&z`=HcDJ~v|7LC>ft+_RBps~aos%j}GgIz?RdBF57Je!fG@aY~rQ#5K+a zPt-juMw=iziZu%64@IP}iugERi7!v-^2d$UH*2c(F)6rU55Ay2wRgb|pU9KP@;TJ%7@FVI$MBxZ3(vL_{Y0^6!6+xsaNN-9&1VRT9LWl~A zlz@N`q^c;=As{7`&})E*^bUp|AhZxdeOFF-X6Bt|u6M2(|NFkbU?nSiuYIq3-TilO zEqwH|OIfB4%UZSF?+m{ihbtY?Y!jHgpwHonA0{5-0x9O4SJe;kg5T?Y-xJI|`bjLY z5VcH~*PuO!dvYSKkR3J@{D50_PW-H5@Zv{y#D{Ok&FN9AY$v&Y^XcZ_VLQ2GU-_M6sL3_|S0_|MMf3;az)drx z#O=hLS$z7QRYOgnv$vM)bwB2Fg0=ts`#&$%RrRJiSF6_u+}R54<9!A;6q&#xXDgnR zkekj39%ko-)$>p@k|6*7=RO-MWzgMW*_6o86iQP}tUq&zI!usvnDOSg~ zxN{6FP929ivrV?w!(QI7J4yb;se0vBPt7ycG^0y8`Q2~6@_pBGum4hZg0sxEdjOS?84m0!PK0h4MHTR89jR%{q;`kJzvMySy@&MKrH8a`G^wmv3Vr2wh_vhv4rK_CNWN>r`gyX?B*iWPLPHou><`UA!lTjIVqN_JVP_E z@<8}GOSM}YyCw~zd?EcDoMeq$WPv!ZXB&y}hpil`?e;$y^cq_viP!;IRRhFfyF~ns z^^?GQObync@q3^3lMmK5OZJ>Lbc^x_WJq;^43=#>atJ58&QXfg?E|NJRjKU7+AYGa zp=I@fHO{*9rQ3+%8bt~=be00`pa6j&kuTv|=K`%Vkq$fr2XgCWTKS7=XorgPXe@f7 zW)Rmr8ooA>_QMkX1xY%N?Xd0_4rXqUh4%k=R}Ix89bbV5tD#&x8hpI39t1uTPx_IH z9EwGwkRC`6MpsA3#JBDJ@M@^08y&ZdtvII_o`YgHni`%a@w#&VM~zw&X2+Uyf-&G- zb*{+?-d8SzxlLec$>Tt1l$MVus+>cp6{B=L@XbqYU?t_v<;Q(X&~A_S4w|e>dniXL zxnV;Iu>Nu(!j|QdJz=GKo22iNj~!^H(Ahi^C!VVhdB`d2yw+hY`-MUWq~c1co_^B= ze#zc&v{(Wr`Pai+xh!#V)F9BP9}d3iG*>Q0buLr`p%`A7*Yj`mOpU09MmR@UxSMe9zG^0col%1G7LJH6Rzs7L z8CyO^B6y)C4vUU-kq}m^3QaSi$rCZ!!IlRpwJPS-%hDyz&~vg|Zt@JgR+isAgQ<>X zxz4cfHuuv!_ur3K8F>c#=TJk-oD50Nj{ZwG{D15=Kd^pwjEjBZq?zF4<2%{i9_y!3 z<&x}n!*i|=iZav-B1F2h3OnR7oL-!AX= zwt|Fgw0M==zd+_tajoW?x}I?s*_r)LP;n&`2+)b>>w7(JQFBw_rfI_It!{bt8hqs)*$fq8^g6ofp4plwd_(2S3#BJ|C?ciRo-707rk`PmQNR(VIUKk+pPTy7woYqZ6i@Fs}W z@cR70#(cVPJO;lgj+&YY5|dD0dwQu&X50)F3~}=BpJ7ReZ)?ybGAI~FoyHBzKn$*) z_vBW~_hNBxT=2ffmiDYcDCBXg! zrH}ZJi+(Fv1gj1#Lfp@G*P6nY82u53P7YjGM7gDJeaxESd*@|O&w4iCR0%)V!DV?~ z^W#P(6|>-fOG3qbQO&i0#y*Vf2IOVlCA>zp{@3rya(zKqYn0JO;w=a?`WFeI?@if| z?wQuw{j=c`s9yAi{g#3xbG97u^uULZZr|r&q6W*0a}$?*jPAhA4)-C-Pe9RhsMMj9a!0n)W`3{%9_T>&zs%h&ZhnLn~BCrhNMr8-1)$5zYaP zW~ZutM9vDCGF(n=?!)+TqUU!S(K0=QgeEMOrP;Qzv=FWSU^MgziPAQ3l}+`rV+cp1?r!DewVgn(se82pw9vO>i&j8;D_ZIkxlbzfn)bYjBPab>zhBu zUs*T5Pu39GQL(aenSfLvtRkPxcYTGq84^DglQ*)1h)-yT3M6UU zr#on&D6G#@YSFNTqf)GS)TgA+WE`!&W6~c@ZBDtCkBsOWHTmHqu~SUK{7GU9NY39R z9@k`m-1Cak6PO|?eB^Gd!8bRvEOewirZ}+Wx4&-6)~|MrHvQ4hm+yMS7QMuWUML9_ z{t|9f5H6;vvGT<<0`rMRp#z=s_(1qV ziIa#>l@O=6PYa-~aip-H|V7vkmw>ni6&mCBny4srFBGu6tS33~jHz$vHv(2N! zmBb^FpDbp~{U0gnuP^JA<%8alTx64tZ!X_M|8eH1UPHfwBi5{#G{Fp6F1A9ojuuF<|gad?>9!#{2i1QHv0#+IJ^bQl3B42T_ z{S`&Znh&JN$=g);>t&$`UCK8;V;1+vpWe=FALGhXqR5%8CQMjLA9Ta2yAGdM6`UC9 z;@!~>SVtbk^Dww(cSqZMCTibBpXJrxw@uUGQQ)X@%rjH?5#w<-opcW9v)p%!cIQj7 z`+c;#BNG0{rrSSFm49mKk93t3o*0^}ZrUD}FspRB_4SN{zhL3vw}(TO2)+w$U~3>9ee#V zsx1E^%w$5XR3&r!r`^4Z!=;^20;DKl=o|V@;ALud9vt$@H>fhyoj^cQ=UYy;FakE>iK_&$D)G*Z6)FoG_Ir(veLr z^luAPMWFM);Drkz`0EM*)0vx!4D<~0l33>$5Ma7fI5pdy@GRY$Et#Ap;}ms``l`T} zqWcD!ZjjY#h+ksnNUnAy1mHeXH|I+oUexN1lpBXN*}e(=G&%W;Wj*p+29MvHU_wHQ z8-bTB#Xps4=<#oL6#v`*M0}o)!I<0XLa(f~$?2(jbQ&=G-fN+RThYJZ=gMh$Wxv0j zo!WSVE;8a>rEYDvELeMj{@F8v2`6IQ${V?kdKqQipB*g-gHHJU_ImoMR;|aPmh+2a zTumRft0eBed7+)tEyn!k&qB4o%-&ls=rS&{se&6UpeL47#4YH1%b*ft{D59 zL7t1RN(?Sb2eu=$URLnG$TFU@+l}1!^nPTlr~EK3mxH@YMU2JWPG{7Sjwwz3($iDD z)^CyGof#G9+vFMr;u1CvF`O9&S$Bp6CbygNgRc9wXwyZ;>YIyxzR@i(Oy_ZAo2=89^f_n729uxX(mntD+ubK=IK<*YH4uI?3Y-J&>-IObFXjsH zHf(mYQ>jwBpXWVKCO>H}e;fAF5+Vo;(yB4QXzv0bsvp$lt08TCmg`7N_O?39Op$)W zJr8^zLHtNds2B)q3XNZ`aB%w(>$c4n9-F9NA(1v>hvm}!dQXWUo+YqyBG2z9zC^}U z@o!-!iG8BepKp%#rc+|#8$!$%E{&;O{ENLTFa7ZZp)Bql4zC}-dv@tI-#zU!Q|mX& zlUc-unv=Dqr&x8$Tas~whCb)|vbF2(UBQVzQR7TjgY`5|`eg*UKLSLAb^Q*~rkGUE}Kt}&jg8Vc}a@|})F1xNkfBOvYJkkl1IZcBqlwd_P$+E{e7 zF6@LhlAE8BBP$iI?dU0*d#~LqKr`wjyCYGx9nD&k~yjjF+z-^ig(!7&` ztXpg&1|G$yq{!~*Rfrky>W~z;AJ&`ZV$8{pM4AIOHqViz)d$RE#z z8@V-`^JWDF1%@{z=tI@}OEjuy@`*kQl5&u$+q?Wi5m@r5w;8j2pMyXC)-S$799X=C zmzG7Eqe!!&DP)ExTt=<>yoY^y!B@0;zFc#7Qns1HCilDW#k&Kwu=% zZFgX(uiy%J{pwW;#Mflms!liEc#pNDW|m_XVBx1XiCg6asyVcj>`A@ zO}3o^F7OPX&n?gkJEP!QUxdz@$nMO0iA)km)2V(+^k{#~_=A>BTPBPr4gS!Cs7}Yp0JgejTJnP6J4k~kifOU!6mLU5 z{(DVY89a{8fAHMzG@f(C;>{^qpKADp?&tPf_RxNn2;+yQV+(9Ub*xk7eE`EbJ!uQm zn9v$%a!OlJ`Ep73LO5^^#v_^%qEZ75&1`aTy2!DS_#C%wWpuW#jaxGZyTq(|O_Obh zkYG&jgm_GTQXlqV$|Ib;pXaVMJC{fs`_1@HC6hpN; zb1*bB{$?F|>uO)o(xB8COTQ}q$wBve(>Kr3?_aF|=?K_^hX=b4I=h619#>54%eDDU zJf@3G^dV4(6<2@ai#s1kFw#WhE;DyLnILRW9=yHsVXuxi;CG&#I%bQ=Vq5Q*d*3sP zr*DZL_)zmE{PRwoW|A$boEsN!welSs^Uk-Lic(#ln4#hiOWyBnDXEGfs3=5Fz9Vjf z^t5GUrtAG z;x-AgG-WBq7tqV9N)#R&26;UW zUPj5DQ)d|suAWT^#T86JPpWcizG>?d=yQ)mVyCFh>YOFLoGUTs+Z5`3rr7`A0h|A9 zCI4%K`+>(vWi&kM{^;B~KA>xdicg>8Z1EYWHo;Q%LprYOsqIT+Ho8Xa?4Fj7Z^fqV zMC=WvjTwozaPM{V?lUWpCTcD}_QZ)I_-wX+*fh&T^;-EgjZ81QA-sC1;s~nS^d*G1 zbB}^e`5{)k4Rp`un}hj$TwFh*e9-H9rDBf`uR;zUeI)?&@z)ffk9EGD5qzDQ#u%$v z?sr__V!%<~N!DB2H&Kv!l}dH4l_49$)GPF%@{yItxP&6^IKJoq{2>NcEb-fM3JxYM zIJr7k{Q;JUIF?Z7!OsxlHqV2c3t|oUiDmDmZ|Mwsq>A7zf$W@CVw`%WW3d+$b!(@D zycXPS_-ZIHlYzND7rMwpa*ZnrrbcP|-qh)(+1o zOyF3Rwz%GgwmB;JG?=qntG>m3qp?p3;TV^gu)2zPaMDecBO&%%vLC>5%mS^{3~Q^v(2Z&!oENak9GfN{?yLk3J2=8m9hh&iLt&CUiPIFEK{I0r%HXlk;Cifanr{c%0(olNfowRV9 zx6xDm8$4WGZ*P3~)zZQPL*G8*SjCI@_fsDNH68CEhpUL1nBxURvw85=w4$R=u zDV0y!1W;93S-Pf!o+}FLEr>m}h957K)nHG}pRA}}CiX|PRrCpazB>vW4A4pXS%bqs z=I0>!_<#nK^IXs|F6^xmj*g0@)VZrh@2=q6SKuK*UVZ|TgJ{SX<<-0zR0uCMdYjO~ zv+HQsEV398DMQwe~gPbkoV@p_xGpHTG25bW=y_*G0o{Z zX7Vv%;R}jbehHe>-VX@k$M073eUpwAbUh}|D!BDDPVxqo*s3;pIJS*w=q4N3R?`+vPKa#rBxd( zkrVd}(&f;-8uhC2SLB=>_P`WKzL*9pFA?St=O10=Hs?^!(j_h8%_vo{3A=AD{S5K} zMaVo~xWP*0pFp1Am+XQbusN{*Lyqld_mmdsNXjhs!_QARB)^lj2rS^A9XDOsOAFOMSmmIK`;Do(YGOxPrl%kJ?Q@F7 zUeb&_w&B-ZP;=K6Gc&t0dS3E~CdBrQp}xwkgH`4U@dL~4r+8SPzL;MF;$%4EdeyQ+ zr6ph7$K=5Fr(%TIXO|%Tkt{$LOsqDP>D1oKakp`1xD>z=I-F&`ei~t!f8RdeAo`uB z*%Oi)SFgi65HlVtCqv3`jq0Kp&1=7h*of6EA+PgAG9~$r=B7S_ET3feWPkNb*sUw) z7)yvL&UFrx?oq>rq8Bv{>6mOJqJ|QnfUjk4{KT-h_N~daFHf}V;5_>g$t<#8J)LxF z(QDJE*YkZX&q$A8_Z_K=0|$D0UfbInYKMkHRgQ+HXH%XLQb<)dUWK3rhz&uk%`G!C z;x*SqN&^DtDg#Y;;G06%$BxgX3CT?a7~-BBOydz)D=|dR$RgQfughWv=#k>8gBYAW zenq8@T8uw9N8L`__o(i?!9~+r9Y%B09XP<0@gx4@QhoK{5np}4i!{|YR`j+uGi!XZ%V(-Kt$ONZqp3S zQ$78}gYR#9x&)TVjZg*OTwBPBjt=(eIWY55kfFz- z>MnTc1~7B%&u}Ell;#iEt0?4Hm*IVJLj?*ISZ{~x1yfoz(K+Q^lgD^d$zQmVQVA3P!tSou~5 zkapExFOyKRZZVv$d(VP(5BvWkxx>f3KT9XLG2)IIXh@Wi^Y9(zYX8oq84aU zT~n#H=Al5$m70lET6wE~*rY<?p{? zo&}+oUksEr=YY>~HaSlW2@DwR%&B}&t=~A*m?jb)H&EEIc&bC1I$wFnUbIck`*Ggg zV_YjJaA3tyQo6O#x7LxvI=8I1iWsLGcq=Z7WCSv?x+fPtd3h@Sj)Aw9e367^1xs`h~V z<5nRpvb9H@1G;FlBNwWA38dw_7l1->idobF%Jjuqu7^L6R6DMRe83{SYD6<`9uIj< z-o8dEmTR&PN8jA7YfyWeQ{WdhnV+7*wq4AcasMVw+D7!g#Mmp;wN`V(qZq@k>g-$F2yc zDmff3DWxQwq^EWT=Sqa1EW73z3h|Dq_oNH z$vE85-ap{*?fhdk`x^GjPN0ZC)(F$cb819n(1_l@vSC?y&naYuc{$+L~)Ge z*3!6PT9l9b%sIE%vYP!)<6_Ijv_Y)qtYzv;DSeAH?L(TQCqt{+6g}~3TE2V53NAjDuhHb^hH?8x~bw86-%+e6zqI` zszT@Htu#>YJGrW*%fXVg&BdvDyk+n3dJ1Ht)5#{_qWme2Us~$eeN&Hd9ig}RY3|c4R}>YoszzeU*pv=nR;^G9-Tddg9O(Ca~= zZW`!68UgvP*dwGGk~Zj7o&7#bul9`Ze#k)!a@_!REqx5w(K}Xto84*0`q+{YsiOfK zy3rYkbs@x6P}{vh-tZk=lc4(6Y~_$WpRPu$RTyFSWW z)f)Z6DW)JH6H+QD62J4->wikD|DlST`gQvx^_`0rSOh%Bol?dm7hUg)pG+8 zi%LEu5jXCOO~FWs_U7E%V0VxJLFTb+yyjc$GxCCk38cCvWeP<2+fcVbn9r4_??a2CUBZjUdm)uS{@|=>2W8SW752UI;gzO}x3*dpk>Ob?#IFg)&W>F^ zSH^R4qEK9X-q!B)(NjDn$c&T=w)>WTq&|C zvC^nUnxyw}QRsP70Js@OsG2_BAXocJ{3l|0!f>%(xMNBDtR?C@xDrTsxb}&6R>o%j z+Nv@6)PG;(vnk3zWN5T)e~6LTn@03h?hJz!su_=%)8}B-K0Y{qV)IMw+UAbgAGcrk zv)9qZw{CIo+C#lDQ2B>GszI67h(pTZ?>u`Uq^#nSA0X(lH(Zb+nk1JZP!LFVYiD;z zw$4d7++j<@n7G#L6LjZ>&v~yijjd$ojEf#_;?yz6J0*5ub!#23V!N)Cx`Bz8=`CqgJuAB=m`NYYi3#9v(7fgF5^mB{O_9n`&EcNTp zvK6G| zw;hW?IR%Js8{F!kemzt25#cF!i%{TC7dd1$1arUodU{EhGidIUjdj4dFdxeD$%26A z)XO=|u3c8u^ho_rYe6B1!J@#H$P`b4E^lP-%TOi0bKI#XXlDB(^*g!@@+YsCo=!7K zzcv}U-@rY<;<{bH4Wd5-3Ufy$&M^N(YyFmJq3>bvlA5<^e^kNSKFFnT#dw0xI=xV2 z>q<4geb`9YE@0Wz^%PBKm*xN^KNO_BGs#;L%z5A}dPM!ri-vRXAIQSMd~@x_dwIs6 zEwfsepdceI&q5345QcqiL{T)YzO2udVWm9Hj2YycO`=*SA86fa`iPUf zpDECB`BZDbBGP>53{!{FFGXFLRO9rzDv2SD`H81uEXRa?n(97s?EK4GC`Lrzb%HZM zbw9$enXM`Lon3J)>j>pG#xj}~PpmV@!bmo-0ETYdw6c$TmLC5CQY$dMIwY3}qAQJ@ z2bO&TKQ5cJzvKURJbXs*`_nbQg86NZiB+7NRqntQ;BrE%D8COw_DKZ}8y*3N9QgnAx+Xea`EoXf)r zvP3za$S_d{iJd>@I-`W8++u~7XkyZe?@UbWa6l0OtDM|X-PsQzbdewGV$OyOpq@5-9(Wx0tRao(GH|3$0Y`xxqL!M2kxgap zD&IiPEe^Qa z9c6%iBTNf<&vr^43Bhrl;g5fOr*Uyh>SnrB#dE8eBLShfHF7QuYj&~A|c>(K|{xs;WB^|)LqP=`L`-uZ&Y?^RC zud4fj)=93!as)(9B0n&@1)NgONSTns2}g zrrQGf>U2S?_TE(tKi5&QmRI;9iAkNv>NXi*4T?q@9d}V-PyAi|?_L182(*flf)%e5 zb^SU!r`dRNZo2hIcn~#LSoBqPdG4KECcS>=06OrVRpVaV{*yw7Lv{CpR~zOvt{vR6 zVmC~SSMl^r+)OM(!BS>r{x2&F!XBcVymoz@y5)NeSwp_qJNajf&)uOQZK*|d{tDFV zfoL5}gaPa6f`aI&i|jrH1$#WkBFjXaSaf%wFK=)Z;JsXH1(x%>D}EHL1JP?esd7!` zfZUfBwZ8(#IlN@#B{*x0y^k~_nhmxSDkPO_7Z2oqogxI6Kp4wI7#zBHsFT4HxOie5tpM@;NJ|OgtId~T8Dscv zYF=W4W@P(RRyz3+L^vL|x~^Po_JlWl0>_h>kd5~lB-xv6&Jh882L4V`4M558Bnbc; z3(VF+FXnxZ&R@MiA18eQv69F)c2KC9nC;&8IH*pJ0rB<;4nBP|9*8+&R zGpA1vzyu|m?*e#@2~}~cDE=;m3}9ze8V+X{Cb>eX-orpS2DZUcW;d(>Q0)M#Z3u3T zwB7|Dm6nC>9-Q@!qg{%@#|94;MZ?Ba)(8>Cg~4q-kTo>q8VQsb6G)ZPC1CCICA5!V zN#%dsv4Y?uUI`;zRG3$dEv|=)k)~M(Om(dK019VzcK{S9{#t{uT2_rM4-7DJPo_B3 z04drhI&tt(nn8ZlLDiYcF#25WR1N4&yrg@> zsEm}QUoT|!w5!>N>{-JNf)n}vbW9}7!Y1pkOBk67oj~ISO60db?DpuhgOd3Vyu5)M zW82raP7_TknTKcJ^?roCyt&fQU%ADjeHPs>5W()t%S38vxrg$e%5vE1`%+pjASpjo zjo%^?&_cfbUuId4B~z2hw7b!gI(34|$*8oPG%q#PCrb*0Z>5_jjviRgw}c!vq&KUd zQDwlHqm(mwc~#9?dz2^xUuGwY_h2S!s@Z+ndz)EfSdyKmnTEhNUnF> z2{i*-1fJ%~mo?oCr@>pjtmv`|zbvKgySY+$l}m+GJ;v^!_VU$YC8^c9hwvNQrZbcx zf^dVajSARAH-$mmEClciugQckY$yN<*oZ)bBmURJMVP&KQj{o|Y)PB^Uk~90fKk!3 z$+Rn5{y9W0*^f;O?bcKRqJ7+94>F@{6zOkl6#0#6j*Q{8^knuf8SPa;W!snRi#?!y zjIbf&s|$EEO4n^Ln|`Y(?|zX2z=?5cjxoZ_L}PUQ0I$lv5%qs4K0+rDWC-A#ze9VD z!-iz9UC{^lHHN|2b%LKbQ7x8mINBjJ1~KotO-y-1<;>XDE%B)(*-*d>9+sz+L$djr4pwy*1cFfBfG@GT&?O`2v? zc9df4;z1(TcQjC2(}lnx0OAj6FD^aJ7MNU(zwU~Z1wXS1$Q3%GIm+T~S(X3{%PAK3 zQ!&rd2_>!r*VdD+p}1;=80K3*<>|UbTvPHh!dVpPFNWrybZ>JBh)D_z5LuZBjsvdR zTAUqVo06ph*XE>}H zYJlz<-k2*&QSj*rQ$sClbYcZ#F1%Aim2@jUKBF7ak%oIx+kcN06rW$pXhaU;1OZ|l_qgpcyPx*u=#z7_HglD#C7w!t$_`xUzT0I_pVC)LX)cCnYUyeoq;er z2ZgJ^hWf?Kk^#@XwEfDwRdg>_q>GCL8@k5O0u(tV>PI97;r{e8WB+^b<(Q!!Z%VWk zOlW$(18TT_dIADuI0(iDE}L7w0|{zTarHNTmt>E$w5{B%`)qLU>P%S2qqol>|4u^H zY>!Fa_LT&%!a{iEfuc&98C@jx$iB_xr9rPuRgeu_Je$S5J(bWKEUGja0x>W8q}s;Z z@<|Xnazu@*CtlF#xEfb%Siy4Bp1Y1kV(&Td$EiM^TO^w|(xb-B&r|78Q5W}8$IswU zI~;s>=NlDAWqb+cvLM&nT>fgHg@~-VdmEgL5W>FrS@U;xK49E>rwEf~z4!9Q#_KT@ zfPlL>Shc0$%x{eKft?(~n3=52{h>vG-k?13Fj=1~@=zQb03VKxn9)Y@cYT3|sq`XF zUj=+}S-`E~Pd))kNj<9)@J6LqalS20pP1mSOO?v>z+fcQU|lxciN=7_jH6TM0v@Ap zW(Id|vj+t~U`PZT#!$#2J>zhS<$=KCcKikY+B<`9!QP(ef9M7FmNpfXjsGfg-D|6e zHWTdMKZG9|f^k55G1l>&pIBl(MjP|6oFCnkA3cgG_3Fn zTle+e1KS7(-VQzU;a%){TtORTB=BmK%2v-m>^EkM?KVIOR!IRouId3!LHF+d{Z@e^ zA&l<+P8#ifPH)~qTwV2Eq2lcHegT!xQZr^lzJ*)$s=xxj&&8~~%8faI^Gffo644JE zw0?|OMB&7$)$=R2IC9K1$q(rweR4wVGo>%zLIr=i`|Fic<>F#6t&4jm6ZDqd`*XZU zkE(vqy0}e0#ckE2cFN`n@3CZH2dOQ@CW`Q0#mJU82Qf+R|CnPL@ZI&VSve5@z5X9z zVyn?pOOjUvn2Yx<;Wn|chLQu5@};(B18AW%iz4Aj9qzb0eJzHtT=)Fr2uKOMu|;g9 zkG-bLMM+k8kJ+Q6d{;I=#76dV&?IKk&Afaw$kE!yac=lvCrpY=DxOjy z>Q*n;s|@3f5Cx)Ve`!SMpGaYI?aI^K+NI;w-JYKt7d!CFza>0Ja{5UEhU$H)o((UzYGHCD@RBUavU=&UH<^PVcUuQd)pL?ZOfL2n3T zrGseo7C3w(BcFzF#$$LK&+ME%!M!pcBF;&%{&uh%d%VlKpCv3O%GW`h(_sJ(P}tI> zVuyk4>cGT9Zo)6 zOGB-vDRJ1y3Fc^oTxzWz#BCYTMTUlI`4wm%OtQK+s(?6RlA3o=1QOXSWAUbga)n&MZx3JX{^}1> z83%VJn)lDQ!lNFyGE50O4g8{6GQmgHpbAVT@V*xMiQ$*yY^#Ucs|QC}J>Bc~k1np9 z*&{3f#3f?V53@@@LEm)PfKe`DT@8Jok>N12+WS@8*i*VSZ4zdqA}iuN5TSKtix<)5 z%9H26m~@Ow>B-XDoP58i?YYxJDVI&Gsm6XoFWGuyq1)43%mGBDA|K*d5oAtmsBns( z+B?QuFi>{V^|WaHL424C?s6V*B)UGg>A?oR%!s>q~uyD&?5s-tOK~Zmp?6x z{SP{qW1vP?VRPv%0AZQ8i)pEEuQDjy5o6G-Q(+Dk^3&s=loGgag*`^%nAKh7emW2b ze5UNU2C;6fEBDg;q*uVx9#Ta~Z$QfsRJir76J}-Dd05b8HI(Mkm;R>EINRxPTuXla z*+MCPiPgP4m~*9O@{k9F(AE%Jsp749yp`3$C!M(~7kjPL=^|Zc%9(y%67oIk^Q;AS z1xXcQO@~MJk1|Anz!Z3sSuuSk#Zs43bkY-5eoXNAmGg{}()VdV6v?81yC8(Rkilra z0+QT+TYE(_qjNa!vIztFwKmz({mr%aRSUUNNim+5K4hQu)k|tI!Ua#ms|f97eFbLo zL7(3~Yp_t=8q^O878`@6CSCyP73AZWz@6XR&VUOTqKccjIw zYQ4jD0(cJQnwMJ=6zG8t$|G1|K0uIuhgS( zrp>&#w#*St;Q=6f*f}{}jN(QVSlp*Iv|E1S@i@U%M#q>6Lg}R*AdMRBYe_AAaPjY> z8Rt9!FR=_9;tcYlH8=7kwz&Rr2B?$t8z!A-v;}%^E#*;K-C?7kk@;4i^Br}2(rr@IK z{7gFl7$tXf_I*t9qW9{{zHf;!$Zys0Gv4A(K6w>ne?2}hcyia+(?uSMetx44&i>}b z?m6W>1xgy?)TyWCFAA7WH3(j}ze|d8aye={r}UolC9>0D;$~h!yzV|g;gF1Mikhn>>D5jvOdagyQZwC&ax)e9gJ&4$I=#?t==&&fIy z&NBkQD+RkfJ#Am1jWh(U9GIqmHV43h-I{Cx3`X!|^W$V65e)>U`B6mPn2(vZ*?$M7 zk&8w8tC#?cwA-e`n9v^}7l;J_xd7;n(@Jz9at9kGAnE7xaR7aRkToPA%mEj&V#|SN zP?95iU*C#y0V^5UUs$j+m$fba6OKa=3hP_MWtQ2Z7duT^k3*!p6wjyESVE+l`&TM* zKj-dP1GL5;*qaN)2go>>NdMj@^4I?ey)mB9s7}oh(`=U8DPD=ajnLA|MCV~L^6=8< zWhl1?X;>zfcU6krMAL}1-ldpx0DY4m-ly6F)6;Zn{Mb?oRzf`3^p+ImM4Ne)fOSNy zu{Jr8?RzcIrsPMtp)Vvj8~_~LCLhfXarU+9H!y~agNzvHywhVE;ZxY$u5#Wva7W{{ zFem&oQoyrX!g}<6r(%v`*BH`Bq^my*FWkRu?SL+f+OcQI@H+y9FRr z#6OWr(H!V`Kvr{dg_=r=4o(9KnhW?#ormnHqs`&$WMdKIYIf(34HJZSIH0CGTW$I?>u zGVCwO(!f#d;Szx#P4lo3{=(-01V`rHH4Q>8z+2;FWFgSye4Kgv{{{aMwKZEk#`Vw^ zNmIyw2&2)fWuyK{qh2Jo&k|QO6QG15ZSiPgezo9Z-v*={Zr_ILWcZN@UO=u$wgJV{ z%JmcfC~-hoW>whmPrk9O`#ij=B|2IFYQ3rw-FiSY1Rc!&ys#KlyN2+F)Bm)*2`xh* zB1lsT;MIS6eq)^D{G77M{5A*Q9q1~rT?rB2-Z+>Vp|&iS!S7oa&LmH6`xMkzK3N() zXUSH|c=h}$BZ#3iApowh?jJ;BX53xJyJ4UCz-Izqe#Q%={|WYvucGBVSL;oz;3>*` ztx?lQNj27D*m;>FI}Rl33lJc3eV44v^;T2Uq&3c@%IJ^6X)1R2(Ac$Vq2b@eFfl|N zWb=H_0SCB1y!z5lOwhP1pWM7f7s;!6bHcs%ZhuzK z84Xyn@%NW+e;jC~A4kA({Wm~9SO1ThHJ72w4$YsJ^N$^ zfJv{qdO(~3jU8EYad66E-ssbwkf3Q!-_a-G(D8uy?P*TA{h7HJJK=cv2g|i}6S1d! zk>E;Rd`FM7C)D)J&RPzs{WAIvliksIx|eAVAJXUbV;FOzdMPT$D670D&hyrz_TnPa zOgomh5KWd?DUh$jYbi{Ly?kF~seI z;$x@By=95NH;@lfFMMN#W=0)*usQcaVs>N@qbi$U(%etOgmxj>*kIxiiP^-bDc-qe z0JSRPiJ!+z!{HxIL1zzx7N-s&Sy{qx?pV(j8)x{d-WfY|M&Q0F`Vo7$O#HnxT2l<5 z$jNcOBGCtV)WzLgG}MxlJ!j3_H~H(hliN`CR8sg*bIeYv_PLxh;ZKU1+bgZ{U;G~4 zZ+k6D!kF)C+J+{%S*9?LWXjFPZ1YI(NX?}iXJZn?;#*-aX@JWjm(;4O0swZY4a(|^ z+q|tJFdF^W@d6|wYo0~D575;RRWzD?;L&nwY0aRi^j9&Va2YbOB}@kBDRjh6FIq6H z$&@~)pb8SY>DFm7;efO!47Zvh2Pz1k$i^_7@#zW64%zr#iex;ezeaw zueRMCbz;1G3Q*zz*bQwiF{}KtEG~QgbRMqFR(F2~ZQCh%-dQAF)h9R97Jz*hh5za< zL@|R5(R#BGN>=0@tNX@_j2h(FKxZGa3hJuyrSr>n$T;8XRQ-+m%$PG4<6b2@QH?Be z6XlA$rT5%A1lCj@Z#r~o=H2&_uo8);oTRCE`w?Y7qdONsOQc5Pr$@01pcf1>Hz-wm zd_c&&ESUHf2EggI5UKpmVHFny8vXdOmEL*h#et}E&hcnd2s=3oqI(t~fB)3L#$ji!^6yEgltKGeJDZ>oEja#jSl{bgN@kE5tAe?ns%zPHjr~oQuv8Em87ZgKx#9Ms z_I?jwVLBZ2-0_+z5qtg$IFY=6M`%w)s_lK?d@)xTud5iF5TqyDNtln6(UMT6vbc6UavVQwYmusqLzBSsYRZrpFQ6di%-xjcY3d z2b$~_s+MX4;YWc&&DoI)<#1T2!sZLCuo2W z91`5!-CcqQcY+fL5_rg!&C1rlE$`BA!{c3yJ3w~H8eHPeWeO$T^%O585!;0qq+ z_6wBY($|0t*_rz|M-wB)H6(Kh+u^)RY`wmj^3+WY!v7A5%ZCg>BC@8$3TWe&%s<*j zqNuxka?O}`ud<$;d7Vu&Vs?ozbMX;>ZakmC@3BieQ=Y6hG@hV$YXlfd|8)Q)=WJXX z^Q1-(@SWR$_o9RSk1`<%b?t;qu@L>kVMM8VO!-KFLlNa409NC!IQ@SVDx@Of0Vo8S z|0N&pv!$AG%3)+|2Wzeyu;VJ7KBZ1SCyO=o_;>;3Qdmt?zZfGGv-M{>7gptr_gA;j&nSSH?Y&@Nc&=(Y;~mlW>)yw z3V>=x98L6re`{IJ|K#(^njM%10o7w3^zDSL+a=q{s=|0dW564Q?nb<55wF4G9|}?! zKG+{fMV7yCg)NqzMKR275PV(bBsteG>@2>j#F z=Kjx1A4R?}yNIqu%1WDFevQQ-{&3hhtDM43?U%j54vn@o1?Yh0Xu-|b{^d!-t6rr;I(E2S8CrBded+GzE;P59(5r2X1S}4c# z2oju&>L~0bUKez$t?MbXvGmJ}RHO;T^XJ-pn86D54!^n8w)FEEQsHwG;xpd!6py6{ zR}}6|{8g_H26rR55|az%eENxd)e4mzR;9t@KT>7(w0XQhs_Zj`?!>On^M%Kco>1e= zBp}e#7__vdIo)1#z2(gF`xjx9U5b%3HigvQ|3;AGAz|`BW3aXXL-M6q_!f^t!^_kt zK3jeUswb(eC34*3SvzeOqiGQrqtlh#FG|LoMoec-r!G|iskd;RA&4jA;(4vR^`s^h zgkh&vw4@qXgTj?8en?%&!=)~E=Wb>aKLOOhzokF2ixqGSLn(K3hxOB_0qwmV%ab_Q z66i_vLGgw7-PfFkx>kLZz_QMdrPHR`CqjW&_(L*eS?2`mR@)?MidzU5DKVqB1b~;O zO~hpdNOL?H)QOZ!>j?z(`UMl=jSL!kr4Z?oRXf(CsmDhamW8ODl^(XWL>v7l32SH1 z@}ZQ>Pu`H5MU}-Gfo7Pa#%k=2m7mcP{@5OAH%XaPXZsnhi(;{*(otX}#gkAmP8AAh z*fGV7X-t8&$0a(e*9cL*ECx6fvn2p1?n=@cO@$33LbK?H6it-fn9lMB3@c6zQ1=*y zCWG=W+5vqQw#|`FBRxQ=gYa{~HeBK(--zY13NAiE$8}mpkTv4ixs?@M31t}L!+X-3 z@_sTw$5_irPSd3IZndLMD#70J-xuI$uA6*$ON)>RzlIrxI7nW8y zRhC4B+x2l^3AUjuYg;kGu}Aa-L5?K}0Z7w(3%pTAGG9>LIdVfuTc}wK@F*O{N&q_S zu(TS@jp(Qa$PIQ*wMjU$rQBh5Yy(%YQFq)nWs}TZ4Ih`nuqxIm@T6z{1lRjk1kC_V zx0;e2mwJ=BPf`JA6V-}n<13t`JOTJVI&;FT<(-{U=;CeS^_%FQwv!Y9HKN*~FVv0( z-*;^O&{{cHZ(vK^Wm3`t)ORRt0Ja4XfT35{$>g`8hXQ;Vs3pG#E*q3U%bsZmQ3IUn zqcKyV5I2K)y}XB})vWTYadgWJkRbF6h06kIjhNNS_oZm0&N8v=l4hn%o>cVi`gBsx zPB5*S>n))rcx8H+2)BDTW|G7R>^q^6?$)Rm%y#*lyvy7-cWX7D=jU`y3!sk6s&I^u z=>%y@7eXa1c08WwHYo+k^J)b_)9CL(;x9U3p^PMz?xRchDDMk+C2sC-M zQ-Ce2R|P%srgBl3((lf>+LmtB9PS^h#`tEutD*Eng+4x+ZM^*?sJKd2 z6%bScB$ygZ6JGDuI=~f`a{e^T8f4XhT(G4c>67231EIPfp*lMhAU4@CUREQ}B@`Il ze2r>$5xG|~s_KB=kd%%cpaq0Y7&ZpYv%{1bz_t%K*tkz<%xJuxy{`8(p>ZW!E`-yS zXo6I?%&>22fB5M^XT$tW)yx)_-T5;j*buFd#Em}*$qKL~@%Bl$!NOFzK#A%s6PCRs zXaV-N+m3v;G#=Q%D4=m@Q?KXT1Z-KSc;p&EFmSSeYDoPbr)V@^`AvG)nJjtE$F>Pv zKcG<{a+YGJ-6d6aN#p$F)XlyoFuj=8c1)n9z;XUSYF&V8QD9w>8t0vFjdTCaau$R= z^|>+AB}UoOe1qgeh(sAl670{}BF+*-AWWCY+r_rFzUdrafsw+Va;{=K)Ni|+LvWdV zvss_d?#DIm=mGKj%-J`Q#Z|{4E~XE31_uR_(;n|g;4F{9zC<-2_Ag&;Prm*Vhm@^J z3v3xMaP*M)FKQZpzVPoP*k3+)C50M$wikT}n`J&(Y3e?%B841}D14jQwq`gG-)A~H zRXD%Lh!R{AK-7V2%zQnw-d$GiBNm_HRT~Q}Nf`d#152c4`Lj;SE6j)VZg(RGd#T22 z01)pQ!b$S6dt+naxMRIhQGd(lqDw<}IO4@Y=l8=^#)D4O)v|>83Og*j`!UW2aGk}K zBUyk&(%tw^p}OC))EDN9B3ZBrp~^H&D{}W7tct!J*Ap$3;G9Y8+B4h?UEk3vzTVL3_)s_OAmZJ9@;g&M^&#jXGus06ETxXXc>vgupe4v0Kee!Mb z>0%J1h76W)Yxk00mloY&l2h~{;+gJ;mV+3RF~rjNAt!xu0Bl&T;~T%~{j=1M9|`I) z@Dz^D^F7b=tFn`10}Oe+i$jebfFEiA)iOoFTV3|QZ8eH&lsu%DMIfe|l%G17)LWA_ z__SNMay@puq` zfJ+DfGWaC>KPH3YKQXEVoxDd5c-_oLx%#1c$9wk>qg#ZY=<+dU zuBS2?Gu10fTPeJ@75%Fs=jPpK3wbIgPJr&ZHPQ45u#d%+`SX7|?(QHkz2IQc@PzG->;%X^$K<{C5I&VJAAa2v2-D4qB$_@k}#UyQn}4VR;5 z^4-I-SIt(&&5xyHR!NQXevs=g*$-?3U4DOASO?6NGimqGaCFt7e*c1YN4|n9B=_z) z?OL^HKtA*Ql6*f-=;oSjccS_@0?C=emmkPRE>5^bGwR5F&5s78ppyyKbzgKsLEjxs zT*ZB(Pqk79jkn4O3QGaWHG-KjtvRQj)=dKr1vUNenksVodO%)}=1Qd;QkA!6*5Fg* zu?x0N$el~p&b_?2csIIbbX?jcqsHDTO$4O03c%XVODtYY9WfJ7%@Ow$`T z?B)23fdKTphf!?^U`z~#x6ImYXCLH4J8Cui`rup9askOc31PO)E86&PD`O$`KoUp; zxEt0^>3T+S-;L*1y1(iJ=LBoqY;4LxIyGfz@V30^T#6DI!-uq>TV}`Rz0dV3Usmbk z>qY)zdyH?9wu-`6#aIZsq{TBX0Rw!^L7ZMe20(5$WsUc}pRL7EE)H`6B_&s)t9vWJ z^_&ANN6*ygqq_^S-GR(lDR4Kh!{gla!ePU5(3&X%oiVCNIgHZFkuf0E2Z~pwhhC{~ zYO?4(&MYs2ODKPmtF<(?ZeRr1*O~7C5P@L-5Gy%R0|-PX-y6+kx;j-cfOPYbDow_` zy7qp-!9y{k085tTJ!VMs0UrJ9^*XIr4JZUB@e};?-uU&hMcIQ+ztMLd4L^ znXApzFcgZs9v-|*Un`H0%?J=yDc~C!U`iY79}>hl>zV&<9@v+u-`Oy{zf7MaQ^1&g zqaXrw!j}h$Zi#@A@09bV|By5>0Cerx&c>tI8p~wVDms}r6OL=2fOO7;3S2;p>Q3d* zmV&(>Ib+4&a>nF)n&Gf9>tWn~UA?xOK;vJYx%h9-%e zER0pbeL*f9-j7s5_Z5T`1Q7<_9mUE}zuCk*zJKpaR!mkZIW_Imr$W~<%0ld41JKG1 z9aA@sZyO3W5_dIbPYO2+HuJR_5n0ssZsx8U=J!;_X6@$Gy$SCN-uZif)Cox$u&ceS zA^g;g-g9atc1YAvUU1OYjr-)7FsxBcf1`+qQP|u_{=pXtYOJuWK1C#iM|b}8=T}XH zfNX#6)kD_2$fDRcD`Uk$$VOc35*vPGq`-@WfF6Mv`t;7-|LxztI@yQhq%4qz{+AYm zd5Mu^{WSc=h}UI7ZoS%7FO)SnJktWEN0^#&wfm(LFb@)l|J(a!xw0ZGp^6j1A0YSDm zj}`{senI|U-^!i4c1m|u=xbhHkCwjP&Yo9sb^hcCw#JndrG}0QclT$5rrh-`)N>uv_**y&zX5`G7D zrP_;1quA>@9w0h@Yk9zJxmSgGpK}IF#Pcr$;;(1?za5znLe5fQt#qM4EN~zLhh7xZ$~tEygHpA8ghaJ^d^*pyx`75O4D<;J)rNX8f*jzHCd-~mL?Uv< zQcJix&OBQDq)>+CaQ0#$RA%pWsU$vU(_wSieS#q`LG>U@LCk>!6qbjs?4t}u_6jnoLXB)f=wn~DrJ$f_ozQLMSil^GqaRC_36klsb&*&0(C zM|Z|5$~ih$+GmG=-r;QI=)qnuN-pohhJu$F(F+Y+eVW`i^ljoZw+%gBcIV~P*8uYn zV>gp}Nr{^5{JG)h^ti^$F|qw$Y4>}fql%EN%tg(oeOC(7{kIJ4#Uxdqr(f89#i8!@gO5+L*EHKQozg0YUI!!*v|e2jENYe$Ir&&A?IDtVZp%CGe4azi$C99C$`-8T zl=#ASvoc%X_@X#cz$%99rbx|c(!nfwUiCBW+zZ=J5TrNiFA~s#7}m;K?A7#N{`Rs% zm;G@`4;^sy>yMYf7u(d_)wUcg^%$EB_1G0!r%9Z&?5?+g{FaqOt|Q@ESzLMfRtUI= znAncJ*Ru?l8NY3`mqnEo^5l}Y8^jkU7$WsR*(u zdQD@j2PKWnu79Ohg@e22GNzdjcqjPmNOgsb8X>Yz=fTC|SYmLSJF&^+M|B@+PLlU` zfL*KxLQ#A$6D9pPyx8+jwE3E#q$C157p2kCiaWvDBTHgL`V*mR_|>D___w+2<rQu2731p;d6Wg6v2q!%g|zXdCNnN^$w>CTZ*dCFJ%_ zHsg4AlBf^2dhpky6iROeqig3rnGvj zE?p>H%i+z-1crgmFhnOU9*!1sT3V5FmqK)}Dpv)qpiH;z6^AJlG(7ePGI zbxQV-^rMogA3g4NTAmbezKj&ZPbc7#)dBz?rhwW%UPw`4e`u zM`c@lT0~Y$OA#v>!@x!3GUe93MG&MT{kLH2Ntym~1ShQlWEt*e-KuBti9J06Rv<>J zuCZh^r^#3RO)nBo9QERTOPgzp@Jmj;L5zgGo(OAYr{gL3R*Smq++5bZ@d!CQRO1Wb{ra-7Ob{&crwEPukm>_3@Ysw?62UB#cr`Ia12bY%8 zCkK4dU@oC!X>h(d%Mx+QsL#xUyo13^R*u#Ak;r9NcdzNec0%2FcrrBo6NLMh$6IBtUwVA`Cr^~wi{LXvwXq)i zr-4$-B8c$Y%)_lllYvbX`wGw+U~$2Ka4hRpki^B;ggNX zDXXSdIk>9!R%Et)WO4|nCs+d?CK9G6w$3bzc(e9tR`V?d=CECDHM0G_$o8h;=?mL< zU&Ys^2$5A!5jkmdzuaQxh~med3u{)l`YLL=-6cw)Z&u=4wc=P;yrqy0`AYpV{>M*V zIS^7hVs|ol`3A)0n%q1HqE5J=p9eV*V ztibq-wKAAJ{VJlf{wJ#l8wADZUo&eTv(vSUT4%-YiBAMA7~&X#y8RpbX|gkx>+VsNB=D&zm6$?-s+K z1MWjZ^Jd2$KIz(O1CuUC#ph~0#WM(_o1w{!@xpZv{XEuyPn`L3hrfAK{b2bXVF9?v zJ1@XR3qdi^tO%lx+%LpY1mS+GDirgp`}kuUkDHRA+8-ZVr^hJpK^SdK1R{RZ0%!=e z(ePSi<~|5mrrS;1Lq>=Uyp{_igHaR(H(59^$2IjL-+p-!);fX!6KcWcpYFf#RaA_4 z+H4rs6Nl*=0B&8ac?p;`yvIf48gq>xF%y04oT69hDLMf|p0A?hQFV}Avo5s7!e#b8 zhew_GTHd|2vd9-|qsUH^pp02cwz8YKj*2|rKG&@^UFD8Zum z-tS+Wfq!vm(zRU|il@*a-fK!HP6fPC7gbfd2fS&0?%E1}<8Tk?hVcF>inX#TH{K^N z6HWq3t<3?eXB?OSje*|x#kLDofpu+X)9-Yq6%HSwYVp zp`9sj`z41URbj3&r+SHFv&HH*60+T{*5&)8y`xDg%9f06QjKgv9^Jz03C7c^d6v+v zXl5M{lm?@W;Jd}izN`Y|9E&;iC|iZ-)rUQfukv<2#n32YZ{te=qk2ijbQ<$65xj*! zM2ccC*^j#EqXocLz9@aPPY@4E%~}CqRs^3bg}G=6P-}a?(u4N2M-dc3E`>l97)6ly zwWZ1`f~~Sg3;Q1N6)+(b`|xnt!BOWV{5Nib`p6cxD}kYsvCP*`r=7XQyx(DqKPyzH zA0v0vuirkT10sbq=eZU!$nGws^HuSDdQOfwenXMm4c@{hvm6TJnCBWKCC?MTbY2qZ ziySq+H;b6liO^p8PD+#ZjsH53cN2AOY|yY>#Ycx1TZV@ zh4;P8a!}{Fw#~8?dy&rV0<~%RwFQq8vGcyC(Bt(Nq4O^WOmkIOoU|CL*~e6PNl+=L z4nk;@!ydSoM7Xf2>JaviCnQ18qYmd0SjGj5lOTsPPs4#FtR)4v*YurX7%++H#%cWi z@()uRgOiqiaQ^Darx&)U7L3V@E|Unr%I5flAq%`sT?&z>#avHpYWm8!H9+a-qUFmO zf9UV>>lCL4Y)cLA_k0idriGtG>1{v$|yl@CGE9E<^iU}0P>;!@c&^bS6oS!ICsc- z=yjj6IUO1{N(#1A@jQuHe86~vweWpoQkW{uLtW@Oj8y+15c0hpJMwI00tkO_Wf$KS zAQ_tJXs*+|a{f0nH$dZ^y?ViG2l-fnIqacK$~W=@Z7?PmulxF5xJD zAXXM0AoQBvd_gAtl{RX@eC)Z3xY@AI6Z?c@!JO(mY=L$rBjg!8qOELLR}E#WQhpYl zH#mYm7?Bq9P5vNZ%tlkfTi}LY&PIEWhKABexvr~m)cul*dai0Bh6!lxoBJ;S%!FDj z^aswYRRov__dlavNdgn`Kv$(p`a}B}_i>ExwWYHQ+y)%Pk^Gy;mpuuk&LbVecz22L zp5^`VPX5E!et`;4le0krHv&_zwqzO>ZlF9eIA+FfNb~d3PFViQY_4LPkFU^B68A}8 z$}aKFd%jN~EcPeYeFGLNXHhKcnEhqU(J_+Gq+RIFa{J2}jr?NPh@FnVe`!jsbm5*ch=-T$uJr)H9r<9^ZK+*%19>^Eg5iziMRCP%uBHSmau68FGQSX zXif?+HHVMo8!e$|H(@qp6No7@Jvy^ko5JnKARljm>@Epf0tu8bRuVT(2G|0X>@Kdm z5YXrnr;7->xhCrwAQoz{_TZ(-x!upnFam6>E9=)EHMMSDmR$0HSY00%_B3;2`h8E8CGECYF_f+c4 zHXUF#SJUt{?TxWbyCi55QZQ#;8AeLC3qQP(=?eNBjD;QY^{E88&_TRwfgxEW5*}f` z9*DGKlaLZWawqg=G)NZ6j9Xbo1}Eq2V>EF`RmDVI?~JG92wdLYu4(c!)s7ah!M ztQE#bTjm95Om+tZ8jVu?+?ji_ErW@x;(;y~t`qP6%0~YEBj=*PEZUehBQ2u9*WQYU z``+&B3$bZ~hP0{3t2<)n7k43TcWv8N%uyVPVzA~Odt8zcT+C+DKm16(#H~hJu@Hn) zaxrs1%%Ob=$7<^f^i5+z68aS#bp1UhO*(oh;rge|Y3b?R`cyGasQLnfFldTf+v{>( zr41JBEvQ0w(rqn8>AZz*J+=r?s|v9PAdE6pziV0IVa%2dApj4R;Y zl6^dL#Kdj2oj%5*Ah49qp=5!8UdfoLs)z4?C-~#}SC!GY?bLlWaCvH&eu*PzNl=VY z+;$04@_MH-<45n*HYNi7P_;6AuH(pIRjZsG5u{1_vvTf^4fnVL;I;1aP=fOp!6dx%JoHpT< zpkJE?zndhdC`*&_O1R%tqMt!_T`Wp$iE+}!*N{;LEP483^?3*FWZUO3oH~=q6~>l#llR{l@C^y1F`sBl&s@+|G27EL-mkiLzkwki@5e9XvldMH?k-kM+uhb`&-wfhCQ}@Iw?icP`yWAdBHs;nINRg1I>O z*a6FxTqO^b;S`#r4NRPXvNc`m^r1I_`SgInq9NChKJ~13rXEB2@eRD22O3Vpt00Ft@vSe z`8yLa`G!qRUnJ#O)NvJW{(&MycahfUW-zL^1^BdZi)61R0m1*e$v!eKFB~m z$b1(SAiWGZuRb4H>`ZBRKR2qivbO#Ls9i+Y)-^DE7JN(bVdP%!Px|cd+V~Nt-*L0+ z)Zy%HPJUl$9SI#)$WVq#e|FBB`stW+aex4Lu72wmly;3MXRB-X-mV7yc@{BwG_@EO zO2Pc?3rnu+S=Bm-w8*E-Vf%7yO!-hv`E@Q}KP@I0?~_HaX1m~GRJxTU4#@izWlqEyUQgrBVb|JO9`pT3})(!8=& zXfaKEE0XWGQ_>j;AgptI3BaJRNb-Y#!p4hE@CFTmJ4}ked*+>Y(~zsu*YBwwZ_6kVV^@+n=h-NyqQhQum~ND(115DzIeHQbRb#xnWU0vd z@8I*_aSH}~$Rg+W~ z-z{Jw_z74Ntc0g-&6j{X6#-IrX2g1~7r3M4riE18(q7AS28|!lxy}U@d>-GbuHZQ*mC>NFZQDZrb0o&>J8mC{MZv@kD@Zsj2 z2Zg>IYQXMDo~D@_?(~FNSg=JUPthc#<{S^+$qv2B(De++iIn_iO806*=`L z1(I+*2SEJNm2Y_4Mtd|sPNb4-kjpS%mo)sYp~UMMcWvI*wgTWJFfVXnVaw3tpH#o- zJ^~_MR89FLB&z1<%$Z(o=|~JmFuiG+Xrgmaj#fmaoqa2^-B@V0d@Ig$cz8GgIne;$ zZN@~E>bqS^y`b~Xo;Vm|WGv3Y0$YV7t0jGo*b%B_LFBE9&a;eWv4~3cju-RoF9=-A zQ)mg_gOx<>V(sX6Qk6|9*JcnjPLu)?#2I~;{eRGRF^Fa10U_It2 zd4@6WS2$WR!QhQp7aL}R?^JnzB|T#bjJ)jrt=+5oz&_&px)_s=5vmd+96QO5f5wr? za|G$)Xb0Lyxb=(emx?VHQ-@Qo8i7z@^@w!Gc%4uH)#2^=3v47+oja+dM-?Zq82~7e zZ&0^FGaCdThq@I5j4l-|P9|mg5~t|SquB64t;ae8z-8)DVe~sUMT4F30K6P_$J?=W z95JeP#@z;fKRd2V-(rP3)-U#0A*^3d>5yUKTE&8(_qBU>GCM;Ie)R2^6a zx>-&IDO3&Mb=~{7mu{&&t(wY=cy$W{Dn-iXKtHHASUWJC$COxv32@+EPIzb?QLd6t zdiROFS0j)CaElC#&3P^qVcoJ@j9@^A{j?zv^y6Cnh`#ZsKI*THWkAxd5cgr@vCfgc zlAe!DEsVhLJ9PCZDOgKf8C%_iD^AV2t6z-|gy~oP!gyX@@kWL00=oT&E{yKacTGKB zOLfA$-dc92MKzWJYi|1sD1f9>fQxCKlyx*LDAeXKz-Cmx8*iERB>>hrW5Xv?x1a|Q zDdWZXpgSGX=R!(+3tqd)i8G+v;n(8Czt)<%(n^nD0H74Zx>S@Jp#n!8txV(nU#;sB z7d}`6w=T-iR5Infzn%b-$0T#j!ocvHT;PgMIdEU6FZ7(0>C=0}xO1o6hm$?wHjY}) zr~j9Yc{^xb{$=B{zt|YCQNZsu7FjQTY+n+un{`lcYCNy=SO;@4GP}-Bw+8#YYJfTPK;yPmS>}|zM?3PNJI(#l?>+vqfQ$KgZMu(b*Upn7U zA8&V`?({w8o2@#9oVB*dbV>3SqN175#n-Mr@un+aDyfj98m=_j+s=EpAGrr=-cpk= zkz`m>GT?j9JS+hj;rrh%b&|;Z=77c(r?daEFL*(revJWL?^pZA{r||m((Mls(09B% z8GtD*9jZBs_-c2|;WmvkUg|D#D z2?1r@kzj3lftx;jm&o$jSf_5T@>OfGqIKKTUTf5?hto?xn??UN?rDDFx4m-z-7w_mxzEbYJM97bXZ8w+~=d^*-UB1)s@OL`^afslN_+PFB^`aOH|t7Sy`uFHq49n zJ*a<&6;?+xH!3`oq`izP*2jcv3PJ-O)Emh8-q&&R7gJ3y3O-&*Y{K#Kg$@-~Fbo$D z^C0zs0KkWtFoYQr$?xplKB9SvS*_#h@i8dv9Pxy2-&;d3v+`ureN!TT@xzfhss9pbBn}`%-dqSKkP9 zrG|ij-Xz(I@ekmp`!cTpPIu(gvvEh6mt2^b3SdX~xQ8B9+vAe?lC7`QCgiPq-pT>k z2}Z8Eob3d%3h|)6?tg;l9}#h^}BdiMXllk#1byN6Yb2NZR5&jmfy)XTc_AI zjh>lvgON>u7yiBzo4&KfpXli8YT1(>dHKQf%Q4o&Ryzx?ldxD4l6@ShX9Ss-YQcj` zBmCl^9QE<`UhF*f=|)pA14-RgGSfGTUSeBfq_Smo~PZu1XObhtBak;5EJk)9_WWOCz-af z8goqN-%XAX$83l$=tBBKD&+6RQNMqG;eGSqvOsR*mF@D?d3oeip?Jut{3iE0R>7pj z8^*rbt-W@kT3?=%nPY=kqXRS!F;*Xj8gvU&^jn znHf+l^Q4m48AAREI4h8X7g~-4{aRh?ju0tka}xW$g9a}OsI6p`r2a{j;$I`1|Nclb zFV?p(Ls`4o@0_8?0u+M)#hZ6B5hF!hHwmn16&t=KU!3QwLOVD{KOLNQjJo%LN54Ay zhIV2@?e4f>$F^1FM`IFb-O^T)+J9*yp??$Ir)cXDdP(B_7KzmN1G91F%s6;ZYEdv+ zvvmb#yVmbdWLtG?FJN=guLdC57Kdu&u*8anD^*J#m>uz%kjPIWi#$BI2gy$PB1C@9 zzsF61lmu~bU!#iYQ+l3~uKHZA;oh?Nb0Ech!j)+ces@QrrvE|4Ps&#RZuH_ue)qb! zZQqU*Af0C9Cr4GIyGs{+)bGLPY;%VOgX-#>u0pxST;takQ zB$iy~lG5~>&J3c4C_QqBN0&F*_#*`a-hP|4+_T47x*ou6Q<|QhOPT@D*y=q*C6~Yx z!#9)jma{NaM$#qL3qS90opz7wrx#ayM+{Tk>%X)wT*^$- z5E4DW1pOp$4gD?=!6Tf1B9alk?>G`uvAR||d|sQtS&(Q)fx8s;-0F3=dxFaB?iH38 zx$u^e)4X@}(4Y#2Qh(rtM0&8M4WCQu#o1`ZfKb+wJ&#X%sdQA@&9-^o&0y1)*?!KE z$}nAanM4rgrtkGS>;5-y`krXV9SUL0PZ+;xps*)-tY7>OiE@iS-n05Hn5_ccm%?1A-rh(?%8{ehZ*mj0J-j%xpQ7fHZf z81Sdil?YLf2Su8fUZS zPCH$#dM7Yqb}IX{(}z*@7I!x8ZX)YajjVuMpt**q6AEvcT`3fZ8iW!OtYMb!+tcvyJ*$r)pj| z?}6Kuc2xjtW{l8Q96j&As+d(P(cacJ^BM`bvEq7N_j_NB@994Cjh_ki$9?!~_ZB9G z;e=__m4eT`QjZITd(?Wx-j}}SO)tg?+j9kOdg8=?RO4%1Ux$q+pY8##HaCuH4FsqO z6L#)JcbdHWR32ki&k3*8)__U*inh_GT^Al!=IYW9S>R5&#~7hZ?b2#6xH7Qxnxej~ z;j>fr)L74dioQI!4m6W?@{d=iPe8ajJJzCW*I-Q@gwnkkzX@~;H5x}NduCI2 zfHz zCg1{jTHGm_F*x<36TmLD%kS;RP*v5j%h-zypoVQF8tC@9X7 zTz$Hcv1fARHC6yJYsGK8Ql4|vYnxQjwObOt-VnQ$?%vhgPQsn&F>o@YXxV*{;Exc7 zkqwJK<0DHo+S8W$PS>#nWvr}T$qBU5Ip)F#V#Hk<{Atn2yj5DjFnUp4>|PA64K{-y zX&3_-`C#(^KQ6FQncj9s*;B?=tmPqM8bIgA0d&3?K<5K-oEN{sr5f2P?Hc)yo>33& zcvJUCL227VXp?SYc5SJufuzKZgn{@W?aV4r$pRRre`G!sv9aCh`z|l82YaMvg#$f(kvaKAh)YI`m&Fcj3ZA3gV0|$ESCR zHtPqhH``=xOvW(i>>uAHvcOw->=g!7NkUb~NisF*Lr+;7Z-JLgK7S@~ zntLnJAW#!BoGHSN21&L&n@FgYzd#;ioDL*+UyM5JyH|OAdL5<2n)u~j)3K>^Rh25Q zx~oTMkbzfF)$Iy6LZ%aV>!Jn2Q z`b3ZD8>17GGP>mXqX}FmBhc$N1@dzm+HAPRcAOGfBbplHJ#24Dr7^6T%D8AmHGj!G zDTM`1&3o3ytd-j^x4o-4NP^JtF>~rr5s%W(jy*C6sb+{zYDNDEoK+)(^U*IoF#*`T zg7~!Op}l=FJ>9zkhM4|ChoBsljcOoJWyZ{X%(N|E8#vQgJQG7kqtsXh~!1v z{wJ1x&bu4wK2siBm8=(?1YPgiEjRPFGH)eaJWCvBg2(t?11q!QEz|BI6K@~qUKc}L zjpzuOgyMSlx^jKG(pb$Vsp#^~?cST?rFB@ewt7PZA}1^i3k@wbxck6~YPl4aST%FP zAbn!%u)~CWOv4((@1 zSsd8+dAGe0 zejsv*#;iy{J$Q@v+Z=TsRsiR5jKMk$wNj^wDF$WE$;>Vsi~6&q9n zUnsj$1g{KW3Y*hX-YCtF7B!oas%G3p#K?)zu876MV5hvH995i=5+PrYy|%(w8*E~h z`PpW9M#{oUGXS^#Kfp!B`@$5>2NT8$gK-9z47N+Ll3&ics)vF7QT@f{d;Rzx z;;%0#4Kk8aP9IJ6C9(jq%Sn8pREYg!12=AStf*1WI{2% z)wJ~d9UY6Y_1l#A#&y2NNVE6$MV^W5^B%;e;=#HXk?mNc4#Qldj_nTpSEkIPx8*z* z3qxt#yVxP37I6FvFa+GY?}C29lsv-mQ$+r~_W7GbM=0NGAVG+R8A({ultaCzpl?sZ zcXk~XYnK@=02?~Xuk(~rs=J_f!&`U(O&n!Xk6P%{e6(Z~DMr@IOll5}hfG?>57%=> z8+DA#wV<>$T6QQKH)X<-uov=-5hCw*7)!r>XUgu@5;&R~A~pt^`UN2}@m}TIbAh|aF-i65NGcg;SBQ>}J&k;5W4kyoruH;>`agwr(kAD*h)zJ{Kb!oBx~+!Z_O^SZ-R}XET2iHcz#cDbIA!eKcB8F zj?P3yW%TS_^6T@ns01scdU5CyT1H0;<@|y6sf@~-O!oV}NlU$A$odo1( zXJx+YNsvmtnLD{>38cn@eNRTn@wytrHU|AQGvs;a?fhl{D$bb=Xa( zJ|vMT@6o?Qq5xWwOQ2M!5J-4oE>-qvY|+6%a&P5}Ck&^;G2G~XFVZVWvYK$jTpH5C zjmvKIpJjMcy%T1nhDb&tbJhAVy%Y~9AV=J0Wk-xp6!EiBdXQiID#7T$vRc;|2wTA$ zi0P%{nkO(1EsU;@$=QB#fdfC{s+T~ZnJmk&$D&LxG~J<#8iRTGTeId`N9ntS4QTM- zT}R0w)69i%)gCQ@Dwv8MU0Q;GEs4$Y#wxE8 zxo{@%Ts}-abcILQ5Vq&-DzVA>k1jnT)b>gfPVDKyS_BiS=l|}o?$JYjir;#SZ10P4 z+_etS0SvNzj`YWIMh;d9Q#y|2_pMbHe-apz|9`)`z%_Pz4IIGIM@nmHsF64AO}crx zPl;n?%P=d;!vwYty7W2bBY^F+c}=TVIj3P&0%gMSpIs2xNWJch8G*1E3JkK_Ip)rr zZZl6fe3N5eh)$*O-!@M}Vd3p7fjZq-}iy}9dx z@&jRmQqbnjNg3s{-@J~s3aG;i6v;R4w&ha5d!V~G;>7tcS8_VL;Ki*~@6vawgtG-v zaJJxATZb7b{qDB^K7oE85MS3%dG~d!AFZ6$OVaDE5>)91xH+qfnF5?kLd~XYgDws# z{|%)j}?a=4&s}!*Qv<>GV!mH1S_{j7kE#k=->OZPlaLAOCVp znCMcSxEcFf%~u3BW#d8LR%s=&6?J-~g1%cmS!+5$Dv)Y&-k`)M@OJhUU*)|n!(Ui< ztLa5{tCY?EzE^JSQ`d#l>!eUbPSr4?FvXRt>;z8P}>HIf}&wH>|SaAW}q8_Wu{sM(5@&P>BH>HYm02^m@E*{a+e=0lhg~jE}>00ga z+O0Av+3=j2Sl(`7JOaIb__GwmC#JhcEi3sk;% zcvNWya5!^Hzt61mL;*JPC*5cs9JMAliSgB+?+2;~NJ{LLr_E(snku~&5o-;@$l(pZ z%26)EaQ8!2V;_%lMnI3B{buE?7$3;4S}Gfa$jMA2oz2Y3%Pyu;Z&y^Bt{3l;r{r3* z6Cvl#%FQpv7V?;lV^q=qZ0NPWkwc7mKp@vICD(KcoJ`H>r|wnHAIG?-4+a?(5a2?0 z>>oux`UmWFF8OL(p(&T4TDR|P*__x@&vmg0E&;%4D{#KAkhf?4#?f=R-&f)WD=cAn z*oj}xg=cRu&wDUJ`MS4vim*vehx7tBTS7vT?;dE=0QRmnlJjH6HDdPIgyRP53BQNH z$<48^9$Lb8P2t(J^Z$prw*ZP`eHT7Sf)g}21VZox4ekjZ+}+*XZ3ylX+=B*px4{YS z?(Xh3Y;*3t`)%EGzTLg|{@ zl^FZeRZa3`Y)nmB9J`J)%te=Zq0%$z9=12m34vvbyr7o#+ZoV9DyRqWr%#1r$=MM7 zBoY1D-f~3n12$c_z?LRWE#Of5+tPjz`yab4Kcdi9cL?r}o6>;nNSp1~J|S_FyRDg1 zdniT`Pr$IPzM3{SeJMGgPYM56z58S=+sk<3%pHNWQ<@@meLcQ^@Eqs{x}Y*tg(mG8 znLPA@z*Jv+r<7$TqCcQ#;U3gpOkOhnCR8f1@NF3a9jm*t-dpnerX7k+B9-9kOd zg41$|S8|}u{jBmq->?o0!YtdHlTfZ~>zyx2*}HTm{GO1$`iSZd&QEx^DzlEpp{4Sr z_H|~^T%!-vIX{}&NF@f%J6%Mp%@hOIHNm;bk0BTvqPgR-$x;)y3jO)SMEF_Td9eE$ zlVaiFSD5;Wlm7LF>?31iw)4|mqMfArlZ)dWJ_P86;yqN+5;7mr+4{#+1~FF>*9uiq z%*e%J1q`i@vAnX2y@pbes!G07jq-1%-y>sbkNN_LuYT>n28t(|2~h z#@-6QKXSVkG1-xq&UW!^VIlHb*4>SpntblXq2ghcDk-|ozJ7!9OGPrg#?qff|3E7* z9VnU;TkP74KU9+%;JqTw@%xf$k#xp5-!s#5o6N^}QR7&1(SVS8Aga5J0 z_oEQerg+H?Xo*wq}&8(n1|cv#hfC)fGTJ>ZM9w%>d9zjMy_eKhOn?N%1oi3(9r92SO95 zQmDPNu7%q_wnZD4o&&Z0S>FE??D?<8Vh#}`EH$Lnt?m(XMPLsJhE=l9ppPEuS8`MY zVgNsCthNa(lnr)|&B$gre#ChYim9od0AkvJ2xPoK`!P#i4od*KW>R}@Nik`(=Hh$v zld(tDcFfr1?qOM3&O?7SH^F474*XrdWx;grK{_wD_q|B)wowQLMr%)^_-~ViH_qd2 zWuTrBZv;Qe?sIR%OuFpK%E?cp56G?f-i)sb@NL^o%Vx}L-h2_{C1er)r_>hU zSxv#Pqbxf*H?HYtROi?oInGRIIzNx*E3XrhDr67Y`0_N}&P^VB4va&IyVebS=y({;(^3Bz%mKTr~xsl>Kj}E zA9ycqX%yEdgEgqu*#VZwzw@FvUo0k`LL~SXC@}A@uCMj!`NY-14~iRjf#)ULG>-1a zBI0~!t{=Tn+WO*&h<-`VctuPu?@hb3ahc4C(6O{0PM8vd7bLH)Cd{2ZGgwz{NP+&j ziU-0en*FS$kq35Ko^6#7ikK>ayt`0~K&7%gHZL1gWbma(;of1^(lBozcFWUy%(8+$ zK0?NYMT&BZ2G{Q}q zjz~fn_8x?eg8y_gPlLZwLI0n{)G{|e={WCqNs&n+fWGL<4Ps9))zH6p5#=&T@r47+ zmLP201{{=S3ZU?o=WD6}CSsHrd$!Em4yw<-a-j^9EQ3oLW0*@auL;C#1onifNP<;9 z4!dKoi5gRP7XC8DUP|0%1tw-B6HRM-7NOXC7W3&xx1S)3YtA{B{Wz)n)uORlyy~gb?Bk@CL()t`WoCF zdkgzarWd=pxN*i#4Q9mNltHpK+oL@ZsgOs~#n{u%Ul z_Y8+q#`$NeT<-??-8`v(e7aJ_>yc~$7v9W0<}FuYE|gpOXK3$Nef6a9bF6A^#U3|) zX|C3w2vZN>YZ`yVi(i>EPPl)Iw2{|!J*mM8UaJClJP)m>Eni(bHKw`b0e}P0G`+9I zkT4Z|t6b|btw(o&r14}e^wKA7#!mhC*r74aR~qj~3hej+utn%`#W|@x=w*a_X~&si={)O_M?R!<)EREAQl_d%dxe3Vet`(18PyXasd72|AT|k00hgb zGG7)1?!*bx*9?H#G35j85#0~pFUrc+w3o#@BbR%5c8*1A2x!#Qr8R$pQq@p+J4#i5 z)%IB~m|U@y{a&Ud`fVW=Y>hTWyWp>+bxFO?zKI4fP8IZx2-KS5Sszc~CT|AiA7M)H z_IV-DY7j_Fendt=@VWiFZ&s?1^%+TL58ochY1oGDdN?gmLn)r`G~)UGsxKmZG{77Z z4AeBg)aVS*-8&a9Sz2$1n@&A^^XlY*b;Ve|xtmEi2QUuK>8=2cWBdDU6M&As6_pZIz-YVDkyczlxw=EL{8m2U4ls6lLVYjlujRZMHj_e7_D_o!)4^pv|`Nh<{a$aAZuEdd2}gvC$tbtoa^s)f()i z8=t06M#I^b_}P{`7A!J40+8gqJ7en^#$`sRi%=D7lsoXm!t^F;U*QvM_~VogR>*Xp z53>q*e4`~XynEGd5kZW(8L0l-)%F{Y-*0I4NrA4sp{Nyx=@bR`4Ox-SNKRH5hRJA- z`0rnOvxtnutu)u?{$MByi)?``JbnTIs_-)fLwNz@shK1s!Kw}WmV44Anu|Y7Ssy-G zv!s)>wZmLRmAXaA@F)}$O-mNSeYm4=mY*aw^26S8LMK0MAAU>nddoKwS-bz;g&bt) z%R-n|-fr*iEScppt4UYpY%S}B-a;1kRDMSZL#G@abQ9;E{SRyo(X$3m%g*b$Mm4YO zC0A3f1jUYvin*Q2>#LG5g&J9EA(L*pG(&r)?7AD{T7>PJfFVz2*$=pt2j@ZoqvCU8 z7Q-=B8lOfS)mIphQAP@$o#?GH^LiR9Gn45BQ_KZ{mb{VX5OEj=<}Xs}?t#XVN3_V* z`7NfkhmfzU6y0X}%Am>S_L*;9MP=gS=j4_e)w&7R8e>|2x&w;vt%l6ijYJerqTLUx zU5K=`uN#_MD`wDw`r(=%hC`{XC^2>I(wv`PtR38!)*a8JXZDz(GHio>n~V{eouGLAAx?jd9B;5Y8^*7`=Ir_UHdUJ2&>5n zFQZ{gr1FN+%P7{FMvc{StKqQzE;6X_Yf9vb&OIwJy%N99NW)$HH@nNt0!#nAN$7JyIDr~)=xs$1dLGlT&7Lc@M*B#;Sd+R$=1 zG;jm}9R=5VoS5MQ<~X5dP{qCQKKH@L!j+v5R@Tp2dV_{{t*yJyT0+s84epUSKg{Bf zga<~zVHlSC5b(bBgn+>1A)f~SMp;Y$h<&2A&UC$=HRtWXvt%D&&S3_bS=?{Yn-0yC zQjq&aZ_yhrJ+G8ybz6hDfF4D^hgVMn=9h6eCL3(v%~@SPuujd!6LDU=Gm-VO`llAJ z+qqcF74Q$?^oQ^bM(n2{AgOeT;P+s76g3C-Iy`>reyV)U#dYX|d;<`tR6`#O{gFnd zEkG?BbM(N?Nc=sk+gqj0s?qKGM!U)|y`-y3+etaipbA9a2JD_G4!i-F97m<%59SyE zj;i!~6H}H2aL?^g{r`ei3OMLHI1HlAzBIp-s8ql$*)D_&?J&^~W(u+^r1bQ_W=pbt zcE`3t`tB{zZ5e`@|1Nu(d2onb?p+98MUW&7MkX|SEJFYWlMHIW4B5M!SpQ0(<$SAE z%v&IsIcIzh?<}0z@K(ijO(}MxwqIMzM1T5WuuG^r8q6J*IV3ZPcHVo>yHc*BmklY$ zOG$KX`w3@iWD9l0&@>;$sHo0@ePXPylY+6tuvngy%O>hc?G{T+6WOC; zUSnwXj~X~>ciRqI1G`)??Td_&zbtxo&Cu*E6cs$rL4F173KEvUQfv+Rs&V{vaoDT7 z@S3T2-ZUV;Gl6#9rAv^^Y&dbP)G5#(Fmx`0%hy#(WQ4k5bO-0JguQA41c=Zz;sJ&f zG7Wz9AlfRtl>~h{EnDy5;A=LLrAxk!>s6IF6H#2Yr)}IT)fAj4MD^x)z7CZ|;owC- z+akyiW1M_B#FyVg*gM-Us&4qK3*>My(Jw4sU%RuZV7pvKE z1>znVg zA$(qtAtqOV1rZml&7zWU6>3mHJZKo|daDYUC(_CGtqcii`fEGrz(M0Q*8o|K5fvV(M*60}84(#GxLV+JEl63BiNliF#vCe^-9zTduNGcMMwa6* z3HD|Ne$$|5lzESpNNOHdv8$#-sRylV>B-6&ElgUpU7N(p-$oo>M24MpV8M-|=iOQ9 z3*FvPpk}aN@8j_C8$z%1gz6^|Hm>WHm)unxsDTtVoqCuskMw3f9`Dz7Lz^G3IqUGOf);M0NfSnMhVe~m+OXdDcg4C)*qL$ zUX9vBU}Xh%1<@P6(+@A*z2Adv2?6wjLpKiH@4UQqYdc~*yxh;=Tf-MPtZ1-R>PyUb z9ice6z)}~;Qf1=%5Wr-iRXd;m#W#*9D6%%#>rA6wUb5R?GX}6iHn_*wS z2Kci~W{CuJb9_lEK9k%{qDhcf#ok>d-jaAKyT^wUj^?R?3aA`1k;5g$GjwFG8=4+b zoFfVklRoYAmJew2@Bixg&e>CPoT@0IaM*=a0eJ}S6NSDYBv_En)X5mAJRy092Nrd)ZXvQ(qOSJ`)%5b;Q;OSJ-;y!?2%@ zX1S)nz6}S-z(aj%>f)n<22hpVLyQ2r64==MwNccvwU=P9c-d(DwTV+++ZqrCMp=Kt;GKOYHTjQ(vh{9oq9|K>}~X*%E;8Ow}yP@VoGnO%p)3(qc{u z&jUw!fdRYZ*ekp4+td*=n`8BM+VjsD;IGJBCldQeqEqon>3MwG?ktw>hv@xbk@8EG zX(lHlTEg$)2-z2UOjNqHJLw@2wTpn4m}k@)q=?((bkkzmCqn;QC9R6SE_wNq)3Scs zuKggj!RYR|`p^fI+urx~#r9yK@qy~4L86CqF&RVRd1wWm(xr2i;B6Gdq>kZUp(M$Y z(|%}^MPO+_g=RMpj;r;C63N{>d;nlIFP{S#W#p7MoxsqQHGyUi={#3bD}PNG;O9q; z5{(niAjA}O4<}-37lIQ$o2s9QTw@cZV<>MpVy8M~tm+}~{`bX$Lh^u^0qFn|`yyF~ z91hKNCab`02d*EIMsC+<2}Tt8Ngt#_)pk~SK6!n3S4@?uOzI!sn0Yyb_K7>rdGPnm z^J`g6YmLBpy8&bEgzmza0^zv2vf=Q(gZKoCbYij*9K-yivb;(_$u99$i=EZHWHj=Y zXk54(#4yAyk(G4FgF#rq{w)Q??}CImJ8>9qd;+tAnz^};QAsjaUY~8Tu2AcQi@A$2 zbW|6|6k4D(B65~3rfPCo9YYeFYLfiXAWERwd{B9x^?u6n#+gbhZsF7FX+3oh(>q0X z^EXpl+S-{Ru`5UvdHEodMVG09(d65!sX-rZ-Nnhfm3cPihkF1uDzxFG_$5N|OqxG80@Qcb4>ENzB|`;gx3$r@3JNb6mHZlF+? z!r+~ysq$yg_OO)O`Bdg?5rI@5;Hw$Q+b1?BYP8bPJgki&;1i{#dU_T#WG0UQoH6^k z)<=!_Hww0Z6FQOvNOt0gMw~%I$B&R$07)09Pfh<9u&@QiUiIXyxGR9O#KZ#a1B}AJ z>|+43nHB^x1Qdn7>MjCM(TWdw4`?G|@uhd$m7M6Hen1;^%HH@i6iao1zW~I;3Yts5 z1`85oP$cl(3C7DnGT9Xaa{SkuOg5mv)%4aGfFXitka&Q6u4w0qKJeXJNjCtNHr?;p z9e870$o(>3XFhCK>VsSYY8TzYH@pvSIHQ2>d&&z~`^=f1bl!gME2!Lzd%U{TCgtH$ z^@TA?xf$vm_H*l<-xv$#H;a;GUJq^%JH-pFhU9MX-EwQMK(qM;V}BOAN0_3r6?e80 z@R@q7Y#U5Mojr%c5mRaeP)(6F85B)S!XR%#_-+lAw(7+iz~?-6;jq+vaWTo;#+XK>d3@hg zXSq|eOvQVNx*OQ}OkZ2%9Z$3FTba}M*<~Ww{V+(0LecNN150~4DSS*U!E8Gsh3=J5rh%sbetdjW{}Xvry%Q;KWQ zM38Z<9B-oMbyayb;#W(J1e~>?^0olkC122uN1Or#DJr_%w(Yz9o$&(u=jzNdH+-b z#p%}{>?b^%hJ?(@9?FbVBPHn%fD-uwNOLSt4@Th)Vz6)2K}2lm!Hv+5aKGsoO?>q# zaPCM9ikg0QN|9PTP$p4k^o75;wCr2E_OF8P`Ug%e#c-4W8N@68s^Y4WHU8it=jx`0 zs%!tAM;%q_yzDQQ3`RB2pGAiiEBomA14xnTwEo0^8vul9zRP5OiO?@lc(8HSz~ zEydwm_uQsWp0tP+jb0jSYo{K=H-383ieDD)^X>Fv-b( zCE(p`erj5u7^@Pi)0^uz@Jg$Jv_paGu~K!lO7`sb@L}L3r@yo{eY2r%ddepDp>uB9 zX|Qk7t0Rdi{K&pfQgRdszDs7)^BxUy)T#AnArCze@7K3zBU9Ghj5B3C;!56Fv1#;} z9hi3eXXK?xd4R?)UipH&k|4L%%A=dpMA=Kj#;KB@N1nTyL#*?^R?5dz-+{`Er@<`i zKfMZ!+2T{5ISN-Epe|J3!i{{jxWC6yS=BGuoG%wSNXb9w#F2mMe|lfzy!;1}%#{Aw zHY)Vu%*TRy^X1x~<78>@U)_<}M%TkyCahmfK(PC}uUM!m&MvrjTXSBofci`1&+EAAmphw6p;A5|_?*y3d zt!g^|Cg8p9lar)6+4+ymj3iG>tOUg^LCd>X(H>R7k4C%Hn221PLQJtF^hmNQ2{^ug zz!8(_%H)Ilc$x@w1)oZpB8}aZWLyU2=2o^u2$U4bye(cr5;ef$-!48;+kNl>$9P3p+Hl}iLtdzsKdK$5(dLQi(xp1 zTvOl)1c25F3tRRF;Dm#3%nm(P@NQs1+4ik^c^R_3;IMj$KLKD5o_|H59MtPv1dHZ- zJAiQGW~v{oMqW7TvZ@_lu2MAa>sh@OZ*F4N$yrn(C>aZecDfk>rL7N@kQe{k@*~Ch z)6X-mcFVy{10Ap(AMwzIX8cy)$U?&?KpUX{2z<@^4V}UJmBLqY(Q|qv3`}Sbnp2r? zK4j$7wr`paE4es&(@`$U3Ky0p-A|6@lGd8oJ&X2J3psb3PcEl5np%ggCl+oV z5zM`=kZSn&hZR~M(q|ti6G&v#l9N@u*7nuw7JZP}R;aEWyH@Gxy1kUO1IL9z<#-oL zK3vOJ^Vm=}LhK^{kQ^atRzWMAt&z$+70?@ppsLiyrp{7L21n1oO zxc%W$zI#K9{-?(W5Oi%5R3PT0%W5}hy@E|kz}^{W|MMr?6Sk3&!5kay5rMvYK`5>g0O@ZaDw@iI{qmC5JyzAK7K!izKUPnTT#NePO%2q3Eb zVWs9IA^s!E=lT=XK!KjRkwl1kQvhu*0e9If?kG#Pnp{drvxkIIifBCXAbMH*S~4sX znn_SGX=^eoDom({qyvk-Qd89IPrcym7mP@>FBQz}f~;a50_8DY2qY+L1)PPpijg_x zfrR3TlO#w=baq;<`D$twh0*k6Utj;vAMzMMS2ubWBVhm8uP3p*jk@iw38X3uIc(Bu zsMd2q+Xr4@v%gx-1j4y=0;@pK)(p&hE_W6l8#CaJ?WPk^$%>8d+TB0tGoo6PUR8`S zXmLM#I6NPiZs8P{cE6fg3i3%#RsbKV?z$c`Rxi80@5w?}*A-p97-?|ekC@}U=DA?2 zem=XmprcM%G?lkKjn04U+L=s`j{O0H@!{2fek8)aUJ&x$NW1}|NjF125xwJkBJKP% z^wS4``p$T%+*L^bQlN@7;xfqith_=g$fecY_9w_L&Qs~Ik&t-a(RuM~a>GS;L)~S2 zJ;RWIg1(k^=si5_8+h2)@X$}E2y5`bGq=;!yaf_-t@$ze(|d~K=sGZpaYG|X z=q9N*ef{ele)i+P1ly85geKz->|0aYioQaeQ4#6SY^BOaycKXp&*oNN_oTQaPZzY}GLg+s zhiei(5Y=AaCayC7@=B@gJD)H;YO$^2MzRDwPQSB8lATeeV5y_Lo6 zAQuZ0sCR48imOr%vdCwZO$fxqk6tH`3lrET3H*s_D;Fo2Vpm%!*L|s?n5dU}$vTix z_V?5KZ|sRd$6b2Fu7zx4bP2;!G8tE6(ahsX8bcVeJqrWUMV`ZkA3%I@9N8`Vqa)eZ zquC|lFnH6CtQMY|)-G3pIC&Htt95n1EPi(vG}4H^iZGVa49=7!z&IkJ;e?RU@VIV4 zgO3!0k&)L+#D@hf%2%A=C5^Rwe1ya;?*i+r_y@xIzE#%^#Dn%)iMyIdK*&U3o_1_? z-|^tT31V+(3$#R~R}rBnt#697-L(82+oLmj*B%b7Nd+J1ZosF~8g?VZ3W55|&S=BD zhZEOaO`8q54R6|YpxVDe{rE-9OG2iLARzHkg9Le9RE^@@YLrv%caqfDHsOv1vzT-A zc=$l>0o$C&s2H>~jCF#nc+8|I-tjyK*3Eh)$uN39LbcBNKBc~pPfLnn zlov{rB*i59qLaCFfnlSF{Fe$=L?o3Y$$sSl)zpkAs)|oE72%9yj6dYABoUo*<|n@@ z5$*946bkvoZseva#{G)~F&eJwGk&slz(TOcjjcCFWO_yIz~E zG(;N|Wqd*N`qDz(5Mq4m)E>Eqw)ZHW2gVbzHryk2&;%bw50*wvzZ zffLA-;~H{@l|Sp6ps?WdIj9AT0OX1;%-XEWE;q^=>GhRbAy8HzIOh;CFWH2Y>f|LwPZak9uhL3V?b*x)EHISc+zCMt$= z1C?F=K|LxOvAL>`I0+pX{bcwGAl2yOLfJ%Mh4Qx)(v{AiV2i%haJqe$ung8vX&{?q z=_>EY$IbtspgNqJPv+0$*Y~-<@VCtkq7X_X+NLO3B5SM#j@EQkR;t7Y##%zQDWj|S z;XO+`E296#Jp210^6zjxj$o>n&c(Y#MDm=(s$z*<7|bHHlBR#Q%tCq(#%=~zD!Isu zTRSi&i9r-%2`BmkD~^;E^tzpC&U#DMUbz8U4v)&^mz%*25yAB8nsxg|%`N+NdM6?@ z=ss|95AVH~z@EH_W@Z|wpJ!gxEjuCKr+ZF1)y>nxZ$A(j4DiiQMZ`bf*!$I4Rc~q6 zU-Fo+-)XqK{`P-+*S_rbYJp&Ip7*4fW0lw9pLx0F!dT3wb#-je#1m+QO-;WS^0bVu z@Ojr9OlRlR;||2r%2H4_+TMqQzu8;k&^;b9s#F{t?`h`MSSWi7z_QReWNuO@q!zHM z#$>%)Ckf@ISwp6lAekheEW#W`<0t6nT{cQ8In%31#7Kym&Y|*WX(b=cG@$ll1SW6V zBnizpRfL~LfFgQX@V0^`J(-AT?e8!0umhi9=nbgxVlHb08E6>84BYML%4UilOHjVR znnshl_~G`}qXlA>lq1Aou15um%*(s>U2o=3!;i-==W(9-|AX}T&xYZDvJ?OQR!8jh z8+yKQCz4sT$Ox&u7^{5FTPg*j`@74$;;m^#Wu4V6_RIEJrm!lF@aqhdJsfHlEBNwOhHk7cg+WH?DXS-fG;WByo(J*8~HB7$e;GyDG^ zk0P9Z8hLvE-gzm=g+}jlezJ5%&^fB-czl_|yxS2uuGS5)It0>>Kd9|Wgt$##xs`!R z*}#{572JDvZ^-w<+efqY>OHf^X7;T6eVLw|=-v6Q8l9+xe1W$JA|BX$@WpSTs%tZb16e;SuA%UtTUFx-HHGyS^*V zVG5Ae?>W1g+7zIp?AMOA3&QUVTNM2LgL1v@Z$JThW+u@MWUtnN&13t|#^~aBh<+po zVkFOX&L?gAtF2k*j24Pp%aMLo1e-tJx!!_mt7k6UvKJlM%#@q-apdWMR~75xhnZVW zq?psi;`h_v;^2t5W7GyZT2vuOUB%PzdCtKFCgy8fWL5`Mzj!Dnaikndbp5y~xezO$ z#9RXO^(*ykFY~C|^Gx9B-u2?03}F0^ZEV0wZ`*{vPxpX-e^b(th?Y`rKk0QQ5qoSO z^h|az70B1YIM!JVFpA z!W|q|`4S$Xc<6aD%n}~(Kizl|Uq9W^%ULdDk3RQb%-VHITS{v}GCO51_UISRBaup4*p@oveaMNVWLG~|PW#v_U);pr~ zKFUjD#DtL{xk@3Jk>ST2eR?NuN`vY4a@i!2=u(ruOp;4nHTL`UCu`H3r(Y^ zQzuy_J3JPFb$dUV(D$sWwup;UBK?iMh#}*4>X17JVEX7i6)Mg;?3B#zZIPJ+u za*Ldk|vbql({i z=fnia*+30E^U&EiPsWvcbZ_#JdWZ#jZQ&KMy2Z*n4&wBOT1km;I1s)?m!^Mv8??A7tE?HI z7o9?$O5!I1T~$$$BNO~{+Pn9l29raM`getdzQkEL<_GNmvL5}rW^H5raU2KSZX3e09_!eN&#`HoVs!<=$zNIc%S?Pcw3#M9g%y}v%p1Z!-fc@hC==-A zBkFW-eI}he1V8&VY>ZK{Le8WtZjX?IM1dhW} zlb|j2>&Feo>Zdig%jb)e+Q+S$#kGeSgjW$ql%jf{WjLe%=2Z`Jyk_F}7LaQJT?y20 z3^$QOCD~&G7oDqV9iqcjF+Ul>{fNsBkg##J&`A6wgUG`4& z!{pBW(WR!%avc0L>#VIJuXWmuP#8icBA18>L`ubBICAam?y!DmMZ^LM&(yj%nV?jp zz6J&;BZ3mTdIxr4U7YYWZnb+Y+%&Jqo$2a$yLtrj>pd9(dB_iD!aE5& z&R!>=QXX?H>J!FtY(6wvWbZrbFeHgTu+;sTUT7lHCuofi0WxxA3cM+WznQj7Qx1-3 z({OPSvnz|?vDSMx&cuc=uCje(*6}M15Mo_gmK7|pDUpB(%P%MqL}aADTl)XyJyGv| z96vW9X@VLC<|lQscOI=DaWnlxEnU>;2^54(nj{NH@ zl!UuR65x6UM&T0zT_kCSzv9dN6jE_R2hLUa{q*0etGlB`2v(F=Am(<%jJpoMfAS@r zt*$}J^d=5>+Q>|sT? zB$jeCe7Zs_Zeb&)@hn;F0jn3-Z0fZdXjIc+@@&{)5v0}M^F6S_SUI=_X{d;KzTG6DiC8D?IXGv z7k`Ka*?>}Ley?J+oCyEESeMW@MBA?Jk-TlGT)v8fby$~N+-^c{gY>d8Yo!Kyi+m+l zu{Go}Jr+9H&;A_6q$GbxbiXSFD}6WKMzr}uwbOq!VLx^djP!+6`o#jqOPa*|){0o$%&;gf7s*WjS(;7~=)CSNRd#F>($0emh-e?~uLpkXj? zQKBOG@ZK@4@5))8?j%pc_=2bRfSIX`sBB=cna)k2YL7EX&(UmVZg8`adM1gmiD*G% z*pPM0C}hfDrtCnX6#Q>LoN~gU^*hP+%0<&?+i@&AS#qWivq-*a*ob0AvSE00_G)(9 zj_$AjK+)u-X>9kj6g$vFJu~Mqa>h9{Sk!y)g{dr*Xv(5dDo-VC-jS85!K&YpqPMj7 zf7$F;2b?hnz+cRxp8?9O`FApu=df4vd9EE|kHH<+;gwqnI64LsYA+@f=iu|aGg_f# z<(u!EMLYWk03B=nU>Lc%1Gqrqk&NO?!pgnsYCxt}} z!7Svv5|aIL@*@Zt`PWlz5yS0$Xl)Ow!cgbq^BqTX=H8>v{NBS;1x$PNghsy*9OH|f zygyl5mDJ}bU&_Sc#8calI$+U1gjv*Asy&mW0b<)a2QC2XihZ*b)5ZQ-u&w?1`|36k(q2y%9T&P){G zZ5%#7oact`b1Q3WX*Mb5)|O{tXo0n(qfx_hegzmX(edgr4%}Wz2HF1kW>gB_tI^^% z82Udpv2^Irc0tFo4vUWO)+>Ta918gyo6#)T7Xin`tQA6u>vlm7I4c{9F*b#It> zU7|DdU82ROIpK?8AHhem-3jF+dB)JbZy}wXcZ8NQ`MuPBU0+#LP$|-jD2VV3ME^`xOFgm2+rH1sBXsv*)gbS%`hU^b7liD z_GDPjK2CB1;@YpB>0jW0%u0FW7KH=K*5M4TOSFyen%r#(F)9!+)|(Wf`o~Y0r>395lS5%{?Rrw-mSXXQeB1_0hl$&yLNvMsWS& z0=M_Z&b@HXWyK+VP!jhwMs1)~ z5=0^9GiG+7W9^h!wtVt&4uuktx8(5Pf1094x53Pf-}yeWv{PGq)~EFc{Kql&2zC=V!YVz+5Tr-=Ao_Q44|ug(xbL)Q zIkCe#2;jp`aFPsuZI_ZbTt>8gX8nHHDB#a|U?ms3ku!9Ejra?-sNTJRvX69K6ku#7V11BR;*yF_>n-)Lx2He6B8AI_Pf)Uo;^z?xYoZ5~8Y2bPVccdEGiJ}q|vi<>4z$+FjJXGM%$y-_sOF0^SW{lpT-2|_o zGM(;K8->GH(c06TT114wdOBoTeynbAB4eaptaZqG2FxKn`+6Q885D<2)vz!Cb;9Od zKhGQ8ROe266>zR}7iL=-`0N#Pa4W}qy^Q`IZ4Uy{6N~btlC`20p|N52*>hscg^+jx zP>85;5$$u9<~9FQ@QNQL!|<$<$UpclQQiWtF;{KiWlmZp0a)Khbm}u?asu68QBhlj zwVy5~q+4WNZ*aya{MmD8u|xF+nk2ll3u-0uyF&uy`GdMh(-mAdIoc)Ae|{v)(m}9L z8QiQ9L$so*T+dXjEY%j7{)bHa-~GJ*r#%#u43E9X-b7 zM^|!{NtqBBmhOByRNe3T9EIWnX3Lx0F=>GvvX3K<+A4Rt9|m*;JgtgeFV~7O004I*gM)N8nN5#)&_+u`cU>A{N{6|7Sic#Q4W;L{E8&-OlW)I*E6|cSMahOSl zGEA>B7j|+Y6l!#oA3`5vEGW_qV;DqT3iDGjh314`q4@j%E990=%GcYpy3xlJaUefj zJ=ME$rTaUhw30TTp>msV)@~`XYj#=-YJ#lWy&301njMJ<)V66hKos7M9?^v!+;ir% z0JS_j>3cQgX>x)mY;29I>ABXW8E#kc->TpFstvhC4k6Kmli_VIQm&1{pXt6uLj|FX%XK%Zt_5S;twD2%|cE?%UV!t zu>4gYc6-{d%8-`%zHxIGr{v|kPhMR@_W%oL*#OqqftKRUK%xS1g)Lw+z6Peb;vzjS z!LkF%KSaQ8Ui3LnycyXHG&_cEUm)F!0$;EE=>kuhLy8uTAT(L;^6Oo2R_?_Td7G>@ zEj0UUFPE-2aQy`;(~mp9{0sDWRNEx9UW?|e z$6Xyd!EW08_o_j@2TJ&%mG9k zX02Yh%3I36jjmBW4tH6dldQjPo$=QZeH-|`9_=@A#b+PLqTlDn3<$yevkPGBiB8}B z?C}xe%HA6!rYP#MUwMc6>uEV9+$-J}4vU!QwPFUh(h*+8T(H$YxPGgMuMlnOeQZ6V zfZRjR<^=Xx8<}R5LQMfSIeN4VPn_W%Ini_w91Fi1|DMgCK-RG_sw{rL>?=)*HXvg4 z(T~mJ6z=I1G2nbHri*&yyV5xgv4m!SQ zAfV|&`i3^3;Y#DuP55iT*_X#9i_x9wgLw_6PdEa_csF4S4T;+`+x7}9Lvhwk*{e0f zDEdS7aPK323+-4bhSHKcS+d3~IY^s#auk_W7{4_tAIaDF;xmJvIKYmU=C4J3GYINq zt}}A>7%|=0V)@poVNZ=S@eseEap9I(-M-Xn6>wHPw^V|^JzW;6H3HwmpcMd4LB3yf z(@ZfJ-qH(VIRW$K-LW`D6y`OYTRLMlPtWNB|La%hS@rH>iCKkVSLu*ZWy-OsCA+aA z?R8lD+iScyap6<7H}-gNSyiJ48|ioSN!!zh5hom$&CL`hiRN@$dTuLrspeYrv8?qA zGeZpNtW8ados0L5V+VNcxIF`>&Q;$s)XU86hw?SvR%}1r^fH5chGnOim0OP@d}cVg z!dNzl9N5#b)0z}%Yr|%1<|LdZcuJ6WiVM5b857%iv+erewaj(sHoiJwyLm1$J(Eu? zCNG`w{0>i;fkw6;%GHoKQID`6I`AKdb$)2X>zOcet}{zi2h+Lnkm7c_;6bcdckK@x zElcs@LP@5ZpCQ0anB^!;-tMnkl08*34y-U*^hN2N$g;01?2booVom9@YW!WZma14Y z%LL0bYpg(r*KUqHXh;||%wHDiz6~}=Re?bRziOq; z*6A{Tc&vnMe=s9dW(=*5OW(ON1nX(lQaZ$vZO7P^e6vD4@rchQqBx;(SG$19OGG4m z;mFtXXTjXUIr-*JUe>8indJb&tM~^w&&*7SLHHo0KKrFYU?B*26H*8 z1OI%+uu$O0CMt_So`cEd=sd*Y%C1~m$31K7Klqb+mNK^&l9AsdO`28 z9y~{DpKIBLyLlsO)bCGM?Nd(gQ0aRflh-Zrdg6G~Jas)zwn4f>+gb{-&}Y8yZaOQK z7K>#5g9UK6by`5rTEi#gVF0gg)q?2zeD`}uiU@FiJTVWeLnT2v7bC6yWATzeII7z) zpJ!VE^QgA$+hXUm%|DfB{73~<87ZZPk?{`Tn{swwtN_8ijYf2SCH~2{OX0;zkqz6h z;6S!)z$m|X5u}=7zxbdcN07iXMRZ{z1s#agD8VwKHe_?Ejzy9f5`g6w0xV>4c+3B{ zT*ZIA4$%og^ha2GLdLg)Bjtr7pDe?ZZ%_T!p`K7)>Yi>y4XB!^izL@_U6ywVhj+Y# zd}kJCL+R7NqUC9JHi#m6^-p7tE~j(OGMYpkHxVm1j&c4RVGIoiGVCF>>F5qOkyL># z36m1XiPMcv;`Ck*qbV-Bl5p2*YQFkPG(G8|MRwRLQ34T8wR*r*{+8n?KL1u8=Lu^n z5i}jS_PHc+o_Yv_7_X-%R0{n;`=e=zJkA@%n*4`zRY2PYzb2H|&-#0D!3Sw*sh5208ye8jw8=QXX~m% z#tYUv1G6DP^xrI)%a?jfvoXi&*M6{_?uM$5F`;4mVCn1OpLJ&i^C0s!WRg@Qw14h@ zcS9XU^6A?94=LR}IY`eA6f{a7?Jn4?mmy%Q3#DjCa@dlC-%H$#X(-gLkTLY$*X33_ zt-aR-_-Y|FFGq{lt9OIJDy zm&iyqNO;Z2zrJSz7o16}i~1~c>I zM)kyqFd+FF8eo9*9UjUo~U!pQK473p_6XocD!L+fWg`6W-Xqd3uY0;GX}yV$&T{0XNg86svDFa5`vWUHAA#u zDzyFbT+p4o8VI%oB}4H_`;i4+suogtfhSzM51}l{fRZMzC_Vl8hwW5ahcJX~uT7k) z1-E8w_;SM5X^OYi*h|3f;}Q)Ng$HDDJ=E+*6)KV!bzk7e&m4$>{@ZH)-OBzwHAiQQ zKDBzq;u1 z?nhK|u(RiP@eSQ~|JEp9eVOWh zg47M6P~=p4-qXQ3&Ycg))^&VIx)zSC09Lsf>tTOgw z0J2Dzo_eq+h+VR6TguL*N3kuxJBVSt6M_!Zp~Fl!A*HO<-16TQzc})7&qT{l>-ZfB z*v=m8vK76(Qy&tuXjiDY78lSe+eo3vcZaGWtxS|13j%%uNmCX=qwY574@SBK2T&a_ z{SV(XpoE6*WkP?@XZ*0TDNRna@g!F%>gaNDcV+^R4zgW@B$dS>`TLp;S(3@wABjvQ zO~jvmxz*w>@}4JU+wF0Hva2TE;|T4aR>C^M+16(BD3r&~F0hc78sl2=R(TI*vh5SF zSM5%uQ0;yeG2{0CfOpM-3-)lOp~F#(S)ZjQ=k9x;X+Cvf!knd=d#;%JH7(Y8AoxFl zWxqw3MeYiI#(vq~I&$Ab(&ZIw!95+vGEs(oGJM6*W#;oiyGB${(2qquBYL!kW%k#r z8Pr7P9>4Jxv{DiFEFp^c^$e_fZ%Ts7a}RN-9##>jaQ3ghmw|8ADW7t`cP9#Xx9_f$ zVCjK#^Zr`TlboeiFY@xpXFpW-{2tCKT7Zl^b4e}JcPsO4YLf^Ru=Oq)z^AlasUY?j zt)L)&Jj;6i2hpsP2F#Gn7@l!Gkge+cDoQe?*{p?SARddmjE$SCtQ-Z(7Nz8Rg~U4RU?Gs%Xo8$_4#e zw6LD}Mf-DcZUrUb_{?YP&$^k5COm_A(TOU$1Cw~+Dvcb3EE&c1Ngfz3dG$%xB#whA zX=Z5$I_M{S{e$c^p+z>+yTp7jkk&buy0GJD4>xpmqGUL)vbW&i*m-P=dxJk62>f3| zQz{qQ)Xd{m7T8@%%2RIT_Z-4>KMipZKH{lS4wDY{#Np%jd>asGiTvS^bUoa;u!+R^f*yC1-UDa_~tCS%@XaChh z#IG??E&`1DB;b75@!jj&SB;j!o=s^xS|zy}X>*bF7BG`R=sLJeU=TX7lmwny=Uj8z zGD;d&wgDck13Y@V*Pf;5NxAl?EB@c(DJ7}d?##xoN8754Ax5hu^JfiFQ!s%FjxOo#_8i*xT^oTRP}O1=EiJ~E9bTjCPyEooz!MI0Wa zBWJu@{@dBpD|Uf1Q&>;InMGZNSz*6hr^>Zr)99FMCVkUr$Mz=|*dfKf!I9(V7Cler z%&U?H-BR#+UBaaA%#TKo^ixau>A_K<1de2jBr)*pHhs`kQ`mWP3aSo2$&f++jphCaR*N zU;T_d&ubv~I&5>k6bb}_p|!bn`^v-$cdTIv`y2q5$a8ShcQl+s*`p&@&R?B+5L;YeS#chb%ad+HyS!8DNHjLB~|Im__tXN-FYde5_qO>p0kNUbg>uU z9i;SAAqEov7(P_lDXoabTfr7BtDw=x#hU*9y0}n_4W(PUS|d;mPGM?XP?P3ghW~$e zWd8MklD@VPN!D76_jneuH{Dk=G&_j_WW+GHp0q+9MNNv?qh~-hEiI&3SLIrc({-7J zu^UtW0bUdXjV?u}@Z&ydhw4R3SYZYB5U&v*s%T5`7-Ot_>aXFKH9`3;dSJ0Glai9! zGvNmsEt|$?#zrDx3)xa3#uJ&xAEj{c1whu{2nVMh5LZ}8_Uf22Q-;$*zFssD3Ny5| z|0&d{dGeTQMfU_ixbCm0Bq;XCnq>0yzk0|6C#+@#>CVihXVoSdAx3&q-xoyf_$UlB-8fC%*^wvT#<4dB;2 zl?$_QrR8-CQ4tNIhQ3ekZf6|D2xoc9%WUC6`yZI{8$^ii{#niDXtAPZ95TSxbCq?|u z7ugqWeuI>KDVWYJ+77}CmDKRc_&0t#S5;yhA{$1GCVa9UUdGq|rgc)UqSUa2I`7#* zGHtMH%lhsS{_W9M3!P)j2sOC#=yebH6Oqpv>k+j}ZXkn?a%#t5!2P0^*g^bWU#u#O z!c-o`j^^$=Tu)LAZzKvV(v>+V#1(FQQHWl^@M=ub+2z>bVJFxQMw@83(Wl?dz@+H( z8qcN<_Nfk*t6F#D=V*Uv7|c&B>q1VrOb^8E{?l9jiXnEc0b@mY%Q0Q+e7Zi=eeb!8 z=spt|Y$O7gjElS~+WsU)|8@mvo77A0k?@tX(rkcJ*rDzzx-w3}x^bn3n-;#aH+&aZ5=Ytd`dzJhw(2GDt!GfkF~Dd* zfM*kh&#dVCh<+^fHB@{JIl7yj%FBc=V}^w4;!PYrQh8kgI>lloJjHCK@?Nr3{wEEw zx?^H2tn3ZNRJ`_L&53(Ii0MB=9P=_Xp!*{E%33%HvbTCN9LPR8*U9a$}FX>ZW z8sz^3zsVr_t%oc2Xp0T!k{ttN;o~_!O6f5csb31UVukRUZMJ%GD`Bd)J*&~35O-57 zD>)vkZq(B}FQmn{?6cdK%&pI>Ds2&Y1TUXuc>chkULk^T$o>@Fx5Q?fVh#RT5Jwca zU0TCM^HZ;Un37&xKqlPJb?I2k<3LORlGVUlO-xpUAug}#DX6GQ-w^gxB z@p$Z>qsu4f4Nzm(8@i>pRRg#T94^O~N>^VLvrHcFk=4+?U}Y}N1Y-UHXNvioYFV)Y zzHfV2lDC|&r*gDpF^ImfkUY;7wwZdf|=iXBKif6sewIC<6d8zt8H8b5xBFoNzUTzMD|Rhmk#>Rm}mAVl* z_#wO?yY?IMNt9mbh#wSrVgg`()BUqe@NIewR|hN>@RrL0D2w4#81q&cB57yfy8=Y5 zIA6uR&sMH#1d^;sp?KSMziW%)lzRGOTZ<97_f8#mVu2hE9U||o7iG)JN&D7`Rwrs8 zM!_xP8P|KO^5D0gf&|J z#}gv_GXOg(u#qr|@L3908VO(Zg9G-(YoqtAihBV>51XTL-Zi2+dmNgr)mQ>taqWo` zRbpY^tu@b>0(gqsHGZ}Dgr+qfuYp1{sev%HBJgWP!EV)#40@?M?W7qaA~;p)Ca1Jh zUkzU0GO#b*lWCGW9#b4un+ZQ}BR+hvHn-;qH&LiwSTxS`*&%{BN~ z_2(>{XM(236+{Hq4CSRQQCM$&W4)1VTW7WCBNInlda6S(PUq4<4Q>JX zVlQ^01u$|3E(W&=qq>fE<`?R=`XXgqv$G13kq)N=qW5M)zAY7Xy*eDiPsg8F`D;_*9JzI%eRH7GrYG zsd#FlBea|k3~f002&7_Gh;#^~`q#${8jUWVS~P9K?uVh^(t0D&)Z*KtRoU`u-v^a_ z6%;$EchQ7;9&Vybk9mtJRUSEuft=T@ZOSx&f+hfYq3v~i#){SAF5U^BDQbo@J6VKy zDzbu56H7Uvd}1Qf_JkVpvlx(Y9U~iyxUPJ1S+sjzLxG<&23<|gBrikKYL?ibI?`hdXywcz%}`jC{1gYci#EEG4GJ+j_W-C&B(a zmB}$uPK^-z8nwLtBfX$34AnnLU!P$| zrI}D_+8Sn7*;mq0viNPCHUXxV>@$(q)jw$(7#dfsTv^TW4 z?d@1nX()$h52eTNhN`V=E-aqRGw;% z#>Ns`iD_QT*4PsMtA8Gj?XTe+Sq?F-Ke9@pj4;&=PzisG~6 zhw}9`PFQQ_py{>x>A8^w3N?4!7Uw;3*9RMCGs z6dBYfu|e~nA3koouRa7w^K-{s)vU+t+YHTA#)drS%}gY~?wYRNep`^NP{ zvBCPy*Q=O|cMFNblKJ*o*vt7rAP?mt!Al)(kwa|{R;B}4;lvHcS?i0p39Z^2?ke3k z8P;;7Is<0<(XaUAy@nPO!LzrwscqHPUUmKM9);C=>ldvSTum1y?!p`!Nep7=OKe`< zZS9^h8_8sUE%}w_vKFwyS5w?%!=?;vU#>x2>7u{}1;(r&N$@VFT@wDFJGm}mG9?l? zld^*EK{HV&;JCH{Idq;i|HW$jnABPG)h{rRMj$XnKVP+#-&Kr= zZ0qU}y+5p+XM^m$F~7yBDdTnz-nW>1K-Ok9iic3XfsKfeQcGxrbv3g;kB$)O2&jw1 zt4|K?S*M69ND9rOI*Dc%Aqe$;Znl%<&1;r?TRWw7`?D_QOg4bal6u=)y3}2XJ3G9SZJNfmev$m)HS`%z>fH@ zB1e{8@_|#}j(pyVO)^;XliMrMnijWo$HJTGii2Z0ib(LR6Y)WO{XYy>3k=sN7@KVm z=<>=v@TH67ejGrDvD8aUPdZhj`hiuRabQWMDA5_%3@###2iCp}P<}v>@*l6TOjlg3 zqzqT@X?)lNZ`<^2=Q?lK*~a6pm8DALTjCHaK9Dy(eJ+y6wXtOi^@`B&#;VbC=a8JQ znMr@Ovi0s;E;)uiFNQ?;C)JPBKfK5;gzA+&R?=vRsYHTmRa9OGUoAe>CL`e_uJv6Ly#czMYe{!+MXzr z$hOi4G8fXOcQ={p(N#RgyQ)iKPT!^vIO#R2@J@s;xGuxOR-QvB`o!xJsw3IyKqaP* z9r3ZieDSSR>;rT2@dKX#@blli)+Pf!5y)Vk=K*{Kvs*HlVY-6*TA>y#6PN|w$60us zs=9vV`h@h}1O(FOZoDNQD*fT~d9&b|SF77ADdAJ2=~fj;(vmf_YTT;jmD!6Z~~v3F#4G0v`b(?Np`+1Op8>-JMHJ7mSmIai=SObN*s_ z6iHc6ni8O8=fMOZcfr}hsMA3A&5Ir2J3X%-?~Gg4X>V#x>1One0+RdH?&2?r9DkJD z^dNWBe;kel7>;##-9l&Jm2{mq@FmY&2k}Qaye8s04?84Z|4$2$c7*TEbeR z$xiUd;v1@Sv#yD^da#XeSw2{SloZ6^uyQe76at=vtlTCz+NWN4fwxEDY~RsP8U<0i z5{sVQuH6uQ$X=m+bsmTwEjf9QQx7t+peg)}9^H){3LRY(h*A!T(3CU-Mvb+2+bEjqpd=mr|=riy!=B*>7}nBi=bi@RkehTvK|osdBAEW=v? zYha!z+n5&srAFxS4Fzi=9ii*iCvd^dNdjU%k32NOvIN%bJmpKR1SFfBrIqZ_5_tTN zJz!6~1_;1sfj#t*l7?6S*TwzLH%BMhyS5grI>0=qp zREc)9`#}o^kll?+It7v-z1b~3IkE(6bKnv?&V;=*);1h$tb*@w!HR-)UlqfffClWs zj1EHH9XX8F}5yFV(~!rk^hg}0QBx=PSj zs++Km@no5$Huky3YZVo>1pKVRj#+mZEA~V*L)g)EdP2!WzQogaoD-;L>n}bRFHIzb z$+aM{S`|u9nrj(4Iwsx+22#?kn4*fh6*Xs9|R`5o}OZ4Rhr*E zpcfFdYU8hdvVKM0Nu4bt#rz`GWBBW#?i*MPxESNm>APqw7~{&eLr#d><~KI@ovgin zcip(3+w-Y+Zx{|X&&km-qH{%4*rwPi%M+4ALF&UV8*ZMdWc5{N=}-@KiItdcETQ!I zgJ)?_w#-XR)8C|7BbJ!bWv@0xf;G3$^N4-Hvjx4pV8BegXf62c$RdFMVrw68s?2$3 zk#zgn)aX_f(gC}}yOV9lQuN%ubm-AmjRSW8Rc?G#<&9)gzzETx zd>X#e8|V%Wj)UttYEU1wzlc2dC-fttbtemP1C<8U8r)XKqi~9= zD|JoGOCfp&^q2JFY+(UJ!Gd9;5LQG12R_K^iMKyB&RMcML-(kNiD!nV60*HG#J*f# z+@sw>8W}C{5@hWB1$QBznWbz9(){*kB2e~u&(=B_+A7%kRDg}XX9a1`r={nCP$*g? z#3K4OqDly8YID2zZARVxX8}C{gr2-yvGahV!tIGxNh@M`7HqgKtn81Mr45|I-Qes*gnVPPrGccDG*N8P;QU9iL-XE;l_}$?I*bI5}T$)ds z6RJsqbw$RtrVe<=S9*Y^`&mC9&CXvI+TjDRZWTFjJ>uk1U>hK(xQ>7%RJk4RazLheA6SbZY z!+49hsBg)Y3>{`7KQf~Jh^`t7RFgPP(#e&A{~N4QRFsVeVBqqUYx8xZ5IXAn(`RD( zD$MnB^7k+5b9$^8NgOyLfAr)|pZ%718TYt$<(sV5kq2IZ#Bp@BFD1Nh+Tc@4ctI=2 zba9_$x8)FRX?=ZKI6%f+7^D!I9N%aBu^d(3HKX5|ya>Bmi>$6c_F?klgJ6pz5ubUfDuInWUvEpVc+F zAJJ~?Xkl*!=SOtk>X=6lNlZ}F@y+SvBPKlah`64ijPL#fbUQx&-qe5LFYLCSXtgio zuMqpcu-o6|DgA%PZa@DYV7DobePElv3Bf0)bcdhNM<732r%HS1Z>Y8W3CaHNt994( zvBv%ihN-muAlK6?$3l|sAuhGpRv16<1}UjorR1r4(>*Q#vR{IAOAnW=+k8N93A<9N`P05*}HMZtdD>y*#>06A-6mY zh=grZmMj#9>3VkK7F84E%Qvlgy0V8ef3R*wIn@|369c{_&=O>-HD%D+MOiyLH`*>#Rtx@(r3B;11} zeQm!n2pqtzHEM4%;zVwbln{08#C38ye{f z22%*1-ILk<3L_i6SOy};Yuk|Mpg{G{G<_iznX(rT?3-lHuLa>@5-u-(Rkuht@_t%) za6bj8TO8Sgd{C}@!Aq&Qy*qfwIx4usQ(iwsR zgzAHB{*9z?27){nQ2lnTK~%k|6XD%tuGB(IeyRi4rcsD(N7XZ6FDRMEfXRgjO@|ro z={Ry+HGWP%)o}#m51_Ggs0-bnHY9|PYowhIGZ3QVXpsS6B54NrD2CXE*ybk6R2=tWFDqe{f0q#K$K9B?%gm2JvqL5{l$$ce z`cJ?@ZxPN>#N8X?w#6>@owu8|YC|G5Zb;>*r8v+TI@k}lmaeygglnML*Sjo!tR^Af+)~ghEBZlh5HKl~Whsv4h<#>0J?>mxnEBI%px%XMf*TJAsrXd+? zv7fc|o>Is*=wavd&%_(?Rsm#INn6tgfGK8-^B8GcMwL_%ZF>Z^_3qrIC?i~5#ec@V zP?r?o8HCmrgE0m^Gyml)3r%Y ziUSk2UmPn?5&wru;oL6(FI*=m{S!PU3{ev3){De>>?_Ai{9L9`*~v+J=R2Td4GE+8 z>UxnthDbZqPUmvLagxvT$Z@z4`^gjky3L(|@l;9)9@hI&(;W|>>~UqUawy5*)B9vO zpH8L>$-ZF4tTaLDz==w@hZwyiVn|f) zZ7jQmo#FKZzqDl`@ce*X^c@?cj2}JYQ8xQF$oCqD3Rm<-bpIxXS`OmRK^h9l6N$+1 zRfaw9_Q9SB35CVmisp%Btf#$4$}Y$ylHF1_*t*)#_@xx~6#|DK%;x7sAvnr@t$&O3 znf&SvmF~VwjEU$nH&eS?q{ZdVCm>hZC+{J)_wl#;!QuApxGhd})La?{GJv%M{ji?+ zz63hcT=p}5yvU*cgWRvjKCWJFqYxrMsOf|ZWf;bX0@aTWZ2+KTX^9ebb*miXM_j=i z4IoJ*Y)zN1Gd!Ep(-LKg6R?M%GIDGvM2XdCka@D}|Q50l{zy)^<6aE3d z`e#({UtgI4)~S0HXq-(&PX5j#pCbKY!S74$^h^{$k_A*K8gd=7wt^C5eGwZ4J7RA* zXvJt&6iQQRbuy10#sWaJkQHkBrL8;U$zeqvrY{k8;vS(^AJ!SVIIe@CdQmMnrx+6K zuZbmGIit!hzfO*Z@J4rw^RZr=Guj~!hIJ)Ypx&WSepeV{IQzI4B-*?^T6Ls zfeY?BnK4#mq>S23P@`@6FN^gYk$0+CGkE;rhLpBxR7pR$a+v=KlN#yzYhB=rm~l`3 z16t!Fi@2Jd9dho1x)92Nj%FAVb>o#d-U~Ec{VDL7Htd3*J>EBzxgJo)V-FGWAF9_Rrg?gZG8 zvd?D^D-g6{F)^__MEI!9O@c>!%^u(@EFX1Z%DdR#JyPSWe(r>cBHoGiO&&f+C;~eC zzwwPNE9=3j|m+nk@PC8$o6{+ivpSX{mEjDj0Iu2hg zs!!UMczV;K$(ot=@j0StT2pO_FeC@kYySLdRckP3r%X_1Vn56xi-YtZISknj;cDew zzoI<$Mn%;{&x7=HMG+>$qNFmKfxA8C!IEv#Y5#9 zX+~t}6ZT!BRm*X2^1=HYaeI4|GCw1g#3|oM%(i=S9*-<=dQ2bE*V^*nJH7zz8LPdh zm;n{0e;)oUbe4H083wzL_|~%x9BI8s;T3tjM(x{h-n@!2;kYxvkPxB*X&gq*Ky>iw z{=@0x*p%?dcAP{99t6u}%FPd72Q1b+u}0EsAEvk^)PmrE%-;$T;=g;g_dkDL^f`US zk)(~CNVpiD#m+39#Y5y$*00`?h`X>$iQ#a)cj0;u=6HwODfS}cWo^bb-U-iauTdg} zoz%-(xU_n3rNeUO^F7bLOw`|t@9^&+0>{|esg;IITP$2M;w%z*?{E-%UXrJ{nmsqY zIQULAjWW+3jBIn-dOSGcehsEygmzHDNB?Tkt=dghADyT%zm!!ToQ4ebip__0T8yT$ zeiuI!4Rb`77Ul`xh(P$m;n2SR8E`;z5DzqQx;DyiYL09LEoOp(ws6`eR`DyHjMq)P z)wVH{hF82c3o?#2-QfULAtGw5w)L#q4BfmtAHbz!&j|FI!l3j+A`V^ad$;PWZ@4X2 zo9x=FRv?-?usHc(&DIbex}Z5$Ja@j{x#o0>=6iha@p? zHM%w3Rs}k78iQm9&E~}E;oL1;dijvo3EXTcy2kj7E{&C6!wJIK5@YW7j)=7YDk0Pc zBX^dIJE74|g2^TG4RrB+{iR8Zrx}d zIr+YxzMT6uqf*1-et$EoU#4WP$>LnCUm_fu7~UayLTIH|HKb)#FQ^n#xF1gG)ERF%cp)gZcdCRKjd2Vr6;Rdnm zVil}o9df4HUE^3jAbb%fqJJZ)He)<*3NB9Qmk6z1xk!VGp4jqWsj4|lZc0?vzGu~9 zZqdQxPH9y-fjIxQU}w{N@`KQ@1yuau3cZ(o zCtZ|`x&MpKh83fjMG4?#xAE>&Q{p!}xqq7`WBPlKeG*N>=#Pm%%C#5?X{Umg90||{TNeaBX!fb5 z5)LlP)LWEaIw;Rr+=~u|PtAr65;jiiSMqQXGPy8)I9tL7CYQ~%NVJd3i8aidDaB60 zw79LF{=VaB(dkro&7QAgWpM57?52|Ge64OxTCEeSTJg@-R}pn&yBTz`glvF$*0&bz z-a<(Rk4dmXe*~EzMYRhM=PEkjddj;>yAo;nl-EeoHTzbN03VZ8oVtypsA>e|Kd?=2 zV)z=lggJ;kkz}W;wI$rYgYnQ0Y$cO7q4|t4sf~_((vkTcA3R*8okMo`qBlBvYSO!t2u;{jp_Rub&7^Lxg=pT_EO+Zy74X-xuEuQOeNJf3eB#^7Gn4 zQ!`(M`}oi1=!?JOM+V_{2RHtir@XkKbt^d0J(_D%d`28C4)<%Q zYDpVlf^aT#!22qj+-|EFWl7XoMnw37V*>YYUSyX=plbO-LTvYWtAg`#e%I1u?T2qu zXq&`MO19;HGSY^zlv|)X?;*dd+U0uq_Ch*u6vCq`6MseiAn;AVTP6aI?Ja7t z<65v=EA1y$W7d~sQe)2hGO9e+bX6cDG<|pF&T9RFGAb9C>Mk{XeJzlYZB&lk zEAja^Wz{wYp^^j4VVo_)Dtp~em}>FC_sJh5PV39t0Tesyxl7H>h$m4=QSp;%qZwfbP|n(9_M+glLo{n6 zyZ0#r0cw*$JK>cez-%uzNtHV4Kx4A)a)p;nFfalXBVvJ;!Nu%%jiZu!zs;MpcW{4r zp+D@#|MFuU*!1rWJtBap=GOeSiH<5Yr&;9wnY{3chCyDrc-W)3X^yO<;~D#gYLdMQ zLf@e4{wumDM>?dzK}qI83b*bW|5$ajCz5lZqG#46W7KqLR0Hy|4yf@uKg@62GV+!9 zfItfSkaDeeWwyf)gG$;_lPfAgY$*dn>DrDgQ2($KRZ@+-Mkvo-MZZY!I>hyDS{yFd zN$&!Jnk{EL*t>P$s^SvV8iznOK8Tc~9^N`ieLVR8LEJ8==lqXa3Uv-7qM zzU_S(DRK{ovE=pKG{ZXum2}J3gJw>k;N()JU~A${f#;c4SUEN*$@sWF&o!e3YQzvd z+%Lb?@I3!;Pb5qHQ|T4Lq^mg(?IqHmV(qHez6rR?uH&i0fPj7))bQwh%H&68`+4As zlb>IbuysrKbc?Wco{Q^F5Dbs09Af}O=KBf$4Yja|vxnHz? zK*~U{EcFUk(uca6@rPu9KSv<~DeV*oC_THY(SpDUeTUEUOX#OAu}#j1AatM^Q6kA} zDRG4=4K8f?>7jYo|p_i9?z zSi$v=@sNDD>fii+;I`(jNTLgi+MsY^IT9I3JtFN?+WBMDv?VM;XJVNu zJFo96JkLL2NSu42W>u}j#G?JsKLlm1b$F&#oYEZcSZO@&FbX`Ro*4|hdVPe@_G5s? zm)~kuGYvd_FoJ7OqnDPs-QpSy1VGuLRxWz`!0>xb+^U$&t$HBP!r71BKXj&m(SO9H5)_%)=IB&u0Mk-2<;}VeJlvDj7>l3V0Y#>m zZ@=1YbZ;=!!7O{Gd~PGzEjd+9tJrYgF;;b7c}s=0`c3hKRlS;4&3!x&)!J;JKTbQ- zmRV2k1_XGBBf!$0+;b#!=Sa=^HR831*3LnI$_ZQVS2{;!EWDqp3 z=*DR^G21=J1XJNxYW8F7WsM>oe9M}D2tF3OVcdMO&PbrBM1p2>+PqgiQL{-z(4_H} zV-bwAnKX0DzJK$ZhoKTof{%99R>IF4)l#`6)3+FS{ILj6F^6Gx9CXW4?CZ%@Dz@9= z?e}H`_~q@Oh>~EkBHbvP^`nexjn27F&GhZE{~LA1|DaVRW{ygJd`VCXg-XoC~A^DGCnc`D$hhwH9O9bmVk- z*sr=UpH}wWl5G*>?xnop0fLnAj_GueG!DoRhA~@&V-AZH2Rg*7TcG`66L%E-W{SwW zc)EFF*)ya|v-$!shUxebOr_Vjo`*LgK!)^Qtzqv;;!rN-et^b747 z0p{J&^3(r-MNAR(fs#3N`hPG0dK!l@H*uV|k#XMM=)d=}qOwD#;vQ}J%yQOx;IYHI zy4`l?NwyyTzEUNQg7{nCRt6-r=Wy%9tp8wvcJw-BSVBT@QsH-e5$}?5zUMv+2tSa+ zD$698ldYt9J8SP#p4r~>nO+=b#J8FpifTCxUBwBXO0C*z#2;$rh=X{b0*zuQ{y!Os zoPa3de}o0VpT3&d7Qg`(@~Ii$(O7TMw8}kR=sv_A4pCv`4K$M+=E<_&y#(Yot>gjr z$!woat|tiDF3CCh8i5qoSXlp?jPlR%!dEZ&5BF_z288V_=`n%BoSDZThUUFV`iHFrkZ_h`IK-brdc)u3Fcqv;xNRhA z^mT{x- z+X{aa;6Y`@G{Brq7wF0TBwLEgTge~{C^>+=2K^WRjFkCqO$ zB!lwVxs<~~fYU#s$L{s-MSv)Jxfl`wU5(RoK|XtcT}{*<@P<`$St&j}>Y4|Rj`RnVB04Z`Hcvy1VgkF92~NPUvgFJseb&yFcqN$yHNzi}r2gbJ(e zPieu00EG@1e{yh0=@GR=|9dMx^=+*W7!o;Dw5lL6j2|Bqs3DmT;sQ-sQ^y~+uD_mh zU3xNc4Cn!K>8lSYcD#XKXM&`}qym|Bj~+CvJB7r3#AL2W+1BwY;!JU(R>~Pt`qv8@ zD800N&x5kpR3;J>M*K>+Wy&ul1v88cfx|1~;gG@|c&q)|3@xV;*P-8> z5P8yMPf+2b+?;D)zW9Sc{qH*cuT{lYjYf%iok4`NOw6a}_ICMRy*nJKr(iiORAND_<1fFod+;S14|_**|QSfuJnOpgl@j zSdn-%sw2*E$dNB&nT^bpBTSCgl6MdCGN zha?Ud!XGRIi^4a+;cmHUrWjMzuS*$nztR3(fu*w}=F-{S_#3VDmM;`Jm~=O>^m}y6 z#(tF-R7QXPQ_JqK<;i9qCcwK^fQE>b%{<$E7sp!vex2uM=q_1S2tuYr40YxfG}S2M zDK9D~UvkzL6gAb2SK-(EmRDbee{EGjBr&30ovnkkB(@|pD0SryjO$$O#Ht8ob+h>^_RJE z=UG%t)VY2)cjOnlJ)o|yDX|(x;Tdhy^q{w6W1HuwAROp|evqe4?j85}l44E2VcS!c zij+NLODPj=#e2FL7h6N%pIEzD=03YASZ@A71FJ8vZrwV zRB4pY+(qgG${6EWRTqf06yPxj9JPJhhWMUgo_HL9eTCU&zNYWRNI9vP`hQ zhZzFt`E8wWig!Y?^LMcn5pKz1?2*lPmFj{ksEBXdUin-^%dfZ58!xgeB0Yl_=bJ`6 z(&U(avm8-6=x=5l$&CFJx#|^sled>LwXHQ@GB|pd&f)}P9b~pkyq%?8gt8| zO%ltUt30!GornwjE`f&pEs4@^PxI2=6>J0#%}wv|PknxnN+)$})c=;03<)(S|0}z^ zmP$^=Fs$ZEone(X^ju%u)4VCl=;OzYU*d?gv*QDdq|C1z-jY>s?)%6rzeFK8af*?1 zLdy$vFXMUzN<|u6B-VV1ifti};QCOt*<_(?xX3B`!>~uNx?6BtxheoIIN+*Zy>(Ii zMx^!1jnAs|vU`%SxfQSjk4hdZa^ySvjg?z~0z zdH3AAcg8vIjJL=A)6lC{*Q%;DYx?{O4-aoNR#f`4I~uu0m{qifPZC)};HEE;NsB=_ z&Dv8-IpCl@_2w5(=qS6{LMZzzAN__q{l|{0mw0gV?__!m1vCU)hiwUmTDC;1;F6%G)0G=FI>+A6icl zAyjQk8tfQUbrBnnP%szC*2(X;S}QkI3&Ba0Y*chlS^a1wVxADa_fwtsQHaJCCI-zR z2w6&wL@|c~Y;3&bA!FxOoX1tWMgY87W3` zf;s3*mTrCR5Ewjes4W7mlfO9vh9iv6xc9Rk6~)@Q9~PH21XoYVn<$PN;7PGFR>@Co zE%_jr%FkHYg}QS5Z4UIdx)-|T zEk_>b)$!;rQ~E3O|F>5@9U}xUc065E_RnxV5cGo&vJ9TJK?<1zvCjzhWKXI2OY<9d zJ=<1us6$;bRJB70_|WOf8Q5ZLi7#P3C9Z=qClNKk#dEO)H}9~tPZ_Vi-covYT%M=1 zXH_>vByUf+j1%yv{*_c!+>RyOZ?@_aLXTMV#p=Z%#o=}J86zi6Zgqz(y^%nR>Qd&t zNl9qUrKs%nX5w9R|D0vMNkWtj3tXt^Pr+AS@(Xv>97tT zVNU!kKYtu#S^7>WcEG8)2kVe(u$d5d*;6ws>=e)lW5kWfzQ$lDY zc-6=y2BpMIM1;)t)>iQpZFl!4cwAh6N?{pH$cJqJMqO|#QdJ&-N5j>NB#%_ z#$bB#3E+^Q*hkD@fMYG=UT`2;9aNykFDeR^@?o+hVcP%(Z8$8MK5;F#(90j*Pge0{ z+w7e$wpm?17IAr3fNEl$o_KNYF+=NZ^(HF%T7mGk6!NO`nu-7v7qp_|#ee^v&mf@&Qs z*rdDLJOczk63Mvfg$XqXuOy83&z`<=37$q#6}l;LMwwMZv*i>oSWt$Db z)x)9r&1e=sy&psa{PD46Rx3BQ>+!UV&jqAcx;3w(&7H1gWHp8w0ReLg#EFKw5T}3W zu$#?8yadl{YU`6}+}jJb>f(~LrUOgv15Ne&b|q<8<}8pcn_)5l8)x>ZZ0Q&8Bmt!s zHLJ9Dc2w0%6pE_?-hlq@jJfpl2!%HMRdrI|Dg+P7!hh5In$&;`7d5O})*geRdVUgb z?b+L+VU0^+g!w4hT-f&WX5T}Bil2`=r7>&CLa6mZBbTZ23H-{AEUk*;cI4QacRo@z zG$Sb!HWBP;t4Wrg`;PEj3UkKwfsiS6Fz_WQjoyo}s;?%X#EGzy$Od8k4RY#%hd%mC zf&d^F1K5CaFQ`wVq&Nln8t)zfc~pg9AM!Rd^1$+!LhMMEKT0@br%}}Tw$=*B=BKV{ zy^|&0PPx^R*B$}UKz(!|Aj6_(Z=OY1ZgVEu+mSPubMH?&19NAOMq;D`yx4m@@U2e)q- z1j1=j3}d13Z;=Ij`Nskc%BdZ1&012w*pcKF-GmBTG(vAbi2mL19QGT&N$a4$) zE@sm~M;B7Ne%ygxby1*?kw|q#{OVCjLevkikE5=LG7yo+Tr08o;Z?apD|62{eo4(bfs&@xw?aYl$q74SL%%H+FuFA?%n5!#oFj7 z$IPb>FU&9;S1>7zo&q^FmM`sS67C+P`I_gqYtQUiZ$7}@Yzpn8nc?%Pn7M6mtFwSkrp*3w%hEQR$*V=|%S%R0SUU_3;U+WgFM;%*wN~VLd&2CDga`zqP zZB){ZHdcq{M!jmLBJFqsg-hw2Of6Pf#8nehMm6XU$Ll*ciaz7QZo@RDD^U7uk% zVQzd&_+AEtl7J9$=5Et`WD%;(`zut(=eGe_!$A6t0bHp3s8jFbZI(l&z#tYORlmF( z$Ci)ZIW6p`Mn={8XEl2D#T$I`M7m$>=fFDmS5iZw@!zCt>jw%jgY_F9L!XyDiML|~ z;`XDq;T-i(0G+laKu$H#FF>i$HrCL!-vO zXe*;jTVG>uau>WOP(HJl0R;QJD}>&-NH1vF3|&46Ar*I_j{R<5(i;!tq`0m;1lb@agXU8a z`m*(}9%_E|8i{;_W8m{s8J=ze{7yy%ZOMu1pkht-uw;G zmrq|*;17wj;zhc{LJm^`T;a7txRwa}Gq5sVb)^LRZgyq#_94A zQ*ulXi$uC4Z=dKA5F?*zjQ;G3*&KTC1PZsLW^?5rV^4dxyTEtR>=upxHgopiD>+uY z5CJ=JB5w?^Qzno{JEAo&3MpcAaZ@RnsGmeeSg-Ge4a+jlEMLt*(1w1OSP+2UbilEch9_ajPiFCDIn$@-qd9ue=Aj= zliJrpD2B^}IzO?*xlBb*2>-s!dz77>wa#AcH;EffuI~nI;X-lDuQAkNT?4P}LogR! z<~)f6%2rGen7awlvcRuJ{f3&t?E<=eY`WwhX#jQvE-N~cy#J*4Ipsl^Tv51iTK&q=fZYTKSleCA02gj;+7#G+5Xgcd~qsM zj>vl|_^t1yr1G+5gVh)+`ceqKz{R@!)B{3zoQotInobjYu4pkC^~~79?||Zy)xV-4 z9MJ#PfXL54$ai;4q|zUme}gxl!>#h}{B# zMc1c=OoAmxR0dO8$=mae^bSIZ`H7xSpG1@pZ&)&uTpW}}yWcB9 zgF6&RvGgLtOe@wa{}HQr$uup73=(4Lu;6y`Qqt?-b}RMJF8+7gxP-;c7l1jKgq4aQ z(3@*zsmWE#3aCitvVlqJhZu1ZSCLR_AEox6egR%M5Ixy|zenXCCu#!SY5vs9`@qzz zjjIfD_2IxEAvHXlk^o}xcz~^guAt)rP{09NP9FT)WPIXnss0;1roD-ok;idWpd0 zFRHeOm*;)W2}j?I{ce^mo4}S_;ODLP#LI{oaHuu{q=hitvKPfvh?4#gwT*nSZ#9vz z{L1gWuzW>Z(7-8@lRaaJ^lDzOP%8 zcw|et`rF;gF0MsRH8_Yh!u7Dd$((NjJ1FyE6#UpZGt_bW;2 z96x&4g4ER94B5aQ$~w_hZTK`Yrzcw&Tf}fdsP0mTeL8=OAOER_KbcTrebjQ^4+k&b z5^9RyxC*{Bpx#qxN{YEkqq*68DrPhH$a~qiO?!h=Z`s-v5iB!cBn=eit_A9_9KH-a z13&fi7xYi}Hrgmu6&~_eir!Wuc$Q}~N-S?zM4^xg}-8+jZD`RuDQ=-PYf}CQbASm=tI)K zy#2rW(Esff4+YXD7x=&nT#Rgz+z)j7yFH~kG?+@?`Mg&xg(2X`cuqpYK)4-p?6{OJg3ZF!_VIx^R+XTbll z0r7J}^fF^aY|ZOLqHqG4j%q$C8km@{WZiPNolK>TL!~n^d6(gG4=OA?lJ$Ac>kujN zp?xC#U9z*N7G8g}B`YCH&KdPM!x%^YlbR#)~6n$Nk zh@RVK8SJ;oRGl@tS}1mQl`%cHNIoXskl;{>;dzfCYvFoMywQc8po(&?^d91*L-(^{gqx*w3CrQgRD2LSm^R7b@)LAFhp8&_t_kTYjA1Uj4kd zk+V?=r9?>(B@uQf9R-mLFO%0MwhOo|s5uKtaqA$a|hgF?M!ydTkbO+C%PUDfKSyN zdzRLLe@?hEFe>MbN{eAss(uBh%F>;o2Fg2vNOFZB?iFRGHcr)zGprQ79m}HDzS(Iz zE~Eo0)w>(q&5UN_V1p^PGt*?3;bxYbx<%#jnxXu_5u1;Ful5~di);prQ_BHp67{BX zQ@rACPGyTZ!~yWwnR4mpn}KH>J-*cjJFW_g%9Y3yY_q-f>KofGUi;s>o>TW@ z2gcu+>gCSnIP+gUzy8(p$-Lg_$?>eXn9uz^v*ptpg`5~E^!M|X-|zA|R94_;0t2ci zmv$Qy0wCOYaaqlo1)`+5c{0v!JixUM(gZy&488T+J627KZQ6)|6%{g_(<^ybncV54 zk!!ESDuy21z1Tk2U9;H0I&*+69FT~0}qxnuh^_9JC! zzr+r_0dP0e{h_7({oL;tlGtwFh@)q`7C+`ndCC0?XAkn>e2Ll{K}zV&bf-(BVCh)_ zhoU?du*y)#Ly(TN0R5M=TZ2dAdKnitKEU#*?Oe|@Gdm>TFZ?)&`^mLsu5qZr)V50{ z00JmqPKSc@-=rH=c=(rgDP@NbEvR;fjGj2NgY2Byl9!e@mC09>iJp+5ZH%DYkWM;y zj9GpzDRBeVqoq;ybewq;qm@8wmOb&K!|F9Ui3+1#hNlM?+u@7uT0zZ;-H!sL^&#hakv;O20W=fg@Y#-IpMPk@}|y zxZorKYL(;32-Y%e!uFojX!yinxm5p0#OyKk!eH%*j4M@tkM_rFs8)35&A1k^eX zSz?sjcS!xGU)i~H_Z*sg<06@gOUP&$Cq299j_bTITn9(vtV`6*q@?v8Ny*wzFm>D0Q(nFwPU-!W)!KL9PN;fZ+({gvVJ=^wabkqCZ(JH%U$Z#t}>1{ z9uIinM`c^>M5X@YJ5|$?y`>N1`&|_r0d<#nUlz)$7=K)7IqE|A>sdNj*oQRKKC4eR zM9<-IBW4jAK;9>14}`b@T@nuG?x_iaKqJaEQSU$|D&vz=?v_ZZrm||(*Mu;wJ0jD1 zfAy|b86-e9zerR_ZprUWC7ubRsXQ$>i352$9I2D;-PU7^(9TribCPQ=Ve3*kNv^)0wVsV}3M zAsbeTGkeu#%nh)d^`W0=zyn0emyrg*7?>e-0H-A~Qn&*CFop@n09}zqj=2MZpf4kW z7;qLw>bCL z_T}Ay4+3Vr2WUU}zvs4F8Jls|WDvKg!pH5z3AS$f9 z0?`75e_any5$x<2d7rxgn~G@#sz=Z?v@z*11p3EX9;J$k!H`?3UN6C0sgbm~5&;M3d`uu$dz* zAau8bwfxkPBXB2SAD&wBTca%EYejrvl!S$q0=pkyYsj*lyCwa858q#40)SUT0&(yB zcr%1AZvfeQPeP z-vfWG;4j{S`6pKJ=cYfl<$qiEfBuRyH$@NW5ruBfeHG**%vCaL$hy|4!GYvMF07BT zv!s0SW~zqU@tuaoSD4*lq0%01uYxXsI*$C$2+aIn?rn=(y}v3?8?5$D^Mp z=7O0>!Sz*8ol^T!4KEfhh2{}_s2z)afb6o}p;bb32My$vGICUAVwmoFm%25h{X^;)QSr%WF+ErU1sH@=9v~$^&yuAuJRc@?}8+oh6hDHj;@fe_3WMWdK)hP%(NxVPD zH?IQ2hSE-GxPzi83-6Uh4N@#8kVxIW3-7#3|5Z<5npz>ZRK$7<-^R1+TZ(#6-xX!| zfG685fb?H`R{m+a07`4dF{Y7{iH&u#vG>UxByg+zz1OCGfb;H3%pG(AnouAqyyXzM zx}`Y0+G)C0r@U@yY@{e(Y<$K{duqV5>B2N>;K9vqAu+;@#9QB(WT4FKe)M!C9ZJj5 zQ&TRtGdp<}cd7hxIi&!@%})JBE#da|8BEy&P-X7yNA}a4?HdFD_Ty)Eg40dWw{WJo zx#8)2mLxs8YsWD$Qz^-GK+<1-<*ZnhfS9GHW=`&eJ0|Rk{c6&EL}=e%wo|6Z)@}O}te84yv0j_4B5>XhBF#r*rVOc%=!ws9yx2^48s^raSCq##JU<7nFYoYk>#NXQ8oR5Eg!ktc zDwffAzw;pS|wYapWsw`X_ggBBuN05Csva6+r;(9p)jGgguYn6auJa4~n_9?E}{LfEv zLL$}|!zl#wm?hrJRjIg&G&6qFZr_wkoS4>`Df|BXH%UqVv5UrX5qKWIufno z^tuAink7rII9rYz$;{vKagcu7T9R<7{bMBapHgETfz!7-b*T4=_^?X*{Z7qu1t`)x zliE+zzexeZWwzeHP}u`pjHT(7MwBTY|Dqi%qWF(v>x(o6k~X{<52;`Zu*K|JL>L zmm9vFAt;ISc{4nVS`ifY8e^bPCEF$$U`MA&M6b38ZS+hQVC4_@dc=9ydZj$66Bzhr zBPV>#hN-nu#HK&^$We{71*^;!CySkpe0*H6Ob(}A)=1W%jqWo!X7^?`P>e%VjjGce zqSS&qOXg=#sZxDK-CfauG{sFoh)1tcSLAg=Z18@3$;SKHZyZZ3Kc9a3n$e6t4-}Ro z8g&rj3c94%Me2ZI&#a=|VtiP1=lt5q#Ko@K^B8qzvL8oN!oMDa1)Ah7ttAf|4L@W2 zzgPfdp>t*yqSwn~`yXCpwJ^py*SKYFIz}M*TSOoHEmi$bXyN8Hfs%rNLnopR9?0`l zK4GO5h`kRcpCkeSd4Jwuk{4g48pHggL#8 zM=ZK10#p&-mFV@{{Rd$DXz4iRiEod8vw1xz;DLiLT2LDXg#rC4TU3`1Q^eR?X{=)s z5;Id;SR<2>0n^Nw-^1zERf%h-H9od$`ks zobSq*wn%dw&B)M=wbpDBU>vO)b67Bzz54*`Zz0bJ)Su;+0yJ?SHAS%v(){Hp+SyR| zJA8lon$_tzpgc}p1Ffs_9Vt`j((?meY8D}d9kLMB`Kcx+MO(TQcYF4b5UB(vzY+}| z&N;lS)0WmfSuOOS@@n4$`g9y}Ld=;j7R1RRpKDpaurkJ^J$dUIUTLwwV-m&@8On7@ zCQ3rgg!`Lmd;tAocQ(qJU->WvDS`-_eb=+F9n{>+)XBn!vtgN#wq^m8e6*`&(v%AF%D+Uqg zs+(9mRX*ZyJBZC{2B3kAPxaT++X%Ip8?JiAq_&{5kdTD9#{*H!D3JRSYLE4zF>9IS zGG+Ogmh6GBXeRf-q`H z3*J~6In$`rH6UUr7R*Owd9h}PLV%j*@CV2X{}Gb&mfDC}xP zsR`i~tS`g`p_Sl)em1nExi1}$2SB^LZ`Ef9)v!6FPSw*&r574K ztj#Laq8&{YfKYxiV45YkHM6P40K%RTU1TiAP6`4n0Yw{`<)R3!tnO`K5Ebfu6=;x42%24C z0!Whv)5L;eyW$_q3GI=PXd3zc&&5Q$bg<&HF*@LI+J9h^S8BNX@pA!y>ZMbjPhsMQ z;Uc}yGo#o}@rd}Xri+Eo@I)Z>@m1&HMo1e(VHxIdFskHMQI=l$Bmn?ul2Z7%JbVls z)9i-mND%l}#iGf25=bbULSG{- z7O@8VZ9e$FMp;Cmlr^{r)WS2me6*3#M!c!5PJ=KwrtH@8YNa)R99X5hr4 z*3g7cd6s37VKa37D1lT8dma31P3#%(M^c{;9s|hFxHh4H*^$z|M5H()RQ?FsBM>kV z+L&K>Jf@9kJTZM`UGPkSoPh-ku(sxV0o*v=I~sFCninagSH;pwxzL4AkV+LAQ4Xep zeCwNrFs{SbH_M8R*``clL71l_kFe^z*x1yT5ba<6WB6(Abq(wC81|YpVjSyjF3d`% zZ9f*-j=1Lsv~CH3x~sCSydnlBCiCJjwemnrTRK1fq@LM8DLQvLYP}MlU39JHNG0*- zl2f*Y&U6{_W4(1>PLc@}QROZ=Dkg?bCKkSU%YWW_RS&Jl8es)pW0Ur8!4F=uuV(L< zjj5KYD%gcqD78$x0jGaoq8-SQxwUo}pH=mw2q%gC4Gdk+3@a1!M5za8kF})slT)4xN?zJ&9* zyID}(v`K9YBq7Z)yg1Z5&Z1QpajUOK4IZVSaf;(}%HXpTm*P0V4GEU~)_o!bejwyv zVE51>?}t#E>e#c1C|TL#W|Z59oCi%_YnB?;mqy21pbLa{od^)0Sh<0!y}-k&0I678{u--iY1N zm=sa&l8Ive*TD{3U1^lRf#@p`SC5>C{0BE1yHZ0I;-6ajFYpt}u*WNpcBdd-7)6uu zXIxLg<0j*oz38fyCi~`!(&e@Jr_Phl7iqE`;xv#AG%t&c{atpnc^Q6a>Z6YKnH^J5b>@vkFzD z>Nq-n0}27~bCoPlT98f;K)>l9RZ^JDYkpDql{}noL zdTOuf5I@2Wtq$tw=m^<6M-R;)8pqu?F;Lu{s*SsvYqg2ZQQ{D!b%*8su>b(}bE(VL`Ay0M?!hl-1$j~lJnoAQ1c%>fslT)K z{`GC;?>}&H@o3&QYG$Zf)VDs>T~+c=YifB)cN!;5qQp<6*M=~EHGejkms1zMOeHM6 zQw_a+vMGCa$cl~kCd(aD@O)dbLHME9!{ey|H32EElOL$-WCvKzq86wb;8&aXq*-_Uuy-blsWGl zUU1C09#J2sPPivNe)5>S^EOiwIY8E(|J(A(Mnmj8EVRnz*2=HWufsv`SMy` zaij=T9YY`g+-kVPz;i_;J5tbpg%b)1*Kl9&+3p}K-2WmISmM5i^TS|3V@0furw(Rk zYdct=aboR!=7S||U?9|Y-Xh0!JVn_dG+%CEZ#00rVzVLtLDm}mWV-6u3P-u(^qj8+lqeRsxT?DPE#-ya{GxvP3yL3_8 ziW4oIRsyto^`jEfm)`~2AeYud9Y`;o7qh!3PwOW2799UTq*c-ZP@?P?IHt-}R;JcJ z>Gj2FPXN}5aj{3F3^p@6mL3Q3^re1#RmU7qp0Kdk?bvY2L&2~Rs}3kf13NDL>*i(U zeIDHjwC!)5HD29$SPx-S>KH-JcLN)Rp(1*w>E zrbOvAf18uF^bjnHH(BNMm7KHyh_Lz}Ai^f5fR?(SNXo8Y!ZCxJTX^w#SA`})y^m3v zUUWr&BRx2WUv;7Ie7t(bzIGQ!?ajahm$1+J4EP@K%E@hDYL?o*l2uyyC~J~$AZVFe znnp!OkBS;ARUL-4#hDju)@dAPCU=iKjL>T)325wN)kd?7wd)J|==r!-#SLmdV7$Z` zwhA4U8|^e#b(DV~!G;t8c7fZGZl`gGLE^(0M$JHV03)mb@>o>RXm(dE8WwH1lZdf^ z?J#2==jKJZaxwiRZ_ris7p7MUlr^!oy`Sj`g-OFJmrW;`>nGg;CWXOSYs=-7w}kbi zF=YS-7dS)|fRBy)3h6VV5iP`K4yo0jxSlcPjUnnEiwk1X$kmPR|KshYI{blbTv!Hx zk=0tH>?#$(Ol`h{*Tu>JWHEcjiBDZ*z}Z_t^eJd&Zsp6WE9NtMU<*q<4$Z4~7zq|V z#lTcHPB;y0swV&O(or~R1MfaT3`1hdeyF+Hw`*peWztsyKv$JAMgSZ#+J`FEK7j!F zm29ht-2_mgM6UHeNGc|HSozIN3RdmzQSl$x)QpvYk$2V?g;&6sVuma??n-V?jn!AY zj!pI^t1KnR|24*$S1qhiR9bPJ7Z6b$3M^+qKIO9`EB`e*QB^x z-wYUixqD}#^2$_EGX6}?w)|+SfB?jr6q}oV2hb-kFFvXt^b!pmRfHU{1jW?$=d{{9F&a?m5jDlIHIvn) z23W(@R>|$QMUOE4GTND#epiO#b5)FpB%P{e~+IS+{Fg z=MXpO&|0O=(F!uv)bzk@C2@fS!tD1=r=BQ6xb$T(5yR24tQ0w;yi&!afsccRE5vzy ztgKJZ8~^|>w4aicEEi&vx`zUPrf_dKF<=oZm{9@yxcH)K(1%hmsel&Ctj=<36j~H) zHUL1GvnpO+Of!R9uvLNEuhzRl$FK+f*dVpBL4cFsMRf3R^%R6`g?wn7nX-X#AE;ru zdaT%SRDtq2?V@t`9&k=$!G_5pDESX6I~_bqKSzlU8drKF*3)jFcrD;81ptAUP3z&r z=vx@mz}X~@0ERE4Ib$_oaik1}uWbUMm&d;Q|60KQKej$$@F=3fgyl)O#lCeqrt2=B z^uTqyxj8-rykKH+G-&}aL>-q!4?pEi&pj&Mp^-TWthyr(HfUW{#8V_k;Alxm6;)G& zx!4G*$@t)UpHzH<5T4sByb5z_YV}HQUtht^Vs>ac^?(`U+{&&2plKb0xDL;354%X6 z)Duif9tgR(JV7F$%G{fAcn$LhBxlNaF{dXc%`P)MwnM3ASyzOv6$)zc`6@;n4jh8) zmQ$B5y)7e>_w_Q?U0*sTVXO>8%ky8_&FN1fvQAGF)hhF>g}WvDZfjLm{_3UOiMl|V z`s4ahJ$_;F3a2;PbYWqxt1HK3N3RyFZLJeWG!KP-==UwX_rxJQwAwMN8Yv$zM=cM4 zRTwk|-oo(j=A-Lr0dR~rl*#599v(c~dplVxq3rX$GK315weeRr#IeJmp>zSjWV}JZ zv*{huaG;|3oSA5G%c<@(hGn$S;HEcIpsdR`ZEtToc#6j!lG}E=Hxr_M=(eLeFHGo6 zNJtgJX8g?ZK+P#k)uPsm>kL9Wn8N8IzN^iCebD-C!zf9ITS7u_Ge9D7E0lddy-Nf$ zZ0X8|V4)HJ?)>h)-gl}xGRdM2rg*G;8r7pGft-51$~_csP&djhH+C{!G%!+2>x?e} zRth-hNQIu9)t_u!CD&ECx8xwNhkbzDY&^=t7d;@Ax-mUn}lc( zHK=_{fYzD7?K+i<7YUQD4o*=?WJVb*DAZpxYVem&>4^?RQtrRU!WV6KRTH`K)7E*_JZV zw`Q5^JZji#pZBbUakcmx`G@~Bqf*jBHm4*cz}J#NS=xI`_!$Nn0C~jUbv#u$rr!W* z&kNyI%$G*cSwlGX78+Bzj#2P4iil-U;-R3MI7+2n-IyJUV`cQkZ(m?RNDDU_MA?LA zY5sY2u#k;mCkqhH0{)!7hMs#4y{zrg-F(a0VcdB`H%@c#$9|UN+lxRDeL5D}rujM` zKh(u_GD4L)0!WiTDS}|4AMq>DE~Xh5zMGWX&@y3=V}=c3-Q66?w|tP|zIk2`y#dK$ znxPIQ1T7qyv#kWjeY+a2#}X3i+{Br14>GS_iqn4$!MeMJ-geaC8;1n3{e=KMF7D$C zFH&Uh&kG@&y@!5ix-)=sE$-%aciwT&FslxicV&}$Kk&50z{w?}AcGJ5PI!>vM<^VF zoF*LgAW}Fc^yzTzI|_=m9eiGNVfaka#G3l5JJxcD1C-MSnv|RzpIDnXuv#(2YBOy! z|FPBuJat6{|McD02mk5EJAnKmqa<%DHu;}io=;CSP~{|Xh>?hY`)*_K9*?@H=x|u9 zge8F5*u*4x^$9ooDyj8yKqqm9m}pa3-ue^nNySjE?WcLUuaieBRrRWJi}NA?3+rRb z_wRLevm(2&7+Mf{-d+#wo%%8&3)2{``#J4ucOj%lj#F}% zD$AU$9o*Y+3_k@sVsD$-&Lnc~#nQY^6wMzZUg=cq79o903+$k`lHg!RKD*(mDROB2 znTMLy8Y9@*E=IOur{GgYWe%d%~_*nR3k->K&tEZ`|a~S)|{RV?#6l(j=59K z{5_`)&2(#yTq^wSZ*E&Y;IsJ!%YGdYG0EcKguW@Kth@7O8om9l66uh41Cx2L@EdOP zX!HqXgJe=MX5zj{r?}+R?jG6*tybr#_|dVk9#)F74i{*BNiCZ@X_94OlxZ8Jbc@!_ zV*a}EPRhLThK8J)I-;m5h2Y8E>Zdo%l6^SCT4GIUI`vokS8F;aNi-@ygioh;OsrdA zLOr=M8O!Ts(%3kOtC3G z1Quw8j{F#Qyxp=9*nEy{V_L(-O})7KT6+RJlI`=S2XF{4|M~Hn0sj5s(+h>juSB}i zzI^|)@t?Q-+y5Z9mx-%GohiX$y~*sIBGM6wi8zh1j-M43bI=s7B{gm~8k2isRyw*` zQ5Hx8_GF0{tM6{PyGO~RMo4g#er%#c4wifLAfmVt8T6p*!_w3qSSNlAOT{-t7F*sI z$zQZqe@2jZjs>91-!1a7LhFLEYHCyt50BO|l{>qnK+e*2^%?^Nes2jb-LzyP0A=?s z>LK!^Cb0^cXac)}p@~V<6~3eJe%;aAjnD2p9@iIAXYYx#42_KJIsj4cB^piu?(2OM zS+Xu^w~2s$weRq~yKyM$>xvTNU4#&B?C7X?6D+6|C2p?qp#A;Pbsfi)li!hpNXp`BIg(u6S7jNM*$VwEJ8Bo38ISt2GQ!x@LOBlOL{{3TD=RCz4%aB< ztV4NYex|E+cXz*+>cbenCz&XH1_p-QD@7s``NKdFbkh7bA`IA-K?m&m2o%#(QaueR zjI!;mbqWPJ``3K4SaT|mA5> zV?x`o8cJ)`T>92Ne~%Q+WVcQCkJE4#D6T%l-rC%>jAZIfbn$Y%J(}sP1!%$jywz>3 z@T1g``0U{9EaAlM{$nSYPh66f{q)umy&|#HU>A$FU;NjV=qQ6O0>5jPJc&ZHUAKDC zdCMt1#V*k8QH{+O`@)ne4ac1+=^MX>gTsYe8Z1p~pWI#ydh1bPh~9h%y;jS)(pfZ= z`{G!Zb=iMq*$xMkI2$rdqDW604?=fXEhy>-tsx!VMpQ}sX>xcN_lp7x9G)QOkAL38!9_C4$j)} z)buLj#&D(x`r7P561l1wqq?Z5Z#9}#+jzt`U1Fy3Ylrz5VzJov!0|Kg>*lkl$cRZa z%eKd(beqg(@#o@g+w5#?$+~Y)IL=FFZ3b@o*OprSdP0~rh(1cp5!^4x(=`*t&X9`Z|5uLcLLm5I{sc-8#%L151S+;g}1B$*kCF=@s zKiS*c8y+4e+_+vRbON|?atizI0c*U?&6sg-q;~|1!2e_!uM2q_Lg+1RA9bJPOnE<>1oHV1%F0bI0UUCYboUx9c>mh2!VYY>M0(g?3vI8(wOtHb4gTnk zLA!(g5w5dhV&R>SfRBioErBL+&LqG{4x8_|qGcsn`H0UAqv$YnR;v`%C}zy6B2&)U$#1DwwmfvpbB6 zp&Lo8iaotW25mL$Q2dLY73&cRkTfDETNcx}pl5I$0Y@6cZ%)~;twubcbe0HN!c3^4jb3*ueD-+kr zpR}2WieC|M2^QGVEWMw1TmGr>|M{!w5hMGe)4Lt;i9|q_`VNJBl#>X+c257?@ z8xNCK*VjAP0p)>=oI2tOw2_iLp06&=>JTf&a_NjhhF?g?PduJYd0%FSij2%sCHenQ z_ug?$Zrj@EvMW+Rk+K@Dve@e6QR*_j|58gI5Ccv$t^k&(07U;9l zma&6O-bKCIkTGA>>LFVCRpr74ZZ589GibjY0S1e0`RHUmPVfoPTJl#gY#y)?6UMB2+Mx@7kV(9}J|~S2Hfg#JR}5R+VaL*24)7JWlvKhE z6WkR;1?k-aR^IaMYm{fohX8UyG@5#)M?8+E_#+y}XWiaga%XX877KAlLBqZ@|n{ z;}U>vtZ9y-B;AlwI%>cosQm7`o)Ujr+xxQd2^k@CVQiAj=atj_X2%WE{3lxRA7HIX zYnJzG*6RDJ`Cab!HiWhDBrOllw5_Vc><|YFLAQ<%jhB=m%&icH2N2qe@WOz8mIJa4 zCG|G&lY$=oes+k%g(oG3FOMcb1hBFV5f#O}eecNXjSJSkeIxSRE_U0)=M6Vo@6D$+ zQ*SM0OSam)jz#M|?*siu`pr*fqfShqj%A__h4=Q!%ti)Y9vv`4^&Ux(n5{)j0~0F%Jn9 ze&W}&xXF-)TJLNzGNew3w9DH{Ye91%tkp?F%z$(Y67)zRt2bO)?SJvK@P!xefv0w| z<|y*XP4ml5o@hNgvh2i(%Ac?QxRKF9(uLPbtf^mp4OM@!RC;E8J51(Q-_j~!d3fMWK(mU1+QdXt=-g+0x^zU+LU=V{(D;L(*)SH>wgV%)4I7*Uxt_j+VHF^3~ z#NbVQ5F;`FQKIjzeX<0< zzkTW$ob~EGuarKpBRF5G-gY8xpUiv7xop{%h~f&o7bIj9A=u#{ekC}@-z*b9lD>cX2O}W$M$3mgv3U|#?r|BH0Cbzo=bVK}yR~E;MeHDr@l%v*d z6~3Fy9?f4pWZtz`Si%dlvD!5$yugW?;liiKJRfr3WEuYwDeXS*5~SGB$(ZCa5f6pN zN#IQF>_{%WxRq6^rtpCW5I5tbj$kfbj%iRw)P-FOIQGzKh| zvyUUC;`_wo@q$r(^fz@3cR$D+ejYX%0X@hhE2+8CX0$)zY>W%dzYZM#; z#b9akBE^*>V7C$O3_zg*1OivwiQ*3k7#HK9xm)08wm;(i`>S5--#0B*a@7$tr3<@D zagF0^qQnu_hWMLL-w*jLFl*>N{8lP6ho5W;*xlR}n`C2SL*k@;a+o=c>vgMPH(MozCniT(M?vm>(}#4q-c5B4b%Fc-F7x-g zdV0o6Nh-D9&!*IDv3~1dzDUZqT%Aq5%WmEf_LgYkm1kS_RRnXuUYw*ez-?n=W6>OK zxwQEF-qL_|T3#9363784R4THbmT_GXy^XZ} zJMYy}^8C`5^7!NjDb(d~wa!l>!)?B(V(#@ZhO28sE=kH4WK0YU490(4i+Bs=))jNxT&PJ) zcA^xs%E-t_d(2vNa-_8!7j1{``u%u3q$E=o)7#i_)-8>U=@kg;K;+el?C#(pOJkb2 zTVH+7IL0=-9+mnv>QQ@{{_;NgCeb(m7+wf6{rcs<9w9OOSUbX|G(Hxi<`I44NeJBE zC&71{WQxeQ9n#~Kks6DmQ+o3Qu4zSeAXtZS%C$~yy>VFG8p=3TZOO=N<+i5yB)Ph~ z=Vl(gHa4Ae>1}dyvgdN$L8kmW^EC^q&>l0zD(T)})i+L?%mG>oqC1)Sm6n^#(i|=U zGV(`{dedf0(6ArXJPutoaB^~zMc`4#ODwp1{rD6#vP`_? zVX`IJ+uU-Fdn}u=C=ND3zo=MynndXAykciJH&dw1Ci7HN;ktpvj>LkP0+*{`M8ALu zTkgjn&r2*DnPpfi&#q&5_ceCosxG@s42`i`cE(JzayGIAl=_ZiO`Thpm!av35pQ#% zy{GP82|dsMHX|Z+ybj8@FQ~|<(mjRAvm;$q;w_WdYX7zIrfVl+M2FXlligOm7V9`g zhdonfs|kEbgXHS&U~RtYF-0$OZ-7{^v8zg!;^Fr(Zpxa$vPWrYd;I#=bnCMhP$6^G zn=H{13snS$mj{_n90<7bD^dvii4=N49D^bD`yM6nFCX@QKIGaJlo6T02I(tsW3Aqv zb7*EepB5Lpa`jv%sknx7G9@5bvA<(Ni+E%5;>PFm?xCW>!0n?#`;~6BMJ8Pi|BohY z2A=oXj5>k^rOUpeoe6fL9ApK>+H`}IqG;x=^>-}wlPYdtle5N|`lGg%djlkTiR%ri zf}35m$uEDWd^Wx0cZbb$9iu7gJoX?#)FVPU@n$FI+9ZFa?gX>A7GIKIx^2z2yP!o=RBU(E#zesQijeh1`eOwAUhC?M9 zgbEe>fzcitui3^-4vr}}$?u{o z&wd;v(c+1YC6bi5#uRZn$4u6dtH12>8&3{Bs6D+@$OhEFyJJEB`kw#Ak*KBTdlw_! zT0P6Jz0eI z1*s-G5(-7(b@XRO>{?^aaqG4uSf}!1&Z zK{k4NzO6ciriaGHb4Jn=@jrJ(C`XhY+P0j@e+2BrOv-B;&B@xiHt@YnH2JVjB z3Z4`eMlGe`P2%Qc%2K8-I4>`a^zLpFgPd0#_+l?YtKNG)Kp1(|XDwy%&tEDQRgl7D7m$XZp!fX|9E@Dl0lp`cob7SX5_fc*E{gIxAE5VgN9QGVlv99Ci zYJ?P*-&tB-?rwK%6UJj>)W~{NQ8?hcwYXnw=cTCvaF1g1C)euEME(rE>A=T0DYurx zG*b?8seW3Av?U5VcX3+R5iSL62`pj1oKVMU7j+_Yawpd}_#>jBGh+B7G`GBs)+pNfl6ZTj))$Zkw1 zU$s$Rk?~|Hacz?bU2c~WO6|DgA$Z1d$|=Bo>XYio>(8I}<3BPpr*OS(NLlJg+r272 zeMepWZF0cQfU4P>x(2KL5ko^pVjE-nT#p+fS^2Nf+%HgrK$2Rkw-h%fWp*;?j9i;P zeE%{Y9ol{_rRj?Ml!$eTUuqS(&)1Dp9zE<`v9;PVAZS0-pDA2F=#jTRUoq+LwbIFv za;q_d@!DjXkE&#O)ALuMW1?VDSDV#I)iY%!;}FwL#R8wMO&E;6e6hi6sizy$EDYRT z7T+qpRL?D^U7B0=RkDLx&f!`#w^BWq7|Iu_k7S_=RT^>+a>beWRx76pa&n^eWQ)!F zf^!tKwV^K4Q|1v-*G|gtT%)7o$ai&wn*(e zZ#DhhUf&cImWZ>Xxi#2>k(pa58UN}*)LrA!{knV<#2+$ZK2pJzGf=7zX{_$oXFu>Z zEu<@8k|Am7mz%wE*|rYa(PH~?OC&2))sqSdn#eBp^xIogz*YQz$pGBG?MnAXi4SvU zhg^(j3Qw2Aj=wt)zzRqP(t`e5p3sMv8_S0u5-%?k{d7SHX`g;>wDMHu{%i8#TFo5o z(Ne4HX3?44`-1YB1)MXt)@xZ>_Q_Dv6<-RpDrminVJ|Q+X2Z$s>H=ITpM^klGFay@ z%kZDiyUQR>bARM9NKm+$H|jJ|!P@L{ibH6GF$bmt!E1;%y5zH^;5CtOK2w|ReMgY$ z%k-F6#~4LgIY~7Y6&2$E@x>%f4qsJKQHhRA<2UX1(;W!d-L_c!>i!nQ?K}xH;k`?d zy1RwZx?2i;1^S~#Y2t1nL(W(g4HKP-SY0?d8H6n&-d6vp=lB1l(0W4!h1E4D$u;U~ zqwc5r?A-I(TFlAJ&h9HO+ErApMfjT+@)%d&PYsw)czDLKYPsFVxglXP&xgqK>d>L3 zZND`@?b>?iR>M82An$rLHcKfEo_Rg8iI%@=jP*VzA0Mm)M?v|nRT3i_8CS;UHWr#V zbCOT9Onf>rAI+)B-iY-W@`@aC!(&v-Z`XSdImrjBQUq=LJ3I?0JM96J#^npcGR+bT z)#n!=ATp3v<1_E~kZtgz{MQ)OW_23i-z~rE@@kUa^d)%dtR&|}0BWNc8PDYvgzRa& z4*eiUn62LAd!J$!q}sDs98fbMDFlpah%wM6M$gauRnOdhggr$?n`;Ss(B^HHLn{HS zzwxKG@}>O{M^?Fi>Q`9=7Z{hcD>S_05MSv?YwDC|z5*N$h2=z= zTU-qhZ`~kx_(29a%Z9LNRpfJ!JZO4-oN>InKGd>#Bum58l!aw95yBTIRlUO2jKzkV zc5?tP`+nZbOKn_UZ~VI_#ZNc9IsL^VSFyFDYv^idZ@iLrD zq?4TOkC_>R^3@8lpE0iT%ox6~OHzvLYN@Q|joMB9AqWj)i(MP>%9f74MY4F^to^F1{#oXjo0hYLm<5Ek88PQ#DAPMQE(h?Jb_<>eKfmbSo}Fs0GVK1d*>j2#x&zw5MkYGY@u=2|0@ zU*<7Q8h+QMz`8Gg_(TrH73~UJQAtT~I>?yVsJpAX_^7+RV&X#`6LyX^an5hfdD^HnsDT(jDc)Ri4=G9^5oN1k+W?l6CPVB4gOA4Fwe1UN@+jZDh8v8n4- z*d`?VtsX);k8|bN*W2T8BonzL#1PX6jaxF@~inGRCAVs40oOeE31macI~rr|bC z^fUAIAE%waqI6l=zD>={z{-fJ#nBN%9Wk!=+6wRnxg*^IGar*Lh!z5WS&dDUfv?2c z^sB=Lmk)(h$|-@MPoRz&34VuHG7q-~X`(^j7BeJZZ$cGhzk$B|1BlF5+0Y z=q@)))o!{Xy7O&+ofyA%u&BFE@L3SxR$6Lvn9V!(x|}X*>LnYCU)AkPek%%I+aSkL zRLxO-f8>#Pa5GRyhO4`s{?2^~lg$k?HaV0IxsxzWRcTr2bx%ZT?%m52&yB2_mToo4 z@5$%S(l@!e*t@oOZ=;OZek{txiu1ym8WS{|PBwbMp+z-7V8`F*5qmr_Zt74wY@n z8{bc^K?~7|d>pM5X!m`Yw3?b}@dRl41L_t~uPL$SwNy zM{%cpf0``nr$-$$QO~Z887cx@Bg=5&*Drrf?)|rE-ROhj;^F`(==2pD@`I3o4$YxH zML)lcvGIvp!54s;xIW6E)$->1wYwbeA9#Q~T&mBi6Gvz5APS-#9qP99U7psWJ_M@z zK70`h6||$AO}OD-b&N&8==It2IgEY5b^}Y}UA+TY6j*NEQO$de1*1LY0U+9;N*C@7 z^)&yy?qoCcRIu8)Am-)!4g#oq2y{W7MRuyi{aYZv`LBc$vK-!9GdzV zo2-yZtU|ni)5yV%E_;cOi6k+I4FvjC+`13~HHR3&d;0pY58U{(l@oYkdZbu{onu2> zo=i21y50u+IGr%f$^^j|={oW02J=X}ONMB_hb=;9q}5WmpflTgmN^UZJPPu%vVpDf z0>&XBT^uHz=DOU(EG5{q=45W}1>Vu#<^DK14#PY++#|IHP-oaf>HVmfk!wH+p`0Rq zFPlq_nK0Fvkv#br1k0`akw^^=fj8A@On(}gpPycs{>;{y|7Y2{%iria6t25!1g@^0 z;3$73jTd7Fj^sU#n@w1(Qj+Uc5xsm6cwc;Z$&e%aiJe`{YJ_`pTQhX)xi9DJ=to4q z_e8TgVuh8zLtv&12Gg0Intezk*Yi=e>XmAetAe1}V&Vc>61ZimVJTdng18im6z{xm z>~ZiD=rC^>>7@}U&EX@((`pGu?H7(vt$t_T&5n?ZlQH_JWe}@A+p%5IOG%dNHH;C- zT{RYevW?F3v#fuR@KB6h#A3^j=YC4l-I{5n>QFj9cfljDLPngu=Jg^C4@WU(Cp+1# z&udZVVN3@zWqH@srGcU#S7aG zG9$!tdWlOtPw0-+QLU>XDem#7XW}0pbKgC1vYBPa(Z@IUys4)mU@VMUs{RRU|Muy^ zv7fnqzW*%O|6AY#@LHV#eJ7<&cz6r#wplK#;F#R}X5&u_I{Ds9q)(`+0wgftrPL!G zzjL&YnR7KXjYjS$I6J$R?iJ79k6qdaMAMglFKGHV8FaTb*H)iN_O1WN$r^4U>-MN6q+nhF6Nk_IhW3CG#*%bedw)bYD!gm3?~>_i?srQK zy(kv`O0|_Trz*kV!I`huR>_Kf=Ak!lqUw@Pax-3KlM5NK+~uIA>ZYx2pW4OER5WzeRqy=Cyvs6b_am=I#t8*POY1Nz^->I`=lkruQ|p|} zU)zbh@LBenGTL0sEHw7J=GZN8zkGt5xDvEBSid2Xk8d=kytNZ{JKomSKXlPS#P>K`%_jF)}*xTDz%}OttR95e|dCW{O>* z-DrB8rJ<$wO(2k(iJi`|x3z&*G)#EDSn4w4xP321zL_rVx=H1zlZT9wP=(?|8NtUka-6NbuB4OaWe~ zXLs|niAd7{(p(Tj*9Q;Z(@SalOh;#3^Wixn2Y znMHUa{VZtrX;f>1u2IXJkK1txEVAS$ky~xjcbLJ2Lse-C#nv!PK^)|R_$tyQjn)=t z>+Q3OoVJ@4p8h(39VAl-&q0U0G}?ab>RNEmc2@vj2MS!7s?Xa~^8#F$v?er7ZbinC zosa7@g2A~2&LyZg;7mj?;TU!d7-ywPfZ>O@@ClcFJ_9?_Z!1hGxI-1-k$55aD~bp3 zL!FoX*)gdDu08{8anHW^@DA)OBY!$sbpG=_q#|;TYJh7vv(O#(h~g==wNk&WovPV0 zYLdJ)X+H4MGL*t(b{fsF)r4~SERxpp^UFn>OADJ%iq#nNKm2Vb0!;h=c#i^n_2q4$ zr^{CSkTXm9Ywp(6sqilM#`osq{e>3?i*G&{#%1EGuY5HTX}intaTWu!C1Tn4FZ$^h z;|>k4iFI~LTJu9f);V)Lz_pE?riQD?<}}*FclSqVm8~Dy^izuvqd0PK%I8zs+<1Yp z;Kpl75GCIfLYCIm-<#GZh6nkd-fT!5&ZMW*_kGcder79qQ41NR4e>E;DvEIkV=gpp zO7#mGX5}-f=DQSMy-N{m>ND?*7RJ!r(t1rO%!z30duX{abG&P)E9slnOkF4JplFf< zC!{yDkSr=?E^k@y2<^Gr6gqEy?bWUc2T`x2TJ&j{s@07_uPZ+5E{B*A+H9lx6*h9d z@fy&ZPdAAHIcuoZj^@*;q zM|I(z`O_m8b9I8tS7aQ`gH)StI=h&_9NrM8=(K~ zp>|}8iO5AT@tq&3C;#)q8TA3|eRC{0S(ke9KR=Y>0(~EC!O5eE_WYZDhRfscL;2$d zE5ym9eCM%*oZYKmUfb=Y<>6M-;(BWyY1gbPv2erl@9kCv%*GpuDLOBE2c#|p(8B5n z5lkk0qmAJa!ermH9RF$Kz)604@@y)yYXOIq-fA*;?q1lvEDjq2L{0Ao9V#)e8BJ&} z-O{Lz?cS_tGU+?7o5olYHzx#LczwW|A8w*_ZjS%vY8%7Cjd!caxfzrxx96Ph*2F7M zq!DH!M<27w;r?T=IR5U3wW?L__%z)Gs=zk1uUVcE{w!e)IQEt!4`!(cQr7%QvtpO& z9IG}c+*JB9kI{NC$o1?tmEbTJOzQ>YSpZLU$()m)Kh%_v%)$EYloQ*x3%7TFXDp&~ z)B;#M_GEhC7R%9Yt^E-nYSbBy=3lh9y&Lpg@x;5BgBGK2=Vi_!1$3Ct?EW4)(H_5> zenXw@+jWNPKyIBGQ^wdCBLh>OT{8vFEFr+z?t~8@oGGWwh8$!HbU5TQQ2Ube$mIkh zMc6~W#OASn?CZ~5MY|7y$9SUPB9M+Ju?hzeaVjIf7lMGoO-20eSxaNqbR+Qn(G19` zRU}_@2j7Rd<#zstY! zUvH3PEAfcVk@dB)De*F3tUMobnw0A5=(tWb^AO(7I!Ca;`9~smAHGq9 z{ro53(M^NVpehCV$YJgF9F0eRG zy&2TK`Hv3&Z*FtKrw?&+v$L@i6ISFq+4f|Kcg~pw1wCFY;d(@QW-v2>$O6Ta0|W7utD!`F;HpBXVxl6M>6{bdGnyf-^s?@%8FG{M6nq(i}{O z>gg#9FwF<{-R<|fF=u(rVoB;I5rj?qa!&Y~qSchQZR*x6H|wqDVuKg3Cz=3Rth^Tv zw`f1^GM-kvBM%a67Q=0L3Bdd%Cyn}njD|taVfEc>qV8wU(dRlm8fysQ9QJ@iOo%E@FsKgBpO56=tmJsog4WzIuRqMKUKSQ{}cT$P93NroxFO`;}8qIt4^}w$?ck}Z( zs!;Tj)1~^l3TIZ%Bl|U6TwF2%#Bd8$IC7$W@;A_V+twz$G5-i3C*SOv-x5Ro!UQkx z%qYBaZB(gpV#3?k*J~&zwHagQdnCT&)7Cnd77kKvz4}OrClDX)zjcD#w%&)1SU;0k zEPe89KJLi2Oc$tVpH$k_jVZ)Jdo3o-l+D5m&GW*&Gis_wvlu2M9_rL zdvK-h)Yd3>1qy%+ztZd*Cw_o_sUoke)A+r7`5v0H`WN=fA%R9Mum*eMQW`B!+A^k^ z9pDb%+5OtcxZ_K$**QQr4mXg@F*$LKcz%F`J_OG6W4(R(fP$GCmN50Dfiq+qjJhyp&cr+{Iash~dVWiKm>{f$E zdEc=sx3J7y3L!HAk=pGFmfEN;XqZithbEEFlv|z`Mf1dz@S+Q{qf#1G2l~bvww!61QqO+NtRqn;|6C) zd2f64W}L{z6c}>Ghx=4jn?B|zEtWsS*b-SX9~ycGNP_qGw34cp9hw}@(sP1;7>5UU`J{gKJ1_3a`l zLGsEzd3IC+?f*LDb*jk(c$*drm@9&RPw@P4Gv&ZAwr}fQaW$6hbFm%-H|qfxTycxZ zOd-1{~SEX1zTD zn1AE2w)WiReT}skkGm1SuF;2a8jG9z#TWg6srv+ z2AQbskLXZfIQ73@(F;+)@xKsN7XI$^uhCBQ!@#!GXV)f*&R9#XOxEO<$&V+(`GGx8 z_MBv~*n0EUd8T@EQ?X896A2#&9Q;_S)%Terqx#P>c!6Ps-4LSr-%nc<84Rn5VtDu2 z-u16Lgao-u$*XSfW1M2+;(}Fc7gwWk$zzN;d8|yEb4VYvlF~^kA~AB`5T=r}p`m<| z9Cnr0x!x<)b{2kan?7D{2z8-r!3axP%aZEjaZE&mwEipK^kng7qy-3XFiFwPULVd& zPb9-O_7}DZqKSIjXpcpM5hs*d)guz5=LnVR+~KES6elfe=AjLzv{A}GA8Uf!>MQj? z+`=6~8zH=Cacn=@x~V`ETQtqPTt2v2{)mA^3)j^59h1qkoo2kLQ&OX^8glPE&*I0wTs|-(R8CLjNEbp7{p{AI`r(e z4;0qF=@o%dxzt4)ylAU+1xqF3J4E7ko3jQ_#iQWHzg*s;lh%yt2kck}_dLBl<7gXB# z6W;p;XoM|b!h5uVi@&IG8Bz|1_s%-NV$3=ZDM|kIax_J`sGeS_!<%HlgH~`yqhXYH z5CplbNcgD$>`pe`EP=mckjI>0)aG4ct2j85VH7Hcrq08JZ}zKV=ccvhWCFSm+(RUe zSH}9`1U&PBDX`pzySE_% zW~gw>P_`!+h<|7ygTKZ=m*|rMtALW^v!Q%?Kmh-|9NBB_%u8KYL%bP61zCbZ^&Bw{ zEv#`XR0u_!6~ut43GB0CAWYcwC0S~A>9C9&v?8b#0iu&ayuMJmYPE?WG|CFxqnygB zHy$;#RpB`<8nqw&~uc*jFTdH|LWA^v=(jMOxZXUzGa3<#$X&>-+G2f{ca@tCjSIK1nGI zsl`Yf5VGS2EKdqSIRJ9sng0uOnWLwq!~X3}p&0DhHJzP6#agFNvO#qrPl=?1mx#mG z0RwKJboS)(M5f*Od-q&vZoPj46WF6c_lA#u)vtTLeNX2I2(7n7^7Ag7|39?({-ej< z9AsLK5SO)*S+&l~&x0k5HeiP`)S{L~uB0mM0<+6Tb-Xs`%iBtf`=NjtY8bn?=L!GD zVPGI9D0~d`BEGr!>sTIP&t5o1b8GnHtU;c`Q`nh>kN4;c^?P$znZ)-6Ne}yOL&Jvk z0YZpPYW_DK_v)T!|19}NC?)*J7@gQ4u~-)~Wph;PknP-=?50luci_h0#% z|JLK4-F^+g!P_fOviD$v+m{ap?u&aSSM23RzP~YECDzr^b#*Ou9g?6gHhfQZ|B3T7 z=l}QfyYHajb+Ek0%!JPEHPHJG2_``J88`h!z#JJHqiQUT%{2R*DCD&aJGV#&2 z_uP3p;5Or$;IYD^D@Ak5h}G!7mF)jvpiS=pn_2Kpo7P@KfADP6ll>8T1>@tENPMbk zjNjT$exWOsOFRQJ} zJ>I33Te1np*MX zQ&eAd+G>DkV2r4ItvR}}A^BwWqzkWzsFL3|6vZHPT)Mv@#GAKh(QdKA-uCk$B~!c+ zjWIco=na%up@5&Wz!2)7|HS^n-bn*nmwUzwr0NYL!zGo~-PVn{1%puCDib%Gk!SPO zX|e?0B2>aHlkrCoVZ0g4Sjf8DfCq86hMwOiqn!>umvF3#p0HJ&Dr;^xA!nAvJ?l;I zOofEH^A>Gdh4$(!l+!QYkGBkfxYf^JR1I%5agPc4!!|p3-Tz$U0P~FQv!dtmovdWqSl10fI&|BQl9GMabUsIXzmREdX)n`ehNQwu2|hVxOd{B zCog*A$kJrUZHUmk=E!I+&d%I$#(1r*Ygjz3cyr7ktfFHLcdn@4_zP#{Wz(9^MoPEw zwGc9j9xG(ch(-3*LYx5Z!u#H!!@{bI%IP-qU24eaRS`pT%9z_qS&ns7! z1rxXYr0FLxW6iw9=e~R&!ohs#-nc|kMTqFGDHqq1OgwuJnf~z#&vnmtNfoc65c)ya; zvi3=mbUA$n-^#YjD{gnZV+&sszW4^7u0!~TfnQ<$QtLnivH*NG8YPSfvxLazheU76jQjnXp<_UAQOy`RFSLl9!1&aa=;i-y70pgIxVelmJd5>G#8V6@go z4=)^c;hhM-f!*n|X_!~66-WnpndE*mMu!|VTRUDd%(|}1K|xcZ8@}kb%~(el33*;e z3#*2q`lb0RX6#1w=gydm;=ULwt*F+TdKu&?$WA=Qh^}q=(Y{2X2Zpm3Pix-BH9)x>&{;{UeY!U z(%B?y5{w?>2@T6ehNTdvucB0FfkVZMe&*RUgj46$rs{Iq@)x7fwl)nG&%)|Hv+|Q@ z#Cwxah_7MQ#EZ9j=oPm%XuodCW?>nsY~W%y$9XX1Z`OPr27Umr>GqI+iZL5;EEZ?f zK<7B*-}sdp&!j!?f7JmOAbKfLwbqHOU2>0O{6?hS^KenV%Dw{U76<+vE!C}2UL>h! zT5w@XU%?J3v`=2+&DsA!>;1PH^DyEW09 z6d8=N65~CV$$~BuVVPEFpc)tV)l_Qa+vJZgcH^Ker>~7}gYmd)E9Rk}0 zMnbDw9Q|do?X7W+YMhrmE@TbVQzY-9zwWu;|8N-Cb{W{vwrB0Jd+pYW=4Ebx75dF- zg!rny*=~IDC%VA8!5}KWmlc0}=nQ`4vpsEYr8}U$!DpGQJAxNWRZT-=S# zXCkGhI##Kb^Iu1E(zv15?u!E&j==A!s<1r^arx`ltAH&EQuchzDJfk8op~)YDk-G3 z6pDdvT+BM+vMJm1RxEUDt17juN>aN$=J|794s{EAzUC`lng7Fx|9sn~Oe!eIYctwA zxd+cQC4%yAh9GAD0v>~vyqITl93yYo`aDOG5Gh@+)dL>QaF&4URH*Epf`)d(4l<=$ zXzhugS>)Z0Q_NN;cCZSg$QqjXcf+C&l$79#rJZcXUuOzSDkm{E_};AcUZ0fAYaF_) zq8w^$BM%p}--lNX8M*P|z0%;(&S%flH+3utGKiEazdlLw>TVXh^)J8P?aSgoitk!u zoA$onOWr7Lnp;+X1Th62=E+DxkpyVBLB+e16}tGorkR=W7n1veyoI5xTiIrlz1lRE zn%AFTE-WXEZgLSCkUjF%^w_P(MZ!}CM%!P)z8dA)*(zZe;K1c9k#>P?7>#a}KMJ!0 z_0kx(!hL2QZo++5eb&7Ot>0Rmsje9A7*2Np1U)v*AS^RN)_gqxj{pZzsDeHX;?kMB zLpj&+^dxpYy{K0(u1yMfs=P4IuEgo1hNemwBC3DTaCFfqEUW8}tNs?NkTa&@pNSA( zUi3Ooq`n5qvfv%WiCoqicQ%Rm{EzXuzcOdQjfzccH47OS60)kR)j>wgBiepyjB$>6 zt}C6+9+V)82a8r{9}^Et&6vzAW2ywrZa0qhY{o6KamxD{cPWT1X$hW4@sz9K=jMh! z9?#Mcvo8(1V8T~_=uot26j36I)QZ;8JrYTaM(~i)n`ZE}kNlTp*Gjm$A&6EyPJ6|b z8affB#uh|=jV+)l57NY_uKMqNRFhc&=J@`t;d@v;YL$CspG|P1ivYSB=3N5;T^I`6 zggn!rz!n0$^+yDRWyXMK?URV^7z9y2If*Czf?AaCLvk76_RK&~onKV1wJWbQ z-l}QEB6n;PDaDhWr7yBr)j}N+LC6Y(0Cb;#rJvh2`VeMEEw<0IB`0jHQ$tSDJt)2T z7j{KWV6-^jQ&r&Z&x`7NiGpdmxqaeP93!MtGMh*gOq~;R3ZI;OE>K40rKAI2{wvB> z$xo-S{#=#Q73u_9-<>Re!a!K?L!eHQ6NGeUfUgf?Obo`MI8^x)tpNXqM=>E!pTblm zi;;!JS;MPg31q8*bBUJHx;`@JdCZd#36?HghJNfa)zomoNjF~D=A$I;B~<^25X(Uj zr20c@CeP)g+C|V=!=Q+}a-uBE+DG-LRJT&4+AkMGQ9O7F8fn@Pr$Y`#Kch?xog3T+ z4XZw;wsUfR6Rl8+QRr#-<;O&K9+nV&(J3s}8Sb+~_lCfS<5GPu6Li7{C_)ztH>lRWu+3^5ih8nA1@hg-AWBHcJTZXVgxb5jYVo03Csmz z=m^1xvo9K`75kb|`|{CtA7h$Zt&<$aUc>4fO-0>k=X~pwb%>YGPUX@BsW=mIshJFg z0c-s*IX(xVZP9?=VQBHv(P@ZeRQ#GbxCf7+_OpB~+&1xV>O zQTq8FMqK}AV31EQ9q0H5bjD+k_NBOHAjyrFdqbfl4kk;o$ByRI$T=I!Xm=YwH>v&4&-)ML!->dh1^^ zZN$+yCB`51d`ohAY9<ndvbIul8}ChDOHiuDB<3bAp{@M8V9jpQ+vES$9c=rO)0aoy0Q45FvK?%U4XEZm3Q7xa<;##`SX?OJu zU1gq2>B@^Xf4~xLI`$x2Wh#1-{8@ZR8hE#*$m5KpOq;pGc?My=-c8A~G zwljXgV^U!NE6$Imyk>vuu;57d$n%w{-owk5S!@~_8mwPl!KRm*{)Ebu4Q!n9v6eWiAm8i4D{pM$gixZ$SQ$r zic3@`zho*bw0j@p%%cg>N81$M6c#o#YkGSJ`XiyDJDnc-u2(WW%6t7FkkvWb#HLHJ^YR3!z#!9B7*} zfl8Q1qZ0pYA>!Y7qJrKqpl0#lQ-{!cpxS@7r1{xugx0_z;(R94P1w8b7j^SxKXWnL z4QDbjy!6yihpgH0K|D3VG)nljsmaf*0MYY#X&Kd0J+SrPq=XB*`J~jo$7C2!)Ku0g z7<6{^u^Ss3KYh`uAnf`)L}8TM0{--j#rg+9PSDL^g$&ZPWEdK9pKHatqOvlp5MzAt zVj`7CtzYE}?SU`1x3`xHjE#*cK7L#sc1g_0{i_pb0#h}luQ_uvQB z29E>_KQR>&DY1=kfQu63^{ELW>6ZTO2xe+7$$yllYZzp0D3=i%b0krnnmI5lR-5k- zgOnf!xE&8QS7x_tjg+Q7yTprk;B4hIwcn84+;(5m+>6+Zh+Yx@sQ&F$6u9lMgQV;r z$nSyt(2F{H_n%K~xBma#Q~i}dKx!_b>g0rxm2I;ns3trr{0x7RmTgVcnzqa~iF=0P zs5>fk5i(5{;B9sOTgMxK3V*lzOLwPABI0Lekvb(mJKV5})c9>T%#>k>o}X=5s7aO^ z=6|HC>~@s<9GW4BLaCUwPsvyyhlIh+LQ%pIPVhryc3YPbn{yCqT8k=&CojSWh&)Gv zd1tGC<`{804(LdvEfucBA~u-`7Y%doYDRhN|&|%tn~V+3h%Oa3=e;2&0V*h zR@5)6Heef>dLW^z{y061Nk9wOlWXRUVXkxzXV0y&4nH6~71F&Gd}~lVGaaFj-)9#) z&W&$rnDKsUV?z(kzGmrKUhXBR!A6W1e44DBBre;c_&U?J@!r3#0$BHfxkVUuE$MUb zHAe>&e^!q00adWK&)aPnO;3+-lRPawHbff&^r|+fZ0@>$%YW#}fc=CPgFu0iqEZN( zjEtJIi%T~ehd!F}CL<$5Gcn093!SbYZCrJS-VZHl7cVAO4mk4*tQR{;MOviEy-?(z z#xNc!0ae=w^Ig-I_;uK|x6e?`zem_V(!p%|#XB4F^T|uZGMU)y3HqnH!JKz1H1F%` z7+e*~R*SVOOJtSP8VQ$#x?Te{MwWy?NA>aVj&$LrXcRWu5h zQo~5=x`e%qT((-u^+Q~XzaRN^EWbuAeu+aEz6bFEbX{e8;+~w_;rySyQC$8(Zxm38 zygpWPZt45ydexC&*I?13v_~!Oj9*B|qXYD4p*ta3bRnPIOUpc(8WP1f#!8?_*ZPZq z>ZVv(7k#C^#SCd%Gv~^Ay-AG_ar9pnki&2=p2MUROXEGZ{)PHa>Cpa1(n0@wYd}Dt z;w{9T#6&~T5Qp3H?zm+Z5<6K2il8#GGC%4qEjeqV8IPR@_AN6jOC=vd8lPJ`-;yZI zm}R)_#3H6)WOV&ZL-^a`IYbQ5%O8^*5A6Ya|MW0WmIuHnSzj0Zi@z>M?Yp0%Q5O3T zMB@X)A<#x-Jb;BC_9~4prVs6YE?A=Z?qk_Nnb!)w zHAA8nY{M-A1#N6?R8QZI7@Hi=t7A2{h-0>H`H^nPI`SaBj_qHZ=fF?YeB~!EQ~f;| zt=eyAf0nch1IGOEaNe%rPKHQyRYAYkKFzH=^eH#t#OFg@`KIxGF0scrW8Z&%t|tKh z**aEE6C#=Y{+ay4*HwSt zpW(g#rkBX2loVqPe8=XZc2pXNWmf&bh5R#`Zg%F9BHM;zK__{G<4Wc-RsDv$_*=u7 zzhISEIYcD_mi;mS*)bcC9Zzf@o3g&bcyilKCjb-9Ofgpq2(ujROkd?E+pwIGSefM6 zF6U;9v?srUXBTl^O58DcSHo^WQa2>B8XIFwZRMwMhh|*vh+G2f+H&r{QEVGlk;lVT zkdHd)^egR0vx`q-SX>YTp&>^tCz;XibdIsGvkq^A*;XcTBB(V(eU#3y*Y25thsKPf z3f^f+NgUVYk7)-hW;f@a{*qjLWY#j~4MqDAKY<@D?PkVL;9w_)_hTvSB+VnMNI$a~ z-D|7JZL<=0Gkyr$jK_<96A_W$h;iWx2YqmBmM=E4NNpw}Dat=cvz9Lyvo8W_H5c?7 zz8`y7R9O^|u3ZH`6_vytpP1}T0!1ULyChIgLTra~fI60xM{eMn|GL2k>J2u$$X5KM ztnOVVq9NA|qvP7L4>AGLTfk1a3bqa(si??^|v#x&;uKHR>{3&BqDpQ{`=RoN~Ow^ zbG`Wq{rx;?ye3@YH1fK-4oGyJzLJun1&)8=`ne4G2ePuV=!sf|V`5z{+u>#5!sMkH z$if3Ry9MbRPF=~#M$mVNhoBQ3YZ}2y&}ZOovVSTlhu|<`sX)Zd9ng?T1dQ(^1}qie zKX8-;{^Ll_V)W6cefZ3#nxFAETn0DbXxGv_1RUVsQnR?J-^joRu&ZaV}HPD)Q;0{U%o6pd$m6ES*gLO&buuzj?WWVyVD0A3`v; zw`*^La;WS;n(s@`2C?~RF}AAfY@tBvRkbLCgg@--^?&QJZbD(G=Wb%oa&%kv(K-qskC^YqG z5PQFA%;(7}vbvel1GZ6GJf-&y#w5oz=Sh2JW=&ahulruZl9;eB5!?Oi5e=&l>M8&N9Y4SZk}eg042J4s z`M>TQS4}u!HEzhBNes9W`}#JgUPEowY8C%wgrA~KuwPxpwwyW=gdWA1HDV*0JzlqT zHe?-AprBpLeI}tkXHfM(L9$jZJ|jp;TI({ikZO98O<8X)y;i^(No@y=u~r(3u;!9Y z-mE!@3F57f>C@-*$;56L+^=zDd_FkbN}x;-6xNv zHtPtn)IClF!m#8Mn@p~~!*6F~L2?xGT=DD3HzePzlW%_ifd$i_6B=_RyzK(ud~;6V z#auN!blf%RQp(JPIERO)47MafXZmx2*o^+$+cL8Um7QClr#KvO$&UpoC69Eh0d{#9 z#{-~pk%7m>Qg!Hb+a{dJ0`PC!i@ZMsO#KRT1|a&kR0iyEhvV$PR|{sS=27`}N!lYK z102t^0VkO8J&wN_qj-~ow(y}xc9Dnpu_GcIrjb2>{Q8b*B(~(|3*X!AcO002yYdVO zpN`%pFtWxzS^Cax*;wl*XdEQxt?-$Jtpr!(H+_-iBF2h&mRm6Y*wT<(eB;a8^2$Q> z4Gp1fY+emgn1P$@OAzX|o+URhF;syelc6)k>g z66Z!}p8EQ2e#kKZ-z54OG~`~yJ}VQ%PoX83n(eaVI!s-PNeZZG53V1*Wsdl=Zc9Ss zjA*k)6)E?Ku1m_On+BcicO_?-(6b+fsp-|E+>^t1obc_JE3C8fpA?tGmY2qeLl!zW zn9{y94ta$PO!tWwAKDgQXXwG2-UE4T6x78cXNrqmtGBM3UFn|H4edm$a0)no&nvRD ziIM6TI%%qM9;(c2La)P)m{Amk6k#EyPZ4umEx+dih&7I8!Uji6j6}8;eDfh)Z>p3_ z9MiOdH%V{AW);GGC#aI!JGzH1vBpZ?Y!dDaOM2WmiA~Q-m(%Qj3xf$JUrtMJ0WY9? zJqTX4mD!XvH?F5#>rBe^x~t%_WY_c{gQ%^Taz9gEx9{!LU`ZbSKQTTl$HSlMs zt8B`BjVQUa*_3_PGJ9F_x};63EldB}j`)?%q?h{PEkn%>F6!-f- zL6yx8&>fT_xb@m;14EMU zhr;jIg#i~wdr$-M`z86JD>f9oYDT^!U;Op$fAdMsjxw__YAY*fbgN)fnVDD?E@Pl6 zMepY&xEPylZ3M3t{CX)C2}-B@UP^$F+twm$dx(&m_>ife5ob_0X&9^W&Q*ijO18k zPW|8o+lYDUKDqB76?W@E9?J|5N7s#~8R>kmRJ{d<@f5 zGR~e^xUK>^crMSI}^NF|Ju60 z$PC~3X=?F*H1+k5`I%4Lx5h1;m+P&K94wC?wtg>ja$;jut#S0ta?*qP)URU7XGI+z zoyBaI#)vp;J{#B9)O$7HG-wjZU-oddZ7+xCKU(_f=#d96^hW2;9N&WmY8Qdl1uGr5 z+KZ~K7wUW$H;T5-E31`qTkv%gLlx@Zvs-wC**4f%hzSjLXIYb0;l>4HwI;FghI0?6 z3UvMYA%bxtV~MpUegX9I1Ge^N#hFt9{n=AK9sbPn1IuI8XIBS`ax|yp{5V^kxWhhg zb+3!$)Jm$=rS!YFr^5o2^2}>a6iT=BB(|~&GhjDAFIJziB)_6)*48?Y#fBQid)(J? za?V~^Sv#nRY`uicFCs# z>(?bFZ6aY^tCe$WzOc6LogfZDuJ^LmmJ2+}oI9*&%eeNeJ+26${(FUrwybr1Tr4`( z6a532lwuaiAGfWWM=vM$`ZK57yGP~7#rD4!wD9P38ubleN*9z;ruwHft+BCcCW1C=v;~%!=`JbNQgBLsVEdY0fSBWecE)mI zExl1G`4y3z+mga284v4zHZb|)h_N*+vE8hWTo-b)n%6KD{;ZUoUl$XEGpuN8w#QBj z1u2A~7*bh_kl#V#5bWU7y@rJix^M2rDb{?4pi-Nw;&|5&Mi_#EMfRNCp0VW1Wwlvt z+`CcD2hsp`%{Y2IklLvi-AP^hEF2y^{W&U_9!sO2Ro6 z70M|~);bU1Y9P-G><-`>A1Tc>DwkMo_G!m%vZO=Ov$Zdqs_F6c$Cjc zTiq(Ka8(@`iy7uOC6}6GWLKQ%N?}}-qOW&WmJ=CHsmPJW928jjswNlqf&$qZHWBm^6h%U zxfd0;e)+hs?p6=G?%s7_xU?dI+N!8VSgg31Gx^#5G{*G9RAAkoFu4BcuQk4M@W!t6 ztPk+GvWFtq{#OT%;|1C6sNgvMH}!`l%`Lu)HhfIaP#ZgrN}pqlZ3^D=r6A>^-j+HY z_|BNhb;VspZliP|ZH(t|Iy4}KX~oly?np%2x^HL|jGsVQRE0iL;Zj(+#%Z?c*6Ml` zx?@;w*1!02Wo>n1iR?^SAVy3gh4L#MV-D@|aQ<79(_bfd>1W~If1`gaQv}jj*%4Om zsX3yO*0@ilC#ee-(CIvUq4x;Jba9unO#gT|lRj0yiA_AIEUzQ{dZKdYNVlJ za_rh==#P<;B=}r|(Zs5-zXEnW^@%3Q*w=tM5{@_PTLi8vem( z?830l1=mwzTi2-!i*>E8-z7zkCOeX=X|w-2AKvmCaYS@(OaH= zw4zVPO=_4B7B{nKc~w8Oc5ddORZyU?s|vM&a{blD*`Dql6l=E%WpT1Es% zoKH^Ndp^yM2yqj>ZYQjm_vun5R(=L<)%5aDh+EC~8zQ7>RIi~kCUmP4dELyh+KCt& z^j7h_PmMVvmaCEfJO*B~5ve)vf1aTMNya$}6eJHqEwI%qI-IN3wHWy`--smZ;now5E& z`&F&Bwe67@%M1qgl?ruJi$qx6m;Sri3=z=A{h>amOb6VtQ2{54MZ+8Kqhiyv?W~HQ z%xL?r+BpUG)ebx))G%4MT`WL}w9pZt zJTgwTE}n}IX&G(Fei77QRc&e2fb3YeY5Tf;?PfY3UQa2a*}vt%tB#-7H%6mX11^QG zP+R$4Vo}`fNANj$vehZpzX~u5kBd7Se>+D#1cMlJiEQhf7FX2UJP1-QPlVH%htsDj zl3sF+)8sBjrR%qSCxVIWf8ONP7t4U9YjZNgO98%jD%1W7oEWaWRq*FP)w5j@&8HMc zR#sLT*J7cK+^%a>pO9v4?7)lRW{*cvZHQcvqS#WL_%R4AT$_|X0 z4Z?l;dlrhl&;8BskTC=^Xkc&V`765~4O}e>P_DxtVx+-F`RWxG*T$A^kY+svf} zJyd;KhY|c?`1{+==y`NQ#+eRyow0AZjH_JgW}Olww0q3~cEutgq~AiFb9t&|jWyMC z&$9j>Z)L*BC7T#LFSNI0o1kP1u1E8^D)?_z?nzSqof`N@kI(iOC>OiBz(t$OpBI#l z)utyuzP#bzQUA80fEC(k3!Oi5Fc02)L8EZP#@fev;lFRu|MKqB3x~l*^TON-{=Y#- zI$+&2$T~=E72-LvJFCYP&x3J2+ofd3j^29bLFbzr*M&05ZiGS0IxmfXU>0i)o;%Fq ziVcxisHZhHwIomq+Sb}3Cf??^KTyMpEB^1Uat0Z_N*BNRcUc5^mArOFJIvCl$A5`{JTj|>ydGF0F;`tFcN-sGM$N@+6(A%nAKT&b;xYO8=htAKj9RO{c z@^R`lpwSEL~Do(f#VWWvjuU2 z^X~kkt2KJQerM82l^HSU+QPNN4#m1=>8!am^Lm>6{j}@r#vz z>dqD?vpIC27U7v+Iwgim1bcP1c_0B5Lu+cSa+WJS9Q7-LUUn#ZH15_;ufD9ch9q8? zoD@eJGv-te70U2ETYS6Pn*)~SXY}q$NeT8Ocvd-l`Vzo^_y;c)VsZgcCLwGkVM=w@ zX?Q=eJsf#WSAA#AatGuQM=|ACE<9CJ3*VeGk`DGD6?z2U^rCHu6fhbeZwPKxU6W6E z@F7h(^`4&I7?_n>qJ^7WF{Gh~46BUVY%LxE@e*v(9>Ygw?3Na!Qj|U&t&0lT$GCxa= zjRCuQ3W3ptUen1}@_Zb-&4}lxT5ADi4vH!M-Qvu(`!!i|*a16_ zIc;7o%*)FTu=xHf8-Ch)Qzs%Y-kiUb6JA(bJmtkB_}O3M2PY!v-H&dK6(txT!pQg8b_91*v4h& zqdW&XUnaCTA!fDh#J}2w+3@SWi}m66NXkCdtu4E=KKUv8r4w3v9Ixa#5xZJO2!Hz| z$t}10eGjBZ7sH+YmKKZ`ZeK=Kfg;+rcH3eLba>{s z?~qRO7kVT97({+wm5ir!=WWjkvp!H4*U55$fnwYIQS5aBG#~nV!6`zuKK9QLhD=ii zEqiYFrM}iXHWv-NG{{E&_nz<{wz1V+eV#q^1xGLpWf2zX+A4D{-&*ez>RP*US9w3{ z5>^q%5;66H4t$Mr%u*J7gmT z6WjjH23X_dVF1WuVrs6u+si=T50XZ{KRsMDU(j;uHYRrh$)7E^-=Dw3diQ?y3XX!b zR(>f!3fYn7JfoV+;@%v^{{%Mxf2I73;5d}^C>;cCw6lrY;el)pQ_1;`RCpdRps|tw zhXyY7qTE%_y01SoHeY4PX0*;Nq*II)QxUQp;(={1g&Qo6);zn(-9CjIxTzH%hSrfj zsgD0LAwNE=5>Dm+FCt(W054}V6~7^|cj*dY`0TXbe`7;TBWQ`rd98FUYWaMkP{KYr zqF*Z2pKBkuifE=Ni6i;Vxoiu2o(zX-aWM;L9A!a`dgg#tZ+iLzo!j)yrQrC@Tj1mj zwp0~0HBLM@0c`@mvyBG_vz!S;DQ&!F@W@jF0Rmf3Vd)A<47V>QNdH6=mX#DZ!jqc~eTbg4zpC{KcW% ztA*?bU+?jXWi)_G5t5LWoypfh@4o(HWbD!9Q^}8c?&UmYe*>>1Rs{Kyyu!XGrtD4* z6Cptn8#}l(O)oz2V?+;`^hKWC8J&XFpY)Z*EM^FOI!!*|BPiOU_--70sX^u*5w4?} zrF{wL#=VMA{e6Ao;E>1A(uMCd$Q<^%Y4Tu`-dUCoU&W#WNT^&3{!kAhinqPJZ_+1E zU4^}TtCcy)+T;~p@&yqX&66Gx8AlVpj}H=~zVU6mXcOB-`6X=;mQI&ZcnQ5P;){W0Zi? zH^#*5tGkYgK6FW{ay>=c4jOkfWI4xf=&aNu1ststEO*>Um+?hl{UM4E+Q*$Pp;Z zNv5cn*$g{?0Or^TOcrPZ{Eu5SXQQL}Hi{h2gk`7lUdX2(;w&o&HD$NW>COe{)`4Z_ zg1*a-`Xl<^s}Qgb=T7UD?RnhEhzik)vJBM`oo+VWCwj%OLP_OV50lbEy8usN7|i86 zmpOoo~|$YWu6jFUS2bBxAD;kNCQ!IEt0TtgG(+1TkZX>#VN|RgP-K#|m~&2b4g&iSKk? z?e4o6!O?3O+t+N{Y_&kkqOrz4cjjLc?q-`$XabNipNy?mY`)Dbc;6{BS)kjsRm|!Q zy8acZ#{GI0tkEV^KM}cQ*UaNe&rLS82UR)KwI641*|&&ETirjT>TPw-6v4Ro+R!k@ z6d?=3xSXJPi{1!L;9rLVh#3r+NS|leernT8QT?7lpI#H3rJu~$D26_Wc4~#MD~TbH7)F{6Y8S)nrcJ_P_Qq zUC_tm>XSz)MZ$PAE<#8>a$fCb7IE{N$%BTXHX9)PA8O9d5i3tJM^>n)kP?e z+}bsT4!=C%G|{!SRP8?%8#4$ALP^`SM%$UH@`a|W@iI$<5Iqu453i5Vd2l%n+M~Ul z-Nu+PAC%yu^lYco$?KhNj)*SCJ6L6XIHypt0R@5IAVWpm(9-n_y-xF&FR7mTSJ(!- zCs@LWEgIAT>U-xwnF_WCixezz`BZU3ZUji*cyER5u9NV6qGD0u&BfO|&&?@&n=7*+&ikYH~jTCigIhSAVP2 zVTRAo_xl6ab?4wGjeL{j44pEY&-?0F)iMJ`J5s1>Z;M`0uYX0s^01T9XO|nJKBjNgXz@0R9lxMJTa zFKfPF;|YP74PLMq@wMC>@iORoDPQ&W?b^Jki~2T6dVtNx2o<cHMceFSRRT_E*>Uzu5hbO$)wAby5hm@M~|S6%Lnl zU8~1$YM${!I}t3>&V39wLzQ2Q4Mtmroasp2@Hay6 zhf%OdN=h!3;oX2MHKWut)8YOq(8iv|x;a`{Ni{?LJY;9RZejzQ%}^*K7j_mL!nBm0 zsnirL=TG|nB|AM-+@egDDOG6QzvDmd3iiHnP9EUj_3akF(Cm%sj!*=r?5hjxNF6WV zsgi7O?>+BPY@Ao>SXH~w>^GEgY8ZgIfkQ*cgwLj5(ytN{K35JGm$)XEq&j}Rl&pLG z%NOdK^E{H)_n-7v%BiRfy(={N8ky!nB9W5I5?#4c;8K7sSd-w;9rrEYk$B@vIxn$L z!vwHsJe=SQW-}Fk2(boCDID+}F*&xy6kytuTqfAJK3tB2ePC zDu>ycFs6ub)`4XGoe7I`RrPoPX#?IGBg%%^ zoD`nW!fb@Gh&wbB@^zEogD;u8y1H_oR#Fgq>ZCXz>lIY`lg*KA$5_Ml23sW;!s_Az zg=x<&X2PCaZfIdfr#yO*h(<`;p;_TYl-dLF40-ETKxhIimoAYj7?Izml&>lt)7X<0!PBW!~an4MYO%$P1k=58PZNjknHDfDoapTJDK zDHdC+^U?JR9|1F(CIV2&psg}T;+Ierexpw5o2@k{SS$FU5t%L1{ z=?GPqNVKJbon!7-MuL2zV%F-%ybh(TU6cq{gGr06T&E`7JQB_u@kFR_`TSc{xF%C; zH5G0A!q$nc??izrnw-~j%6$kHacfn;DrX*z5Kn)Ya_zO7cc&G=;)z65jA?LU9g4Q5 zuTvc=5S?-~KT-Npc{dSJJA|1ziRsyye3$THfG!6WKZZosVvol)S*{)PSnu3=(Ksq^ zDC+svjrVXow1o#I?KD8}jJmCufumAyk|z70O9EPwUKp`?xO$1+^PbYlnMW`+$xd1+ zfQoKyP-lrajdw<>I%CHXl_||JL+9>yFum<-i%$yoA*EDSvT=Idh-8|>x>)EPL6SVbxhi-~;tl77o;^c9sg@t(MbD?zV+Q}_3LJUz1Y=Z? zYp)0_u?f#i$h{e^KHN~Y<6geJWmHrYCjN06&bXCD7&`7A&k$h@r}NF<=f%9bI94}N zNd*bPd+d;M4Vq4;M!d%8B{dI_*1#zo#CgoNIT4(|E&bqwUXpdF)a2xY}F&(mV&>8-E%q^>qMbHmjU zBtKf(3U4KKgYar3a_dLgvZt%%v%7>ian=3)OBi=u%W$n1Ra!h3SJ7&|+SWm@$B4Z$)f>W0`6R=RZt56Gt%UD0%4w6N-&L1qNxWAoF(qOM*dFR&P$p zGSbZ3w4RWU;> zkJ&oWp(F4vZV^PP5Vt~dUgS|Qs>)QL()L{-c(Db(GE!-m)sS1YHnrVA6WK2hB z9DHzFfBrBb_t}jRO#BVJLF`Vv1?IXtOh~~o!;LBi6KqD<%(?0g>*hAr&N~m|E(%{2 zlXW|blLB&pSCk?#m`plnNaM!PS(QHVIM?0}BnmKRgx{l#_wwK!{`~>w=YBo_eG&Xa z>qnTDO5qHu2K-Eg#!V>+xz<@tR)hvSDDz`#6e#VoE_{vKY2qm43`wxssQm4zVE0<1 z@=c7XfZB^Oy~1+&)2KM+Vti&SYwpzaNa2p_E&n)C!7JNJ!scNFiylT7+;edO*o(1G zXM(!QkEVGXHjNWiVM={{YM608>!P%x$8+l_`YAKcAs#8&?TLsp8b|HVrO523ow`}6 z;WiEPM|2Xu+N(+*Jk3=x0{0%=y5f2o;tBblB1$QeQg^8$P$#T-pBG8;=}^qf3@@YY z=Tgr+sb{ z6A9%4d5{~dm!d_$LPi9K&rA$gzB)iDf?V{otOub{SxpYB4B&TdPX}z@L4tGL<PnC;B#S`jG#B zxd0ZBF_Cs2^6anvLT}T(5Okuztb+BrqHsS;b&EqdgQkXR@zydkiEHxA{-1{5_2p`XrKlzOTj{{BTu_8Y+H@kGqipFZQ5^o+fJNpUm6vk{# zV^xGe!1{qWe!NQ!78<{^IknUgzis#NmpTyVjJYspG0_tU=}5UB?21Fk;fk?YfmDwd zK5HpVjKJ_AWhBf>rX~n*1AWQ($y5d8Q`PLTNq3oN3lCN5grJT#rFq(n)i>yzofD}scS;4HXL-}bt zF&IrL=8ehK&HRt)sdYqmF&6U%>lUML3r_-;`(~|m^neHFVxQg5BQ@X}!iOUCCBa~s z^Q;Gqp<3`91!HeDmMA*j6i3R%gc{I?CL+iJCi1^uuXnxh?>ZRqhc4NxfIsK|RaRwh z6stf0QaHwb`|tQB|CSapA53`u>)Ig{xEth~Yd*3Hlybo|{f+8w15LG~+^$y%xdz6% zjtVKRy*-Ra6f6Fdye<;N4Cc1oap!mA_nNX1@D_Oni$PDjOe9$-LR2<+AEP~{W&(D(^51`GLEkE8Y<>84wjA@ z9b4%YGR8A*e|6~iw$bcQ|%mRFmg>NtBV~mUu)kk zB1j|^`1@N}dlaz3JG)LNOC^FG2c2fT&5!^iyyy)BQ*1na?uHY#dcm#GRZE1eN*Wz! zHw2xYKeK&~)I75q)HGc-hX|v!E{7hKVoL3PuXXX9Pk_UeQO)TocZY?CFtx@xk}MAD zSS-zXRLUeK{#2?6-qv7gWS|K-QCiNw&UMlzavRa@2CdcV)Kv{$&X-6e&Q;aehjMCRia>wzX& zVdj=I15N(2mo|WiFfrP1?I_Mbj{B533%*Hq`Tf->pv8Xf=gtFkhK2910&kK_v#r(! z%1oY?xvinmkrXV6x6?X{z^3=`F@NZAY&I=DT_9I(a;o~IPK?ASu2U{KM0Eg>(>ROO z@u%X%8k{Q+x4HXB0D<^~^AVIn)PF)HkrhXY|JRmU^hnX`nqLg~3O}ftVNGhv)+U~{ zNh>8jSM@E1cCWW(M0PWh3u^znSg3Eycrs-wP607JU?*;p)$Jtd!QM~C^>fsBiJ2^H z&YaHUc`N6?BLIlo0Uoa>*uH{D5X^m|k?=u&qD3xGx6>`BHo&muTkUku=KRzB{=JIl zp2bt$ zMi}t_6!xgwyKb`aKs*8Ab$f|h4e6zQ*-|R%R3d0A_iLspg0f@=^^@QFOpt>|6k-O! zsmv!PJm?>lE(jdDh5}$Wd!FCz_M0{-qUrVJibZlDn+IVQ2%pn~9BbK(bKQnGo1>(N zwHP;EJ8gBNH5#kex0N8fpdqUf>Vfi!yQ1(FUWg39=NyNMuTQqbf-vHQEEA16rvU5;4{&id=SpwmipKnp z*SRgcf`oW%q-1#tgvF-#j&U_s?h6?3za0%u77G4rxX#g zD7wd2Zsv(!ce=JgB29FrDd)P891v@LrpY-u*40;#3vZzH4CU)JGME|$7>~Ha+=t#g zBdU!)5X;Z0I~$x0pWx257!)H$mlK&Uo%Zpx9y)*%U0q!rx_J}jfhV{txq}cgU4GqI zLt4kwID=MPNLaTJW+~55AzaI{RCCtE^v~Ex#T#A_`Ji##X*j#9)O+yC`cHt=aQ610 z?B8<%9@AR$FAZwn+cUQ&MaA_?vLp@|(z}3H_=lZvBb(?8vcD z3lQ0sEimi7K#sf4_2tV;k$O>$5D*m)V663$S~*YLCX_>_wQ}{}Ni0^=g9P}^2}pl` zf6td^cb1?#7s@v$pavME+f~zU9%3IF`4iT=;bT=~ouQFu_?!E_)p8_u7Ys_$>JSpdQ4gB~tkg2`RIN$3U5dEkb}NMD#E512O3a zP%pMfG5c8=n3h&Fe1rz}feHeDKqg=rq2fZfx7~phJlAgK5dxc4GOirI5dv5d2Pa*| z{Dj8=r6*|<{IKgsl;lEaHr(LjoqF%sQ({glJ$H%3S4wx3EVC_ZD3_-ikD;?{-upZz z{sC=!(rAIM&ak!}EV*lX+7qAnaGT5)wpR1r%fIprq~y@v?>{NpvZRGCbsIMulG^Yg zK|UnP`HMkJilOA`&&}Lk-LV(>TS(?n4p+^i(34A)*4saFmtj*LPP+%?;UvDVI~B*B zR~BR2`=_8iR>UAmGQs~4wQ|zg*P6qr(pzcpNrCvl15~si2fWV;IK{x%%156}B_^|f zn*4-^xLR6Ta?SgNh?R8i=lTmRAxy#|v823-_^saf20)-uNnN;QJ#3Y&95MQq*@BS~ zFGY}|e)CcxUg}AArWR+ku;p1sGzjw;wZ;U-iaXMt9CF%RtV_-ZXU6nZ*a{cOLEON8 z@Xp7)msD#Ik;~=q^-D%I?x-)Kh|OHe+-LLDM$$y*{sUFYzs`w#PN4O)7sB`L`)j0U zPZPh8nIy-+5WMHl?V3qJ46Kn_p$LpZfinpphR62N>hK?9`)Lq$5kz6?=5(-~?OpCq z6@hx3w8jBJ5YgG)UEE^rDv?JLURucmr)Z<5mU11su4*9X z+O02r9;JEvQ~M@EK>+}O7xgDCLBgh2^80_Q)Mf69GBblRjX#gkI48OvAlP~O9KW`U z8EDKNSzno_E8zS7L+=CsY}DQp0Kn2BJ(P+%qVhryoi#WC+RSKmHk6HpbueM0Z?^5& z<3w6kDIEN38W;N%^f-gO%AD1&NV^ig8kGTJb&X zK!~_pBb90WezV&gT_5sR46}Ie8W||~N%R3j);oXT?J?$YBnijNl`;}r&zrQE40XGU zB(_+(&;<~Q&5;5C2+x3(yEofjv>$~Qm<1p3@+YP=O)cAu<)<4|*4Tpd2b-nyRSD#n zn!+7WanA7qgKN*h=(E#1{3}=A^DbzjxuikO6Mvkx#Zk78kQ?mobNA=DlIN7k(Wp*` zUz%St0Qdj9<@qCjj4_4`@JV_DEGJmh?|lLxk)XbeH@jlO7dd~lw{rwYBDDNj#BtHz zKz;&115`9b#o)ws(%x!a90PF3w*gmtS$l8q8Ry;_ABHCB?J?;_Fz^_;mU=+QRL-9z zuzVX^9_F!y_6P;hLG<)LL4F~nBKalmMgi;;A7 zcuX_3?5t7lUIqs&$`EmUslYd`+Ju{4 zh>hWiU0|W9b{s_7T623Dndzx}Az!d-DXU-j9>}4g{6bIrhTg;9YF7W5OgAj%f4$o# zf0*yrzOG#X3|#a=IKFciM`8a#4l-M@(d^7WIxaGfN&#~&IN_!5O|Az5b=-R?5Q}{( zo@1e6KgOyZHrK6t%UlcL^QN$1u;01o=;+ux5e*2vStYoiVeVX~McuUQY^Zqm{4^d9 z;hM8vUwB3Y>{y`((^b41ZD=%u%Me(l$E!RxpAlb`Y|EV1&Xq|KQnaVm^7SzAnbPUw z?st%Yc)PXEov~T2&3~l)r14ga=RVQj%{4}59$F_FJ^OEF-sgE0RQ_+mEHF)iGtz*V zCi+S z$-TbJl|Y*@5?5k1awGDpL1TrOd^jJgx)F#=2BLFD8BNQz6vjQ}9O}0ZcpXsIcCOL2 z-oc(89{wYO?gSjyk*;CU|F#&vkU33WDc(FecW7@z$#RmLK=B{i=iC^Do12>rnG!p3 zQ|Vr+^7MBS*GcLnq$B2nGV^SiSKYj`t82-({QP&MY^{(gx5p|f$2JQS60S4NGGByw zt2*7}9BUmM>c*+t(Pjwrz?78*zAC!8m4VsbFlC|kDSSRQ77Po^P>_n}mDizddxBNR zeJtP=%U(L=gOvImvnI>1iw^yD-0tSvl0DV`8v}J?V*}*5z8UAfX3$%>^Wa<`dF_+u zi-m}^dYT;p#D#k}SF30{dq)z5XI1I5QIsV9bxh;c{ zEX_^S5Xj^w@0YQfzwMX5kvf|1qa-73+7L4io!Xg;F5CAC$W%eSoZVR>#;@`iY8(wv z7}e0y@&cp?*|Wq|f%bkhHri&S1~63pOq10!mRM5*Sv>(w(ixXrma8|_)Q-jopH$}y z4_4vk3$CG=0=pTLi{VXltCaDN*P>{$AQRqXrlUdTw>r(7S&+s=9Lcr(Gv|fDZz(d` zaY_Qhk_7$6+fyn14{h^nu|)1(vP#;&X7^59saac=uj2U6d@BXU{^*=phbYs!U-Og< ztOrTNYX@~ISY&-B>G~=0liX8~Ri%8h zF%*A3yfHe!u!h`Lkd`Q8zcw=Rf&Q(%lLq4rEnIL7AwI453lk?z{Lss4xnw~#tIuyh z(7XPhnRI9;$@ApfUTDQbz#H7NO}-;17Y?>m4SM|!qHjbLNw>fzQ@^7Ho8+t-j2H2n zJ6uF6G{AP)OxIg;auHg5mjMi}i7=d}Ha3a6tjsifh;AAB`wVvFA{m27u!!3;j`rR@ zu=ackHWKgaDqjBS(EWCGMa&auhx=mbt^jA>W8J{6Ng?AQ5w2*GF0V(u@i*$dPpP8$ zBf{S{7LRXz%uCl2i;aiDHd?T)9t2{yorjc`8#t}fVd4?kUV&Mv_ZN}%Nq*;rz*IoN z>1X&c7kNL|ecmQ5JNLYK(k zt^FdgBvlRM?~^V6evn1uvg+NOFIQ6PLHLS8XpbEF#Hs0-`OvijMNyZ{Br^)|ya9L`2Wp_fu*fsNxe8A| zk=>+E_;ZVUjK13-!Af9X7;LH3@aJaZ=S2N_(Q) z;(i|BrG;^O?xNT|y+E@fDxFtQP#_O-UzzoTv{GWW-QkKVDxm}Lt;-tUp2mS5wa5U# zdSe8>(!9O5>(t>%z^T96@$J&pK^Cl z7sfJj1`1qfS(#fqh`DX3aQvu`di0R`&1M7}AZh)LWp?NB$HY8&u~>>AXn8SA$HhKA zN}O{U8pZB7kbAxx^}^&)6h9?ccE}m%f`EI2Z61eiiW;pQMNH0eCl?oU+2;%LtBunX)F!Zx3`wJ=oxMI(>k6hT#;2$BB$572g6kJR0o1E=$8i{bXCqrX-BsG zgX{8?<)CJNAIPe%rUQ4*-ZaEBdmiR1u|p164Sw;Ar#TSI^7-=%t>NVfH9`~6k{>Na z4L^ZfEGzVWHAFlXeIqI>*VGjT-hgVkWqZ4#?>a|BqZMjBw=A3 z%`IQQ+8k3qv#c>vJ1hLFeArwMS+RbR?lVYR0!ZjmGwNL~#o~|pqnf4*ZE`kRwAtA8 zj%JZ*|FYjk27wf#1ZXQNMt{{-sN1Hy0~w^pBbaU9linHJ9dlE@L`)w;y2lNC^s`_S zi`u@vCxxqmy1(Xa@H6F;%?OL0umA}@OrzE3Lu`+Y>t-@=Mes8>Ks*P98Q1t+`|1$MUOn`k4+z8rg!wd#S$ixf5 z!r4NyN`Z8ez5BDC%G`z>s0>hgsKe^$`wD=1HB&poT>$-Kn9YF$s6t_15NAwH9S6H@ zR6TCnzKiHD0(*lIXpmaMmY<36bvK1&Y#%AJe0%@*0-?RTVB};SLRkpL98HU`k}k`ZY;)cG|A)D^ z4y&pO-$n&dK}9442?0T*L2A<>-AK1cY`PJoHeu4;DJ|VC8>AcQRHPfEOW@2_(O2L1 z_kHKO&Nixt|!tZnhxb(#JUlexd%QyKs;!?(qNrXyeZq=v&k< zf&`mSQ6R;k?V_m#B9*p4j!UI9VLf2rx8TLwZoi;Klup64a4i3su~AU*BV%J|B1@-< z0GI z*G<7;)mZ|ZtmNves;ms^-$r(XN9xd6KDAlStFCGwaw6walAtP&RJGj+U zbkKJg@@y|XFE2unI{Xu{$`8irNj<`V)?45s{jV_uB4O|sEA@My_XG=(>pIny`X5E& z8gZ$n3vVz1=j@Es=-*dU? zjB^ZoHJxPlR8k$Ab{dTx>ka!mR&peo?&zdc-BFYEA4cTuT}S1-$%IEf)Ow8L)#*j~ z;IoTBV)pk0KJv(cWAZgkMD`w{6q$`>-!axRxcKpG&%igX6g}UQBl+zm<4(utl#T)K zKsg4yAfV>kcqgX$^%kEe^ft_SkUXjGf8~!RM8XKMX|Ti;X_$6*(#D~1}bFa z&-7}}m=RW{-N|MHaD)7@j%Af@oLM8*Apz?=iw-%LtB%X8mb0@<8mM)AbbQoEf1&WW ziFd2nlRO}q+wDM}3df+SNDA7eES08|MX>%wT@QKvivF`zS9Oi?@r!odaZK8f9CZee zY~h(mZEBj8Hj6Wj%9CS8W$FH9_m)?k-IG}}OJjivHL^sjMi!hAaXCLb@|NVGj|(eh z1eT|rSSE?cq1;zQ&pu1e=G%GB5seol9)@;OT9dfg9e86rV;|ok3tMgXyAi!wH&E7tfF@>3(*P$cC7iM@^+NU%Ihmlm!be=UWLz!EFW zMr+*QeG(V@lwrs`hF9(=0hHTv-jq70dcnj+uJ z^}RchnVCr4r&ve4J2CUnUbG4KcsFIfzc*?VMeZw+{4prF=-{3TJFi}p@5ms^<9SeX z#m_FZyD0|flGC|C!&N@WZEl~ozSedjxgIHGzM(z-`M(UMg0`makozuagBjmSh5e?q9gY(FaL zg8*birJ2|kCW456@jspqfPsFw#>B=hs2E^@yTk>q5V{w{yPfk4^~8fxG0L>{R~77*7!V#O-XY z=i6Zg|(d~EvF{4PHtrcxRbZYjk zRIIcpWh^$g-->MOOgFjsN_MOA{QyT3`>Fe0H;O<=7W}NXvT9-Cn9s<;&dRkeO7^Gt9e^n3tT|H>2U#t^n#}}DrsFX z8vU~1`CpJwe|`AJVa!+#$QoZ~&(=uE_eiU$~59O=`!66}7)KmrI8JB;(MjRC96=O#4zWa~Y{^#Wu z@RJc8KDc`D?@yx$kWe_%n@!qFZ+?klrlI*u9#KrlGcz;HtUP25%am>+c8h?4=@RsHi@ZYEyDD*=QN`g;KtDW}}Qx z+?L+1x(cqcpZugX68XiSBY{K<8j$1l?%z%OK2ZM9u8Rr1dtrbmpm`FdK0iP z*KbsmKbHS3p;&+UC?+*>5>7CA=_sj@2ll{51%~%-N-m+ec&VCnGC$uS?{Gbv)96|y z{C@52i}9J0rTU>dMOr$ZPtsWv28UIN^L0Bnp1)5h&VefCc`x1Dv1jGrh`agPtEoA) zuu_Kj^L|AJXN{~@nL!fI!gKl}y-~6rE(2Mt#r37o$u({|e;EsA9%kyN%<4i0#}OKt zkIN+`C4J(}yDD;6LvGH9=f!qxtM6*Rt-E(7+q$wr-=NBye)w%)m3i28e=rWbb=T{a zO+f_ui{waubr`HLVwa$=bGxV_qU-eqv8_0$4rF^uc396f4w29Dd^UFF`Dh7WoD6)K zNspe;AYHbMZGp~gR08s$Tdm{rOeEZXt4d(FePIK6c(+Lda#Clg5Ykj?e&15M)Dk?6 zo?F>;&p8LW=9jM6@a=Pq%u2)PY&LPM>*-1Ox0>(`c#K^{>FU!w*L+A0wC3H*VD{{M z#-SozX{26u3ENt84k{Vi;*}#kogt#y2YvHZPawG%Mxpu6IfmOBkVF)YPRYuSNPwSgPHIiy~x*`B6AROkP?i&?5!(cg6R)8&XYyqb7Xg-h^P`&wC%u z)bA&Kdpl=pCt&|%Z#i|G%Ox$vY|Fp51Ggvi(sn!VimX9;`CQnQ-N6i)&e>bmlBX1| zu{z54J0d&fQd#)h9@CMhFgeW|nANBC8GGj_Zr44FgEdp@Qmsi8s0G}ylJ#m{G#X*g z(^=oh?%|NBFy5rJAgZdXU2AK0z`q^mN?PE&i{&kRpZLNKtJ(ITisfcYaZhnH{TgrI zpxu3W=v?2Sg0gyqc(trK9EE=0JFR-(kF|XFo|Xn{tzZp3oF>>I@gOiXC1jcsf<+pU zl!VFI`!T^f^F1AznF^hf$;L*daFarEc=ge$28^_nMquVHvnr-U+YWdr=qZj;hwfn}|qgo%=xF#uuiD8=z zOFYuCSc5g^7FX+Na64l&(5tIa`{F9y?_0;dh8N3-)ZTObdPin@z)LCRTWLig2SA(q z(+aIi;Ud3j0#9$qS2l25_tCR@zmvS(=!;`*8HpD1$w;BoT7=n=w5qU*vF6@B9pp|{ zS)iG>@e*zH=~vkCGfuTJeVb-G>mKQ?ab@*g!QdsQlueMuWb@ijXXnqR>6mk>E^8kf z?AUTA0wD<2gZW8aICC$#Wh=F_6L>$8Hj@?MTu;pIc(4SeXqxw5VOf%h^}#gVJ3 zb)e_j?&{&K2TjuJOs(B<@yceSnD(`+)a#M)(-itj+qDq6tmAuE22MgYUmQbc?hR!0 zJUbQ6-7z1Hl$l=SlIiKnG@as$+=FT(6D`BZCta}V&CT~)s$Y{)zkrRde#-;BGzqDc zrJuaS=iXziSZt#M3Ggtgod!=@bLq;6D>cUw8_t|N+M3Fe>B@qs4;AJ0${DCNk6L}I z(||neow+x%%N99Q#K2L;X+&H8ZT;D9WY`Cdh*G-aqKJ+3)D?<;#XYEEJ|hYTbNs`I zqe`qVYUQSd&JUJWg(PqjZMDrmFV?uW@kHy)QPu^UVNf2koS|yI{ic=vt*fPBThxjT zV{2FZggi%JN9e<$a}>Mta1JO8ck>C~;aU}^;V5!1M)AVT)DgM4CwTHAWgU~9d=z_& zQkV#|lpOrRceuL>K8zoG+0)d5 zUr(>Rx^%dhwfz>BbwRAK>aIGP_3V=F=?lS{Q|%S->=!ms?k@`?(2X9bb-Zqn*Tg3x zQh6>P${t0e%D%-4DHXSqsy?!`_7z)%_~La(=Ej<(<{A3qEG%t6){OEnYLW&&PB2^{ zaaSN1G?GrM33zpFzQaiq(puCMT8r)D>yui-8iJR6A6Q;d`Z%7UqA6?E+=2);@0X#5 z^n^FW7-FUt3T|m{na5}z|Lu_G0*A1PaqS2|W+#+zP z`PXH;283Iyba1pRLdH$^&i?I}ER2SOyq6y%6HPD@whKQ10WLZaoSb?M2vNXemH9r6 zA&R;}!};}GBl;D#@#hObUfmDkFAWtfwW4$w=|FDRKFt+V>qr;E=143xfATWnvRa3; z9vX!mLoQSZ2`dD1sOYXIYbWTp$IB=KdP1_!dy1869b|REC_H|OC>+AJOg0U-X)W|s zPF~c%Q`q4%p>p2FxSAw=$ua=#Qc4G^`^(Cpmk}RGbd!>#nHouSsW}9tzKW?CQ)$0G zAn$y2FYNkIQPPvA_-*@yH7()o>vdm({Ib}}`DEiPRTs$nK&l(199zY7FaD)VuN2hf z@3XC_v*IRj5YOLD`sB zBA{x*8pAHAodYdq=U4AAd_!+Gx@rxjkG+#OMguMjz(V}t7E*xW?lftxZT@f$D!E*z z&zCci+ngLijMq@fUF6XyF?46GIbu|9ib8+_IMl{p2EVsvy~zcsI&W_9)APb=Bn8UU zx+fnq#wurRI)wq4b3j zGU=F~In74Ds>MV&w!M+K7q^pBr4#W6w*mht1}#s?A`-<*x^*U0Bs~IbyCvd_C>(v) zizs4C|3@t|XU^V(5{^Ni7;iycyxL@Jg6Id;Iy5d^qDqi58@+H_(5n5UD2d$uIzSK( z6{gt}jInphDl1wpAO!@qFlZtZby<8`_AJnyv+$hRY=>@B5KyCy9$RlGPvXW~$tH4q zO1Ioe_$v8nfqq4mv5g%M`;@ipY1_wwQ*!g^BaLFcBpf_EiuUcL)Rb(wPxsh^zS=KM z(_~V`IvO)2ej9)<%G@~drR%nLQ;w#K(+Re+OGr5R;>PHKK`tzm$-#wazV zn*W3S)HmB`9p!{THK?_*T8u_DHe4l4%wQ?m$!Te2WTb*;{A0w|($tDaD*3IGD^l0Q zoAiv_M``l2RT)(x#~QzNvDX3BVj;_cHq2$6$=f_S>AL0X?|pibHe7V{p$POGgzN8WUG)7jhCAT9d6TXZ6Up`C?7qFyZHb=f?SS|R*s1K?#anTpYT`} zdHG;E)q28g6$aInHN8>@-7~jg+^o`vCMLqXs3H7j*1$N#(1Ul20FdU;im(@|7UAIX z`zp$2j&y^bxfyQmFc0ki=+qC>p}YqzZa~~#@#A*;vK(l&%h7CkHA!fMN=*;j`~_-8 zTDzA9E2b*kE-a%dVU^IKqG*;_$!h>6Cb8CV6`RnH=dCj>&Jn*@LNAe{U1$0V&ZhNp zxsHr1-5=+2z0U(Jstc@{NJp#-#1~08kbEjyNH6e6DXvGBUWhSdG8;8{Ud*abZ-#{P zcBCw#ixTO^9`xe%5;?Fo!M>o-#n2xYaY+vqAzk5?u^TEfse2jJr2#?lBEAnylK|RX z-%@kboBdG*xzK*r*kE%YgAd)`t)eox)Q$CZxqkBts?%x_MO_l8_nmN`_fclzl@5c8szPWGl;tnJ<=tQ#a`kPR4s2tlurM>DF7IM0o{-KsNXCvh)!JogD;R;mSo#fB z%eJ(d^|mRDo!%9yHGddV9nvp6G?GQBE%~!`dkn+Vgcn~3G2<#u%Nx};h>3}%Wmakj z@WLdys!JUckEy7sgTYyDlDlKKlAAc%x0Oh{)||e^$u}*}W*R!pkBXWYn{v|pGb!lO-!X*Hcx7UJ-IqaksnhXf@&18Up!xW4?Cmj_aF zbJKYGZ3+i5?Bf*3OY=fyCObj+TUhxu~1ePVLML5 zg6I(M-yOouV-$0pnF9GUz4R%Cy*Pn1H0{vid5ux6T0V+Ni4oV*@HYg$P$F~KD7YM7 z)$I7>*uS8rS9%y@Q<+w~6Cj(^XgIE5*{qkYO{}*1ic8jTL39$L^CAL#ZK@hSCO7}R zPt)A{U|nyv9W}ZW{Lj#cl96s!Tus$nQ3fv}_U+=gBRfc=FMHlRZECgD)1zz_-Bp%0u`?)LeN;YD+=U%kBhBmww}4-! z$6&*4c&0iMvGt>2!7IO;^;FAzS18`jFcrU9?_e2#yBa$8Q}lu6F0ZD04H}SWFHX76 zr?%STl|RP2c(A++TayDm2W|%&u!IgUGf)uE@8B3YYImlCoVij)%NrNoV#QT;k#c|i zESkcijD9XX-*9ZsuPMPIp<)#pqPt_U&4!o~x8c?GWnl}-bPNmrep+DS_Izb1PHl2X zpV7-ES&m~N?|Og>)MqQMIYif-fiJ^U-0I>d#fb-J?M9!sle)+kT?=KrRvo>08K z#9pG|yoISqh7DUr_q>9^Pfc$T-zMU{om@{wL5CSUCxzFxmrF?WFhF>Uh<9m?m;6c~ z&l;+=v0+U7uzV)*>PV$U3Z2FSIW!BL3?*tsJ))+jCirm#HM;n3?(7T-LK?2QPfQO^}K>3Rp`$6%IN<1+zP`Z5OO?Y#f%7-`}K)ud= zEyV5{nMh|=?6_}w>)jh%pVX`(Ey!SQ__951T2ZpJw-k;vLG(qVi<0Ik51BZg&Q?5q zy4(7-0Qd9P>ATGCkHgJ#^CRXua3yr7W-s2kq(Dj$tmiFC=4I9C$@viVC%5Pdl0n7z z{4c}Lr4l3s80?cGqcdI3PXja>kA^nhQ89*YLxv?`YZ?>*8nde5%zyOzoZ<4kiJ%yf zg{9A*^qVEK{oeP7qmgf|huMivDCL|1_w#dsODGfF z4M8Z!>t(hgW8H8ZYTc08lvFiuD`6=GVa|{a&Nsif&wdJz3oTFEdT*Q)t)tR!t25-* zUA}sNn&$2AL|n;TRj^y?Msz|$bs z`Uvw2Dn8ZxKPgx6_09{R=k-j?Tr@9UG*H(BQhz|B?*xTHXao5-OLq3+<>w>|8|-nY zdc6fH8s%xgfpcO0ghQ=ax1>_vzO6g7QSO=XW1`^c`#ef7$7`n{%T^|t=;QR16+$hm zcaYZv=^j@~nbxLBOOvOj!jYHfF5NM@r$9$Rq2a1e)?+M-^-GIU5IR8W%KG|ev!CE% zEh-%=9b*s&8_BWJZhSgcY7%L}QmoIiygP`TNyVs4MzmX`dm>4#@;sC1KXe^v!027@ zOos}+Tfg3Nt`PFfY4QMp(Rm2{{U*t z0AjGDhW7i@2Rv%2Xt{W!%HORuNsG6$z_m?Kz0ft7PBC#ii)KIwT?8%k&>?wdZH44f zJs~y|B#Yzt%4Mjdqf+IvTaeIkK1rWip?P7BdMQw+$BU>IR4={t1zl4b+lB@2{q71W zA(%Wx)i5aIWLn{UueyC=WMBU1MW4 zQGE$AqIOF9k4*2j#>c8=qeIdAhCa`&Wa3U!(fhZ)Z?{!1cq=)SuYMPttrC%(EI8>< z$zZN*v&f!amQ~^Gd_30)c7A?-2UYUQ>URgtRI?l-s0xGM;ozn>r}p=XdvD*oGEE4l zqJH^P8AwS%vyhQfInOOt@pF&Qk$uMyjBo3hVgiFwuH;zWts>m)V8$u;jXx6| z^Y~cxlEP!$@M{j{AyqM@&n=g8qL4ZMWBSz5fdGaUI>HANuYOIMpQgz!26zJQV(^0> z7n_LAU;pz%9?}O8NO~hg)ZppUr+u-=_FN2Dg#K+FSecH?jV7EuU+UXZJw58X>CFx1vgdg$lo<=Z{5xX>Px@Y3`oSlSBf$uOq$dYMmZ(P}Oab00H1 zpJk+#D(<`>mN7juGUrh?Rw*BL;pXlcUqp4lS>YwV@!w|mBf{(wNM8TTu7Y)?NcM>= zs`cupX95fp_HIMEGHEX+(5x3TqIYIwmjd3-Ev*cIU9*g$8!wwmjhkXxWXk&a{8_{Lx z2$-3EijrxyP0??wc|r=mY+-g}m@ac%W?SqA>4)e%k1*=rm$ta#-!#Oh=>B}5{1B^z z$IB|ZtZQJ{`$)r2Zv=D73m=&fdrsqJN^Xr*j3#$#O0n2c&vi$>3&E?oxYJ%VHa^A@ z-bz$R0X|y_z$`LsXVVPCib*La9LYQBqS`L9rMn!Heni=qCYR#Jsdlg>BX3o&VwdrsK10vNHVgQus-^;#}kKvDGV^y!~b0JGU$sbo3C$HXge~ z3V-!!2!VZ0M%%lNMy1DH(KHfdCRs}F0OWZreG;t!vqHLofRGvUnjEFfyKMbOQ;wXx zv=3pWrHKiu{bqm=Fh1OQ-!7Z|ws2(3sKv}G8=})`%d%!+Z)l5v_e;tjZTlYwJ$)-ORjC2e^MfkT^@2- z6?;V@CApAv-yDHr2i1KG-@?bnG^;R5N9KLiEz@O;%;yYG9`qYd8jh{f8dsVy#x5c5 z_&(_4uIL&Gh}IbaHF3KM8jVn*^pm%9={2O_HWUkz#(nAW%e#Z;x)EYhiMa8_j~ii{ zK;W?^2$2;pxulo9Xx2OLEt&>#W4ZLW;j&r!F3T>ZI1DjDV>dJ`$2ttT-sP9=eOF_| zp1=q(LeWR2*(8mTZ!Kgd75Xia0-#w!`!$fz$EjtBojuLbx%uXiM&#*FA>PmszqWd5 zxuLj27Q_>sjcM6ej94rX8%PMOXTSk5b-uq3(Wn;(5hml(u&xrf?^6Jw_v45OGAa!m zFhhK?a3j<4d9#mO(kEyN{E9jjyDtu~N^+NCqakZo=-JmUNnF{bFg_-Q8;wB_O^!ao zPK9?xN_QY`B=~vb_@BD8762W(W<9azE!V-jf2#D^ZkKyDX8%38B3aUKPy7Y3#XS9+ ze=omuD9z2y;Q~$Xu4gCO1hT(s)?)&MZUk`onpmuag=WOg`Eiw#Tv|?gjZCfZ{8p35 zE6IXnwPeW(GJ-*VOzOczOp1Y|Ey>a+Z}^4}s{$m&Bz>U5yS%Kdu6ss;(&Pz4^#no< zS<>F-98SxMEpJc!o0{WDOI-n72yeu^N=@s_0gqX`I)IK0Kq^#EWH+HET-hJHbO_3rRwBm9fd0)bPiSjSbC*jd1!j*A1cMjU-?^D z!1s<%`XKuf$MiIzjb)_vk!j^z3VU-X%a-?r7QZJMiho&TPVxtQd<;kaNiQT<^`v=A zzEEf~-5p?>_OgnzG!MVOE82I;@=HADwfs9i%5Ma!7&?B`XZKwP+|uJ{CkM~ss}wOOKEjvWO1`#iL4BcJ?a<`O zms$N>lPe-bn@3GeA^{tpH-oSJ>R=IwdkI*zZlXC~K3U`he63d9cf8`vjUD#Vr31-K zYYkh5xJKXG#DfL0Yg$-i1Fw{7Y6KQY9R51pK`waIXUldJo~E)4$=Sovk-0sC@^3ML z_dSsWkSPl5KFz<^p{?h2AnFHkuyHKkH>T0*4UcQn(!SQDbyEab%)dtc$MWAPft*qp zg*9+HGb?404;v2}ks&f0Z z$ToE98;$x~H%TdSY&{ZUH`>gb)YQ}}7*HJQ;G6XDDS2F}3tH%5YUtk@m74 z7|sh4G@ zw-p!LIn6w46wZJMr=M-`KPEvCoJ#kD+DR}qp% z^~j3ijw*&&qroF@8$jN^dqYu`nprBu#pS{?$-JyfWu&egK38OWh~Vyn!?ND6C--`V zQOWz)C)bzo;o#y*Dxo^~pU)T1RcsKnaO}5)bPi=Euojos!+EbH1iemI zDQz+Esq+aFO(}w{TprcXq1Sk1pY;Ye!a~_asdn5&9OjV4OG8f;>xv^T;*_aXkn%VS z)F|15g-HElGj@)e5U4qd3&<_K+b8CqfBdmgj=mqnj!Yy*NN8}jnUVVJi9kT+cDBxu zWTs9f%`3U0gXXk+Sh$w^r{nO0=4W$x`L5c)ERKhxw#3fLO}f_@VZ@nY$#+6=kYM7_w zu+l)G%VMyI$Ox`_LJijx>G;TO*OQ0=J>?$P$;?q@-6Y)4R3T)$nQOSXrcRi@@$!Rh zgl#%xs=IhD*!sI4KlM}Y^Y3_pJUf~XD*K;|Z>}7#%VkCy2hCxl za1>p?z5Ulqx8gi-r$1sa_|e=Az@$h|>Zu8|*?sa7EANphUVvlENQGZ^mA*!+5X|&$ zAk!{3p|3aY6i13MXUWZ$k6*p8)}ju27mmdCQziun=;ir)y@UrcaQmq^kMWfk!f(w< zB;&u5WYrhs5b`xLe&{c_=IdZ2NZz>Fv7>pMZDF>F{;3%g`=LuiqcFj_QNX_kwsP0& zGtADVEJ*%wbdVOoBLH9#499v6|Fz!4bpTm&M2aPjoSX3TVR%x886}T&16|73S}Bu# z?a15m;NdRTm#^80Ys^57GPjR!wq8Nrq{Q0(famH_XHH(X%Q7x{-Q5TqDKCGNRpY?f z@}~7mj1?|`7dJQPV^n|YZUQJaiWmKpq6lqT&CkoN>wnL4> zMp4Kgv?DWk{!*YD)fzT;eV6kiCNhzoQ_x{vR7Z-G`RM(+-B64A5&lTDm+mlofY}o+ z%83gpW{=7FRDLnt9E@KWl+f-X5W{Iu){Vh;4wL{(JHMk60l_%Weql-7ic>74wYkdP zG+*4e*cME6Me>`c&zc5~(r{7ck&*HeD*adm_ww)V(x*jn)3h>W066K-)WKYeD{xL3`FOneMZzC(iV?V);`u(?TjLj`26R)sl9$~Qf`2}QMp>7VlEgC}5%nGw6E_-CCK))2`e03)0 zOS4i!%SS;X5s{+|aUWmbJ0H+32&eo_Zd~s=M^3E>lwlhXcjJ5}pn40aKFcTKa8#0w zGu@hC^Z_fggx{Rkr0CPHe46uyllC?0jOXC(`uV&tJW#&GfTfG}S zmwNuJ^I7!+3Mim~NYwThIRBPFB0>T)*ptWU6LwGXwN64*TiF<4P%16pB)mi}dfwLa z$C184DVc9RIEZrg(ACmQVe+Qdy>VhKr1h3uHP841`bpM6ay>FN9gR{w;c`a7*PO4- zO82;J=crG9jfiI^rhtdOY23R@Kcy?+hKUGI{B(>V5sLNxwsLarJf^?!?6)<-v^?k1 zu*k@mrlgD+GNNN*UNUqUi-bK|+V;8kU4*G{hxp=*S#@vebF=klV?jm{ku=J`KC4^3 z8^nSX(A<5)sljMH=+-sdcJ|NiHA>+TP~pt-aybIR*i<;2A?*$_5jBVSuV(*jETFv} zN{nYrhw$AH>vtkgZJLK$m1EXhh>6K+H+v>{Pi`mF6@ zHHM^^SYWYg_?W6^SY&wnCGO?4JVW$j$xLhU^BMFH0DHj`WS3c|ej!ErTZM17njv#y ze>s@9+6Z+&X!~UQ$?P#DNZytZeN=MLTuM^$0rSg2^Dz7#t!kcliI@ku=X318Wf*l4 zrP=y(%MqHBD{4s-K;=8}lllFMhtp6C|B*G%7?ncATD))R7d zWZLZ6C2I}Oo~zOYWIIquiO3Fm&--VbuC?V&fKEdZ2?A~XUET0Ne0yL7xXT9G=Z|(3 zR0!C7ixY;X3%Vq48%&amr4?3cuPIi((xYwffVMc5DrnYdfQeSTj(z9vQA40a&rxvz z(ndK<53c_$lLZ>jI5cam<8a1S_>5c!hUI}*j#h(`LIlK*gzqVD6>3^an)qH2 zyLtobul1btff$-`Ji1tr{&WMUTwE5mn4OSO9B=9|_BV;0ou!eC;Ru*$w zjEt+0D&Mn996O<^ZtQs|^m6z<__Cd8YUWfHg=1q2ij}~3-A$<@ql0kZ%eWlIl{M+n z_GFA8el@bAv*RptC5V)UMa#_S`L1dCKp{=0N2ci(GhCr_2==DOz}#@sjvAK*!eW8o zD0@s;a9Ma`UD;vrGKEp_SQAaUGTZ*o(&-k6=K-n?gcTT80)k~uacn+2mnTuL@KBHr zBFLg>Nr6CT4zHEujP4m8>!DXe1ZMF!% zXY>wlKir~lq@87rF&2=aW9`LDn(1X0@EE{~_Mh6SPa<9t3BSDNtM(kLQ`Tj?Vx+xz zW^gAb1_V1)589*^jeY88tllRHX`YAlBIC`=6Zp3WhMt z*93AWa=ji%sl!AYEro>+d;*=Y0Zc<6GdvozAN2GqVOd-N4ekBT-)5_HM z``=+)C5NW8`%LlMWZ(PVT?xXQj1j)!hpH@(!_^F3QF-nZ`1|Hg^e$*A!M> z;)uxf{OUq{FR{68zQddVPcQo3gV^RS;PsXh4R<&CE>y)vFl2WrAW?8X zIz1MlZ)KdfFj}>A5avRBAP34n+VS(U4h69#`zT15c=CpOF2Tip*~`mBh zu{Ry=@$%|P!W?BoZRu6^33CSLzOz5p6T4tws~4u=Av#sQFDRS5XXO6=UEe8? zmk{YEHh2BAvLwYk^l7FE$C?u#yVR_XpP?cX-G9_~-q!y#({`YoEz!b=2R6fx7d^qn zL{Jt8S_^DOpsuc+b516#G~WjR3zxOxm`Uo%5vmXRVYIijO85`CN7bx=5y6I z^{v1_;1R}^zh(EQ1k`~`O>F3+-tBXcd;!JT`3TxW{w6J{P#I*qM5c+~BjfJL4hQ~Z zuIXEOSDhl5(uFx(q1+@!_I;MvJm5crK4X#4$&KSJlk_@8pVl#`nHoVj?=QU<-D!@s)%|S55O+o5Wraa zUgJim4{x#+hz%RVP{lM|A^|t755kP*mUNw*qO}TgA47)ncIha8ud4r$VjL}Ed#NfK z!*TwybGY$@;bv>}g*UHvGlm~C9`Es!xo>BV&x$ZQKO}VnMTfRt)1Hd&EV#R$@k8g@ zZ+Wi18oZ4ZP#~`NALR1yz6RkVh{72Wi*uzal6sq6Ew@L)Lq;hJ$qZ=Lju%OhA1$jC zEgMpmGBIgXPT0WLmwcI0S*p0lXDb||$z@;;G}>0gsd9Bfg^~@-Q3;#E?6~Xa5Bw*l zwPpZ0NHbcup?ZJYK+j4+(hP7&^8TG5vq|?Cpgv$bJA5xqAQ`_LHr;RAQ^OCc_1nHe z@N3(K2<|L4sSfkMUh#9zbF={Gq)h-i$J9?_uoVR=R3@%|c2|pu8Hch$mbX|5ys313 z{EKWFOhG`TeRxlVUje?YwH|Vk;6CH6RTvFS5}w}3GgOIDhgHL)(b{=9tQgP8)QD* zL*dvNx4s(k9?~x%a`aRy9Pi$6Pr-!Kae$mlgH}N*1#T>3nVQAg3r?$&ZhN}2)9d?! zG8#vamL}?0&WhLI*T0SLrX|mquzGY zEhzz)beE)b^hqr^Vf<*jh52>64-J`%$Aw%6vT= zPAda7J#-@9Cis+0L26pQpMK%UwfUU1(p;+)o|%!(b#xa)o3|yv5k}aISlJKr9(c&I zadI+z2BkOV5^!0F@qBrEWb4~Yb}SGPdzNaemCJ9Ub@wdN{oz~S^wIn>GtU1HB$nYV z<7>rJas0NV?3n}|uH9~C6Fb95UL!l$AepdE(DkkrcUI_K)Q40- zTU!bU_+|c1o&J^EKJz_xDHlt>7ugAEJY5wsF@+_GIk)Sha~Y+anhQbb;Z1pG>JD<2T}2KWhc}GkaXII;w^7~ z&7=O;Rt%H=-QXk0>&hn*4bLK(q?~@l!nQil;U2$c{{Xaz8HljvNjE6tbOdQ<3Fun= zTwsKIMKZRmt3;P4U!Tdf)Qu6!tHbi!u(b4t#OLYvw00Xh9~?va zMRlBR`8ExIT!{NnZ#bDlOl9Fc2w^DOa`gegmlpRLVQh`SjGmeKf#JbAA{4Rn%qcJq z#3im@9aOMvTsBSUSDUEGm^a|Y^*vECLQbdqp`}PQyH=Jf<5WEykm6?z3F<^t7Gse9 z*PHJHn!XM?(;NN2+qU_wPsUcXJtlOoH(nz`?62P=%{EZ=hqbSqUc%~qANvDq|7zg7G9 zLWIDr0?jB|$V6rlM&>Ur{|6eHeO>2=YQ6aJbR~8&yc)j62Fln(B48t%q!%ci9pCL_ zy9m}SP#2lp7O^S^ZXA+iEQ&;agHLSr#tL6^oE`TB?3zF7=|7gnzc1@51;K{c4w~xy z(=-PqB4VZHreJ~Gf;cHDDGZdQ2hE58%4)Z8K*N9@yEMN<70XzK&7z6DY@kiZYQM^9 zwS9S1sa*Ez)vNEbg0B2t8GnPvc~Dh}V}2qC>*n7>(5Z{ea=$Jq8Ulf|MQ$9$OxSJ6 zVSAOn6Fq6>qWtu>-9G-H&_+KOv1-lLYcI4EZ>?h^1-vK3BKphk^ZR9BpKk{aOCVZk z6~O*EQhIz>osVG8m^ab1lYRWAAL&JcC9({l2l!6kso| zHO5tCpw%G3c{NqgJ8*TZP$FwMHw2MGt?;kCKjPI-7_b1d!w^8j^fwh#r$zA~1)0d^ zorb}TYAsx6Z^K= zzN5+B3P8TXV-*68+Cx)gb8~4Bt8*(f1w_XITB}(rPemoHql}&~wam~z3O{H?B@*!Lr8~kTXuLbouf(*Uk}{LgEipf{oG3dG&9eZ9&R($E%RM7BSh2Q z)+tkj`5}(30>}2v&bEbi%YlO$^vl(}HFLD9hYmBdvqOCu;cB>aYBwbl-9$@J#enz1 z(eVsh(l6yxaTe~>2+#$z(477M0akY2Lg19};CsJ)Q$KZ%0}m0#wMF%xF|y)9Z`0D0 zKOePhI7s4kCNh%L?lMBhoizIg?i2nN+!rknY}!)!puG|G$NXs}LDv3MQ?wCGZd;Tj z0=&gq0pSQLSjrzk1sj(%D)W81E;f;zCX(PdjaGSfdOVl(hB%}@LrzLnHS+rP>#fl& zMh1?KBTPDParoQY+f(1a*P@}JG1#1LDstL3bZV1&Oopg@o}*db-Ikcg=(eV3B*Nja z!B0nTp-t>}73_YM7)A<#6FoN!?@l){Q zvJdC)k^O$32`VdlX)EF6({RPC$uXznwet4vJLCU5nP4EuQc2gDf;dz2a5cJlTN)6) z*bPXSLWf*(=Bca)U4Eb(cqKU7WDcAn5xzQEs{@X7OiM`-5)~86Fqgk(L#JJ(WNK&gO_oga;8|x%QLIAln zpMi!)e=4mcxvg_nhTatqT(%*`)rNCq-eEYDeRgz>DyF;b;d3nPo5YDVFa~mM;HJ{Kn20 zACUPJYNeE;UJas)8wMei^d}T`(lakh%{^>3@!5xp$d)c~Jcp?kMC?WvBf)9aI*zP& zD~ICqwG(ZJiXv7%?e9mpgUnMTkYWAo637|Ug2AtWn{;~MI+r2@L7G)`@u*e@NYXjb z;xC&l1&Obf@NeTqjD%l~whpyB;5n0c)n{=fYr%z#D=bE^`P50TMP`uQ1#-Smn!u-> z#jbd2^LDN}4o{vu3LtV3?T*6_>K&P_ebML=@Xo!X#=7NxX0CefsW$&|Z5NT1!QlWn zzVBq!Xlvj7Y=3JuR8A7uzn%Sk%2OFg-W79e!+icr;wgKu#WdMof^e zsh~gxPLmG>>ri`#&Z%vNza`-wrXsw&)V|GXpXa{CTIiW!(1e_ljYh3QX^t9PID#%m zVgGg*1s>r-gw1v96OKEFB|Y;RL#Vc7OEbP*sz5$Y(`Y;iOOp;NxzNGd(fxPs)qx}v z`Zp<)_%3SctO7BSON8;to*?A$1h!ZlpsNG9pqjXGbq{)yZxqPrL2cBvj!542_S~y< zi{s*(%YnYo(mAzI@3?#r|7E*60yf$hzF{*B^4wRpDoYqwet_K1!igJgXdiLQh*L0o z^mHI~&pdl73K$6!bsr~|9WLt-Pe%G{&by6rpzSWPP*R$v8LhbOfn>SoIsVylAi;FU zj^P9Qn)mmCMI_71aIbv3_H7|`joT3<`)bFz!mq?vmDwh8E-iPoKA|W4Qe9`HrPe`! zO;2HR$WYK}^j#q^#oYO5_y9M?pCHE3Kv*k`6DT@uK zUU=iy>HyEb(9&6%Pf}tj?o8$Axn&o<{pf4wVOZV*CP>dCLGdGT{OC zP^-1``H81_&f|pqy!Ic}9Ntgm7FihD@~S!}4|X zlZzwvZ|h|0l@=+5Bt7PYL+WH+VQH(?=;g0N>iBq87={GWK3@yT($0ea??3Diq1NvDP@N(BJd6FP44h})+x2c zJI_@4h>zx@DCMNDP8c(#o9=So)xoH_%Mx?1F3ElP2=P@?kd1jUu{0;~g4lz3Fs_?Y z!ywU@i}}MA7~Prwi?{y(ifV1TKw(joBspgR5y>DT8I&vtNKOMt5+vsggOYOwB}$eI zlG6-13W!L~ISLGEfPtC2Ip=uZbKd{`s{X25b*rX;so6!%-cLXMbg%BUdJ}k4N}sWv z0?@+6MWD&0=GR;3?53R5kw#4uf9|L}XEW@Jy+LKPA5TjvxkZ#5lHczALEe1}SdnN} z0bpNkSg*SvHn%*I3%rc#>JK7Cy^m^Y+$|Zx!oc`Sb_GEX>uk&8%F>Fjjf&&u`kat^ z)guFc%st!DhO()M!U7|sqZM>@KiSMRs9ITDn~!9QIUTLN1iJkaZ-NNB#&t5!edjE8 zQc_Z72-(tkGZY~rS1ILwx*-77ZE9-zV{}+>@I4EA&-M>@k3NvMJTGrO)AO7jG%P^2 zKAl4lo-A@IangQ;$L0Q*o5@CUdaAwgV!XN?R-6)Bs@tkIJX>Rkg~0H148CjWzhYBv zey3r5+Qm$I-qa!7`#v!A=9_2{($@3AHuKHCBG{S+o@D3pmU&QZDS6ToARZCGck;DO zZz4iL&=a@-Pi_nwKA0-q@eEdwcW4wN9c&r=q(&aZ6L2PPFD@ zhU%xH+ER#C&6MJ!58UdWmX5-1X=!?EQT9y(Xr=T74cBM-=9|&KSldjiJ{~WuH9K{;S&94m zhP46&&OpKn6uNC))wHW+*#;C1*2nt4GgAIBRWJp5mH!l&0OhSN0?a*OFK>`EJntYM zXb-?xU!_MixVX6qo6w-nV^EK8hSU)wSiI~d>zh}jMb@0N5b3KOcgaByz=(PH`(kEr_7Pf{UHU;RdyVcygL(G<3*3+NS$LcLO(=wG}i6*|j*t)3C zP_))X7rg2fHef~kA-j-ei}(uIaFlz~#2=QHJfioELIMiBx!!sOjjY`}nV!}g&aW-y zoB$Y@tTSoCclVD~;g*VrU52aa$`1c?+E$ z2P>;`Q35xX-O2EQsS>OC|?p$PFK?udhR1oMlnQ(qC;A7TeZKGpaUj<=~75U{Y%~Y14Ua z84LNGhu+7-6?RMEHhM(8yR+7TGg7~>l%?#S+nOuohnQWw8Mw<75D+ljd2cY8Gl?@z zpg)>+mI$9d&v^zkSPoLlUSMo8YMnmG14h6M0_}~!K@0+hq26xXv#5ba%4R=Vi)h_W3V~!!I;KPOrSY5gN6Q zpCrJLQVmmxV$|Razx5CP)1j;Zy}H_3C15Vud^9SxpWP6q7SbJ;+q)(J7kiMgGgNA7 zx~c}u-LB9uKRtCFZt*-SDqLU6#b7R=ThXcZsuex(9D$KO9lZ}me3y!b0!kK6-PA@| zD+oRo<$e{v%LwTOYA$d_sZP`DXnL>~ozEe|slR+RpIvH1ruGOJ>8!p{g3NH*n^OPk zJz{9l5)u+(KAIz=mRtS_n0e-@rmGuQNqYi>cdtKe&sHZZjXaXavYvi$@}nLQxyV%d zeq)GOUiCm2LxzTjF4$sWP&rowSl}svp*0}W5tIKeEY0*rpQ2Id5lwUfsa-TLAab$4 zzny|=2FIM7oQZU#7mR-)TbzQZ?pRNTi{lrkl)~du$C0BV3oyJ|df4Zg!fj1&Yr>0M ziA$!7?;+w3OUCK?T0D=}jt05irJtTG-lf0Zl3Qn@zX-L4D$fG51`}I$G%M7+9YZpF zBS(OtdPisV(0Rgz1|ZwZs2dSSlrnWSfqwZKI1lkV0fPo_4lGKm&n_I#fS}FbsBOPD zFE@8qDlqr?fI_a*O|D!L`05Ga1n$}t3AKeYr-%%B0Vs;PwJ?%xHGFO>gZC>d{~Jyb z=2v6IU3zYMQ>9UWCI+EW$!$Q6z&K5f2@t3tDu`rXUy(hC%upEfueG7#VK7UBQ`r3E z9_=3k6tvv#1>eXfSd}=x1Dt>F$p#jj;#Evq87Z7%3R4LRC?6Dz3|BB)>q-c>5Bwqj zRn8Bm$YUbr$U*>tz_Inv^;bWa0;3*1x68dNy|2lqxx}TBwKi;koR*p=y7C2%!&ZHL zo;Q1=(I>CDm-7U8s=)27flq;kR+V!e_^2<82&t>Beebp95V%4LkvIhfMPl5js>OoLxY8l1f`{q!SM#H$$yQlI2iS3b zO9wDIxuitj?z|emgnCEB4Ef>W$U?y9b@F5058Qs+M(f|RS<*u=Y8*afj?CDZ%j9cl zS0o5PVEAT}cQ*@3a{=WXaafo>KxI~d9CmYyNMc=I6XQ#5rJd9oaL!bkJGZvLjwS~S zhN#D8qEO|uR8;X8^fR3BIfS~9%Cjmi(gb*q^U=5GlM^WG;$tlPCvH4LV)}6{SKKn;j7)`5-LMg_)0Ad{6p^N_}~-M3xRHj zmB+CtWV?WRj-bmq*2N(7%7gJ>(5Ok>?{s&uPsQ(uFQkeN(4=GTW*%-SF4E-&Uqax5 zrUi@75M>8GMs!|>#@nwqr7U)36&S<8jivg{T4I97y*svF_0uu*(v@u%0bLIVFqk<; z?RNWGSU36XLBjcIKJFtg1wLiv!aC%mvR9Xa>(zl6nVe2Y1iL&(xVqERVb5FT!|B-H z#oxJ%eT@QF>-s8%ed|m&k4BH`cJ&pC?rnu1_6o3jCW^A@nN%4X75mOrORM;;TAJ=I zub64&g!GrL@hNg#xcXl7#ycBv?p@tT^m$PM$+1qu41^uDc(*Cnrxh}lGM<~TaR^=T zt>ESliPsm|^mBf&lwR$-IXhtBJTWqv*eCj37pS_Ju)ALr8+@#T_UDrLag>^`vg6{{ z)p@RsKg>+ApG;vUn@rC*^U=J;F_|)!l675FBQfZ?;;qPX)dRCJABo{GGGa?^un5b% zGO3SDu)qxaCXFAKo|y0y1gN~2p>pNcr`45)GoLF^Cw=drm=&1pOI8|>_6XD!&p1I| zBY-)Yc5$fdMU*B&Oe#l)x8|@XZSm?YGq(Qj$DbXP6~OY#90Zi<)hg^aA3&r(X=i02 z<~G*~((K~-EQb5?Qw-UR5HpiENSrca5qVbcw3*>PpaQ;Bw-`~t@wvLlLN)pTBbC$V zIuD-+M~V8XYXDroJrR#rRB5y0>pUA@)r!tk>+H)CW_C39eOsQcCi29uJHg%G?+b}X z5F4h8eOgFY)T!z+L6kdO6yt7ApOVJ#U$~bIJNI1xUU9V<65*bDHU^%1s_ok)H@{J0 zn{ERo-m5x4FY!_0s=cr}W_I96c61)ng$l(Ied>Lqclov33V7x_ufoqu4-b1M7uQse zEU9^t*LK-Q6X^Bz!H_DC^Q`!!!w1X)ncqQx$J+jhw_^RwRJAT47i-6QX_vh_O>ned zWitJA)vAg=f46f4Vh);vJQ@k_|5)IbEUG}q$pLxAI#K5^IQXiRL7m__{Ec4#LrgI;zhl{IN6Io+%fL&bLB|%Zuqg%t$D9>{u(9 z(VcTtO>N|riO%f;`>`X&{06pg`4C-gOV=p;YT&gmOH8`!u%1t?Z{h4l9;)dD7?&DF zw(nk6Ae~I&eD!p&s=;@hwpaU&BTK>MCty`@#kFZv4k)uGFci0B+;Hu!XG+ z0E~b+gy7@P@O>)6_9_6#<6{f9q|h<>5@tS5;zq=N)|U`8Ju?j)i98{oB=CUT061*eS~Q>i)M&QajtVWz z66Z2PT!Q=F--!{HdM zT%GsA6|AkBt;DKcn9dkfnKZT_Pg8^($%}dUV&1<;8)YPuKwWU>XJ?OcD8J;^Ymqm+ z2v6y6P7IYc*ECnq{oVy+8DB6I?VQmSY8v|UQy_YNun3fT4!Lk$zZ8xG$Q`JI9Zf=q zr$4r+!_EP;VO7JUUy&&S= z7Nks?Kb0y?Gc(PxDzze|0`%o({AQm;a(R4f?v)QkW<*0;jDC`c#8_ zPsf!rcu=dM4v!1G>4l1=1!qK+w2NAMY|{j8xD;wz-kpgS&QJblHFkl(0f0bsGX)^a znEzd*1WdUIK>Fp^2?c|0$-N1r_;*3}VE)K0a=la5ESc6hSty%jF#fI?i+#+Fm1wzbmNl^9~mK&spKL)YPAM zaCn)6RXO$R?X>K-K&%#*BYm9;A6NV0a+RGqNvga~*)IA*P$0McxlEfMLMmiSfTWd{ z{Vpg+`mtU{2+ht<{paB~xtIG`r=zn>&%Z90gXW zF*6Qt1vaSX@#afM)hec)DyMa9&xPYmrom+Hq=igF<}=vGwsQoYBOqT zY8jkQEo;o&@tz7EdD&Gj{mzb!`j*-PLtiy|v6p1h17l;I7pR)6AX;2ahmxNp>@#bM zJx_o!@rv8x>;u_%-#%?lvuk0%ItZf? zbaqRlM(P58^QZeE-+4d4;o|B;uU0fGWc@AU1u|v257! z70uxD-?}0HEN}GzGv)=IK73OCXIt8zmC)>)q8CYIf-F!KGi#^(*EZroVBW{Y9VADs zb6qUJk@_dN@XPaSau5gjyg)$y^s*L^BR043d3EW9Fgt);A7!CnwnFot137EcWU-1e&bR6M$v!#J#%%o*6DNI>iR&1#6dtU;x}%G4$-aQmOiS zYatRXy@anQRPm{{(oT&oe~=Fv`K@tl(4IO-|8N9_S_ z+7$XgFyPBv=^&fwx6$BpO^sp>!KZbTexRVJxPCne(dL3)eN7BO^MfDKHU6p-p<%$H zMK#r0uNfTpq%n!A@mDA)B>MNn9u+k<>LLxo{H}lkjpN=s)r46I&k`olxV20GiYIyO zeOVQ_iCS<5PRmBgX+!q>eBlkOkiTLuZm!X$q3K7INyM#4{C92LY}62hY_xM~2cQihyxqd4?lF_tpv z`gc|pt&|iQR&4aIe|7G~xcyMe(_4Q=fb3>j=^Mu0H(yyo>c#DaHisiuAU_-#N5 zDd4D*YPRBPb~3+K1_%1ZvrJm*B!H3I55^3%b%VDsClg6h1nrA`K|=`@SG$vIp9*6{ zcr6{{?7_R#PgI7`{&U*gbisOXRQ=UZjVbx&6_(|W*ym{{7Xw3`YcBLXN>u>iM3LCQH~ zri9AbRkbKkr5=c+amP#Yq<;`$i?bn$P~iZoh<$#1G%YUmE*^@@t zNJWB^tGdsXJmHdHn&-56MVv&_4(ASTYKeLmThDkWrP2_m!qjTo(KY>5Uy(s6I$ezt zXK|cQ9;QP&rw0HevZX+gPfqJb@)hunj~MW6;nNl>15lrBBii>k2CbznAaUPbTc_n9 z@`vAcyy_R+ny-$?p-zFc8$)T_2fhc*>q%_oM@L_!#eAQX28v~R?NDAIMy_&+mS3-s z7DG41;Eau@s{)0gY@&{9Ux-lWRWx2#l>p;65svI{re(O#iDyFR4c|{uSwPlDQ-qLV zT^uS2d}%OBP~+6~mm=3-X9$n+JCU8%(cZSEv3$@IIVyy!9l>j9McAN>=I4Df~H z0Fu$Tg$2LHJ^b=mRni#og`;GF{;bDncm@I&-|gkcR~|1Shv77Y;i;)s%ny%xbxD`L z+rPPvfHo)tayjoc9u5_mK~JQp-2IS>M??00z5RYbkmT6&Ji;tb1OhuiF&ka27=*20 z?4x8>Kv|+kTQ3^VW_F1@*|o|OsgvkO8ZEU4e0~8PS3u{LCNN_jlJ%w8?ppX_ijzKh zC~Zf5<1<A%BXf^?ugrk&E{FWNo9z4!0mGi<*` z$V6<6sDDV^7mMY&>?;6hVz4Curz^`HBz(q?2$yDbT8{RTBglF6EBm3X)F(|o1p$8k zeo}2v_Sqbri?lkQReJXT4jD%*__7cjU*G!6R(HFbaM|)#B0!!~bhZw$pw~#5u8-=eAxTx|# zZpg_xH~~0gurw0;CH&6p&8mqo0rvdSiPf7o&mlgO+Uxp@m*wh^w?kHq*9r9sWkh?S z^aZy<$TZJGz~|J{uhlacUlUYRTw7Y%Y2C)0WM_yaV?o3#8a@EK?hfV9+ud9(2h1~@ zbL=$|S|NZ5_h((oB5yb&2Z%BJ{=@IF>L-^H4c`boLL*#(8cF}`qGMFLkaG_!^m502 zAZ@{=@moo;(~k{s%@F;(Z;a3WFgWf#-yMaAIg0@u+^Ord}!lR`%w+3<*Zb{OEorap%X%9R~oas=&5H!bGqxl<$h9lPdxZn~o zg1U4IpXzdlBIv(5b%!?y^;Rfydz&&|XO=9o9(bj|J4wXET7jwV?}{`WcXY@(^|pk9 zu}mp5_aqKO=W*8#$f1WO*f^aiZjM%U3K%kdtTP{h1l zu_FvteI0hTlceX;*zRX z`!YZtt*dOn~HVWhuW!Z3Gmc>Sy2HksSUSgnt5+Roa#WX|V!NWtawBZmDC zRp{qL3q2M&XiY>-athl!fGRMK^o%8_p-wV2bm)qn0)f$V0<5{36JI1$2 zU~WZznK~Vy_giLbpy1zSX7qs63VL*#*+;F_EuSdobfMz@*1e(MQTsV+F9XAeruza( zKQ5vbszBBoNRi5E47ZMJQ zi7I%R@MsB+zYuY9;*yK30JnyS95jtQW??B@>L$bVVBUo~&m%;1 zzY*a^1HP&<^j#0YK5_{2ZE%lu6t1M8*=96I_a`0J3R*fnYU?S!QSq(bqjh}a4M4iY_cZWUZvg&W zKyGyEDqnO5o0W|nfJ$w~60>L$jf}*a~m1b)v4TGFVwn-#-aXDgdVg31X zNdra#Hbq6>`D;bnv~H{Uo6eT|bXv3!xFt!_P;M7(&9dOWe2ENtW{aCcJ#2+X*D*<5 zms{Cz|Hv!KOWtwnT|&>BxsS_|_dAMGImh$A1e0`nz~|lX=02QzB+XwAMS5k4*V`|0 zq3fzVfA@~{?YEC;tckpHN(2*|59)ig4L$E}W_p*89(B?q3GAWQb!oNL4W_+#@`(NU z=Ah@rV+5FuOCNBAMW#UUlb#B2O_S?_jK^H;t({BRJPy z`RdOx)P$#9-&rf9&>e18xfd9)hTYPQ`2gPGKpp2WUk9d~MO*9v>fsJT(JhVFyw)zSRTz9k_vRmG)hbin5PW_QKsY4%iU_0l& zcn~!~$RxYejQjhIM{~V^Epl(5Xq)b7C932E0oH_Dj_v_)*s>-rG*t_2{;r63kxfn_1VV(Qb z&op@GBUE#^g5?!Vaqkza>sO5A*q}-})M5q0fzT%4ZXw3D?ZJLVGE9&6;+av~# zr_QK7EVO8-I3lpU)7MbD@yi#A&CJPuc=T)vR$LS@=xvP3s%_Px$f%7z$8g1QH`Vdq zOHdgDtj?b4OO?Nz%bOto=360yDw00w1oqcjp-fVkj)I+vp}9>P1mZ{&v0^-$z!tw; zy09>;kNmcxJ&|~(_iXxX~nI4=_j6@{!Fo{XuihO?LRyc#P| z>f9MGxf9-AEdHUazOK#~+>PdgJSE%XK4@4dxRigX++nQV%fRB@U}ci=52yLJ@%f{7 z+>GVyaMGn9`D;`Dy*q(F&L0B)GfSswkwO>^@8T_ay@XVmPY3~|VS#BKf(7y`ksi#WQ(=PmK1=o{v{qWqC zpS-p_vX-jEt|cFosN)K8snV(S9;z@d2|iGry!k-bu*|!Qkv-L;eSEhj2vzeq$Yr&*(d%JuQB5u=R1)O<>vXDFV1&Ts{IsH?^IakG zvnj}52ai@b5OB#Vb3Uk|QMd*9x859?luyTvI1Udnvm=eT4L+!=i0MwvBcn{u+(>7- z)A->lN9^S<3=C+WT)tf@7qKI?KS|%;xdr&)pNSfCm$TH4-$v!Iy_a048yxw{K`v#> zEbP_<`^|7Xb8`?(+RH3B*s)B$KV6Ad) zXO{Agn3N@s=Q=E`M~)NI$4d105+@=wj$O-d4al&uaU4g)@ZXFTaQ39hmhh9yW4Pq8&1XDFW?(KZ*XKaT# zS0L*WfqTHYayTaWdfs@Ka--qV?`|wVw}1<8ifkMo8tcpaHVsFs|IbXrWn)DhNQ)G| zpABF5U=&m%=*CBjDXDEr+t1+GO2jeRVEDaxoo+jRt@(3;4Cj5yG;;$EtzTlFBJ8+k zomGc%h>L0OMjgCy9zC6`s!mjkZQL@cwW?1nNsZ9cey$s(DX^f%rBEtt)TC27)4DNP zso4qtV%>8YI-UY}m;4lh5T?=N#Y6F{#vV5xs}i}aod6x^JB%Z2g}XxAi^s7a zs1qJVcC5j2gU*9P1<-qe3KzTR$#<#X&F%>DRRFpb%iAigSPf&zl9hTq zZB=Tx%73goptL&6P8O5`Y;6ViRjT5wT`;WyKkN%qbf>8*eBP?G36?z3&BUv!Y65?P zn-eZ8sI<;=FA#KHYk?yMpyGvgZq|EJCxk#I<6Y|Jd^szu?8Hew0#K ziMnpBcUi9Ri_c9r&$dVJ|9ZB-2ecIvVkU80q?$_YniI=?q~>m1HLGtyVxKt zBDf4g)-B-`TvzWQ-c#NQ3!vZfkIm*MisbTY!oQxuN9|CA?!U|>l_AU zh-0WAat3@8Z0@ctdhk#gt*0=Lf86Kx9$;QKj?|Wms*Y~Y#h2f$q;adq+WAyoR(*RL z^z@IXt>1g|jFR$(=>|X=i#O&qexX73V%*k{#nsNB{0|E?C>3r_0psc?X})%ivNtF# zHYoG%&iOP_0_MS`TC}pUGRPPxp0}nQ#{z;6(9fnP6Mw9eld8%1#gA^2@qK=1aM_>V z)v9#IqjsM#qSSH)_7AuHW7_)(`OS`)0X?-5o7%p#+7oxmz7>M;W;f|OmV-`A6y1M^ zLJtVgSbsWnCry4XwV_XcsXXU&jQi2M!|{DEMV&0eLq{M`$2JawM_uY#ASo16+%Q3X z_uSF&LI_+MV8Qu<+j*X{i_cMmBivo25#=vV-&?J|@SnABrgYx;_AI0U$Dt47?ta56 z84d5Ox=zR5o>t$`d_V-Zu4RoG9)&*uOX4Q5s60jIv1{3`KR;hpnfJml5OiQlZ2ihv6t$=uoV>H#)}YNLwnVzurL`bD{Mdk*WvTdExZZ3r;jovP&5o}qp)CA z?T0{oW!hu5I&DFBK(gfE>V%l%o;ZCKbxY3LnjLcSmU_Ws6=ghoM*EnJOE!Vvo})SN6QnTGblv%fF#Ko%Pen$bH zMbLe)9b9?|d;dQ0br=cc{X5qM4MQy+J?dd%5+n8H`w{!Focgp!)xcREQ_M!j@m=F2 zKQ(1c%cCd0M-*#j_;Lzg`5rP1>{MSYGcI^GWqLjAdVM;%+Kxg0bZ;<) zJA`Bp^Gt9(QT^}$jH2%E?>`4H!7yTF!S;#>X2s+seDHYyfm&4eulmJkeY?hPd!y$2 zw2U-KI`!{Z6uM^4iDX|APmVoOq2Qc&8`vODW{;KL&{pj4 zyZuMNBi}{`3`?yH$=wbDBoDC3{>u&-BcFSE3XvIIvy+gJgk#_kIgCX?_v2s7`ud9P zHzE9d&X-YD2!Xob&3!&aTU2FYfs_9jGN!1JP%qFos( zut;}Il@RcojS=6G|CT8>SW}@}O%@}DeCW0}WezFh(-M92#IVKOWek+h~EyUzXN6U z4-9kwiCA1>;@afJyTXiM;9#1qgq}|5ujtKg`ynp*ICLs+jffscGVmPzR99KfiQqb# zBn1?by1L1Y?z56S0V93-kVjsiFEJAn&-N+={Z%GyB!Q`JG215hRTDprJ$m5%lK?+k zn?7S&`hVL~tE~TRn%3Y<;)LIM>)$&j_WAdl%DoWVJ*j;+PT*!9RWE`SBMAiocUcPlFq!ve&vw(uIpj?}puS z#Qo#S<<7&lYj@MY^Tgf&DC&+@nb+83`0gV9i0G+>D&Bs7IM6;Nn2}*Gb^XiMojQlE zY=r^uf~UV!m+x>aE0Z};;F21jO+Fi+)q{vdS|~M5-vKTLUtNun;5XTNiH2t?34;O= z=c;k|%#4(vj($XO@f}G~GZp~ZP^t7qD8nAeSHtSmFL?TL!Crkj)RQ_TS#FpPG~l_a z2C2~6uHIe*?j{`nny{kvEcjjFt&p$}cmGOyLp^}K8G6oa_SaIVNWqgdc$N89FMtz>e2@@98Pb_Qtqd`^jK2uHA70~e2F|KW7 z`-=N6m!a1-GyHYS0B{ntrx^LYyV*+jLg@V(wCN2xqXZU05&O*}4Z%l;o%p7(6})ym zqt!K#MV9Zg@bK`!!#$gp%bgMmai4~Y^1AxkFzbMP1Y4EeD&A^!S?iE>^izg=Ph5{E z%wlMW4pU<%pFjJLb^Oy_p5qgKz9onMe&gwX*~rb?H+O&m*i*Mg=kMMXoO}1*AOgWl z^c}qMFP>fv|>)0wd}Ug7-&Lwbla3T&;wN!9hZn1s$(d`{b1n3BhTa z6|Oc0Y88=RAq{@pwZRlY)BSSGMTMwv;Ktf3BdPd_;Pc)g4OLL7$5PLla2(`~V~$58 z$Wu@z?;HBXhePV4A6>j1TU>A>Mu<`M~Hf^3qN zFXctuskMurUBLMS)V7XFwtkPWVNsOo&OC2_668H(zFRV4b-8V23{-19_Nt<-)nX)& zflH&b`54Uqi0Dr{mb+YAu?Mrz8Mfu%yQuNe9oA;Y=pcg~-KCXN-XZ!Qk zm<|Ai6Aw6pI{?@<0E<{S$mtrdrhkcOS%+O(P+?%e*Gox7v3(6T-ABncM-X#59TxRJ zECaZa?}~tr8C6^o;`|>Oy2}lE)P%37Ehe{_*@>eo?D88BRh3j+kQSGe z;HHsKHg5Oq4hfjrEmjey7?Z+$n1rL%T>GRq`pt;3gv5hM9V+bW_%ucpc={oSE zqN2``VTJB3GMeWNcKw=yh*G{QarD@flo)C|Q1FK${UlBx3p#RNb_Te>_qXrJzPwq)O znRmK(^=9=9#y(}?$uSlvQ3YTLF)fow(j0iSAjisQwpzP5JArjZ90H>BaV6P_o?b$neAj1;1iqyR>xws`REB&Be-QCg($GyGgW zGBPj-SRbVC6ghxkWQQ`)WrnsJxFgA&Rn9X@B4A4$nh_PmCM2_wb?pJw4y#d$ysMSl z;xc@Bz}$KJ)_@eP7RC)1lfGCEQ0uuupW{(1Y$O9NwW?IC)@2HKrqy@=N8K&~R4LAN z!=U1D##E@Ue+~<}VBXdMxygKqwN<36_aV}|%d3zY){IiYb}co65=K-Y^QT+31_lqS zvxWqAwQ%N1m(CBs5^ZAeYdYN1(;gwGvuTT!BO_3FVxn10EE^j;Y_FPoX{dhTS(h+K z7Tcjg{xIP$t76Oob}u6s_Y>M53-;WFpi;`eQ>H_iA$liOuXMKN&P7oEhAYdY=n)?; zP$^+ifJG6?lTCVg?R*sX6@F$nXZcFNcIGL=!(~q;si;-JgA1fZiyp~W)4a;g$+-;> zl%58gnVY`|_c|9@25ptJa%(Bd|{WD_k57uDITZvC6&sdPx_d+ z#OVYUPps2jRzUdgu{8aq&VG#*#vFQLD@$C5Q1F^Gu$HQ-sj)4bUC@_$U2_7W7=z^$ ze2=K%3(g_{dTR310HuCc&%gA38;=#PU`Pm3E{dF4GEl@@U6z)XcCcjm zMT0T#H8#U3a_ER3MfUo_7s9@MLzeSYy;)|onXQ}uqKF{X=IHuH84?ykY7+H~(#X*f z3wgbOkfd12n$oTtp_wHH5NpVpFrAlWBX1$7)7j69Y*_eM?w&m>6(jzILuXG^8VsJI zwF0!V@y)EEkTq8fu)4AB8yDAnn?}TaJzSs;IitfzDW#{EN?;;1q{GJ=tj0uFKAo1r z5-1DlkfSeqMn~otlXRPA|EbQSKUeX6-=ih2Hr~%h^v)xs)4IG~zvD2`+d}~UDC+Qi zqOA4Vn4iOR5>HQ%nUiF=2eGL>)3J*}yQpO)}~KlP$LUcT>q|yIijTU?X^}S7B8NWoSqeS!7GXYn529V#=ouNx0?dw`LP`W zJK1>d{SU+2q5?j2iBeDTK25(B;-SxXdmct?<((4elAYVF)7@$H{=o0Y#ermKo$F{9 zkqZ|UxUT!xVBA|f06^YfS6dw^fo9Cx&t)MwV>KS*tv|%asdHw1=9UXG)++_adrvhQ}55+M~zUsFWHlM;MZV^zf6* zl8{Y}qzHGf42@xI>Tw%u1A&wty5QXnqLTBWsQR4GpTB=j%FMJ2<&|d$SndqT&dx^j zK3mJKsrg9|ZTapU?`4Mb@U)J@Hgm9ikjPsA)?l@admv3mMNK`*l8YaVPaRxyq7gYX z+=Ipt8JA_`-;raYq17j#Q`gD5@YHM8-o9s4ZisiGe0zV=z`t|Zf$CUcG#Yv5()1(2 z?$&I5mZjp02#=-Q&y|=#D=M`gr7me7T+aE;4gp>ymEp_se*OM;22t2rwa4kWKxDn; zKnVA}`xO2RQePt-0$IBsp zAxzPNbESi)jV|q^l81R6mI*75ndG9|y24g@EngSt9LVlXw@wmNK7Pz0E9KiddhjJT zri=DN_I_09hP2_`1Dyb(B?knu&-n<(lG(#v(eidUJ}%CxHn5mI!jA_dqR*X=j1so3d4sHpr&K&6S%6=toK&>PcZtnRer;9@wbiU=weciqvjS!kJd$l@$d z5DK~_|9Lgd9>P16@JQ*&U^_`3fxWSD?CvSxG9(+{_VUaRrouc)_7+mCuROom zy36p@H*s0bv(rRLR3P1+eQ_>vH7~CmkRdMFzYJIhxg4|aacH_a2hG^AdYD)KwSSm} zy-O5q46912S+6y#_tVdI?DN}AIFg-fiM%UK`5R@`xn`W@&9f&0%&qgGc6Qy!3`3Tr z>JC}{S-r`j{3^Mzrn?yt!BJ(qdBS7g$~JN)G~H*iI1TUE*t~XD-5t;{PKtP>MXNp7 zxV51@rCYqSfn7VVb~x}RqROi*O$Mysa;B9ul{nRUSMXl=c9|%?iN%S+o?$t^8?$!B za??Q}+@GM%C&X#gNn7{JDFIhNiZ!r~VyVN8pC?}i6;`Sa)lIlMzuOzFv3s$ZV{E!B zTr~XDxuo%n>v+al`YF{L(|{Yqxd6Ka^t5WHL2p<_0NOFErYWHPI4r|UUlAsS>>VmftNm%AHUdyCty zYC`Nb8r5a4^PmMcATw;b^?U@&VTwj@KJK@Z{42|Bt4Gh1Z)3^wiQY6i7pe29*0j7+ zgA*67!@xrrvzGX0@%9*b+{ z#^)CZM;=2M>Im5lRoUp%V|fRCsM1ouBY#QJ2S`Vfr-Qltu5#5Gy7^mT++fdN#Py+= zea=U%&ES;)p$*Trt_MM|Xwuc%;)k9@iL#%KeKaqFD_eAGzGroU(4)AxS zjxG*6$32dUEO60CbYn<&8CRV{F?56{nuq(Q&C|qv*~(jvp1jI@I%>*QlJpr}FtI;8 zT+w0H*4=co9OTHwPpQ?fhm1>+nwg#Hz90zkJdT$0(i29)cG$+Gw(bfF7sOxr;5dBD zuKY98yvgC?o)>xGcp3NmMHmXE{{|i(%wd@U*u*y^r9A0m@!BcrJVUq8r0vZ6GLf_M zJ+_LVNJ@SZIXZDl<&cV98S#+m36Gtk!j%m71>P$$SQqg}erv7gi*mHCB&lg>QQ|1X zBC3fw_9mlP8WuTtTApzQ^ig&KG9p*QtTMJKTn6E;yAvoWBnniOE7?ZrlmM*1SopHxTv{-*zgNd3{h68-CMg}}wM#Ha{Zn0|+R zf0xC9KMoav2+wcSWdz76_8nIr|NE?df5-?FCLb;|HQp_eK$2vEk@*C9TOQN}-idf2 z#A5}@J?TQ#j(b&d##5EqJ-CQ{U$bcdDwV;sz4F?2l|M)b)~tXAaYN4)<{mCC@jet{ zrR007OfDYN!`n*}hFrl-hu{GS?6+@d0Mx3ls;L>IZRAZ%Enq8|(ARz~uc+9$H(l)j z^r^iWCJbRR2z`4ll1Cx?@+GVI#R;F!#rov=PD$;C6z;xhUPCAFFN2r@p{Cu1z)@$r zAL1jmRcAX3+lQhefRl{^Ad>ID&E+sn6M+l*9C-IG0nIGrCbULWzW}8swDJa@_j0Hd zZAkbHg#TY3%Awum!T?c>?jYyPj`G; z@_+W`0rTWKdz8)(15lJ5tO&Tb(=d>Pr>nDM2u=!CppH^3?sFeSeMMc5NQjBrk?z(y zEHhTyt`Bm*+4{}^R9;`#*-H$IdqbvOCNt{8Yeg4IOM+Ha&fn`aM`M`zT?|?u5;HvM z4ESvtZQ_4KgQWH^?5)To---SWnR`V&&n0M?(l#_lT&a2FRy33+#;-`5NVYIA&Lq8D za}CgAc#If26Z4Z6GzmPEy)Aoxup?bJ!3z|)`gM@26DXmZ=N)b3#+Z!e4DS*_j;JO4 zL;-x;_~V*|vT}5V9op=E<0hRWEdVw){g`)OjH0${Xtzhr&4JQgCv>MCmN(+ki_;uH z5ak5%wb~!Y57xx*0~yn~Ri~SV7A?t2v*be^A+HZItW%dST znPqRg_*Z+`pS$Ao?#+j;S_V6S)(V%g3Cn*OJLZE2i#eW4&-u@=-lMU$sp{!H+QEp8 zjrB)LlDxnsx=)@%?Ta{-(X%RE#Gumv=Hm%0`ZL9db{w+!?$0GfTwO^%6r!bgYDpj) zN%1z+^WFpmP8;LJWA_F!T0GR+dJGB zAs=4o6&o3;apbC<$K}w?c1sc7y^sM^=cM(#sAQvQxODJH!S`}2JOV6@jpN!4gcBg< z-}ZYUz6j|o6PUvbk@&7obYhlBIMKDk0r%!YrE$V^VgjF5XiVNGSM3+!4)RsePddSb z0|RHdb!P-bE2~Q+Eo*v;aipwnKMGao9qFdnAq=a6E?Wdn?guZbJ>=yeo^At)FMBRF z!d2nhD=lD@A5+TC4%N?b0Sas8ZdJ2AUzt5bprD+pYSl8AvS^^=l<}A-XmWhqba%q` z?Q9}zLU$^{4^eiN3CP1t@39AoU!D!|>{=PmH{r(K=02ie7=B4fjQ{u2d1LkY#_t~J zdy9?z4VyjJ#-b^YlA*0D(51DAm0|dKO&9lo|jDv?yzC ze6f>QA!r4}$nPSb;DMMvNQITCqg-wYxSDh_EcjxF>c_LjUUsfBf)(o7*M_RUw0%q` zjEV2_l7`y{x(IFkeYpJ7Wk0|KvT@AYWXF{h12g%mS19-OHk&1tIn=M<6OZ#dLr?uf`k*sB1t&l(X^|7WJ@GTcQnS@WzghQ z?&i)F{lCwjhYy0d>V6HtZT4h`xR!Aze**B>l#yZ3FUC4C$p_<;3^FFYkyPQ7V?ANk z&meb&e50y=)BzfMuQG(k9e8yxA^UTU>L5M^*sfZ*aj9PIKqd5IBkg=N#&4~@LZTBO z1m9rg69lPAS({m42((agAv8a_Z{h7zVUqF$w8nZ=TIDR4{FjCYoGt7182`<(2|mA>=;K;}-+fvolf-F*1P?@ZzExZ?Tk zGXh}s#AuYbNtSq2{}XWhzT)2d=eKF3|BvF;Ljqs)QXqolY+=AsgyFIZ&oGMTf8YCm zIQze{kdXZL=<8GP z-0!~k4;*GV=j^@K+N+~~7O{JlL5ycA77=r)JPaX(B+ZwXodyjH!(X?$d1_)J;LFH6 zy_17YKg_SL+l~IUw(G~KpQlWVJMLZ_NwhV&{jg!wYM8Lp_V5D^2|^oEx;lC>ep&t< zQ4h^hP(r9DNM~%_b;of5lvjVXwhn&1M-I! za@9oP7Rs>zksx0nBLc$1Z#>qxGS?Y^=K~-ViTf23@xKN4Ul@c-Ja9Fdtv$Vx1+)YH zAkof3j`LRq@6T(mHz)`UEm-u6=!b8JiIWE>M$NcTWiUp^#>gElu^iU%k~UKj=@uda zpphc?ZI7LJ?gXahV8#d@EnH8r?dQ$S&25RHQ~1`)Q2e6R2UXDM7>Il;0If_hl%N!w zT{(k)W608^gSCNc4?#zQSe^(x>1FXRD99N&QY zOGZJ_7Oy@%4HWd!>NmI>)lg9b1N133lPUC;Xa!jXDY|mk~kHRwmuJaX(d*%}7UHx&MY^ zhqA^{OmOk(%ry8yvR{m#zJIGJXHm$wqGcaiN4l(Yb9PKO6=u zpRq`f=aYTuSLk9)Fms%7?`nOFDP?govqP$8b^oHi5%XdNQEI8^NS&SGC%K@UnM^tY z`_xevj#Z+*T2XlmSf-kEJVYlyA6F{dbA(+SA5D3l^{*Du9@rfQ8aa%jpT}D4c zrbtGv=T(7fHF~UKQwR53+Fl)nPQAgFCXnM+L?Ihs!Q<-`f* zQM6ikjz$)5ykxHo$UZGf%UaX`AK0a2!4TKM?qCTQ=A}#St`RZBWT`SGV2cjHtS7;> z{lb=~wb^a|Rq=E-Ed{6>cI0<*VQcuZf}gqpa@3e)=d;?fz#718qW}LIjtJ^&UOqDH zZli`@q-fDm5VpIN%7TyjTuBK;v&3@wp83KONRN`UdDaprm|Rw^{zkihIi*%qZ*Ueq zKVC$46gM|F7xv6T1nHpjPps@zOiedR1i0rh7p=Cp=^tR@u)cy?Nhfnq>x1Hs!onj^ zzY>&RRQCkMmxHL4sQG-qSd-kzO-V^<38bU=;C6O@{MZgm%-7fpPCr)TcR<5RB0-PS z<-5xbd;NRgw(~%rU?Ptn5N)#BzSIZfn8%V&pE@Rr986A4`Mu6`pC~b)0W583Y;KKH z*~J8ndL^WNp+K6v0?TwN`^c{?@&$@tLg=4W0e_311J%U}q(lf;$g6N9g}tRj_6yqJ zC@mejM~^L&-=^_Tp6-e8nhMyXF9Kg4gZ$0w0fv8vmDe_j*YUAS!@*Q?ZhpQ<=F#fT z3{F^E09ISGElI-tzbi(+^(Z%Glp_FFCIHv1-8)qBo>_9I)_2M_2QyrtQwjmI&SFJ| z)dROFd2v`lIwZ-f37-f7GGGD(*$xO0$RFL43wU+&?$!xW67EKXJ24T_&5XcD-bf$5 z*wu9q*VI_f3zG0V4SpVN_VCcx*FPe8rl^QWcR;=glBT+R3A8?!r>BP6FzupAft&-` z=SrWBaOWju9)DOt&5GnKNynTIV1Ks_Gh5vz+7Q~{ui668@Bj=y@4pbn6l$mukB%0& zN!O#iwYDWFO17F5937Q*m|Aes+c7$bj!Fw!jNOdIzH8s-vrOg;r zR8*f!H2fcKikXc7Odc!DIV*`x?8OLSlFfM{pDl093gh;%RM$ur1hN%QrU44^0Nr*y zjRPy`bbkCEa;F5L{#wI6BAA^A3h8%Jng~qy)(5x|cz|OXbC`BzzinyQra-k>2F2s~ z3GTcV-<{VU7#-Zgb=Y>YSLjfbFSxzzlN~ZYZMa0wmVYm5-qG`;VB)NG^j?5o!S(;= zgpA*s*A+K@)1+9yUO?dnqS78P+E8Inkszy@yOovp6OqZ`jfhQ%_upP?=h@*J_@dC+ z`o*f|R%Q0g)Km~MsnazOD7}S2%5QuW(@J2J=A46h?J>tX%%Kp3$8d8|ebT9u&0zs*(+b^k){xzIuM@exUi^j&92OIM)%e1aW-znu) zP9HL_67rH)d(0I98-lyt&~&dR!k0QY$+1H8d3kbjs(Lj*Q^kuSk-CHdOxd4e)C3f{ zTrS1>AK-~8hhSp5;aekyBQGBnk$`C#AmF11Z!Y{jqqepKbIGcMMvN91i6y2_$!!kt z>yl;#^&(cJ+XHmGt=d067WT|#9n z&~Z)2J4%IW2H$JHwcbD<3KPOvUt7~%Z1s&uS5;Mosde}DI&a!`&o#Q18V}twn=C_& zYKtHj0sqaiFrgRDxz71uS_7o9Xn{wB5NP(8cmGCngaNa>{W3O5cDD>esI~i^WlZ14mAjY zltx0@OYY&{JnU~g_2-A8xL!(t3KJ3%O7P~a{ONqD!FWXaJc9BAt#1)D@QcZl?PCXy0kZlwxaWo9gu@7F; zxJSng60BXf-Eiu-fpdRY06vnJK5CpPO7GTzSzwMvqEt!#{DZTsm#HrPFSb7t$!y^N z@us;S)OMC*#=Y6D2={EC|L0AU*fO5%H8VvLRHtf#?4 z`&hV=XKy@~MF!+v9a}#IYzBuZ7=p!jf!N$&R-HJ-H0Qdv9 z4|j?z&DubExMIE%;ojp9VFr*mpeJ^ip8xi)RlJPWaRqu>XsPP~6vl(T0sD`Ti|&9` zzZ-ML2ExPx7}gLFTP)fRoZTdQXpj<}J=y2a$6ylbsmzCV>nv8|7Y~7)HNCJH$a2hj(tUr%gs4%oCm^5Vz$hYG0EU%0#Qxc;4Vt*Y9gR<|3qh<*gw$u&M+JJ zOy1J9=&(PlyV3*kr|R`rR_TR_0~o)&rwE#LP1wPK!{|7-Zr2t(bWWWzX|?bEmP82V zoMcPDqG|%Wt-Pct&s(8R?^}WaG-*!oY@~EWtY#DUKPIqVAJ?!&hh-i3-XO@VshKeL z0AT^EUb=TR$bsI-x0XQmH1C|t29u;$XtXRJYPi6`ZIDlnUI6lme*E}B%fR4`+uq&N z^8seAe@tXYCL|;b2t=KQ+(!#OT!d7r%Q?U4?Czs5ma|6liY8R()OleD!<1=~9#F{^ zNblaYtSbE%w!A0}4$@)+U&vLV1AbJ%;iLUmi4b`hDc)ZHyZZH4FkQL^=_K+CnWd$w z0naN?-iOMThKl%qEj3prMGN8+r5|m<##v$|H^R-4{wV&WOo3CqXnl2c5qRR;U<`yw zy$Z~8Kz#i8@ojDk67g`-P+)_j`TF`swBkzKb?1PwDH2y`sicgIF9}1J0H}1yEiB~J z{Q;Vo>c((e&V^*&qho~EH#A)G!I5o&`F=p2`iZ2Ze z1sq_0Wo2v%pM`_WfkBd4S@{Wb6J~;2o&Q)Dd1Yv1Byx=MX^8r04KMCR+nUDn=So?y ztk}Hoqqx!}4~bN-pP=r9@{EuY5F`7u!|hm@=S2R__5H{3LD7RbFqb=YjIUtOZ!l3z z;leJe9nh65XJ4m$0B(lwx0l1QJth>vfp?H<_57!n`WM&7KfihdL3oSej|;2{lAo!R&5vP!#~O+`?cL!+^H( zFp=Ji0VzdSL{1YN8Vc$_^2oKw&GQ5V1xaP!;ecw0PB8*aeH6GZ!&X41KzT?vKfm$ZEikgbvLQuxt-Xz!8{we(^7EFrgZ3;H9Z4y19Hs z{vMnqybkDtP?AB)-EgE_Fk3%Ou{5t~g&LO5(~-qALk~b(ji1#slbm;Elxt1!$Z; z+cQHi*Ws?E+c^z^1~L6&d9vFgDogQ=9ac0v)zo3QSFz5gZs|DyVMmEbO@eE+Ve zQt!yEbhaygb8C7)(xv0w1cU(dNiH@ghJ+5{r8E&*Stzois<(8X(~? zB~Gd{Py|qck98sWj;q|W=YCaHTvXk+d9ZOJfHgWo6OOk;AlqT#Q3)an@)07P_b$3? zG$qW;7+2D3YIsDtGigM*HEba~K~lY?Ad{?li5O@*IWql^##+vS$4GQWn67;_D*b9? zVOj$Qi)AeZdQV(hYf~FStGwrOx4}5E)b3oLBUxXfe$2)E6laa;rzbNuW3@c)YtRzS zvS+AP&q;E{MD*6x?b%MU$yvzino}H7-J)?-niqp+*(u7;0O{*;u_Q+?i(u9@+GqZZ+)c4BNSEb0vTSjj;^k4X`$@qGm`I5nnP#uvBn@z#+)9tGi=2U|@fw|ttZI!tOct8o50g9hP=fteJ}2>E znbIr#qlZSd@s&1O$LsWsHb0*u=(uHY-5T9Z7U}pT^nZAYXs?!1kYxA9Y)7`@n*F58 zj;p4GE~CR1vyj%Kz^6j8XP9Or)y98!>16NoPTI@CVVFgx~ z_GfS3=G-2ySuIu`?%3v+@3`xKBp}lOM8m~;%vMUd$-359uPTYtY)w4+_e15wTHD`y zoVT2TI9#NRhOU7B;N3`PJ}f(*L^v*T4B5RXzbAiCRs?kpe`MUG-Jm^Y@Au>Q`^6cn z3vx|$&>`e_>E%=6?RfOQ0r)u<)78_Pr{(vOw&M5k7d|tz_^zdl76zmqLh$1i156E9 zJ7bo+Zc3=-6&ta_7u&vZs*Oh%mFW7^oa#C$q)|BO6z&z9ZhAhTs`VR=yLD!7Y^zRY zoHe;H$6MC*-h!;Uj9z#uLqdVGn+SP+^1)}Bxbo?dD?RUAKXt=AKVb;;d>6+S1d)Ih#XS* zeIMt?C26JPEP~`?xCE$4vU&@W<5dnK;I?Qm_z15&#Mh9xOO8Lh^QJJL%1to2<2uw8 z?I0Ph$G>&e8MCOXztJESo@8mQJVnmCmGe1n%=0%*843%A-%H>mQE073T;D@+bdiu} zM46C+{R;~P?C#cStf#<%xL4Srq zB(DxsFHcqqq@;Z-1}GEbA!bcvX>UT?PDJYsWYY(TZ~X#o$y8HrEIM^-zv|ZZs|$m3 z9~oq!h{?n+N_>4$kZ&oh^D>+F+4;w)hxM&H5taxuvDE`NnOMm&viuBwKD2+{AD?`1 zm2YLfQsBp!@OXpfj}@&dhM3peZH;E%KGyNQcAYGWLMys^SoUG(tBK{7LH!f@qgOK! zq=5nkikkRMwCsfwa3=W6i^3MPs`B5y-soyHvub$#rLWQKens6}Jh;CcEr$l&KZsVu z^4G`Iyo#)dk1gGrQMl*B!{>Xpx^21v90yVXRzT|QM!JQN=RCAg!8aU8p?%er{yFQZ z9aoRh7vNMVb!fx*k1rEs9s=LUq7|Rq^1*{7ud|W%ZM+UC93bPqGZzO;L4x8jp>!(( zNEtkOXzklz#FJKLo9j(z#z*jD@iXMcHtRRB4j1BW){_3gc;q>~h2S6o^MNpsh~J9nf)*F03i`XDil0Q^Xrv1The^gW>tr3J7~+tw z`6e>bPE%>^L!;T7PtYb9A1J@UA&-Xet0c(!_{&g^g!k*KH9jEry03_PV$ymfBK zVas4M^y4((EOXLO<3+78jG!iW(eGzv>>rFMMeF8MXC4#%xL%C*{c>6vo(9w;A_`!4)igI zi0I+0Oed_en&dj^yslveQRb?xiQw0nY~5$I>sa2ROLY+0?IxPI%jy4BPE)}$B0_jXr2N?abdKU?v9rXeRvfpBKXkeSY}-3- z+(4vF(PdSOi^B{sC3NMjUw;Eq(Se+R>)2aNuJY|61|K-V(VxaV^S zaR^Vgz};pY#QNHldU)FohVuqy;(#ztbui6Gh?Ungc+-djwz-Kx5*b%jVylU@*W(5t zadt6a+(5u;LT%ArRoyzN-({)JOa;wK5+0fO>&~dhMQCbv$L*9M0(SB64`0}glC4@R zfjb=}w11s>drcy@J4l=MTSiAj%PPRg>rYm_9zMQ)Ocz-AL`A0(D#kTWiebMd4%#2K zLWB4-Uu6v5!)?5Alp|I@HaC0guxyJ1$^e8Pj3f@r=&@YC&OoNx1|;C$G;856Kol{%azV`HWt|XHSq(?!VZfK3&SBYQ(>VoUOF?V*Ew7G zzz3bt^lU`z5Tuc^;k)nf9e5;?u7j2oM(M`JG2Gkh1aUfNahk6>xY>qB?h6{lV9tN` zuc=Y#MyAWVHAcZjjlY9xeVhM2h3*^?=@`ooppSPq$-5b|av1+a)R$P-$-xpB;xzvA zHw=|O@d>IEG8TWzVxp@5P%8jFaDHy{gJ{HI%@=VwP>Pp(0#ItZBD z8e2MA4o64-gz1VN3#I}p1UoTE*Au#D)_kGl0&@mk@$~0~EWL*&$=AQm5s#`jH7<5@ z3JPk?P~s4*W3DSr00>I5~s2mEW;I=2>R> zOgB?YbF~Cbc^mOrd~lde|8Q2i2M{ zR{23)_Uu)2!RpfaS(G-rzmsXw#(IKfL(&hoTVHieU(D~W$3YkQNS2JeP6m*a>wgfw zNaZ_5NE`S*5-Mz4e)OvL?7k$f$KCdzW`a{vSd@8l0RE!3Du~#16}>5So@K|;yrsGM z^yF*zQ@!d4spJ>*9{qLwLp-G(kMDz|rXDp86-dY43Ep-8gKag?4X6wiTK{P4#!Q&i z`73Ld=~@~a^|G+c>}`U>GA;i48O)=T)$?+pI-tkgF?->#CGd&uunhkdKEjdehsFYz z97Kg%Zh}DVSx5mClYqk%(Bw7n7<@@aV-33fp4SJvPLd5Ge+I|gGaWI>78~xB5@6Gw z(Xys!r{%3@MqYLu;5-brKxbU@3;>awGNODdf9Zi>rl~cwzfp7~Z!5 zK!ev)v(9S?v*1q|BODH!o9`L0FnIX&%rjI}S0^?fMwsvKhr&WRAnYgT+0jDh!!3?M z?8945Emnvkp)({1LQ;5mipc1K^Z}IbaM*J~MGP;R{Eqx8s;epjEsg45EZv`K{o(j# z29n1>BrWi50PQdxahL%dY_sd-w%hOHz=JRr;LXXych1dbZ$^e6a_hzT)vwQ2M!Gi_#9!<3Y+7@VZ9+Af_(3|F zt@L0!o{2eM2y}d4-9BP%i;PQxQXpwEpKmrWZ(M&jxsskdM3uWuu+4hERE<$|R{&`S zQpfV@uvr`YwymiC*vJUbJI^9`g4Z6;_-%kwD<1vZ*{~M(?f}?_(7Rj@i%wdgYPXD( z+_*1qw4^n*XY@z~)rthSm6$+t_eM-i%+f%(ppPp1t&u{biAfPE;O7ZsBm1XG{|^iQ zuYVqeVO!0v7@=6-=GLoRd?JH)7cS}EJfOv1R1q&cPLn$g}LOTQuBCqHwy2K zFGblD%+_2#VaRJQ&)e<1J3t}8iHHNLFc!Sd1Vjh3ovK9wq7m?k55IR1T@`7)hAN5; z#{$xlUq#|J&8yT?w=6pHpkHB?V#Xn~KJi>$lpyU0ir4Pg>AK^6;^And0zZN%28VHn zeCo2L`mbg;*)A#=J|)s*T?o8@(&ArbNeTpfW(0gEqP5Mc>ItHvQf{-GpcqQuL4Jps z7VurfrkjPaAwoPD9LDS_If`LVtU zIr$KB_mjm@pzE)FX7%#>9uNvoBJesf`f|YPUq68*FfQTrfqVx!6yS1q$Y_<*o)6fp z-!0*8M%Y|>I6#4fApu_|fzeU$aycSq08{p88}}R-%hhos_=X zlZ7%oTu^Y!dg?+C&@K!d3<06RoCNgDTuK2ElxUB_c-q?&`u@$g_8jJde9p`eeR-V$ z^6-t+Ev)Og&Pc;l8o#M@U3jowQe=s zQ!bx2x*3&<5kkZZ9J%4%3MlfTz2vqK23mk}K>LcJzy(!2I5HydQzOZRgzA zA;8iJUHAIGoNaOtB@|uEWTU!-5wBdTL7>5F7i)%#DW75U^6Gu7UQg#()N4_9=D*uyD|1~D5-j`+$UVjeEHA3%b3PBS-rXuB}W8{gdkHMK97Qo^tH zGz(Vg&)X9`p&L68@@rw5~h^p#?w zg7r(pv4RUEJUmWg(?k4uP^+iAHo61i`HKJuR+ND51y8Z{M6Y0601=q?V2*k$mAcFR zRWdIy^HLEm45S_``L3Vq=HP`~>#8XrcRHsBeHy;~ZWVLMFZ)-n{m1oZMR@s?OgR)Q zFq0Yu3nTs}vema2cO0Po62QYUaFl|9+!=Z&4D|mb>mh7{B{G@Q(oXrKt2<;g?0RD2 z?%>aNOFnID-^sd9TYeX~wEEnZmzKynxR*rLrKLkA`>)KE0UR6_3l=>=V}E!V%f|O$ zSjJvR$yy^MDOR_^v$5%XvEHx2f7+dOJB1UaxY&h`Y?&fnbDs5J^e%-2iZzsxsk6