diff --git a/docs/development/core/server/kibana-plugin-core-server.deprecationsservicesetup.md b/docs/development/core/server/kibana-plugin-core-server.deprecationsservicesetup.md index 2bc7f6cba594d..7b2cbdecd146a 100644 --- a/docs/development/core/server/kibana-plugin-core-server.deprecationsservicesetup.md +++ b/docs/development/core/server/kibana-plugin-core-server.deprecationsservicesetup.md @@ -27,7 +27,6 @@ async function getDeprecations({ esClient, savedObjectsClient }: GetDeprecations const deprecations: DeprecationsDetails[] = []; const count = await getFooCount(savedObjectsClient); if (count > 0) { - // Example of a manual correctiveAction deprecations.push({ title: i18n.translate('xpack.foo.deprecations.title', { defaultMessage: `Foo's are deprecated` diff --git a/docs/development/core/server/kibana-plugin-core-server.opsmetrics.md b/docs/development/core/server/kibana-plugin-core-server.opsmetrics.md index 1572c1ae3131e..4774215cef071 100644 --- a/docs/development/core/server/kibana-plugin-core-server.opsmetrics.md +++ b/docs/development/core/server/kibana-plugin-core-server.opsmetrics.md @@ -19,7 +19,7 @@ export interface OpsMetrics | [collected\_at](./kibana-plugin-core-server.opsmetrics.collected_at.md) | Date | Time metrics were recorded at. | | [concurrent\_connections](./kibana-plugin-core-server.opsmetrics.concurrent_connections.md) | OpsServerMetrics['concurrent_connections'] | number of current concurrent connections to the server | | [os](./kibana-plugin-core-server.opsmetrics.os.md) | OpsOsMetrics | OS related metrics | -| [process](./kibana-plugin-core-server.opsmetrics.process.md) | OpsProcessMetrics | Process related metrics. Deprecated in favor of processes field. | +| [process](./kibana-plugin-core-server.opsmetrics.process.md) | OpsProcessMetrics | Process related metrics. | | [processes](./kibana-plugin-core-server.opsmetrics.processes.md) | OpsProcessMetrics[] | Process related metrics. Reports an array of objects for each kibana pid. | | [requests](./kibana-plugin-core-server.opsmetrics.requests.md) | OpsServerMetrics['requests'] | server requests stats | | [response\_times](./kibana-plugin-core-server.opsmetrics.response_times.md) | OpsServerMetrics['response_times'] | server response time stats | diff --git a/docs/development/core/server/kibana-plugin-core-server.opsmetrics.process.md b/docs/development/core/server/kibana-plugin-core-server.opsmetrics.process.md index 9da2c0644dc84..6e686f189aeea 100644 --- a/docs/development/core/server/kibana-plugin-core-server.opsmetrics.process.md +++ b/docs/development/core/server/kibana-plugin-core-server.opsmetrics.process.md @@ -6,9 +6,10 @@ > Warning: This API is now obsolete. > +> use the processes field instead. > -Process related metrics. Deprecated in favor of processes field. +Process related metrics. Signature: diff --git a/examples/bfetch_explorer/public/mount.tsx b/examples/bfetch_explorer/public/mount.tsx index 58ab3a609ad5e..8c15405f2f6be 100644 --- a/examples/bfetch_explorer/public/mount.tsx +++ b/examples/bfetch_explorer/public/mount.tsx @@ -20,17 +20,16 @@ export interface BfetchDeps { explorer: ExplorerService; } -export const mount = ( - coreSetup: CoreSetup, - explorer: ExplorerService -) => async ({ appBasePath, element }: AppMountParameters) => { - const [core, plugins] = await coreSetup.getStartServices(); - const deps: BfetchDeps = { appBasePath, core, plugins, explorer }; - const reactElement = ( - - - - ); - render(reactElement, element); - return () => unmountComponentAtNode(element); -}; +export const mount = + (coreSetup: CoreSetup, explorer: ExplorerService) => + async ({ appBasePath, element }: AppMountParameters) => { + const [core, plugins] = await coreSetup.getStartServices(); + const deps: BfetchDeps = { appBasePath, core, plugins, explorer }; + const reactElement = ( + + + + ); + render(reactElement, element); + return () => unmountComponentAtNode(element); + }; diff --git a/examples/dashboard_embeddable_examples/public/plugin.tsx b/examples/dashboard_embeddable_examples/public/plugin.tsx index 57678f5a2a517..5fd3e01f2ca71 100644 --- a/examples/dashboard_embeddable_examples/public/plugin.tsx +++ b/examples/dashboard_embeddable_examples/public/plugin.tsx @@ -33,7 +33,8 @@ export class DashboardEmbeddableExamples implements Plugin - implements ReferenceOrValueEmbeddable { + implements ReferenceOrValueEmbeddable +{ public readonly type = BOOK_EMBEDDABLE; private subscription: Subscription; private node?: HTMLElement; diff --git a/examples/embeddable_examples/public/book/book_embeddable_factory.tsx b/examples/embeddable_examples/public/book/book_embeddable_factory.tsx index a16c50db8b105..727e0fd18a52d 100644 --- a/examples/embeddable_examples/public/book/book_embeddable_factory.tsx +++ b/examples/embeddable_examples/public/book/book_embeddable_factory.tsx @@ -52,7 +52,8 @@ export class BookEmbeddableFactoryDefinition BookEmbeddableOutput, BookEmbeddable, BookSavedObjectAttributes - > { + > +{ public readonly type = BOOK_EMBEDDABLE; public savedObjectMetaData = { name: 'Book', @@ -116,10 +117,8 @@ export class BookEmbeddableFactoryDefinition private async unwrapMethod(savedObjectId: string): Promise { const { savedObjectsClient } = await this.getStartServices(); - const savedObject: SimpleSavedObject = await savedObjectsClient.get( - this.type, - savedObjectId - ); + const savedObject: SimpleSavedObject = + await savedObjectsClient.get(this.type, savedObjectId); return { ...savedObject.attributes }; } diff --git a/examples/embeddable_examples/public/list_container/list_container_factory.ts b/examples/embeddable_examples/public/list_container/list_container_factory.ts index d5b4e6712c6df..7dc85fa476dfa 100644 --- a/examples/embeddable_examples/public/list_container/list_container_factory.ts +++ b/examples/embeddable_examples/public/list_container/list_container_factory.ts @@ -22,7 +22,8 @@ interface StartServices { export type ListContainerFactory = EmbeddableFactory; export class ListContainerFactoryDefinition - implements EmbeddableFactoryDefinition { + implements EmbeddableFactoryDefinition +{ public readonly type = LIST_CONTAINER; public readonly isContainerType = true; diff --git a/examples/embeddable_examples/public/migrations/migrations_embeddable_factory.ts b/examples/embeddable_examples/public/migrations/migrations_embeddable_factory.ts index 508ed780038c8..c1ceaaca3e466 100644 --- a/examples/embeddable_examples/public/migrations/migrations_embeddable_factory.ts +++ b/examples/embeddable_examples/public/migrations/migrations_embeddable_factory.ts @@ -26,7 +26,8 @@ export type SimpleEmbeddableInput = EmbeddableInput & { export type SimpleEmbeddableFactory = EmbeddableFactory; export class SimpleEmbeddableFactoryDefinition - implements EmbeddableFactoryDefinition { + implements EmbeddableFactoryDefinition +{ public readonly type = SIMPLE_EMBEDDABLE; // we need to provide migration function every time we change the interface of our state diff --git a/examples/embeddable_examples/public/multi_task_todo/multi_task_todo_embeddable_factory.ts b/examples/embeddable_examples/public/multi_task_todo/multi_task_todo_embeddable_factory.ts index 473e9dee87364..7364f336b722c 100644 --- a/examples/embeddable_examples/public/multi_task_todo/multi_task_todo_embeddable_factory.ts +++ b/examples/embeddable_examples/public/multi_task_todo/multi_task_todo_embeddable_factory.ts @@ -27,7 +27,8 @@ export type MultiTaskTodoEmbeddableFactory = EmbeddableFactory< export class MultiTaskTodoEmbeddableFactoryDefinition implements - EmbeddableFactoryDefinition { + EmbeddableFactoryDefinition +{ public readonly type = MULTI_TASK_TODO_EMBEDDABLE; public async isEditable() { diff --git a/examples/embeddable_examples/public/plugin.ts b/examples/embeddable_examples/public/plugin.ts index 248072064e140..e59e7367e8af7 100644 --- a/examples/embeddable_examples/public/plugin.ts +++ b/examples/embeddable_examples/public/plugin.ts @@ -88,65 +88,74 @@ export class EmbeddableExamplesPlugin EmbeddableExamplesStart, EmbeddableExamplesSetupDependencies, EmbeddableExamplesStartDependencies - > { + > +{ private exampleEmbeddableFactories: Partial = {}; public setup( core: CoreSetup, deps: EmbeddableExamplesSetupDependencies ) { - this.exampleEmbeddableFactories.getHelloWorldEmbeddableFactory = deps.embeddable.registerEmbeddableFactory( - HELLO_WORLD_EMBEDDABLE, - new HelloWorldEmbeddableFactoryDefinition() - ); - - this.exampleEmbeddableFactories.getMigrationsEmbeddableFactory = deps.embeddable.registerEmbeddableFactory( - SIMPLE_EMBEDDABLE, - new SimpleEmbeddableFactoryDefinition() - ); - - this.exampleEmbeddableFactories.getMultiTaskTodoEmbeddableFactory = deps.embeddable.registerEmbeddableFactory( - MULTI_TASK_TODO_EMBEDDABLE, - new MultiTaskTodoEmbeddableFactoryDefinition() - ); - - this.exampleEmbeddableFactories.getSearchableListContainerEmbeddableFactory = deps.embeddable.registerEmbeddableFactory( - SEARCHABLE_LIST_CONTAINER, - new SearchableListContainerFactoryDefinition(async () => ({ - embeddableServices: (await core.getStartServices())[1].embeddable, - })) - ); - - this.exampleEmbeddableFactories.getListContainerEmbeddableFactory = deps.embeddable.registerEmbeddableFactory( - LIST_CONTAINER, - new ListContainerFactoryDefinition(async () => ({ - embeddableServices: (await core.getStartServices())[1].embeddable, - })) - ); - - this.exampleEmbeddableFactories.getTodoEmbeddableFactory = deps.embeddable.registerEmbeddableFactory( - TODO_EMBEDDABLE, - new TodoEmbeddableFactoryDefinition(async () => ({ - openModal: (await core.getStartServices())[0].overlays.openModal, - })) - ); - - this.exampleEmbeddableFactories.getTodoRefEmbeddableFactory = deps.embeddable.registerEmbeddableFactory( - TODO_REF_EMBEDDABLE, - new TodoRefEmbeddableFactoryDefinition(async () => ({ - savedObjectsClient: (await core.getStartServices())[0].savedObjects.client, - getEmbeddableFactory: (await core.getStartServices())[1].embeddable.getEmbeddableFactory, - })) - ); - this.exampleEmbeddableFactories.getBookEmbeddableFactory = deps.embeddable.registerEmbeddableFactory( - BOOK_EMBEDDABLE, - new BookEmbeddableFactoryDefinition(async () => ({ - getAttributeService: (await core.getStartServices())[1].embeddable.getAttributeService, - openModal: (await core.getStartServices())[0].overlays.openModal, - savedObjectsClient: (await core.getStartServices())[0].savedObjects.client, - overlays: (await core.getStartServices())[0].overlays, - })) - ); + this.exampleEmbeddableFactories.getHelloWorldEmbeddableFactory = + deps.embeddable.registerEmbeddableFactory( + HELLO_WORLD_EMBEDDABLE, + new HelloWorldEmbeddableFactoryDefinition() + ); + + this.exampleEmbeddableFactories.getMigrationsEmbeddableFactory = + deps.embeddable.registerEmbeddableFactory( + SIMPLE_EMBEDDABLE, + new SimpleEmbeddableFactoryDefinition() + ); + + this.exampleEmbeddableFactories.getMultiTaskTodoEmbeddableFactory = + deps.embeddable.registerEmbeddableFactory( + MULTI_TASK_TODO_EMBEDDABLE, + new MultiTaskTodoEmbeddableFactoryDefinition() + ); + + this.exampleEmbeddableFactories.getSearchableListContainerEmbeddableFactory = + deps.embeddable.registerEmbeddableFactory( + SEARCHABLE_LIST_CONTAINER, + new SearchableListContainerFactoryDefinition(async () => ({ + embeddableServices: (await core.getStartServices())[1].embeddable, + })) + ); + + this.exampleEmbeddableFactories.getListContainerEmbeddableFactory = + deps.embeddable.registerEmbeddableFactory( + LIST_CONTAINER, + new ListContainerFactoryDefinition(async () => ({ + embeddableServices: (await core.getStartServices())[1].embeddable, + })) + ); + + this.exampleEmbeddableFactories.getTodoEmbeddableFactory = + deps.embeddable.registerEmbeddableFactory( + TODO_EMBEDDABLE, + new TodoEmbeddableFactoryDefinition(async () => ({ + openModal: (await core.getStartServices())[0].overlays.openModal, + })) + ); + + this.exampleEmbeddableFactories.getTodoRefEmbeddableFactory = + deps.embeddable.registerEmbeddableFactory( + TODO_REF_EMBEDDABLE, + new TodoRefEmbeddableFactoryDefinition(async () => ({ + savedObjectsClient: (await core.getStartServices())[0].savedObjects.client, + getEmbeddableFactory: (await core.getStartServices())[1].embeddable.getEmbeddableFactory, + })) + ); + this.exampleEmbeddableFactories.getBookEmbeddableFactory = + deps.embeddable.registerEmbeddableFactory( + BOOK_EMBEDDABLE, + new BookEmbeddableFactoryDefinition(async () => ({ + getAttributeService: (await core.getStartServices())[1].embeddable.getAttributeService, + openModal: (await core.getStartServices())[0].overlays.openModal, + savedObjectsClient: (await core.getStartServices())[0].savedObjects.client, + overlays: (await core.getStartServices())[0].overlays, + })) + ); const editBookAction = createEditBookAction(async () => ({ getAttributeService: (await core.getStartServices())[1].embeddable.getAttributeService, diff --git a/examples/embeddable_examples/public/searchable_list_container/searchable_list_container_factory.ts b/examples/embeddable_examples/public/searchable_list_container/searchable_list_container_factory.ts index 0c7c42ef4d97f..5b09719f70b39 100644 --- a/examples/embeddable_examples/public/searchable_list_container/searchable_list_container_factory.ts +++ b/examples/embeddable_examples/public/searchable_list_container/searchable_list_container_factory.ts @@ -28,7 +28,8 @@ export type SearchableListContainerFactory = EmbeddableFactory< ContainerOutput >; export class SearchableListContainerFactoryDefinition - implements EmbeddableFactoryDefinition { + implements EmbeddableFactoryDefinition +{ public readonly type = SEARCHABLE_LIST_CONTAINER; public readonly isContainerType = true; diff --git a/examples/embeddable_examples/public/todo/todo_embeddable_factory.tsx b/examples/embeddable_examples/public/todo/todo_embeddable_factory.tsx index 2a55316e504d7..2c8b3083fd990 100644 --- a/examples/embeddable_examples/public/todo/todo_embeddable_factory.tsx +++ b/examples/embeddable_examples/public/todo/todo_embeddable_factory.tsx @@ -44,7 +44,8 @@ interface StartServices { export type TodoEmbeddableFactory = EmbeddableFactory; export class TodoEmbeddableFactoryDefinition - implements EmbeddableFactoryDefinition { + implements EmbeddableFactoryDefinition +{ public readonly type = TODO_EMBEDDABLE; constructor(private getStartServices: () => Promise) {} diff --git a/examples/embeddable_examples/public/todo/todo_ref_embeddable_factory.tsx b/examples/embeddable_examples/public/todo/todo_ref_embeddable_factory.tsx index 73f34796cd91f..467318658da19 100644 --- a/examples/embeddable_examples/public/todo/todo_ref_embeddable_factory.tsx +++ b/examples/embeddable_examples/public/todo/todo_ref_embeddable_factory.tsx @@ -42,7 +42,8 @@ export class TodoRefEmbeddableFactoryDefinition TodoRefOutput, TodoRefEmbeddable, TodoSavedObjectAttributes - > { + > +{ public readonly type = TODO_REF_EMBEDDABLE; public readonly savedObjectMetaData = { name: 'Todo', diff --git a/examples/embeddable_examples/server/plugin.ts b/examples/embeddable_examples/server/plugin.ts index a3c3d4b5284f7..469c463381d1c 100644 --- a/examples/embeddable_examples/server/plugin.ts +++ b/examples/embeddable_examples/server/plugin.ts @@ -17,7 +17,8 @@ export interface EmbeddableExamplesSetupDependencies { } export class EmbeddableExamplesPlugin - implements Plugin { + implements Plugin +{ public setup(core: CoreSetup, { embeddable }: EmbeddableExamplesSetupDependencies) { core.savedObjects.registerType(todoSavedObject); core.savedObjects.registerType(bookSavedObject); diff --git a/examples/index_pattern_field_editor_example/public/plugin.tsx b/examples/index_pattern_field_editor_example/public/plugin.tsx index ccbb93e3acf95..8ed158e9923eb 100644 --- a/examples/index_pattern_field_editor_example/public/plugin.tsx +++ b/examples/index_pattern_field_editor_example/public/plugin.tsx @@ -40,8 +40,7 @@ export class IndexPatternFieldEditorPlugin implements Plugin { + implements Plugin +{ public setup(core: CoreSetup, plugins: SetupDeps) { const locator = plugins.share.url.locators.create(new HelloLocatorDefinition()); diff --git a/examples/locator_explorer/public/plugin.tsx b/examples/locator_explorer/public/plugin.tsx index 3e8382f2a606f..45b1d2d7939ea 100644 --- a/examples/locator_explorer/public/plugin.tsx +++ b/examples/locator_explorer/public/plugin.tsx @@ -47,8 +47,7 @@ export class LocatorExplorerPlugin implements Plugin { links: [ { label: 'IRouter', - href: - 'https://github.com/elastic/kibana/blob/master/docs/development/core/server/kibana-plugin-core-server.irouter.md', + href: 'https://github.com/elastic/kibana/blob/master/docs/development/core/server/kibana-plugin-core-server.irouter.md', iconType: 'logoGithub', target: '_blank', size: 's', }, { label: 'HttpHandler (core.http.fetch)', - href: - 'https://github.com/elastic/kibana/blob/master/docs/development/core/public/kibana-plugin-core-public.httphandler.md', + href: 'https://github.com/elastic/kibana/blob/master/docs/development/core/public/kibana-plugin-core-public.httphandler.md', iconType: 'logoGithub', target: '_blank', size: 's', diff --git a/examples/search_examples/public/plugin.ts b/examples/search_examples/public/plugin.ts index 87992e5493f0e..b00362aef1f5e 100644 --- a/examples/search_examples/public/plugin.ts +++ b/examples/search_examples/public/plugin.ts @@ -30,7 +30,8 @@ export class SearchExamplesPlugin SearchExamplesPluginStart, AppPluginSetupDependencies, AppPluginStartDependencies - > { + > +{ public setup( core: CoreSetup, { developerExamples, share }: AppPluginSetupDependencies diff --git a/examples/search_examples/public/search_sessions/app.tsx b/examples/search_examples/public/search_sessions/app.tsx index 173cf91cd9c71..63ab706c945d5 100644 --- a/examples/search_examples/public/search_sessions/app.tsx +++ b/examples/search_examples/public/search_sessions/app.tsx @@ -542,14 +542,8 @@ function SearchInspector({ function useAppState({ data }: { data: DataPublicPluginStart }) { const stateContainer = useMemo(() => { - const { - filters, - time, - searchSessionId, - numericFieldName, - indexPatternId, - query, - } = getInitialStateFromUrl(); + const { filters, time, searchSessionId, numericFieldName, indexPatternId, query } = + getInitialStateFromUrl(); if (filters) { data.query.filterManager.setFilters(filters); diff --git a/examples/search_examples/server/fibonacci_strategy.ts b/examples/search_examples/server/fibonacci_strategy.ts index a37438aba7055..93cb18d3e9e82 100644 --- a/examples/search_examples/server/fibonacci_strategy.ts +++ b/examples/search_examples/server/fibonacci_strategy.ts @@ -15,7 +15,7 @@ export const fibonacciStrategyProvider = (): ISearchStrategy< FibonacciResponse > => { const responseMap = new Map(); - return ({ + return { search: (request: FibonacciRequest) => { const id = request.id ?? uuid(); const [sequence, total, started] = responseMap.get(id) ?? [ @@ -48,5 +48,5 @@ export const fibonacciStrategyProvider = (): ISearchStrategy< cancel: async (id: string) => { responseMap.delete(id); }, - } as unknown) as ISearchStrategy; + } as unknown as ISearchStrategy; }; diff --git a/examples/search_examples/server/plugin.ts b/examples/search_examples/server/plugin.ts index 984d3201220eb..992c260e25e9d 100644 --- a/examples/search_examples/server/plugin.ts +++ b/examples/search_examples/server/plugin.ts @@ -33,7 +33,8 @@ export class SearchExamplesPlugin SearchExamplesPluginStart, SearchExamplesPluginSetupDeps, SearchExamplesPluginStartDeps - > { + > +{ private readonly logger: Logger; constructor(initializerContext: PluginInitializerContext) { diff --git a/examples/state_containers_examples/public/plugin.ts b/examples/state_containers_examples/public/plugin.ts index df4d34ef1e1a7..ac65d42ae4050 100644 --- a/examples/state_containers_examples/public/plugin.ts +++ b/examples/state_containers_examples/public/plugin.ts @@ -88,16 +88,14 @@ export class StateContainersExamplesPlugin implements Plugin { links: [ { label: 'State containers README', - href: - 'https://github.com/elastic/kibana/tree/master/src/plugins/kibana_utils/docs/state_containers', + href: 'https://github.com/elastic/kibana/tree/master/src/plugins/kibana_utils/docs/state_containers', iconType: 'logoGithub', size: 's', target: '_blank', }, { label: 'State sync utils README', - href: - 'https://github.com/elastic/kibana/tree/master/src/plugins/kibana_utils/docs/state_sync', + href: 'https://github.com/elastic/kibana/tree/master/src/plugins/kibana_utils/docs/state_sync', iconType: 'logoGithub', size: 's', target: '_blank', diff --git a/examples/ui_action_examples/public/plugin.ts b/examples/ui_action_examples/public/plugin.ts index a3c2f3ea9f2c8..4845ebf683026 100644 --- a/examples/ui_action_examples/public/plugin.ts +++ b/examples/ui_action_examples/public/plugin.ts @@ -21,7 +21,8 @@ export interface UiActionExamplesStartDependencies { export class UiActionExamplesPlugin implements - Plugin { + Plugin +{ public setup( core: CoreSetup, { uiActions }: UiActionExamplesSetupDependencies diff --git a/package.json b/package.json index e16d88689dc3b..e6015c88f95a0 100644 --- a/package.json +++ b/package.json @@ -584,7 +584,7 @@ "@types/pdfmake": "^0.1.15", "@types/pegjs": "^0.10.1", "@types/pngjs": "^3.4.0", - "@types/prettier": "^2.1.5", + "@types/prettier": "^2.3.2", "@types/pretty-ms": "^5.0.0", "@types/prop-types": "^15.7.3", "@types/rbush": "^3.0.0", @@ -705,7 +705,7 @@ "eslint-plugin-no-unsanitized": "^3.0.2", "eslint-plugin-node": "^11.0.0", "eslint-plugin-prefer-object-spread": "^1.2.1", - "eslint-plugin-prettier": "^3.1.4", + "eslint-plugin-prettier": "^3.4.1", "eslint-plugin-react": "^7.20.3", "eslint-plugin-react-hooks": "^4.2.0", "eslint-plugin-react-perf": "^3.2.3", @@ -782,7 +782,7 @@ "postcss": "^7.0.32", "postcss-loader": "^3.0.0", "postcss-prefix-selector": "^1.7.2", - "prettier": "^2.2.0", + "prettier": "^2.4.0", "pretty-ms": "5.0.0", "q": "^1.5.1", "react-test-renderer": "^16.12.0", diff --git a/packages/kbn-analytics/src/application_usage_tracker.ts b/packages/kbn-analytics/src/application_usage_tracker.ts index b1cc47334541a..751fb9203fe62 100644 --- a/packages/kbn-analytics/src/application_usage_tracker.ts +++ b/packages/kbn-analytics/src/application_usage_tracker.ts @@ -132,9 +132,9 @@ export class ApplicationUsageTracker { } public pauseTrackingAll() { - this.currentApplicationKeys = Object.values( - this.trackedApplicationViews - ).map(({ appId, viewId }) => this.createKey(appId, viewId)); + this.currentApplicationKeys = Object.values(this.trackedApplicationViews).map( + ({ appId, viewId }) => this.createKey(appId, viewId) + ); this.flushTrackedViews(); } diff --git a/packages/kbn-config-schema/src/types/object_type.ts b/packages/kbn-config-schema/src/types/object_type.ts index 284ea6fddb35b..784b17a92c397 100644 --- a/packages/kbn-config-schema/src/types/object_type.ts +++ b/packages/kbn-config-schema/src/types/object_type.ts @@ -35,8 +35,9 @@ type RequiredProperties = Pick< // Because of https://github.com/Microsoft/TypeScript/issues/14041 // this might not have perfect _rendering_ output, but it will be typed. export type ObjectResultType

= Readonly< - { [K in keyof OptionalProperties

]?: TypeOf } & - { [K in keyof RequiredProperties

]: TypeOf } + { [K in keyof OptionalProperties

]?: TypeOf } & { + [K in keyof RequiredProperties

]: TypeOf; + } >; type DefinedProperties = Pick< @@ -46,8 +47,9 @@ type DefinedProperties = Pick< }[keyof Base] >; -type ExtendedProps

= Omit & - { [K in keyof DefinedProperties]: NP[K] }; +type ExtendedProps

= Omit & { + [K in keyof DefinedProperties]: NP[K]; +}; type ExtendedObjectType

= ObjectType< ExtendedProps diff --git a/packages/kbn-config/src/deprecation/deprecation_factory.ts b/packages/kbn-config/src/deprecation/deprecation_factory.ts index 6d7669cef04f2..119b9b11237dc 100644 --- a/packages/kbn-config/src/deprecation/deprecation_factory.ts +++ b/packages/kbn-config/src/deprecation/deprecation_factory.ts @@ -125,31 +125,25 @@ const _unused = ( }; }; -const rename = ( - oldKey: string, - newKey: string, - details?: Partial -): ConfigDeprecation => (config, rootPath, addDeprecation) => - _rename(config, rootPath, addDeprecation, oldKey, newKey, details); +const rename = + (oldKey: string, newKey: string, details?: Partial): ConfigDeprecation => + (config, rootPath, addDeprecation) => + _rename(config, rootPath, addDeprecation, oldKey, newKey, details); -const renameFromRoot = ( - oldKey: string, - newKey: string, - details?: Partial -): ConfigDeprecation => (config, rootPath, addDeprecation) => - _rename(config, '', addDeprecation, oldKey, newKey, details); +const renameFromRoot = + (oldKey: string, newKey: string, details?: Partial): ConfigDeprecation => + (config, rootPath, addDeprecation) => + _rename(config, '', addDeprecation, oldKey, newKey, details); -const unused = ( - unusedKey: string, - details?: Partial -): ConfigDeprecation => (config, rootPath, addDeprecation) => - _unused(config, rootPath, addDeprecation, unusedKey, details); +const unused = + (unusedKey: string, details?: Partial): ConfigDeprecation => + (config, rootPath, addDeprecation) => + _unused(config, rootPath, addDeprecation, unusedKey, details); -const unusedFromRoot = ( - unusedKey: string, - details?: Partial -): ConfigDeprecation => (config, rootPath, addDeprecation) => - _unused(config, '', addDeprecation, unusedKey, details); +const unusedFromRoot = + (unusedKey: string, details?: Partial): ConfigDeprecation => + (config, rootPath, addDeprecation) => + _unused(config, '', addDeprecation, unusedKey, details); const getPath = (rootPath: string, subPath: string) => rootPath !== '' ? `${rootPath}.${subPath}` : subPath; diff --git a/packages/kbn-docs-utils/src/api_docs/build_api_docs_cli.ts b/packages/kbn-docs-utils/src/api_docs/build_api_docs_cli.ts index 5b973977c86d9..a45c9035baa31 100644 --- a/packages/kbn-docs-utils/src/api_docs/build_api_docs_cli.ts +++ b/packages/kbn-docs-utils/src/api_docs/build_api_docs_cli.ts @@ -74,15 +74,11 @@ export function runBuildApiDocsCli() { } const collectReferences = flags.references as boolean; - const { - pluginApiMap, - missingApiItems, - unReferencedDeprecations, - referencedDeprecations, - } = getPluginApiMap(project, plugins, log, { - collectReferences, - pluginFilter: pluginFilter as string[], - }); + const { pluginApiMap, missingApiItems, unReferencedDeprecations, referencedDeprecations } = + getPluginApiMap(project, plugins, log, { + collectReferences, + pluginFilter: pluginFilter as string[], + }); const reporter = CiStatsReporter.fromEnv(log); plugins.forEach((plugin) => { diff --git a/packages/kbn-docs-utils/src/api_docs/tests/__fixtures__/src/plugin_a/public/fns.ts b/packages/kbn-docs-utils/src/api_docs/tests/__fixtures__/src/plugin_a/public/fns.ts index c2a932f7d9134..8bcf2bb7ab185 100644 --- a/packages/kbn-docs-utils/src/api_docs/tests/__fixtures__/src/plugin_a/public/fns.ts +++ b/packages/kbn-docs-utils/src/api_docs/tests/__fixtures__/src/plugin_a/public/fns.ts @@ -60,11 +60,15 @@ export const arrowFn = ( * @returns I have no idea. * */ -export const crazyFunction = ( - obj: { hi: string }, - { fn1, fn2 }: { fn1: (foo: { param: string }) => number; fn2: () => void }, - { str }: { str: string } -) => () => () => fn1({ param: str }); +export const crazyFunction = + ( + obj: { hi: string }, + { fn1, fn2 }: { fn1: (foo: { param: string }) => number; fn2: () => void }, + { str }: { str: string } + ) => + () => + () => + fn1({ param: str }); export const fnWithNonExportedRef = (a: ImNotExportedFromIndex) => a; diff --git a/packages/kbn-es-query/src/es_query/from_filters.test.ts b/packages/kbn-es-query/src/es_query/from_filters.test.ts index e3a56b5a9d63d..0e376fe3f299e 100644 --- a/packages/kbn-es-query/src/es_query/from_filters.test.ts +++ b/packages/kbn-es-query/src/es_query/from_filters.test.ts @@ -60,7 +60,7 @@ describe('build query', () => { }); test('should remove falsy filters', () => { - const filters = ([null, undefined] as unknown) as Filter[]; + const filters = [null, undefined] as unknown as Filter[]; const result = buildQueryFromFilters(filters, indexPattern, false); expect(result.must_not).toEqual([]); diff --git a/packages/kbn-es-query/src/es_query/from_lucene.test.ts b/packages/kbn-es-query/src/es_query/from_lucene.test.ts index e4ca435ae8862..bed8333c762de 100644 --- a/packages/kbn-es-query/src/es_query/from_lucene.test.ts +++ b/packages/kbn-es-query/src/es_query/from_lucene.test.ts @@ -26,10 +26,10 @@ describe('build query', () => { }); test("should transform an array of lucene queries into ES queries combined in the bool's must clause", () => { - const queries = ([ + const queries = [ { query: 'foo:bar', language: 'lucene' }, { query: 'bar:baz', language: 'lucene' }, - ] as unknown) as Query[]; + ] as unknown as Query[]; const expectedESQueries = queries.map((query) => { return decorateQuery(luceneStringToDsl(query.query), {}); }); @@ -40,7 +40,7 @@ describe('build query', () => { }); test('should also accept queries in ES query DSL format, simply passing them through', () => { - const queries = ([{ query: { match_all: {} }, language: 'lucene' }] as unknown) as Query[]; + const queries = [{ query: { match_all: {} }, language: 'lucene' }] as unknown as Query[]; const result = buildQueryFromLucene(queries, {}); expect(result.must).toEqual([queries[0].query]); @@ -48,10 +48,10 @@ describe('build query', () => { }); test("should accept a date format in the decorated queries and combine that into the bool's must clause", () => { - const queries = ([ + const queries = [ { query: 'foo:bar', language: 'lucene' }, { query: 'bar:baz', language: 'lucene' }, - ] as unknown) as Query[]; + ] as unknown as Query[]; const dateFormatTZ = 'America/Phoenix'; const expectedESQueries = queries.map((query) => { return decorateQuery(luceneStringToDsl(query.query), {}, dateFormatTZ); diff --git a/packages/kbn-es-query/src/es_query/migrate_filter.test.ts b/packages/kbn-es-query/src/es_query/migrate_filter.test.ts index ed01ce22e2edc..77118e2cbdb1c 100644 --- a/packages/kbn-es-query/src/es_query/migrate_filter.test.ts +++ b/packages/kbn-es-query/src/es_query/migrate_filter.test.ts @@ -11,7 +11,7 @@ import { migrateFilter, DeprecatedMatchPhraseFilter } from './migrate_filter'; import { PhraseFilter, MatchAllFilter } from '../filters'; describe('migrateFilter', function () { - const oldMatchPhraseFilter = ({ + const oldMatchPhraseFilter = { query: { match: { fieldFoo: { @@ -21,9 +21,9 @@ describe('migrateFilter', function () { }, }, meta: {}, - } as unknown) as DeprecatedMatchPhraseFilter; + } as unknown as DeprecatedMatchPhraseFilter; - const newMatchPhraseFilter = ({ + const newMatchPhraseFilter = { query: { match_phrase: { fieldFoo: { @@ -32,7 +32,7 @@ describe('migrateFilter', function () { }, }, meta: {}, - } as unknown) as PhraseFilter; + } as unknown as PhraseFilter; it('should migrate match filters of type phrase', function () { const migratedFilter = migrateFilter(oldMatchPhraseFilter, undefined); diff --git a/packages/kbn-es-query/src/filters/build_filters/range_filter.test.ts b/packages/kbn-es-query/src/filters/build_filters/range_filter.test.ts index 32909fcc8cf9a..8895b766e2335 100644 --- a/packages/kbn-es-query/src/filters/build_filters/range_filter.test.ts +++ b/packages/kbn-es-query/src/filters/build_filters/range_filter.test.ts @@ -203,9 +203,9 @@ describe('Range filter builder', () => { }); describe('getRangeFilterField', function () { - const indexPattern: IndexPatternBase = ({ + const indexPattern: IndexPatternBase = { fields, - } as unknown) as IndexPatternBase; + } as unknown as IndexPatternBase; test('should return the name of the field a range query is targeting', () => { const field = indexPattern.fields.find((patternField) => patternField.name === 'bytes'); diff --git a/packages/kbn-es-query/src/kuery/ast/ast.test.ts b/packages/kbn-es-query/src/kuery/ast/ast.test.ts index 459ace026796c..edb9150ea00d5 100644 --- a/packages/kbn-es-query/src/kuery/ast/ast.test.ts +++ b/packages/kbn-es-query/src/kuery/ast/ast.test.ts @@ -371,7 +371,7 @@ describe('kuery AST API', () => { indexPattern ); - expect(toElasticsearchQuery((null as unknown) as KueryNode, undefined)).toEqual(expected); + expect(toElasticsearchQuery(null as unknown as KueryNode, undefined)).toEqual(expected); const noTypeNode = nodeTypes.function.buildNode('exists', 'foo'); diff --git a/packages/kbn-es-query/src/kuery/ast/ast.ts b/packages/kbn-es-query/src/kuery/ast/ast.ts index 7145eb5043c60..c1b4380ecbfe3 100644 --- a/packages/kbn-es-query/src/kuery/ast/ast.ts +++ b/packages/kbn-es-query/src/kuery/ast/ast.ts @@ -75,6 +75,6 @@ export const toElasticsearchQuery = ( } // TODO: the return type of this function might be incorrect and it works only because of this casting - const nodeType = (nodeTypes[node.type] as unknown) as any; + const nodeType = nodeTypes[node.type] as unknown as any; return nodeType.toElasticsearchQuery(node, indexPattern, config, context); }; diff --git a/packages/kbn-es-query/src/kuery/functions/is.ts b/packages/kbn-es-query/src/kuery/functions/is.ts index 4dc0a66d3d9fa..596dd91df22b3 100644 --- a/packages/kbn-es-query/src/kuery/functions/is.ts +++ b/packages/kbn-es-query/src/kuery/functions/is.ts @@ -76,7 +76,7 @@ export function toElasticsearchQuery( return { multi_match: { type, - query: (value as unknown) as string, + query: value as unknown as string, lenient: true, }, }; @@ -90,7 +90,7 @@ export function toElasticsearchQuery( // keep things familiar for now. if (fields && fields.length === 0) { fields.push({ - name: (ast.toElasticsearchQuery(fullFieldNameArg) as unknown) as string, + name: ast.toElasticsearchQuery(fullFieldNameArg) as unknown as string, scripted: false, type: '', }); diff --git a/packages/kbn-es-query/src/kuery/functions/nested.ts b/packages/kbn-es-query/src/kuery/functions/nested.ts index 3a3be4c10eade..e59f7a6acc07d 100644 --- a/packages/kbn-es-query/src/kuery/functions/nested.ts +++ b/packages/kbn-es-query/src/kuery/functions/nested.ts @@ -26,7 +26,7 @@ export function toElasticsearchQuery( context: Record = {} ): estypes.QueryDslQueryContainer { const [path, child] = node.arguments; - const stringPath = (ast.toElasticsearchQuery(path) as unknown) as string; + const stringPath = ast.toElasticsearchQuery(path) as unknown as string; const fullPath = context?.nested?.path ? `${context.nested.path}.${stringPath}` : stringPath; return { diff --git a/packages/kbn-es-query/src/kuery/functions/range.ts b/packages/kbn-es-query/src/kuery/functions/range.ts index 6b5810bb7518f..51f686925518d 100644 --- a/packages/kbn-es-query/src/kuery/functions/range.ts +++ b/packages/kbn-es-query/src/kuery/functions/range.ts @@ -57,7 +57,7 @@ export function toElasticsearchQuery( // keep things familiar for now. if (fields && fields.length === 0) { fields.push({ - name: (ast.toElasticsearchQuery(fullFieldNameArg) as unknown) as string, + name: ast.toElasticsearchQuery(fullFieldNameArg) as unknown as string, scripted: false, type: '', }); diff --git a/packages/kbn-es-query/src/kuery/functions/utils/get_fields.test.ts b/packages/kbn-es-query/src/kuery/functions/utils/get_fields.test.ts index 4125b0a572566..2a63614fadd04 100644 --- a/packages/kbn-es-query/src/kuery/functions/utils/get_fields.test.ts +++ b/packages/kbn-es-query/src/kuery/functions/utils/get_fields.test.ts @@ -18,9 +18,9 @@ describe('getFields', () => { let indexPattern: IndexPatternBase; beforeEach(() => { - indexPattern = ({ + indexPattern = { fields, - } as unknown) as IndexPatternBase; + } as unknown as IndexPatternBase; }); describe('field names without a wildcard', () => { @@ -41,14 +41,14 @@ describe('getFields', () => { }); test('should not match a wildcard in a literal node', () => { - const indexPatternWithWildField: IndexPatternBase = ({ + const indexPatternWithWildField: IndexPatternBase = { title: 'wildIndex', fields: [ { name: 'foo*', }, ], - } as unknown) as IndexPatternBase; + } as unknown as IndexPatternBase; const fieldNameNode = nodeTypes.literal.buildNode('foo*'); const results = getFields(fieldNameNode, indexPatternWithWildField); diff --git a/packages/kbn-i18n/src/core/pseudo_locale.ts b/packages/kbn-i18n/src/core/pseudo_locale.ts index daa1b76391f76..10fd086169b6c 100644 --- a/packages/kbn-i18n/src/core/pseudo_locale.ts +++ b/packages/kbn-i18n/src/core/pseudo_locale.ts @@ -9,7 +9,8 @@ /** * Matches every single [A-Za-z] character, ``, `](markdown-link-address)` and `@I18N@valid_variable_name@I18N@` */ -const CHARS_FOR_PSEUDO_LOCALIZATION_REGEX = /[A-Za-z]|(\]\([\s\S]*?\))|(<([^"<>]|("[^"]*?"))*?>)|(@I18N@\w*?@I18N@)/g; +const CHARS_FOR_PSEUDO_LOCALIZATION_REGEX = + /[A-Za-z]|(\]\([\s\S]*?\))|(<([^"<>]|("[^"]*?"))*?>)|(@I18N@\w*?@I18N@)/g; const PSEUDO_ACCENTS_LOCALE = 'en-xa'; export function isPseudoLocale(locale: string) { diff --git a/packages/kbn-io-ts-utils/src/merge_rt/index.ts b/packages/kbn-io-ts-utils/src/merge_rt/index.ts index c582767fb5101..b2c3ea03938d8 100644 --- a/packages/kbn-io-ts-utils/src/merge_rt/index.ts +++ b/packages/kbn-io-ts-utils/src/merge_rt/index.ts @@ -14,10 +14,9 @@ type PlainObject = Record; type DeepMerge = U extends PlainObject ? T extends PlainObject - ? Omit & - { - [key in keyof U]: T extends { [k in key]: any } ? DeepMerge : U[key]; - } + ? Omit & { + [key in keyof U]: T extends { [k in key]: any } ? DeepMerge : U[key]; + } : U : U; diff --git a/packages/kbn-legacy-logging/src/legacy_logging_server.ts b/packages/kbn-legacy-logging/src/legacy_logging_server.ts index 3ece0f6f1ee47..c02eb2803515a 100644 --- a/packages/kbn-legacy-logging/src/legacy_logging_server.ts +++ b/packages/kbn-legacy-logging/src/legacy_logging_server.ts @@ -96,7 +96,7 @@ export class LegacyLoggingServer { }, }); - setupLogging((this as unknown) as Server, loggingConfig, 2147483647); + setupLogging(this as unknown as Server, loggingConfig, 2147483647); } public register({ plugin: { register }, options }: PluginRegisterParams): Promise { diff --git a/packages/kbn-optimizer/src/common/array_helpers.ts b/packages/kbn-optimizer/src/common/array_helpers.ts index b486f1a14c971..1dbce46f2e8a7 100644 --- a/packages/kbn-optimizer/src/common/array_helpers.ts +++ b/packages/kbn-optimizer/src/common/array_helpers.ts @@ -22,28 +22,30 @@ type Comparator = (a: T, b: T) => number; * - If the values for a getter are equal the next getter is * used to compare the items. */ -export const ascending = (...getters: Array>): Comparator => (a, b) => { - for (const getter of getters) { - const valA = getter(a); - const valB = getter(b); +export const ascending = + (...getters: Array>): Comparator => + (a, b) => { + for (const getter of getters) { + const valA = getter(a); + const valB = getter(b); - if (valA === valB) { - continue; - } - if (valA === undefined) { - return -1; - } - if (valB === undefined) { - return 1; - } + if (valA === valB) { + continue; + } + if (valA === undefined) { + return -1; + } + if (valB === undefined) { + return 1; + } - return typeof valA === 'string' || typeof valB === 'string' - ? String(valA).localeCompare(String(valB)) - : valA - valB; - } + return typeof valA === 'string' || typeof valB === 'string' + ? String(valA).localeCompare(String(valB)) + : valA - valB; + } - return 0; -}; + return 0; + }; /** * create a sort comparator that sorts values in descending diff --git a/packages/kbn-optimizer/src/common/bundle.ts b/packages/kbn-optimizer/src/common/bundle.ts index 08946deec0b47..7feaa960b79e7 100644 --- a/packages/kbn-optimizer/src/common/bundle.ts +++ b/packages/kbn-optimizer/src/common/bundle.ts @@ -179,76 +179,74 @@ export function parseBundles(json: string) { throw new Error('must be an array'); } - return specs.map( - (spec: UnknownVals): Bundle => { - if (!(spec && typeof spec === 'object')) { - throw new Error('`bundles[]` must be an object'); - } + return specs.map((spec: UnknownVals): Bundle => { + if (!(spec && typeof spec === 'object')) { + throw new Error('`bundles[]` must be an object'); + } - const { type } = spec; - if (!includes(VALID_BUNDLE_TYPES, type)) { - throw new Error('`bundles[]` must have a valid `type`'); - } + const { type } = spec; + if (!includes(VALID_BUNDLE_TYPES, type)) { + throw new Error('`bundles[]` must have a valid `type`'); + } - const { id } = spec; - if (!(typeof id === 'string')) { - throw new Error('`bundles[]` must have a string `id` property'); - } + const { id } = spec; + if (!(typeof id === 'string')) { + throw new Error('`bundles[]` must have a string `id` property'); + } - const { publicDirNames } = spec; - if (!Array.isArray(publicDirNames) || !publicDirNames.every((d) => typeof d === 'string')) { - throw new Error('`bundles[]` must have an array of strings `publicDirNames` property'); - } + const { publicDirNames } = spec; + if (!Array.isArray(publicDirNames) || !publicDirNames.every((d) => typeof d === 'string')) { + throw new Error('`bundles[]` must have an array of strings `publicDirNames` property'); + } - const { contextDir } = spec; - if (!(typeof contextDir === 'string' && Path.isAbsolute(contextDir))) { - throw new Error('`bundles[]` must have an absolute path `contextDir` property'); - } + const { contextDir } = spec; + if (!(typeof contextDir === 'string' && Path.isAbsolute(contextDir))) { + throw new Error('`bundles[]` must have an absolute path `contextDir` property'); + } - const { sourceRoot } = spec; - if (!(typeof sourceRoot === 'string' && Path.isAbsolute(sourceRoot))) { - throw new Error('`bundles[]` must have an absolute path `sourceRoot` property'); - } + const { sourceRoot } = spec; + if (!(typeof sourceRoot === 'string' && Path.isAbsolute(sourceRoot))) { + throw new Error('`bundles[]` must have an absolute path `sourceRoot` property'); + } - const { outputDir } = spec; - if (!(typeof outputDir === 'string' && Path.isAbsolute(outputDir))) { - throw new Error('`bundles[]` must have an absolute path `outputDir` property'); - } + const { outputDir } = spec; + if (!(typeof outputDir === 'string' && Path.isAbsolute(outputDir))) { + throw new Error('`bundles[]` must have an absolute path `outputDir` property'); + } - const { manifestPath } = spec; - if (manifestPath !== undefined) { - if (!(typeof manifestPath === 'string' && Path.isAbsolute(manifestPath))) { - throw new Error('`bundles[]` must have an absolute path `manifestPath` property'); - } + const { manifestPath } = spec; + if (manifestPath !== undefined) { + if (!(typeof manifestPath === 'string' && Path.isAbsolute(manifestPath))) { + throw new Error('`bundles[]` must have an absolute path `manifestPath` property'); } + } - const { banner } = spec; - if (banner !== undefined) { - if (!(typeof banner === 'string')) { - throw new Error('`bundles[]` must have a string `banner` property'); - } + const { banner } = spec; + if (banner !== undefined) { + if (!(typeof banner === 'string')) { + throw new Error('`bundles[]` must have a string `banner` property'); } + } - const { pageLoadAssetSizeLimit } = spec; - if (pageLoadAssetSizeLimit !== undefined) { - if (!(typeof pageLoadAssetSizeLimit === 'number')) { - throw new Error('`bundles[]` must have a numeric `pageLoadAssetSizeLimit` property'); - } + const { pageLoadAssetSizeLimit } = spec; + if (pageLoadAssetSizeLimit !== undefined) { + if (!(typeof pageLoadAssetSizeLimit === 'number')) { + throw new Error('`bundles[]` must have a numeric `pageLoadAssetSizeLimit` property'); } - - return new Bundle({ - type, - id, - publicDirNames, - contextDir, - sourceRoot, - outputDir, - banner, - manifestPath, - pageLoadAssetSizeLimit, - }); } - ); + + return new Bundle({ + type, + id, + publicDirNames, + contextDir, + sourceRoot, + outputDir, + banner, + manifestPath, + pageLoadAssetSizeLimit, + }); + }); } catch (error) { throw new Error(`unable to parse bundles: ${error.message}`); } diff --git a/packages/kbn-optimizer/src/common/bundle_refs.ts b/packages/kbn-optimizer/src/common/bundle_refs.ts index 91fc21780930e..49628fcf05588 100644 --- a/packages/kbn-optimizer/src/common/bundle_refs.ts +++ b/packages/kbn-optimizer/src/common/bundle_refs.ts @@ -58,46 +58,44 @@ export class BundleRefs { } return new BundleRefs( - spec.map( - (refSpec: UnknownVals): BundleRef => { - if (typeof refSpec !== 'object' || !refSpec) { - throw new Error('`bundleRefs[]` must be an object'); - } - - const { bundleId } = refSpec; - if (typeof bundleId !== 'string') { - throw new Error('`bundleRefs[].bundleId` must be a string'); - } - - const { contextDir } = refSpec; - if (typeof contextDir !== 'string' || !Path.isAbsolute(contextDir)) { - throw new Error('`bundleRefs[].contextDir` must be an absolute directory'); - } - - const { contextPrefix } = refSpec; - if (typeof contextPrefix !== 'string' || !Path.isAbsolute(contextPrefix)) { - throw new Error('`bundleRefs[].contextPrefix` must be an absolute directory'); - } - - const { entry } = refSpec; - if (typeof entry !== 'string') { - throw new Error('`bundleRefs[].entry` must be a string'); - } - - const { exportId } = refSpec; - if (typeof exportId !== 'string') { - throw new Error('`bundleRefs[].exportId` must be a string'); - } - - return { - bundleId, - contextDir, - contextPrefix, - entry, - exportId, - }; + spec.map((refSpec: UnknownVals): BundleRef => { + if (typeof refSpec !== 'object' || !refSpec) { + throw new Error('`bundleRefs[]` must be an object'); } - ) + + const { bundleId } = refSpec; + if (typeof bundleId !== 'string') { + throw new Error('`bundleRefs[].bundleId` must be a string'); + } + + const { contextDir } = refSpec; + if (typeof contextDir !== 'string' || !Path.isAbsolute(contextDir)) { + throw new Error('`bundleRefs[].contextDir` must be an absolute directory'); + } + + const { contextPrefix } = refSpec; + if (typeof contextPrefix !== 'string' || !Path.isAbsolute(contextPrefix)) { + throw new Error('`bundleRefs[].contextPrefix` must be an absolute directory'); + } + + const { entry } = refSpec; + if (typeof entry !== 'string') { + throw new Error('`bundleRefs[].entry` must be a string'); + } + + const { exportId } = refSpec; + if (typeof exportId !== 'string') { + throw new Error('`bundleRefs[].exportId` must be a string'); + } + + return { + bundleId, + contextDir, + contextPrefix, + entry, + exportId, + }; + }) ); } diff --git a/packages/kbn-optimizer/src/integration_tests/watch_bundles_for_changes.test.ts b/packages/kbn-optimizer/src/integration_tests/watch_bundles_for_changes.test.ts index 5bfca96d9679d..2c5668766ed5e 100644 --- a/packages/kbn-optimizer/src/integration_tests/watch_bundles_for_changes.test.ts +++ b/packages/kbn-optimizer/src/integration_tests/watch_bundles_for_changes.test.ts @@ -109,7 +109,7 @@ it('notifies of changes and completes once all bundles have changed', async () = ); expect(MockWatchPack.mock.instances).toHaveLength(1); - const [watcher] = (MockWatchPack.mock.instances as any) as Array>; + const [watcher] = MockWatchPack.mock.instances as any as Array>; expect(watcher.on).toHaveBeenCalledTimes(1); expect(watcher.on).toHaveBeenCalledWith('change', expect.any(Function)); const [, changeListener] = watcher.on.mock.calls[0]; diff --git a/packages/kbn-optimizer/src/optimizer/optimizer_config.test.ts b/packages/kbn-optimizer/src/optimizer/optimizer_config.test.ts index 39a7e0ab0e622..dff389f2e0de2 100644 --- a/packages/kbn-optimizer/src/optimizer/optimizer_config.test.ts +++ b/packages/kbn-optimizer/src/optimizer/optimizer_config.test.ts @@ -380,10 +380,12 @@ describe('OptimizerConfig::parseOptions()', () => { * and just making sure that the arguments are coming from where we expect */ describe('OptimizerConfig::create()', () => { - const assignBundlesToWorkers: jest.Mock = jest.requireMock('./assign_bundles_to_workers.ts') - .assignBundlesToWorkers; - const findKibanaPlatformPlugins: jest.Mock = jest.requireMock('./kibana_platform_plugins.ts') - .findKibanaPlatformPlugins; + const assignBundlesToWorkers: jest.Mock = jest.requireMock( + './assign_bundles_to_workers.ts' + ).assignBundlesToWorkers; + const findKibanaPlatformPlugins: jest.Mock = jest.requireMock( + './kibana_platform_plugins.ts' + ).findKibanaPlatformPlugins; const getPluginBundles: jest.Mock = jest.requireMock('./get_plugin_bundles.ts').getPluginBundles; const filterById: jest.Mock = jest.requireMock('./filter_by_id.ts').filterById; const focusBundles: jest.Mock = jest.requireMock('./focus_bundles').focusBundles; @@ -404,24 +406,26 @@ describe('OptimizerConfig::create()', () => { focusBundles.mockReturnValue(Symbol('focused bundles')); readLimits.mockReturnValue(Symbol('limits')); - jest.spyOn(OptimizerConfig, 'parseOptions').mockImplementation((): { - [key in keyof ParsedOptions]: any; - } => ({ - cache: Symbol('parsed cache'), - dist: Symbol('parsed dist'), - maxWorkerCount: Symbol('parsed max worker count'), - pluginPaths: Symbol('parsed plugin paths'), - pluginScanDirs: Symbol('parsed plugin scan dirs'), - repoRoot: Symbol('parsed repo root'), - outputRoot: Symbol('parsed output root'), - watch: Symbol('parsed watch'), - themeTags: Symbol('theme tags'), - inspectWorkers: Symbol('parsed inspect workers'), - profileWebpack: Symbol('parsed profile webpack'), - filters: [], - focus: [], - includeCoreBundle: false, - })); + jest.spyOn(OptimizerConfig, 'parseOptions').mockImplementation( + (): { + [key in keyof ParsedOptions]: any; + } => ({ + cache: Symbol('parsed cache'), + dist: Symbol('parsed dist'), + maxWorkerCount: Symbol('parsed max worker count'), + pluginPaths: Symbol('parsed plugin paths'), + pluginScanDirs: Symbol('parsed plugin scan dirs'), + repoRoot: Symbol('parsed repo root'), + outputRoot: Symbol('parsed output root'), + watch: Symbol('parsed watch'), + themeTags: Symbol('theme tags'), + inspectWorkers: Symbol('parsed inspect workers'), + profileWebpack: Symbol('parsed profile webpack'), + filters: [], + focus: [], + includeCoreBundle: false, + }) + ); }); it('passes parsed options to findKibanaPlatformPlugins, getBundles, and assignBundlesToWorkers', () => { diff --git a/packages/kbn-optimizer/src/worker/bundle_refs_plugin.ts b/packages/kbn-optimizer/src/worker/bundle_refs_plugin.ts index 5396d11726f7a..18b219336a92d 100644 --- a/packages/kbn-optimizer/src/worker/bundle_refs_plugin.ts +++ b/packages/kbn-optimizer/src/worker/bundle_refs_plugin.ts @@ -65,21 +65,22 @@ export class BundleRefsPlugin { // entry then create a BundleRefModule instead of a NormalModule. compilationParams.normalModuleFactory.hooks.factory.tap( 'BundleRefsPlugin/normalModuleFactory/factory', - (wrappedFactory: ModuleFactory): ModuleFactory => (data, callback) => { - const context = data.context; - const dep = data.dependencies[0]; - - this.maybeReplaceImport(context, dep.request).then( - (module) => { - if (!module) { - wrappedFactory(data, callback); - } else { - callback(undefined, module); - } - }, - (error) => callback(error) - ); - } + (wrappedFactory: ModuleFactory): ModuleFactory => + (data, callback) => { + const context = data.context; + const dep = data.dependencies[0]; + + this.maybeReplaceImport(context, dep.request).then( + (module) => { + if (!module) { + wrappedFactory(data, callback); + } else { + callback(undefined, module); + } + }, + (error) => callback(error) + ); + } ); }); diff --git a/packages/kbn-securitysolution-autocomplete/src/field/index.test.tsx b/packages/kbn-securitysolution-autocomplete/src/field/index.test.tsx index 08f55cef89b66..626c791315c3e 100644 --- a/packages/kbn-securitysolution-autocomplete/src/field/index.test.tsx +++ b/packages/kbn-securitysolution-autocomplete/src/field/index.test.tsx @@ -123,9 +123,11 @@ describe('field', () => { /> ); - ((wrapper.find(EuiComboBox).props() as unknown) as { - onChange: (a: EuiComboBoxOptionOption[]) => void; - }).onChange([{ label: 'machine.os' }]); + ( + wrapper.find(EuiComboBox).props() as unknown as { + onChange: (a: EuiComboBoxOptionOption[]) => void; + } + ).onChange([{ label: 'machine.os' }]); expect(mockOnChange).toHaveBeenCalledWith([ { diff --git a/packages/kbn-securitysolution-autocomplete/src/field_value_lists/index.test.tsx b/packages/kbn-securitysolution-autocomplete/src/field_value_lists/index.test.tsx index 6fcf8ddf74b03..941eaf5322000 100644 --- a/packages/kbn-securitysolution-autocomplete/src/field_value_lists/index.test.tsx +++ b/packages/kbn-securitysolution-autocomplete/src/field_value_lists/index.test.tsx @@ -202,9 +202,11 @@ describe('AutocompleteFieldListsComponent', () => { /> ); - ((wrapper.find(EuiComboBox).props() as unknown) as { - onChange: (a: EuiComboBoxOptionOption[]) => void; - }).onChange([{ label: 'some name' }]); + ( + wrapper.find(EuiComboBox).props() as unknown as { + onChange: (a: EuiComboBoxOptionOption[]) => void; + } + ).onChange([{ label: 'some name' }]); await waitFor(() => { expect(mockOnChange).toHaveBeenCalledWith({ diff --git a/packages/kbn-securitysolution-autocomplete/src/field_value_lists/index.tsx b/packages/kbn-securitysolution-autocomplete/src/field_value_lists/index.tsx index 093643c3a5469..cef46b9bcaa21 100644 --- a/packages/kbn-securitysolution-autocomplete/src/field_value_lists/index.tsx +++ b/packages/kbn-securitysolution-autocomplete/src/field_value_lists/index.tsx @@ -51,10 +51,10 @@ export const AutocompleteFieldListsComponent: React.FC name, []); - const optionsMemo = useMemo(() => filterFieldToList(lists, selectedField), [ - lists, - selectedField, - ]); + const optionsMemo = useMemo( + () => filterFieldToList(lists, selectedField), + [lists, selectedField] + ); const selectedOptionsMemo = useMemo(() => { if (selectedValue != null) { const list = lists.filter(({ id }) => id === selectedValue); diff --git a/packages/kbn-securitysolution-autocomplete/src/field_value_match/index.test.tsx b/packages/kbn-securitysolution-autocomplete/src/field_value_match/index.test.tsx index c0690774965c3..195259b89eb63 100644 --- a/packages/kbn-securitysolution-autocomplete/src/field_value_match/index.test.tsx +++ b/packages/kbn-securitysolution-autocomplete/src/field_value_match/index.test.tsx @@ -188,9 +188,11 @@ describe('AutocompleteFieldMatchComponent', () => { /> ); - ((wrapper.find(EuiComboBox).props() as unknown) as { - onCreateOption: (a: string) => void; - }).onCreateOption('127.0.0.1'); + ( + wrapper.find(EuiComboBox).props() as unknown as { + onCreateOption: (a: string) => void; + } + ).onCreateOption('127.0.0.1'); expect(mockOnChange).toHaveBeenCalledWith('127.0.0.1'); }); @@ -216,9 +218,11 @@ describe('AutocompleteFieldMatchComponent', () => { /> ); - ((wrapper.find(EuiComboBox).props() as unknown) as { - onChange: (a: EuiComboBoxOptionOption[]) => void; - }).onChange([{ label: 'value 1' }]); + ( + wrapper.find(EuiComboBox).props() as unknown as { + onChange: (a: EuiComboBoxOptionOption[]) => void; + } + ).onChange([{ label: 'value 1' }]); expect(mockOnChange).toHaveBeenCalledWith('value 1'); }); @@ -243,9 +247,11 @@ describe('AutocompleteFieldMatchComponent', () => { /> ); act(() => { - ((wrapper.find(EuiComboBox).props() as unknown) as { - onSearchChange: (a: string) => void; - }).onSearchChange('value 1'); + ( + wrapper.find(EuiComboBox).props() as unknown as { + onSearchChange: (a: string) => void; + } + ).onSearchChange('value 1'); }); expect(useFieldValueAutocomplete).toHaveBeenCalledWith({ @@ -331,9 +337,11 @@ describe('AutocompleteFieldMatchComponent', () => { /> ); - ((wrapper.find(EuiSuperSelect).props() as unknown) as { - onChange: (a: string) => void; - }).onChange('true'); + ( + wrapper.find(EuiSuperSelect).props() as unknown as { + onChange: (a: string) => void; + } + ).onChange('true'); expect(mockOnChange).toHaveBeenCalledWith('true'); }); @@ -359,9 +367,11 @@ describe('AutocompleteFieldMatchComponent', () => { /> ); - ((wrapper.find(EuiSuperSelect).props() as unknown) as { - onChange: (a: string) => void; - }).onChange('false'); + ( + wrapper.find(EuiSuperSelect).props() as unknown as { + onChange: (a: string) => void; + } + ).onChange('false'); expect(mockOnChange).toHaveBeenCalledWith('false'); }); diff --git a/packages/kbn-securitysolution-autocomplete/src/field_value_match/index.tsx b/packages/kbn-securitysolution-autocomplete/src/field_value_match/index.tsx index 9088517adbe58..b45d508ffdb20 100644 --- a/packages/kbn-securitysolution-autocomplete/src/field_value_match/index.tsx +++ b/packages/kbn-securitysolution-autocomplete/src/field_value_match/index.tsx @@ -187,10 +187,10 @@ export const AutocompleteFieldMatchComponent: React.FC isLoading || isLoadingSuggestions, [ - isLoading, - isLoadingSuggestions, - ]); + const isLoadingState = useMemo( + (): boolean => isLoading || isLoadingSuggestions, + [isLoading, isLoadingSuggestions] + ); useEffect((): void => { setError(undefined); diff --git a/packages/kbn-securitysolution-autocomplete/src/field_value_match_any/index.test.tsx b/packages/kbn-securitysolution-autocomplete/src/field_value_match_any/index.test.tsx index 389761c9a6dfc..3246e0febede2 100644 --- a/packages/kbn-securitysolution-autocomplete/src/field_value_match_any/index.test.tsx +++ b/packages/kbn-securitysolution-autocomplete/src/field_value_match_any/index.test.tsx @@ -189,9 +189,11 @@ describe('AutocompleteFieldMatchAnyComponent', () => { /> ); - ((wrapper.find(EuiComboBox).props() as unknown) as { - onCreateOption: (a: string) => void; - }).onCreateOption('127.0.0.1'); + ( + wrapper.find(EuiComboBox).props() as unknown as { + onCreateOption: (a: string) => void; + } + ).onCreateOption('127.0.0.1'); expect(mockOnChange).toHaveBeenCalledWith(['127.0.0.1']); }); @@ -221,9 +223,11 @@ describe('AutocompleteFieldMatchAnyComponent', () => { /> ); - ((wrapper.find(EuiComboBox).props() as unknown) as { - onChange: (a: EuiComboBoxOptionOption[]) => void; - }).onChange([{ label: 'value 1' }]); + ( + wrapper.find(EuiComboBox).props() as unknown as { + onChange: (a: EuiComboBoxOptionOption[]) => void; + } + ).onChange([{ label: 'value 1' }]); expect(mockOnChange).toHaveBeenCalledWith(['value 1']); }); @@ -250,9 +254,11 @@ describe('AutocompleteFieldMatchAnyComponent', () => { /> ); act(() => { - ((wrapper.find(EuiComboBox).props() as unknown) as { - onSearchChange: (a: string) => void; - }).onSearchChange('value 1'); + ( + wrapper.find(EuiComboBox).props() as unknown as { + onSearchChange: (a: string) => void; + } + ).onSearchChange('value 1'); }); expect(useFieldValueAutocomplete).toHaveBeenCalledWith({ autocompleteService: autocompleteStartMock, diff --git a/packages/kbn-securitysolution-autocomplete/src/field_value_match_any/index.tsx b/packages/kbn-securitysolution-autocomplete/src/field_value_match_any/index.tsx index bfcafd199dc32..8aa8d6ad5ff70 100644 --- a/packages/kbn-securitysolution-autocomplete/src/field_value_match_any/index.tsx +++ b/packages/kbn-securitysolution-autocomplete/src/field_value_match_any/index.tsx @@ -145,10 +145,10 @@ export const AutocompleteFieldMatchAnyComponent: React.FC isLoading || isLoadingSuggestions, [ - isLoading, - isLoadingSuggestions, - ]); + const isLoadingState = useMemo( + (): boolean => isLoading || isLoadingSuggestions, + [isLoading, isLoadingSuggestions] + ); const defaultInput = useMemo((): JSX.Element => { return ( diff --git a/packages/kbn-securitysolution-autocomplete/src/fields/index.mock.ts b/packages/kbn-securitysolution-autocomplete/src/fields/index.mock.ts index a79325e25343f..d2f74a17561a4 100644 --- a/packages/kbn-securitysolution-autocomplete/src/fields/index.mock.ts +++ b/packages/kbn-securitysolution-autocomplete/src/fields/index.mock.ts @@ -11,7 +11,7 @@ import { IndexPatternFieldBase } from '@kbn/es-query'; // Copied from "src/plugins/data/common/index_patterns/fields/fields.mocks.ts" but with the types changed to "IndexPatternFieldBase" since that type is compatible. // TODO: This should move out once those mocks are directly useable or in their own package, https://github.com/elastic/kibana/issues/100715 -export const fields: IndexPatternFieldBase[] = ([ +export const fields: IndexPatternFieldBase[] = [ { name: 'bytes', type: 'number', @@ -309,6 +309,6 @@ export const fields: IndexPatternFieldBase[] = ([ readFromDocValues: false, subType: { nested: { path: 'nestedField.nestedChild' } }, }, -] as unknown) as IndexPatternFieldBase[]; +] as unknown as IndexPatternFieldBase[]; export const getField = (name: string) => fields.find((field) => field.name === name); diff --git a/packages/kbn-securitysolution-autocomplete/src/operator/index.test.tsx b/packages/kbn-securitysolution-autocomplete/src/operator/index.test.tsx index e2af384215c25..6d1622f0fa95f 100644 --- a/packages/kbn-securitysolution-autocomplete/src/operator/index.test.tsx +++ b/packages/kbn-securitysolution-autocomplete/src/operator/index.test.tsx @@ -210,9 +210,11 @@ describe('operator', () => { /> ); - ((wrapper.find(EuiComboBox).props() as unknown) as { - onChange: (a: EuiComboBoxOptionOption[]) => void; - }).onChange([{ label: 'is not' }]); + ( + wrapper.find(EuiComboBox).props() as unknown as { + onChange: (a: EuiComboBoxOptionOption[]) => void; + } + ).onChange([{ label: 'is not' }]); expect(mockOnChange).toHaveBeenCalledWith([ { message: 'is not', operator: 'excluded', type: 'match', value: 'is_not' }, diff --git a/packages/kbn-securitysolution-autocomplete/src/operator/index.tsx b/packages/kbn-securitysolution-autocomplete/src/operator/index.tsx index dc12de7c398c3..c791ef4ccb91f 100644 --- a/packages/kbn-securitysolution-autocomplete/src/operator/index.tsx +++ b/packages/kbn-securitysolution-autocomplete/src/operator/index.tsx @@ -50,9 +50,10 @@ export const OperatorComponent: React.FC = ({ : getOperators(selectedField), [operatorOptions, selectedField] ); - const selectedOptionsMemo = useMemo((): OperatorOption[] => (operator ? [operator] : []), [ - operator, - ]); + const selectedOptionsMemo = useMemo( + (): OperatorOption[] => (operator ? [operator] : []), + [operator] + ); const { comboOptions, labels, selectedComboOptions } = useMemo( (): GetGenericComboBoxPropsReturn => getGenericComboBoxProps({ diff --git a/packages/kbn-securitysolution-autocomplete/src/param_is_valid/index.test.ts b/packages/kbn-securitysolution-autocomplete/src/param_is_valid/index.test.ts index c3c9702823ecb..a35ed9d85122f 100644 --- a/packages/kbn-securitysolution-autocomplete/src/param_is_valid/index.test.ts +++ b/packages/kbn-securitysolution-autocomplete/src/param_is_valid/index.test.ts @@ -15,17 +15,21 @@ describe('params_is_valid', () => { beforeEach(() => { // Disable momentJS deprecation warning and it looks like it is not typed either so // we have to disable the type as well and cannot extend it easily. - ((moment as unknown) as { - suppressDeprecationWarnings: boolean; - }).suppressDeprecationWarnings = true; + ( + moment as unknown as { + suppressDeprecationWarnings: boolean; + } + ).suppressDeprecationWarnings = true; }); afterEach(() => { // Re-enable momentJS deprecation warning and it looks like it is not typed either so // we have to disable the type as well and cannot extend it easily. - ((moment as unknown) as { - suppressDeprecationWarnings: boolean; - }).suppressDeprecationWarnings = false; + ( + moment as unknown as { + suppressDeprecationWarnings: boolean; + } + ).suppressDeprecationWarnings = false; }); test('returns no errors if no field has been selected', () => { diff --git a/packages/kbn-securitysolution-es-utils/src/encode_hit_version/index.ts b/packages/kbn-securitysolution-es-utils/src/encode_hit_version/index.ts index 29b5a18f7c303..fc44d605888dc 100644 --- a/packages/kbn-securitysolution-es-utils/src/encode_hit_version/index.ts +++ b/packages/kbn-securitysolution-es-utils/src/encode_hit_version/index.ts @@ -16,7 +16,7 @@ */ export const encodeHitVersion = (hit: T): string | undefined => { // Have to do this "as cast" here as these two types aren't included in the SearchResponse hit type - const { _seq_no: seqNo, _primary_term: primaryTerm } = (hit as unknown) as { + const { _seq_no: seqNo, _primary_term: primaryTerm } = hit as unknown as { _seq_no: number; _primary_term: number; }; diff --git a/packages/kbn-securitysolution-es-utils/src/transform_error/index.test.ts b/packages/kbn-securitysolution-es-utils/src/transform_error/index.test.ts index e0f520f1ebfd4..2b4bbf34c7c8a 100644 --- a/packages/kbn-securitysolution-es-utils/src/transform_error/index.test.ts +++ b/packages/kbn-securitysolution-es-utils/src/transform_error/index.test.ts @@ -88,7 +88,7 @@ describe('transformError', () => { reason: 'detailed explanation', }, }, - meta: ({} as unknown) as errors.ResponseError['meta'], + meta: {} as unknown as errors.ResponseError['meta'], statusCode: 400, }; const transformed = transformError(error); diff --git a/packages/kbn-securitysolution-hook-utils/src/with_optional_signal/index.ts b/packages/kbn-securitysolution-hook-utils/src/with_optional_signal/index.ts index da6fd414abc57..c4b53abfa88f4 100644 --- a/packages/kbn-securitysolution-hook-utils/src/with_optional_signal/index.ts +++ b/packages/kbn-securitysolution-hook-utils/src/with_optional_signal/index.ts @@ -18,9 +18,9 @@ export type OptionalSignalArgs = Omit & Partial(fn: (args: Args) => Result) => ( - args: OptionalSignalArgs -): Result => { - const signal = args.signal != null ? args.signal : new AbortController().signal; - return fn({ ...args, signal } as Args); -}; +export const withOptionalSignal = + (fn: (args: Args) => Result) => + (args: OptionalSignalArgs): Result => { + const signal = args.signal != null ? args.signal : new AbortController().signal; + return fn({ ...args, signal } as Args); + }; diff --git a/packages/kbn-securitysolution-io-ts-alerting-types/src/threat_mapping/index.test.ts b/packages/kbn-securitysolution-io-ts-alerting-types/src/threat_mapping/index.test.ts index 16fd1647e5bfc..6e2e671dbb029 100644 --- a/packages/kbn-securitysolution-io-ts-alerting-types/src/threat_mapping/index.test.ts +++ b/packages/kbn-securitysolution-io-ts-alerting-types/src/threat_mapping/index.test.ts @@ -54,13 +54,13 @@ describe('threat_mapping', () => { }); test('it should fail validation with a non string', () => { - const payload = ([ + const payload = [ { field: 5, type: 'mapping', value: 'field.one', }, - ] as unknown) as ThreatMappingEntries[]; + ] as unknown as ThreatMappingEntries[]; const decoded = threatMappingEntries.decode(payload); const checked = exactCheck(payload, decoded); const message = pipe(checked, foldLeftRight); @@ -70,13 +70,13 @@ describe('threat_mapping', () => { }); test('it should fail validation with a wrong type', () => { - const payload = ([ + const payload = [ { field: 'field.one', type: 'invalid', value: 'field.one', }, - ] as unknown) as ThreatMappingEntries[]; + ] as unknown as ThreatMappingEntries[]; const decoded = threatMappingEntries.decode(payload); const checked = exactCheck(payload, decoded); const message = pipe(checked, foldLeftRight); @@ -155,7 +155,7 @@ describe('threat_mapping', () => { }); test('it should fail validate with an extra inner entry with the wrong data type', () => { - const payload = ([ + const payload = [ { entries: [ { @@ -165,7 +165,7 @@ describe('threat_mapping', () => { }, ], }, - ] as unknown) as ThreatMapping; + ] as unknown as ThreatMapping; const decoded = threat_mapping.decode(payload); const checked = exactCheck(payload, decoded); diff --git a/packages/kbn-securitysolution-io-ts-list-types/src/common/comment/index.test.ts b/packages/kbn-securitysolution-io-ts-list-types/src/common/comment/index.test.ts index 4af9be0a7f0e6..1272eeed6ee1e 100644 --- a/packages/kbn-securitysolution-io-ts-list-types/src/common/comment/index.test.ts +++ b/packages/kbn-securitysolution-io-ts-list-types/src/common/comment/index.test.ts @@ -193,7 +193,7 @@ describe('Comment', () => { }); test('it fails validation when array includes non Comment types', () => { - const payload = ([1] as unknown) as CommentsArray; + const payload = [1] as unknown as CommentsArray; const decoded = commentsArray.decode(payload); const message = pipe(decoded, foldLeftRight); @@ -224,7 +224,7 @@ describe('Comment', () => { }); test('it fails validation when array includes non Comment types', () => { - const payload = ([1] as unknown) as CommentsArrayOrUndefined; + const payload = [1] as unknown as CommentsArrayOrUndefined; const decoded = commentsArray.decode(payload); const message = pipe(decoded, foldLeftRight); diff --git a/packages/kbn-securitysolution-io-ts-list-types/src/common/create_comment/index.test.ts b/packages/kbn-securitysolution-io-ts-list-types/src/common/create_comment/index.test.ts index 3baf0054221db..1f5aa2118be40 100644 --- a/packages/kbn-securitysolution-io-ts-list-types/src/common/create_comment/index.test.ts +++ b/packages/kbn-securitysolution-io-ts-list-types/src/common/create_comment/index.test.ts @@ -90,7 +90,7 @@ describe('CreateComment', () => { }); test('it fails validation when array includes non comments types', () => { - const payload = ([1] as unknown) as CreateCommentsArray; + const payload = [1] as unknown as CreateCommentsArray; const decoded = createCommentsArray.decode(payload); const message = pipe(decoded, foldLeftRight); @@ -121,7 +121,7 @@ describe('CreateComment', () => { }); test('it fails validation when array includes non comments types', () => { - const payload = ([1] as unknown) as CreateCommentsArrayOrUndefined; + const payload = [1] as unknown as CreateCommentsArrayOrUndefined; const decoded = createCommentsArray.decode(payload); const message = pipe(decoded, foldLeftRight); diff --git a/packages/kbn-securitysolution-io-ts-list-types/src/common/lists/index.test.ts b/packages/kbn-securitysolution-io-ts-list-types/src/common/lists/index.test.ts index 88dcc1ced8607..83e75a924f436 100644 --- a/packages/kbn-securitysolution-io-ts-list-types/src/common/lists/index.test.ts +++ b/packages/kbn-securitysolution-io-ts-list-types/src/common/lists/index.test.ts @@ -81,7 +81,7 @@ describe('Lists', () => { }); test('it should not validate when unexpected type found in array', () => { - const payload = ([1] as unknown) as ListArray; + const payload = [1] as unknown as ListArray; const decoded = listArray.decode(payload); const message = pipe(decoded, foldLeftRight); @@ -112,7 +112,7 @@ describe('Lists', () => { }); test('it should not allow an item that is not of type "list" in array', () => { - const payload = ([1] as unknown) as ListArrayOrUndefined; + const payload = [1] as unknown as ListArrayOrUndefined; const decoded = listArrayOrUndefined.decode(payload); const message = pipe(decoded, foldLeftRight); diff --git a/packages/kbn-securitysolution-io-ts-list-types/src/common/update_comment/index.test.ts b/packages/kbn-securitysolution-io-ts-list-types/src/common/update_comment/index.test.ts index 8dd0301c54dd8..7ddbdf31ca317 100644 --- a/packages/kbn-securitysolution-io-ts-list-types/src/common/update_comment/index.test.ts +++ b/packages/kbn-securitysolution-io-ts-list-types/src/common/update_comment/index.test.ts @@ -105,7 +105,7 @@ describe('CommentsUpdate', () => { }); test('it should fail validation when array includes non comments types', () => { - const payload = ([1] as unknown) as UpdateCommentsArray; + const payload = [1] as unknown as UpdateCommentsArray; const decoded = updateCommentsArray.decode(payload); const message = pipe(decoded, foldLeftRight); @@ -136,7 +136,7 @@ describe('CommentsUpdate', () => { }); test('it should fail validation when array includes non comments types', () => { - const payload = ([1] as unknown) as UpdateCommentsArrayOrUndefined; + const payload = [1] as unknown as UpdateCommentsArrayOrUndefined; const decoded = updateCommentsArray.decode(payload); const message = pipe(decoded, foldLeftRight); diff --git a/packages/kbn-securitysolution-io-ts-list-types/src/request/create_exception_list_item_schema/index.mock.ts b/packages/kbn-securitysolution-io-ts-list-types/src/request/create_exception_list_item_schema/index.mock.ts index 4ed62887ef9ba..5b88de0c85c02 100644 --- a/packages/kbn-securitysolution-io-ts-list-types/src/request/create_exception_list_item_schema/index.mock.ts +++ b/packages/kbn-securitysolution-io-ts-list-types/src/request/create_exception_list_item_schema/index.mock.ts @@ -51,11 +51,12 @@ export const getCreateExceptionListItemMinimalSchemaMock = (): CreateExceptionLi /** * Useful for end to end testing */ -export const getCreateExceptionListItemMinimalSchemaMockWithoutId = (): CreateExceptionListItemSchema => ({ - description: DESCRIPTION, - entries: ENTRIES, - list_id: LIST_ID, - name: NAME, - os_types: OS_TYPES, - type: ITEM_TYPE, -}); +export const getCreateExceptionListItemMinimalSchemaMockWithoutId = + (): CreateExceptionListItemSchema => ({ + description: DESCRIPTION, + entries: ENTRIES, + list_id: LIST_ID, + name: NAME, + os_types: OS_TYPES, + type: ITEM_TYPE, + }); diff --git a/packages/kbn-securitysolution-io-ts-list-types/src/request/find_exception_list_item_schema/index.mock.ts b/packages/kbn-securitysolution-io-ts-list-types/src/request/find_exception_list_item_schema/index.mock.ts index f6548a2c5f4fe..8f64dccf6d577 100644 --- a/packages/kbn-securitysolution-io-ts-list-types/src/request/find_exception_list_item_schema/index.mock.ts +++ b/packages/kbn-securitysolution-io-ts-list-types/src/request/find_exception_list_item_schema/index.mock.ts @@ -30,22 +30,24 @@ export const getFindExceptionListItemSchemaMultipleMock = (): FindExceptionListI sort_order: undefined, }); -export const getFindExceptionListItemSchemaDecodedMock = (): FindExceptionListItemSchemaDecoded => ({ - filter: [FILTER], - list_id: [LIST_ID], - namespace_type: [NAMESPACE_TYPE], - page: 1, - per_page: 25, - sort_field: undefined, - sort_order: undefined, -}); +export const getFindExceptionListItemSchemaDecodedMock = + (): FindExceptionListItemSchemaDecoded => ({ + filter: [FILTER], + list_id: [LIST_ID], + namespace_type: [NAMESPACE_TYPE], + page: 1, + per_page: 25, + sort_field: undefined, + sort_order: undefined, + }); -export const getFindExceptionListItemSchemaDecodedMultipleMock = (): FindExceptionListItemSchemaDecoded => ({ - filter: ['name:Sofia Kovalevskaya', 'name:Hypatia', 'name:Sophie Germain'], - list_id: ['list-1', 'list-2', 'list-3'], - namespace_type: ['single', 'single', 'agnostic'], - page: 1, - per_page: 25, - sort_field: undefined, - sort_order: undefined, -}); +export const getFindExceptionListItemSchemaDecodedMultipleMock = + (): FindExceptionListItemSchemaDecoded => ({ + filter: ['name:Sofia Kovalevskaya', 'name:Hypatia', 'name:Sophie Germain'], + list_id: ['list-1', 'list-2', 'list-3'], + namespace_type: ['single', 'single', 'agnostic'], + page: 1, + per_page: 25, + sort_field: undefined, + sort_order: undefined, + }); diff --git a/packages/kbn-securitysolution-io-ts-list-types/src/response/exception_list_item_schema/index.mock.ts b/packages/kbn-securitysolution-io-ts-list-types/src/response/exception_list_item_schema/index.mock.ts index 2348584000475..c06a5439d11d8 100644 --- a/packages/kbn-securitysolution-io-ts-list-types/src/response/exception_list_item_schema/index.mock.ts +++ b/packages/kbn-securitysolution-io-ts-list-types/src/response/exception_list_item_schema/index.mock.ts @@ -53,17 +53,18 @@ export const getExceptionListItemSchemaMock = ( * This is useful for end to end tests where we remove the auto generated parts for comparisons * such as created_at, updated_at, and id. */ -export const getExceptionListItemResponseMockWithoutAutoGeneratedValues = (): Partial => ({ - comments: [], - created_by: ELASTIC_USER, - description: DESCRIPTION, - entries: ENTRIES, - item_id: ITEM_ID, - list_id: LIST_ID, - name: NAME, - namespace_type: 'single', - os_types: OS_TYPES, - tags: [], - type: ITEM_TYPE, - updated_by: ELASTIC_USER, -}); +export const getExceptionListItemResponseMockWithoutAutoGeneratedValues = + (): Partial => ({ + comments: [], + created_by: ELASTIC_USER, + description: DESCRIPTION, + entries: ENTRIES, + item_id: ITEM_ID, + list_id: LIST_ID, + name: NAME, + namespace_type: 'single', + os_types: OS_TYPES, + tags: [], + type: ITEM_TYPE, + updated_by: ELASTIC_USER, + }); diff --git a/packages/kbn-securitysolution-io-ts-list-types/src/response/exception_list_schema/index.mock.ts b/packages/kbn-securitysolution-io-ts-list-types/src/response/exception_list_schema/index.mock.ts index c77fb35a40b60..c73b5a55d0c2c 100644 --- a/packages/kbn-securitysolution-io-ts-list-types/src/response/exception_list_schema/index.mock.ts +++ b/packages/kbn-securitysolution-io-ts-list-types/src/response/exception_list_schema/index.mock.ts @@ -62,16 +62,17 @@ export const getTrustedAppsListSchemaMock = (): ExceptionListSchema => { * This is useful for end to end tests where we remove the auto generated parts for comparisons * such as created_at, updated_at, and id. */ -export const getExceptionResponseMockWithoutAutoGeneratedValues = (): Partial => ({ - created_by: ELASTIC_USER, - description: DESCRIPTION, - immutable: IMMUTABLE, - list_id: LIST_ID, - name: NAME, - namespace_type: 'single', - os_types: [], - tags: [], - type: ENDPOINT_TYPE, - updated_by: ELASTIC_USER, - version: VERSION, -}); +export const getExceptionResponseMockWithoutAutoGeneratedValues = + (): Partial => ({ + created_by: ELASTIC_USER, + description: DESCRIPTION, + immutable: IMMUTABLE, + list_id: LIST_ID, + name: NAME, + namespace_type: 'single', + os_types: [], + tags: [], + type: ENDPOINT_TYPE, + updated_by: ELASTIC_USER, + version: VERSION, + }); diff --git a/packages/kbn-securitysolution-io-ts-utils/src/format_errors/index.test.ts b/packages/kbn-securitysolution-io-ts-utils/src/format_errors/index.test.ts index f47f8f87f6a7e..17a551b098765 100644 --- a/packages/kbn-securitysolution-io-ts-utils/src/format_errors/index.test.ts +++ b/packages/kbn-securitysolution-io-ts-utils/src/format_errors/index.test.ts @@ -60,7 +60,7 @@ describe('utils', () => { }); test('will use message before context if it is set', () => { - const context: t.Context = ([{ key: 'some string key' }] as unknown) as t.Context; + const context: t.Context = [{ key: 'some string key' }] as unknown as t.Context; const validationError1: t.ValidationError = { value: 'Some existing error 1', context, @@ -72,7 +72,7 @@ describe('utils', () => { }); test('will use context entry of a single string', () => { - const context: t.Context = ([{ key: 'some string key' }] as unknown) as t.Context; + const context: t.Context = [{ key: 'some string key' }] as unknown as t.Context; const validationError1: t.ValidationError = { value: 'Some existing error 1', context, @@ -83,10 +83,10 @@ describe('utils', () => { }); test('will use two context entries of two strings', () => { - const context: t.Context = ([ + const context: t.Context = [ { key: 'some string key 1' }, { key: 'some string key 2' }, - ] as unknown) as t.Context; + ] as unknown as t.Context; const validationError1: t.ValidationError = { value: 'Some existing error 1', context, @@ -99,10 +99,7 @@ describe('utils', () => { }); test('will filter out and not use any strings of numbers', () => { - const context: t.Context = ([ - { key: '5' }, - { key: 'some string key 2' }, - ] as unknown) as t.Context; + const context: t.Context = [{ key: '5' }, { key: 'some string key 2' }] as unknown as t.Context; const validationError1: t.ValidationError = { value: 'Some existing error 1', context, @@ -115,10 +112,10 @@ describe('utils', () => { }); test('will filter out and not use null', () => { - const context: t.Context = ([ + const context: t.Context = [ { key: null }, { key: 'some string key 2' }, - ] as unknown) as t.Context; + ] as unknown as t.Context; const validationError1: t.ValidationError = { value: 'Some existing error 1', context, @@ -131,10 +128,7 @@ describe('utils', () => { }); test('will filter out and not use empty strings', () => { - const context: t.Context = ([ - { key: '' }, - { key: 'some string key 2' }, - ] as unknown) as t.Context; + const context: t.Context = [{ key: '' }, { key: 'some string key 2' }] as unknown as t.Context; const validationError1: t.ValidationError = { value: 'Some existing error 1', context, @@ -147,10 +141,10 @@ describe('utils', () => { }); test('will use a name context if it cannot find a keyContext', () => { - const context: t.Context = ([ + const context: t.Context = [ { key: '' }, { key: '', type: { name: 'someName' } }, - ] as unknown) as t.Context; + ] as unknown as t.Context; const validationError1: t.ValidationError = { value: 'Some existing error 1', context, @@ -161,7 +155,7 @@ describe('utils', () => { }); test('will return an empty string if name does not exist but type does', () => { - const context: t.Context = ([{ key: '' }, { key: '', type: {} }] as unknown) as t.Context; + const context: t.Context = [{ key: '' }, { key: '', type: {} }] as unknown as t.Context; const validationError1: t.ValidationError = { value: 'Some existing error 1', context, @@ -172,10 +166,7 @@ describe('utils', () => { }); test('will stringify an error value', () => { - const context: t.Context = ([ - { key: '' }, - { key: 'some string key 2' }, - ] as unknown) as t.Context; + const context: t.Context = [{ key: '' }, { key: 'some string key 2' }] as unknown as t.Context; const validationError1: t.ValidationError = { value: { foo: 'some error' }, context, diff --git a/packages/kbn-securitysolution-list-hooks/src/use_exception_lists/index.ts b/packages/kbn-securitysolution-list-hooks/src/use_exception_lists/index.ts index 722a7918c4127..c0a5325377dc0 100644 --- a/packages/kbn-securitysolution-list-hooks/src/use_exception_lists/index.ts +++ b/packages/kbn-securitysolution-list-hooks/src/use_exception_lists/index.ts @@ -72,7 +72,12 @@ export const useExceptionLists = ({ abortCtrlRef.current = new AbortController(); - const { page, per_page: perPage, total, data } = await fetchExceptionLists({ + const { + page, + per_page: perPage, + total, + data, + } = await fetchExceptionLists({ filters, http, namespaceTypes: namespaceTypesAsString, diff --git a/packages/kbn-server-route-repository/src/typings.ts b/packages/kbn-server-route-repository/src/typings.ts index c27f67c71e88b..dde957f469901 100644 --- a/packages/kbn-server-route-repository/src/typings.ts +++ b/packages/kbn-server-route-repository/src/typings.ts @@ -70,16 +70,15 @@ export interface ServerRouteRepository< ): ServerRouteRepository< TRouteHandlerResources, TRouteCreateOptions, - TRouteState & - { - [key in TEndpoint]: ServerRoute< - TEndpoint, - TRouteParamsRT, - TRouteHandlerResources, - TReturnType, - TRouteCreateOptions - >; - } + TRouteState & { + [key in TEndpoint]: ServerRoute< + TEndpoint, + TRouteParamsRT, + TRouteHandlerResources, + TReturnType, + TRouteCreateOptions + >; + } >; merge< TServerRouteRepository extends ServerRouteRepository< @@ -104,27 +103,24 @@ export interface ServerRouteRepository< >; } -type ClientRequestParamsOfType< - TRouteParamsRT extends RouteParamsRT -> = TRouteParamsRT extends t.Mixed - ? MaybeOptional<{ - params: t.OutputOf; - }> - : {}; +type ClientRequestParamsOfType = + TRouteParamsRT extends t.Mixed + ? MaybeOptional<{ + params: t.OutputOf; + }> + : {}; -type DecodedRequestParamsOfType< - TRouteParamsRT extends RouteParamsRT -> = TRouteParamsRT extends t.Mixed - ? MaybeOptional<{ - params: t.TypeOf; - }> - : {}; +type DecodedRequestParamsOfType = + TRouteParamsRT extends t.Mixed + ? MaybeOptional<{ + params: t.TypeOf; + }> + : {}; -export type EndpointOf< - TServerRouteRepository extends ServerRouteRepository -> = TServerRouteRepository extends ServerRouteRepository - ? keyof TRouteState - : never; +export type EndpointOf> = + TServerRouteRepository extends ServerRouteRepository + ? keyof TRouteState + : never; export type ReturnOf< TServerRouteRepository extends ServerRouteRepository, diff --git a/packages/kbn-test/src/es/test_es_cluster.ts b/packages/kbn-test/src/es/test_es_cluster.ts index 2d6edce269684..0d31ffdb99cc2 100644 --- a/packages/kbn-test/src/es/test_es_cluster.ts +++ b/packages/kbn-test/src/es/test_es_cluster.ts @@ -55,11 +55,10 @@ export interface ICluster { getHostUrls: () => string[]; } -export type EsTestCluster< - Options extends CreateTestEsClusterOptions = CreateTestEsClusterOptions -> = Options['nodes'] extends TestEsClusterNodesOptions[] - ? ICluster - : ICluster & { getUrl: () => string }; // Only allow use of `getUrl` if `nodes` option isn't provided. +export type EsTestCluster = + Options['nodes'] extends TestEsClusterNodesOptions[] + ? ICluster + : ICluster & { getUrl: () => string }; // Only allow use of `getUrl` if `nodes` option isn't provided. export interface CreateTestEsClusterOptions { basePath?: string; diff --git a/packages/kbn-test/src/functional_test_runner/lib/providers/provider_collection.ts b/packages/kbn-test/src/functional_test_runner/lib/providers/provider_collection.ts index 2d05d5bba5ff6..69a5973168f0c 100644 --- a/packages/kbn-test/src/functional_test_runner/lib/providers/provider_collection.ts +++ b/packages/kbn-test/src/functional_test_runner/lib/providers/provider_collection.ts @@ -67,7 +67,7 @@ export class ProviderCollection { }; if (provider.prototype instanceof GenericFtrService) { - const Constructor = (provider as any) as new (ctx: any) => any; + const Constructor = provider as any as new (ctx: any) => any; return new Constructor(ctx); } diff --git a/packages/kbn-test/src/functional_test_runner/lib/snapshots/decorate_snapshot_ui.test.ts b/packages/kbn-test/src/functional_test_runner/lib/snapshots/decorate_snapshot_ui.test.ts index 707aba5932172..c199dfc092789 100644 --- a/packages/kbn-test/src/functional_test_runner/lib/snapshots/decorate_snapshot_ui.test.ts +++ b/packages/kbn-test/src/functional_test_runner/lib/snapshots/decorate_snapshot_ui.test.ts @@ -34,11 +34,11 @@ const registerTest = ({ title?: string; passed?: boolean; }) => { - const test = ({ + const test = { file: __filename, fullTitle: () => title, isPassed: () => passed, - } as unknown) as Test; + } as unknown as Test; parent.tests.push(test); test.parent = parent; diff --git a/packages/kbn-test/src/functional_test_runner/lib/suite_tracker.test.ts b/packages/kbn-test/src/functional_test_runner/lib/suite_tracker.test.ts index ac715da7d2a09..e87f316a100a7 100644 --- a/packages/kbn-test/src/functional_test_runner/lib/suite_tracker.test.ts +++ b/packages/kbn-test/src/functional_test_runner/lib/suite_tracker.test.ts @@ -51,12 +51,12 @@ describe('SuiteTracker', () => { let MOCKS: Record; const createMock = (overrides = {}) => { - return ({ + return { file: resolve(REPO_ROOT, MOCK_TEST_PATH), title: 'A Test', suiteTag: MOCK_TEST_PATH, ...overrides, - } as unknown) as Suite; + } as unknown as Suite; }; const runLifecycleWithMocks = async (mocks: Suite[], fn: (objs: any) => any = () => {}) => { diff --git a/packages/kbn-test/src/jest/utils/enzyme_helpers.tsx b/packages/kbn-test/src/jest/utils/enzyme_helpers.tsx index 686a201761dcd..0aa93dc51446c 100644 --- a/packages/kbn-test/src/jest/utils/enzyme_helpers.tsx +++ b/packages/kbn-test/src/jest/utils/enzyme_helpers.tsx @@ -19,11 +19,13 @@ import React, { ReactElement, ValidationMap } from 'react'; import { act as reactAct } from 'react-dom/test-utils'; // Use fake component to extract `intl` property to use in tests. -const { intl } = (mount( - -
-
-).find('IntlProvider') as ReactWrapper<{}, {}, __IntlProvider>) +const { intl } = ( + mount( + +
+
+ ).find('IntlProvider') as ReactWrapper<{}, {}, __IntlProvider> +) .instance() .getChildContext(); diff --git a/packages/kbn-test/src/jest/utils/redux_helpers.tsx b/packages/kbn-test/src/jest/utils/redux_helpers.tsx index 906cad2444b2e..3bbdfb965f323 100644 --- a/packages/kbn-test/src/jest/utils/redux_helpers.tsx +++ b/packages/kbn-test/src/jest/utils/redux_helpers.tsx @@ -9,8 +9,9 @@ import React, { ComponentType } from 'react'; import { Provider } from 'react-redux'; -export const WithStore = (store: any) => (WrappedComponent: ComponentType) => (props: any) => ( - - - -); +export const WithStore = (store: any) => (WrappedComponent: ComponentType) => (props: any) => + ( + + + + ); diff --git a/packages/kbn-test/src/jest/utils/router_helpers.tsx b/packages/kbn-test/src/jest/utils/router_helpers.tsx index 85ef27488a4ce..7c40e50bf646a 100644 --- a/packages/kbn-test/src/jest/utils/router_helpers.tsx +++ b/packages/kbn-test/src/jest/utils/router_helpers.tsx @@ -30,42 +30,45 @@ const locationDescriptorToRoutePath = ( return stringifyPath(paths); }; -export const WithMemoryRouter = ( - initialEntries: LocationDescriptor[] = ['/'], - initialIndex: number = 0 -) => (WrappedComponent: ComponentType) => (props: any) => ( - - - -); +export const WithMemoryRouter = + (initialEntries: LocationDescriptor[] = ['/'], initialIndex: number = 0) => + (WrappedComponent: ComponentType) => + (props: any) => + ( + + + + ); -export const WithRoute = ( - componentRoutePath: LocationDescriptor | LocationDescriptor[] = ['/'], - onRouter = (router: any) => {} -) => (WrappedComponent: ComponentType) => { - // Create a class component that will catch the router - // and forward it to our "onRouter()" handler. - const CatchRouter = withRouter( - class extends Component { - componentDidMount() { - const { match, location, history } = this.props; - const router = { route: { match, location }, history }; - onRouter(router); - } +export const WithRoute = + ( + componentRoutePath: LocationDescriptor | LocationDescriptor[] = ['/'], + onRouter = (router: any) => {} + ) => + (WrappedComponent: ComponentType) => { + // Create a class component that will catch the router + // and forward it to our "onRouter()" handler. + const CatchRouter = withRouter( + class extends Component { + componentDidMount() { + const { match, location, history } = this.props; + const router = { route: { match, location }, history }; + onRouter(router); + } - render() { - return ; + render() { + return ; + } } - } - ); + ); - return (props: any) => ( - } - /> - ); -}; + return (props: any) => ( + } + /> + ); + }; interface Router { history: Partial; diff --git a/packages/kbn-test/types/ftr_globals/snapshots.d.ts b/packages/kbn-test/types/ftr_globals/snapshots.d.ts index ba7a4c114370f..d244e6cc90bbf 100644 --- a/packages/kbn-test/types/ftr_globals/snapshots.d.ts +++ b/packages/kbn-test/types/ftr_globals/snapshots.d.ts @@ -6,9 +6,7 @@ * Side Public License, v 1. */ -declare const expectSnapshot: ( - received: any -) => { +declare const expectSnapshot: (received: any) => { toMatch: () => void; toMatchInline: (_actual?: any) => void; }; diff --git a/packages/kbn-tinymath/test/functions/degtorad.test.js b/packages/kbn-tinymath/test/functions/degtorad.test.js index 857447ab7051b..0988db251743d 100644 --- a/packages/kbn-tinymath/test/functions/degtorad.test.js +++ b/packages/kbn-tinymath/test/functions/degtorad.test.js @@ -16,10 +16,7 @@ describe('Degrees to Radians', () => { it('arrays', () => { expect(degtorad([0, 90, 180, 360])).toEqual([ - 0, - 1.5707963267948966, - 3.141592653589793, - 6.283185307179586, + 0, 1.5707963267948966, 3.141592653589793, 6.283185307179586, ]); }); }); diff --git a/packages/kbn-tinymath/test/functions/radtodeg.test.js b/packages/kbn-tinymath/test/functions/radtodeg.test.js index 03a10f59d60c7..e2059df464f2a 100644 --- a/packages/kbn-tinymath/test/functions/radtodeg.test.js +++ b/packages/kbn-tinymath/test/functions/radtodeg.test.js @@ -16,10 +16,7 @@ describe('Radians to Degrees', () => { it('arrays', () => { expect(radtodeg([0, 1.5707963267948966, 3.141592653589793, 6.283185307179586])).toEqual([ - 0, - 90, - 180, - 360, + 0, 90, 180, 360, ]); }); }); diff --git a/packages/kbn-typed-react-router-config/src/types/index.ts b/packages/kbn-typed-react-router-config/src/types/index.ts index e6c70001ef4b6..9c19c8dca323b 100644 --- a/packages/kbn-typed-react-router-config/src/types/index.ts +++ b/packages/kbn-typed-react-router-config/src/types/index.ts @@ -252,10 +252,9 @@ type AppendPath< TPath extends string > = NormalizePath<`${TPrefix}${NormalizePath<`/${TPath}`>}`>; -type MaybeUnion, U extends Record> = Omit & - { - [key in keyof U]: key extends keyof T ? T[key] | U[key] : U[key]; - }; +type MaybeUnion, U extends Record> = Omit & { + [key in keyof U]: key extends keyof T ? T[key] | U[key] : U[key]; +}; type MapRoute = TRoute extends Route ? MaybeUnion< diff --git a/packages/kbn-utility-types/src/jest/index.ts b/packages/kbn-utility-types/src/jest/index.ts index f6d14f23b504d..e146e19d10f17 100644 --- a/packages/kbn-utility-types/src/jest/index.ts +++ b/packages/kbn-utility-types/src/jest/index.ts @@ -10,7 +10,6 @@ export type DeeplyMockedKeys = { [P in keyof T]: T[P] extends (...args: any[]) => any ? jest.MockInstance, Parameters> : DeeplyMockedKeys; -} & - T; +} & T; export type MockedKeys = { [P in keyof T]: jest.Mocked }; diff --git a/src/cli_encryption_keys/encryption_config.js b/src/cli_encryption_keys/encryption_config.js index 3f68ab9ef9187..4ad46d65c08c8 100644 --- a/src/cli_encryption_keys/encryption_config.js +++ b/src/cli_encryption_keys/encryption_config.js @@ -23,18 +23,15 @@ export class EncryptionConfig { ]; #encryptionMeta = { 'xpack.encryptedSavedObjects.encryptionKey': { - docs: - 'https://www.elastic.co/guide/en/kibana/current/xpack-security-secure-saved-objects.html#xpack-security-secure-saved-objects', + docs: 'https://www.elastic.co/guide/en/kibana/current/xpack-security-secure-saved-objects.html#xpack-security-secure-saved-objects', description: 'Used to encrypt stored objects such as dashboards and visualizations', }, 'xpack.reporting.encryptionKey': { - docs: - 'https://www.elastic.co/guide/en/kibana/current/reporting-settings-kb.html#general-reporting-settings', + docs: 'https://www.elastic.co/guide/en/kibana/current/reporting-settings-kb.html#general-reporting-settings', description: 'Used to encrypt saved reports', }, 'xpack.security.encryptionKey': { - docs: - 'https://www.elastic.co/guide/en/kibana/current/security-settings-kb.html#security-session-and-cookie-settings', + docs: 'https://www.elastic.co/guide/en/kibana/current/security-settings-kb.html#security-session-and-cookie-settings', description: 'Used to encrypt session information', }, }; diff --git a/src/core/public/apm_system.ts b/src/core/public/apm_system.ts index f5af7011e632e..1a653636c54d4 100644 --- a/src/core/public/apm_system.ts +++ b/src/core/public/apm_system.ts @@ -11,7 +11,8 @@ import { modifyUrl } from '@kbn/std'; import type { InternalApplicationStart } from './application'; /** "GET protocol://hostname:port/pathname" */ -const HTTP_REQUEST_TRANSACTION_NAME_REGEX = /^(GET|POST|PUT|HEAD|PATCH|DELETE|OPTIONS|CONNECT|TRACE)\s(.*)$/; +const HTTP_REQUEST_TRANSACTION_NAME_REGEX = + /^(GET|POST|PUT|HEAD|PATCH|DELETE|OPTIONS|CONNECT|TRACE)\s(.*)$/; /** * This is the entry point used to boot the frontend when serving a application diff --git a/src/core/public/application/scoped_history.ts b/src/core/public/application/scoped_history.ts index b932465f800cd..2ab60e66b860f 100644 --- a/src/core/public/application/scoped_history.ts +++ b/src/core/public/application/scoped_history.ts @@ -32,7 +32,8 @@ import { * @public */ export class ScopedHistory - implements History { + implements History +{ /** * Tracks whether or not the user has left this history's scope. All methods throw errors if called after scope has * been left. diff --git a/src/core/public/chrome/ui/header/header_action_menu.test.tsx b/src/core/public/chrome/ui/header/header_action_menu.test.tsx index 201be8848bac8..e75b3b978bc11 100644 --- a/src/core/public/chrome/ui/header/header_action_menu.test.tsx +++ b/src/core/public/chrome/ui/header/header_action_menu.test.tsx @@ -41,17 +41,17 @@ describe('HeaderActionMenu', () => { }); }; - const createMountPoint = (id: string, content: string = id): MountPoint => ( - root - ): MockedUnmount => { - const container = document.createElement('DIV'); - // eslint-disable-next-line no-unsanitized/property - container.innerHTML = content; - root.appendChild(container); - const unmount = jest.fn(() => container.remove()); - unmounts[id] = unmount; - return unmount; - }; + const createMountPoint = + (id: string, content: string = id): MountPoint => + (root): MockedUnmount => { + const container = document.createElement('DIV'); + // eslint-disable-next-line no-unsanitized/property + container.innerHTML = content; + root.appendChild(container); + const unmount = jest.fn(() => container.remove()); + unmounts[id] = unmount; + return unmount; + }; it('mounts the current value of the provided observable', async () => { component = mount(); diff --git a/src/core/public/notifications/toasts/error_toast.test.tsx b/src/core/public/notifications/toasts/error_toast.test.tsx index 2fac3019db933..e0f917fb7f078 100644 --- a/src/core/public/notifications/toasts/error_toast.test.tsx +++ b/src/core/public/notifications/toasts/error_toast.test.tsx @@ -29,7 +29,9 @@ function render(props: ErrorToastProps = {}) { error={props.error || new Error('error message')} title={props.title || 'An error occured'} toastMessage={props.toastMessage || 'This is the toast message'} - i18nContext={() => ({ children }) => {children}} + i18nContext={() => + ({ children }) => + {children}} /> ); } diff --git a/src/core/public/overlays/banners/user_banner_service.test.ts b/src/core/public/overlays/banners/user_banner_service.test.ts index a13d7b0ca8e67..ff46a03886d7e 100644 --- a/src/core/public/overlays/banners/user_banner_service.test.ts +++ b/src/core/public/overlays/banners/user_banner_service.test.ts @@ -72,7 +72,7 @@ describe('OverlayBannersService', () => { startService(); expect(banners.replace).toHaveBeenCalledTimes(0); - const update$ = (uiSettings.getUpdate$() as any) as Subject<{ + const update$ = uiSettings.getUpdate$() as any as Subject<{ key: string; }>; @@ -87,7 +87,7 @@ describe('OverlayBannersService', () => { it('removes banner when changed to empty string', () => { startService('remove me!'); - const update$ = (uiSettings.getUpdate$() as any) as Subject<{ + const update$ = uiSettings.getUpdate$() as any as Subject<{ key: string; }>; @@ -98,7 +98,7 @@ describe('OverlayBannersService', () => { it('removes banner when changed to undefined', () => { startService('remove me!'); - const update$ = (uiSettings.getUpdate$() as any) as Subject<{ + const update$ = uiSettings.getUpdate$() as any as Subject<{ key: string; }>; @@ -111,7 +111,7 @@ describe('OverlayBannersService', () => { startService('initial banner!'); expect(banners.replace).toHaveBeenCalledTimes(1); - const update$ = (uiSettings.getUpdate$() as any) as Subject<{ + const update$ = uiSettings.getUpdate$() as any as Subject<{ key: string; }>; diff --git a/src/core/public/plugins/plugin_context.ts b/src/core/public/plugins/plugin_context.ts index 49c895aa80fc4..3461f570333d5 100644 --- a/src/core/public/plugins/plugin_context.ts +++ b/src/core/public/plugins/plugin_context.ts @@ -56,7 +56,7 @@ export function createPluginInitializerContext( env: coreContext.env, config: { get() { - return (pluginConfig as unknown) as T; + return pluginConfig as unknown as T; }, }, }; diff --git a/src/core/public/plugins/plugin_reader.ts b/src/core/public/plugins/plugin_reader.ts index db3085930888a..24508075975db 100644 --- a/src/core/public/plugins/plugin_reader.ts +++ b/src/core/public/plugins/plugin_reader.ts @@ -29,7 +29,7 @@ export interface CoreWindow { * Reads the plugin's bundle declared in the global context. */ export function read(name: string) { - const coreWindow = (window as unknown) as CoreWindow; + const coreWindow = window as unknown as CoreWindow; const exportId = `plugin/${name}/public`; if (!coreWindow.__kbnBundles__.has(exportId)) { diff --git a/src/core/public/plugins/plugins_service.test.mocks.ts b/src/core/public/plugins/plugins_service.test.mocks.ts index 1f85482569dbc..1858008e28016 100644 --- a/src/core/public/plugins/plugins_service.test.mocks.ts +++ b/src/core/public/plugins/plugins_service.test.mocks.ts @@ -14,12 +14,11 @@ export type MockedPluginInitializer = jest.Mock< any >; -export const mockPluginInitializerProvider: jest.Mock< - MockedPluginInitializer, - [PluginName] -> = jest.fn().mockImplementation(() => () => { - throw new Error('No provider specified'); -}); +export const mockPluginInitializerProvider: jest.Mock = jest + .fn() + .mockImplementation(() => () => { + throw new Error('No provider specified'); + }); jest.mock('./plugin_reader', () => ({ read: mockPluginInitializerProvider, diff --git a/src/core/public/plugins/plugins_service.test.ts b/src/core/public/plugins/plugins_service.test.ts index d85f8538e3a69..6bed958009419 100644 --- a/src/core/public/plugins/plugins_service.test.ts +++ b/src/core/public/plugins/plugins_service.test.ts @@ -117,7 +117,7 @@ describe('PluginsService', () => { }; // Reset these for each test. - mockPluginInitializers = new Map(([ + mockPluginInitializers = new Map([ [ 'pluginA', jest.fn(() => ({ @@ -146,7 +146,7 @@ describe('PluginsService', () => { stop: jest.fn(), })), ], - ] as unknown) as [[PluginName, any]]); + ] as unknown as [[PluginName, any]]); }); describe('#getOpaqueIds()', () => { diff --git a/src/core/public/utils/crypto/sha256.ts b/src/core/public/utils/crypto/sha256.ts index 009f0ee69a9e8..c36099279d8fc 100644 --- a/src/core/public/utils/crypto/sha256.ts +++ b/src/core/public/utils/crypto/sha256.ts @@ -39,70 +39,14 @@ * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ const K = [ - 0x428a2f98, - 0x71374491, - 0xb5c0fbcf, - 0xe9b5dba5, - 0x3956c25b, - 0x59f111f1, - 0x923f82a4, - 0xab1c5ed5, - 0xd807aa98, - 0x12835b01, - 0x243185be, - 0x550c7dc3, - 0x72be5d74, - 0x80deb1fe, - 0x9bdc06a7, - 0xc19bf174, - 0xe49b69c1, - 0xefbe4786, - 0x0fc19dc6, - 0x240ca1cc, - 0x2de92c6f, - 0x4a7484aa, - 0x5cb0a9dc, - 0x76f988da, - 0x983e5152, - 0xa831c66d, - 0xb00327c8, - 0xbf597fc7, - 0xc6e00bf3, - 0xd5a79147, - 0x06ca6351, - 0x14292967, - 0x27b70a85, - 0x2e1b2138, - 0x4d2c6dfc, - 0x53380d13, - 0x650a7354, - 0x766a0abb, - 0x81c2c92e, - 0x92722c85, - 0xa2bfe8a1, - 0xa81a664b, - 0xc24b8b70, - 0xc76c51a3, - 0xd192e819, - 0xd6990624, - 0xf40e3585, - 0x106aa070, - 0x19a4c116, - 0x1e376c08, - 0x2748774c, - 0x34b0bcb5, - 0x391c0cb3, - 0x4ed8aa4a, - 0x5b9cca4f, - 0x682e6ff3, - 0x748f82ee, - 0x78a5636f, - 0x84c87814, - 0x8cc70208, - 0x90befffa, - 0xa4506ceb, - 0xbef9a3f7, - 0xc67178f2, + 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5, + 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174, + 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da, + 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967, + 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85, + 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070, + 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3, + 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2, ]; const W = new Array(64); diff --git a/src/core/public/utils/mount.tsx b/src/core/public/utils/mount.tsx index 43d96c7f712cd..fc23202e2c71d 100644 --- a/src/core/public/utils/mount.tsx +++ b/src/core/public/utils/mount.tsx @@ -30,7 +30,9 @@ export const MountWrapper: React.FunctionComponent<{ mount: MountPoint; classNam * * @param node to get a mount for */ -export const mountReactNode = (node: React.ReactNode): MountPoint => (element: HTMLElement) => { - render({node}, element); - return () => unmountComponentAtNode(element); -}; +export const mountReactNode = + (node: React.ReactNode): MountPoint => + (element: HTMLElement) => { + render({node}, element); + return () => unmountComponentAtNode(element); + }; diff --git a/src/core/server/capabilities/resolve_capabilities.ts b/src/core/server/capabilities/resolve_capabilities.ts index 89da7b6c30a19..34d7894543b03 100644 --- a/src/core/server/capabilities/resolve_capabilities.ts +++ b/src/core/server/capabilities/resolve_capabilities.ts @@ -16,22 +16,24 @@ export type CapabilitiesResolver = ( useDefaultCapabilities: boolean ) => Promise; -export const getCapabilitiesResolver = ( - capabilities: () => Capabilities, - switchers: () => CapabilitiesSwitcher[] -): CapabilitiesResolver => async ( - request: KibanaRequest, - applications: string[], - useDefaultCapabilities: boolean -): Promise => { - return resolveCapabilities( - capabilities(), - switchers(), - request, - applications, - useDefaultCapabilities - ); -}; +export const getCapabilitiesResolver = + ( + capabilities: () => Capabilities, + switchers: () => CapabilitiesSwitcher[] + ): CapabilitiesResolver => + async ( + request: KibanaRequest, + applications: string[], + useDefaultCapabilities: boolean + ): Promise => { + return resolveCapabilities( + capabilities(), + switchers(), + request, + applications, + useDefaultCapabilities + ); + }; export const resolveCapabilities = async ( capabilities: Capabilities, diff --git a/src/core/server/config/test_utils.ts b/src/core/server/config/test_utils.ts index ab06ff50012b7..e3f9ca7eb29f2 100644 --- a/src/core/server/config/test_utils.ts +++ b/src/core/server/config/test_utils.ts @@ -22,7 +22,9 @@ function collectDeprecations( deprecation, path, })), - () => ({ message }) => deprecationMessages.push(message) + () => + ({ message }) => + deprecationMessages.push(message) ); return { messages: deprecationMessages, diff --git a/src/core/server/context/container/context.mock.ts b/src/core/server/context/container/context.mock.ts index 2a43006301c03..9996d609fc074 100644 --- a/src/core/server/context/container/context.mock.ts +++ b/src/core/server/context/container/context.mock.ts @@ -16,8 +16,10 @@ const createContextMock = (mockContext: any = {}) => { registerContext: jest.fn(), createHandler: jest.fn(), }; - contextMock.createHandler.mockImplementation((pluginId, handler) => (...args) => - Promise.resolve(handler(mockContext, ...args)) + contextMock.createHandler.mockImplementation( + (pluginId, handler) => + (...args) => + Promise.resolve(handler(mockContext, ...args)) ); return contextMock; }; diff --git a/src/core/server/context/container/context.ts b/src/core/server/context/container/context.ts index f3d91e268bd1c..2650c21853604 100644 --- a/src/core/server/context/container/context.ts +++ b/src/core/server/context/container/context.ts @@ -288,15 +288,14 @@ export class ContextContainer implements IContextContainer { } /** Sorts context provider pairs by core pairs first. */ -const sortByCoreFirst = ( - coreId: symbol -): ((left: [any, { source: symbol }], right: [any, { source: symbol }]) => number) => ( - [leftName, leftProvider], - [rightName, rightProvider] -) => { - if (leftProvider.source === coreId) { - return rightProvider.source === coreId ? 0 : -1; - } else { - return rightProvider.source === coreId ? 1 : 0; - } -}; +const sortByCoreFirst = + ( + coreId: symbol + ): ((left: [any, { source: symbol }], right: [any, { source: symbol }]) => number) => + ([leftName, leftProvider], [rightName, rightProvider]) => { + if (leftProvider.source === coreId) { + return rightProvider.source === coreId ? 0 : -1; + } else { + return rightProvider.source === coreId ? 1 : 0; + } + }; diff --git a/src/core/server/core_app/core_app.test.ts b/src/core/server/core_app/core_app.test.ts index e5c3a592a72c7..c13116577af71 100644 --- a/src/core/server/core_app/core_app.test.ts +++ b/src/core/server/core_app/core_app.test.ts @@ -132,7 +132,7 @@ describe('CoreApp', () => { const [[, handler]] = prebootHTTPResourcesRegistrar.register.mock.calls; const mockResponseFactory = httpResourcesMock.createResponseFactory(); handler( - ({} as unknown) as RequestHandlerContext, + {} as unknown as RequestHandlerContext, httpServerMock.createKibanaRequest(), mockResponseFactory ); diff --git a/src/core/server/core_usage_data/core_usage_data_service.ts b/src/core/server/core_usage_data/core_usage_data_service.ts index ce9013d9437d6..72b70824d305d 100644 --- a/src/core/server/core_usage_data/core_usage_data_service.ts +++ b/src/core/server/core_usage_data/core_usage_data_service.ts @@ -88,7 +88,8 @@ const isCustomIndex = (index: string) => { }; export class CoreUsageDataService - implements CoreService { + implements CoreService +{ private logger: Logger; private elasticsearchConfig?: ElasticsearchConfigType; private configService: CoreContext['configService']; diff --git a/src/core/server/core_usage_data/core_usage_stats_client.mock.ts b/src/core/server/core_usage_data/core_usage_stats_client.mock.ts index 438424f76d057..ac5855c3a4ba0 100644 --- a/src/core/server/core_usage_data/core_usage_stats_client.mock.ts +++ b/src/core/server/core_usage_data/core_usage_stats_client.mock.ts @@ -9,7 +9,7 @@ import { CoreUsageStatsClient } from '.'; const createUsageStatsClientMock = () => - (({ + ({ getUsageStats: jest.fn().mockResolvedValue({}), incrementSavedObjectsBulkCreate: jest.fn().mockResolvedValue(null), incrementSavedObjectsBulkGet: jest.fn().mockResolvedValue(null), @@ -26,7 +26,7 @@ const createUsageStatsClientMock = () => incrementSavedObjectsExport: jest.fn().mockResolvedValue(null), incrementLegacyDashboardsImport: jest.fn().mockResolvedValue(null), incrementLegacyDashboardsExport: jest.fn().mockResolvedValue(null), - } as unknown) as jest.Mocked); + } as unknown as jest.Mocked); export const coreUsageStatsClientMock = { create: createUsageStatsClientMock, diff --git a/src/core/server/deprecations/deprecations_factory.test.ts b/src/core/server/deprecations/deprecations_factory.test.ts index 73beb84f57fa6..85ef521538b15 100644 --- a/src/core/server/deprecations/deprecations_factory.test.ts +++ b/src/core/server/deprecations/deprecations_factory.test.ts @@ -55,10 +55,10 @@ describe('DeprecationsFactory', () => { }); describe('getAllDeprecations', () => { - const mockDependencies = ({ + const mockDependencies = { esClient: jest.fn(), savedObjectsClient: jest.fn(), - } as unknown) as GetDeprecationsContext; + } as unknown as GetDeprecationsContext; it('returns a flattened array of deprecations', async () => { const deprecationsFactory = new DeprecationsFactory({ logger }); @@ -184,10 +184,10 @@ describe('DeprecationsFactory', () => { }); describe('getDeprecations', () => { - const mockDependencies = ({ + const mockDependencies = { esClient: jest.fn(), savedObjectsClient: jest.fn(), - } as unknown) as GetDeprecationsContext; + } as unknown as GetDeprecationsContext; it('returns a flattened array of DeprecationInfo', async () => { const deprecationsFactory = new DeprecationsFactory({ logger }); diff --git a/src/core/server/deprecations/deprecations_registry.test.ts b/src/core/server/deprecations/deprecations_registry.test.ts index 82b09beaa5123..0e4f48b18a0a9 100644 --- a/src/core/server/deprecations/deprecations_registry.test.ts +++ b/src/core/server/deprecations/deprecations_registry.test.ts @@ -14,9 +14,9 @@ describe('DeprecationsRegistry', () => { describe('registerDeprecations', () => { it('throws if getDeprecations is not a function', async () => { const deprecationsRegistry = new DeprecationsRegistry(); - const deprecationsConfig = ({ + const deprecationsConfig = { getDeprecations: null, - } as unknown) as RegisterDeprecationsConfig; + } as unknown as RegisterDeprecationsConfig; expect(() => deprecationsRegistry.registerDeprecations(deprecationsConfig)).toThrowError( /getDeprecations must be a function/ ); @@ -46,7 +46,7 @@ describe('DeprecationsRegistry', () => { describe('getDeprecations', () => { it('returns all settled deprecations', async () => { const deprecationsRegistry = new DeprecationsRegistry(); - const mockContext = ({} as unknown) as GetDeprecationsContext; + const mockContext = {} as unknown as GetDeprecationsContext; const mockError = new Error(); const deprecationsConfigA = { getDeprecations: jest.fn().mockResolvedValue('hi') }; const deprecationsConfigB = { getDeprecations: jest.fn().mockRejectedValue(mockError) }; @@ -67,7 +67,7 @@ describe('DeprecationsRegistry', () => { it('passes dependencies to registered getDeprecations function', async () => { const deprecationsRegistry = new DeprecationsRegistry(); - const mockContext = ({} as unknown) as GetDeprecationsContext; + const mockContext = {} as unknown as GetDeprecationsContext; const deprecationsConfig = { getDeprecations: jest.fn().mockResolvedValue('hi') }; deprecationsRegistry.registerDeprecations(deprecationsConfig); const deprecations = await deprecationsRegistry.getDeprecations(mockContext); diff --git a/src/core/server/deprecations/deprecations_service.test.ts b/src/core/server/deprecations/deprecations_service.test.ts index bc0dbcef4a5b6..0067cff1d2306 100644 --- a/src/core/server/deprecations/deprecations_service.test.ts +++ b/src/core/server/deprecations/deprecations_service.test.ts @@ -93,9 +93,10 @@ describe('DeprecationsService', () => { expect(deprecationsFactory.getRegistry).toBeCalledTimes(1); expect(deprecationsFactory.getRegistry).toBeCalledWith('testDomain'); expect(deprecationsRegistry.registerDeprecations).toBeCalledTimes(1); - const configDeprecations = await deprecationsRegistry.registerDeprecations.mock.calls[0][0].getDeprecations( - getDeprecationsContext - ); + const configDeprecations = + await deprecationsRegistry.registerDeprecations.mock.calls[0][0].getDeprecations( + getDeprecationsContext + ); expect(configDeprecations).toMatchInlineSnapshot(` Array [ Object { @@ -136,9 +137,10 @@ describe('DeprecationsService', () => { deprecationsFactory.getRegistry.mockReturnValue(deprecationsRegistry); deprecationsService['registerConfigDeprecationsInfo'](deprecationsFactory); - const configDeprecations = await deprecationsRegistry.registerDeprecations.mock.calls[0][0].getDeprecations( - getDeprecationsContext - ); + const configDeprecations = + await deprecationsRegistry.registerDeprecations.mock.calls[0][0].getDeprecations( + getDeprecationsContext + ); expect(configDeprecations[0].level).toBe('warning'); }); }); diff --git a/src/core/server/deprecations/deprecations_service.ts b/src/core/server/deprecations/deprecations_service.ts index bc981c21ba975..cfc0aae443d1b 100644 --- a/src/core/server/deprecations/deprecations_service.ts +++ b/src/core/server/deprecations/deprecations_service.ts @@ -126,7 +126,8 @@ export interface DeprecationsSetupDeps { /** @internal */ export class DeprecationsService - implements CoreService { + implements CoreService +{ private readonly logger: Logger; private readonly deprecationsFactory: DeprecationsFactory; diff --git a/src/core/server/elasticsearch/client/configure_client.test.ts b/src/core/server/elasticsearch/client/configure_client.test.ts index 4e2c9c22f42f8..35fcb5819d015 100644 --- a/src/core/server/elasticsearch/client/configure_client.test.ts +++ b/src/core/server/elasticsearch/client/configure_client.test.ts @@ -25,10 +25,10 @@ import { configureClient } from './configure_client'; const createFakeConfig = ( parts: Partial = {} ): ElasticsearchClientConfig => { - return ({ + return { type: 'fake-config', ...parts, - } as unknown) as ElasticsearchClientConfig; + } as unknown as ElasticsearchClientConfig; }; const createFakeClient = () => { diff --git a/src/core/server/elasticsearch/client/configure_client.ts b/src/core/server/elasticsearch/client/configure_client.ts index efd22365d44f3..93c404593af3f 100644 --- a/src/core/server/elasticsearch/client/configure_client.ts +++ b/src/core/server/elasticsearch/client/configure_client.ts @@ -102,9 +102,12 @@ function getResponseMessage(event: RequestEvent): string { * Returns stringified debug information from an Elasticsearch request event * useful for logging in case of an unexpected failure. */ -export function getRequestDebugMeta( - event: RequestEvent -): { url: string; body: string; statusCode: number | null; method: string } { +export function getRequestDebugMeta(event: RequestEvent): { + url: string; + body: string; + statusCode: number | null; + method: string; +} { const params = event.meta.request.params; // definition is wrong, `params.querystring` can be either a string or an object const querystring = convertQueryString(params.querystring); diff --git a/src/core/server/elasticsearch/client/mocks.ts b/src/core/server/elasticsearch/client/mocks.ts index 5e2bf784b2a1d..7c4cde1ae424d 100644 --- a/src/core/server/elasticsearch/client/mocks.ts +++ b/src/core/server/elasticsearch/client/mocks.ts @@ -92,7 +92,7 @@ const createInternalClientMock = ( export type ElasticsearchClientMock = DeeplyMockedKeys; const createClientMock = (res?: MockedTransportRequestPromise): ElasticsearchClientMock => - (createInternalClientMock(res) as unknown) as ElasticsearchClientMock; + createInternalClientMock(res) as unknown as ElasticsearchClientMock; export interface ScopedClusterClientMock { asInternalUser: ElasticsearchClientMock; diff --git a/src/core/server/elasticsearch/elasticsearch_service.ts b/src/core/server/elasticsearch/elasticsearch_service.ts index eebd732749285..09c96696b7985 100644 --- a/src/core/server/elasticsearch/elasticsearch_service.ts +++ b/src/core/server/elasticsearch/elasticsearch_service.ts @@ -38,7 +38,8 @@ export interface SetupDeps { /** @internal */ export class ElasticsearchService - implements CoreService { + implements CoreService +{ private readonly log: Logger; private readonly config$: Observable; private stop$ = new Subject(); diff --git a/src/core/server/elasticsearch/integration_tests/client.test.ts b/src/core/server/elasticsearch/integration_tests/client.test.ts index 83b20761df1ae..f3c9cf27d3b29 100644 --- a/src/core/server/elasticsearch/integration_tests/client.test.ts +++ b/src/core/server/elasticsearch/integration_tests/client.test.ts @@ -38,24 +38,27 @@ describe('elasticsearch clients', () => { it('does not return deprecation warning when x-elastic-product-origin header is set', async () => { // Header should be automatically set by Core - const resp1 = await kibanaServer.coreStart.elasticsearch.client.asInternalUser.indices.getSettings( - { index: '.kibana' } - ); + const resp1 = + await kibanaServer.coreStart.elasticsearch.client.asInternalUser.indices.getSettings({ + index: '.kibana', + }); expect(resp1.headers).not.toHaveProperty('warning'); // Also test setting it explicitly - const resp2 = await kibanaServer.coreStart.elasticsearch.client.asInternalUser.indices.getSettings( - { index: '.kibana' }, - { headers: { 'x-elastic-product-origin': 'kibana' } } - ); + const resp2 = + await kibanaServer.coreStart.elasticsearch.client.asInternalUser.indices.getSettings( + { index: '.kibana' }, + { headers: { 'x-elastic-product-origin': 'kibana' } } + ); expect(resp2.headers).not.toHaveProperty('warning'); }); it('returns deprecation warning when x-elastic-product-orign header is not set', async () => { - const resp = await kibanaServer.coreStart.elasticsearch.client.asInternalUser.indices.getSettings( - { index: '.kibana' }, - { headers: { 'x-elastic-product-origin': null } } - ); + const resp = + await kibanaServer.coreStart.elasticsearch.client.asInternalUser.indices.getSettings( + { index: '.kibana' }, + { headers: { 'x-elastic-product-origin': null } } + ); expect(resp.headers).toHaveProperty('warning'); expect(resp.headers!.warning).toMatch('system indices'); diff --git a/src/core/server/environment/resolve_uuid.test.ts b/src/core/server/environment/resolve_uuid.test.ts index 40db2d697906b..3ee65e8ac99cf 100644 --- a/src/core/server/environment/resolve_uuid.test.ts +++ b/src/core/server/environment/resolve_uuid.test.ts @@ -35,7 +35,7 @@ const mockReadFile = ({ uuid: string; error: any; }>) => { - ((readFile as unknown) as jest.Mock).mockImplementation(() => { + (readFile as unknown as jest.Mock).mockImplementation(() => { if (error) { return Promise.reject(error); } else { @@ -45,7 +45,7 @@ const mockReadFile = ({ }; const mockWriteFile = (error?: object) => { - ((writeFile as unknown) as jest.Mock).mockImplementation(() => { + (writeFile as unknown as jest.Mock).mockImplementation(() => { if (error) { return Promise.reject(error); } else { diff --git a/src/core/server/execution_context/execution_context_service.ts b/src/core/server/execution_context/execution_context_service.ts index d8ff5fca7847d..6e2b809e23043 100644 --- a/src/core/server/execution_context/execution_context_service.ts +++ b/src/core/server/execution_context/execution_context_service.ts @@ -69,7 +69,8 @@ export interface ExecutionContextSetup { export type ExecutionContextStart = ExecutionContextSetup; export class ExecutionContextService - implements CoreService { + implements CoreService +{ private readonly log: Logger; private readonly contextStore: AsyncLocalStorage; private readonly requestIdStore: AsyncLocalStorage<{ requestId: string }>; diff --git a/src/core/server/http/http_service.mock.ts b/src/core/server/http/http_service.mock.ts index 4cb1bc9867d2c..894ff38e12a35 100644 --- a/src/core/server/http/http_service.mock.ts +++ b/src/core/server/http/http_service.mock.ts @@ -108,7 +108,7 @@ const createPrebootContractMock = () => { const createInternalSetupContractMock = () => { const mock: InternalHttpServiceSetupMock = { // we can mock other hapi server methods when we need it - server: ({ + server: { name: 'http-server-test', version: 'kibana', route: jest.fn(), @@ -116,7 +116,7 @@ const createInternalSetupContractMock = () => { stop: jest.fn(), config: jest.fn().mockReturnValue(configMock.create()), // @ts-expect-error somehow it thinks that `Server` isn't a `Construtable` - } as unknown) as jest.MockedClass, + } as unknown as jest.MockedClass, createCookieSessionStorageFactory: jest.fn(), registerOnPreRouting: jest.fn(), registerOnPreAuth: jest.fn(), diff --git a/src/core/server/http/http_service.ts b/src/core/server/http/http_service.ts index 538a4c065e997..98ae0f8b81aa6 100644 --- a/src/core/server/http/http_service.ts +++ b/src/core/server/http/http_service.ts @@ -51,7 +51,8 @@ interface SetupDeps { /** @internal */ export class HttpService - implements CoreService { + implements CoreService +{ private readonly prebootServer: HttpServer; private isPrebootServerStopped = false; private readonly httpServer: HttpServer; diff --git a/src/core/server/http/integration_tests/lifecycle.test.ts b/src/core/server/http/integration_tests/lifecycle.test.ts index 098dfbebfa7b5..1db0b3c131522 100644 --- a/src/core/server/http/integration_tests/lifecycle.test.ts +++ b/src/core/server/http/integration_tests/lifecycle.test.ts @@ -51,9 +51,11 @@ interface StorageData { describe('OnPreRouting', () => { it('supports registering a request interceptor', async () => { - const { registerOnPreRouting, server: innerServer, createRouter } = await server.setup( - setupDeps - ); + const { + registerOnPreRouting, + server: innerServer, + createRouter, + } = await server.setup(setupDeps); const router = createRouter('/'); router.get({ path: '/', validate: false }, (context, req, res) => res.ok({ body: 'ok' })); @@ -76,9 +78,11 @@ describe('OnPreRouting', () => { }); it('supports request forwarding to specified url', async () => { - const { registerOnPreRouting, server: innerServer, createRouter } = await server.setup( - setupDeps - ); + const { + registerOnPreRouting, + server: innerServer, + createRouter, + } = await server.setup(setupDeps); const router = createRouter('/'); router.get({ path: '/initial', validate: false }, (context, req, res) => @@ -110,9 +114,11 @@ describe('OnPreRouting', () => { }); it('provides original request url', async () => { - const { registerOnPreRouting, server: innerServer, createRouter } = await server.setup( - setupDeps - ); + const { + registerOnPreRouting, + server: innerServer, + createRouter, + } = await server.setup(setupDeps); const router = createRouter('/'); router.get({ path: '/login', validate: false }, (context, req, res) => { @@ -135,9 +141,11 @@ describe('OnPreRouting', () => { }); it('provides original request url if rewritten several times', async () => { - const { registerOnPreRouting, server: innerServer, createRouter } = await server.setup( - setupDeps - ); + const { + registerOnPreRouting, + server: innerServer, + createRouter, + } = await server.setup(setupDeps); const router = createRouter('/'); router.get({ path: '/reroute-2', validate: false }, (context, req, res) => { @@ -161,9 +169,11 @@ describe('OnPreRouting', () => { }); it('does not provide request url if interceptor does not rewrite url', async () => { - const { registerOnPreRouting, server: innerServer, createRouter } = await server.setup( - setupDeps - ); + const { + registerOnPreRouting, + server: innerServer, + createRouter, + } = await server.setup(setupDeps); const router = createRouter('/'); router.get({ path: '/login', validate: false }, (context, req, res) => { @@ -184,9 +194,11 @@ describe('OnPreRouting', () => { }); it('supports redirection from the interceptor', async () => { - const { registerOnPreRouting, server: innerServer, createRouter } = await server.setup( - setupDeps - ); + const { + registerOnPreRouting, + server: innerServer, + createRouter, + } = await server.setup(setupDeps); const router = createRouter('/'); const redirectUrl = '/redirectUrl'; @@ -207,9 +219,11 @@ describe('OnPreRouting', () => { }); it('supports rejecting request and adjusting response headers', async () => { - const { registerOnPreRouting, server: innerServer, createRouter } = await server.setup( - setupDeps - ); + const { + registerOnPreRouting, + server: innerServer, + createRouter, + } = await server.setup(setupDeps); const router = createRouter('/'); router.get({ path: '/', validate: false }, (context, req, res) => res.ok()); @@ -229,9 +243,11 @@ describe('OnPreRouting', () => { }); it('does not expose error details if interceptor throws', async () => { - const { registerOnPreRouting, server: innerServer, createRouter } = await server.setup( - setupDeps - ); + const { + registerOnPreRouting, + server: innerServer, + createRouter, + } = await server.setup(setupDeps); const router = createRouter('/'); router.get({ path: '/', validate: false }, (context, req, res) => res.ok()); @@ -254,9 +270,11 @@ describe('OnPreRouting', () => { }); it('returns internal error if interceptor returns unexpected result', async () => { - const { registerOnPreRouting, server: innerServer, createRouter } = await server.setup( - setupDeps - ); + const { + registerOnPreRouting, + server: innerServer, + createRouter, + } = await server.setup(setupDeps); const router = createRouter('/'); router.get({ path: '/', validate: false }, (context, req, res) => res.ok()); @@ -277,9 +295,11 @@ describe('OnPreRouting', () => { }); it(`doesn't share request object between interceptors`, async () => { - const { registerOnPreRouting, server: innerServer, createRouter } = await server.setup( - setupDeps - ); + const { + registerOnPreRouting, + server: innerServer, + createRouter, + } = await server.setup(setupDeps); const router = createRouter('/'); registerOnPreRouting((req, res, t) => { @@ -1172,9 +1192,11 @@ describe('Auth', () => { describe('OnPreResponse', () => { it('supports registering response interceptors', async () => { - const { registerOnPreResponse, server: innerServer, createRouter } = await server.setup( - setupDeps - ); + const { + registerOnPreResponse, + server: innerServer, + createRouter, + } = await server.setup(setupDeps); const router = createRouter('/'); router.get({ path: '/', validate: false }, (context, req, res) => res.ok({ body: 'ok' })); @@ -1197,9 +1219,11 @@ describe('OnPreResponse', () => { }); it('supports additional headers attachments', async () => { - const { registerOnPreResponse, server: innerServer, createRouter } = await server.setup( - setupDeps - ); + const { + registerOnPreResponse, + server: innerServer, + createRouter, + } = await server.setup(setupDeps); const router = createRouter('/'); router.get({ path: '/', validate: false }, (context, req, res) => @@ -1226,9 +1250,11 @@ describe('OnPreResponse', () => { }); it('logs a warning if interceptor rewrites response header', async () => { - const { registerOnPreResponse, server: innerServer, createRouter } = await server.setup( - setupDeps - ); + const { + registerOnPreResponse, + server: innerServer, + createRouter, + } = await server.setup(setupDeps); const router = createRouter('/'); router.get({ path: '/', validate: false }, (context, req, res) => @@ -1255,9 +1281,11 @@ describe('OnPreResponse', () => { }); it("doesn't expose error details if interceptor throws", async () => { - const { registerOnPreResponse, server: innerServer, createRouter } = await server.setup( - setupDeps - ); + const { + registerOnPreResponse, + server: innerServer, + createRouter, + } = await server.setup(setupDeps); const router = createRouter('/'); router.get({ path: '/', validate: false }, (context, req, res) => res.ok(undefined)); @@ -1279,9 +1307,11 @@ describe('OnPreResponse', () => { }); it('returns internal error if interceptor returns unexpected result', async () => { - const { registerOnPreResponse, server: innerServer, createRouter } = await server.setup( - setupDeps - ); + const { + registerOnPreResponse, + server: innerServer, + createRouter, + } = await server.setup(setupDeps); const router = createRouter('/'); router.get({ path: '/', validate: false }, (context, req, res) => res.ok()); @@ -1301,9 +1331,11 @@ describe('OnPreResponse', () => { }); it('cannot change response statusCode', async () => { - const { registerOnPreResponse, server: innerServer, createRouter } = await server.setup( - setupDeps - ); + const { + registerOnPreResponse, + server: innerServer, + createRouter, + } = await server.setup(setupDeps); const router = createRouter('/'); registerOnPreResponse((req, res, t) => { @@ -1319,9 +1351,11 @@ describe('OnPreResponse', () => { }); it('has no access to request body', async () => { - const { registerOnPreResponse, server: innerServer, createRouter } = await server.setup( - setupDeps - ); + const { + registerOnPreResponse, + server: innerServer, + createRouter, + } = await server.setup(setupDeps); const router = createRouter('/'); let requestBody = null; registerOnPreResponse((req, res, t) => { @@ -1354,9 +1388,11 @@ describe('OnPreResponse', () => { }); it('supports rendering a different response body', async () => { - const { registerOnPreResponse, server: innerServer, createRouter } = await server.setup( - setupDeps - ); + const { + registerOnPreResponse, + server: innerServer, + createRouter, + } = await server.setup(setupDeps); const router = createRouter('/'); router.get({ path: '/', validate: false }, (context, req, res) => { @@ -1380,9 +1416,11 @@ describe('OnPreResponse', () => { }); it('supports rendering a different response body + headers', async () => { - const { registerOnPreResponse, server: innerServer, createRouter } = await server.setup( - setupDeps - ); + const { + registerOnPreResponse, + server: innerServer, + createRouter, + } = await server.setup(setupDeps); const router = createRouter('/'); router.get({ path: '/', validate: false }, (context, req, res) => { diff --git a/src/core/server/http/integration_tests/request.test.ts b/src/core/server/http/integration_tests/request.test.ts index 0a30bfac85f5d..a2560c2c39fad 100644 --- a/src/core/server/http/integration_tests/request.test.ts +++ b/src/core/server/http/integration_tests/request.test.ts @@ -245,9 +245,11 @@ describe('KibanaRequest', () => { }); it('does not complete before response has been sent', async () => { - const { server: innerServer, createRouter, registerOnPreAuth } = await server.setup( - setupDeps - ); + const { + server: innerServer, + createRouter, + registerOnPreAuth, + } = await server.setup(setupDeps); const router = createRouter('/'); const nextSpy = jest.fn(); diff --git a/src/core/server/http/integration_tests/router.test.ts b/src/core/server/http/integration_tests/router.test.ts index a3e872ee3ea87..80676b6be6c63 100644 --- a/src/core/server/http/integration_tests/router.test.ts +++ b/src/core/server/http/integration_tests/router.test.ts @@ -64,9 +64,12 @@ describe('Options', () => { }); it('Authenticated user has access to a route', async () => { - const { server: innerServer, createRouter, registerAuth, auth } = await server.setup( - setupDeps - ); + const { + server: innerServer, + createRouter, + registerAuth, + auth, + } = await server.setup(setupDeps); const router = createRouter('/'); registerAuth((req, res, toolkit) => { @@ -91,9 +94,12 @@ describe('Options', () => { }); it('User with no credentials can access a route', async () => { - const { server: innerServer, createRouter, registerAuth, auth } = await server.setup( - setupDeps - ); + const { + server: innerServer, + createRouter, + registerAuth, + auth, + } = await server.setup(setupDeps); const router = createRouter('/'); registerAuth((req, res, toolkit) => toolkit.notHandled()); @@ -117,9 +123,12 @@ describe('Options', () => { }); it('User with invalid credentials can access a route', async () => { - const { server: innerServer, createRouter, registerAuth, auth } = await server.setup( - setupDeps - ); + const { + server: innerServer, + createRouter, + registerAuth, + auth, + } = await server.setup(setupDeps); const router = createRouter('/'); registerAuth((req, res, toolkit) => res.unauthorized()); @@ -143,9 +152,12 @@ describe('Options', () => { }); it('does not redirect user and allows access to a resource', async () => { - const { server: innerServer, createRouter, registerAuth, auth } = await server.setup( - setupDeps - ); + const { + server: innerServer, + createRouter, + registerAuth, + auth, + } = await server.setup(setupDeps); const router = createRouter('/'); registerAuth((req, res, toolkit) => @@ -197,9 +209,12 @@ describe('Options', () => { }); it('Authenticated user has access to a route', async () => { - const { server: innerServer, createRouter, registerAuth, auth } = await server.setup( - setupDeps - ); + const { + server: innerServer, + createRouter, + registerAuth, + auth, + } = await server.setup(setupDeps); const router = createRouter('/'); registerAuth((req, res, toolkit) => { @@ -277,9 +292,12 @@ describe('Options', () => { describe('false', () => { it('does not try to authenticate a user', async () => { - const { server: innerServer, createRouter, registerAuth, auth } = await server.setup( - setupDeps - ); + const { + server: innerServer, + createRouter, + registerAuth, + auth, + } = await server.setup(setupDeps); const router = createRouter('/'); const authHook = jest.fn(); @@ -1844,9 +1862,11 @@ describe('ETag', () => { describe('registerRouterAfterListening', () => { it('allows a router to be registered before server has started listening', async () => { - const { server: innerServer, createRouter, registerRouterAfterListening } = await server.setup( - setupDeps - ); + const { + server: innerServer, + createRouter, + registerRouterAfterListening, + } = await server.setup(setupDeps); const router = createRouter('/'); router.get({ path: '/', validate: false }, (context, req, res) => { @@ -1869,9 +1889,11 @@ describe('registerRouterAfterListening', () => { }); it('allows a router to be registered after server has started listening', async () => { - const { server: innerServer, createRouter, registerRouterAfterListening } = await server.setup( - setupDeps - ); + const { + server: innerServer, + createRouter, + registerRouterAfterListening, + } = await server.setup(setupDeps); const router = createRouter('/'); router.get({ path: '/', validate: false }, (context, req, res) => { diff --git a/src/core/server/http/logging/get_payload_size.test.ts b/src/core/server/http/logging/get_payload_size.test.ts index 30cb547dd98b7..36ef2e9c8e5a0 100644 --- a/src/core/server/http/logging/get_payload_size.test.ts +++ b/src/core/server/http/logging/get_payload_size.test.ts @@ -226,11 +226,11 @@ describe('getPayloadSize', () => { test('always provides content-length header if available', () => { const headers = { 'content-length': '123' }; const result = getResponsePayloadBytes( - ({ + { headers, variety: 'plain', source: 'abc', - } as unknown) as Response, + } as unknown as Response, logger ); expect(result).toBe(123); @@ -238,19 +238,19 @@ describe('getPayloadSize', () => { test('uses first value when hapi header is an array', () => { const headers = { 'content-length': ['123', '456'] }; - const result = getResponsePayloadBytes(({ headers } as unknown) as Response, logger); + const result = getResponsePayloadBytes({ headers } as unknown as Response, logger); expect(result).toBe(123); }); test('returns undefined if length is NaN', () => { const headers = { 'content-length': 'oops' }; - const result = getResponsePayloadBytes(({ headers } as unknown) as Response, logger); + const result = getResponsePayloadBytes({ headers } as unknown as Response, logger); expect(result).toBeUndefined(); }); }); test('defaults to undefined', () => { - const result = getResponsePayloadBytes(({} as unknown) as Response, logger); + const result = getResponsePayloadBytes({} as unknown as Response, logger); expect(result).toBeUndefined(); }); @@ -262,10 +262,10 @@ describe('getPayloadSize', () => { }, }; const result = getResponsePayloadBytes( - ({ + { variety: 'plain', source: payload.circular, - } as unknown) as Response, + } as unknown as Response, logger ); expect(result).toBeUndefined(); @@ -279,10 +279,10 @@ describe('getPayloadSize', () => { }, }; getResponsePayloadBytes( - ({ + { variety: 'plain', source: payload.circular, - } as unknown) as Response, + } as unknown as Response, logger ); expect(logger.warn.mock.calls[0][0]).toMatchInlineSnapshot( diff --git a/src/core/server/http/logging/get_response_log.test.ts b/src/core/server/http/logging/get_response_log.test.ts index 5f749220138d7..df91ae9c1a98b 100644 --- a/src/core/server/http/logging/get_response_log.test.ts +++ b/src/core/server/http/logging/get_response_log.test.ts @@ -40,7 +40,7 @@ function createMockHapiRequest({ query = {}, response = { headers: {}, statusCode: 200 }, }: RequestFixtureOptions = {}): Request { - return ({ + return { auth, body, headers, @@ -50,7 +50,7 @@ function createMockHapiRequest({ path, query, response, - } as unknown) as Request; + } as unknown as Request; } describe('getEcsResponseLog', () => { diff --git a/src/core/server/http/router/error_wrapper.test.ts b/src/core/server/http/router/error_wrapper.test.ts index 53ee3bff61d9d..a25e9bb1df9bc 100644 --- a/src/core/server/http/router/error_wrapper.test.ts +++ b/src/core/server/http/router/error_wrapper.test.ts @@ -11,9 +11,11 @@ import { KibanaResponse, KibanaResponseFactory, kibanaResponseFactory } from './ import { wrapErrors } from './error_wrapper'; import { KibanaRequest, RequestHandler, RequestHandlerContext } from 'kibana/server'; -const createHandler = (handler: () => any): RequestHandler => () => { - return handler(); -}; +const createHandler = + (handler: () => any): RequestHandler => + () => { + return handler(); + }; describe('wrapErrors', () => { let context: RequestHandlerContext; diff --git a/src/core/server/http/router/request.ts b/src/core/server/http/router/request.ts index b9bf5693ab758..d16158bb0fb08 100644 --- a/src/core/server/http/router/request.ts +++ b/src/core/server/http/router/request.ts @@ -237,13 +237,18 @@ export class KibanaRequest< private getRouteInfo(request: Request): KibanaRequestRoute { const method = request.method as Method; - const { parse, maxBytes, allow, output, timeout: payloadTimeout } = - request.route.settings.payload || {}; + const { + parse, + maxBytes, + allow, + output, + timeout: payloadTimeout, + } = request.route.settings.payload || {}; // net.Socket#timeout isn't documented, yet, and isn't part of the types... https://github.com/nodejs/node/pull/34543 // the socket is also undefined when using @hapi/shot, or when a "fake request" is used const socketTimeout = (request.raw.req.socket as any)?.timeout; - const options = ({ + const options = { authRequired: this.getAuthRequired(request), // TypeScript note: Casting to `RouterOptions` to fix the following error: // @@ -268,7 +273,7 @@ export class KibanaRequest< accepts: allow, output: output as typeof validBodyOutput[number], // We do not support all the HAPI-supported outputs and TS complains }, - } as unknown) as KibanaRequestRouteOptions; // TS does not understand this is OK so I'm enforced to do this enforced casting + } as unknown as KibanaRequestRouteOptions; // TS does not understand this is OK so I'm enforced to do this enforced casting return { path: request.path, diff --git a/src/core/server/http/router/response.ts b/src/core/server/http/router/response.ts index 6cea7fcf4c949..331a1ab38f069 100644 --- a/src/core/server/http/router/response.ts +++ b/src/core/server/http/router/response.ts @@ -45,7 +45,8 @@ export function isKibanaResponse(response: Record): response is IKi * @internal */ export class KibanaResponse - implements IKibanaResponse { + implements IKibanaResponse +{ constructor( public readonly status: number, public readonly payload?: T, diff --git a/src/core/server/http/router/router.ts b/src/core/server/http/router/router.ts index 75fcc1bb0e083..d2d8dfa2cc72f 100644 --- a/src/core/server/http/router/router.ts +++ b/src/core/server/http/router/router.ts @@ -203,7 +203,8 @@ function validOptions( * @internal */ export class Router - implements IRouter { + implements IRouter +{ public routes: Array> = []; public get: IRouter['get']; public post: IRouter['post']; @@ -216,25 +217,27 @@ export class Router ) { - const buildMethod = (method: Method) => ( - route: RouteConfig, - handler: RequestHandler - ) => { - const routeSchemas = routeSchemasFromRouteConfig(route, method); - - this.routes.push({ - handler: async (req, responseToolkit) => - await this.handle({ - routeSchemas, - request: req, - responseToolkit, - handler: this.enhanceWithContext(handler), - }), - method, - path: getRouteFullPath(this.routerPath, route.path), - options: validOptions(method, route), - }); - }; + const buildMethod = + (method: Method) => + ( + route: RouteConfig, + handler: RequestHandler + ) => { + const routeSchemas = routeSchemasFromRouteConfig(route, method); + + this.routes.push({ + handler: async (req, responseToolkit) => + await this.handle({ + routeSchemas, + request: req, + responseToolkit, + handler: this.enhanceWithContext(handler), + }), + method, + path: getRouteFullPath(this.routerPath, route.path), + options: validOptions(method, route), + }); + }; this.get = buildMethod('get'); this.post = buildMethod('post'); diff --git a/src/core/server/logging/appenders/rewrite/policies/meta/meta_policy.test.ts b/src/core/server/logging/appenders/rewrite/policies/meta/meta_policy.test.ts index faa026363ed40..f03c5bd9d1f8f 100644 --- a/src/core/server/logging/appenders/rewrite/policies/meta/meta_policy.test.ts +++ b/src/core/server/logging/appenders/rewrite/policies/meta/meta_policy.test.ts @@ -93,10 +93,10 @@ describe('MetaRewritePolicy', () => { it('does not touch anything outside of LogMeta', () => { const policy = createPolicy('update', [{ path: 'a', value: 'bar' }]); const message = Symbol(); - expect( - policy.rewrite(({ message, meta: { a: 'foo' } } as unknown) as LogRecord).message - ).toBe(message); - expect(policy.rewrite(({ message, meta: { a: 'foo' } } as unknown) as LogRecord)) + expect(policy.rewrite({ message, meta: { a: 'foo' } } as unknown as LogRecord).message).toBe( + message + ); + expect(policy.rewrite({ message, meta: { a: 'foo' } } as unknown as LogRecord)) .toMatchInlineSnapshot(` Object { "message": Symbol(), @@ -147,9 +147,9 @@ describe('MetaRewritePolicy', () => { const policy = createPolicy('remove', [{ path: 'message' }]); const message = Symbol(); expect( - policy.rewrite(({ message, meta: { message: 'foo' } } as unknown) as LogRecord).message + policy.rewrite({ message, meta: { message: 'foo' } } as unknown as LogRecord).message ).toBe(message); - expect(policy.rewrite(({ message, meta: { message: 'foo' } } as unknown) as LogRecord)) + expect(policy.rewrite({ message, meta: { message: 'foo' } } as unknown as LogRecord)) .toMatchInlineSnapshot(` Object { "message": Symbol(), diff --git a/src/core/server/logging/logging_system.mock.ts b/src/core/server/logging/logging_system.mock.ts index c74c7d962ff77..1ca778afa31a5 100644 --- a/src/core/server/logging/logging_system.mock.ts +++ b/src/core/server/logging/logging_system.mock.ts @@ -42,7 +42,7 @@ const collectLoggingSystemMock = (loggerFactory: LoggerFactory) => { }; const clearLoggingSystemMock = (loggerFactory: LoggerFactory) => { - const mockedLoggerFactory = (loggerFactory as unknown) as jest.Mocked; + const mockedLoggerFactory = loggerFactory as unknown as jest.Mocked; mockedLoggerFactory.get.mockClear(); mockedLoggerFactory.asLoggerFactory.mockClear(); mockedLoggerFactory.upgrade.mockClear(); diff --git a/src/core/server/logging/logging_system.test.ts b/src/core/server/logging/logging_system.test.ts index 8eed2aecb21d6..dd546d4e7eaca 100644 --- a/src/core/server/logging/logging_system.test.ts +++ b/src/core/server/logging/logging_system.test.ts @@ -24,7 +24,7 @@ const timestamp = new Date(Date.UTC(2012, 1, 1, 14, 33, 22, 11)); let mockConsoleLog: jest.SpyInstance; import { createWriteStream } from 'fs'; -const mockCreateWriteStream = (createWriteStream as unknown) as jest.Mock; +const mockCreateWriteStream = createWriteStream as unknown as jest.Mock; import { LoggingSystem, config } from '.'; diff --git a/src/core/server/metrics/event_loop_delays/event_loop_delays_monitor.mocks.ts b/src/core/server/metrics/event_loop_delays/event_loop_delays_monitor.mocks.ts index ee96668cf3e7c..691bfc5030c93 100644 --- a/src/core/server/metrics/event_loop_delays/event_loop_delays_monitor.mocks.ts +++ b/src/core/server/metrics/event_loop_delays/event_loop_delays_monitor.mocks.ts @@ -32,13 +32,13 @@ function createMockHistogram(overwrites: Partial = {}): Inter function createMockEventLoopDelaysMonitor() { const mockCollect = jest.fn(); - const MockEventLoopDelaysMonitor: jest.MockedClass< - typeof EventLoopDelaysMonitor - > = jest.fn().mockReturnValue({ - collect: mockCollect, - reset: jest.fn(), - stop: jest.fn(), - }); + const MockEventLoopDelaysMonitor: jest.MockedClass = jest + .fn() + .mockReturnValue({ + collect: mockCollect, + reset: jest.fn(), + stop: jest.fn(), + }); mockCollect.mockReturnValue(createMockHistogram()); diff --git a/src/core/server/metrics/logging/get_ops_metrics_log.test.ts b/src/core/server/metrics/logging/get_ops_metrics_log.test.ts index 2d7a6bebf255e..cba188c94c74e 100644 --- a/src/core/server/metrics/logging/get_ops_metrics_log.test.ts +++ b/src/core/server/metrics/logging/get_ops_metrics_log.test.ts @@ -37,7 +37,7 @@ function createMockOpsMetrics(testMetrics: Partial): OpsMetrics { ...testMetrics, }; } -const testMetrics = ({ +const testMetrics = { process: { memory: { heap: { used_in_bytes: 100 } }, uptime_in_millis: 1500, @@ -50,7 +50,7 @@ const testMetrics = ({ '15m': 30, }, }, -} as unknown) as Partial; +} as unknown as Partial; describe('getEcsOpsMetricsLog', () => { it('provides correctly formatted message', () => { @@ -67,11 +67,11 @@ describe('getEcsOpsMetricsLog', () => { it('excludes values from the message if unavailable', () => { const baseMetrics = createBaseOpsMetrics(); - const missingMetrics = ({ + const missingMetrics = { ...baseMetrics, process: {}, os: {}, - } as unknown) as OpsMetrics; + } as unknown as OpsMetrics; const logMeta = getEcsOpsMetricsLog(missingMetrics); expect(logMeta.message).toMatchInlineSnapshot(`""`); }); diff --git a/src/core/server/metrics/metrics_service.ts b/src/core/server/metrics/metrics_service.ts index 78e4dd98f93d6..8e9604b50fb57 100644 --- a/src/core/server/metrics/metrics_service.ts +++ b/src/core/server/metrics/metrics_service.ts @@ -23,7 +23,8 @@ interface MetricsServiceSetupDeps { /** @internal */ export class MetricsService - implements CoreService { + implements CoreService +{ private readonly logger: Logger; private readonly opsMetricsLogger: Logger; private metricsCollector?: OpsMetricsCollector; diff --git a/src/core/server/plugins/discovery/plugins_discovery.test.ts b/src/core/server/plugins/discovery/plugins_discovery.test.ts index 15e53b0a34f7b..958e051d0476d 100644 --- a/src/core/server/plugins/discovery/plugins_discovery.test.ts +++ b/src/core/server/plugins/discovery/plugins_discovery.test.ts @@ -417,9 +417,8 @@ describe('plugins discovery system', () => { [`${KIBANA_ROOT}/src/plugins/sub1/sub2/sub3/plugin`]: Plugins.valid('plugin3'), [`${KIBANA_ROOT}/src/plugins/sub1/sub2/sub3/sub4/plugin`]: Plugins.valid('plugin4'), [`${KIBANA_ROOT}/src/plugins/sub1/sub2/sub3/sub4/sub5/plugin`]: Plugins.valid('plugin5'), - [`${KIBANA_ROOT}/src/plugins/sub1/sub2/sub3/sub4/sub5/sub6/plugin`]: Plugins.valid( - 'plugin6' - ), + [`${KIBANA_ROOT}/src/plugins/sub1/sub2/sub3/sub4/sub5/sub6/plugin`]: + Plugins.valid('plugin6'), }, { createCwd: false } ); diff --git a/src/core/server/plugins/discovery/scan_plugin_search_paths.test.ts b/src/core/server/plugins/discovery/scan_plugin_search_paths.test.ts index 8c5e1f256aaa0..548c479975ddf 100644 --- a/src/core/server/plugins/discovery/scan_plugin_search_paths.test.ts +++ b/src/core/server/plugins/discovery/scan_plugin_search_paths.test.ts @@ -196,9 +196,8 @@ describe('scanPluginSearchPaths', () => { [`${KIBANA_ROOT}/src/plugins/sub1/sub2/sub3/plugin`]: Plugins.valid('plugin3'), [`${KIBANA_ROOT}/src/plugins/sub1/sub2/sub3/sub4/plugin`]: Plugins.valid('plugin4'), [`${KIBANA_ROOT}/src/plugins/sub1/sub2/sub3/sub4/sub5/plugin`]: Plugins.valid('plugin5'), - [`${KIBANA_ROOT}/src/plugins/sub1/sub2/sub3/sub4/sub5/sub6/plugin`]: Plugins.valid( - 'plugin6' - ), + [`${KIBANA_ROOT}/src/plugins/sub1/sub2/sub3/sub4/sub5/sub6/plugin`]: + Plugins.valid('plugin6'), }, { createCwd: false } ); diff --git a/src/core/server/saved_objects/import/import_saved_objects.test.ts b/src/core/server/saved_objects/import/import_saved_objects.test.ts index 792858b53b5ea..cf30d6c803933 100644 --- a/src/core/server/saved_objects/import/import_saved_objects.test.ts +++ b/src/core/server/saved_objects/import/import_saved_objects.test.ts @@ -69,7 +69,7 @@ describe('#importSavedObjectsFromStream', () => { let readStream: Readable; const objectLimit = 10; - const overwrite = (Symbol() as unknown) as boolean; + const overwrite = Symbol() as unknown as boolean; let savedObjectsClient: jest.Mocked; let typeRegistry: jest.Mocked; const namespace = 'some-namespace'; diff --git a/src/core/server/saved_objects/import/lib/check_conflicts.test.ts b/src/core/server/saved_objects/import/lib/check_conflicts.test.ts index 3370dda05f68b..6ab37b0122e4b 100644 --- a/src/core/server/saved_objects/import/lib/check_conflicts.test.ts +++ b/src/core/server/saved_objects/import/lib/check_conflicts.test.ts @@ -23,7 +23,7 @@ const createObject = (type: string, id: string): SavedObjectType => ({ type, id, attributes: { title: 'some-title' }, - references: (Symbol() as unknown) as SavedObjectReference[], + references: Symbol() as unknown as SavedObjectReference[], }); const getResultMock = { diff --git a/src/core/server/saved_objects/import/lib/check_origin_conflicts.test.ts b/src/core/server/saved_objects/import/lib/check_origin_conflicts.test.ts index 011e5500b8d9c..03d94492e7ec8 100644 --- a/src/core/server/saved_objects/import/lib/check_origin_conflicts.test.ts +++ b/src/core/server/saved_objects/import/lib/check_origin_conflicts.test.ts @@ -34,7 +34,7 @@ const createObject = ( type, id, attributes: { title: `Title for ${type}:${id}` }, - references: (Symbol() as unknown) as SavedObjectReference[], + references: Symbol() as unknown as SavedObjectReference[], ...(originId && { originId }), ...(updatedAt && { updated_at: updatedAt }), }); diff --git a/src/core/server/saved_objects/import/lib/create_saved_objects.test.ts b/src/core/server/saved_objects/import/lib/create_saved_objects.test.ts index 8c5d05b253f11..38372e8fad6fd 100644 --- a/src/core/server/saved_objects/import/lib/create_saved_objects.test.ts +++ b/src/core/server/saved_objects/import/lib/create_saved_objects.test.ts @@ -120,7 +120,7 @@ describe('#createSavedObjects', () => { }), conflict: (type: string, id: string) => { const error = SavedObjectsErrorHelpers.createConflictError(type, id).output.payload; - return ({ type, id, error } as unknown) as SavedObject; + return { type, id, error } as unknown as SavedObject; }, unresolvableConflict: (type: string, id: string) => { const conflictMock = getResultMock.conflict(type, id); @@ -253,7 +253,7 @@ describe('#createSavedObjects', () => { expectBulkCreateArgs.objects(1, argObjs); }; const testBulkCreateOptions = async (namespace?: string) => { - const overwrite = (Symbol() as unknown) as boolean; + const overwrite = Symbol() as unknown as boolean; const options = setupParams({ objects: objs, namespace, overwrite }); setupMockResults(options); diff --git a/src/core/server/saved_objects/import/lib/regenerate_ids.test.ts b/src/core/server/saved_objects/import/lib/regenerate_ids.test.ts index e70476205f03c..2696a52e0554f 100644 --- a/src/core/server/saved_objects/import/lib/regenerate_ids.test.ts +++ b/src/core/server/saved_objects/import/lib/regenerate_ids.test.ts @@ -11,11 +11,11 @@ import { regenerateIds } from './regenerate_ids'; import { SavedObject } from '../../types'; describe('#regenerateIds', () => { - const objects = ([ + const objects = [ { type: 'foo', id: '1' }, { type: 'bar', id: '2' }, { type: 'baz', id: '3' }, - ] as any) as SavedObject[]; + ] as any as SavedObject[]; test('returns expected values', () => { mockUuidv4 diff --git a/src/core/server/saved_objects/import/resolve_import_errors.test.ts b/src/core/server/saved_objects/import/resolve_import_errors.test.ts index 3d4e95cf709db..d7d7544baafcb 100644 --- a/src/core/server/saved_objects/import/resolve_import_errors.test.ts +++ b/src/core/server/saved_objects/import/resolve_import_errors.test.ts @@ -259,7 +259,7 @@ describe('#importSavedObjectsFromStream', () => { }); test('checks conflicts', async () => { - const createNewCopies = (Symbol() as unknown) as boolean; + const createNewCopies = Symbol() as unknown as boolean; const retries = [createRetry()]; const options = setupOptions({ retries, createNewCopies }); const collectedObjects = [createObject()]; @@ -282,7 +282,7 @@ describe('#importSavedObjectsFromStream', () => { test('gets import ID map for retries', async () => { const retries = [createRetry()]; - const createNewCopies = (Symbol() as unknown) as boolean; + const createNewCopies = Symbol() as unknown as boolean; const options = setupOptions({ retries, createNewCopies }); const filteredObjects = [createObject()]; getMockFn(checkConflicts).mockResolvedValue({ diff --git a/src/core/server/saved_objects/migrations/mocks.ts b/src/core/server/saved_objects/migrations/mocks.ts index ef806aa5f0fca..4bd4e2a1e52fd 100644 --- a/src/core/server/saved_objects/migrations/mocks.ts +++ b/src/core/server/saved_objects/migrations/mocks.ts @@ -9,17 +9,18 @@ import { SavedObjectMigrationContext } from './types'; import { SavedObjectsMigrationLogger } from './core'; -export const createSavedObjectsMigrationLoggerMock = (): jest.Mocked => { - const mock = { - debug: jest.fn(), - info: jest.fn(), - warning: jest.fn(), - warn: jest.fn(), - error: jest.fn(), - }; +export const createSavedObjectsMigrationLoggerMock = + (): jest.Mocked => { + const mock = { + debug: jest.fn(), + info: jest.fn(), + warning: jest.fn(), + warn: jest.fn(), + error: jest.fn(), + }; - return mock; -}; + return mock; + }; const createContextMock = ({ migrationVersion = '8.0.0', diff --git a/src/core/server/saved_objects/migrationsv2/actions/bulk_overwrite_transformed_documents.ts b/src/core/server/saved_objects/migrationsv2/actions/bulk_overwrite_transformed_documents.ts index 82f642b928058..9353ede9be6ac 100644 --- a/src/core/server/saved_objects/migrationsv2/actions/bulk_overwrite_transformed_documents.ts +++ b/src/core/server/saved_objects/migrationsv2/actions/bulk_overwrite_transformed_documents.ts @@ -56,68 +56,70 @@ export interface BulkOverwriteTransformedDocumentsParams { * Write the up-to-date transformed documents to the index, overwriting any * documents that are still on their outdated version. */ -export const bulkOverwriteTransformedDocuments = ({ - client, - index, - transformedDocs, - refresh = false, -}: BulkOverwriteTransformedDocumentsParams): TaskEither.TaskEither< - | RetryableEsClientError - | TargetIndexHadWriteBlock - | IndexNotFound - | RequestEntityTooLargeException, - 'bulk_index_succeeded' -> => () => { - const body = transformedDocs.flatMap((doc) => { - return createBulkOperationBody(doc, index); - }); +export const bulkOverwriteTransformedDocuments = + ({ + client, + index, + transformedDocs, + refresh = false, + }: BulkOverwriteTransformedDocumentsParams): TaskEither.TaskEither< + | RetryableEsClientError + | TargetIndexHadWriteBlock + | IndexNotFound + | RequestEntityTooLargeException, + 'bulk_index_succeeded' + > => + () => { + const body = transformedDocs.flatMap((doc) => { + return createBulkOperationBody(doc, index); + }); - return client - .bulk({ - // Because we only add aliases in the MARK_VERSION_INDEX_READY step we - // can't bulkIndex to an alias with require_alias=true. This means if - // users tamper during this operation (delete indices or restore a - // snapshot), we could end up auto-creating an index without the correct - // mappings. Such tampering could lead to many other problems and is - // probably unlikely so for now we'll accept this risk and wait till - // system indices puts in place a hard control. - require_alias: false, - wait_for_active_shards: WAIT_FOR_ALL_SHARDS_TO_BE_ACTIVE, - refresh, - filter_path: ['items.*.error'], - body, - }) - .then((res) => { - // Filter out version_conflict_engine_exception since these just mean - // that another instance already updated these documents - const errors = (res.body.items ?? []) - .filter((item) => item.index?.error) - .map((item) => item.index!.error!) - .filter(({ type }) => type !== 'version_conflict_engine_exception'); + return client + .bulk({ + // Because we only add aliases in the MARK_VERSION_INDEX_READY step we + // can't bulkIndex to an alias with require_alias=true. This means if + // users tamper during this operation (delete indices or restore a + // snapshot), we could end up auto-creating an index without the correct + // mappings. Such tampering could lead to many other problems and is + // probably unlikely so for now we'll accept this risk and wait till + // system indices puts in place a hard control. + require_alias: false, + wait_for_active_shards: WAIT_FOR_ALL_SHARDS_TO_BE_ACTIVE, + refresh, + filter_path: ['items.*.error'], + body, + }) + .then((res) => { + // Filter out version_conflict_engine_exception since these just mean + // that another instance already updated these documents + const errors = (res.body.items ?? []) + .filter((item) => item.index?.error) + .map((item) => item.index!.error!) + .filter(({ type }) => type !== 'version_conflict_engine_exception'); - if (errors.length === 0) { - return Either.right('bulk_index_succeeded' as const); - } else { - if (errors.every(isWriteBlockException)) { - return Either.left({ - type: 'target_index_had_write_block' as const, - }); + if (errors.length === 0) { + return Either.right('bulk_index_succeeded' as const); + } else { + if (errors.every(isWriteBlockException)) { + return Either.left({ + type: 'target_index_had_write_block' as const, + }); + } + if (errors.every(isIndexNotFoundException)) { + return Either.left({ + type: 'index_not_found_exception' as const, + index, + }); + } + throw new Error(JSON.stringify(errors)); } - if (errors.every(isIndexNotFoundException)) { - return Either.left({ - type: 'index_not_found_exception' as const, - index, - }); + }) + .catch((error) => { + if (error instanceof esErrors.ResponseError && error.statusCode === 413) { + return Either.left({ type: 'request_entity_too_large_exception' as const }); + } else { + throw error; } - throw new Error(JSON.stringify(errors)); - } - }) - .catch((error) => { - if (error instanceof esErrors.ResponseError && error.statusCode === 413) { - return Either.left({ type: 'request_entity_too_large_exception' as const }); - } else { - throw error; - } - }) - .catch(catchRetryableEsClientErrors); -}; + }) + .catch(catchRetryableEsClientErrors); + }; diff --git a/src/core/server/saved_objects/migrationsv2/actions/calculate_exclude_filters.ts b/src/core/server/saved_objects/migrationsv2/actions/calculate_exclude_filters.ts index 9d57db079e33e..9ba098d01870f 100644 --- a/src/core/server/saved_objects/migrationsv2/actions/calculate_exclude_filters.ts +++ b/src/core/server/saved_objects/migrationsv2/actions/calculate_exclude_filters.ts @@ -28,80 +28,82 @@ export interface CalculatedExcludeFilter { errorsByType: Record; } -export const calculateExcludeFilters = ({ - client, - excludeFromUpgradeFilterHooks, - hookTimeoutMs = 30_000, // default to 30s, exposed for testing -}: CalculateExcludeFiltersParams): TaskEither.TaskEither< - RetryableEsClientError, - CalculatedExcludeFilter -> => () => { - return Promise.all< - | Either.Right - | Either.Left<{ soType: string; error: Error | RetryableEsClientError }> - >( - Object.entries(excludeFromUpgradeFilterHooks).map(([soType, hook]) => - withTimeout({ - promise: Promise.resolve( - hook({ readonlyEsClient: { search: client.search.bind(client) } }) - ), - timeoutMs: hookTimeoutMs, - }) - .then((result) => - result.timedout - ? Either.left({ +export const calculateExcludeFilters = + ({ + client, + excludeFromUpgradeFilterHooks, + hookTimeoutMs = 30_000, // default to 30s, exposed for testing + }: CalculateExcludeFiltersParams): TaskEither.TaskEither< + RetryableEsClientError, + CalculatedExcludeFilter + > => + () => { + return Promise.all< + | Either.Right + | Either.Left<{ soType: string; error: Error | RetryableEsClientError }> + >( + Object.entries(excludeFromUpgradeFilterHooks).map(([soType, hook]) => + withTimeout({ + promise: Promise.resolve( + hook({ readonlyEsClient: { search: client.search.bind(client) } }) + ), + timeoutMs: hookTimeoutMs, + }) + .then((result) => + result.timedout + ? Either.left({ + soType, + error: new Error( + `excludeFromUpgrade hook timed out after ${hookTimeoutMs / 1000} seconds.` + ), + }) + : Either.right(result.value) + ) + .catch((error) => { + const retryableError = catchRetryableEsClientErrors(error); + if (Either.isLeft(retryableError)) { + return Either.left({ soType, error: retryableError.left }); + } else { + // Really should never happen, only here to satisfy TypeScript + return Either.left({ soType, error: new Error( - `excludeFromUpgrade hook timed out after ${hookTimeoutMs / 1000} seconds.` + `Unexpected return value from catchRetryableEsClientErrors: "${retryableError.toString()}"` ), - }) - : Either.right(result.value) - ) - .catch((error) => { - const retryableError = catchRetryableEsClientErrors(error); - if (Either.isLeft(retryableError)) { - return Either.left({ soType, error: retryableError.left }); - } else { - // Really should never happen, only here to satisfy TypeScript - return Either.left({ - soType, - error: new Error( - `Unexpected return value from catchRetryableEsClientErrors: "${retryableError.toString()}"` - ), - }); - } - }) - .catch((error: Error) => Either.left({ soType, error })) - ) - ).then((results) => { - const retryableError = results.find( - (r) => - Either.isLeft(r) && - !(r.left.error instanceof Error) && - r.left.error.type === 'retryable_es_client_error' - ) as Either.Left<{ soType: string; error: RetryableEsClientError }> | undefined; - if (retryableError) { - return Either.left(retryableError.left.error); - } + }); + } + }) + .catch((error: Error) => Either.left({ soType, error })) + ) + ).then((results) => { + const retryableError = results.find( + (r) => + Either.isLeft(r) && + !(r.left.error instanceof Error) && + r.left.error.type === 'retryable_es_client_error' + ) as Either.Left<{ soType: string; error: RetryableEsClientError }> | undefined; + if (retryableError) { + return Either.left(retryableError.left.error); + } - const errorsByType: Array<[string, Error]> = []; - const filters: estypes.QueryDslQueryContainer[] = []; + const errorsByType: Array<[string, Error]> = []; + const filters: estypes.QueryDslQueryContainer[] = []; - // Loop through all results and collect successes and errors - results.forEach((r) => - Either.isRight(r) - ? filters.push(r.right) - : Either.isLeft(r) && errorsByType.push([r.left.soType, r.left.error as Error]) - ); + // Loop through all results and collect successes and errors + results.forEach((r) => + Either.isRight(r) + ? filters.push(r.right) + : Either.isLeft(r) && errorsByType.push([r.left.soType, r.left.error as Error]) + ); - // Composite filter from all calculated filters that successfully executed - const excludeFilter: estypes.QueryDslQueryContainer = { - bool: { must_not: filters }, - }; + // Composite filter from all calculated filters that successfully executed + const excludeFilter: estypes.QueryDslQueryContainer = { + bool: { must_not: filters }, + }; - return Either.right({ - excludeFilter, - errorsByType: Object.fromEntries(errorsByType), + return Either.right({ + excludeFilter, + errorsByType: Object.fromEntries(errorsByType), + }); }); - }); -}; + }; diff --git a/src/core/server/saved_objects/migrationsv2/actions/check_for_unknown_docs.ts b/src/core/server/saved_objects/migrationsv2/actions/check_for_unknown_docs.ts index e3d72fbdf866f..1db47f0083467 100644 --- a/src/core/server/saved_objects/migrationsv2/actions/check_for_unknown_docs.ts +++ b/src/core/server/saved_objects/migrationsv2/actions/check_for_unknown_docs.ts @@ -35,32 +35,31 @@ export interface UnknownDocsFound { unknownDocs: CheckForUnknownDocsFoundDoc[]; } -export const checkForUnknownDocs = ({ - client, - indexName, - unusedTypesQuery, - knownTypes, -}: CheckForUnknownDocsParams): TaskEither.TaskEither< - RetryableEsClientError, - UnknownDocsFound -> => () => { - const query = createUnknownDocQuery(unusedTypesQuery, knownTypes); +export const checkForUnknownDocs = + ({ + client, + indexName, + unusedTypesQuery, + knownTypes, + }: CheckForUnknownDocsParams): TaskEither.TaskEither => + () => { + const query = createUnknownDocQuery(unusedTypesQuery, knownTypes); - return client - .search({ - index: indexName, - body: { - query, - }, - }) - .then((response) => { - const { hits } = response.body.hits; - return Either.right({ - unknownDocs: hits.map((hit) => ({ id: hit._id, type: hit._source?.type ?? 'unknown' })), - }); - }) - .catch(catchRetryableEsClientErrors); -}; + return client + .search({ + index: indexName, + body: { + query, + }, + }) + .then((response) => { + const { hits } = response.body.hits; + return Either.right({ + unknownDocs: hits.map((hit) => ({ id: hit._id, type: hit._source?.type ?? 'unknown' })), + }); + }) + .catch(catchRetryableEsClientErrors); + }; const createUnknownDocQuery = ( unusedTypesQuery: estypes.QueryDslQueryContainer, diff --git a/src/core/server/saved_objects/migrationsv2/actions/close_pit.ts b/src/core/server/saved_objects/migrationsv2/actions/close_pit.ts index d421950c839e2..9dd7f1d22386f 100644 --- a/src/core/server/saved_objects/migrationsv2/actions/close_pit.ts +++ b/src/core/server/saved_objects/migrationsv2/actions/close_pit.ts @@ -23,19 +23,18 @@ export interface ClosePitParams { * Closes PIT. * See https://www.elastic.co/guide/en/elasticsearch/reference/current/point-in-time-api.html * */ -export const closePit = ({ - client, - pitId, -}: ClosePitParams): TaskEither.TaskEither => () => { - return client - .closePointInTime({ - body: { id: pitId }, - }) - .then((response) => { - if (!response.body.succeeded) { - throw new Error(`Failed to close PointInTime with id: ${pitId}`); - } - return Either.right({}); - }) - .catch(catchRetryableEsClientErrors); -}; +export const closePit = + ({ client, pitId }: ClosePitParams): TaskEither.TaskEither => + () => { + return client + .closePointInTime({ + body: { id: pitId }, + }) + .then((response) => { + if (!response.body.succeeded) { + throw new Error(`Failed to close PointInTime with id: ${pitId}`); + } + return Either.right({}); + }) + .catch(catchRetryableEsClientErrors); + }; diff --git a/src/core/server/saved_objects/migrationsv2/actions/create_index.ts b/src/core/server/saved_objects/migrationsv2/actions/create_index.ts index 8e5042a5ff8fe..d5269233344c3 100644 --- a/src/core/server/saved_objects/migrationsv2/actions/create_index.ts +++ b/src/core/server/saved_objects/migrationsv2/actions/create_index.ts @@ -55,74 +55,72 @@ export const createIndex = ({ mappings, aliases = [], }: CreateIndexParams): TaskEither.TaskEither => { - const createIndexTask: TaskEither.TaskEither< - RetryableEsClientError, - AcknowledgeResponse - > = () => { - const aliasesObject = aliasArrayToRecord(aliases); + const createIndexTask: TaskEither.TaskEither = + () => { + const aliasesObject = aliasArrayToRecord(aliases); - return client.indices - .create( - { - index: indexName, - // wait until all shards are available before creating the index - // (since number_of_shards=1 this does not have any effect atm) - wait_for_active_shards: WAIT_FOR_ALL_SHARDS_TO_BE_ACTIVE, - // Wait up to 60s for the cluster state to update and all shards to be - // started - timeout: DEFAULT_TIMEOUT, - body: { - mappings, - aliases: aliasesObject, - settings: { - index: { - // ES rule of thumb: shards should be several GB to 10's of GB, so - // Kibana is unlikely to cross that limit. - number_of_shards: 1, - auto_expand_replicas: INDEX_AUTO_EXPAND_REPLICAS, - // Set an explicit refresh interval so that we don't inherit the - // value from incorrectly configured index templates (not required - // after we adopt system indices) - refresh_interval: '1s', - // Bump priority so that recovery happens before newer indices - priority: 10, + return client.indices + .create( + { + index: indexName, + // wait until all shards are available before creating the index + // (since number_of_shards=1 this does not have any effect atm) + wait_for_active_shards: WAIT_FOR_ALL_SHARDS_TO_BE_ACTIVE, + // Wait up to 60s for the cluster state to update and all shards to be + // started + timeout: DEFAULT_TIMEOUT, + body: { + mappings, + aliases: aliasesObject, + settings: { + index: { + // ES rule of thumb: shards should be several GB to 10's of GB, so + // Kibana is unlikely to cross that limit. + number_of_shards: 1, + auto_expand_replicas: INDEX_AUTO_EXPAND_REPLICAS, + // Set an explicit refresh interval so that we don't inherit the + // value from incorrectly configured index templates (not required + // after we adopt system indices) + refresh_interval: '1s', + // Bump priority so that recovery happens before newer indices + priority: 10, + }, }, }, }, - }, - { maxRetries: 0 /** handle retry ourselves for now */ } - ) - .then((res) => { - /** - * - acknowledged=false, we timed out before the cluster state was - * updated on all nodes with the newly created index, but it - * probably will be created sometime soon. - * - shards_acknowledged=false, we timed out before all shards were - * started - * - acknowledged=true, shards_acknowledged=true, index creation complete - */ - return Either.right({ - acknowledged: res.body.acknowledged, - shardsAcknowledged: res.body.shards_acknowledged, - }); - }) - .catch((error) => { - if (error?.body?.error?.type === 'resource_already_exists_exception') { + { maxRetries: 0 /** handle retry ourselves for now */ } + ) + .then((res) => { /** - * If the target index already exists it means a previous create - * operation had already been started. However, we can't be sure - * that all shards were started so return shardsAcknowledged: false + * - acknowledged=false, we timed out before the cluster state was + * updated on all nodes with the newly created index, but it + * probably will be created sometime soon. + * - shards_acknowledged=false, we timed out before all shards were + * started + * - acknowledged=true, shards_acknowledged=true, index creation complete */ return Either.right({ - acknowledged: true, - shardsAcknowledged: false, + acknowledged: res.body.acknowledged, + shardsAcknowledged: res.body.shards_acknowledged, }); - } else { - throw error; - } - }) - .catch(catchRetryableEsClientErrors); - }; + }) + .catch((error) => { + if (error?.body?.error?.type === 'resource_already_exists_exception') { + /** + * If the target index already exists it means a previous create + * operation had already been started. However, we can't be sure + * that all shards were started so return shardsAcknowledged: false + */ + return Either.right({ + acknowledged: true, + shardsAcknowledged: false, + }); + } else { + throw error; + } + }) + .catch(catchRetryableEsClientErrors); + }; return pipe( createIndexTask, diff --git a/src/core/server/saved_objects/migrationsv2/actions/fetch_indices.ts b/src/core/server/saved_objects/migrationsv2/actions/fetch_indices.ts index 3847252eb6db1..1256b2d858906 100644 --- a/src/core/server/saved_objects/migrationsv2/actions/fetch_indices.ts +++ b/src/core/server/saved_objects/migrationsv2/actions/fetch_indices.ts @@ -28,10 +28,11 @@ export interface FetchIndicesParams { * Fetches information about the given indices including aliases, mappings and * settings. */ -export const fetchIndices = ({ - client, - indices, -}: FetchIndicesParams): TaskEither.TaskEither => +export const fetchIndices = + ({ + client, + indices, + }: FetchIndicesParams): TaskEither.TaskEither => // @ts-expect-error @elastic/elasticsearch IndexState.alias and IndexState.mappings should be required () => { return client.indices diff --git a/src/core/server/saved_objects/migrationsv2/actions/integration_tests/actions.test.ts b/src/core/server/saved_objects/migrationsv2/actions/integration_tests/actions.test.ts index 0ae6464f2623d..936746ddc6930 100644 --- a/src/core/server/saved_objects/migrationsv2/actions/integration_tests/actions.test.ts +++ b/src/core/server/saved_objects/migrationsv2/actions/integration_tests/actions.test.ts @@ -82,13 +82,13 @@ describe('migration actions', () => { properties: {}, }, })(); - const sourceDocs = ([ + const sourceDocs = [ { _source: { title: 'doc 1' } }, { _source: { title: 'doc 2' } }, { _source: { title: 'doc 3' } }, { _source: { title: 'saved object 4', type: 'another_unused_type' } }, { _source: { title: 'f-agent-event 5', type: 'f_agent_event' } }, - ] as unknown) as SavedObjectsRawDoc[]; + ] as unknown as SavedObjectsRawDoc[]; await bulkOverwriteTransformedDocuments({ client, index: 'existing_index_with_docs', @@ -182,12 +182,12 @@ describe('migration actions', () => { expect.assertions(1); const task = setWriteBlock({ client, index: 'new_index_without_write_block' }); await task(); - const sourceDocs = ([ + const sourceDocs = [ { _source: { title: 'doc 1' } }, { _source: { title: 'doc 2' } }, { _source: { title: 'doc 3' } }, { _source: { title: 'doc 4' } }, - ] as unknown) as SavedObjectsRawDoc[]; + ] as unknown as SavedObjectsRawDoc[]; const res = (await bulkOverwriteTransformedDocuments({ client, @@ -452,11 +452,13 @@ describe('migration actions', () => { } `); - const results = ((await searchForOutdatedDocuments(client, { - batchSize: 1000, - targetIndex: 'reindex_target', - outdatedDocumentsQuery: undefined, - })()) as Either.Right).right.outdatedDocuments; + const results = ( + (await searchForOutdatedDocuments(client, { + batchSize: 1000, + targetIndex: 'reindex_target', + outdatedDocumentsQuery: undefined, + })()) as Either.Right + ).right.outdatedDocuments; expect(results.map((doc) => doc._source.title).sort()).toMatchInlineSnapshot(` Array [ "doc 1", @@ -490,11 +492,13 @@ describe('migration actions', () => { } `); - const results = ((await searchForOutdatedDocuments(client, { - batchSize: 1000, - targetIndex: 'reindex_target_excluded_docs', - outdatedDocumentsQuery: undefined, - })()) as Either.Right).right.outdatedDocuments; + const results = ( + (await searchForOutdatedDocuments(client, { + batchSize: 1000, + targetIndex: 'reindex_target_excluded_docs', + outdatedDocumentsQuery: undefined, + })()) as Either.Right + ).right.outdatedDocuments; expect(results.map((doc) => doc._source.title).sort()).toMatchInlineSnapshot(` Array [ "doc 1", @@ -520,11 +524,13 @@ describe('migration actions', () => { "right": "reindex_succeeded", } `); - const results = ((await searchForOutdatedDocuments(client, { - batchSize: 1000, - targetIndex: 'reindex_target_2', - outdatedDocumentsQuery: undefined, - })()) as Either.Right).right.outdatedDocuments; + const results = ( + (await searchForOutdatedDocuments(client, { + batchSize: 1000, + targetIndex: 'reindex_target_2', + outdatedDocumentsQuery: undefined, + })()) as Either.Right + ).right.outdatedDocuments; expect(results.map((doc) => doc._source.title).sort()).toMatchInlineSnapshot(` Array [ "doc 1_updated", @@ -572,11 +578,13 @@ describe('migration actions', () => { `); // Assert that documents weren't overridden by the second, unscripted reindex - const results = ((await searchForOutdatedDocuments(client, { - batchSize: 1000, - targetIndex: 'reindex_target_3', - outdatedDocumentsQuery: undefined, - })()) as Either.Right).right.outdatedDocuments; + const results = ( + (await searchForOutdatedDocuments(client, { + batchSize: 1000, + targetIndex: 'reindex_target_3', + outdatedDocumentsQuery: undefined, + })()) as Either.Right + ).right.outdatedDocuments; expect(results.map((doc) => doc._source.title).sort()).toMatchInlineSnapshot(` Array [ "doc 1_updated", @@ -592,11 +600,13 @@ describe('migration actions', () => { // Simulate a reindex that only adds some of the documents from the // source index into the target index await createIndex({ client, indexName: 'reindex_target_4', mappings: { properties: {} } })(); - const sourceDocs = ((await searchForOutdatedDocuments(client, { - batchSize: 1000, - targetIndex: 'existing_index_with_docs', - outdatedDocumentsQuery: undefined, - })()) as Either.Right).right.outdatedDocuments + const sourceDocs = ( + (await searchForOutdatedDocuments(client, { + batchSize: 1000, + targetIndex: 'existing_index_with_docs', + outdatedDocumentsQuery: undefined, + })()) as Either.Right + ).right.outdatedDocuments .slice(0, 2) .map(({ _id, _source }) => ({ _id, @@ -627,11 +637,13 @@ describe('migration actions', () => { `); // Assert that existing documents weren't overridden, but that missing // documents were added by the reindex - const results = ((await searchForOutdatedDocuments(client, { - batchSize: 1000, - targetIndex: 'reindex_target_4', - outdatedDocumentsQuery: undefined, - })()) as Either.Right).right.outdatedDocuments; + const results = ( + (await searchForOutdatedDocuments(client, { + batchSize: 1000, + targetIndex: 'reindex_target_4', + outdatedDocumentsQuery: undefined, + })()) as Either.Right + ).right.outdatedDocuments; expect(results.map((doc) => doc._source.title).sort()).toMatchInlineSnapshot(` Array [ "doc 1", @@ -1106,8 +1118,9 @@ describe('migration actions', () => { outdatedDocuments: originalDocs, }); - const resultsWithProcessDocs = ((await transformTask()) as Either.Right) - .right.processedDocs; + const resultsWithProcessDocs = ( + (await transformTask()) as Either.Right + ).right.processedDocs; expect(resultsWithProcessDocs.length).toEqual(2); const foo2 = resultsWithProcessDocs.find((h) => h._id === 'foo:2'); expect(foo2?._source?.value).toBe(3); @@ -1130,7 +1143,8 @@ describe('migration actions', () => { // We can't do a snapshot match because the response includes an index // id which ES assigns dynamically await expect(task()).rejects.toMatchObject({ - message: /pickupUpdatedMappings task failed with the following failures:\n\[\{\"index\":\"existing_index_with_write_block\"/, + message: + /pickupUpdatedMappings task failed with the following failures:\n\[\{\"index\":\"existing_index_with_write_block\"/, }); }); it('rejects if there is an error', async () => { @@ -1202,12 +1216,12 @@ describe('migration actions', () => { properties: {}, }, })(); - const sourceDocs = ([ + const sourceDocs = [ { _source: { title: 'doc 1' } }, { _source: { title: 'doc 2' } }, { _source: { title: 'doc 3' } }, { _source: { title: 'doc 4' } }, - ] as unknown) as SavedObjectsRawDoc[]; + ] as unknown as SavedObjectsRawDoc[]; await bulkOverwriteTransformedDocuments({ client, index: 'existing_index_without_mappings', @@ -1216,13 +1230,15 @@ describe('migration actions', () => { })(); // Assert that we can't search over the unmapped fields of the document - const originalSearchResults = ((await searchForOutdatedDocuments(client, { - batchSize: 1000, - targetIndex: 'existing_index_without_mappings', - outdatedDocumentsQuery: { - match: { title: { query: 'doc' } }, - }, - })()) as Either.Right).right.outdatedDocuments; + const originalSearchResults = ( + (await searchForOutdatedDocuments(client, { + batchSize: 1000, + targetIndex: 'existing_index_without_mappings', + outdatedDocumentsQuery: { + match: { title: { query: 'doc' } }, + }, + })()) as Either.Right + ).right.outdatedDocuments; expect(originalSearchResults.length).toBe(0); // Update and pickup mappings so that the title field is searchable @@ -1240,13 +1256,15 @@ describe('migration actions', () => { await waitForPickupUpdatedMappingsTask({ client, taskId, timeout: '60s' })(); // Repeat the search expecting to be able to find the existing documents - const pickedUpSearchResults = ((await searchForOutdatedDocuments(client, { - batchSize: 1000, - targetIndex: 'existing_index_without_mappings', - outdatedDocumentsQuery: { - match: { title: { query: 'doc' } }, - }, - })()) as Either.Right).right.outdatedDocuments; + const pickedUpSearchResults = ( + (await searchForOutdatedDocuments(client, { + batchSize: 1000, + targetIndex: 'existing_index_without_mappings', + outdatedDocumentsQuery: { + match: { title: { query: 'doc' } }, + }, + })()) as Either.Right + ).right.outdatedDocuments; expect(pickedUpSearchResults.length).toBe(4); }); }); @@ -1461,11 +1479,11 @@ describe('migration actions', () => { describe('bulkOverwriteTransformedDocuments', () => { it('resolves right when documents do not yet exist in the index', async () => { - const newDocs = ([ + const newDocs = [ { _source: { title: 'doc 5' } }, { _source: { title: 'doc 6' } }, { _source: { title: 'doc 7' } }, - ] as unknown) as SavedObjectsRawDoc[]; + ] as unknown as SavedObjectsRawDoc[]; const task = bulkOverwriteTransformedDocuments({ client, index: 'existing_index_with_docs', @@ -1481,18 +1499,20 @@ describe('migration actions', () => { `); }); it('resolves right even if there were some version_conflict_engine_exception', async () => { - const existingDocs = ((await searchForOutdatedDocuments(client, { - batchSize: 1000, - targetIndex: 'existing_index_with_docs', - outdatedDocumentsQuery: undefined, - })()) as Either.Right).right.outdatedDocuments; + const existingDocs = ( + (await searchForOutdatedDocuments(client, { + batchSize: 1000, + targetIndex: 'existing_index_with_docs', + outdatedDocumentsQuery: undefined, + })()) as Either.Right + ).right.outdatedDocuments; const task = bulkOverwriteTransformedDocuments({ client, index: 'existing_index_with_docs', transformedDocs: [ ...existingDocs, - ({ _source: { title: 'doc 8' } } as unknown) as SavedObjectsRawDoc, + { _source: { title: 'doc 8' } } as unknown as SavedObjectsRawDoc, ], refresh: 'wait_for', }); @@ -1504,11 +1524,11 @@ describe('migration actions', () => { `); }); it('resolves left target_index_had_write_block if there are write_block errors', async () => { - const newDocs = ([ + const newDocs = [ { _source: { title: 'doc 5' } }, { _source: { title: 'doc 6' } }, { _source: { title: 'doc 7' } }, - ] as unknown) as SavedObjectsRawDoc[]; + ] as unknown as SavedObjectsRawDoc[]; await expect( bulkOverwriteTransformedDocuments({ client, diff --git a/src/core/server/saved_objects/migrationsv2/actions/open_pit.ts b/src/core/server/saved_objects/migrationsv2/actions/open_pit.ts index e740dc00ac27e..43c84a2b26613 100644 --- a/src/core/server/saved_objects/migrationsv2/actions/open_pit.ts +++ b/src/core/server/saved_objects/migrationsv2/actions/open_pit.ts @@ -29,15 +29,17 @@ export const pitKeepAlive = '10m'; * Creates a lightweight view of data when the request has been initiated. * See https://www.elastic.co/guide/en/elasticsearch/reference/current/point-in-time-api.html * */ -export const openPit = ({ - client, - index, -}: OpenPitParams): TaskEither.TaskEither => () => { - return client - .openPointInTime({ - index, - keep_alive: pitKeepAlive, - }) - .then((response) => Either.right({ pitId: response.body.id })) - .catch(catchRetryableEsClientErrors); -}; +export const openPit = + ({ + client, + index, + }: OpenPitParams): TaskEither.TaskEither => + () => { + return client + .openPointInTime({ + index, + keep_alive: pitKeepAlive, + }) + .then((response) => Either.right({ pitId: response.body.id })) + .catch(catchRetryableEsClientErrors); + }; diff --git a/src/core/server/saved_objects/migrationsv2/actions/pickup_updated_mappings.ts b/src/core/server/saved_objects/migrationsv2/actions/pickup_updated_mappings.ts index 8cc609e5277bc..2db6b1833c6dd 100644 --- a/src/core/server/saved_objects/migrationsv2/actions/pickup_updated_mappings.ts +++ b/src/core/server/saved_objects/migrationsv2/actions/pickup_updated_mappings.ts @@ -31,27 +31,29 @@ export interface UpdateByQueryResponse { * This action uses `conflicts: 'proceed'` allowing several Kibana instances * to run this in parallel. */ -export const pickupUpdatedMappings = ( - client: ElasticsearchClient, - index: string -): TaskEither.TaskEither => () => { - return client - .updateByQuery({ - // Ignore version conflicts that can occur from parallel update by query operations - conflicts: 'proceed', - // Return an error when targeting missing or closed indices - allow_no_indices: false, - index, - // How many documents to update per batch - scroll_size: BATCH_SIZE, - // force a refresh so that we can query the updated index immediately - // after the operation completes - refresh: true, - // Create a task and return task id instead of blocking until complete - wait_for_completion: false, - }) - .then(({ body: { task: taskId } }) => { - return Either.right({ taskId: String(taskId!) }); - }) - .catch(catchRetryableEsClientErrors); -}; +export const pickupUpdatedMappings = + ( + client: ElasticsearchClient, + index: string + ): TaskEither.TaskEither => + () => { + return client + .updateByQuery({ + // Ignore version conflicts that can occur from parallel update by query operations + conflicts: 'proceed', + // Return an error when targeting missing or closed indices + allow_no_indices: false, + index, + // How many documents to update per batch + scroll_size: BATCH_SIZE, + // force a refresh so that we can query the updated index immediately + // after the operation completes + refresh: true, + // Create a task and return task id instead of blocking until complete + wait_for_completion: false, + }) + .then(({ body: { task: taskId } }) => { + return Either.right({ taskId: String(taskId!) }); + }) + .catch(catchRetryableEsClientErrors); + }; diff --git a/src/core/server/saved_objects/migrationsv2/actions/read_with_pit.ts b/src/core/server/saved_objects/migrationsv2/actions/read_with_pit.ts index b101e7db0141c..c8e7d61dce811 100644 --- a/src/core/server/saved_objects/migrationsv2/actions/read_with_pit.ts +++ b/src/core/server/saved_objects/migrationsv2/actions/read_with_pit.ts @@ -37,56 +37,58 @@ export interface ReadWithPitParams { /* * Requests documents from the index using PIT mechanism. * */ -export const readWithPit = ({ - client, - pitId, - query, - batchSize, - searchAfter, - seqNoPrimaryTerm, -}: ReadWithPitParams): TaskEither.TaskEither => () => { - return client - .search({ - seq_no_primary_term: seqNoPrimaryTerm, - body: { - // Sort fields are required to use searchAfter - sort: { - // the most efficient option as order is not important for the migration - _shard_doc: { order: 'asc' }, +export const readWithPit = + ({ + client, + pitId, + query, + batchSize, + searchAfter, + seqNoPrimaryTerm, + }: ReadWithPitParams): TaskEither.TaskEither => + () => { + return client + .search({ + seq_no_primary_term: seqNoPrimaryTerm, + body: { + // Sort fields are required to use searchAfter + sort: { + // the most efficient option as order is not important for the migration + _shard_doc: { order: 'asc' }, + }, + pit: { id: pitId, keep_alive: pitKeepAlive }, + size: batchSize, + search_after: searchAfter, + /** + * We want to know how many documents we need to process so we can log the progress. + * But we also want to increase the performance of these requests, + * so we ask ES to report the total count only on the first request (when searchAfter does not exist) + */ + track_total_hits: typeof searchAfter === 'undefined', + query, }, - pit: { id: pitId, keep_alive: pitKeepAlive }, - size: batchSize, - search_after: searchAfter, - /** - * We want to know how many documents we need to process so we can log the progress. - * But we also want to increase the performance of these requests, - * so we ask ES to report the total count only on the first request (when searchAfter does not exist) - */ - track_total_hits: typeof searchAfter === 'undefined', - query, - }, - }) - .then((response) => { - const totalHits = - typeof response.body.hits.total === 'number' - ? response.body.hits.total // This format is to be removed in 8.0 - : response.body.hits.total?.value; - const hits = response.body.hits.hits; + }) + .then((response) => { + const totalHits = + typeof response.body.hits.total === 'number' + ? response.body.hits.total // This format is to be removed in 8.0 + : response.body.hits.total?.value; + const hits = response.body.hits.hits; + + if (hits.length > 0) { + return Either.right({ + // @ts-expect-error @elastic/elasticsearch _source is optional + outdatedDocuments: hits as SavedObjectsRawDoc[], + lastHitSortValue: hits[hits.length - 1].sort as number[], + totalHits, + }); + } - if (hits.length > 0) { return Either.right({ - // @ts-expect-error @elastic/elasticsearch _source is optional - outdatedDocuments: hits as SavedObjectsRawDoc[], - lastHitSortValue: hits[hits.length - 1].sort as number[], + outdatedDocuments: [], + lastHitSortValue: undefined, totalHits, }); - } - - return Either.right({ - outdatedDocuments: [], - lastHitSortValue: undefined, - totalHits, - }); - }) - .catch(catchRetryableEsClientErrors); -}; + }) + .catch(catchRetryableEsClientErrors); + }; diff --git a/src/core/server/saved_objects/migrationsv2/actions/refresh_index.ts b/src/core/server/saved_objects/migrationsv2/actions/refresh_index.ts index e7bcbfb7d2d53..371247789af24 100644 --- a/src/core/server/saved_objects/migrationsv2/actions/refresh_index.ts +++ b/src/core/server/saved_objects/migrationsv2/actions/refresh_index.ts @@ -22,19 +22,18 @@ export interface RefreshIndexParams { /** * Wait for Elasticsearch to reindex all the changes. */ -export const refreshIndex = ({ - client, - targetIndex, -}: RefreshIndexParams): TaskEither.TaskEither< - RetryableEsClientError, - { refreshed: boolean } -> => () => { - return client.indices - .refresh({ - index: targetIndex, - }) - .then(() => { - return Either.right({ refreshed: true }); - }) - .catch(catchRetryableEsClientErrors); -}; +export const refreshIndex = + ({ + client, + targetIndex, + }: RefreshIndexParams): TaskEither.TaskEither => + () => { + return client.indices + .refresh({ + index: targetIndex, + }) + .then(() => { + return Either.right({ refreshed: true }); + }) + .catch(catchRetryableEsClientErrors); + }; diff --git a/src/core/server/saved_objects/migrationsv2/actions/reindex.ts b/src/core/server/saved_objects/migrationsv2/actions/reindex.ts index e9cfb4b61dace..92134d2755ac3 100644 --- a/src/core/server/saved_objects/migrationsv2/actions/reindex.ts +++ b/src/core/server/saved_objects/migrationsv2/actions/reindex.ts @@ -42,49 +42,51 @@ export interface ReindexParams { * this in parallel. By using `op_type: 'create', conflicts: 'proceed'` there * will be only one write per reindexed document. */ -export const reindex = ({ - client, - sourceIndex, - targetIndex, - reindexScript, - requireAlias, - unusedTypesQuery, -}: ReindexParams): TaskEither.TaskEither => () => { - return client - .reindex({ - // Require targetIndex to be an alias. Prevents a new index from being - // created if targetIndex doesn't exist. - require_alias: requireAlias, - body: { - // Ignore version conflicts from existing documents - conflicts: 'proceed', - source: { - index: sourceIndex, - // Set reindex batch size - size: BATCH_SIZE, - // Exclude saved object types - query: unusedTypesQuery, +export const reindex = + ({ + client, + sourceIndex, + targetIndex, + reindexScript, + requireAlias, + unusedTypesQuery, + }: ReindexParams): TaskEither.TaskEither => + () => { + return client + .reindex({ + // Require targetIndex to be an alias. Prevents a new index from being + // created if targetIndex doesn't exist. + require_alias: requireAlias, + body: { + // Ignore version conflicts from existing documents + conflicts: 'proceed', + source: { + index: sourceIndex, + // Set reindex batch size + size: BATCH_SIZE, + // Exclude saved object types + query: unusedTypesQuery, + }, + dest: { + index: targetIndex, + // Don't override existing documents, only create if missing + op_type: 'create', + }, + script: Option.fold( + () => undefined, + (script) => ({ + source: script, + lang: 'painless', + }) + )(reindexScript), }, - dest: { - index: targetIndex, - // Don't override existing documents, only create if missing - op_type: 'create', - }, - script: Option.fold( - () => undefined, - (script) => ({ - source: script, - lang: 'painless', - }) - )(reindexScript), - }, - // force a refresh so that we can query the target index - refresh: true, - // Create a task and return task id instead of blocking until complete - wait_for_completion: false, - }) - .then(({ body: { task: taskId } }) => { - return Either.right({ taskId: String(taskId) }); - }) - .catch(catchRetryableEsClientErrors); -}; + // force a refresh so that we can query the target index + refresh: true, + // Create a task and return task id instead of blocking until complete + wait_for_completion: false, + }) + .then(({ body: { task: taskId } }) => { + return Either.right({ taskId: String(taskId) }); + }) + .catch(catchRetryableEsClientErrors); + }; diff --git a/src/core/server/saved_objects/migrationsv2/actions/remove_write_block.ts b/src/core/server/saved_objects/migrationsv2/actions/remove_write_block.ts index b5bf64d5c29f7..77445654d3cc3 100644 --- a/src/core/server/saved_objects/migrationsv2/actions/remove_write_block.ts +++ b/src/core/server/saved_objects/migrationsv2/actions/remove_write_block.ts @@ -22,39 +22,41 @@ export interface RemoveWriteBlockParams { /** * Removes a write block from an index */ -export const removeWriteBlock = ({ - client, - index, -}: RemoveWriteBlockParams): TaskEither.TaskEither< - RetryableEsClientError, - 'remove_write_block_succeeded' -> => () => { - return client.indices - .putSettings<{ - acknowledged: boolean; - shards_acknowledged: boolean; - }>( - { - index, - // Don't change any existing settings - preserve_existing: true, - body: { - settings: { - blocks: { - write: false, +export const removeWriteBlock = + ({ + client, + index, + }: RemoveWriteBlockParams): TaskEither.TaskEither< + RetryableEsClientError, + 'remove_write_block_succeeded' + > => + () => { + return client.indices + .putSettings<{ + acknowledged: boolean; + shards_acknowledged: boolean; + }>( + { + index, + // Don't change any existing settings + preserve_existing: true, + body: { + settings: { + blocks: { + write: false, + }, }, }, }, - }, - { maxRetries: 0 /** handle retry ourselves for now */ } - ) - .then((res) => { - return res.body.acknowledged === true - ? Either.right('remove_write_block_succeeded' as const) - : Either.left({ - type: 'retryable_es_client_error' as const, - message: 'remove_write_block_failed', - }); - }) - .catch(catchRetryableEsClientErrors); -}; + { maxRetries: 0 /** handle retry ourselves for now */ } + ) + .then((res) => { + return res.body.acknowledged === true + ? Either.right('remove_write_block_succeeded' as const) + : Either.left({ + type: 'retryable_es_client_error' as const, + message: 'remove_write_block_failed', + }); + }) + .catch(catchRetryableEsClientErrors); + }; diff --git a/src/core/server/saved_objects/migrationsv2/actions/search_for_outdated_documents.ts b/src/core/server/saved_objects/migrationsv2/actions/search_for_outdated_documents.ts index c27170a78245b..5a6cb3a3d048d 100644 --- a/src/core/server/saved_objects/migrationsv2/actions/search_for_outdated_documents.ts +++ b/src/core/server/saved_objects/migrationsv2/actions/search_for_outdated_documents.ts @@ -34,44 +34,46 @@ export interface SearchForOutdatedDocumentsOptions { * * Used for testing only */ -export const searchForOutdatedDocuments = ( - client: ElasticsearchClient, - options: SearchForOutdatedDocumentsOptions -): TaskEither.TaskEither => () => { - return client - .search({ - index: options.targetIndex, - // Return the _seq_no and _primary_term so we can use optimistic - // concurrency control for updates - seq_no_primary_term: true, - size: options.batchSize, - body: { - query: options.outdatedDocumentsQuery, - // Optimize search performance by sorting by the "natural" index order - sort: ['_doc'], - }, - // Return an error when targeting missing or closed indices - allow_no_indices: false, - // Don't return partial results if timeouts or shard failures are - // encountered. This is important because 0 search hits is interpreted as - // there being no more outdated documents left that require - // transformation. Although the default is `false`, we set this - // explicitly to avoid users overriding the - // search.default_allow_partial_results cluster setting to true. - allow_partial_search_results: false, - // Improve performance by not calculating the total number of hits - // matching the query. - track_total_hits: false, - // Reduce the response payload size by only returning the data we care about - filter_path: [ - 'hits.hits._id', - 'hits.hits._source', - 'hits.hits._seq_no', - 'hits.hits._primary_term', - ], - }) - .then((res) => - Either.right({ outdatedDocuments: (res.body.hits?.hits as SavedObjectsRawDoc[]) ?? [] }) - ) - .catch(catchRetryableEsClientErrors); -}; +export const searchForOutdatedDocuments = + ( + client: ElasticsearchClient, + options: SearchForOutdatedDocumentsOptions + ): TaskEither.TaskEither => + () => { + return client + .search({ + index: options.targetIndex, + // Return the _seq_no and _primary_term so we can use optimistic + // concurrency control for updates + seq_no_primary_term: true, + size: options.batchSize, + body: { + query: options.outdatedDocumentsQuery, + // Optimize search performance by sorting by the "natural" index order + sort: ['_doc'], + }, + // Return an error when targeting missing or closed indices + allow_no_indices: false, + // Don't return partial results if timeouts or shard failures are + // encountered. This is important because 0 search hits is interpreted as + // there being no more outdated documents left that require + // transformation. Although the default is `false`, we set this + // explicitly to avoid users overriding the + // search.default_allow_partial_results cluster setting to true. + allow_partial_search_results: false, + // Improve performance by not calculating the total number of hits + // matching the query. + track_total_hits: false, + // Reduce the response payload size by only returning the data we care about + filter_path: [ + 'hits.hits._id', + 'hits.hits._source', + 'hits.hits._seq_no', + 'hits.hits._primary_term', + ], + }) + .then((res) => + Either.right({ outdatedDocuments: (res.body.hits?.hits as SavedObjectsRawDoc[]) ?? [] }) + ) + .catch(catchRetryableEsClientErrors); + }; diff --git a/src/core/server/saved_objects/migrationsv2/actions/set_write_block.ts b/src/core/server/saved_objects/migrationsv2/actions/set_write_block.ts index 5aed316306cf9..db519d0246511 100644 --- a/src/core/server/saved_objects/migrationsv2/actions/set_write_block.ts +++ b/src/core/server/saved_objects/migrationsv2/actions/set_write_block.ts @@ -31,43 +31,45 @@ export interface SetWriteBlockParams { * include `shards_acknowledged: true` but once the block is in place, * subsequent calls return `shards_acknowledged: false` */ -export const setWriteBlock = ({ - client, - index, -}: SetWriteBlockParams): TaskEither.TaskEither< - IndexNotFound | RetryableEsClientError, - 'set_write_block_succeeded' -> => () => { - return ( - client.indices - .addBlock<{ - acknowledged: boolean; - shards_acknowledged: boolean; - }>( - { - index, - block: 'write', - }, - { maxRetries: 0 /** handle retry ourselves for now */ } - ) - // not typed yet - .then((res: any) => { - return res.body.acknowledged === true - ? Either.right('set_write_block_succeeded' as const) - : Either.left({ - type: 'retryable_es_client_error' as const, - message: 'set_write_block_failed', - }); - }) - .catch((e: ElasticsearchClientError) => { - if (e instanceof EsErrors.ResponseError) { - if (e.body?.error?.type === 'index_not_found_exception') { - return Either.left({ type: 'index_not_found_exception' as const, index }); +export const setWriteBlock = + ({ + client, + index, + }: SetWriteBlockParams): TaskEither.TaskEither< + IndexNotFound | RetryableEsClientError, + 'set_write_block_succeeded' + > => + () => { + return ( + client.indices + .addBlock<{ + acknowledged: boolean; + shards_acknowledged: boolean; + }>( + { + index, + block: 'write', + }, + { maxRetries: 0 /** handle retry ourselves for now */ } + ) + // not typed yet + .then((res: any) => { + return res.body.acknowledged === true + ? Either.right('set_write_block_succeeded' as const) + : Either.left({ + type: 'retryable_es_client_error' as const, + message: 'set_write_block_failed', + }); + }) + .catch((e: ElasticsearchClientError) => { + if (e instanceof EsErrors.ResponseError) { + if (e.body?.error?.type === 'index_not_found_exception') { + return Either.left({ type: 'index_not_found_exception' as const, index }); + } } - } - throw e; - }) - .catch(catchRetryableEsClientErrors) - ); -}; + throw e; + }) + .catch(catchRetryableEsClientErrors) + ); + }; // diff --git a/src/core/server/saved_objects/migrationsv2/actions/update_aliases.ts b/src/core/server/saved_objects/migrationsv2/actions/update_aliases.ts index ffb8002f09212..5f1903f010a41 100644 --- a/src/core/server/saved_objects/migrationsv2/actions/update_aliases.ts +++ b/src/core/server/saved_objects/migrationsv2/actions/update_aliases.ts @@ -39,60 +39,62 @@ export interface UpdateAliasesParams { /** * Calls the Update index alias API `_alias` with the provided alias actions. */ -export const updateAliases = ({ - client, - aliasActions, -}: UpdateAliasesParams): TaskEither.TaskEither< - IndexNotFound | AliasNotFound | RemoveIndexNotAConcreteIndex | RetryableEsClientError, - 'update_aliases_succeeded' -> => () => { - return client.indices - .updateAliases( - { - body: { - actions: aliasActions, +export const updateAliases = + ({ + client, + aliasActions, + }: UpdateAliasesParams): TaskEither.TaskEither< + IndexNotFound | AliasNotFound | RemoveIndexNotAConcreteIndex | RetryableEsClientError, + 'update_aliases_succeeded' + > => + () => { + return client.indices + .updateAliases( + { + body: { + actions: aliasActions, + }, }, - }, - { maxRetries: 0 } - ) - .then(() => { - // Ignore `acknowledged: false`. When the coordinating node accepts - // the new cluster state update but not all nodes have applied the - // update within the timeout `acknowledged` will be false. However, - // retrying this update will always immediately result in `acknowledged: - // true` even if there are still nodes which are falling behind with - // cluster state updates. - // The only impact for using `updateAliases` to mark the version index - // as ready is that it could take longer for other Kibana instances to - // see that the version index is ready so they are more likely to - // perform unecessary duplicate work. - return Either.right('update_aliases_succeeded' as const); - }) - .catch((err: EsErrors.ElasticsearchClientError) => { - if (err instanceof EsErrors.ResponseError) { - if (err?.body?.error?.type === 'index_not_found_exception') { - return Either.left({ - type: 'index_not_found_exception' as const, - index: err.body.error.index, - }); - } else if ( - err?.body?.error?.type === 'illegal_argument_exception' && - err?.body?.error?.reason?.match( - /The provided expression \[.+\] matches an alias, specify the corresponding concrete indices instead./ - ) - ) { - return Either.left({ type: 'remove_index_not_a_concrete_index' as const }); - } else if ( - err?.body?.error?.type === 'aliases_not_found_exception' || - (err?.body?.error?.type === 'resource_not_found_exception' && - err?.body?.error?.reason?.match(/required alias \[.+\] does not exist/)) - ) { - return Either.left({ - type: 'alias_not_found_exception' as const, - }); + { maxRetries: 0 } + ) + .then(() => { + // Ignore `acknowledged: false`. When the coordinating node accepts + // the new cluster state update but not all nodes have applied the + // update within the timeout `acknowledged` will be false. However, + // retrying this update will always immediately result in `acknowledged: + // true` even if there are still nodes which are falling behind with + // cluster state updates. + // The only impact for using `updateAliases` to mark the version index + // as ready is that it could take longer for other Kibana instances to + // see that the version index is ready so they are more likely to + // perform unecessary duplicate work. + return Either.right('update_aliases_succeeded' as const); + }) + .catch((err: EsErrors.ElasticsearchClientError) => { + if (err instanceof EsErrors.ResponseError) { + if (err?.body?.error?.type === 'index_not_found_exception') { + return Either.left({ + type: 'index_not_found_exception' as const, + index: err.body.error.index, + }); + } else if ( + err?.body?.error?.type === 'illegal_argument_exception' && + err?.body?.error?.reason?.match( + /The provided expression \[.+\] matches an alias, specify the corresponding concrete indices instead./ + ) + ) { + return Either.left({ type: 'remove_index_not_a_concrete_index' as const }); + } else if ( + err?.body?.error?.type === 'aliases_not_found_exception' || + (err?.body?.error?.type === 'resource_not_found_exception' && + err?.body?.error?.reason?.match(/required alias \[.+\] does not exist/)) + ) { + return Either.left({ + type: 'alias_not_found_exception' as const, + }); + } } - } - throw err; - }) - .catch(catchRetryableEsClientErrors); -}; + throw err; + }) + .catch(catchRetryableEsClientErrors); + }; diff --git a/src/core/server/saved_objects/migrationsv2/actions/update_and_pickup_mappings.ts b/src/core/server/saved_objects/migrationsv2/actions/update_and_pickup_mappings.ts index 8c742005a01ce..52065ba60cb84 100644 --- a/src/core/server/saved_objects/migrationsv2/actions/update_and_pickup_mappings.ts +++ b/src/core/server/saved_objects/migrationsv2/actions/update_and_pickup_mappings.ts @@ -41,35 +41,33 @@ export const updateAndPickupMappings = ({ RetryableEsClientError, UpdateAndPickupMappingsResponse > => { - const putMappingTask: TaskEither.TaskEither< - RetryableEsClientError, - 'update_mappings_succeeded' - > = () => { - return client.indices - .putMapping({ - index, - timeout: DEFAULT_TIMEOUT, - body: mappings, - }) - .then((res) => { - // Ignore `acknowledged: false`. When the coordinating node accepts - // the new cluster state update but not all nodes have applied the - // update within the timeout `acknowledged` will be false. However, - // retrying this update will always immediately result in `acknowledged: - // true` even if there are still nodes which are falling behind with - // cluster state updates. - // For updateAndPickupMappings this means that there is the potential - // that some existing document's fields won't be picked up if the node - // on which the Kibana shard is running has fallen behind with cluster - // state updates and the mapping update wasn't applied before we run - // `pickupUpdatedMappings`. ES tries to limit this risk by blocking - // index operations (including update_by_query used by - // updateAndPickupMappings) if there are pending mappings changes. But - // not all mapping changes will prevent this. - return Either.right('update_mappings_succeeded' as const); - }) - .catch(catchRetryableEsClientErrors); - }; + const putMappingTask: TaskEither.TaskEither = + () => { + return client.indices + .putMapping({ + index, + timeout: DEFAULT_TIMEOUT, + body: mappings, + }) + .then((res) => { + // Ignore `acknowledged: false`. When the coordinating node accepts + // the new cluster state update but not all nodes have applied the + // update within the timeout `acknowledged` will be false. However, + // retrying this update will always immediately result in `acknowledged: + // true` even if there are still nodes which are falling behind with + // cluster state updates. + // For updateAndPickupMappings this means that there is the potential + // that some existing document's fields won't be picked up if the node + // on which the Kibana shard is running has fallen behind with cluster + // state updates and the mapping update wasn't applied before we run + // `pickupUpdatedMappings`. ES tries to limit this risk by blocking + // index operations (including update_by_query used by + // updateAndPickupMappings) if there are pending mappings changes. But + // not all mapping changes will prevent this. + return Either.right('update_mappings_succeeded' as const); + }) + .catch(catchRetryableEsClientErrors); + }; return pipe( putMappingTask, diff --git a/src/core/server/saved_objects/migrationsv2/actions/verify_reindex.ts b/src/core/server/saved_objects/migrationsv2/actions/verify_reindex.ts index 4db599d8fbadf..a344bf5a97ff3 100644 --- a/src/core/server/saved_objects/migrationsv2/actions/verify_reindex.ts +++ b/src/core/server/saved_objects/migrationsv2/actions/verify_reindex.ts @@ -21,32 +21,34 @@ export interface VerifyReindexParams { targetIndex: string; } -export const verifyReindex = ({ - client, - sourceIndex, - targetIndex, -}: VerifyReindexParams): TaskEither.TaskEither< - RetryableEsClientError | { type: 'verify_reindex_failed' }, - 'verify_reindex_succeeded' -> => () => { - const count = (index: string) => - client - .count<{ count: number }>({ - index, - // Return an error when targeting missing or closed indices - allow_no_indices: false, - }) - .then((res) => { - return res.body.count; - }); +export const verifyReindex = + ({ + client, + sourceIndex, + targetIndex, + }: VerifyReindexParams): TaskEither.TaskEither< + RetryableEsClientError | { type: 'verify_reindex_failed' }, + 'verify_reindex_succeeded' + > => + () => { + const count = (index: string) => + client + .count<{ count: number }>({ + index, + // Return an error when targeting missing or closed indices + allow_no_indices: false, + }) + .then((res) => { + return res.body.count; + }); - return Promise.all([count(sourceIndex), count(targetIndex)]) - .then(([sourceCount, targetCount]) => { - if (targetCount >= sourceCount) { - return Either.right('verify_reindex_succeeded' as const); - } else { - return Either.left({ type: 'verify_reindex_failed' as const }); - } - }) - .catch(catchRetryableEsClientErrors); -}; + return Promise.all([count(sourceIndex), count(targetIndex)]) + .then(([sourceCount, targetCount]) => { + if (targetCount >= sourceCount) { + return Either.right('verify_reindex_succeeded' as const); + } else { + return Either.left({ type: 'verify_reindex_failed' as const }); + } + }) + .catch(catchRetryableEsClientErrors); + }; diff --git a/src/core/server/saved_objects/migrationsv2/actions/wait_for_index_status_yellow.ts b/src/core/server/saved_objects/migrationsv2/actions/wait_for_index_status_yellow.ts index 57e49b8d51cd0..2880dfaff0d48 100644 --- a/src/core/server/saved_objects/migrationsv2/actions/wait_for_index_status_yellow.ts +++ b/src/core/server/saved_objects/migrationsv2/actions/wait_for_index_status_yellow.ts @@ -32,15 +32,17 @@ export interface WaitForIndexStatusYellowParams { * yellow at any point in the future. So ultimately data-redundancy is up to * users to maintain. */ -export const waitForIndexStatusYellow = ({ - client, - index, - timeout = DEFAULT_TIMEOUT, -}: WaitForIndexStatusYellowParams): TaskEither.TaskEither => () => { - return client.cluster - .health({ index, wait_for_status: 'yellow', timeout }) - .then(() => { - return Either.right({}); - }) - .catch(catchRetryableEsClientErrors); -}; +export const waitForIndexStatusYellow = + ({ + client, + index, + timeout = DEFAULT_TIMEOUT, + }: WaitForIndexStatusYellowParams): TaskEither.TaskEither => + () => { + return client.cluster + .health({ index, wait_for_status: 'yellow', timeout }) + .then(() => { + return Either.right({}); + }) + .catch(catchRetryableEsClientErrors); + }; diff --git a/src/core/server/saved_objects/migrationsv2/actions/wait_for_task.ts b/src/core/server/saved_objects/migrationsv2/actions/wait_for_task.ts index 0cdaa88c535ab..af0ed3613bd6b 100644 --- a/src/core/server/saved_objects/migrationsv2/actions/wait_for_task.ts +++ b/src/core/server/saved_objects/migrationsv2/actions/wait_for_task.ts @@ -65,30 +65,32 @@ export interface WaitForTaskParams { * * TODO: delete completed tasks */ -export const waitForTask = ({ - client, - taskId, - timeout, -}: WaitForTaskParams): TaskEither.TaskEither< - RetryableEsClientError | WaitForTaskCompletionTimeout, - WaitForTaskResponse -> => () => { - return client.tasks - .get({ - task_id: taskId, - wait_for_completion: true, - timeout, - }) - .then((res) => { - const body = res.body; - const failures = body.response?.failures ?? []; - return Either.right({ - completed: body.completed, - error: Option.fromNullable(body.error), - failures: failures.length > 0 ? Option.some(failures) : Option.none, - description: body.task.description, - }); - }) - .catch(catchWaitForTaskCompletionTimeout) - .catch(catchRetryableEsClientErrors); -}; +export const waitForTask = + ({ + client, + taskId, + timeout, + }: WaitForTaskParams): TaskEither.TaskEither< + RetryableEsClientError | WaitForTaskCompletionTimeout, + WaitForTaskResponse + > => + () => { + return client.tasks + .get({ + task_id: taskId, + wait_for_completion: true, + timeout, + }) + .then((res) => { + const body = res.body; + const failures = body.response?.failures ?? []; + return Either.right({ + completed: body.completed, + error: Option.fromNullable(body.error), + failures: failures.length > 0 ? Option.some(failures) : Option.none, + description: body.task.description, + }); + }) + .catch(catchWaitForTaskCompletionTimeout) + .catch(catchRetryableEsClientErrors); + }; diff --git a/src/core/server/saved_objects/migrationsv2/initial_state.test.ts b/src/core/server/saved_objects/migrationsv2/initial_state.test.ts index 26ba129cbeab4..601eb7cf1ce36 100644 --- a/src/core/server/saved_objects/migrationsv2/initial_state.test.ts +++ b/src/core/server/saved_objects/migrationsv2/initial_state.test.ts @@ -19,11 +19,11 @@ describe('createInitialState', () => { typeRegistry = new SavedObjectTypeRegistry(); }); - const migrationsConfig = ({ + const migrationsConfig = { retryAttempts: 15, batchSize: 1000, maxBatchSizeBytes: ByteSizeValue.parse('100mb'), - } as unknown) as SavedObjectsMigrationConfigType; + } as unknown as SavedObjectsMigrationConfigType; it('creates the initial state for the model based on the passed in parameters', () => { expect( createInitialState({ diff --git a/src/core/server/saved_objects/migrationsv2/model/model.test.ts b/src/core/server/saved_objects/migrationsv2/model/model.test.ts index 1d017116bf3fd..033a18b488841 100644 --- a/src/core/server/saved_objects/migrationsv2/model/model.test.ts +++ b/src/core/server/saved_objects/migrationsv2/model/model.test.ts @@ -556,9 +556,8 @@ describe('migrations v2 model', () => { legacyIndex: '', }; test('LEGACY_CREATE_REINDEX_TARGET -> LEGACY_REINDEX', () => { - const res: ResponseType<'LEGACY_CREATE_REINDEX_TARGET'> = Either.right( - 'create_index_succeeded' - ); + const res: ResponseType<'LEGACY_CREATE_REINDEX_TARGET'> = + Either.right('create_index_succeeded'); const newState = model(legacyCreateReindexTargetState, res); expect(newState.controlState).toEqual('LEGACY_REINDEX'); expect(newState.retryCount).toEqual(0); @@ -1143,9 +1142,8 @@ describe('migrations v2 model', () => { progress: createInitialProgress(), }; test('REINDEX_SOURCE_TO_TEMP_INDEX_BULK -> REINDEX_SOURCE_TO_TEMP_READ if action succeeded', () => { - const res: ResponseType<'REINDEX_SOURCE_TO_TEMP_INDEX_BULK'> = Either.right( - 'bulk_index_succeeded' - ); + const res: ResponseType<'REINDEX_SOURCE_TO_TEMP_INDEX_BULK'> = + Either.right('bulk_index_succeeded'); const newState = model(reindexSourceToTempIndexBulkState, res); expect(newState.controlState).toEqual('REINDEX_SOURCE_TO_TEMP_READ'); expect(newState.retryCount).toEqual(0); @@ -1563,9 +1561,8 @@ describe('migrations v2 model', () => { }; test('TRANSFORMED_DOCUMENTS_BULK_INDEX -> TRANSFORMED_DOCUMENTS_BULK_INDEX and increments currentBatch if more batches are left', () => { - const res: ResponseType<'TRANSFORMED_DOCUMENTS_BULK_INDEX'> = Either.right( - 'bulk_index_succeeded' - ); + const res: ResponseType<'TRANSFORMED_DOCUMENTS_BULK_INDEX'> = + Either.right('bulk_index_succeeded'); const newState = model( transformedDocumentsBulkIndexState, res @@ -1575,9 +1572,8 @@ describe('migrations v2 model', () => { }); test('TRANSFORMED_DOCUMENTS_BULK_INDEX -> OUTDATED_DOCUMENTS_SEARCH_READ if all batches were written', () => { - const res: ResponseType<'TRANSFORMED_DOCUMENTS_BULK_INDEX'> = Either.right( - 'bulk_index_succeeded' - ); + const res: ResponseType<'TRANSFORMED_DOCUMENTS_BULK_INDEX'> = + Either.right('bulk_index_succeeded'); const newState = model( { ...transformedDocumentsBulkIndexState, ...{ currentBatch: 1 } }, res diff --git a/src/core/server/saved_objects/routes/create.ts b/src/core/server/saved_objects/routes/create.ts index 0e321aa7031f2..3e287e91fec80 100644 --- a/src/core/server/saved_objects/routes/create.ts +++ b/src/core/server/saved_objects/routes/create.ts @@ -47,13 +47,8 @@ export const registerCreateRoute = (router: IRouter, { coreUsageData }: RouteDep catchAndReturnBoomErrors(async (context, req, res) => { const { type, id } = req.params; const { overwrite } = req.query; - const { - attributes, - migrationVersion, - coreMigrationVersion, - references, - initialNamespaces, - } = req.body; + const { attributes, migrationVersion, coreMigrationVersion, references, initialNamespaces } = + req.body; const usageStatsClient = coreUsageData.getClient(); usageStatsClient.incrementSavedObjectsCreate({ request: req }).catch(() => {}); diff --git a/src/core/server/saved_objects/routes/utils.test.ts b/src/core/server/saved_objects/routes/utils.test.ts index 2127352e4c60e..51dd5d0918fd4 100644 --- a/src/core/server/saved_objects/routes/utils.test.ts +++ b/src/core/server/saved_objects/routes/utils.test.ts @@ -174,9 +174,11 @@ describe('catchAndReturnBoomErrors', () => { let request: KibanaRequest; let response: KibanaResponseFactory; - const createHandler = (handler: () => any): RequestHandler => () => { - return handler(); - }; + const createHandler = + (handler: () => any): RequestHandler => + () => { + return handler(); + }; beforeEach(() => { context = {} as any; diff --git a/src/core/server/saved_objects/saved_objects_config.ts b/src/core/server/saved_objects/saved_objects_config.ts index e7bbd706762f5..0c27f170f590b 100644 --- a/src/core/server/saved_objects/saved_objects_config.ts +++ b/src/core/server/saved_objects/saved_objects_config.ts @@ -39,11 +39,12 @@ const migrationDeprecations: ConfigDeprecationProvider = () => [ }, ]; -export const savedObjectsMigrationConfig: ServiceConfigDescriptor = { - path: 'migrations', - schema: migrationSchema, - deprecations: migrationDeprecations, -}; +export const savedObjectsMigrationConfig: ServiceConfigDescriptor = + { + path: 'migrations', + schema: migrationSchema, + deprecations: migrationDeprecations, + }; const soSchema = schema.object({ maxImportPayloadBytes: schema.byteSize({ defaultValue: 26_214_400 }), diff --git a/src/core/server/saved_objects/saved_objects_service.mock.ts b/src/core/server/saved_objects/saved_objects_service.mock.ts index b26e9ff4db00e..cd7310e226f63 100644 --- a/src/core/server/saved_objects/saved_objects_service.mock.ts +++ b/src/core/server/saved_objects/saved_objects_service.mock.ts @@ -49,9 +49,8 @@ const createStartContractMock = (typeRegistry?: jest.Mocked) => { - const internalStartContract: jest.Mocked = createStartContractMock( - typeRegistry - ); + const internalStartContract: jest.Mocked = + createStartContractMock(typeRegistry); return internalStartContract; }; diff --git a/src/core/server/saved_objects/saved_objects_service.test.ts b/src/core/server/saved_objects/saved_objects_service.test.ts index 6477d1a3dfbeb..1d860d2c5a695 100644 --- a/src/core/server/saved_objects/saved_objects_service.test.ts +++ b/src/core/server/saved_objects/saved_objects_service.test.ts @@ -97,7 +97,8 @@ describe('SavedObjectsService', () => { deprecationsSetup.getRegistry.mockReturnValue(mockRegistry); const deprecations = Symbol('deprecations'); - const mockedGetSavedObjectsDeprecationsProvider = getSavedObjectsDeprecationsProvider as jest.Mock; + const mockedGetSavedObjectsDeprecationsProvider = + getSavedObjectsDeprecationsProvider as jest.Mock; mockedGetSavedObjectsDeprecationsProvider.mockReturnValue(deprecations); await soService.setup(createSetupDeps()); @@ -233,8 +234,10 @@ describe('SavedObjectsService', () => { await soService.setup(setupDeps); soService.start(createStartDeps()); expect(migratorInstanceMock.runMigrations).toHaveBeenCalledTimes(0); - ((setupDeps.elasticsearch - .esNodesCompatibility$ as any) as BehaviorSubject).next({ + ( + setupDeps.elasticsearch + .esNodesCompatibility$ as any as BehaviorSubject + ).next({ isCompatible: true, incompatibleNodes: [], warningNodes: [], @@ -311,9 +314,9 @@ describe('SavedObjectsService', () => { expect(coreStart.elasticsearch.client.asScoped).toHaveBeenCalledWith(req); - const [ - [, , , , , includedHiddenTypes], - ] = (SavedObjectsRepository.createRepository as jest.Mocked).mock.calls; + const [[, , , , , includedHiddenTypes]] = ( + SavedObjectsRepository.createRepository as jest.Mocked + ).mock.calls; expect(includedHiddenTypes).toEqual([]); }); @@ -329,9 +332,9 @@ describe('SavedObjectsService', () => { const req = httpServerMock.createKibanaRequest(); createScopedRepository(req, ['someHiddenType']); - const [ - [, , , , , includedHiddenTypes], - ] = (SavedObjectsRepository.createRepository as jest.Mocked).mock.calls; + const [[, , , , , includedHiddenTypes]] = ( + SavedObjectsRepository.createRepository as jest.Mocked + ).mock.calls; expect(includedHiddenTypes).toEqual(['someHiddenType']); }); @@ -348,9 +351,9 @@ describe('SavedObjectsService', () => { createInternalRepository(); - const [ - [, , , client, , includedHiddenTypes], - ] = (SavedObjectsRepository.createRepository as jest.Mocked).mock.calls; + const [[, , , client, , includedHiddenTypes]] = ( + SavedObjectsRepository.createRepository as jest.Mocked + ).mock.calls; expect(coreStart.elasticsearch.client.asInternalUser).toBe(client); expect(includedHiddenTypes).toEqual([]); @@ -365,9 +368,9 @@ describe('SavedObjectsService', () => { createInternalRepository(['someHiddenType']); - const [ - [, , , , , includedHiddenTypes], - ] = (SavedObjectsRepository.createRepository as jest.Mocked).mock.calls; + const [[, , , , , includedHiddenTypes]] = ( + SavedObjectsRepository.createRepository as jest.Mocked + ).mock.calls; expect(includedHiddenTypes).toEqual(['someHiddenType']); }); diff --git a/src/core/server/saved_objects/saved_objects_service.ts b/src/core/server/saved_objects/saved_objects_service.ts index ee56744249c5b..534718bd683b8 100644 --- a/src/core/server/saved_objects/saved_objects_service.ts +++ b/src/core/server/saved_objects/saved_objects_service.ts @@ -269,7 +269,8 @@ export interface SavedObjectsStartDeps { } export class SavedObjectsService - implements CoreService { + implements CoreService +{ private logger: Logger; private setupDeps?: SavedObjectsSetupDeps; diff --git a/src/core/server/saved_objects/serialization/serializer.ts b/src/core/server/saved_objects/serialization/serializer.ts index 9c91abcfe79c5..5e27b3de24409 100644 --- a/src/core/server/saved_objects/serialization/serializer.ts +++ b/src/core/server/saved_objects/serialization/serializer.ts @@ -84,14 +84,8 @@ export class SavedObjectsSerializer { const { namespaceTreatment = 'strict' } = options; const { _id, _source, _seq_no, _primary_term } = doc; - const { - type, - namespaces, - originId, - migrationVersion, - references, - coreMigrationVersion, - } = _source; + const { type, namespaces, originId, migrationVersion, references, coreMigrationVersion } = + _source; const version = _seq_no != null || _primary_term != null diff --git a/src/core/server/saved_objects/service/lib/internal_bulk_resolve.test.ts b/src/core/server/saved_objects/service/lib/internal_bulk_resolve.test.ts index 046bc67f13dc6..ea177caf26c9f 100644 --- a/src/core/server/saved_objects/service/lib/internal_bulk_resolve.test.ts +++ b/src/core/server/saved_objects/service/lib/internal_bulk_resolve.test.ts @@ -31,7 +31,7 @@ const UNSUPPORTED_TYPE = 'unsupported-type'; beforeEach(() => { mockGetSavedObjectFromSource.mockReset(); mockGetSavedObjectFromSource.mockImplementation( - (_registry, _type, id) => (`mock-obj-for-${id}` as unknown) as SavedObject + (_registry, _type, id) => `mock-obj-for-${id}` as unknown as SavedObject ); mockRawDocExistsInNamespace.mockReset(); mockRawDocExistsInNamespace.mockReturnValue(true); // return true by default diff --git a/src/core/server/saved_objects/service/lib/point_in_time_finder.ts b/src/core/server/saved_objects/service/lib/point_in_time_finder.ts index d11be250ad0a9..9faf5e85085ed 100644 --- a/src/core/server/saved_objects/service/lib/point_in_time_finder.ts +++ b/src/core/server/saved_objects/service/lib/point_in_time_finder.ts @@ -64,7 +64,8 @@ export interface ISavedObjectsPointInTimeFinder { * @internal */ export class PointInTimeFinder - implements ISavedObjectsPointInTimeFinder { + implements ISavedObjectsPointInTimeFinder +{ readonly #log: Logger; readonly #client: PointInTimeFinderClient; readonly #findOptions: SavedObjectsFindOptions; diff --git a/src/core/server/saved_objects/service/lib/repository.ts b/src/core/server/saved_objects/service/lib/repository.ts index acbc4a6ee66d4..9cdc58f02f5d1 100644 --- a/src/core/server/saved_objects/service/lib/repository.ts +++ b/src/core/server/saved_objects/service/lib/repository.ts @@ -406,11 +406,17 @@ export class SavedObjectsRepository { const bulkGetDocs = expectedResults .filter(isRight) .filter(({ value }) => value.esRequestIndex !== undefined) - .map(({ value: { object: { type, id } } }) => ({ - _id: this._serializer.generateRawId(namespace, type, id), - _index: this.getIndexForType(type), - _source: ['type', 'namespaces'], - })); + .map( + ({ + value: { + object: { type, id }, + }, + }) => ({ + _id: this._serializer.generateRawId(namespace, type, id), + _index: this.getIndexForType(type), + _source: ['type', 'namespaces'], + }) + ); const bulkGetResponse = bulkGetDocs.length ? await this.client.mget( { @@ -433,94 +439,93 @@ export class SavedObjectsRepository { } let bulkRequestIndexCounter = 0; const bulkCreateParams: object[] = []; - const expectedBulkResults: Array< - Either, Record> - > = expectedResults.map((expectedBulkGetResult) => { - if (isLeft(expectedBulkGetResult)) { - return expectedBulkGetResult; - } + const expectedBulkResults: Array, Record>> = + expectedResults.map((expectedBulkGetResult) => { + if (isLeft(expectedBulkGetResult)) { + return expectedBulkGetResult; + } - let savedObjectNamespace: string | undefined; - let savedObjectNamespaces: string[] | undefined; - let versionProperties; - const { - esRequestIndex, - object: { initialNamespaces, version, ...object }, - method, - } = expectedBulkGetResult.value; - if (esRequestIndex !== undefined) { - const indexFound = bulkGetResponse?.statusCode !== 404; - const actualResult = indexFound ? bulkGetResponse?.body.docs[esRequestIndex] : undefined; - const docFound = indexFound && actualResult?.found === true; - if ( - docFound && - !this.rawDocExistsInNamespaces( - // @ts-expect-error MultiGetHit._source is optional - actualResult!, - initialNamespaces ?? [SavedObjectsUtils.namespaceIdToString(namespace)] - ) - ) { - const { id, type } = object; - return { - tag: 'Left', - value: { - id, - type, - error: { - ...errorContent(SavedObjectsErrorHelpers.createConflictError(type, id)), - metadata: { isNotOverwritable: true }, + let savedObjectNamespace: string | undefined; + let savedObjectNamespaces: string[] | undefined; + let versionProperties; + const { + esRequestIndex, + object: { initialNamespaces, version, ...object }, + method, + } = expectedBulkGetResult.value; + if (esRequestIndex !== undefined) { + const indexFound = bulkGetResponse?.statusCode !== 404; + const actualResult = indexFound ? bulkGetResponse?.body.docs[esRequestIndex] : undefined; + const docFound = indexFound && actualResult?.found === true; + if ( + docFound && + !this.rawDocExistsInNamespaces( + // @ts-expect-error MultiGetHit._source is optional + actualResult!, + initialNamespaces ?? [SavedObjectsUtils.namespaceIdToString(namespace)] + ) + ) { + const { id, type } = object; + return { + tag: 'Left', + value: { + id, + type, + error: { + ...errorContent(SavedObjectsErrorHelpers.createConflictError(type, id)), + metadata: { isNotOverwritable: true }, + }, }, - }, - }; - } - savedObjectNamespaces = - initialNamespaces || + }; + } + savedObjectNamespaces = + initialNamespaces || + // @ts-expect-error MultiGetHit._source is optional + getSavedObjectNamespaces(namespace, docFound ? actualResult : undefined); // @ts-expect-error MultiGetHit._source is optional - getSavedObjectNamespaces(namespace, docFound ? actualResult : undefined); - // @ts-expect-error MultiGetHit._source is optional - versionProperties = getExpectedVersionProperties(version, actualResult); - } else { - if (this._registry.isSingleNamespace(object.type)) { - savedObjectNamespace = initialNamespaces - ? normalizeNamespace(initialNamespaces[0]) - : namespace; - } else if (this._registry.isMultiNamespace(object.type)) { - savedObjectNamespaces = initialNamespaces || getSavedObjectNamespaces(namespace); + versionProperties = getExpectedVersionProperties(version, actualResult); + } else { + if (this._registry.isSingleNamespace(object.type)) { + savedObjectNamespace = initialNamespaces + ? normalizeNamespace(initialNamespaces[0]) + : namespace; + } else if (this._registry.isMultiNamespace(object.type)) { + savedObjectNamespaces = initialNamespaces || getSavedObjectNamespaces(namespace); + } + versionProperties = getExpectedVersionProperties(version); } - versionProperties = getExpectedVersionProperties(version); - } - const expectedResult = { - esRequestIndex: bulkRequestIndexCounter++, - requestedId: object.id, - rawMigratedDoc: this._serializer.savedObjectToRaw( - this._migrator.migrateDocument({ - id: object.id, - type: object.type, - attributes: object.attributes, - migrationVersion: object.migrationVersion, - ...(savedObjectNamespace && { namespace: savedObjectNamespace }), - ...(savedObjectNamespaces && { namespaces: savedObjectNamespaces }), - updated_at: time, - references: object.references || [], - originId: object.originId, - }) as SavedObjectSanitizedDoc - ), - }; + const expectedResult = { + esRequestIndex: bulkRequestIndexCounter++, + requestedId: object.id, + rawMigratedDoc: this._serializer.savedObjectToRaw( + this._migrator.migrateDocument({ + id: object.id, + type: object.type, + attributes: object.attributes, + migrationVersion: object.migrationVersion, + ...(savedObjectNamespace && { namespace: savedObjectNamespace }), + ...(savedObjectNamespaces && { namespaces: savedObjectNamespaces }), + updated_at: time, + references: object.references || [], + originId: object.originId, + }) as SavedObjectSanitizedDoc + ), + }; - bulkCreateParams.push( - { - [method]: { - _id: expectedResult.rawMigratedDoc._id, - _index: this.getIndexForType(object.type), - ...(overwrite && versionProperties), + bulkCreateParams.push( + { + [method]: { + _id: expectedResult.rawMigratedDoc._id, + _index: this.getIndexForType(object.type), + ...(overwrite && versionProperties), + }, }, - }, - expectedResult.rawMigratedDoc._source - ); + expectedResult.rawMigratedDoc._source + ); - return { tag: 'Right', value: expectedResult }; - }); + return { tag: 'Right', value: expectedResult }; + }); const bulkResponse = bulkCreateParams.length ? await this.client.bulk({ @@ -570,31 +575,30 @@ export class SavedObjectsRepository { const namespace = normalizeNamespace(options.namespace); let bulkGetRequestIndexCounter = 0; - const expectedBulkGetResults: Array< - Either, Record> - > = objects.map((object) => { - const { type, id } = object; + const expectedBulkGetResults: Array, Record>> = + objects.map((object) => { + const { type, id } = object; + + if (!this._allowedTypes.includes(type)) { + return { + tag: 'Left', + value: { + id, + type, + error: errorContent(SavedObjectsErrorHelpers.createUnsupportedTypeError(type)), + }, + }; + } - if (!this._allowedTypes.includes(type)) { return { - tag: 'Left', + tag: 'Right', value: { - id, type, - error: errorContent(SavedObjectsErrorHelpers.createUnsupportedTypeError(type)), + id, + esRequestIndex: bulkGetRequestIndexCounter++, }, }; - } - - return { - tag: 'Right', - value: { - type, - id, - esRequestIndex: bulkGetRequestIndexCounter++, - }, - }; - }); + }); const bulkGetDocs = expectedBulkGetResults.filter(isRight).map(({ value: { type, id } }) => ({ _id: this._serializer.generateRawId(namespace, type, id), @@ -931,7 +935,7 @@ export class SavedObjectsRepository { } return { - ...(body.aggregations ? { aggregations: (body.aggregations as unknown) as A } : {}), + ...(body.aggregations ? { aggregations: body.aggregations as unknown as A } : {}), page, per_page: perPage, total: body.hits.total, @@ -973,40 +977,39 @@ export class SavedObjectsRepository { } let bulkGetRequestIndexCounter = 0; - const expectedBulkGetResults: Array< - Either, Record> - > = objects.map((object) => { - const { type, id, fields, namespaces } = object; - - let error: DecoratedError | undefined; - if (!this._allowedTypes.includes(type)) { - error = SavedObjectsErrorHelpers.createUnsupportedTypeError(type); - } else { - try { - this.validateObjectNamespaces(type, id, namespaces); - } catch (e) { - error = e; + const expectedBulkGetResults: Array, Record>> = + objects.map((object) => { + const { type, id, fields, namespaces } = object; + + let error: DecoratedError | undefined; + if (!this._allowedTypes.includes(type)) { + error = SavedObjectsErrorHelpers.createUnsupportedTypeError(type); + } else { + try { + this.validateObjectNamespaces(type, id, namespaces); + } catch (e) { + error = e; + } + } + + if (error) { + return { + tag: 'Left', + value: { id, type, error: errorContent(error) }, + }; } - } - if (error) { return { - tag: 'Left', - value: { id, type, error: errorContent(error) }, + tag: 'Right', + value: { + type, + id, + fields, + namespaces, + esRequestIndex: bulkGetRequestIndexCounter++, + }, }; - } - - return { - tag: 'Right', - value: { - type, - id, - fields, - namespaces, - esRequestIndex: bulkGetRequestIndexCounter++, - }, - }; - }); + }); const getNamespaceId = (namespaces?: string[]) => namespaces !== undefined ? SavedObjectsUtils.namespaceStringToId(namespaces[0]) : namespace; @@ -1053,11 +1056,11 @@ export class SavedObjectsRepository { // @ts-expect-error MultiGetHit._source is optional if (!doc?.found || !this.rawDocExistsInNamespaces(doc, namespaces)) { - return ({ + return { id, type, error: errorContent(SavedObjectsErrorHelpers.createGenericNotFoundError(type, id)), - } as any) as SavedObject; + } as any as SavedObject; } // @ts-expect-error MultiGetHit._source is optional @@ -1100,7 +1103,7 @@ export class SavedObjectsRepository { const errorResult = result as InternalBulkResolveError; const { type, id, error } = errorResult; return { - saved_object: ({ type, id, error: errorContent(error) } as unknown) as SavedObject, + saved_object: { type, id, error: errorContent(error) } as unknown as SavedObject, outcome: 'exactMatch', }; } @@ -1352,59 +1355,58 @@ export class SavedObjectsRepository { const namespace = normalizeNamespace(options.namespace); let bulkGetRequestIndexCounter = 0; - const expectedBulkGetResults: Array< - Either, Record> - > = objects.map((object) => { - const { type, id } = object; + const expectedBulkGetResults: Array, Record>> = + objects.map((object) => { + const { type, id } = object; - if (!this._allowedTypes.includes(type)) { - return { - tag: 'Left', - value: { - id, - type, - error: errorContent(SavedObjectsErrorHelpers.createGenericNotFoundError(type, id)), - }, + if (!this._allowedTypes.includes(type)) { + return { + tag: 'Left', + value: { + id, + type, + error: errorContent(SavedObjectsErrorHelpers.createGenericNotFoundError(type, id)), + }, + }; + } + + const { attributes, references, version, namespace: objectNamespace } = object; + + if (objectNamespace === ALL_NAMESPACES_STRING) { + return { + tag: 'Left', + value: { + id, + type, + error: errorContent( + SavedObjectsErrorHelpers.createBadRequestError('"namespace" cannot be "*"') + ), + }, + }; + } + // `objectNamespace` is a namespace string, while `namespace` is a namespace ID. + // The object namespace string, if defined, will supersede the operation's namespace ID. + + const documentToSave = { + [type]: attributes, + updated_at: time, + ...(Array.isArray(references) && { references }), }; - } - const { attributes, references, version, namespace: objectNamespace } = object; + const requiresNamespacesCheck = this._registry.isMultiNamespace(object.type); - if (objectNamespace === ALL_NAMESPACES_STRING) { return { - tag: 'Left', + tag: 'Right', value: { - id, type, - error: errorContent( - SavedObjectsErrorHelpers.createBadRequestError('"namespace" cannot be "*"') - ), + id, + version, + documentToSave, + objectNamespace, + ...(requiresNamespacesCheck && { esRequestIndex: bulkGetRequestIndexCounter++ }), }, }; - } - // `objectNamespace` is a namespace string, while `namespace` is a namespace ID. - // The object namespace string, if defined, will supersede the operation's namespace ID. - - const documentToSave = { - [type]: attributes, - updated_at: time, - ...(Array.isArray(references) && { references }), - }; - - const requiresNamespacesCheck = this._registry.isMultiNamespace(object.type); - - return { - tag: 'Right', - value: { - type, - id, - version, - documentToSave, - objectNamespace, - ...(requiresNamespacesCheck && { esRequestIndex: bulkGetRequestIndexCounter++ }), - }, - }; - }); + }); const getNamespaceId = (objectNamespace?: string) => objectNamespace !== undefined @@ -1445,78 +1447,71 @@ export class SavedObjectsRepository { } let bulkUpdateRequestIndexCounter = 0; const bulkUpdateParams: object[] = []; - const expectedBulkUpdateResults: Array< - Either, Record> - > = expectedBulkGetResults.map((expectedBulkGetResult) => { - if (isLeft(expectedBulkGetResult)) { - return expectedBulkGetResult; - } + const expectedBulkUpdateResults: Array, Record>> = + expectedBulkGetResults.map((expectedBulkGetResult) => { + if (isLeft(expectedBulkGetResult)) { + return expectedBulkGetResult; + } - const { - esRequestIndex, - id, - type, - version, - documentToSave, - objectNamespace, - } = expectedBulkGetResult.value; - - let namespaces; - let versionProperties; - if (esRequestIndex !== undefined) { - const indexFound = bulkGetResponse?.statusCode !== 404; - const actualResult = indexFound ? bulkGetResponse?.body.docs[esRequestIndex] : undefined; - const docFound = indexFound && actualResult?.found === true; - if ( - !docFound || + const { esRequestIndex, id, type, version, documentToSave, objectNamespace } = + expectedBulkGetResult.value; + + let namespaces; + let versionProperties; + if (esRequestIndex !== undefined) { + const indexFound = bulkGetResponse?.statusCode !== 404; + const actualResult = indexFound ? bulkGetResponse?.body.docs[esRequestIndex] : undefined; + const docFound = indexFound && actualResult?.found === true; + if ( + !docFound || + // @ts-expect-error MultiGetHit is incorrectly missing _id, _source + !this.rawDocExistsInNamespace(actualResult, getNamespaceId(objectNamespace)) + ) { + return { + tag: 'Left', + value: { + id, + type, + error: errorContent(SavedObjectsErrorHelpers.createGenericNotFoundError(type, id)), + }, + }; + } // @ts-expect-error MultiGetHit is incorrectly missing _id, _source - !this.rawDocExistsInNamespace(actualResult, getNamespaceId(objectNamespace)) - ) { - return { - tag: 'Left', - value: { - id, - type, - error: errorContent(SavedObjectsErrorHelpers.createGenericNotFoundError(type, id)), - }, - }; - } - // @ts-expect-error MultiGetHit is incorrectly missing _id, _source - namespaces = actualResult!._source.namespaces ?? [ + namespaces = actualResult!._source.namespaces ?? [ + // @ts-expect-error MultiGetHit is incorrectly missing _id, _source + SavedObjectsUtils.namespaceIdToString(actualResult!._source.namespace), + ]; // @ts-expect-error MultiGetHit is incorrectly missing _id, _source - SavedObjectsUtils.namespaceIdToString(actualResult!._source.namespace), - ]; - // @ts-expect-error MultiGetHit is incorrectly missing _id, _source - versionProperties = getExpectedVersionProperties(version, actualResult!); - } else { - if (this._registry.isSingleNamespace(type)) { - // if `objectNamespace` is undefined, fall back to `options.namespace` - namespaces = [getNamespaceString(objectNamespace)]; + versionProperties = getExpectedVersionProperties(version, actualResult!); + } else { + if (this._registry.isSingleNamespace(type)) { + // if `objectNamespace` is undefined, fall back to `options.namespace` + namespaces = [getNamespaceString(objectNamespace)]; + } + versionProperties = getExpectedVersionProperties(version); } - versionProperties = getExpectedVersionProperties(version); - } - const expectedResult = { - type, - id, - namespaces, - esRequestIndex: bulkUpdateRequestIndexCounter++, - documentToSave: expectedBulkGetResult.value.documentToSave, - }; + const expectedResult = { + type, + id, + namespaces, + esRequestIndex: bulkUpdateRequestIndexCounter++, + documentToSave: expectedBulkGetResult.value.documentToSave, + }; - bulkUpdateParams.push( - { - update: { - _id: this._serializer.generateRawId(getNamespaceId(objectNamespace), type, id), - _index: this.getIndexForType(type), - ...versionProperties, + bulkUpdateParams.push( + { + update: { + _id: this._serializer.generateRawId(getNamespaceId(objectNamespace), type, id), + _index: this.getIndexForType(type), + ...versionProperties, + }, }, - }, - { doc: documentToSave } - ); + { doc: documentToSave } + ); - return { tag: 'Right', value: expectedResult }; - }); + return { tag: 'Right', value: expectedResult }; + }); const { refresh = DEFAULT_REFRESH_SETTING } = options; const bulkUpdateResponse = bulkUpdateParams.length diff --git a/src/core/server/saved_objects/service/lib/repository_create_repository.test.ts b/src/core/server/saved_objects/service/lib/repository_create_repository.test.ts index 9d9a2eb14b495..a87f24a1eae14 100644 --- a/src/core/server/saved_objects/service/lib/repository_create_repository.test.ts +++ b/src/core/server/saved_objects/service/lib/repository_create_repository.test.ts @@ -58,7 +58,8 @@ describe('SavedObjectsRepository#createRepository', () => { }); const migrator = mockKibanaMigrator.create({ types: typeRegistry.getAllTypes() }); - const RepositoryConstructor = (SavedObjectsRepository as unknown) as jest.Mock; + const RepositoryConstructor = + SavedObjectsRepository as unknown as jest.Mock; beforeEach(() => { logger = loggerMock.create(); @@ -68,7 +69,7 @@ describe('SavedObjectsRepository#createRepository', () => { it('should not allow a repository with an undefined type', () => { try { originalRepository.createRepository( - (migrator as unknown) as KibanaMigrator, + migrator as unknown as KibanaMigrator, typeRegistry, '.kibana-test', callAdminCluster, @@ -84,7 +85,7 @@ describe('SavedObjectsRepository#createRepository', () => { it('should create a repository without hidden types', () => { const repository = originalRepository.createRepository( - (migrator as unknown) as KibanaMigrator, + migrator as unknown as KibanaMigrator, typeRegistry, '.kibana-test', callAdminCluster, @@ -103,7 +104,7 @@ describe('SavedObjectsRepository#createRepository', () => { it('should create a repository with a unique list of hidden types', () => { const repository = originalRepository.createRepository( - (migrator as unknown) as KibanaMigrator, + migrator as unknown as KibanaMigrator, typeRegistry, '.kibana-test', callAdminCluster, diff --git a/src/core/server/saved_objects/service/lib/search_dsl/query_params.test.ts b/src/core/server/saved_objects/service/lib/search_dsl/query_params.test.ts index eacc9357d6947..437e7408b945f 100644 --- a/src/core/server/saved_objects/service/lib/search_dsl/query_params.test.ts +++ b/src/core/server/saved_objects/service/lib/search_dsl/query_params.test.ts @@ -598,9 +598,9 @@ describe('#getQueryParams', () => { const mppClauses = shouldClauses.slice(1); - expect( - mppClauses.map((clause: any) => Object.keys(clause.match_phrase_prefix)[0]) - ).toEqual(['saved.title', 'pending.title', 'saved.desc', 'pending.desc']); + expect(mppClauses.map((clause: any) => Object.keys(clause.match_phrase_prefix)[0])).toEqual( + ['saved.title', 'pending.title', 'saved.desc', 'pending.desc'] + ); }); it('uses all registered types when `type` is not provided', () => { @@ -615,9 +615,9 @@ describe('#getQueryParams', () => { const mppClauses = shouldClauses.slice(1); - expect( - mppClauses.map((clause: any) => Object.keys(clause.match_phrase_prefix)[0]) - ).toEqual(['pending.title', 'saved.title', 'shared.title', 'global.title']); + expect(mppClauses.map((clause: any) => Object.keys(clause.match_phrase_prefix)[0])).toEqual( + ['pending.title', 'saved.title', 'shared.title', 'global.title'] + ); }); it('removes the prefix search wildcard from the query', () => { @@ -644,9 +644,9 @@ describe('#getQueryParams', () => { const mppClauses = shouldClauses.slice(1); - expect( - mppClauses.map((clause: any) => Object.keys(clause.match_phrase_prefix)[0]) - ).toEqual(['saved.title', 'global.name']); + expect(mppClauses.map((clause: any) => Object.keys(clause.match_phrase_prefix)[0])).toEqual( + ['saved.title', 'global.name'] + ); }); it('supports boosting', () => { diff --git a/src/core/server/saved_objects/service/lib/utils.ts b/src/core/server/saved_objects/service/lib/utils.ts index 6942b3b376232..df79eba56d130 100644 --- a/src/core/server/saved_objects/service/lib/utils.ts +++ b/src/core/server/saved_objects/service/lib/utils.ts @@ -15,7 +15,8 @@ export const DEFAULT_NAMESPACE_STRING = 'default'; export const ALL_NAMESPACES_STRING = '*'; export const FIND_DEFAULT_PAGE = 1; export const FIND_DEFAULT_PER_PAGE = 20; -const UUID_REGEX = /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i; +const UUID_REGEX = + /^(?:[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}|00000000-0000-0000-0000-000000000000)$/i; /** * @public diff --git a/src/core/server/saved_objects/service/saved_objects_client.mock.ts b/src/core/server/saved_objects/service/saved_objects_client.mock.ts index 4f96c5c0d8cae..f87779c89a814 100644 --- a/src/core/server/saved_objects/service/saved_objects_client.mock.ts +++ b/src/core/server/saved_objects/service/saved_objects_client.mock.ts @@ -11,7 +11,7 @@ import { SavedObjectsErrorHelpers } from './lib/errors'; import { savedObjectsPointInTimeFinderMock } from './lib/point_in_time_finder.mock'; const create = () => { - const mock = ({ + const mock = { errors: SavedObjectsErrorHelpers, create: jest.fn(), bulkCreate: jest.fn(), @@ -30,7 +30,7 @@ const create = () => { removeReferencesTo: jest.fn(), collectMultiNamespaceReferences: jest.fn(), updateObjectsSpaces: jest.fn(), - } as unknown) as jest.Mocked; + } as unknown as jest.Mocked; mock.createPointInTimeFinder = savedObjectsPointInTimeFinderMock.create({ savedObjectsMock: mock, diff --git a/src/core/server/saved_objects/status.test.ts b/src/core/server/saved_objects/status.test.ts index 96bba0606110f..c830383c6eb60 100644 --- a/src/core/server/saved_objects/status.test.ts +++ b/src/core/server/saved_objects/status.test.ts @@ -108,10 +108,7 @@ describe('calculateStatus$', () => { }); it('is degraded after migrations have ran', async () => { await expect( - calculateStatus$( - of([{ status: 'skipped' }]), - esStatus$ - ) + calculateStatus$(of([{ status: 'skipped' }]), esStatus$) .pipe(take(2)) .toPromise() ).resolves.toEqual({ diff --git a/src/core/server/saved_objects/types.ts b/src/core/server/saved_objects/types.ts index 2dbc402e46269..83f46c521a836 100644 --- a/src/core/server/saved_objects/types.ts +++ b/src/core/server/saved_objects/types.ts @@ -383,9 +383,10 @@ export interface SavedObjectsTypeManagementDefinition { * the object page, relative to the base path. `uiCapabilitiesPath` is the path to check in the * {@link Capabilities | uiCapabilities} to check if the user has permission to access the object. */ - getInAppUrl?: ( - savedObject: SavedObject - ) => { path: string; uiCapabilitiesPath: string }; + getInAppUrl?: (savedObject: SavedObject) => { + path: string; + uiCapabilitiesPath: string; + }; /** * An optional export transform function that can be used transform the objects of the registered type during * the export process. diff --git a/src/core/server/server.api.md b/src/core/server/server.api.md index e6dffa23276f9..ba7973fa1ce06 100644 --- a/src/core/server/server.api.md +++ b/src/core/server/server.api.md @@ -3042,7 +3042,7 @@ export const validBodyOutput: readonly ["data", "stream"]; // Warnings were encountered during analysis: // // src/core/server/elasticsearch/client/types.ts:94:7 - (ae-forgotten-export) The symbol "Explanation" needs to be exported by the entry point index.d.ts -// src/core/server/http/router/response.ts:301:3 - (ae-forgotten-export) The symbol "KibanaResponse" needs to be exported by the entry point index.d.ts +// src/core/server/http/router/response.ts:302:3 - (ae-forgotten-export) The symbol "KibanaResponse" needs to be exported by the entry point index.d.ts // src/core/server/plugins/types.ts:377:3 - (ae-forgotten-export) The symbol "KibanaConfigType" needs to be exported by the entry point index.d.ts // src/core/server/plugins/types.ts:377:3 - (ae-forgotten-export) The symbol "SharedGlobalConfigKeys" needs to be exported by the entry point index.d.ts // src/core/server/plugins/types.ts:380:3 - (ae-forgotten-export) The symbol "SavedObjectsConfigType" needs to be exported by the entry point index.d.ts diff --git a/src/core/server/ui_settings/ui_settings_service.ts b/src/core/server/ui_settings/ui_settings_service.ts index d011b6e21907f..924aaa0717f70 100644 --- a/src/core/server/ui_settings/ui_settings_service.ts +++ b/src/core/server/ui_settings/ui_settings_service.ts @@ -36,7 +36,8 @@ export interface SetupDeps { /** @internal */ export class UiSettingsService - implements CoreService { + implements CoreService +{ private readonly log: Logger; private readonly config$: Observable; private readonly isDist: boolean; diff --git a/src/core/types/elasticsearch/search.ts b/src/core/types/elasticsearch/search.ts index e8ce9f98501f9..88d6cda3777dd 100644 --- a/src/core/types/elasticsearch/search.ts +++ b/src/core/types/elasticsearch/search.ts @@ -27,13 +27,12 @@ type KeysOfSources = T extends [infer U, ...infer V] ? KeyOfSource : {}; -type CompositeKeysOf< - TAggregationContainer extends estypes.AggregationsAggregationContainer -> = TAggregationContainer extends { - composite: { sources: [...infer TSource] }; -} - ? KeysOfSources - : unknown; +type CompositeKeysOf = + TAggregationContainer extends { + composite: { sources: [...infer TSource] }; + } + ? KeysOfSources + : unknown; type Source = estypes.SearchSourceFilter | boolean | estypes.Fields; @@ -263,13 +262,12 @@ export type AggregateOf< [key in keyof TAggregationContainer['filters']['filters']]: { doc_count: number; } & SubAggregateOf; - } & - (TAggregationContainer extends { filters: { other_bucket_key: infer TOtherBucketKey } } - ? Record< - TOtherBucketKey & string, - { doc_count: number } & SubAggregateOf - > - : unknown) & + } & (TAggregationContainer extends { filters: { other_bucket_key: infer TOtherBucketKey } } + ? Record< + TOtherBucketKey & string, + { doc_count: number } & SubAggregateOf + > + : unknown) & (TAggregationContainer extends { filters: { other_bucket: true } } ? { _other: { doc_count: number } & SubAggregateOf } : unknown) diff --git a/src/dev/build/lib/integration_tests/download.test.ts b/src/dev/build/lib/integration_tests/download.test.ts index 23c7569c54c89..9003e678e98a8 100644 --- a/src/dev/build/lib/integration_tests/download.test.ts +++ b/src/dev/build/lib/integration_tests/download.test.ts @@ -42,10 +42,12 @@ const log = new ToolingLog({ type Handler = (req: IncomingMessage, res: ServerResponse) => void; const FOO_SHA256 = '2c26b46b68ffc68ff99b453c1d30413413422d706483bfa0f98a5e886266e7ae'; -const createSendHandler = (send: any): Handler => (req, res) => { - res.statusCode = 200; - res.end(send); -}; +const createSendHandler = + (send: any): Handler => + (req, res) => { + res.statusCode = 200; + res.end(send); + }; const sendErrorHandler: Handler = (req, res) => { res.statusCode = 500; res.end(); diff --git a/src/dev/build/tasks/patch_native_modules_task.ts b/src/dev/build/tasks/patch_native_modules_task.ts index be2571c029f9d..5a2f179edeccb 100644 --- a/src/dev/build/tasks/patch_native_modules_task.ts +++ b/src/dev/build/tasks/patch_native_modules_task.ts @@ -55,8 +55,7 @@ const packages: Package[] = [ // * gzip -c build/Release/re2.node > linux-arm64-83.gz // * upload to kibana-ci-proxy-cache bucket 'linux-arm64': { - url: - 'https://storage.googleapis.com/kibana-ci-proxy-cache/node-re2/uhop/node-re2/releases/download/1.16.0/linux-arm64-83.gz', + url: 'https://storage.googleapis.com/kibana-ci-proxy-cache/node-re2/uhop/node-re2/releases/download/1.16.0/linux-arm64-83.gz', sha256: '114505c60dbf57ad30556937ac5f49213c6676ad79d92706b96949d3a63f53b4', }, 'win32-x64': { diff --git a/src/dev/code_coverage/ingest_coverage/team_assignment/enumeration_helpers.js b/src/dev/code_coverage/ingest_coverage/team_assignment/enumeration_helpers.js index 54cfbb34b5629..f7e74cc828290 100644 --- a/src/dev/code_coverage/ingest_coverage/team_assignment/enumeration_helpers.js +++ b/src/dev/code_coverage/ingest_coverage/team_assignment/enumeration_helpers.js @@ -20,7 +20,7 @@ export const trim = (ROOT) => (x) => x.replace(`${ROOT}/`, ''); export const isFileAllowed = (x) => /.(j|t)(s|sx)$/gm.test(x); export const isRejectedDir = (x) => /node_modules|__tests__|__fixture__|__fixtures__|build\//gm.test(x); -const isGlobFound = (x) => (xs) => (x === xs[0] ? false : true); +const isGlobFound = (x) => (xs) => x === xs[0] ? false : true; export const globExpands = (x) => isGlobFound(x)(prokGlob(x)); export const tryPath = (x) => { const isAGlob = isGlob(x); diff --git a/src/dev/code_coverage/ingest_coverage/utils.js b/src/dev/code_coverage/ingest_coverage/utils.js index 402cf4e71788b..b5fdaf6f1d50f 100644 --- a/src/dev/code_coverage/ingest_coverage/utils.js +++ b/src/dev/code_coverage/ingest_coverage/utils.js @@ -8,7 +8,12 @@ import chalk from 'chalk'; -export const pipe = (...fns) => fns.reduce((f, g) => (...args) => g(f(...args))); +export const pipe = (...fns) => + fns.reduce( + (f, g) => + (...args) => + g(f(...args)) + ); export const noop = () => {}; export const green = (x) => chalk.greenBright.bold(x); export const pink = (x) => chalk.bgMagenta.bold.cyan.bold(x); diff --git a/src/dev/i18n/extractors/i18n_call.test.js b/src/dev/i18n/extractors/i18n_call.test.js index b20a06d40dee8..89cd9fcbbd31f 100644 --- a/src/dev/i18n/extractors/i18n_call.test.js +++ b/src/dev/i18n/extractors/i18n_call.test.js @@ -28,15 +28,15 @@ description 3\` }); describe('dev/i18n/extractors/i18n_call', () => { test('extracts "i18n" and "i18n.translate" functions call message', () => { - let callExpressionNode = [ - ...traverseNodes(parse(i18nCallMessageSource).program.body), - ].find((node) => isCallExpression(node)); + let callExpressionNode = [...traverseNodes(parse(i18nCallMessageSource).program.body)].find( + (node) => isCallExpression(node) + ); expect(extractI18nCallMessages(callExpressionNode)).toMatchSnapshot(); - callExpressionNode = [ - ...traverseNodes(parse(translateCallMessageSource).program.body), - ].find((node) => isCallExpression(node)); + callExpressionNode = [...traverseNodes(parse(translateCallMessageSource).program.body)].find( + (node) => isCallExpression(node) + ); expect(extractI18nCallMessages(callExpressionNode)).toMatchSnapshot(); diff --git a/src/dev/i18n/utils/utils.test.js b/src/dev/i18n/utils/utils.test.js index f737c9adb9b2e..801d98194f496 100644 --- a/src/dev/i18n/utils/utils.test.js +++ b/src/dev/i18n/utils/utils.test.js @@ -68,9 +68,9 @@ describe('i18n utils', () => { }); test('should detect object property with defined key', () => { - const objectExpresssionNode = [ - ...traverseNodes(parse(objectPropertySource).program.body), - ].find((node) => isObjectExpression(node)); + const objectExpresssionNode = [...traverseNodes(parse(objectPropertySource).program.body)].find( + (node) => isObjectExpression(node) + ); const [objectExpresssionProperty] = objectExpresssionNode.properties; expect(isPropertyWithKey(objectExpresssionProperty, 'id')).toBe(true); diff --git a/src/dev/run_check_published_api_changes.ts b/src/dev/run_check_published_api_changes.ts index be2ca43432748..7c8105bc40c51 100644 --- a/src/dev/run_check_published_api_changes.ts +++ b/src/dev/run_check_published_api_changes.ts @@ -195,7 +195,7 @@ async function run(folder: string, { opts }: { opts: Options }): Promise { const extraFlags: string[] = []; - const opts = (getopts(process.argv.slice(2), { + const opts = getopts(process.argv.slice(2), { boolean: ['accept', 'docs', 'help'], string: ['filter'], default: { @@ -205,7 +205,7 @@ async function run(folder: string, { opts }: { opts: Options }): Promise 0) { for (const flag of extraFlags) { diff --git a/src/dev/run_find_plugins_with_circular_deps.ts b/src/dev/run_find_plugins_with_circular_deps.ts index 4ce71b24332c1..f7974b464fcaf 100644 --- a/src/dev/run_find_plugins_with_circular_deps.ts +++ b/src/dev/run_find_plugins_with_circular_deps.ts @@ -40,7 +40,8 @@ run( const circularDependenciesFullPaths = parseCircular(depTree).filter((circularDeps) => { const first = circularDeps[0]; const last = circularDeps[circularDeps.length - 1]; - const matchRegex = /(?(src|x-pack)\/plugins|examples|x-pack\/examples)\/(?[^\/]*)\/.*/; + const matchRegex = + /(?(src|x-pack)\/plugins|examples|x-pack\/examples)\/(?[^\/]*)\/.*/; const firstMatch = first.match(matchRegex); const lastMatch = last.match(matchRegex); diff --git a/src/plugins/advanced_settings/public/management_app/components/field/field.test.tsx b/src/plugins/advanced_settings/public/management_app/components/field/field.test.tsx index e6724e93866e7..b90efe9033da0 100644 --- a/src/plugins/advanced_settings/public/management_app/components/field/field.test.tsx +++ b/src/plugins/advanced_settings/public/management_app/components/field/field.test.tsx @@ -353,7 +353,7 @@ describe('Field', () => { (component.instance() as Field).getImageAsBase64 = ({}: Blob) => Promise.resolve(''); it('should be able to change value and cancel', async () => { - (component.instance() as Field).onImageChange(([userValue] as unknown) as FileList); + (component.instance() as Field).onImageChange([userValue] as unknown as FileList); expect(handleChange).toBeCalled(); await wrapper.setProps({ unsavedChanges: { @@ -377,9 +377,9 @@ describe('Field', () => { const updated = wrapper.update(); findTestSubject(updated, `advancedSetting-changeImage-${setting.name}`).simulate('click'); const newUserValue = `${userValue}=`; - await (component.instance() as Field).onImageChange(([ + await (component.instance() as Field).onImageChange([ newUserValue, - ] as unknown) as FileList); + ] as unknown as FileList); expect(handleChange).toBeCalled(); }); diff --git a/src/plugins/advanced_settings/public/plugin.ts b/src/plugins/advanced_settings/public/plugin.ts index 50162526eb874..b7f1455f65dfd 100644 --- a/src/plugins/advanced_settings/public/plugin.ts +++ b/src/plugins/advanced_settings/public/plugin.ts @@ -19,7 +19,8 @@ const title = i18n.translate('advancedSettings.advancedSettingsLabel', { }); export class AdvancedSettingsPlugin - implements Plugin { + implements Plugin +{ public setup( core: CoreSetup, { management, home, usageCollection }: AdvancedSettingsPluginSetup diff --git a/src/plugins/bfetch/public/batching/create_streaming_batched_function.test.ts b/src/plugins/bfetch/public/batching/create_streaming_batched_function.test.ts index 719bddc4080d0..0b6dbe49d0e81 100644 --- a/src/plugins/bfetch/public/batching/create_streaming_batched_function.test.ts +++ b/src/plugins/bfetch/public/batching/create_streaming_batched_function.test.ts @@ -28,15 +28,15 @@ const isPending = (promise: Promise): Promise => getPromiseState(promise).then((state) => state === 'pending'); const setup = () => { - const xhr = ({} as unknown) as XMLHttpRequest; + const xhr = {} as unknown as XMLHttpRequest; const { promise, resolve, reject } = defer(); const stream = new Subject(); - const fetchStreaming = (jest.fn(() => ({ + const fetchStreaming = jest.fn(() => ({ xhr, promise, stream, - })) as unknown) as jest.SpyInstance & typeof fetchStreamingReal; + })) as unknown as jest.SpyInstance & typeof fetchStreamingReal; return { fetchStreaming, diff --git a/src/plugins/bfetch/public/plugin.ts b/src/plugins/bfetch/public/plugin.ts index f97a91a0e70d3..3ad451c7713ea 100644 --- a/src/plugins/bfetch/public/plugin.ts +++ b/src/plugins/bfetch/public/plugin.ts @@ -37,7 +37,8 @@ export class BfetchPublicPlugin BfetchPublicStart, BfetchPublicSetupDependencies, BfetchPublicStartDependencies - > { + > +{ private contract!: BfetchPublicContract; constructor(private readonly initializerContext: PluginInitializerContext) {} @@ -74,29 +75,33 @@ export class BfetchPublicPlugin public stop() {} - private fetchStreaming = ( - version: string, - basePath: string, - compressionDisabled$: Observable - ): BfetchPublicSetup['fetchStreaming'] => (params) => - fetchStreamingStatic({ - ...params, - url: `${basePath}/${removeLeadingSlash(params.url)}`, - headers: { - 'Content-Type': 'application/json', - 'kbn-version': version, - ...(params.headers || {}), - }, - compressionDisabled$, - }); + private fetchStreaming = + ( + version: string, + basePath: string, + compressionDisabled$: Observable + ): BfetchPublicSetup['fetchStreaming'] => + (params) => + fetchStreamingStatic({ + ...params, + url: `${basePath}/${removeLeadingSlash(params.url)}`, + headers: { + 'Content-Type': 'application/json', + 'kbn-version': version, + ...(params.headers || {}), + }, + compressionDisabled$, + }); - private batchedFunction = ( - fetchStreaming: BfetchPublicContract['fetchStreaming'], - compressionDisabled$: Observable - ): BfetchPublicContract['batchedFunction'] => (params) => - createStreamingBatchedFunction({ - ...params, - compressionDisabled$, - fetchStreaming: params.fetchStreaming || fetchStreaming, - }); + private batchedFunction = + ( + fetchStreaming: BfetchPublicContract['fetchStreaming'], + compressionDisabled$: Observable + ): BfetchPublicContract['batchedFunction'] => + (params) => + createStreamingBatchedFunction({ + ...params, + compressionDisabled$, + fetchStreaming: params.fetchStreaming || fetchStreaming, + }); } diff --git a/src/plugins/bfetch/public/streaming/from_streaming_xhr.test.ts b/src/plugins/bfetch/public/streaming/from_streaming_xhr.test.ts index fc414cee41b71..bc5bf28183a50 100644 --- a/src/plugins/bfetch/public/streaming/from_streaming_xhr.test.ts +++ b/src/plugins/bfetch/public/streaming/from_streaming_xhr.test.ts @@ -9,14 +9,14 @@ import { fromStreamingXhr } from './from_streaming_xhr'; const createXhr = (): XMLHttpRequest => - (({ + ({ abort: () => {}, onprogress: () => {}, onreadystatechange: () => {}, readyState: 0, responseText: '', status: 0, - } as unknown) as XMLHttpRequest); + } as unknown as XMLHttpRequest); test('returns observable', () => { const xhr = createXhr(); diff --git a/src/plugins/bfetch/public/streaming/split.ts b/src/plugins/bfetch/public/streaming/split.ts index 47e4b6e8608ea..9a4439dd6ded1 100644 --- a/src/plugins/bfetch/public/streaming/split.ts +++ b/src/plugins/bfetch/public/streaming/split.ts @@ -22,27 +22,27 @@ import { filter } from 'rxjs/operators'; * asdf -> fdf -> aaa -> dfsdf * */ -export const split = (delimiter: string = '\n') => ( - in$: Observable -): Observable => { - const out$ = new Subject(); - let startingText = ''; +export const split = + (delimiter: string = '\n') => + (in$: Observable): Observable => { + const out$ = new Subject(); + let startingText = ''; - in$.subscribe( - (chunk) => { - const messages = (startingText + chunk).split(delimiter); + in$.subscribe( + (chunk) => { + const messages = (startingText + chunk).split(delimiter); - // We don't want to send the last message here, since it may or - // may not be a partial message. - messages.slice(0, -1).forEach(out$.next.bind(out$)); - startingText = messages.length ? messages[messages.length - 1] : ''; - }, - out$.error.bind(out$), - () => { - out$.next(startingText); - out$.complete(); - } - ); + // We don't want to send the last message here, since it may or + // may not be a partial message. + messages.slice(0, -1).forEach(out$.next.bind(out$)); + startingText = messages.length ? messages[messages.length - 1] : ''; + }, + out$.error.bind(out$), + () => { + out$.next(startingText); + out$.complete(); + } + ); - return out$.pipe(filter(Boolean)); -}; + return out$.pipe(filter(Boolean)); + }; diff --git a/src/plugins/bfetch/server/plugin.ts b/src/plugins/bfetch/server/plugin.ts index ee6ec77e63d9c..7b60be9a8fc75 100644 --- a/src/plugins/bfetch/server/plugin.ts +++ b/src/plugins/bfetch/server/plugin.ts @@ -108,7 +108,8 @@ export class BfetchServerPlugin BfetchServerStart, BfetchServerSetupDependencies, BfetchServerStartDependencies - > { + > +{ constructor(private readonly initializerContext: PluginInitializerContext) {} public setup(core: CoreSetup, plugins: BfetchServerSetupDependencies): BfetchServerSetup { @@ -145,79 +146,84 @@ export class BfetchServerPlugin return request.headers['x-chunk-encoding'] !== 'deflate'; } - private addStreamingResponseRoute = ({ - getStartServices, - router, - logger, - }: { - getStartServices: StartServicesAccessor; - router: ReturnType; - logger: Logger; - }): BfetchServerSetup['addStreamingResponseRoute'] => (path, handler) => { - router.post( - { - path: `/${removeLeadingSlash(path)}`, - validate: { - body: schema.any(), + private addStreamingResponseRoute = + ({ + getStartServices, + router, + logger, + }: { + getStartServices: StartServicesAccessor; + router: ReturnType; + logger: Logger; + }): BfetchServerSetup['addStreamingResponseRoute'] => + (path, handler) => { + router.post( + { + path: `/${removeLeadingSlash(path)}`, + validate: { + body: schema.any(), + }, }, - }, - async (context, request, response) => { + async (context, request, response) => { + const handlerInstance = handler(request); + const data = request.body; + const compressionDisabled = this.getCompressionDisabled(request); + return response.ok({ + headers: streamingHeaders, + body: createStream( + handlerInstance.getResponseStream(data), + logger, + compressionDisabled + ), + }); + } + ); + }; + + private createStreamingRequestHandler = + ({ + logger, + getStartServices, + }: { + logger: Logger; + getStartServices: StartServicesAccessor; + }): BfetchServerSetup['createStreamingRequestHandler'] => + (streamHandler) => + async (context, request, response) => { + const response$ = await streamHandler(context, request); + const compressionDisabled = this.getCompressionDisabled(request); + return response.ok({ + headers: streamingHeaders, + body: createStream(response$, logger, compressionDisabled), + }); + }; + + private addBatchProcessingRoute = + ( + addStreamingResponseRoute: BfetchServerSetup['addStreamingResponseRoute'] + ): BfetchServerSetup['addBatchProcessingRoute'] => + ( + path: string, + handler: ( + request: KibanaRequest + ) => BatchProcessingRouteParams + ) => { + addStreamingResponseRoute< + BatchRequestData, + BatchResponseItem + >(path, (request) => { const handlerInstance = handler(request); - const data = request.body; - const compressionDisabled = this.getCompressionDisabled(request); - return response.ok({ - headers: streamingHeaders, - body: createStream(handlerInstance.getResponseStream(data), logger, compressionDisabled), - }); - } - ); - }; - - private createStreamingRequestHandler = ({ - logger, - getStartServices, - }: { - logger: Logger; - getStartServices: StartServicesAccessor; - }): BfetchServerSetup['createStreamingRequestHandler'] => (streamHandler) => async ( - context, - request, - response - ) => { - const response$ = await streamHandler(context, request); - const compressionDisabled = this.getCompressionDisabled(request); - return response.ok({ - headers: streamingHeaders, - body: createStream(response$, logger, compressionDisabled), - }); - }; - - private addBatchProcessingRoute = ( - addStreamingResponseRoute: BfetchServerSetup['addStreamingResponseRoute'] - ): BfetchServerSetup['addBatchProcessingRoute'] => < - BatchItemData extends object, - BatchItemResult extends object, - E extends ErrorLike = ErrorLike - >( - path: string, - handler: (request: KibanaRequest) => BatchProcessingRouteParams - ) => { - addStreamingResponseRoute< - BatchRequestData, - BatchResponseItem - >(path, (request) => { - const handlerInstance = handler(request); - return { - getResponseStream: ({ batch }) => - map$(batch, async (batchItem, id) => { - try { - const result = await handlerInstance.onBatchItem(batchItem); - return { id, result }; - } catch (error) { - return { id, error: normalizeError(error) }; - } - }), - }; - }); - }; + return { + getResponseStream: ({ batch }) => + map$(batch, async (batchItem, id) => { + try { + const result = await handlerInstance.onBatchItem(batchItem); + return { id, result }; + } catch (error) { + return { id, error: normalizeError(error) }; + } + }), + }; + }); + }; } diff --git a/src/plugins/chart_expressions/expression_tagcloud/public/format_service.ts b/src/plugins/chart_expressions/expression_tagcloud/public/format_service.ts index 541e46a847260..778170321bcc3 100644 --- a/src/plugins/chart_expressions/expression_tagcloud/public/format_service.ts +++ b/src/plugins/chart_expressions/expression_tagcloud/public/format_service.ts @@ -17,6 +17,5 @@ import { createGetterSetter } from '../../../kibana_utils/public'; import { FieldFormatsStart } from '../../../field_formats/public'; -export const [getFormatService, setFormatService] = createGetterSetter( - 'fieldFormats' -); +export const [getFormatService, setFormatService] = + createGetterSetter('fieldFormats'); diff --git a/src/plugins/chart_expressions/expression_tagcloud/public/plugin.ts b/src/plugins/chart_expressions/expression_tagcloud/public/plugin.ts index 9ffb910bde213..5a8bcc8aa64bb 100644 --- a/src/plugins/chart_expressions/expression_tagcloud/public/plugin.ts +++ b/src/plugins/chart_expressions/expression_tagcloud/public/plugin.ts @@ -34,7 +34,8 @@ export type ExpressionTagcloudPluginStart = void; export class ExpressionTagcloudPlugin implements - Plugin { + Plugin +{ public setup(core: CoreSetup, { expressions, charts }: SetupDeps): ExpressionTagcloudPluginSetup { const rendererDependencies: ExpressioTagcloudRendererDependencies = { palettes: charts.palettes, diff --git a/src/plugins/chart_expressions/expression_tagcloud/server/plugin.ts b/src/plugins/chart_expressions/expression_tagcloud/server/plugin.ts index 03dd05db25fa7..11f0d03407fbe 100644 --- a/src/plugins/chart_expressions/expression_tagcloud/server/plugin.ts +++ b/src/plugins/chart_expressions/expression_tagcloud/server/plugin.ts @@ -23,7 +23,8 @@ export type ExpressionTagcloudPluginStart = void; export class ExpressionTagcloudPlugin implements - Plugin { + Plugin +{ public setup(core: CoreSetup, { expressions }: SetupDeps): ExpressionTagcloudPluginSetup { expressions.registerFunction(tagcloudFunction); } diff --git a/src/plugins/charts/public/services/active_cursor/active_cursor_utils.test.ts b/src/plugins/charts/public/services/active_cursor/active_cursor_utils.test.ts index 3230c1ec0f32b..6bccc456edbb0 100644 --- a/src/plugins/charts/public/services/active_cursor/active_cursor_utils.test.ts +++ b/src/plugins/charts/public/services/active_cursor/active_cursor_utils.test.ts @@ -34,7 +34,7 @@ describe('active_cursor_utils', () => { test('should extract accessors', () => { expect( parseSyncOptions({ - datatables: ([ + datatables: [ { columns: [ { @@ -45,7 +45,7 @@ describe('active_cursor_utils', () => { }, ], }, - ] as unknown) as Datatable[], + ] as unknown as Datatable[], }).accessors ).toMatchInlineSnapshot(` Array [ @@ -57,7 +57,7 @@ describe('active_cursor_utils', () => { test('should return isDateHistogram true in case all datatables is time based', () => { expect( parseSyncOptions({ - datatables: ([ + datatables: [ { columns: [ { @@ -84,7 +84,7 @@ describe('active_cursor_utils', () => { }, ], }, - ] as unknown) as Datatable[], + ] as unknown as Datatable[], }) ).toMatchInlineSnapshot(` Object { @@ -100,7 +100,7 @@ describe('active_cursor_utils', () => { test('should return isDateHistogram false in case of not all datatables is time based', () => { expect( parseSyncOptions({ - datatables: ([ + datatables: [ { columns: [ { @@ -124,7 +124,7 @@ describe('active_cursor_utils', () => { }, ], }, - ] as unknown) as Datatable[], + ] as unknown as Datatable[], }) ).toMatchInlineSnapshot(` Object { diff --git a/src/plugins/charts/public/services/active_cursor/use_active_cursor.test.ts b/src/plugins/charts/public/services/active_cursor/use_active_cursor.test.ts index 50e7c995a1250..b60862373f99b 100644 --- a/src/plugins/charts/public/services/active_cursor/use_active_cursor.test.ts +++ b/src/plugins/charts/public/services/active_cursor/use_active_cursor.test.ts @@ -111,7 +111,7 @@ describe.skip('useActiveCursor', () => { test('should trigger cursor pointer update (chart type: datatable - time based, event type: time)', async () => { await act( { - datatables: ([ + datatables: [ { columns: [ { @@ -125,7 +125,7 @@ describe.skip('useActiveCursor', () => { }, ], }, - ] as unknown) as Datatable[], + ] as unknown as Datatable[], }, [{ isDateHistogram: true }, { accessors: ['foo_index:foo_field'] }] ); diff --git a/src/plugins/charts/public/static/components/endzones.tsx b/src/plugins/charts/public/static/components/endzones.tsx index b2b6b3534c852..85a020e54eb37 100644 --- a/src/plugins/charts/public/static/components/endzones.tsx +++ b/src/plugins/charts/public/static/components/endzones.tsx @@ -156,32 +156,36 @@ const Prompt = () => ( ); -export const renderEndzoneTooltip = ( - xInterval?: number, - domainStart?: number, - domainEnd?: number, - formatter?: (v: any) => string, - renderValue = true -) => (headerData: TooltipValue): JSX.Element | string => { - const headerDataValue = headerData.value; - const formattedValue = formatter ? formatter(headerDataValue) : headerDataValue; - - if ( - (domainStart !== undefined && domainStart > headerDataValue) || - (domainEnd !== undefined && xInterval !== undefined && domainEnd - xInterval < headerDataValue) - ) { - return ( - <> - - {renderValue && ( - <> - -

{formattedValue}

- - )} - - ); - } +export const renderEndzoneTooltip = + ( + xInterval?: number, + domainStart?: number, + domainEnd?: number, + formatter?: (v: any) => string, + renderValue = true + ) => + (headerData: TooltipValue): JSX.Element | string => { + const headerDataValue = headerData.value; + const formattedValue = formatter ? formatter(headerDataValue) : headerDataValue; + + if ( + (domainStart !== undefined && domainStart > headerDataValue) || + (domainEnd !== undefined && + xInterval !== undefined && + domainEnd - xInterval < headerDataValue) + ) { + return ( + <> + + {renderValue && ( + <> + +

{formattedValue}

+ + )} + + ); + } - return renderValue ? formattedValue : null; -}; + return renderValue ? formattedValue : null; + }; diff --git a/src/plugins/charts/public/static/utils/transform_click_event.ts b/src/plugins/charts/public/static/utils/transform_click_event.ts index 844e2c3b301fa..7fdd59f47988d 100644 --- a/src/plugins/charts/public/static/utils/transform_click_event.ts +++ b/src/plugins/charts/public/static/utils/transform_click_event.ts @@ -112,27 +112,29 @@ function getSplitChartValue({ * @param yAccessor * @param splitAccessors */ -const columnReducer = ( - xAccessor: Accessor | AccessorFn | null, - yAccessor: Accessor | AccessorFn | null, - splitAccessors: AllSeriesAccessors, - splitChartAccessor?: Accessor | AccessorFn -) => ( - acc: Array<[index: number, id: string]>, - { id }: Datatable['columns'][number], - index: number -): Array<[index: number, id: string]> => { - if ( - (xAccessor !== null && validateAccessorId(id, xAccessor)) || - (yAccessor !== null && validateAccessorId(id, yAccessor)) || - (splitChartAccessor !== undefined && validateAccessorId(id, splitChartAccessor)) || - splitAccessors.some(([accessor]) => validateAccessorId(id, accessor)) - ) { - acc.push([index, id]); - } +const columnReducer = + ( + xAccessor: Accessor | AccessorFn | null, + yAccessor: Accessor | AccessorFn | null, + splitAccessors: AllSeriesAccessors, + splitChartAccessor?: Accessor | AccessorFn + ) => + ( + acc: Array<[index: number, id: string]>, + { id }: Datatable['columns'][number], + index: number + ): Array<[index: number, id: string]> => { + if ( + (xAccessor !== null && validateAccessorId(id, xAccessor)) || + (yAccessor !== null && validateAccessorId(id, yAccessor)) || + (splitChartAccessor !== undefined && validateAccessorId(id, splitChartAccessor)) || + splitAccessors.some(([accessor]) => validateAccessorId(id, accessor)) + ) { + acc.push([index, id]); + } - return acc; -}; + return acc; + }; /** * Finds matching row index for given accessors and geometry values @@ -142,23 +144,25 @@ const columnReducer = ( * @param yAccessor * @param splitAccessors */ -const rowFindPredicate = ( - geometry: GeometryValue | null, - xAccessor: Accessor | AccessorFn | null, - yAccessor: Accessor | AccessorFn | null, - splitAccessors: AllSeriesAccessors, - splitChartAccessor?: Accessor | AccessorFn, - splitChartValue?: string | number -) => (row: Datatable['rows'][number]): boolean => - (geometry === null || - (xAccessor !== null && - getAccessorValue(row, xAccessor) === getAccessorValue(geometry.datum, xAccessor) && - yAccessor !== null && - getAccessorValue(row, yAccessor) === getAccessorValue(geometry.datum, yAccessor) && - (splitChartAccessor === undefined || - (splitChartValue !== undefined && - getAccessorValue(row, splitChartAccessor) === splitChartValue)))) && - [...splitAccessors].every(([accessor, value]) => getAccessorValue(row, accessor) === value); +const rowFindPredicate = + ( + geometry: GeometryValue | null, + xAccessor: Accessor | AccessorFn | null, + yAccessor: Accessor | AccessorFn | null, + splitAccessors: AllSeriesAccessors, + splitChartAccessor?: Accessor | AccessorFn, + splitChartValue?: string | number + ) => + (row: Datatable['rows'][number]): boolean => + (geometry === null || + (xAccessor !== null && + getAccessorValue(row, xAccessor) === getAccessorValue(geometry.datum, xAccessor) && + yAccessor !== null && + getAccessorValue(row, yAccessor) === getAccessorValue(geometry.datum, yAccessor) && + (splitChartAccessor === undefined || + (splitChartValue !== undefined && + getAccessorValue(row, splitChartAccessor) === splitChartValue)))) && + [...splitAccessors].every(([accessor, value]) => getAccessorValue(row, accessor) === value); /** * Helper function to transform `@elastic/charts` click event into filter action event @@ -168,103 +172,106 @@ const rowFindPredicate = ( * @param splitSeriesAccessorFnMap needed when using `splitSeriesAccessors` as `AccessorFn` * @param negate */ -export const getFilterFromChartClickEventFn = ( - table: Datatable, - xAccessor: Accessor | AccessorFn, - splitSeriesAccessorFnMap?: Map, - splitChartAccessor?: Accessor | AccessorFn, - negate: boolean = false -) => (points: Array<[GeometryValue, XYChartSeriesIdentifier]>): ClickTriggerEvent => { - const data: ValueClickContext['data']['data'] = []; +export const getFilterFromChartClickEventFn = + ( + table: Datatable, + xAccessor: Accessor | AccessorFn, + splitSeriesAccessorFnMap?: Map, + splitChartAccessor?: Accessor | AccessorFn, + negate: boolean = false + ) => + (points: Array<[GeometryValue, XYChartSeriesIdentifier]>): ClickTriggerEvent => { + const data: ValueClickContext['data']['data'] = []; + + points.forEach((point) => { + const [geometry, { yAccessor, splitAccessors }] = point; + const splitChartValue = getSplitChartValue(point[1]); + const allSplitAccessors = getAllSplitAccessors(splitAccessors, splitSeriesAccessorFnMap); + const columns = table.columns.reduce>( + columnReducer(xAccessor, yAccessor, allSplitAccessors, splitChartAccessor), + [] + ); + const row = table.rows.findIndex( + rowFindPredicate( + geometry, + xAccessor, + yAccessor, + allSplitAccessors, + splitChartAccessor, + splitChartValue + ) + ); + const newData = columns.map(([column, id]) => ({ + table, + column, + row, + value: table.rows?.[row]?.[id] ?? null, + })); - points.forEach((point) => { - const [geometry, { yAccessor, splitAccessors }] = point; - const splitChartValue = getSplitChartValue(point[1]); + data.push(...newData); + }); + + return { + name: 'filterBucket', + data: { + negate, + data, + }, + }; + }; + +/** + * Helper function to get filter action event from series + */ +export const getFilterFromSeriesFn = + (table: Datatable) => + ( + { splitAccessors, ...rest }: XYChartSeriesIdentifier, + splitSeriesAccessorFnMap?: Map, + splitChartAccessor?: Accessor | AccessorFn, + negate = false + ): ClickTriggerEvent => { + const splitChartValue = getSplitChartValue(rest); const allSplitAccessors = getAllSplitAccessors(splitAccessors, splitSeriesAccessorFnMap); const columns = table.columns.reduce>( - columnReducer(xAccessor, yAccessor, allSplitAccessors, splitChartAccessor), + columnReducer(null, null, allSplitAccessors, splitChartAccessor), [] ); const row = table.rows.findIndex( - rowFindPredicate( - geometry, - xAccessor, - yAccessor, - allSplitAccessors, - splitChartAccessor, - splitChartValue - ) + rowFindPredicate(null, null, null, allSplitAccessors, splitChartAccessor, splitChartValue) ); - const newData = columns.map(([column, id]) => ({ + const data: ValueClickContext['data']['data'] = columns.map(([column, id]) => ({ table, column, row, value: table.rows?.[row]?.[id] ?? null, })); - data.push(...newData); - }); - - return { - name: 'filterBucket', - data: { - negate, - data, - }, - }; -}; - -/** - * Helper function to get filter action event from series - */ -export const getFilterFromSeriesFn = (table: Datatable) => ( - { splitAccessors, ...rest }: XYChartSeriesIdentifier, - splitSeriesAccessorFnMap?: Map, - splitChartAccessor?: Accessor | AccessorFn, - negate = false -): ClickTriggerEvent => { - const splitChartValue = getSplitChartValue(rest); - const allSplitAccessors = getAllSplitAccessors(splitAccessors, splitSeriesAccessorFnMap); - const columns = table.columns.reduce>( - columnReducer(null, null, allSplitAccessors, splitChartAccessor), - [] - ); - const row = table.rows.findIndex( - rowFindPredicate(null, null, null, allSplitAccessors, splitChartAccessor, splitChartValue) - ); - const data: ValueClickContext['data']['data'] = columns.map(([column, id]) => ({ - table, - column, - row, - value: table.rows?.[row]?.[id] ?? null, - })); - - return { - name: 'filterBucket', - data: { - negate, - data, - }, + return { + name: 'filterBucket', + data: { + negate, + data, + }, + }; }; -}; /** * Helper function to transform `@elastic/charts` brush event into brush action event */ -export const getBrushFromChartBrushEventFn = ( - table: Datatable, - xAccessor: Accessor | AccessorFn -) => ({ x: selectedRange }: XYBrushArea): BrushTriggerEvent => { - const [start, end] = selectedRange ?? [0, 0]; - const range: [number, number] = [start, end]; - const column = table.columns.findIndex(({ id }) => validateAccessorId(id, xAccessor)); +export const getBrushFromChartBrushEventFn = + (table: Datatable, xAccessor: Accessor | AccessorFn) => + ({ x: selectedRange }: XYBrushArea): BrushTriggerEvent => { + const [start, end] = selectedRange ?? [0, 0]; + const range: [number, number] = [start, end]; + const column = table.columns.findIndex(({ id }) => validateAccessorId(id, xAccessor)); - return { - data: { - table, - column, - range, - }, - name: 'brush', + return { + data: { + table, + column, + range, + }, + name: 'brush', + }; }; -}; diff --git a/src/plugins/console/public/application/containers/editor/legacy/console_editor/editor.test.tsx b/src/plugins/console/public/application/containers/editor/legacy/console_editor/editor.test.tsx index 1732dd9572b90..04b222257cd2a 100644 --- a/src/plugins/console/public/application/containers/editor/legacy/console_editor/editor.test.tsx +++ b/src/plugins/console/public/application/containers/editor/legacy/console_editor/editor.test.tsx @@ -40,7 +40,7 @@ describe('Legacy (Ace) Console Editor Component Smoke Test', () => { - + diff --git a/src/plugins/console/public/application/contexts/services_context.mock.ts b/src/plugins/console/public/application/contexts/services_context.mock.ts index c4ac8ca25378b..c19413bdd0413 100644 --- a/src/plugins/console/public/application/contexts/services_context.mock.ts +++ b/src/plugins/console/public/application/contexts/services_context.mock.ts @@ -19,7 +19,7 @@ import { ContextValue } from './services_context'; export const serviceContextMock = { create: (): ContextValue => { - const storage = new StorageMock(({} as unknown) as Storage, 'test'); + const storage = new StorageMock({} as unknown as Storage, 'test'); const http = httpServiceMock.createSetupContract(); const api = createApi({ http }); const esHostService = createEsHostService({ api }); @@ -32,7 +32,7 @@ export const serviceContextMock = { settings: new SettingsMock(storage), history: new HistoryMock(storage), notifications: notificationServiceMock.createSetupContract(), - objectStorageClient: ({} as unknown) as ObjectStorageClient, + objectStorageClient: {} as unknown as ObjectStorageClient, }, docLinkVersion: 'NA', }; diff --git a/src/plugins/console/public/application/models/legacy_core_editor/create_readonly.ts b/src/plugins/console/public/application/models/legacy_core_editor/create_readonly.ts index dc63f0dcd480c..2b87331d5f47d 100644 --- a/src/plugins/console/public/application/models/legacy_core_editor/create_readonly.ts +++ b/src/plugins/console/public/application/models/legacy_core_editor/create_readonly.ts @@ -65,7 +65,7 @@ export function createReadOnlyAceEditor(element: HTMLElement): CustomAceEditor { (function setupSession(session) { session.setMode('ace/mode/text'); - ((session as unknown) as { setFoldStyle: (v: string) => void }).setFoldStyle('markbeginend'); + (session as unknown as { setFoldStyle: (v: string) => void }).setFoldStyle('markbeginend'); session.setTabSize(2); session.setUseWrapMode(true); })(output.getSession()); diff --git a/src/plugins/console/public/application/models/legacy_core_editor/legacy_core_editor.test.mocks.ts b/src/plugins/console/public/application/models/legacy_core_editor/legacy_core_editor.test.mocks.ts index 0ee15f7a559ae..ddcb02a0ad45d 100644 --- a/src/plugins/console/public/application/models/legacy_core_editor/legacy_core_editor.test.mocks.ts +++ b/src/plugins/console/public/application/models/legacy_core_editor/legacy_core_editor.test.mocks.ts @@ -13,7 +13,7 @@ jest.mock('./mode/worker', () => { // @ts-ignore window.Worker = function () { this.postMessage = () => {}; - ((this as unknown) as { terminate: () => void }).terminate = () => {}; + (this as unknown as { terminate: () => void }).terminate = () => {}; }; // @ts-ignore diff --git a/src/plugins/console/public/application/models/legacy_core_editor/legacy_core_editor.ts b/src/plugins/console/public/application/models/legacy_core_editor/legacy_core_editor.ts index fa118532aa52d..7a90dbe138f17 100644 --- a/src/plugins/console/public/application/models/legacy_core_editor/legacy_core_editor.ts +++ b/src/plugins/console/public/application/models/legacy_core_editor/legacy_core_editor.ts @@ -41,9 +41,7 @@ export class LegacyCoreEditor implements CoreEditor { const session = this.editor.getSession(); session.setMode(new InputMode.Mode()); - ((session as unknown) as { setFoldStyle: (style: string) => void }).setFoldStyle( - 'markbeginend' - ); + (session as unknown as { setFoldStyle: (style: string) => void }).setFoldStyle('markbeginend'); session.setTabSize(2); session.setUseWrapMode(true); @@ -74,7 +72,7 @@ export class LegacyCoreEditor implements CoreEditor { // torn down, e.g. by closing the History tab, and we don't need to do anything further. if (session.bgTokenizer) { // Wait until the bgTokenizer is done running before executing the callback. - if (((session.bgTokenizer as unknown) as { running: boolean }).running) { + if ((session.bgTokenizer as unknown as { running: boolean }).running) { setTimeout(check, checkInterval); } else { resolve(); @@ -225,8 +223,8 @@ export class LegacyCoreEditor implements CoreEditor { isCompleterActive() { return Boolean( - ((this.editor as unknown) as { completer: { activated: unknown } }).completer && - ((this.editor as unknown) as { completer: { activated: unknown } }).completer.activated + (this.editor as unknown as { completer: { activated: unknown } }).completer && + (this.editor as unknown as { completer: { activated: unknown } }).completer.activated ); } diff --git a/src/plugins/console/public/lib/ace_token_provider/token_provider.ts b/src/plugins/console/public/lib/ace_token_provider/token_provider.ts index 692528fb8bced..330e86e17c16d 100644 --- a/src/plugins/console/public/lib/ace_token_provider/token_provider.ts +++ b/src/plugins/console/public/lib/ace_token_provider/token_provider.ts @@ -63,7 +63,7 @@ export class AceTokensProvider implements TokensProvider { return null; } - const tokens = (this.session.getTokens(lineNumber - 1) as unknown) as TokenInfo[]; + const tokens = this.session.getTokens(lineNumber - 1) as unknown as TokenInfo[]; if (!tokens || !tokens.length) { // We are inside of the document but have no tokens for this line. Return an empty // array to represent this empty line. @@ -74,7 +74,7 @@ export class AceTokensProvider implements TokensProvider { } getTokenAt(pos: Position): Token | null { - const tokens = (this.session.getTokens(pos.lineNumber - 1) as unknown) as TokenInfo[]; + const tokens = this.session.getTokens(pos.lineNumber - 1) as unknown as TokenInfo[]; if (tokens) { return extractTokenFromAceTokenRow(pos.lineNumber, pos.column, tokens); } diff --git a/src/plugins/console/public/lib/utils/index.ts b/src/plugins/console/public/lib/utils/index.ts index 8b8974f4e2f0d..fb0729befa60a 100644 --- a/src/plugins/console/public/lib/utils/index.ts +++ b/src/plugins/console/public/lib/utils/index.ts @@ -50,7 +50,8 @@ export function formatRequestBodyDoc(data: string[], indent: boolean) { export function extractWarningMessages(warnings: string) { // pattern for valid warning header - const re = /\d{3} [0-9a-zA-Z!#$%&'*+-.^_`|~]+ \"((?:\t| |!|[\x23-\x5b]|[\x5d-\x7e]|[\x80-\xff]|\\\\|\\")*)\"(?: \"[^"]*\")?/; + const re = + /\d{3} [0-9a-zA-Z!#$%&'*+-.^_`|~]+ \"((?:\t| |!|[\x23-\x5b]|[\x5d-\x7e]|[\x80-\xff]|\\\\|\\")*)\"(?: \"[^"]*\")?/; // split on any comma that is followed by an even number of quotes return _.map(splitOnUnquotedCommaSpace(warnings), (warning) => { const match = re.exec(warning); diff --git a/src/plugins/console/server/lib/elasticsearch_proxy_config.ts b/src/plugins/console/server/lib/elasticsearch_proxy_config.ts index bad6942d0c9af..209caaabce268 100644 --- a/src/plugins/console/server/lib/elasticsearch_proxy_config.ts +++ b/src/plugins/console/server/lib/elasticsearch_proxy_config.ts @@ -28,7 +28,8 @@ const createAgent = (legacyConfig: ESConfigForProxy) => { agentOptions.rejectUnauthorized = true; // by default, NodeJS is checking the server identify - agentOptions.checkServerIdentity = (_.noop as unknown) as https.AgentOptions['checkServerIdentity']; + agentOptions.checkServerIdentity = + _.noop as unknown as https.AgentOptions['checkServerIdentity']; break; case 'full': agentOptions.rejectUnauthorized = true; diff --git a/src/plugins/console/server/routes/api/console/proxy/create_handler.ts b/src/plugins/console/server/routes/api/console/proxy/create_handler.ts index 6a514483d14f2..8ca5720d559ce 100644 --- a/src/plugins/console/server/routes/api/console/proxy/create_handler.ts +++ b/src/plugins/console/server/routes/api/console/proxy/create_handler.ts @@ -102,93 +102,95 @@ function getProxyHeaders(req: KibanaRequest) { return headers; } -export const createHandler = ({ - log, - proxy: { readLegacyESConfig, pathFilters, proxyConfigCollection }, -}: RouteDependencies): RequestHandler => async (ctx, request, response) => { - const { body, query } = request; - const { path, method } = query; - - if (!pathFilters.some((re) => re.test(path))) { - return response.forbidden({ - body: `Error connecting to '${path}':\n\nUnable to send requests to that path.`, - headers: { - 'Content-Type': 'text/plain', - }, - }); - } - - const legacyConfig = await readLegacyESConfig(); - const { hosts } = legacyConfig; - let esIncomingMessage: IncomingMessage; - - for (let idx = 0; idx < hosts.length; ++idx) { - const host = hosts[idx]; - try { - const uri = toURL(host, path); - - // Because this can technically be provided by a settings-defined proxy config, we need to - // preserve these property names to maintain BWC. - const { timeout, agent, headers, rejectUnauthorized } = getRequestConfig( - request.headers, - legacyConfig, - proxyConfigCollection, - uri.toString() - ); - - const requestHeaders = { - ...headers, - ...getProxyHeaders(request), - }; - - esIncomingMessage = await proxyRequest({ - method: method.toLowerCase() as 'get' | 'post' | 'put' | 'delete' | 'patch' | 'head', - headers: requestHeaders, - uri, - timeout, - payload: body, - rejectUnauthorized, - agent, +export const createHandler = + ({ + log, + proxy: { readLegacyESConfig, pathFilters, proxyConfigCollection }, + }: RouteDependencies): RequestHandler => + async (ctx, request, response) => { + const { body, query } = request; + const { path, method } = query; + + if (!pathFilters.some((re) => re.test(path))) { + return response.forbidden({ + body: `Error connecting to '${path}':\n\nUnable to send requests to that path.`, + headers: { + 'Content-Type': 'text/plain', + }, }); + } - break; - } catch (e) { - // If we reached here it means we hit a lower level network issue than just, for e.g., a 500. - // We try contacting another node in that case. - log.error(e); - if (idx === hosts.length - 1) { - log.warn(`Could not connect to any configured ES node [${hosts.join(', ')}]`); - return response.customError({ - statusCode: 502, - body: e, + const legacyConfig = await readLegacyESConfig(); + const { hosts } = legacyConfig; + let esIncomingMessage: IncomingMessage; + + for (let idx = 0; idx < hosts.length; ++idx) { + const host = hosts[idx]; + try { + const uri = toURL(host, path); + + // Because this can technically be provided by a settings-defined proxy config, we need to + // preserve these property names to maintain BWC. + const { timeout, agent, headers, rejectUnauthorized } = getRequestConfig( + request.headers, + legacyConfig, + proxyConfigCollection, + uri.toString() + ); + + const requestHeaders = { + ...headers, + ...getProxyHeaders(request), + }; + + esIncomingMessage = await proxyRequest({ + method: method.toLowerCase() as 'get' | 'post' | 'put' | 'delete' | 'patch' | 'head', + headers: requestHeaders, + uri, + timeout, + payload: body, + rejectUnauthorized, + agent, }); + + break; + } catch (e) { + // If we reached here it means we hit a lower level network issue than just, for e.g., a 500. + // We try contacting another node in that case. + log.error(e); + if (idx === hosts.length - 1) { + log.warn(`Could not connect to any configured ES node [${hosts.join(', ')}]`); + return response.customError({ + statusCode: 502, + body: e, + }); + } + // Otherwise, try the next host... } - // Otherwise, try the next host... } - } - const { - statusCode, - statusMessage, - headers: { warning }, - } = esIncomingMessage!; + const { + statusCode, + statusMessage, + headers: { warning }, + } = esIncomingMessage!; + + if (method.toUpperCase() !== 'HEAD') { + return response.custom({ + statusCode: statusCode!, + body: esIncomingMessage!, + headers: { + warning: warning || '', + }, + }); + } - if (method.toUpperCase() !== 'HEAD') { return response.custom({ statusCode: statusCode!, - body: esIncomingMessage!, + body: `${statusCode} - ${statusMessage}`, headers: { warning: warning || '', + 'Content-Type': 'text/plain', }, }); - } - - return response.custom({ - statusCode: statusCode!, - body: `${statusCode} - ${statusMessage}`, - headers: { - warning: warning || '', - 'Content-Type': 'text/plain', - }, - }); -}; + }; diff --git a/src/plugins/dashboard/common/embeddable/dashboard_container_persistable_state.test.ts b/src/plugins/dashboard/common/embeddable/dashboard_container_persistable_state.test.ts index 20b2c12ab4b23..93a6bc6f6df46 100644 --- a/src/plugins/dashboard/common/embeddable/dashboard_container_persistable_state.test.ts +++ b/src/plugins/dashboard/common/embeddable/dashboard_container_persistable_state.test.ts @@ -63,9 +63,8 @@ describe('inject/extract by reference panel', () => { it('should extract the saved object panel', () => { const extract = createExtract(persistableStateService); - const { state: extractedState, references: extractedReferences } = extract( - unextractedDashboardState - ); + const { state: extractedState, references: extractedReferences } = + extract(unextractedDashboardState); expect(extractedState).toEqual(dashboardWithExtractedPanel); expect(extractedReferences[0]).toEqual(extractedSavedObjectPanelRef); diff --git a/src/plugins/dashboard/common/embeddable/embeddable_references.test.ts b/src/plugins/dashboard/common/embeddable/embeddable_references.test.ts index 5474c34136c93..d6418c3e1b40d 100644 --- a/src/plugins/dashboard/common/embeddable/embeddable_references.test.ts +++ b/src/plugins/dashboard/common/embeddable/embeddable_references.test.ts @@ -23,7 +23,7 @@ const deps: InjectDeps & ExtractDeps = { test('inject/extract panel references', () => { embeddablePersistableStateService.extract.mockImplementationOnce((state) => { - const { HARDCODED_ID, ...restOfState } = (state as unknown) as Record; + const { HARDCODED_ID, ...restOfState } = state as unknown as Record; return { state: restOfState as EmbeddableStateWithType, references: [{ id: HARDCODED_ID as string, name: 'refName', type: 'type' }], diff --git a/src/plugins/dashboard/common/embeddable/embeddable_references.ts b/src/plugins/dashboard/common/embeddable/embeddable_references.ts index 59ea238434fcf..09b05dbdcf16a 100644 --- a/src/plugins/dashboard/common/embeddable/embeddable_references.ts +++ b/src/plugins/dashboard/common/embeddable/embeddable_references.ts @@ -51,13 +51,11 @@ export function extractPanelsReferences( for (const panel of panels) { const embeddable = convertSavedDashboardPanelToPanelState(panel); - const { - state: embeddableInputWithExtractedReferences, - references, - } = deps.embeddablePersistableStateService.extract({ - ...embeddable.explicitInput, - type: embeddable.type, - }); + const { state: embeddableInputWithExtractedReferences, references } = + deps.embeddablePersistableStateService.extract({ + ...embeddable.explicitInput, + type: embeddable.type, + }); embeddable.explicitInput = omit(embeddableInputWithExtractedReferences, 'type'); const newPanel = convertPanelStateToSavedDashboardPanel(embeddable, panel.version); diff --git a/src/plugins/dashboard/common/saved_dashboard_references.ts b/src/plugins/dashboard/common/saved_dashboard_references.ts index 9757415a7bc36..95c141b5d4e7b 100644 --- a/src/plugins/dashboard/common/saved_dashboard_references.ts +++ b/src/plugins/dashboard/common/saved_dashboard_references.ts @@ -26,9 +26,7 @@ const isPre730Panel = (panel: Record): boolean => { return 'version' in panel ? Semver.gt('7.3.0', panel.version) : true; }; -function dashboardAttributesToState( - attributes: SavedObjectAttributes -): { +function dashboardAttributesToState(attributes: SavedObjectAttributes): { state: DashboardContainerStateWithType; panels: SavedDashboardPanel[]; } { @@ -85,7 +83,7 @@ export function extractReferences( return { attributes, references }; } - if (((panels as unknown) as Array>).some(isPre730Panel)) { + if ((panels as unknown as Array>).some(isPre730Panel)) { return pre730ExtractReferences({ attributes, references }, deps); } @@ -94,10 +92,8 @@ export function extractReferences( throw new Error(`"type" attribute is missing from panel "${missingTypeIndex}"`); } - const { - state: extractedState, - references: extractedReferences, - } = deps.embeddablePersistableStateService.extract(state); + const { state: extractedState, references: extractedReferences } = + deps.embeddablePersistableStateService.extract(state); const extractedPanels = panelStatesToPanels( (extractedState as DashboardContainerStateWithType).panels, diff --git a/src/plugins/dashboard/public/application/actions/export_csv_action.test.tsx b/src/plugins/dashboard/public/application/actions/export_csv_action.test.tsx index 2d12d6e797528..3d68f720d1eb3 100644 --- a/src/plugins/dashboard/public/application/actions/export_csv_action.test.tsx +++ b/src/plugins/dashboard/public/application/actions/export_csv_action.test.tsx @@ -100,7 +100,7 @@ describe('Export CSV action', () => { test('Should download a compatible Embeddable', async () => { const action = new ExportCSVAction({ core: coreStart, data: dataMock }); - const result = ((await action.execute({ embeddable, asString: true })) as unknown) as + const result = (await action.execute({ embeddable, asString: true })) as unknown as | undefined | Record; expect(result).toEqual({ @@ -118,10 +118,10 @@ describe('Export CSV action', () => { { id: ' 404' }, embeddable.getRoot() as IContainer ); - const result = ((await action.execute({ + const result = (await action.execute({ embeddable: errorEmbeddable, asString: true, - })) as unknown) as undefined | Record; + })) as unknown as undefined | Record; expect(result).toBeUndefined(); }); }); diff --git a/src/plugins/dashboard/public/application/actions/export_csv_action.tsx b/src/plugins/dashboard/public/application/actions/export_csv_action.tsx index cf643fa7d271f..cffff75251080 100644 --- a/src/plugins/dashboard/public/application/actions/export_csv_action.tsx +++ b/src/plugins/dashboard/public/application/actions/export_csv_action.tsx @@ -106,7 +106,7 @@ export class ExportCSVAction implements Action { // useful for testing if (context.asString) { - return (content as unknown) as Promise; + return content as unknown as Promise; } if (content) { diff --git a/src/plugins/dashboard/public/application/actions/library_notification_action.test.tsx b/src/plugins/dashboard/public/application/actions/library_notification_action.test.tsx index 3d001913f4c75..95e12918bb8e9 100644 --- a/src/plugins/dashboard/public/application/actions/library_notification_action.test.tsx +++ b/src/plugins/dashboard/public/application/actions/library_notification_action.test.tsx @@ -44,10 +44,10 @@ let unlinkAction: UnlinkFromLibraryAction; beforeEach(async () => { coreStart = coreMock.createStart(); - unlinkAction = ({ + unlinkAction = { getDisplayName: () => 'unlink from dat library', execute: jest.fn(), - } as unknown) as UnlinkFromLibraryAction; + } as unknown as UnlinkFromLibraryAction; const containerOptions = { ExitFullScreenButton: () => null, diff --git a/src/plugins/dashboard/public/application/actions/library_notification_popover.test.tsx b/src/plugins/dashboard/public/application/actions/library_notification_popover.test.tsx index 3204a0b38fc84..fab640694cb64 100644 --- a/src/plugins/dashboard/public/application/actions/library_notification_popover.test.tsx +++ b/src/plugins/dashboard/public/application/actions/library_notification_popover.test.tsx @@ -73,10 +73,10 @@ describe('LibraryNotificationPopover', () => { } defaultProps = { - unlinkAction: ({ + unlinkAction: { execute: jest.fn(), getDisplayName: () => 'test unlink', - } as unknown) as LibraryNotificationProps['unlinkAction'], + } as unknown as LibraryNotificationProps['unlinkAction'], displayName: 'test display', context: { embeddable: contactCardEmbeddable }, icon: 'testIcon', diff --git a/src/plugins/dashboard/public/application/actions/replace_panel_flyout.tsx b/src/plugins/dashboard/public/application/actions/replace_panel_flyout.tsx index fcca31c2a50ee..09195f1491854 100644 --- a/src/plugins/dashboard/public/application/actions/replace_panel_flyout.tsx +++ b/src/plugins/dashboard/public/application/actions/replace_panel_flyout.tsx @@ -53,9 +53,8 @@ export class ReplacePanelFlyout extends React.Component { public onReplacePanel = async (savedObjectId: string, type: string, name: string) => { const { panelToRemove, container } = this.props; - const { w, h, x, y } = (container.getInput().panels[ - panelToRemove.id - ] as DashboardPanelState).gridData; + const { w, h, x, y } = (container.getInput().panels[panelToRemove.id] as DashboardPanelState) + .gridData; const { id } = await container.addNewEmbeddable(type, { savedObjectId, diff --git a/src/plugins/dashboard/public/application/dashboard_app.tsx b/src/plugins/dashboard/public/application/dashboard_app.tsx index 638b1c83e9dc6..dcaf541619d6f 100644 --- a/src/plugins/dashboard/public/application/dashboard_app.tsx +++ b/src/plugins/dashboard/public/application/dashboard_app.tsx @@ -34,14 +34,8 @@ export function DashboardApp({ redirectTo, history, }: DashboardAppProps) { - const { - core, - chrome, - embeddable, - onAppLeave, - uiSettings, - data, - } = useKibana().services; + const { core, chrome, embeddable, onAppLeave, uiSettings, data } = + useKibana().services; const kbnUrlStateStorage = useMemo( () => diff --git a/src/plugins/dashboard/public/application/dashboard_router.tsx b/src/plugins/dashboard/public/application/dashboard_router.tsx index 073160b698d96..f160aef14f3a6 100644 --- a/src/plugins/dashboard/public/application/dashboard_router.tsx +++ b/src/plugins/dashboard/public/application/dashboard_router.tsx @@ -113,8 +113,8 @@ export async function mountApp({ savedObjectsClient: coreStart.savedObjects.client, savedDashboards: dashboardStart.getSavedDashboardLoader(), savedObjectsTagging: savedObjectsTaggingOss?.getTaggingApi(), - allowByValueEmbeddables: initializerContext.config.get() - .allowByValueEmbeddables, + allowByValueEmbeddables: + initializerContext.config.get().allowByValueEmbeddables, dashboardCapabilities: { show: Boolean(coreStart.application.capabilities.dashboard.show), saveQuery: Boolean(coreStart.application.capabilities.dashboard.saveQuery), diff --git a/src/plugins/dashboard/public/application/embeddable/dashboard_container_by_value_renderer.tsx b/src/plugins/dashboard/public/application/embeddable/dashboard_container_by_value_renderer.tsx index a4d96b557ac97..4384dc06cee9a 100644 --- a/src/plugins/dashboard/public/application/embeddable/dashboard_container_by_value_renderer.tsx +++ b/src/plugins/dashboard/public/application/embeddable/dashboard_container_by_value_renderer.tsx @@ -17,10 +17,13 @@ interface Props { // TODO: add other props as needed } -export const createDashboardContainerByValueRenderer = ({ - factory, -}: { - factory: DashboardContainerFactory; -}): React.FC => (props: Props) => ( - -); +export const createDashboardContainerByValueRenderer = + ({ factory }: { factory: DashboardContainerFactory }): React.FC => + (props: Props) => + ( + + ); diff --git a/src/plugins/dashboard/public/application/embeddable/dashboard_container_factory.tsx b/src/plugins/dashboard/public/application/embeddable/dashboard_container_factory.tsx index 2e984ccfa5ba9..19fa1ea1de443 100644 --- a/src/plugins/dashboard/public/application/embeddable/dashboard_container_factory.tsx +++ b/src/plugins/dashboard/public/application/embeddable/dashboard_container_factory.tsx @@ -31,7 +31,8 @@ export type DashboardContainerFactory = EmbeddableFactory< >; export class DashboardContainerFactoryDefinition implements - EmbeddableFactoryDefinition { + EmbeddableFactoryDefinition +{ public readonly isContainerType = true; public readonly type = DASHBOARD_CONTAINER_TYPE; diff --git a/src/plugins/dashboard/public/application/embeddable/viewport/dashboard_viewport.test.tsx b/src/plugins/dashboard/public/application/embeddable/viewport/dashboard_viewport.test.tsx index 690d1b177cdb5..4397705691314 100644 --- a/src/plugins/dashboard/public/application/embeddable/viewport/dashboard_viewport.test.tsx +++ b/src/plugins/dashboard/public/application/embeddable/viewport/dashboard_viewport.test.tsx @@ -33,9 +33,10 @@ const presentationUtil = getStubPluginServices(); const ExitFullScreenButton = () =>
EXIT
; -function getProps( - props?: Partial -): { props: DashboardViewportProps; options: DashboardContainerServices } { +function getProps(props?: Partial): { + props: DashboardViewportProps; + options: DashboardContainerServices; +} { const { setup, doStart } = embeddablePluginMock.createInstance(); setup.registerEmbeddableFactory( CONTACT_CARD_EMBEDDABLE, diff --git a/src/plugins/dashboard/public/application/embeddable/viewport/dashboard_viewport.tsx b/src/plugins/dashboard/public/application/embeddable/viewport/dashboard_viewport.tsx index 35b304f7cc65b..e401721d48442 100644 --- a/src/plugins/dashboard/public/application/embeddable/viewport/dashboard_viewport.tsx +++ b/src/plugins/dashboard/public/application/embeddable/viewport/dashboard_viewport.tsx @@ -35,13 +35,8 @@ export class DashboardViewport extends React.Component { - const { - isFullScreenMode, - useMargins, - title, - description, - isEmbeddedExternally, - } = this.props.container.getInput(); + const { isFullScreenMode, useMargins, title, description, isEmbeddedExternally } = + this.props.container.getInput(); if (this.mounted) { this.setState({ isFullScreenMode, @@ -90,14 +80,8 @@ export class DashboardViewport extends React.Component
{ const coreStart = coreMock.createStart(); - const containerOptions = ({ + const containerOptions = { notifications: services.core.notifications, savedObjectMetaData: {} as unknown, ExitFullScreenButton: () => null, @@ -94,7 +94,7 @@ const setupEmbeddableFactory = ( inspector: {} as unknown, uiActions: {} as unknown, http: coreStart.http, - } as unknown) as DashboardContainerServices; + } as unknown as DashboardContainerServices; const dashboardContainer = new DashboardContainer( { ...getSampleDashboardInput(), id }, @@ -103,9 +103,9 @@ const setupEmbeddableFactory = ( const deferEmbeddableCreate = defer(); services.embeddable.getEmbeddableFactory = jest.fn().mockImplementation( () => - (({ + ({ create: () => deferEmbeddableCreate.promise, - } as unknown) as EmbeddableFactory) + } as unknown as EmbeddableFactory) ); const dashboardDestroySpy = jest.spyOn(dashboardContainer, 'destroy'); @@ -230,7 +230,7 @@ describe('Dashboard initial state', () => { savedDashboards.get = jest.fn().mockImplementation((id?: string) => Promise.resolve( getSavedDashboardMock({ - getFilters: () => [({ meta: { test: 'filterMeTimbers' } } as unknown) as Filter], + getFilters: () => [{ meta: { test: 'filterMeTimbers' } } as unknown as Filter], timeRestore: true, timeFrom: 'now-13d', timeTo: 'now', @@ -253,16 +253,16 @@ describe('Dashboard initial state', () => { to: 'now', }); expect(services.data.query.filterManager.setAppFilters).toHaveBeenCalledWith([ - ({ meta: { test: 'filterMeTimbers' } } as unknown) as Filter, + { meta: { test: 'filterMeTimbers' } } as unknown as Filter, ]); }); it('Combines session state and URL state into initial state', async () => { - const dashboardSessionStorage = ({ + const dashboardSessionStorage = { getState: jest .fn() .mockReturnValue({ viewMode: ViewMode.EDIT, description: 'this should be overwritten' }), - } as unknown) as DashboardSessionStorage; + } as unknown as DashboardSessionStorage; const kbnUrlStateStorage = createKbnUrlStateStorage(); kbnUrlStateStorage.set('_a', { description: 'with this' }); const { renderHookResult, embeddableFactoryResult } = renderDashboardAppStateHook({ diff --git a/src/plugins/dashboard/public/application/lib/convert_dashboard_state.ts b/src/plugins/dashboard/public/application/lib/convert_dashboard_state.ts index ad84b794a2379..123ef381f25f6 100644 --- a/src/plugins/dashboard/public/application/lib/convert_dashboard_state.ts +++ b/src/plugins/dashboard/public/application/lib/convert_dashboard_state.ts @@ -91,16 +91,8 @@ export const stateToDashboardContainerInput = ({ const { filterManager, timefilter: timefilterService } = queryService; const { timefilter } = timefilterService; - const { - expandedPanelId, - fullScreenMode, - description, - options, - viewMode, - panels, - query, - title, - } = dashboardState; + const { expandedPanelId, fullScreenMode, description, options, viewMode, panels, query, title } = + dashboardState; return { refreshConfig: timefilter.getRefreshInterval(), diff --git a/src/plugins/dashboard/public/application/lib/diff_dashboard_state.ts b/src/plugins/dashboard/public/application/lib/diff_dashboard_state.ts index 8f0c8acf81022..e718c98cb3626 100644 --- a/src/plugins/dashboard/public/application/lib/diff_dashboard_state.ts +++ b/src/plugins/dashboard/public/application/lib/diff_dashboard_state.ts @@ -27,8 +27,8 @@ export const diffDashboardContainerInput = ( newInput: DashboardContainerInput ) => { return commonDiffFilters( - (originalInput as unknown) as DashboardDiffCommonFilters, - (newInput as unknown) as DashboardDiffCommonFilters, + originalInput as unknown as DashboardDiffCommonFilters, + newInput as unknown as DashboardDiffCommonFilters, ['searchSessionId', 'lastReloadRequestTime', 'executionContext'] ); }; @@ -38,8 +38,8 @@ export const diffDashboardState = ( newState: DashboardState ): Partial => { const common = commonDiffFilters( - (original as unknown) as DashboardDiffCommonFilters, - (newState as unknown) as DashboardDiffCommonFilters, + original as unknown as DashboardDiffCommonFilters, + newState as unknown as DashboardDiffCommonFilters, ['viewMode', 'panels', 'options', 'savedQuery', 'expandedPanelId'], true ); @@ -55,8 +55,8 @@ const optionsAreEqual = (optionsA: DashboardOptions, optionsB: DashboardOptions) const optionKeys = [...Object.keys(optionsA), ...Object.keys(optionsB)]; for (const key of optionKeys) { if ( - Boolean(((optionsA as unknown) as { [key: string]: boolean })[key]) !== - Boolean(((optionsB as unknown) as { [key: string]: boolean })[key]) + Boolean((optionsA as unknown as { [key: string]: boolean })[key]) !== + Boolean((optionsB as unknown as { [key: string]: boolean })[key]) ) { return false; } @@ -78,8 +78,8 @@ const panelsAreEqual = (panelsA: DashboardPanelMap, panelsB: DashboardPanelMap): if ( Object.keys( commonDiff( - (panelsA[id] as unknown) as DashboardDiffCommon, - (panelsB[id] as unknown) as DashboardDiffCommon, + panelsA[id] as unknown as DashboardDiffCommon, + panelsB[id] as unknown as DashboardDiffCommon, ['panelRefName'] ) ).length > 0 diff --git a/src/plugins/dashboard/public/application/lib/migrate_app_state.test.ts b/src/plugins/dashboard/public/application/lib/migrate_app_state.test.ts index f3470de76badb..3ddcb1265e0bd 100644 --- a/src/plugins/dashboard/public/application/lib/migrate_app_state.test.ts +++ b/src/plugins/dashboard/public/application/lib/migrate_app_state.test.ts @@ -29,7 +29,7 @@ test('migrate app state from 6.0', async () => { migrateAppState(appState as any, '8.0'); expect(appState.uiState).toBeUndefined(); - const newPanel = (appState.panels[0] as unknown) as SavedDashboardPanel; + const newPanel = appState.panels[0] as unknown as SavedDashboardPanel; expect(newPanel.gridData.w).toBe(24); expect(newPanel.gridData.h).toBe(15); @@ -62,7 +62,7 @@ test('migrate sort from 6.1', async () => { migrateAppState(appState as any, TARGET_VERSION); expect(appState.uiState).toBeUndefined(); - const newPanel = (appState.panels[0] as unknown) as SavedDashboardPanel; + const newPanel = appState.panels[0] as unknown as SavedDashboardPanel; expect(newPanel.gridData.w).toBe(24); expect(newPanel.gridData.h).toBe(15); expect((newPanel as any).sort).toBeUndefined(); @@ -89,7 +89,7 @@ test('migrates 6.0 even when uiState does not exist', async () => { migrateAppState(appState as any, '8.0'); expect((appState as any).uiState).toBeUndefined(); - const newPanel = (appState.panels[0] as unknown) as SavedDashboardPanel; + const newPanel = appState.panels[0] as unknown as SavedDashboardPanel; expect(newPanel.gridData.w).toBe(24); expect(newPanel.gridData.h).toBe(15); expect((newPanel as any).sort).toBeUndefined(); @@ -119,7 +119,7 @@ test('6.2 migration adjusts w & h without margins', async () => { migrateAppState(appState as any, '8.0'); expect((appState as any).uiState).toBeUndefined(); - const newPanel = (appState.panels[0] as unknown) as SavedDashboardPanel; + const newPanel = appState.panels[0] as unknown as SavedDashboardPanel; expect(newPanel.gridData.w).toBe(28); expect(newPanel.gridData.h).toBe(15); expect(newPanel.gridData.x).toBe(8); @@ -151,7 +151,7 @@ test('6.2 migration adjusts w & h with margins', async () => { migrateAppState(appState as any, '8.0'); expect((appState as any).uiState).toBeUndefined(); - const newPanel = (appState.panels[0] as unknown) as SavedDashboardPanel; + const newPanel = appState.panels[0] as unknown as SavedDashboardPanel; expect(newPanel.gridData.w).toBe(28); expect(newPanel.gridData.h).toBe(12); expect(newPanel.gridData.x).toBe(8); diff --git a/src/plugins/dashboard/public/application/lib/migrate_app_state.ts b/src/plugins/dashboard/public/application/lib/migrate_app_state.ts index 06290205d65df..03e436aea78f2 100644 --- a/src/plugins/dashboard/public/application/lib/migrate_app_state.ts +++ b/src/plugins/dashboard/public/application/lib/migrate_app_state.ts @@ -41,14 +41,16 @@ export function migrateAppState( ); } - const panelNeedsMigration = (appState.panels as Array< - | SavedDashboardPanelTo60 - | SavedDashboardPanel610 - | SavedDashboardPanel620 - | SavedDashboardPanel630 - | SavedDashboardPanel640To720 - | SavedDashboardPanel730ToLatest - >).some((panel) => { + const panelNeedsMigration = ( + appState.panels as Array< + | SavedDashboardPanelTo60 + | SavedDashboardPanel610 + | SavedDashboardPanel620 + | SavedDashboardPanel630 + | SavedDashboardPanel640To720 + | SavedDashboardPanel730ToLatest + > + ).some((panel) => { if ((panel as { version?: string }).version === undefined) return true; const version = (panel as SavedDashboardPanel730ToLatest).version; diff --git a/src/plugins/dashboard/public/application/lib/sync_dashboard_container_input.ts b/src/plugins/dashboard/public/application/lib/sync_dashboard_container_input.ts index 21010158dc46d..6d06863d02179 100644 --- a/src/plugins/dashboard/public/application/lib/sync_dashboard_container_input.ts +++ b/src/plugins/dashboard/public/application/lib/sync_dashboard_container_input.ts @@ -44,12 +44,8 @@ type SyncDashboardContainerProps = SyncDashboardContainerCommon & ApplyContainer export const syncDashboardContainerInput = ( syncDashboardContainerProps: SyncDashboardContainerProps ) => { - const { - history, - dashboardContainer, - $onDashboardStateChange, - $triggerDashboardRefresh, - } = syncDashboardContainerProps; + const { history, dashboardContainer, $onDashboardStateChange, $triggerDashboardRefresh } = + syncDashboardContainerProps; const subscriptions = new Subscription(); subscriptions.add( dashboardContainer diff --git a/src/plugins/dashboard/public/application/listing/dashboard_listing.tsx b/src/plugins/dashboard/public/application/listing/dashboard_listing.tsx index 5f5923cb78696..6508bd9f355e1 100644 --- a/src/plugins/dashboard/public/application/listing/dashboard_listing.tsx +++ b/src/plugins/dashboard/public/application/listing/dashboard_listing.tsx @@ -163,12 +163,8 @@ export const DashboardListing = ({ : []; }, [savedObjectsTagging]); - const { - getEntityName, - getTableCaption, - getTableListTitle, - getEntityNamePlural, - } = dashboardListingTable; + const { getEntityName, getTableCaption, getTableListTitle, getEntityNamePlural } = + dashboardListingTable; return ( { return `/app/${appId}${options?.path}`; }), -} as unknown) as ApplicationStart; +} as unknown as ApplicationStart; const history = createHashHistory(); const kbnUrlStateStorage = createKbnUrlStateStorage({ diff --git a/src/plugins/dashboard/public/application/test_helpers/make_default_services.ts b/src/plugins/dashboard/public/application/test_helpers/make_default_services.ts index ee7ed41c37b1d..cce2b4eb042ef 100644 --- a/src/plugins/dashboard/public/application/test_helpers/make_default_services.ts +++ b/src/plugins/dashboard/public/application/test_helpers/make_default_services.ts @@ -48,13 +48,13 @@ export function makeDefaultServices(): DashboardAppServices { .fn() .mockImplementation((id?: string) => Promise.resolve(getSavedDashboardMock({ id }))); - const dashboardSessionStorage = ({ + const dashboardSessionStorage = { getDashboardIdsWithUnsavedChanges: jest .fn() .mockResolvedValue(['dashboardUnsavedOne', 'dashboardUnsavedTwo']), getState: jest.fn().mockReturnValue(undefined), setState: jest.fn(), - } as unknown) as DashboardSessionStorage; + } as unknown as DashboardSessionStorage; dashboardSessionStorage.clearState = jest.fn(); const defaultCapabilities: DashboardAppCapabilities = { diff --git a/src/plugins/dashboard/public/application/top_nav/editor_menu.tsx b/src/plugins/dashboard/public/application/top_nav/editor_menu.tsx index 74d725bb4d104..0ddd0902b719f 100644 --- a/src/plugins/dashboard/public/application/top_nav/editor_menu.tsx +++ b/src/plugins/dashboard/public/application/top_nav/editor_menu.tsx @@ -39,13 +39,8 @@ interface FactoryGroup { } export const EditorMenu = ({ dashboardContainer, createNewVisType }: Props) => { - const { - core, - embeddable, - visualizations, - usageCollection, - uiSettings, - } = useKibana().services; + const { core, embeddable, visualizations, usageCollection, uiSettings } = + useKibana().services; const IS_DARK_THEME = uiSettings.get('theme:darkMode'); diff --git a/src/plugins/dashboard/public/application/top_nav/show_share_modal.tsx b/src/plugins/dashboard/public/application/top_nav/show_share_modal.tsx index b9c77dec87b66..879afd4b9d305 100644 --- a/src/plugins/dashboard/public/application/top_nav/show_share_modal.tsx +++ b/src/plugins/dashboard/public/application/top_nav/show_share_modal.tsx @@ -38,7 +38,7 @@ interface ShowShareModalProps { export const showPublicUrlSwitch = (anonymousUserCapabilities: Capabilities) => { if (!anonymousUserCapabilities.dashboard) return false; - const dashboard = (anonymousUserCapabilities.dashboard as unknown) as DashboardAppCapabilities; + const dashboard = anonymousUserCapabilities.dashboard as unknown as DashboardAppCapabilities; return !!dashboard.show; }; diff --git a/src/plugins/dashboard/public/plugin.tsx b/src/plugins/dashboard/public/plugin.tsx index acaf1cee7092b..d4e4de2558678 100644 --- a/src/plugins/dashboard/public/plugin.tsx +++ b/src/plugins/dashboard/public/plugin.tsx @@ -146,7 +146,8 @@ export interface DashboardStart { export class DashboardPlugin implements - Plugin { + Plugin +{ constructor(private initializerContext: PluginInitializerContext) {} private appStateUpdater = new BehaviorSubject(() => ({})); @@ -164,7 +165,8 @@ export class DashboardPlugin core: CoreSetup, { share, embeddable, home, urlForwarding, data, usageCollection }: DashboardSetupDependencies ): DashboardSetup { - this.dashboardFeatureFlagConfig = this.initializerContext.config.get(); + this.dashboardFeatureFlagConfig = + this.initializerContext.config.get(); const startServices = core.getStartServices(); if (share) { @@ -418,9 +420,8 @@ export class DashboardPlugin return { getSavedDashboardLoader: () => savedDashboardLoader, getDashboardContainerByValueRenderer: () => { - const dashboardContainerFactory = plugins.embeddable.getEmbeddableFactory( - DASHBOARD_CONTAINER_TYPE - ); + const dashboardContainerFactory = + plugins.embeddable.getEmbeddableFactory(DASHBOARD_CONTAINER_TYPE); if (!dashboardContainerFactory) { throw new Error(`${DASHBOARD_CONTAINER_TYPE} Embeddable Factory not found`); diff --git a/src/plugins/dashboard/public/saved_dashboards/saved_dashboard.ts b/src/plugins/dashboard/public/saved_dashboards/saved_dashboard.ts index 7c056e04c1cd6..b81cf57bbc963 100644 --- a/src/plugins/dashboard/public/saved_dashboards/saved_dashboard.ts +++ b/src/plugins/dashboard/public/saved_dashboards/saved_dashboard.ts @@ -127,5 +127,5 @@ export function createSavedDashboardClass( // Unfortunately this throws a typescript error without the casting. I think it's due to the // convoluted way SavedObjects are created. - return (SavedDashboard as unknown) as new (id: string) => DashboardSavedObject; + return SavedDashboard as unknown as new (id: string) => DashboardSavedObject; } diff --git a/src/plugins/dashboard/server/plugin.ts b/src/plugins/dashboard/server/plugin.ts index 6c1eea29f5297..898c1745efccc 100644 --- a/src/plugins/dashboard/server/plugin.ts +++ b/src/plugins/dashboard/server/plugin.ts @@ -30,7 +30,8 @@ interface SetupDeps { } export class DashboardPlugin - implements Plugin { + implements Plugin +{ private readonly logger: Logger; constructor(initializerContext: PluginInitializerContext) { diff --git a/src/plugins/dashboard/server/saved_objects/dashboard_migrations.ts b/src/plugins/dashboard/server/saved_objects/dashboard_migrations.ts index 7848a2e46487c..e0cd410ce5e8f 100644 --- a/src/plugins/dashboard/server/saved_objects/dashboard_migrations.ts +++ b/src/plugins/dashboard/server/saved_objects/dashboard_migrations.ts @@ -134,7 +134,7 @@ function createExtractPanelReferencesMigration( const injectedAttributes = injectReferences( { - attributes: (doc.attributes as unknown) as SavedObjectAttributes, + attributes: doc.attributes as unknown as SavedObjectAttributes, references, }, { embeddablePersistableStateService: deps.embeddable } @@ -159,56 +159,59 @@ type ValueOrReferenceInput = SavedObjectEmbeddableInput & { }; // Runs the embeddable migrations on each panel -const migrateByValuePanels = ( - migrate: MigrateFunction, - version: string -): SavedObjectMigrationFn => (doc: any) => { - const { attributes } = doc; - // Skip if panelsJSON is missing otherwise this will cause saved object import to fail when - // importing objects without panelsJSON. At development time of this, there is no guarantee each saved - // object has panelsJSON in all previous versions of kibana. - if (typeof attributes?.panelsJSON !== 'string') { - return doc; - } - const panels = JSON.parse(attributes.panelsJSON) as SavedDashboardPanel[]; - // Same here, prevent failing saved object import if ever panels aren't an array. - if (!Array.isArray(panels)) { - return doc; - } - const newPanels: SavedDashboardPanel[] = []; - panels.forEach((panel) => { - // Convert each panel into a state that can be passed to EmbeddablesSetup.migrate - const originalPanelState = convertSavedDashboardPanelToPanelState(panel); - - // saved vis is used to store by value input for Visualize. This should eventually be renamed to `attributes` to align with Lens and Maps - if (originalPanelState.explicitInput.attributes || originalPanelState.explicitInput.savedVis) { - // If this panel is by value, migrate the state using embeddable migrations - const migratedInput = migrate({ - ...originalPanelState.explicitInput, - type: originalPanelState.type, - }); - // Convert the embeddable state back into the panel shape - newPanels.push( - convertPanelStateToSavedDashboardPanel( - { - ...originalPanelState, - explicitInput: { ...migratedInput, id: migratedInput.id as string }, - }, - version - ) - ); - } else { - newPanels.push(panel); +const migrateByValuePanels = + (migrate: MigrateFunction, version: string): SavedObjectMigrationFn => + (doc: any) => { + const { attributes } = doc; + // Skip if panelsJSON is missing otherwise this will cause saved object import to fail when + // importing objects without panelsJSON. At development time of this, there is no guarantee each saved + // object has panelsJSON in all previous versions of kibana. + if (typeof attributes?.panelsJSON !== 'string') { + return doc; } - }); - return { - ...doc, - attributes: { - ...attributes, - panelsJSON: JSON.stringify(newPanels), - }, + const panels = JSON.parse(attributes.panelsJSON) as SavedDashboardPanel[]; + // Same here, prevent failing saved object import if ever panels aren't an array. + if (!Array.isArray(panels)) { + return doc; + } + const newPanels: SavedDashboardPanel[] = []; + panels.forEach((panel) => { + // Convert each panel into a state that can be passed to EmbeddablesSetup.migrate + const originalPanelState = + convertSavedDashboardPanelToPanelState(panel); + + // saved vis is used to store by value input for Visualize. This should eventually be renamed to `attributes` to align with Lens and Maps + if ( + originalPanelState.explicitInput.attributes || + originalPanelState.explicitInput.savedVis + ) { + // If this panel is by value, migrate the state using embeddable migrations + const migratedInput = migrate({ + ...originalPanelState.explicitInput, + type: originalPanelState.type, + }); + // Convert the embeddable state back into the panel shape + newPanels.push( + convertPanelStateToSavedDashboardPanel( + { + ...originalPanelState, + explicitInput: { ...migratedInput, id: migratedInput.id as string }, + }, + version + ) + ); + } else { + newPanels.push(panel); + } + }); + return { + ...doc, + attributes: { + ...attributes, + panelsJSON: JSON.stringify(newPanels), + }, + }; }; -}; export interface DashboardSavedObjectTypeMigrationsDeps { embeddable: EmbeddableSetup; diff --git a/src/plugins/dashboard/server/saved_objects/migrate_match_all_query.test.ts b/src/plugins/dashboard/server/saved_objects/migrate_match_all_query.test.ts index 645c518439dd0..bf8d8fb225842 100644 --- a/src/plugins/dashboard/server/saved_objects/migrate_match_all_query.test.ts +++ b/src/plugins/dashboard/server/saved_objects/migrate_match_all_query.test.ts @@ -9,7 +9,7 @@ import { migrateMatchAllQuery } from './migrate_match_all_query'; import { SavedObjectMigrationContext, SavedObjectMigrationFn } from 'kibana/server'; -const savedObjectMigrationContext = (null as unknown) as SavedObjectMigrationContext; +const savedObjectMigrationContext = null as unknown as SavedObjectMigrationContext; describe('migrate match_all query', () => { test('should migrate obsolete match_all query', () => { diff --git a/src/plugins/dashboard/server/saved_objects/replace_index_pattern_reference.test.ts b/src/plugins/dashboard/server/saved_objects/replace_index_pattern_reference.test.ts index 01207fb4e3404..41dbcbe05d44f 100644 --- a/src/plugins/dashboard/server/saved_objects/replace_index_pattern_reference.test.ts +++ b/src/plugins/dashboard/server/saved_objects/replace_index_pattern_reference.test.ts @@ -10,7 +10,7 @@ import type { SavedObjectMigrationContext, SavedObjectMigrationFn } from 'kibana import { replaceIndexPatternReference } from './replace_index_pattern_reference'; describe('replaceIndexPatternReference', () => { - const savedObjectMigrationContext = (null as unknown) as SavedObjectMigrationContext; + const savedObjectMigrationContext = null as unknown as SavedObjectMigrationContext; test('should replace index_pattern to index-pattern', () => { const migratedDoc = replaceIndexPatternReference( diff --git a/src/plugins/dashboard/server/usage/dashboard_telemetry.test.ts b/src/plugins/dashboard/server/usage/dashboard_telemetry.test.ts index 60f1f7eb0955c..974d80f9c0f4e 100644 --- a/src/plugins/dashboard/server/usage/dashboard_telemetry.test.ts +++ b/src/plugins/dashboard/server/usage/dashboard_telemetry.test.ts @@ -14,42 +14,42 @@ import { collectByValueLensInfo, } from './dashboard_telemetry'; -const visualizationType1ByValue = ({ +const visualizationType1ByValue = { embeddableConfig: { savedVis: { type: 'type1', }, }, type: 'visualization', -} as unknown) as SavedDashboardPanel730ToLatest; +} as unknown as SavedDashboardPanel730ToLatest; -const visualizationType2ByValue = ({ +const visualizationType2ByValue = { embeddableConfig: { savedVis: { type: 'type2', }, }, type: 'visualization', -} as unknown) as SavedDashboardPanel730ToLatest; +} as unknown as SavedDashboardPanel730ToLatest; const visualizationType2ByReference = { ...visualizationType2ByValue, id: '11111', }; -const lensTypeAByValue = ({ +const lensTypeAByValue = { type: 'lens', embeddableConfig: { attributes: { visualizationType: 'a', }, }, -} as unknown) as SavedDashboardPanel730ToLatest; +} as unknown as SavedDashboardPanel730ToLatest; const lensTypeAByReference = { ...lensTypeAByValue, id: '22222', }; -const lensXYSeriesA = ({ +const lensXYSeriesA = { type: 'lens', embeddableConfig: { attributes: { @@ -61,9 +61,9 @@ const lensXYSeriesA = ({ }, }, }, -} as unknown) as SavedDashboardPanel730ToLatest; +} as unknown as SavedDashboardPanel730ToLatest; -const lensXYSeriesB = ({ +const lensXYSeriesB = { type: 'lens', embeddableConfig: { attributes: { @@ -91,7 +91,7 @@ const lensXYSeriesB = ({ }, }, }, -} as unknown) as SavedDashboardPanel730ToLatest; +} as unknown as SavedDashboardPanel730ToLatest; describe('dashboard telemetry', () => { it('collects information about dashboard panels', () => { @@ -126,10 +126,10 @@ describe('dashboard telemetry', () => { }); it('handles misshapen visualization panels without errors', () => { - const badVisualizationPanel = ({ + const badVisualizationPanel = { embeddableConfig: {}, type: 'visualization', - } as unknown) as SavedDashboardPanel730ToLatest; + } as unknown as SavedDashboardPanel730ToLatest; const panels = [badVisualizationPanel, visualizationType1ByValue]; @@ -164,12 +164,12 @@ describe('dashboard telemetry', () => { }); it('handles misshapen lens panels', () => { - const badPanel = ({ + const badPanel = { type: 'lens', embeddableConfig: { oops: 'no visualization type', }, - } as unknown) as SavedDashboardPanel730ToLatest; + } as unknown as SavedDashboardPanel730ToLatest; const panels = [badPanel, lensTypeAByValue]; diff --git a/src/plugins/dashboard/server/usage/dashboard_telemetry.ts b/src/plugins/dashboard/server/usage/dashboard_telemetry.ts index fb1ddff469f57..8d6ebeab08a98 100644 --- a/src/plugins/dashboard/server/usage/dashboard_telemetry.ts +++ b/src/plugins/dashboard/server/usage/dashboard_telemetry.ts @@ -173,9 +173,9 @@ export async function collectDashboardTelemetry( embeddablePersistableStateService: embeddableService, }); - const panels = (JSON.parse( + const panels = JSON.parse( attributes.panelsJSON as string - ) as unknown) as SavedDashboardPanel730ToLatest[]; + ) as unknown as SavedDashboardPanel730ToLatest[]; collectForPanels(panels, collectorData); collectEmbeddableData(panels, collectorData, embeddableService); diff --git a/src/plugins/dashboard/server/usage/find_by_value_embeddables.test.ts b/src/plugins/dashboard/server/usage/find_by_value_embeddables.test.ts index 303d48edc2129..8a3cdd71539f8 100644 --- a/src/plugins/dashboard/server/usage/find_by_value_embeddables.test.ts +++ b/src/plugins/dashboard/server/usage/find_by_value_embeddables.test.ts @@ -9,23 +9,23 @@ import { SavedDashboardPanel730ToLatest } from '../../common'; import { findByValueEmbeddables } from './find_by_value_embeddables'; -const visualizationByValue = ({ +const visualizationByValue = { embeddableConfig: { value: 'visualization-by-value', }, type: 'visualization', -} as unknown) as SavedDashboardPanel730ToLatest; +} as unknown as SavedDashboardPanel730ToLatest; -const mapByValue = ({ +const mapByValue = { embeddableConfig: { value: 'map-by-value', }, type: 'map', -} as unknown) as SavedDashboardPanel730ToLatest; +} as unknown as SavedDashboardPanel730ToLatest; -const embeddableByRef = ({ +const embeddableByRef = { panelRefName: 'panel_ref_1', -} as unknown) as SavedDashboardPanel730ToLatest; +} as unknown as SavedDashboardPanel730ToLatest; describe('findByValueEmbeddables', () => { it('finds the by value embeddables for the given type', async () => { diff --git a/src/plugins/dashboard/server/usage/find_by_value_embeddables.ts b/src/plugins/dashboard/server/usage/find_by_value_embeddables.ts index 27bbe79a009f0..c3c32fbcd6a61 100644 --- a/src/plugins/dashboard/server/usage/find_by_value_embeddables.ts +++ b/src/plugins/dashboard/server/usage/find_by_value_embeddables.ts @@ -20,9 +20,9 @@ export const findByValueEmbeddables = async ( return dashboards.saved_objects .map((dashboard) => { try { - return (JSON.parse( + return JSON.parse( dashboard.attributes.panelsJSON as string - ) as unknown) as SavedDashboardPanel730ToLatest[]; + ) as unknown as SavedDashboardPanel730ToLatest[]; } catch (exception) { return []; } diff --git a/src/plugins/data/common/data_views/data_views/index_pattern.test.ts b/src/plugins/data/common/data_views/data_views/index_pattern.test.ts index a12d4897fe11b..5fd1d0d051acb 100644 --- a/src/plugins/data/common/data_views/data_views/index_pattern.test.ts +++ b/src/plugins/data/common/data_views/data_views/index_pattern.test.ts @@ -289,17 +289,17 @@ describe('IndexPattern', () => { describe('toSpec', () => { test('should match snapshot', () => { - const formatter = ({ + const formatter = { toJSON: () => ({ id: 'number', params: { pattern: '$0,0.[00]' } }), - } as unknown) as FieldFormat; + } as unknown as FieldFormat; indexPattern.getFormatterForField = () => formatter; expect(indexPattern.toSpec()).toMatchSnapshot(); }); test('can restore from spec', async () => { - const formatter = ({ + const formatter = { toJSON: () => ({ id: 'number', params: { pattern: '$0,0.[00]' } }), - } as unknown) as FieldFormat; + } as unknown as FieldFormat; indexPattern.getFormatterForField = () => formatter; const spec = indexPattern.toSpec(); const restoredPattern = new IndexPattern({ diff --git a/src/plugins/data/common/data_views/data_views/index_patterns.test.ts b/src/plugins/data/common/data_views/data_views/index_patterns.test.ts index 5f389d36e3bb6..996700b3c9118 100644 --- a/src/plugins/data/common/data_views/data_views/index_patterns.test.ts +++ b/src/plugins/data/common/data_views/data_views/index_patterns.test.ts @@ -86,11 +86,11 @@ describe('IndexPatterns', () => { }); indexPatterns = new DataViewsService({ - uiSettings: ({ + uiSettings: { get: () => Promise.resolve(false), getAll: () => {}, - } as any) as UiSettingsCommon, - savedObjectsClient: (savedObjectsClient as unknown) as SavedObjectsClientCommon, + } as any as UiSettingsCommon, + savedObjectsClient: savedObjectsClient as unknown as SavedObjectsClientCommon, apiClient: createFieldsFetcher(), fieldFormats, onNotification: () => {}, @@ -233,9 +233,9 @@ describe('IndexPatterns', () => { const title = 'kibana-*'; indexPatterns.createSavedObject = jest.fn(() => - Promise.resolve(({ + Promise.resolve({ id: 'id', - } as unknown) as DataView) + } as unknown as DataView) ); indexPatterns.setDefault = jest.fn(); await indexPatterns.createAndSave({ title }); diff --git a/src/plugins/data/common/data_views/field.stub.ts b/src/plugins/data/common/data_views/field.stub.ts index bafd3fc2fc35f..03bb0dee33db3 100644 --- a/src/plugins/data/common/data_views/field.stub.ts +++ b/src/plugins/data/common/data_views/field.stub.ts @@ -404,6 +404,6 @@ export const stubLogstashFieldSpecMap: Record = { }, }; -export const stubLogstashFields: IndexPatternField[] = Object.values( - stubLogstashFieldSpecMap -).map((spec) => createIndexPatternFieldStub({ spec })); +export const stubLogstashFields: IndexPatternField[] = Object.values(stubLogstashFieldSpecMap).map( + (spec) => createIndexPatternFieldStub({ spec }) +); diff --git a/src/plugins/data/common/data_views/fields/index_pattern_field.test.ts b/src/plugins/data/common/data_views/fields/index_pattern_field.test.ts index 18d331b4e1351..906cb0ad1badd 100644 --- a/src/plugins/data/common/data_views/fields/index_pattern_field.test.ts +++ b/src/plugins/data/common/data_views/fields/index_pattern_field.test.ts @@ -38,10 +38,10 @@ describe('Field', function () { scripted: true, subType: { multi: { parent: 'parent' }, nested: { path: 'path' } }, displayName: 'displayName', - indexPattern: ({ + indexPattern: { fieldFormatMap: { name: {}, _source: {}, _score: {}, _id: {} }, - } as unknown) as IndexPattern, - $$spec: ({} as unknown) as FieldSpec, + } as unknown as IndexPattern, + $$spec: {} as unknown as FieldSpec, conflictDescriptions: { a: ['b', 'c'], d: ['e'] }, runtimeField: { type: 'keyword' as RuntimeField['type'], @@ -153,14 +153,14 @@ describe('Field', function () { it('spec snapshot', () => { const field = new IndexPatternField(fieldValues); const getFormatterForField = () => - (({ + ({ toJSON: () => ({ id: 'number', params: { pattern: '$0,0.[00]', }, }), - } as unknown) as FieldFormat); + } as unknown as FieldFormat); expect(field.toSpec({ getFormatterForField })).toMatchSnapshot(); }); }); diff --git a/src/plugins/data/common/es_query/get_es_query_config.test.ts b/src/plugins/data/common/es_query/get_es_query_config.test.ts index 5513f2649265f..984d964ea9b32 100644 --- a/src/plugins/data/common/es_query/get_es_query_config.test.ts +++ b/src/plugins/data/common/es_query/get_es_query_config.test.ts @@ -11,7 +11,7 @@ import { getEsQueryConfig } from './get_es_query_config'; import { IUiSettingsClient } from 'kibana/public'; import { UI_SETTINGS } from '..'; -const config = ({ +const config = { get(item: string) { return get(config, item); }, @@ -27,7 +27,7 @@ const config = ({ 'dateFormat:tz': { dateFormatTZ: 'Browser', }, -} as unknown) as IUiSettingsClient; +} as unknown as IUiSettingsClient; describe('getEsQueryConfig', () => { test('should return the parameters of an Elasticsearch query config requested', () => { diff --git a/src/plugins/data/common/query/timefilter/get_time.test.ts b/src/plugins/data/common/query/timefilter/get_time.test.ts index 70f6f418cc739..fc35eeed48e67 100644 --- a/src/plugins/data/common/query/timefilter/get_time.test.ts +++ b/src/plugins/data/common/query/timefilter/get_time.test.ts @@ -18,7 +18,7 @@ describe('get_time', () => { const clock = sinon.useFakeTimers(moment.utc([2000, 1, 1, 0, 0, 0, 0]).valueOf()); const filter = getTime( - ({ + { id: 'test', title: 'test', timeFieldName: 'date', @@ -32,7 +32,7 @@ describe('get_time', () => { filterable: true, }, ], - } as unknown) as IIndexPattern, + } as unknown as IIndexPattern, { from: 'now-60y', to: 'now' } ) as RangeFilter; expect(filter.range.date).toEqual({ @@ -47,7 +47,7 @@ describe('get_time', () => { const clock = sinon.useFakeTimers(moment.utc([2000, 1, 1, 0, 0, 0, 0]).valueOf()); const filter = getTime( - ({ + { id: 'test', title: 'test', timeFieldName: 'date', @@ -69,7 +69,7 @@ describe('get_time', () => { filterable: true, }, ], - } as unknown) as IIndexPattern, + } as unknown as IIndexPattern, { from: 'now-60y', to: 'now' }, { fieldName: 'myCustomDate' } ) as RangeFilter; @@ -84,7 +84,7 @@ describe('get_time', () => { describe('getRelativeTime', () => { test('do not coerce relative time to absolute time when given flag', () => { const filter = getRelativeTime( - ({ + { id: 'test', title: 'test', timeFieldName: 'date', @@ -106,7 +106,7 @@ describe('get_time', () => { filterable: true, }, ], - } as unknown) as IIndexPattern, + } as unknown as IIndexPattern, { from: 'now-60y', to: 'now' }, { fieldName: 'myCustomDate' } ) as RangeFilter; @@ -120,7 +120,7 @@ describe('get_time', () => { test('do not coerce relative time to absolute time when given flag - with mixed from and to times', () => { const clock = sinon.useFakeTimers(moment.utc().valueOf()); const filter = getRelativeTime( - ({ + { id: 'test', title: 'test', timeFieldName: 'date', @@ -142,7 +142,7 @@ describe('get_time', () => { filterable: true, }, ], - } as unknown) as IIndexPattern, + } as unknown as IIndexPattern, { from: '2020-09-01T08:30:00.000Z', to: 'now', diff --git a/src/plugins/data/common/search/aggs/agg_config.test.ts b/src/plugins/data/common/search/aggs/agg_config.test.ts index 2cb875eb9c047..93903ee0c3210 100644 --- a/src/plugins/data/common/search/aggs/agg_config.test.ts +++ b/src/plugins/data/common/search/aggs/agg_config.test.ts @@ -52,10 +52,10 @@ describe('AggConfig', () => { indexPattern = { id: '1234', title: 'logstash-*', - fields: ({ + fields: { getByName: (name: string) => fields.find((f) => f.name === name), filter: () => fields, - } as unknown) as IndexPattern['fields'], + } as unknown as IndexPattern['fields'], getFormatterForField: (field: IndexPatternField) => ({ toJSON: () => ({}), }), @@ -247,7 +247,7 @@ describe('AggConfig', () => { it('fails when the list is not defined', () => { expect(() => { - AggConfig.nextId((undefined as unknown) as IAggConfig[]); + AggConfig.nextId(undefined as unknown as IAggConfig[]); }).toThrowError(); }); }); @@ -847,7 +847,7 @@ describe('AggConfig', () => { }); it('empty label if the type is not defined', () => { - aggConfig.type = (undefined as unknown) as AggType; + aggConfig.type = undefined as unknown as AggType; const label = aggConfig.makeLabel(); expect(label).toBe(''); }); diff --git a/src/plugins/data/common/search/aggs/agg_configs.test.ts b/src/plugins/data/common/search/aggs/agg_configs.test.ts index 59b306c2df0b1..104cd3b2815bc 100644 --- a/src/plugins/data/common/search/aggs/agg_configs.test.ts +++ b/src/plugins/data/common/search/aggs/agg_configs.test.ts @@ -627,9 +627,7 @@ describe('AggConfigs', () => { }, }, }; - const mergedResponse = ac.postFlightTransform( - (response as unknown) as IEsSearchResponse - ); + const mergedResponse = ac.postFlightTransform(response as unknown as IEsSearchResponse); expect(mergedResponse.rawResponse).toEqual({ aggregations: { '1': { @@ -724,9 +722,7 @@ describe('AggConfigs', () => { }, }, }; - const mergedResponse = ac.postFlightTransform( - (response as unknown) as IEsSearchResponse - ); + const mergedResponse = ac.postFlightTransform(response as unknown as IEsSearchResponse); expect(mergedResponse.rawResponse).toEqual({ aggregations: { '1': { diff --git a/src/plugins/data/common/search/aggs/agg_configs.ts b/src/plugins/data/common/search/aggs/agg_configs.ts index 08a7022ee8942..cb9ac56b99cd9 100644 --- a/src/plugins/data/common/search/aggs/agg_configs.ts +++ b/src/plugins/data/common/search/aggs/agg_configs.ts @@ -358,9 +358,9 @@ export class AggConfigs { } getTimeShiftInterval(): moment.Duration | undefined { - const splitAgg = (this.getAll().filter( - (agg) => agg.type.type === AggGroupNames.Buckets - ) as IBucketAggConfig[]).find((agg) => agg.type.splitForTimeShift(agg, this)); + const splitAgg = ( + this.getAll().filter((agg) => agg.type.type === AggGroupNames.Buckets) as IBucketAggConfig[] + ).find((agg) => agg.type.splitForTimeShift(agg, this)); return splitAgg?.type.getTimeShiftInterval(splitAgg); } diff --git a/src/plugins/data/common/search/aggs/agg_type.test.ts b/src/plugins/data/common/search/aggs/agg_type.test.ts index 01f38697e4db8..cdcf096a95f6a 100644 --- a/src/plugins/data/common/search/aggs/agg_type.test.ts +++ b/src/plugins/data/common/search/aggs/agg_type.test.ts @@ -13,7 +13,7 @@ describe('AggType Class', () => { describe('constructor', () => { test("requires a valid config object as it's first param", () => { expect(() => { - const aggConfig: AggTypeConfig = (undefined as unknown) as AggTypeConfig; + const aggConfig: AggTypeConfig = undefined as unknown as AggTypeConfig; new AggType(aggConfig); }).toThrowError(); }); @@ -136,7 +136,7 @@ describe('AggType Class', () => { describe('getSerializedFormat', () => { test('returns the default serialized field format if it exists', () => { - const aggConfig = ({ + const aggConfig = { params: { field: { format: { @@ -147,7 +147,7 @@ describe('AggType Class', () => { aggConfigs: { indexPattern: { getFormatterForField: () => ({ toJSON: () => ({ id: 'format' }) }) }, }, - } as unknown) as IAggConfig; + } as unknown as IAggConfig; const aggType = new AggType({ name: 'name', expressionName: 'aggName', @@ -161,9 +161,9 @@ describe('AggType Class', () => { }); test('returns an empty object if a field param does not exist', () => { - const aggConfig = ({ + const aggConfig = { params: {}, - } as unknown) as IAggConfig; + } as unknown as IAggConfig; const aggType = new AggType({ name: 'name', expressionName: 'aggName', @@ -173,7 +173,7 @@ describe('AggType Class', () => { }); test('uses a custom getSerializedFormat function if defined', () => { - const aggConfig = ({ + const aggConfig = { params: { field: { format: { @@ -181,7 +181,7 @@ describe('AggType Class', () => { }, }, }, - } as unknown) as IAggConfig; + } as unknown as IAggConfig; const getSerializedFormat = jest.fn().mockReturnValue({ id: 'hello' }); const aggType = new AggType({ name: 'name', diff --git a/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.test.ts b/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.test.ts index 9d61178405b52..215d3ce13f55e 100644 --- a/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.test.ts +++ b/src/plugins/data/common/search/aggs/buckets/_terms_other_bucket_helper.test.ts @@ -42,7 +42,7 @@ const indexPattern = { ], } as IndexPattern; -indexPattern.fields.getByName = (name) => (({ name } as unknown) as IndexPatternField); +indexPattern.fields.getByName = (name) => ({ name } as unknown as IndexPatternField); const singleTerm = { aggs: [ diff --git a/src/plugins/data/common/search/aggs/buckets/terms.test.ts b/src/plugins/data/common/search/aggs/buckets/terms.test.ts index 6345e29b6fbe4..50aa4eb2b0357 100644 --- a/src/plugins/data/common/search/aggs/buckets/terms.test.ts +++ b/src/plugins/data/common/search/aggs/buckets/terms.test.ts @@ -55,7 +55,7 @@ describe('Terms Agg', () => { ], } as IndexPattern; - indexPattern.fields.getByName = (name) => (({ name } as unknown) as IndexPatternField); + indexPattern.fields.getByName = (name) => ({ name } as unknown as IndexPatternField); indexPattern.fields.filter = () => indexPattern.fields; return new AggConfigs( @@ -257,7 +257,7 @@ describe('Terms Agg', () => { ], } as IndexPattern; - indexPattern.fields.getByName = (name) => (({ name } as unknown) as IndexPatternField); + indexPattern.fields.getByName = (name) => ({ name } as unknown as IndexPatternField); indexPattern.fields.filter = () => indexPattern.fields; const aggConfigs = new AggConfigs( diff --git a/src/plugins/data/common/search/aggs/metrics/lib/make_nested_label.test.ts b/src/plugins/data/common/search/aggs/metrics/lib/make_nested_label.test.ts index c8468d8c35ae9..d5ee3e513ec5e 100644 --- a/src/plugins/data/common/search/aggs/metrics/lib/make_nested_label.test.ts +++ b/src/plugins/data/common/search/aggs/metrics/lib/make_nested_label.test.ts @@ -11,7 +11,7 @@ import { IMetricAggConfig } from '../metric_agg_type'; describe('metric agg make_nested_label', () => { const generateAggConfig = (metricLabel: string): IMetricAggConfig => { - return ({ + return { params: { customMetric: { makeLabel: () => { @@ -22,7 +22,7 @@ describe('metric agg make_nested_label', () => { getParam(this: IMetricAggConfig, key: string) { return this.params[key]; }, - } as unknown) as IMetricAggConfig; + } as unknown as IMetricAggConfig; }; it('should return a metric label with prefix', () => { diff --git a/src/plugins/data/common/search/aggs/metrics/lib/parent_pipeline_agg_helper.ts b/src/plugins/data/common/search/aggs/metrics/lib/parent_pipeline_agg_helper.ts index ac2beaf574256..478b8309272e3 100644 --- a/src/plugins/data/common/search/aggs/metrics/lib/parent_pipeline_agg_helper.ts +++ b/src/plugins/data/common/search/aggs/metrics/lib/parent_pipeline_agg_helper.ts @@ -50,9 +50,8 @@ export const parentPipelineAggHelper = { metricAgg.id = termsAgg.id + '-metric'; return metricAgg; }, - modifyAggConfigOnSearchRequestStart: forwardModifyAggConfigOnSearchRequestStart( - 'customMetric' - ), + modifyAggConfigOnSearchRequestStart: + forwardModifyAggConfigOnSearchRequestStart('customMetric'), write: noop, }, { diff --git a/src/plugins/data/common/search/aggs/metrics/lib/sibling_pipeline_agg_helper.ts b/src/plugins/data/common/search/aggs/metrics/lib/sibling_pipeline_agg_helper.ts index 2564fcb7a002b..da110c1abb7e9 100644 --- a/src/plugins/data/common/search/aggs/metrics/lib/sibling_pipeline_agg_helper.ts +++ b/src/plugins/data/common/search/aggs/metrics/lib/sibling_pipeline_agg_helper.ts @@ -53,9 +53,8 @@ export const siblingPipelineAggHelper = { orderAgg.id = agg.id + '-bucket'; return orderAgg; }, - modifyAggConfigOnSearchRequestStart: forwardModifyAggConfigOnSearchRequestStart( - 'customBucket' - ), + modifyAggConfigOnSearchRequestStart: + forwardModifyAggConfigOnSearchRequestStart('customBucket'), write: () => {}, }, { @@ -68,9 +67,8 @@ export const siblingPipelineAggHelper = { orderAgg.id = agg.id + '-metric'; return orderAgg; }, - modifyAggConfigOnSearchRequestStart: forwardModifyAggConfigOnSearchRequestStart( - 'customMetric' - ), + modifyAggConfigOnSearchRequestStart: + forwardModifyAggConfigOnSearchRequestStart('customMetric'), write: (agg: IMetricAggConfig, output: Record) => siblingPipelineAggWriter(agg, output), }, diff --git a/src/plugins/data/common/search/aggs/param_types/field.test.ts b/src/plugins/data/common/search/aggs/param_types/field.test.ts index 561b1020f27f0..d54e9c5b4eba0 100644 --- a/src/plugins/data/common/search/aggs/param_types/field.test.ts +++ b/src/plugins/data/common/search/aggs/param_types/field.test.ts @@ -35,9 +35,9 @@ describe('Field', () => { ], }; - const agg = ({ + const agg = { getIndexPattern: jest.fn(() => indexPattern), - } as unknown) as IAggConfig; + } as unknown as IAggConfig; describe('constructor', () => { it('it is an instance of BaseParamType', () => { diff --git a/src/plugins/data/common/search/aggs/types.ts b/src/plugins/data/common/search/aggs/types.ts index 7a87a83b7b00b..fec02a5ae23fd 100644 --- a/src/plugins/data/common/search/aggs/types.ts +++ b/src/plugins/data/common/search/aggs/types.ts @@ -141,9 +141,8 @@ export interface AggExpressionType { } /** @internal */ -export type AggExpressionFunctionArgs< - Name extends keyof AggParamsMapping -> = AggParamsMapping[Name] & Pick; +export type AggExpressionFunctionArgs = + AggParamsMapping[Name] & Pick; /** * A global list of the param interfaces for each agg type. diff --git a/src/plugins/data/common/search/aggs/utils/get_date_histogram_meta.ts b/src/plugins/data/common/search/aggs/utils/get_date_histogram_meta.ts index 87086edd56e72..aa6e460b9c4dc 100644 --- a/src/plugins/data/common/search/aggs/utils/get_date_histogram_meta.ts +++ b/src/plugins/data/common/search/aggs/utils/get_date_histogram_meta.ts @@ -25,7 +25,7 @@ export const getDateHistogramMetaDataByDatatableColumn = ( ) => { if (column.meta.source !== 'esaggs') return; if (column.meta.sourceParams?.type !== BUCKET_TYPES.DATE_HISTOGRAM) return; - const params = (column.meta.sourceParams.params as unknown) as AggParamsDateHistogram; + const params = column.meta.sourceParams.params as unknown as AggParamsDateHistogram; let interval: string | undefined; if (params.used_interval && params.used_interval !== 'auto') { diff --git a/src/plugins/data/common/search/aggs/utils/get_number_histogram_interval.ts b/src/plugins/data/common/search/aggs/utils/get_number_histogram_interval.ts index e1c0cf2d69c60..067f87bd8481e 100644 --- a/src/plugins/data/common/search/aggs/utils/get_number_histogram_interval.ts +++ b/src/plugins/data/common/search/aggs/utils/get_number_histogram_interval.ts @@ -19,7 +19,7 @@ import { BUCKET_TYPES } from '../buckets/bucket_agg_types'; export const getNumberHistogramIntervalByDatatableColumn = (column: DatatableColumn) => { if (column.meta.source !== 'esaggs') return; if (column.meta.sourceParams?.type !== BUCKET_TYPES.HISTOGRAM) return; - const params = (column.meta.sourceParams.params as unknown) as AggParamsHistogram; + const params = column.meta.sourceParams.params as unknown as AggParamsHistogram; if (!params.used_interval || typeof params.used_interval === 'string') { return undefined; diff --git a/src/plugins/data/common/search/aggs/utils/infer_time_zone.test.ts b/src/plugins/data/common/search/aggs/utils/infer_time_zone.test.ts index 91f69f3bfb148..f1cfc3f0e81e0 100644 --- a/src/plugins/data/common/search/aggs/utils/infer_time_zone.test.ts +++ b/src/plugins/data/common/search/aggs/utils/infer_time_zone.test.ts @@ -34,7 +34,7 @@ describe('inferTimeZone', () => { expect( inferTimeZone( { field: 'mydatefield' }, - ({ + { typeMeta: { aggs: { date_histogram: { @@ -44,7 +44,7 @@ describe('inferTimeZone', () => { }, }, }, - } as unknown) as IndexPattern, + } as unknown as IndexPattern, () => false, jest.fn() ) @@ -59,7 +59,7 @@ describe('inferTimeZone', () => { name: 'mydatefield', } as IndexPatternField, }, - ({ + { typeMeta: { aggs: { date_histogram: { @@ -69,7 +69,7 @@ describe('inferTimeZone', () => { }, }, }, - } as unknown) as IndexPattern, + } as unknown as IndexPattern, () => false, jest.fn() ) diff --git a/src/plugins/data/common/search/aggs/utils/time_splits.ts b/src/plugins/data/common/search/aggs/utils/time_splits.ts index ddc94119686a2..99ea9fcefc179 100644 --- a/src/plugins/data/common/search/aggs/utils/time_splits.ts +++ b/src/plugins/data/common/search/aggs/utils/time_splits.ts @@ -213,9 +213,9 @@ export function mergeTimeShifts( } const baseSubAggregate = target[key] as estypes.AggregationsAggregate; // only supported bucket formats in agg configs are array of buckets and record of buckets for filters - const baseBuckets = ('buckets' in baseSubAggregate - ? baseSubAggregate.buckets - : undefined) as GenericBucket[] | Record | undefined; + const baseBuckets = ( + 'buckets' in baseSubAggregate ? baseSubAggregate.buckets : undefined + ) as GenericBucket[] | Record | undefined; // merge if (isArray(buckets) && isArray(baseBuckets)) { const baseBucketMap: Record = {}; @@ -259,8 +259,9 @@ export function mergeTimeShifts( if (shouldSplit) { // multiple time shifts caused a filters agg in the tree we have to merge if (hasMultipleTimeShifts && cursor.time_offset_split) { - const timeShiftedBuckets = (cursor.time_offset_split as estypes.AggregationsFiltersAggregate) - .buckets as Record; + const timeShiftedBuckets = ( + cursor.time_offset_split as estypes.AggregationsFiltersAggregate + ).buckets as Record; const subTree = {}; Object.entries(timeShifts).forEach(([key, shift]) => { mergeAggLevel( diff --git a/src/plugins/data/common/search/expressions/esaggs/request_handler.test.ts b/src/plugins/data/common/search/expressions/esaggs/request_handler.test.ts index 56f6c9da6d84a..a44613cb98b50 100644 --- a/src/plugins/data/common/search/expressions/esaggs/request_handler.test.ts +++ b/src/plugins/data/common/search/expressions/esaggs/request_handler.test.ts @@ -37,17 +37,17 @@ describe('esaggs expression function - public', () => { ); mockParams = { - abortSignal: (jest.fn() as unknown) as jest.Mocked, - aggs: ({ + abortSignal: jest.fn() as unknown as jest.Mocked, + aggs: { aggs: [{ type: { name: 'terms', postFlightRequest: jest.fn().mockResolvedValue({}) } }], setTimeRange: jest.fn(), toDsl: jest.fn().mockReturnValue({ aggs: {} }), onSearchRequestStart: jest.fn(), setTimeFields: jest.fn(), setForceNow: jest.fn(), - } as unknown) as jest.Mocked, + } as unknown as jest.Mocked, filters: undefined, - indexPattern: ({ id: 'logstash-*' } as unknown) as jest.Mocked, + indexPattern: { id: 'logstash-*' } as unknown as jest.Mocked, inspectorAdapters: {}, partialRows: false, query: undefined, diff --git a/src/plugins/data/common/search/expressions/exists_filter.ts b/src/plugins/data/common/search/expressions/exists_filter.ts index 3edb659966466..b7c11daa38379 100644 --- a/src/plugins/data/common/search/expressions/exists_filter.ts +++ b/src/plugins/data/common/search/expressions/exists_filter.ts @@ -52,7 +52,7 @@ export const existsFilterFunction: ExpressionFunctionExistsFilter = { return { type: 'kibana_filter', ...buildFilter( - ({} as any) as IndexPattern, + {} as any as IndexPattern, args.field.spec, FILTERS.EXISTS, args.negate || false, diff --git a/src/plugins/data/common/search/expressions/geo_bounding_box.ts b/src/plugins/data/common/search/expressions/geo_bounding_box.ts index bed7eef72188a..b763b741acd57 100644 --- a/src/plugins/data/common/search/expressions/geo_bounding_box.ts +++ b/src/plugins/data/common/search/expressions/geo_bounding_box.ts @@ -196,12 +196,12 @@ export const geoBoundingBoxFunction: ExpressionFunctionGeoBoundingBox = { if (isGeoPoints(args)) { return { - ...((chain(args) + ...(chain(args) .pick(['topLeft', 'bottomRight', 'topRight', 'bottomLeft']) .omitBy(isNil) .mapKeys((value, key) => snakeCase(key)) .mapValues(({ value }) => value) - .value() as unknown) as GeoPoints), + .value() as unknown as GeoPoints), type: 'geo_bounding_box', }; } diff --git a/src/plugins/data/common/search/expressions/phrase_filter.ts b/src/plugins/data/common/search/expressions/phrase_filter.ts index 6714edef55000..ec241752df0d0 100644 --- a/src/plugins/data/common/search/expressions/phrase_filter.ts +++ b/src/plugins/data/common/search/expressions/phrase_filter.ts @@ -62,7 +62,7 @@ export const phraseFilterFunction: ExpressionFunctionPhraseFilter = { return { type: 'kibana_filter', ...buildFilter( - ({} as any) as IndexPattern, + {} as any as IndexPattern, args.field.spec, FILTERS.PHRASE, args.negate || false, @@ -76,7 +76,7 @@ export const phraseFilterFunction: ExpressionFunctionPhraseFilter = { return { type: 'kibana_filter', ...buildFilter( - ({} as any) as IndexPattern, + {} as any as IndexPattern, args.field.spec, FILTERS.PHRASES, args.negate || false, diff --git a/src/plugins/data/common/search/expressions/range_filter.ts b/src/plugins/data/common/search/expressions/range_filter.ts index bac50f2000271..f2b4b23c018f1 100644 --- a/src/plugins/data/common/search/expressions/range_filter.ts +++ b/src/plugins/data/common/search/expressions/range_filter.ts @@ -61,7 +61,7 @@ export const rangeFilterFunction: ExpressionFunctionRangeFilter = { return { type: 'kibana_filter', ...buildFilter( - ({} as any) as IndexPattern, + {} as any as IndexPattern, args.field.spec, FILTERS.RANGE, args.negate || false, diff --git a/src/plugins/data/common/search/search_source/create_search_source.test.ts b/src/plugins/data/common/search/search_source/create_search_source.test.ts index 9ac9dc93a807e..9ad2e5c40697c 100644 --- a/src/plugins/data/common/search/search_source/create_search_source.test.ts +++ b/src/plugins/data/common/search/search_source/create_search_source.test.ts @@ -25,9 +25,9 @@ describe('createSearchSource', () => { onResponse: (req, res) => res, }; - indexPatternContractMock = ({ + indexPatternContractMock = { get: jest.fn().mockReturnValue(Promise.resolve(indexPatternMock)), - } as unknown) as jest.Mocked; + } as unknown as jest.Mocked; createSearchSource = createSearchSourceFactory(indexPatternContractMock, dependencies); }); diff --git a/src/plugins/data/common/search/search_source/create_search_source.ts b/src/plugins/data/common/search/search_source/create_search_source.ts index 80547ca2e71f2..c6c8bb4d26f9e 100644 --- a/src/plugins/data/common/search/search_source/create_search_source.ts +++ b/src/plugins/data/common/search/search_source/create_search_source.ts @@ -28,25 +28,24 @@ import { SearchSourceFields } from './types'; * * * @public */ -export const createSearchSource = ( - indexPatterns: IndexPatternsContract, - searchSourceDependencies: SearchSourceDependencies -) => async (searchSourceFields: SearchSourceFields = {}) => { - const fields = { ...searchSourceFields }; +export const createSearchSource = + (indexPatterns: IndexPatternsContract, searchSourceDependencies: SearchSourceDependencies) => + async (searchSourceFields: SearchSourceFields = {}) => { + const fields = { ...searchSourceFields }; - // hydrating index pattern - if (fields.index && typeof fields.index === 'string') { - fields.index = await indexPatterns.get(searchSourceFields.index as any); - } + // hydrating index pattern + if (fields.index && typeof fields.index === 'string') { + fields.index = await indexPatterns.get(searchSourceFields.index as any); + } - const searchSource = new SearchSource(fields, searchSourceDependencies); + const searchSource = new SearchSource(fields, searchSourceDependencies); - // todo: move to migration script .. create issue - const query = searchSource.getOwnField('query'); + // todo: move to migration script .. create issue + const query = searchSource.getOwnField('query'); - if (typeof query !== 'undefined') { - searchSource.setField('query', migrateLegacyQuery(query)); - } + if (typeof query !== 'undefined') { + searchSource.setField('query', migrateLegacyQuery(query)); + } - return searchSource; -}; + return searchSource; + }; diff --git a/src/plugins/data/common/search/search_source/extract_references.ts b/src/plugins/data/common/search/search_source/extract_references.ts index f099443ef7605..c7f6c53d0f5f7 100644 --- a/src/plugins/data/common/search/search_source/extract_references.ts +++ b/src/plugins/data/common/search/search_source/extract_references.ts @@ -18,7 +18,7 @@ export const extractReferences = ( let searchSourceFields: SearchSourceFields & { indexRefName?: string } = { ...state }; const references: SavedObjectReference[] = []; if (searchSourceFields.index) { - const indexId = searchSourceFields.index.id || ((searchSourceFields.index as any) as string); + const indexId = searchSourceFields.index.id || (searchSourceFields.index as any as string); const refName = 'kibanaSavedObjectMeta.searchSourceJSON.index'; references.push({ name: refName, diff --git a/src/plugins/data/common/search/search_source/search_source.test.ts b/src/plugins/data/common/search/search_source/search_source.test.ts index 9a76985bca6e7..46341af48960b 100644 --- a/src/plugins/data/common/search/search_source/search_source.test.ts +++ b/src/plugins/data/common/search/search_source/search_source.test.ts @@ -25,21 +25,21 @@ const getComputedFields = () => ({ const mockSource = { excludes: ['foo-*'] }; const mockSource2 = { excludes: ['bar-*'] }; -const indexPattern = ({ +const indexPattern = { title: 'foo', fields: [{ name: 'foo-bar' }, { name: 'field1' }, { name: 'field2' }, { name: '_id' }], getComputedFields, getSourceFiltering: () => mockSource, -} as unknown) as IndexPattern; +} as unknown as IndexPattern; -const indexPattern2 = ({ +const indexPattern2 = { title: 'foo', getComputedFields, getSourceFiltering: () => mockSource2, -} as unknown) as IndexPattern; +} as unknown as IndexPattern; const fields3 = [{ name: 'foo-bar' }, { name: 'field1' }, { name: 'field2' }]; -const indexPattern3 = ({ +const indexPattern3 = { title: 'foo', fields: { getByName: (name: string) => { @@ -51,7 +51,7 @@ const indexPattern3 = ({ }, getComputedFields, getSourceFiltering: () => mockSource, -} as unknown) as IndexPattern; +} as unknown as IndexPattern; const runtimeFieldDef = { type: 'keyword', @@ -139,7 +139,7 @@ describe('SearchSource', () => { describe('computed fields handling', () => { test('still provides computed fields when no fields are specified', async () => { const runtimeFields = { runtime_field: runtimeFieldDef }; - searchSource.setField('index', ({ + searchSource.setField('index', { ...indexPattern, getComputedFields: () => ({ storedFields: ['hello'], @@ -147,7 +147,7 @@ describe('SearchSource', () => { docvalueFields: ['@timestamp'], runtimeFields, }), - } as unknown) as IndexPattern); + } as unknown as IndexPattern); const request = searchSource.getSearchRequestBody(); expect(request.stored_fields).toEqual(['hello']); @@ -157,14 +157,14 @@ describe('SearchSource', () => { }); test('never includes docvalue_fields', async () => { - searchSource.setField('index', ({ + searchSource.setField('index', { ...indexPattern, getComputedFields: () => ({ storedFields: [], scriptFields: {}, docvalueFields: ['@timestamp'], }), - } as unknown) as IndexPattern); + } as unknown as IndexPattern); searchSource.setField('fields', ['@timestamp']); searchSource.setField('fieldsFromSource', ['foo']); @@ -173,14 +173,14 @@ describe('SearchSource', () => { }); test('overrides computed docvalue fields with ones that are provided', async () => { - searchSource.setField('index', ({ + searchSource.setField('index', { ...indexPattern, getComputedFields: () => ({ storedFields: [], scriptFields: {}, docvalueFields: ['hello'], }), - } as unknown) as IndexPattern); + } as unknown as IndexPattern); // @ts-expect-error TS won't like using this field name, but technically it's possible. searchSource.setField('docvalue_fields', ['world']); @@ -190,14 +190,14 @@ describe('SearchSource', () => { }); test('allows explicitly provided docvalue fields to override fields API when fetching fieldsFromSource', async () => { - searchSource.setField('index', ({ + searchSource.setField('index', { ...indexPattern, getComputedFields: () => ({ storedFields: [], scriptFields: {}, docvalueFields: [{ field: 'a', format: 'date_time' }], }), - } as unknown) as IndexPattern); + } as unknown as IndexPattern); // @ts-expect-error TS won't like using this field name, but technically it's possible. searchSource.setField('docvalue_fields', [{ field: 'b', format: 'date_time' }]); searchSource.setField('fields', ['c']); @@ -215,7 +215,7 @@ describe('SearchSource', () => { indexPatternFields.getByType = (type) => { return []; }; - searchSource.setField('index', ({ + searchSource.setField('index', { ...indexPattern, fields: indexPatternFields, getComputedFields: () => ({ @@ -223,7 +223,7 @@ describe('SearchSource', () => { scriptFields: {}, docvalueFields: [{ field: 'hello', format: 'date_time' }], }), - } as unknown) as IndexPattern); + } as unknown as IndexPattern); searchSource.setField('fields', [{ field: 'hello', format: 'strict_date_time' }]); const request = searchSource.getSearchRequestBody(); @@ -232,14 +232,14 @@ describe('SearchSource', () => { }); test('injects a date format for computed docvalue fields if none is provided', async () => { - searchSource.setField('index', ({ + searchSource.setField('index', { ...indexPattern, getComputedFields: () => ({ storedFields: [], scriptFields: {}, docvalueFields: [{ field: 'hello', format: 'date_time' }], }), - } as unknown) as IndexPattern); + } as unknown as IndexPattern); searchSource.setField('fields', ['hello']); const request = searchSource.getSearchRequestBody(); @@ -248,7 +248,7 @@ describe('SearchSource', () => { }); test('injects a date format for computed docvalue fields while merging other properties', async () => { - searchSource.setField('index', ({ + searchSource.setField('index', { ...indexPattern, fields: { getByType: () => { @@ -260,7 +260,7 @@ describe('SearchSource', () => { scriptFields: {}, docvalueFields: [{ field: 'hello', format: 'date_time', a: 'test', b: 'test' }], }), - } as unknown) as IndexPattern); + } as unknown as IndexPattern); searchSource.setField('fields', [{ field: 'hello', a: 'a', c: 'c' }]); const request = searchSource.getSearchRequestBody(); @@ -271,14 +271,14 @@ describe('SearchSource', () => { }); test('merges provided script fields with computed fields', async () => { - searchSource.setField('index', ({ + searchSource.setField('index', { ...indexPattern, getComputedFields: () => ({ storedFields: [], scriptFields: { hello: {} }, docvalueFields: [], }), - } as unknown) as IndexPattern); + } as unknown as IndexPattern); // @ts-expect-error TS won't like using this field name, but technically it's possible. searchSource.setField('script_fields', { world: {} }); @@ -291,14 +291,14 @@ describe('SearchSource', () => { }); test(`requests any fields that aren't script_fields from stored_fields`, async () => { - searchSource.setField('index', ({ + searchSource.setField('index', { ...indexPattern, getComputedFields: () => ({ storedFields: [], scriptFields: { hello: {} }, docvalueFields: [], }), - } as unknown) as IndexPattern); + } as unknown as IndexPattern); searchSource.setField('fields', ['hello', 'a', { field: 'c' }]); const request = searchSource.getSearchRequestBody(); @@ -307,14 +307,14 @@ describe('SearchSource', () => { }); test('ignores objects without a `field` property when setting stored_fields', async () => { - searchSource.setField('index', ({ + searchSource.setField('index', { ...indexPattern, getComputedFields: () => ({ storedFields: [], scriptFields: { hello: {} }, docvalueFields: [], }), - } as unknown) as IndexPattern); + } as unknown as IndexPattern); searchSource.setField('fields', ['hello', 'a', { foo: 'c' }]); const request = searchSource.getSearchRequestBody(); @@ -323,14 +323,14 @@ describe('SearchSource', () => { }); test(`requests any fields that aren't script_fields from stored_fields with fieldsFromSource`, async () => { - searchSource.setField('index', ({ + searchSource.setField('index', { ...indexPattern, getComputedFields: () => ({ storedFields: [], scriptFields: { hello: {} }, docvalueFields: [], }), - } as unknown) as IndexPattern); + } as unknown as IndexPattern); searchSource.setField('fieldsFromSource', ['hello', 'a']); const request = searchSource.getSearchRequestBody(); @@ -426,14 +426,14 @@ describe('SearchSource', () => { describe('source filters handling', () => { test('excludes docvalue fields based on source filtering', async () => { - searchSource.setField('index', ({ + searchSource.setField('index', { ...indexPattern, getComputedFields: () => ({ storedFields: [], scriptFields: {}, docvalueFields: ['@timestamp', 'exclude-me'], }), - } as unknown) as IndexPattern); + } as unknown as IndexPattern); // @ts-expect-error Typings for excludes filters need to be fixed. searchSource.setField('source', { excludes: ['exclude-*'] }); @@ -442,28 +442,28 @@ describe('SearchSource', () => { }); test('defaults to source filters from index pattern', async () => { - searchSource.setField('index', ({ + searchSource.setField('index', { ...indexPattern, getComputedFields: () => ({ storedFields: [], scriptFields: {}, docvalueFields: ['@timestamp', 'foo-bar', 'foo-baz'], }), - } as unknown) as IndexPattern); + } as unknown as IndexPattern); const request = searchSource.getSearchRequestBody(); expect(request.fields).toEqual(['@timestamp']); }); test('filters script fields to only include specified fields', async () => { - searchSource.setField('index', ({ + searchSource.setField('index', { ...indexPattern, getComputedFields: () => ({ storedFields: [], scriptFields: { hello: {}, world: {} }, docvalueFields: [], }), - } as unknown) as IndexPattern); + } as unknown as IndexPattern); searchSource.setField('fields', ['hello']); const request = searchSource.getSearchRequestBody(); @@ -471,14 +471,14 @@ describe('SearchSource', () => { }); test('request all fields except the ones specified with source filters', async () => { - searchSource.setField('index', ({ + searchSource.setField('index', { ...indexPattern, getComputedFields: () => ({ storedFields: [], scriptFields: [], docvalueFields: [], }), - } as unknown) as IndexPattern); + } as unknown as IndexPattern); searchSource.setField('fields', [ 'hello', 'foo-bar', @@ -492,14 +492,14 @@ describe('SearchSource', () => { }); test('request all fields from index pattern except the ones specified with source filters', async () => { - searchSource.setField('index', ({ + searchSource.setField('index', { ...indexPattern, getComputedFields: () => ({ storedFields: [], scriptFields: [], docvalueFields: [], }), - } as unknown) as IndexPattern); + } as unknown as IndexPattern); searchSource.setField('fields', ['*']); const request = searchSource.getSearchRequestBody(); @@ -507,14 +507,14 @@ describe('SearchSource', () => { }); test('request all fields from index pattern except the ones specified with source filters with unmapped_fields option', async () => { - searchSource.setField('index', ({ + searchSource.setField('index', { ...indexPattern, getComputedFields: () => ({ storedFields: [], scriptFields: [], docvalueFields: [], }), - } as unknown) as IndexPattern); + } as unknown as IndexPattern); searchSource.setField('fields', [{ field: '*', include_unmapped: 'true' }]); const request = searchSource.getSearchRequestBody(); @@ -522,14 +522,14 @@ describe('SearchSource', () => { }); test('excludes metafields from the request', async () => { - searchSource.setField('index', ({ + searchSource.setField('index', { ...indexPattern, getComputedFields: () => ({ storedFields: [], scriptFields: [], docvalueFields: [], }), - } as unknown) as IndexPattern); + } as unknown as IndexPattern); searchSource.setField('fields', [{ field: '*', include_unmapped: 'true' }]); const request = searchSource.getSearchRequestBody(); @@ -544,14 +544,14 @@ describe('SearchSource', () => { }); test('returns all scripted fields when one fields entry is *', async () => { - searchSource.setField('index', ({ + searchSource.setField('index', { ...indexPattern, getComputedFields: () => ({ storedFields: [], scriptFields: { hello: {}, world: {} }, docvalueFields: [], }), - } as unknown) as IndexPattern); + } as unknown as IndexPattern); searchSource.setField('fields', ['timestamp', '*']); const request = searchSource.getSearchRequestBody(); @@ -561,14 +561,14 @@ describe('SearchSource', () => { describe('handling for when specific fields are provided', () => { test('fieldsFromSource will request any fields outside of script_fields from _source & stored fields', async () => { - searchSource.setField('index', ({ + searchSource.setField('index', { ...indexPattern, getComputedFields: () => ({ storedFields: [], scriptFields: { hello: {}, world: {} }, docvalueFields: ['@timestamp'], }), - } as unknown) as IndexPattern); + } as unknown as IndexPattern); searchSource.setField('fieldsFromSource', [ 'hello', 'world', @@ -585,14 +585,14 @@ describe('SearchSource', () => { }); test('filters request when a specific list of fields is provided', async () => { - searchSource.setField('index', ({ + searchSource.setField('index', { ...indexPattern, getComputedFields: () => ({ storedFields: ['*'], scriptFields: { hello: {}, world: {} }, docvalueFields: ['@timestamp', 'date'], }), - } as unknown) as IndexPattern); + } as unknown as IndexPattern); searchSource.setField('fields', ['hello', '@timestamp', 'foo-a', 'bar']); const request = searchSource.getSearchRequestBody(); @@ -603,7 +603,7 @@ describe('SearchSource', () => { test('filters request when a specific list of fields is provided with fieldsFromSource', async () => { const runtimeFields = { runtime_field: runtimeFieldDef, runtime_field_b: runtimeFieldDef }; - searchSource.setField('index', ({ + searchSource.setField('index', { ...indexPattern, getComputedFields: () => ({ storedFields: ['*'], @@ -611,7 +611,7 @@ describe('SearchSource', () => { docvalueFields: ['@timestamp', 'date'], runtimeFields, }), - } as unknown) as IndexPattern); + } as unknown as IndexPattern); searchSource.setField('fieldsFromSource', [ 'hello', '@timestamp', @@ -631,14 +631,14 @@ describe('SearchSource', () => { }); test('filters request when a specific list of fields is provided with fieldsFromSource or fields', async () => { - searchSource.setField('index', ({ + searchSource.setField('index', { ...indexPattern, getComputedFields: () => ({ storedFields: ['*'], scriptFields: { hello: {}, world: {} }, docvalueFields: ['@timestamp', 'date', 'time'], }), - } as unknown) as IndexPattern); + } as unknown as IndexPattern); searchSource.setField('fields', ['hello', '@timestamp', 'foo-a', 'bar']); searchSource.setField('fieldsFromSource', ['foo-b', 'date', 'baz']); @@ -654,7 +654,7 @@ describe('SearchSource', () => { describe('handling date fields', () => { test('adds date format to any date field', async () => { - searchSource.setField('index', ({ + searchSource.setField('index', { ...indexPattern, getComputedFields: () => ({ storedFields: [], @@ -665,7 +665,7 @@ describe('SearchSource', () => { getByType: () => [{ name: '@timestamp', esTypes: ['date_nanos'] }], }, getSourceFiltering: () => ({ excludes: [] }), - } as unknown) as IndexPattern); + } as unknown as IndexPattern); searchSource.setField('fields', ['*']); const request = searchSource.getSearchRequestBody(); @@ -684,7 +684,7 @@ describe('SearchSource', () => { { name: 'custom_date', esTypes: ['date'] }, ]; }; - searchSource.setField('index', ({ + searchSource.setField('index', { ...indexPattern, getComputedFields: () => ({ storedFields: [], @@ -693,7 +693,7 @@ describe('SearchSource', () => { }), fields: indexPatternFields, getSourceFiltering: () => ({ excludes: ['custom_date'] }), - } as unknown) as IndexPattern); + } as unknown as IndexPattern); searchSource.setField('fields', ['*']); const request = searchSource.getSearchRequestBody(); @@ -866,7 +866,7 @@ describe('SearchSource', () => { searchSource.setField('docvalue_fields', ['prop1']); searchSource.setField('source', ['geometry']); searchSource.setField('fieldsFromSource', ['geometry', 'prop1']); - searchSource.setField('index', ({ + searchSource.setField('index', { ...indexPattern, getSourceFiltering: () => ({ excludes: [] }), getComputedFields: () => ({ @@ -874,7 +874,7 @@ describe('SearchSource', () => { scriptFields: {}, docvalueFields: [], }), - } as unknown) as IndexPattern); + } as unknown as IndexPattern); const request = searchSource.getSearchRequestBody(); expect(request.stored_fields).toEqual(['geometry', 'prop1']); expect(request.docvalue_fields).toEqual(['prop1']); @@ -1042,12 +1042,12 @@ describe('SearchSource', () => { describe('inspector', () => { let requestResponder: RequestResponder; beforeEach(() => { - requestResponder = ({ + requestResponder = { stats: jest.fn(), ok: jest.fn(), error: jest.fn(), json: jest.fn(), - } as unknown) as RequestResponder; + } as unknown as RequestResponder; }); test('calls inspector if provided', async () => { diff --git a/src/plugins/data/common/search/search_source/search_source_service.test.ts b/src/plugins/data/common/search/search_source/search_source_service.test.ts index 69ffef3f9ccd6..dc63b96d5258d 100644 --- a/src/plugins/data/common/search/search_source/search_source_service.test.ts +++ b/src/plugins/data/common/search/search_source/search_source_service.test.ts @@ -24,7 +24,7 @@ describe('SearchSource service', () => { describe('start()', () => { test('exposes proper contract', () => { const start = new SearchSourceService().start( - (jest.fn() as unknown) as jest.Mocked, + jest.fn() as unknown as jest.Mocked, dependencies ); diff --git a/src/plugins/data/common/search/tabify/tabify.test.ts b/src/plugins/data/common/search/tabify/tabify.test.ts index 329d1597268dc..6cdf9a3547d48 100644 --- a/src/plugins/data/common/search/tabify/tabify.test.ts +++ b/src/plugins/data/common/search/tabify/tabify.test.ts @@ -20,7 +20,7 @@ describe('tabifyAggResponse Integration', () => { name: '@timestamp', }; - const indexPattern = ({ + const indexPattern = { id: '1234', title: 'logstash-*', fields: { @@ -30,12 +30,12 @@ describe('tabifyAggResponse Integration', () => { getFormatterForField: () => ({ toJSON: () => '{}', }), - } as unknown) as IndexPattern; + } as unknown as IndexPattern; return new AggConfigs(indexPattern, aggs, { typesRegistry }); }; - const mockAggConfig = (agg: any): IAggConfig => (agg as unknown) as IAggConfig; + const mockAggConfig = (agg: any): IAggConfig => agg as unknown as IAggConfig; test('transforms a simple response properly', () => { const aggConfigs = createAggConfigs([{ type: 'count' } as any]); diff --git a/src/plugins/data/public/actions/filters/create_filters_from_range_select.test.ts b/src/plugins/data/public/actions/filters/create_filters_from_range_select.test.ts index 6d0ba0d9e4404..acfad53d0a9d7 100644 --- a/src/plugins/data/public/actions/filters/create_filters_from_range_select.test.ts +++ b/src/plugins/data/public/actions/filters/create_filters_from_range_select.test.ts @@ -55,10 +55,10 @@ describe('brushEvent', () => { beforeEach(() => { const dataStart = dataPluginMock.createStartContract(); setSearchService(dataStart.search); - setIndexPatterns(({ + setIndexPatterns({ ...dataStart.indexPatterns, get: async () => indexPattern, - } as unknown) as IndexPatternsContract); + } as unknown as IndexPatternsContract); baseEvent = { column: 0, diff --git a/src/plugins/data/public/actions/filters/create_filters_from_value_click.test.ts b/src/plugins/data/public/actions/filters/create_filters_from_value_click.test.ts index b2e7b959ca79f..2632666cf85d8 100644 --- a/src/plugins/data/public/actions/filters/create_filters_from_value_click.test.ts +++ b/src/plugins/data/public/actions/filters/create_filters_from_value_click.test.ts @@ -61,7 +61,7 @@ describe('createFiltersFromValueClick', () => { const dataStart = dataPluginMock.createStartContract(); setSearchService(dataStart.search); - setIndexPatterns(({ + setIndexPatterns({ ...dataStart.indexPatterns, get: async () => ({ id: 'logstash-*', @@ -71,7 +71,7 @@ describe('createFiltersFromValueClick', () => { }, getFormatterForField: () => new BytesFormat({}, (() => {}) as FieldFormatsGetConfigFn), }), - } as unknown) as IndexPatternsContract); + } as unknown as IndexPatternsContract); }); test('ignores event when value for rows is not provided', async () => { diff --git a/src/plugins/data/public/autocomplete/providers/kql_query_suggestion/conjunction.test.ts b/src/plugins/data/public/autocomplete/providers/kql_query_suggestion/conjunction.test.ts index c1c44f1f55548..24d9cdbfa6b3c 100644 --- a/src/plugins/data/public/autocomplete/providers/kql_query_suggestion/conjunction.test.ts +++ b/src/plugins/data/public/autocomplete/providers/kql_query_suggestion/conjunction.test.ts @@ -10,10 +10,10 @@ import { setupGetConjunctionSuggestions } from './conjunction'; import { QuerySuggestionGetFnArgs, KueryNode } from '../../../../../../../src/plugins/data/public'; import { coreMock } from '../../../../../../../src/core/public/mocks'; -const mockKueryNode = (kueryNode: Partial) => (kueryNode as unknown) as KueryNode; +const mockKueryNode = (kueryNode: Partial) => kueryNode as unknown as KueryNode; describe('Kuery conjunction suggestions', () => { - const querySuggestionsArgs = (null as unknown) as QuerySuggestionGetFnArgs; + const querySuggestionsArgs = null as unknown as QuerySuggestionGetFnArgs; let getSuggestions: ReturnType; beforeEach(() => { diff --git a/src/plugins/data/public/autocomplete/providers/kql_query_suggestion/field.test.ts b/src/plugins/data/public/autocomplete/providers/kql_query_suggestion/field.test.ts index 84ed4315ee16f..088edd3a7aca8 100644 --- a/src/plugins/data/public/autocomplete/providers/kql_query_suggestion/field.test.ts +++ b/src/plugins/data/public/autocomplete/providers/kql_query_suggestion/field.test.ts @@ -16,16 +16,16 @@ import { } from '../../../../../../../src/plugins/data/public'; import { coreMock } from '../../../../../../../src/core/public/mocks'; -const mockKueryNode = (kueryNode: Partial) => (kueryNode as unknown) as KueryNode; +const mockKueryNode = (kueryNode: Partial) => kueryNode as unknown as KueryNode; describe('Kuery field suggestions', () => { let querySuggestionsArgs: QuerySuggestionGetFnArgs; let getSuggestions: ReturnType; beforeEach(() => { - querySuggestionsArgs = ({ + querySuggestionsArgs = { indexPatterns: [indexPatternResponse], - } as unknown) as QuerySuggestionGetFnArgs; + } as unknown as QuerySuggestionGetFnArgs; getSuggestions = setupGetFieldSuggestions(coreMock.createSetup()); }); diff --git a/src/plugins/data/public/autocomplete/providers/kql_query_suggestion/index.ts b/src/plugins/data/public/autocomplete/providers/kql_query_suggestion/index.ts index d76c71182b8fa..c40f1dd925345 100644 --- a/src/plugins/data/public/autocomplete/providers/kql_query_suggestion/index.ts +++ b/src/plugins/data/public/autocomplete/providers/kql_query_suggestion/index.ts @@ -62,8 +62,8 @@ export const setupKqlQuerySuggestionProvider = ( selectionEnd )}`; - return Promise.all( - getSuggestionsByType(cursoredQuery, querySuggestionsArgs) - ).then((suggestionsByType) => dedup(flatten(suggestionsByType))); + return Promise.all(getSuggestionsByType(cursoredQuery, querySuggestionsArgs)).then( + (suggestionsByType) => dedup(flatten(suggestionsByType)) + ); }; }; diff --git a/src/plugins/data/public/autocomplete/providers/kql_query_suggestion/operator.test.ts b/src/plugins/data/public/autocomplete/providers/kql_query_suggestion/operator.test.ts index 4debbc0843d51..ab1d79eb522c1 100644 --- a/src/plugins/data/public/autocomplete/providers/kql_query_suggestion/operator.test.ts +++ b/src/plugins/data/public/autocomplete/providers/kql_query_suggestion/operator.test.ts @@ -12,16 +12,16 @@ import { setupGetOperatorSuggestions } from './operator'; import { QuerySuggestionGetFnArgs, KueryNode } from '../../../../../../../src/plugins/data/public'; import { coreMock } from '../../../../../../../src/core/public/mocks'; -const mockKueryNode = (kueryNode: Partial) => (kueryNode as unknown) as KueryNode; +const mockKueryNode = (kueryNode: Partial) => kueryNode as unknown as KueryNode; describe('Kuery operator suggestions', () => { let getSuggestions: ReturnType; let querySuggestionsArgs: QuerySuggestionGetFnArgs; beforeEach(() => { - querySuggestionsArgs = ({ + querySuggestionsArgs = { indexPatterns: [indexPatternResponse], - } as unknown) as QuerySuggestionGetFnArgs; + } as unknown as QuerySuggestionGetFnArgs; getSuggestions = setupGetOperatorSuggestions(coreMock.createSetup()); }); diff --git a/src/plugins/data/public/autocomplete/providers/kql_query_suggestion/value.test.ts b/src/plugins/data/public/autocomplete/providers/kql_query_suggestion/value.test.ts index c434d9a8ef365..27031209c42a5 100644 --- a/src/plugins/data/public/autocomplete/providers/kql_query_suggestion/value.test.ts +++ b/src/plugins/data/public/autocomplete/providers/kql_query_suggestion/value.test.ts @@ -11,7 +11,7 @@ import indexPatternResponse from './__fixtures__/index_pattern_response.json'; import { coreMock } from '../../../../../../../src/core/public/mocks'; import { QuerySuggestionGetFnArgs, KueryNode } from '../../../../../../../src/plugins/data/public'; -const mockKueryNode = (kueryNode: Partial) => (kueryNode as unknown) as KueryNode; +const mockKueryNode = (kueryNode: Partial) => kueryNode as unknown as KueryNode; describe('Kuery value suggestions', () => { let getSuggestions: ReturnType; @@ -42,9 +42,9 @@ describe('Kuery value suggestions', () => { }, }); getSuggestions = setupGetValueSuggestions(coreSetup); - querySuggestionsArgs = ({ + querySuggestionsArgs = { indexPatterns: [indexPatternResponse], - } as unknown) as QuerySuggestionGetFnArgs; + } as unknown as QuerySuggestionGetFnArgs; jest.clearAllMocks(); }); diff --git a/src/plugins/data/public/autocomplete/providers/value_suggestion_provider.test.ts b/src/plugins/data/public/autocomplete/providers/value_suggestion_provider.test.ts index d01064b4651f7..7ecd371e39db7 100644 --- a/src/plugins/data/public/autocomplete/providers/value_suggestion_provider.test.ts +++ b/src/plugins/data/public/autocomplete/providers/value_suggestion_provider.test.ts @@ -24,7 +24,7 @@ describe('FieldSuggestions', () => { http = { fetch: jest.fn().mockResolvedValue([]) }; getValueSuggestions = setupValueSuggestionProvider({ http, uiSettings } as CoreSetup, { - timefilter: ({ + timefilter: { timefilter: { createFilter: () => { return { @@ -38,7 +38,7 @@ describe('FieldSuggestions', () => { }; }, }, - } as unknown) as TimefilterSetup, + } as unknown as TimefilterSetup, }); }); diff --git a/src/plugins/data/public/data_views/data_views/redirect_no_index_pattern.tsx b/src/plugins/data/public/data_views/data_views/redirect_no_index_pattern.tsx index 86978efafdc5b..88e18060c4d11 100644 --- a/src/plugins/data/public/data_views/data_views/redirect_no_index_pattern.tsx +++ b/src/plugins/data/public/data_views/data_views/redirect_no_index_pattern.tsx @@ -14,45 +14,50 @@ import { toMountPoint } from '../../../../kibana_react/public'; let bannerId: string; -export const onRedirectNoIndexPattern = ( - capabilities: CoreStart['application']['capabilities'], - navigateToApp: CoreStart['application']['navigateToApp'], - overlays: CoreStart['overlays'] -) => () => { - const canManageIndexPatterns = capabilities.management.kibana.indexPatterns; - const redirectTarget = canManageIndexPatterns ? '/management/kibana/indexPatterns' : '/home'; - let timeoutId: NodeJS.Timeout | undefined; - - if (timeoutId) { - clearTimeout(timeoutId); - } - - const bannerMessage = i18n.translate('data.indexPatterns.ensureDefaultIndexPattern.bannerLabel', { - defaultMessage: - 'To visualize and explore data in Kibana, you must create an index pattern to retrieve data from Elasticsearch.', - }); - - // Avoid being hostile to new users who don't have an index pattern setup yet - // give them a friendly info message instead of a terse error message - bannerId = overlays.banners.replace( - bannerId, - toMountPoint() - ); - - // hide the message after the user has had a chance to acknowledge it -- so it doesn't permanently stick around - timeoutId = setTimeout(() => { - overlays.banners.remove(bannerId); - timeoutId = undefined; - }, 15000); - - if (redirectTarget === '/home') { - navigateToApp('home'); - } else { - navigateToApp('management', { - path: `/kibana/indexPatterns?bannerMessage=${bannerMessage}`, - }); - } - - // return never-resolving promise to stop resolving and wait for the url change - return new Promise(() => {}); -}; +export const onRedirectNoIndexPattern = + ( + capabilities: CoreStart['application']['capabilities'], + navigateToApp: CoreStart['application']['navigateToApp'], + overlays: CoreStart['overlays'] + ) => + () => { + const canManageIndexPatterns = capabilities.management.kibana.indexPatterns; + const redirectTarget = canManageIndexPatterns ? '/management/kibana/indexPatterns' : '/home'; + let timeoutId: NodeJS.Timeout | undefined; + + if (timeoutId) { + clearTimeout(timeoutId); + } + + const bannerMessage = i18n.translate( + 'data.indexPatterns.ensureDefaultIndexPattern.bannerLabel', + { + defaultMessage: + 'To visualize and explore data in Kibana, you must create an index pattern to retrieve data from Elasticsearch.', + } + ); + + // Avoid being hostile to new users who don't have an index pattern setup yet + // give them a friendly info message instead of a terse error message + bannerId = overlays.banners.replace( + bannerId, + toMountPoint() + ); + + // hide the message after the user has had a chance to acknowledge it -- so it doesn't permanently stick around + timeoutId = setTimeout(() => { + overlays.banners.remove(bannerId); + timeoutId = undefined; + }, 15000); + + if (redirectTarget === '/home') { + navigateToApp('home'); + } else { + navigateToApp('management', { + path: `/kibana/indexPatterns?bannerMessage=${bannerMessage}`, + }); + } + + // return never-resolving promise to stop resolving and wait for the url change + return new Promise(() => {}); + }; diff --git a/src/plugins/data/public/mocks.ts b/src/plugins/data/public/mocks.ts index 40882fa1134e9..53600a1f44469 100644 --- a/src/plugins/data/public/mocks.ts +++ b/src/plugins/data/public/mocks.ts @@ -38,7 +38,7 @@ const createSetupContract = (): Setup => { const createStartContract = (): Start => { const queryStartMock = queryServiceMock.createStartContract(); - const dataViews = ({ + const dataViews = { find: jest.fn((search) => [{ id: search, title: search }]), createField: jest.fn(() => {}), createFieldList: jest.fn(() => []), @@ -50,7 +50,7 @@ const createStartContract = (): Start => { }), get: jest.fn().mockReturnValue(Promise.resolve({})), clearCache: jest.fn(), - } as unknown) as DataViewsContract; + } as unknown as DataViewsContract; return { actions: { diff --git a/src/plugins/data/public/plugin.ts b/src/plugins/data/public/plugin.ts index 2216c5e9c0e06..63f32e50f61ab 100644 --- a/src/plugins/data/public/plugin.ts +++ b/src/plugins/data/public/plugin.ts @@ -58,7 +58,8 @@ export class DataPublicPlugin DataPublicPluginStart, DataSetupDependencies, DataStartDependencies - > { + > +{ private readonly autocomplete: AutocompleteService; private readonly searchService: SearchService; private readonly queryService: QueryService; diff --git a/src/plugins/data/public/query/filter_manager/filter_manager.mock.ts b/src/plugins/data/public/query/filter_manager/filter_manager.mock.ts index b3d4e876efdd8..ac1f4b7f3c1b1 100644 --- a/src/plugins/data/public/query/filter_manager/filter_manager.mock.ts +++ b/src/plugins/data/public/query/filter_manager/filter_manager.mock.ts @@ -10,7 +10,7 @@ import { Observable } from 'rxjs'; import { FilterManager } from './filter_manager'; export const createFilterManagerMock = () => { - const filterManager = ({ + const filterManager = { mergeIncomingFilters: jest.fn(), handleStateUpdate: jest.fn(), getFilters: jest.fn(), @@ -25,7 +25,7 @@ export const createFilterManagerMock = () => { setAppFilters: jest.fn(), removeFilter: jest.fn(), removeAll: jest.fn(), - } as unknown) as jest.Mocked; + } as unknown as jest.Mocked; return filterManager; }; diff --git a/src/plugins/data/public/query/filter_manager/lib/generate_filters.ts b/src/plugins/data/public/query/filter_manager/lib/generate_filters.ts index 0be44f3f7b5a8..81be7efe4b585 100644 --- a/src/plugins/data/public/query/filter_manager/lib/generate_filters.ts +++ b/src/plugins/data/public/query/filter_manager/lib/generate_filters.ts @@ -72,11 +72,13 @@ export function generateFilters( index: string ): Filter[] { values = Array.isArray(values) ? _.uniq(values) : [values]; - const fieldObj = (_.isObject(field) - ? field - : { - name: field, - }) as IFieldType; + const fieldObj = ( + _.isObject(field) + ? field + : { + name: field, + } + ) as IFieldType; const fieldName = fieldObj.name; const newFilters: Filter[] = []; const appFilters = filterManager.getAppFilters(); diff --git a/src/plugins/data/public/query/saved_query/saved_query_service.ts b/src/plugins/data/public/query/saved_query/saved_query_service.ts index 21a34e0f136a2..89a357a66d370 100644 --- a/src/plugins/data/public/query/saved_query/saved_query_service.ts +++ b/src/plugins/data/public/query/saved_query/saved_query_service.ts @@ -105,10 +105,8 @@ export const createSavedQueryService = ( }; const getSavedQuery = async (id: string): Promise => { - const { - saved_object: savedObject, - outcome, - } = await savedObjectsClient.resolve('query', id); + const { saved_object: savedObject, outcome } = + await savedObjectsClient.resolve('query', id); if (outcome === 'conflict') { throw new Error(`Multiple saved queries found with ID: ${id} (legacy URL alias conflict)`); } else if (savedObject.error) { diff --git a/src/plugins/data/public/search/expressions/esaggs.test.ts b/src/plugins/data/public/search/expressions/esaggs.test.ts index fa9e2755e529c..8acbb8006e954 100644 --- a/src/plugins/data/public/search/expressions/esaggs.test.ts +++ b/src/plugins/data/public/search/expressions/esaggs.test.ts @@ -55,7 +55,7 @@ describe('esaggs expression function - public', () => { beforeEach(() => { jest.clearAllMocks(); mockHandlers = { - abortSignal: (jest.fn() as unknown) as jest.Mocked, + abortSignal: jest.fn() as unknown as jest.Mocked, getSearchContext: jest.fn(), getSearchSessionId: jest.fn().mockReturnValue('abc123'), getExecutionContext: jest.fn(), @@ -64,13 +64,13 @@ describe('esaggs expression function - public', () => { types: {}, }; startDependencies = { - aggs: ({ + aggs: { createAggConfigs: jest.fn().mockReturnValue({ foo: 'bar' }), - } as unknown) as jest.Mocked, - indexPatterns: ({ + } as unknown as jest.Mocked, + indexPatterns: { create: jest.fn().mockResolvedValue({}), - } as unknown) as jest.Mocked, - searchSource: ({} as unknown) as jest.Mocked, + } as unknown as jest.Mocked, + searchSource: {} as unknown as jest.Mocked, }; getStartDependencies = jest.fn().mockResolvedValue(startDependencies); definition = getFunctionDefinition({ getStartDependencies }); diff --git a/src/plugins/data/public/search/expressions/esdsl.ts b/src/plugins/data/public/search/expressions/esdsl.ts index c03226542ef7a..8d65f6e4ee688 100644 --- a/src/plugins/data/public/search/expressions/esdsl.ts +++ b/src/plugins/data/public/search/expressions/esdsl.ts @@ -34,7 +34,7 @@ export function getEsdsl({ getStartDependencies: async () => { const [core, , { search }] = await getStartServices(); return { - uiSettingsClient: (core.uiSettings as any) as UiSettingsCommon, + uiSettingsClient: core.uiSettings as any as UiSettingsCommon, search: search.search, }; }, diff --git a/src/plugins/data/public/search/expressions/kibana_context.ts b/src/plugins/data/public/search/expressions/kibana_context.ts index cb6e5369eb34a..a2d97dbc6b5dd 100644 --- a/src/plugins/data/public/search/expressions/kibana_context.ts +++ b/src/plugins/data/public/search/expressions/kibana_context.ts @@ -33,7 +33,7 @@ export function getKibanaContext({ return getKibanaContextFn(async () => { const [core] = await getStartServices(); return { - savedObjectsClient: (core.savedObjects.client as unknown) as SavedObjectsClientCommon, + savedObjectsClient: core.savedObjects.client as unknown as SavedObjectsClientCommon, }; }); } diff --git a/src/plugins/data/public/search/search_service.test.ts b/src/plugins/data/public/search/search_service.test.ts index debee42d8bf34..5bf4c21d48578 100644 --- a/src/plugins/data/public/search/search_service.test.ts +++ b/src/plugins/data/public/search/search_service.test.ts @@ -31,11 +31,11 @@ describe('Search service', () => { describe('setup()', () => { it('exposes proper contract', async () => { const bfetch = bfetchPluginMock.createSetupContract(); - const setup = searchService.setup(mockCoreSetup, ({ + const setup = searchService.setup(mockCoreSetup, { packageInfo: { version: '8' }, bfetch, expressions: { registerFunction: jest.fn(), registerType: jest.fn() }, - } as unknown) as SearchServiceSetupDependencies); + } as unknown as SearchServiceSetupDependencies); expect(setup).toHaveProperty('aggs'); expect(setup).toHaveProperty('usageCollector'); expect(setup).toHaveProperty('sessionsClient'); diff --git a/src/plugins/data/public/search/session/search_session_state.ts b/src/plugins/data/public/search/session/search_session_state.ts index bf9036d361a8f..73c75d046da96 100644 --- a/src/plugins/data/public/search/session/search_session_state.ts +++ b/src/plugins/data/public/search/session/search_session_state.ts @@ -152,12 +152,14 @@ export interface SessionPureTransitions< } export const sessionPureTransitions: SessionPureTransitions = { - start: (state) => ({ appName }) => ({ - ...createSessionDefaultState(), - sessionId: uuid.v4(), - startTime: new Date(), - appName, - }), + start: + (state) => + ({ appName }) => ({ + ...createSessionDefaultState(), + sessionId: uuid.v4(), + startTime: new Date(), + appName, + }), restore: (state) => (sessionId: string) => ({ ...createSessionDefaultState(), sessionId, diff --git a/src/plugins/data/public/search/session/session_service.ts b/src/plugins/data/public/search/session/session_service.ts index 32cd620a2adb2..874fad67c4df1 100644 --- a/src/plugins/data/public/search/session/session_service.ts +++ b/src/plugins/data/public/search/session/session_service.ts @@ -108,13 +108,10 @@ export class SessionService { private readonly nowProvider: NowProviderInternalContract, { freezeState = true }: { freezeState: boolean } = { freezeState: true } ) { - const { - stateContainer, - sessionState$, - sessionMeta$, - } = createSessionStateContainer({ - freeze: freezeState, - }); + const { stateContainer, sessionState$, sessionMeta$ } = + createSessionStateContainer({ + freeze: freezeState, + }); this.state$ = sessionState$; this.state = stateContainer; this.sessionMeta$ = sessionMeta$; @@ -332,8 +329,8 @@ export class SessionService { const searchSessionSavedObject = await this.sessionsClient.create({ name: formattedName, appId: currentSessionApp, - restoreState: (restoreState as unknown) as Record, - initialState: (initialState as unknown) as Record, + restoreState: restoreState as unknown as Record, + initialState: initialState as unknown as Record, urlGeneratorId, sessionId, }); diff --git a/src/plugins/data/public/services.ts b/src/plugins/data/public/services.ts index bcc23e13a1ec6..c1a0ae1ac1b53 100644 --- a/src/plugins/data/public/services.ts +++ b/src/plugins/data/public/services.ts @@ -11,20 +11,16 @@ import { createGetterSetter } from '../../kibana_utils/public'; import { IndexPatternsContract } from './data_views'; import { DataPublicPluginStart } from './types'; -export const [getNotifications, setNotifications] = createGetterSetter( - 'Notifications' -); +export const [getNotifications, setNotifications] = + createGetterSetter('Notifications'); -export const [getUiSettings, setUiSettings] = createGetterSetter( - 'UiSettings' -); +export const [getUiSettings, setUiSettings] = + createGetterSetter('UiSettings'); export const [getOverlays, setOverlays] = createGetterSetter('Overlays'); -export const [getIndexPatterns, setIndexPatterns] = createGetterSetter( - 'IndexPatterns' -); +export const [getIndexPatterns, setIndexPatterns] = + createGetterSetter('IndexPatterns'); -export const [getSearchService, setSearchService] = createGetterSetter< - DataPublicPluginStart['search'] ->('Search'); +export const [getSearchService, setSearchService] = + createGetterSetter('Search'); diff --git a/src/plugins/data/public/ui/saved_query_management/saved_query_management_component.tsx b/src/plugins/data/public/ui/saved_query_management/saved_query_management_component.tsx index 83e7c0a9cf4fb..95bfdb0680d95 100644 --- a/src/plugins/data/public/ui/saved_query_management/saved_query_management_component.tsx +++ b/src/plugins/data/public/ui/saved_query_management/saved_query_management_component.tsx @@ -61,10 +61,8 @@ export function SavedQueryManagementComponent({ requestGotCancelled = true; }; - const { - total: savedQueryCount, - queries: savedQueryItems, - } = await savedQueryService.findSavedQueries('', perPage, activePage + 1); + const { total: savedQueryCount, queries: savedQueryItems } = + await savedQueryService.findSavedQueries('', perPage, activePage + 1); if (requestGotCancelled) return; @@ -77,9 +75,10 @@ export function SavedQueryManagementComponent({ } }, [isOpen, activePage, savedQueryService]); - const handleTogglePopover = useCallback(() => setIsOpen((currentState) => !currentState), [ - setIsOpen, - ]); + const handleTogglePopover = useCallback( + () => setIsOpen((currentState) => !currentState), + [setIsOpen] + ); const handleClosePopover = useCallback(() => setIsOpen(false), []); diff --git a/src/plugins/data/public/ui/shard_failure_modal/shard_failure_open_modal_button.test.mocks.tsx b/src/plugins/data/public/ui/shard_failure_modal/shard_failure_open_modal_button.test.mocks.tsx index 5f3de555d1674..44996497cc0c6 100644 --- a/src/plugins/data/public/ui/shard_failure_modal/shard_failure_open_modal_button.test.mocks.tsx +++ b/src/plugins/data/public/ui/shard_failure_modal/shard_failure_open_modal_button.test.mocks.tsx @@ -11,6 +11,6 @@ import { OverlayStart } from 'kibana/public'; export const openModal = jest.fn(); -setOverlays(({ +setOverlays({ openModal, -} as unknown) as OverlayStart); +} as unknown as OverlayStart); diff --git a/src/plugins/data/server/autocomplete/terms_agg.test.ts b/src/plugins/data/server/autocomplete/terms_agg.test.ts index 96a75fd3b2fd8..dcaa5390f3fe6 100644 --- a/src/plugins/data/server/autocomplete/terms_agg.test.ts +++ b/src/plugins/data/server/autocomplete/terms_agg.test.ts @@ -17,11 +17,11 @@ import { duration } from 'moment'; let savedObjectsClientMock: jest.Mocked; let esClientMock: DeeplyMockedKeys; -const configMock = ({ +const configMock = { autocomplete: { valueSuggestions: { timeout: duration(4513), terminateAfter: duration(98430) }, }, -} as unknown) as ConfigSchema; +} as unknown as ConfigSchema; // @ts-expect-error not full interface const mockResponse = { diff --git a/src/plugins/data/server/autocomplete/terms_enum.test.ts b/src/plugins/data/server/autocomplete/terms_enum.test.ts index 0e00e2dfe6b4f..444ba4e89c58b 100644 --- a/src/plugins/data/server/autocomplete/terms_enum.test.ts +++ b/src/plugins/data/server/autocomplete/terms_enum.test.ts @@ -31,7 +31,7 @@ describe('_terms_enum suggestions', () => { savedObjectsClientMock = requestHandlerContext.savedObjects.client; esClientMock = requestHandlerContext.elasticsearch.client.asCurrentUser; esClientMock.termsEnum.mockResolvedValue( - (mockResponse as unknown) as ApiResponse + mockResponse as unknown as ApiResponse ); }); diff --git a/src/plugins/data/server/config_deprecations.test.ts b/src/plugins/data/server/config_deprecations.test.ts index 6d3f8d9d6f227..365c3b749f6c7 100644 --- a/src/plugins/data/server/config_deprecations.test.ts +++ b/src/plugins/data/server/config_deprecations.test.ts @@ -21,7 +21,9 @@ const applyConfigDeprecations = (settings: Record = {}) => { deprecation, path: '', })), - () => ({ message }) => deprecationMessages.push(message) + () => + ({ message }) => + deprecationMessages.push(message) ); return { messages: deprecationMessages, diff --git a/src/plugins/data/server/data_views/deprecations/scripted_fields.ts b/src/plugins/data/server/data_views/deprecations/scripted_fields.ts index 0dedfeb72028b..65cb962196805 100644 --- a/src/plugins/data/server/data_views/deprecations/scripted_fields.ts +++ b/src/plugins/data/server/data_views/deprecations/scripted_fields.ts @@ -21,13 +21,12 @@ export const createScriptedFieldsDeprecationsConfig: ( core: CoreSetup ) => RegisterDeprecationsConfig = (core: CoreSetup) => ({ getDeprecations: async (context: GetDeprecationsContext): Promise => { - const finder = context.savedObjectsClient.createPointInTimeFinder( - { + const finder = + context.savedObjectsClient.createPointInTimeFinder({ type: 'index-pattern', perPage: 1000, fields: ['title', 'fields'], - } - ); + }); const indexPatternsWithScriptedFields: IndexPatternAttributesWithFields[] = []; for await (const response of finder.find()) { diff --git a/src/plugins/data/server/data_views/fetcher/index_patterns_fetcher.test.ts b/src/plugins/data/server/data_views/fetcher/index_patterns_fetcher.test.ts index ffdd47e5cdf49..4bd21fb3a1820 100644 --- a/src/plugins/data/server/data_views/fetcher/index_patterns_fetcher.test.ts +++ b/src/plugins/data/server/data_views/fetcher/index_patterns_fetcher.test.ts @@ -25,9 +25,9 @@ describe('Index Pattern Fetcher - server', () => { }; const patternList = ['a', 'b', 'c']; beforeEach(() => { - esClient = ({ + esClient = { count: jest.fn().mockResolvedValueOnce(emptyResponse).mockResolvedValue(response), - } as unknown) as ElasticsearchClient; + } as unknown as ElasticsearchClient; indexPatterns = new IndexPatternsFetcher(esClient); }); @@ -37,9 +37,9 @@ describe('Index Pattern Fetcher - server', () => { }); it('Returns all patterns when all match indices', async () => { - esClient = ({ + esClient = { count: jest.fn().mockResolvedValue(response), - } as unknown) as ElasticsearchClient; + } as unknown as ElasticsearchClient; indexPatterns = new IndexPatternsFetcher(esClient); const result = await indexPatterns.validatePatternListActive(patternList); expect(result).toEqual(patternList); @@ -57,14 +57,14 @@ describe('Index Pattern Fetcher - server', () => { } } - esClient = ({ + esClient = { count: jest .fn() .mockResolvedValueOnce(response) .mockRejectedValue( new ServerError('index_not_found_exception', 404, indexNotFoundException) ), - } as unknown) as ElasticsearchClient; + } as unknown as ElasticsearchClient; indexPatterns = new IndexPatternsFetcher(esClient); const result = await indexPatterns.validatePatternListActive(patternList); expect(result).toEqual([patternList[0]]); diff --git a/src/plugins/data/server/data_views/index_patterns_service.ts b/src/plugins/data/server/data_views/index_patterns_service.ts index 6f0491d91a640..5286d1d64794b 100644 --- a/src/plugins/data/server/data_views/index_patterns_service.ts +++ b/src/plugins/data/server/data_views/index_patterns_service.ts @@ -48,34 +48,36 @@ export interface IndexPatternsServiceStartDeps { logger: Logger; } -export const indexPatternsServiceFactory = ({ - logger, - uiSettings, - fieldFormats, -}: { - logger: Logger; - uiSettings: UiSettingsServiceStart; - fieldFormats: FieldFormatsStart; -}) => async ( - savedObjectsClient: SavedObjectsClientContract, - elasticsearchClient: ElasticsearchClient -) => { - const uiSettingsClient = uiSettings.asScopedToClient(savedObjectsClient); - const formats = await fieldFormats.fieldFormatServiceFactory(uiSettingsClient); +export const indexPatternsServiceFactory = + ({ + logger, + uiSettings, + fieldFormats, + }: { + logger: Logger; + uiSettings: UiSettingsServiceStart; + fieldFormats: FieldFormatsStart; + }) => + async ( + savedObjectsClient: SavedObjectsClientContract, + elasticsearchClient: ElasticsearchClient + ) => { + const uiSettingsClient = uiSettings.asScopedToClient(savedObjectsClient); + const formats = await fieldFormats.fieldFormatServiceFactory(uiSettingsClient); - return new IndexPatternsCommonService({ - uiSettings: new UiSettingsServerToCommon(uiSettingsClient), - savedObjectsClient: new SavedObjectsClientServerToCommon(savedObjectsClient), - apiClient: new IndexPatternsApiServer(elasticsearchClient, savedObjectsClient), - fieldFormats: formats, - onError: (error) => { - logger.error(error); - }, - onNotification: ({ title, text }) => { - logger.warn(`${title}${text ? ` : ${text}` : ''}`); - }, - }); -}; + return new IndexPatternsCommonService({ + uiSettings: new UiSettingsServerToCommon(uiSettingsClient), + savedObjectsClient: new SavedObjectsClientServerToCommon(savedObjectsClient), + apiClient: new IndexPatternsApiServer(elasticsearchClient, savedObjectsClient), + fieldFormats: formats, + onError: (error) => { + logger.error(error); + }, + onNotification: ({ title, text }) => { + logger.warn(`${title}${text ? ` : ${text}` : ''}`); + }, + }); + }; export class IndexPatternsServiceProvider implements Plugin { public setup( diff --git a/src/plugins/data/server/data_views/register_index_pattern_usage_collection.test.ts b/src/plugins/data/server/data_views/register_index_pattern_usage_collection.test.ts index c43431e10731a..2c826185757d6 100644 --- a/src/plugins/data/server/data_views/register_index_pattern_usage_collection.test.ts +++ b/src/plugins/data/server/data_views/register_index_pattern_usage_collection.test.ts @@ -26,13 +26,13 @@ const runtimeFieldA = { runtimeField: { script: { source: scriptA } } }; const runtimeFieldB = { runtimeField: { script: { source: scriptB } } }; const runtimeFieldC = { runtimeField: { script: { source: scriptC } } }; -const indexPatterns = ({ +const indexPatterns = { getIds: async () => [1, 2, 3], get: jest.fn().mockResolvedValue({ getScriptedFields: () => [], fields: [], }), -} as any) as IndexPatternsCommonService; +} as any as IndexPatternsCommonService; describe('index pattern usage collection', () => { it('minMaxAvgLoC calculates min, max, and average ', () => { diff --git a/src/plugins/data/server/data_views/routes/scripted_fields/update_scripted_field.ts b/src/plugins/data/server/data_views/routes/scripted_fields/update_scripted_field.ts index dd2484ef59e1b..bf10a3ee6389e 100644 --- a/src/plugins/data/server/data_views/routes/scripted_fields/update_scripted_field.ts +++ b/src/plugins/data/server/data_views/routes/scripted_fields/update_scripted_field.ts @@ -66,7 +66,7 @@ export const registerUpdateScriptedFieldRoute = ( ); const id = req.params.id; const name = req.params.name; - const field = ({ ...req.body.field, name } as unknown) as FieldSpec; + const field = { ...req.body.field, name } as unknown as FieldSpec; const indexPattern = await indexPatternsService.get(id); let fieldObject = indexPattern.fields.getByName(field.name); diff --git a/src/plugins/data/server/data_views/routes/util/handle_errors.ts b/src/plugins/data/server/data_views/routes/util/handle_errors.ts index 8e88a70a56503..f49e6394fd007 100644 --- a/src/plugins/data/server/data_views/routes/util/handle_errors.ts +++ b/src/plugins/data/server/data_views/routes/util/handle_errors.ts @@ -29,32 +29,36 @@ interface ErrorWithData { * } * ``` */ -export const handleErrors = < - P, - Q, - B, - Context extends RequestHandlerContext, - Method extends RouteMethod ->( - handler: RequestHandler -): RequestHandler => async (context, request, response) => { - try { - return await handler(context, request, response); - } catch (error) { - if (error instanceof Error) { - const body: ErrorResponseBody = { - message: error.message, - }; +export const handleErrors = + ( + handler: RequestHandler + ): RequestHandler => + async (context, request, response) => { + try { + return await handler(context, request, response); + } catch (error) { + if (error instanceof Error) { + const body: ErrorResponseBody = { + message: error.message, + }; - if (typeof (error as ErrorWithData).data === 'object') { - body.attributes = (error as ErrorWithData).data; - } + if (typeof (error as ErrorWithData).data === 'object') { + body.attributes = (error as ErrorWithData).data; + } + + const is404 = + (error as ErrorIndexPatternNotFound).is404 || (error as any)?.output?.statusCode === 404; - const is404 = - (error as ErrorIndexPatternNotFound).is404 || (error as any)?.output?.statusCode === 404; + if (is404) { + return response.notFound({ + headers: { + 'content-type': 'application/json', + }, + body, + }); + } - if (is404) { - return response.notFound({ + return response.badRequest({ headers: { 'content-type': 'application/json', }, @@ -62,14 +66,6 @@ export const handleErrors = < }); } - return response.badRequest({ - headers: { - 'content-type': 'application/json', - }, - body, - }); + throw error; } - - throw error; - } -}; + }; diff --git a/src/plugins/data/server/kql_telemetry/usage_collector/fetch.test.ts b/src/plugins/data/server/kql_telemetry/usage_collector/fetch.test.ts index f3d38d4e5cf01..912526b22151f 100644 --- a/src/plugins/data/server/kql_telemetry/usage_collector/fetch.test.ts +++ b/src/plugins/data/server/kql_telemetry/usage_collector/fetch.test.ts @@ -69,10 +69,10 @@ function setupMockCallCluster( }); } } - const esClientMock = ({ + const esClientMock = { get: jest.fn().mockImplementation(mockedEsGetMethod), search: jest.fn().mockImplementation(mockedEsSearchMethod), - } as unknown) as ElasticsearchClient; + } as unknown as ElasticsearchClient; esClient = esClientMock; } diff --git a/src/plugins/data/server/kql_telemetry/usage_collector/make_kql_usage_collector.test.ts b/src/plugins/data/server/kql_telemetry/usage_collector/make_kql_usage_collector.test.ts index 6a6800114f909..877e0a6b1ef0c 100644 --- a/src/plugins/data/server/kql_telemetry/usage_collector/make_kql_usage_collector.test.ts +++ b/src/plugins/data/server/kql_telemetry/usage_collector/make_kql_usage_collector.test.ts @@ -13,10 +13,10 @@ describe('makeKQLUsageCollector', () => { let usageCollectionMock: jest.Mocked; beforeEach(() => { - usageCollectionMock = ({ + usageCollectionMock = { makeUsageCollector: jest.fn(), registerCollector: jest.fn(), - } as unknown) as jest.Mocked; + } as unknown as jest.Mocked; }); it('should call registerCollector', () => { diff --git a/src/plugins/data/server/mocks.ts b/src/plugins/data/server/mocks.ts index 852dffcfa3d51..c766dc5e5765c 100644 --- a/src/plugins/data/server/mocks.ts +++ b/src/plugins/data/server/mocks.ts @@ -40,9 +40,9 @@ function createStartContract() { } function createRequestHandlerContext() { - return ({ + return { search: createSearchRequestHandlerContext(), - } as unknown) as jest.Mocked; + } as unknown as jest.Mocked; } export const dataPluginMock = { diff --git a/src/plugins/data/server/plugin.ts b/src/plugins/data/server/plugin.ts index c1741cc31fc05..3342519782d7a 100644 --- a/src/plugins/data/server/plugin.ts +++ b/src/plugins/data/server/plugin.ts @@ -65,7 +65,8 @@ export class DataServerPlugin DataPluginStart, DataPluginSetupDependencies, DataPluginStartDependencies - > { + > +{ private readonly searchService: SearchService; private readonly scriptsService: ScriptsService; private readonly kqlTelemetryService: KqlTelemetryService; diff --git a/src/plugins/data/server/saved_objects/index_pattern_migrations.test.ts b/src/plugins/data/server/saved_objects/index_pattern_migrations.test.ts index eca1fba85f0ba..7d8ca120d6d6a 100644 --- a/src/plugins/data/server/saved_objects/index_pattern_migrations.test.ts +++ b/src/plugins/data/server/saved_objects/index_pattern_migrations.test.ts @@ -9,7 +9,7 @@ import { SavedObjectMigrationContext } from 'kibana/server'; import { indexPatternSavedObjectTypeMigrations } from './index_pattern_migrations'; -const savedObjectMigrationContext = (null as unknown) as SavedObjectMigrationContext; +const savedObjectMigrationContext = null as unknown as SavedObjectMigrationContext; describe('migration index-pattern', () => { describe('6.5.0', () => { diff --git a/src/plugins/data/server/search/aggs/aggs_service.ts b/src/plugins/data/server/search/aggs/aggs_service.ts index ed18ef7e4f350..e65c6d4134970 100644 --- a/src/plugins/data/server/search/aggs/aggs_service.ts +++ b/src/plugins/data/server/search/aggs/aggs_service.ts @@ -72,17 +72,17 @@ export class AggsService { }; const isDefaultTimezone = () => getConfig('dateFormat:tz') === 'Browser'; - const { - calculateAutoTimeExpression, - datatableUtilities, - types, - } = this.aggsCommonService.start({ - getConfig, - getIndexPattern: ( - await indexPatterns.indexPatternsServiceFactory(savedObjectsClient, elasticsearchClient) - ).get, - isDefaultTimezone, - }); + const { calculateAutoTimeExpression, datatableUtilities, types } = + this.aggsCommonService.start({ + getConfig, + getIndexPattern: ( + await indexPatterns.indexPatternsServiceFactory( + savedObjectsClient, + elasticsearchClient + ) + ).get, + isDefaultTimezone, + }); const aggTypesDependencies: AggTypesDependencies = { calculateBounds: this.calculateBounds, diff --git a/src/plugins/data/server/search/collectors/fetch.ts b/src/plugins/data/server/search/collectors/fetch.ts index aed35d73c7eb6..8c4b79b290565 100644 --- a/src/plugins/data/server/search/collectors/fetch.ts +++ b/src/plugins/data/server/search/collectors/fetch.ts @@ -35,9 +35,8 @@ export function fetchProvider(config$: Observable) { averageDuration: null, }; } - const { successCount, errorCount, totalDuration } = esResponse.hits.hits[0]._source![ - 'search-telemetry' - ]; + const { successCount, errorCount, totalDuration } = + esResponse.hits.hits[0]._source!['search-telemetry']; const averageDuration = totalDuration / successCount; return { successCount, errorCount, averageDuration }; }; diff --git a/src/plugins/data/server/search/expressions/esaggs.test.ts b/src/plugins/data/server/search/expressions/esaggs.test.ts index 5833846cf96e3..cc5b81657bc55 100644 --- a/src/plugins/data/server/search/expressions/esaggs.test.ts +++ b/src/plugins/data/server/search/expressions/esaggs.test.ts @@ -56,7 +56,7 @@ describe('esaggs expression function - server', () => { beforeEach(() => { jest.clearAllMocks(); mockHandlers = { - abortSignal: (jest.fn() as unknown) as jest.Mocked, + abortSignal: jest.fn() as unknown as jest.Mocked, getKibanaRequest: jest.fn().mockReturnValue({ id: 'hi' } as KibanaRequest), getSearchContext: jest.fn(), getSearchSessionId: jest.fn().mockReturnValue('abc123'), @@ -66,13 +66,13 @@ describe('esaggs expression function - server', () => { types: {}, }; startDependencies = { - aggs: ({ + aggs: { createAggConfigs: jest.fn().mockReturnValue({ foo: 'bar' }), - } as unknown) as jest.Mocked, - indexPatterns: ({ + } as unknown as jest.Mocked, + indexPatterns: { create: jest.fn().mockResolvedValue({}), - } as unknown) as jest.Mocked, - searchSource: ({} as unknown) as jest.Mocked, + } as unknown as jest.Mocked, + searchSource: {} as unknown as jest.Mocked, }; getStartDependencies = jest.fn().mockResolvedValue(startDependencies); definition = getFunctionDefinition({ getStartDependencies }); diff --git a/src/plugins/data/server/search/expressions/kibana_context.ts b/src/plugins/data/server/search/expressions/kibana_context.ts index 191a0fdb7ae88..fd5af4cc4b057 100644 --- a/src/plugins/data/server/search/expressions/kibana_context.ts +++ b/src/plugins/data/server/search/expressions/kibana_context.ts @@ -38,9 +38,7 @@ export function getKibanaContext({ const [{ savedObjects }] = await getStartServices(); return { - savedObjectsClient: (savedObjects.getScopedClient( - request - ) as any) as SavedObjectsClientCommon, + savedObjectsClient: savedObjects.getScopedClient(request) as any as SavedObjectsClientCommon, }; }); } diff --git a/src/plugins/data/server/search/routes/search.test.ts b/src/plugins/data/server/search/routes/search.test.ts index b333174bc2a02..06487d271c6e1 100644 --- a/src/plugins/data/server/search/routes/search.test.ts +++ b/src/plugins/data/server/search/routes/search.test.ts @@ -28,7 +28,7 @@ describe('Search service', () => { const mockRouter = mockCoreSetup.http.createRouter.mock.results[0].value; const handler = mockRouter.post.mock.calls[0][1]; - await handler((mockContext as unknown) as RequestHandlerContext, mockRequest, mockResponse); + await handler(mockContext as unknown as RequestHandlerContext, mockRequest, mockResponse); } beforeEach(() => { diff --git a/src/plugins/data/server/search/search_service.test.ts b/src/plugins/data/server/search/search_service.test.ts index e3738fd3a9304..1278c08b59713 100644 --- a/src/plugins/data/server/search/search_service.test.ts +++ b/src/plugins/data/server/search/search_service.test.ts @@ -61,14 +61,14 @@ describe('Search service', () => { describe('setup()', () => { it('exposes proper contract', async () => { const bfetch = bfetchPluginMock.createSetupContract(); - const setup = plugin.setup(mockCoreSetup, ({ + const setup = plugin.setup(mockCoreSetup, { packageInfo: { version: '8' }, bfetch, expressions: { registerFunction: jest.fn(), registerType: jest.fn(), }, - } as unknown) as SearchServiceSetupDependencies); + } as unknown as SearchServiceSetupDependencies); expect(setup).toHaveProperty('aggs'); expect(setup).toHaveProperty('registerSearchStrategy'); }); diff --git a/src/plugins/data/server/search/session/mocks.ts b/src/plugins/data/server/search/session/mocks.ts index ec99853088f78..b55292e4ac469 100644 --- a/src/plugins/data/server/search/session/mocks.ts +++ b/src/plugins/data/server/search/session/mocks.ts @@ -26,10 +26,10 @@ export function createSearchSessionsClientMock(): jest.Mocked< delete: jest.fn(), getConfig: jest.fn( () => - (({ + ({ defaultExpiration: moment.duration('1', 'w'), enabled: true, - } as unknown) as SearchSessionsConfigSchema) + } as unknown as SearchSessionsConfigSchema) ), }; } diff --git a/src/plugins/data/server/search/strategies/eql_search/eql_search_strategy.test.ts b/src/plugins/data/server/search/strategies/eql_search/eql_search_strategy.test.ts index 85ac5d8d17992..58a5e875f7c93 100644 --- a/src/plugins/data/server/search/strategies/eql_search/eql_search_strategy.test.ts +++ b/src/plugins/data/server/search/strategies/eql_search/eql_search_strategy.test.ts @@ -33,7 +33,7 @@ describe('EQL search strategy', () => { let mockLogger: Logger; beforeEach(() => { - mockLogger = ({ debug: jest.fn() } as unknown) as Logger; + mockLogger = { debug: jest.fn() } as unknown as Logger; }); describe('strategy interface', () => { @@ -58,7 +58,7 @@ describe('EQL search strategy', () => { beforeEach(() => { mockEqlSearch = jest.fn().mockResolvedValueOnce(getMockEqlResponse()); mockEqlGet = jest.fn().mockResolvedValueOnce(getMockEqlResponse()); - mockDeps = ({ + mockDeps = { uiSettingsClient: { get: jest.fn(), }, @@ -70,7 +70,7 @@ describe('EQL search strategy', () => { }, }, }, - } as unknown) as SearchStrategyDependencies; + } as unknown as SearchStrategyDependencies; params = { index: 'logstash-*', body: { query: 'process where 1 == 1' }, diff --git a/src/plugins/data/server/search/strategies/es_search/es_search_strategy.test.ts b/src/plugins/data/server/search/strategies/es_search/es_search_strategy.test.ts index c2280737d2496..bbbc99d157fe0 100644 --- a/src/plugins/data/server/search/strategies/es_search/es_search_strategy.test.ts +++ b/src/plugins/data/server/search/strategies/es_search/es_search_strategy.test.ts @@ -47,12 +47,12 @@ describe('ES search strategy', () => { return mockedApiCaller; }); - return ({ + return { uiSettingsClient: { get: () => {}, }, esClient: { asCurrentUser: { search: mockApiCaller } }, - } as unknown) as SearchStrategyDependencies; + } as unknown as SearchStrategyDependencies; } const mockConfig$ = pluginInitializerContextConfigMock({}).legacy.globalConfig$; diff --git a/src/plugins/data/server/search/strategies/es_search/request_utils.test.ts b/src/plugins/data/server/search/strategies/es_search/request_utils.test.ts index 5f18ff7e4f504..5d1826d92f182 100644 --- a/src/plugins/data/server/search/strategies/es_search/request_utils.test.ts +++ b/src/plugins/data/server/search/strategies/es_search/request_utils.test.ts @@ -22,35 +22,35 @@ const createSuccessTransportRequestPromise = ( describe('request utils', () => { describe('getShardTimeout', () => { test('returns an empty object if the config does not contain a value', () => { - const result = getShardTimeout(({ + const result = getShardTimeout({ elasticsearch: { shardTimeout: { asMilliseconds: jest.fn(), }, }, - } as unknown) as SharedGlobalConfig); + } as unknown as SharedGlobalConfig); expect(result).toEqual({}); }); test('returns an empty object if the config contains 0', () => { - const result = getShardTimeout(({ + const result = getShardTimeout({ elasticsearch: { shardTimeout: { asMilliseconds: jest.fn().mockReturnValue(0), }, }, - } as unknown) as SharedGlobalConfig); + } as unknown as SharedGlobalConfig); expect(result).toEqual({}); }); test('returns a duration if the config >= 0', () => { - const result = getShardTimeout(({ + const result = getShardTimeout({ elasticsearch: { shardTimeout: { asMilliseconds: jest.fn().mockReturnValue(10), }, }, - } as unknown) as SharedGlobalConfig); + } as unknown as SharedGlobalConfig); expect(result).toEqual({ timeout: '10ms' }); }); }); @@ -58,32 +58,32 @@ describe('request utils', () => { describe('getDefaultSearchParams', () => { describe('max_concurrent_shard_requests', () => { test('returns value if > 0', async () => { - const result = await getDefaultSearchParams(({ + const result = await getDefaultSearchParams({ get: jest.fn().mockResolvedValue(1), - } as unknown) as IUiSettingsClient); + } as unknown as IUiSettingsClient); expect(result).toHaveProperty('max_concurrent_shard_requests', 1); }); test('returns undefined if === 0', async () => { - const result = await getDefaultSearchParams(({ + const result = await getDefaultSearchParams({ get: jest.fn().mockResolvedValue(0), - } as unknown) as IUiSettingsClient); + } as unknown as IUiSettingsClient); expect(result.max_concurrent_shard_requests).toBe(undefined); }); test('returns undefined if undefined', async () => { - const result = await getDefaultSearchParams(({ + const result = await getDefaultSearchParams({ get: jest.fn(), - } as unknown) as IUiSettingsClient); + } as unknown as IUiSettingsClient); expect(result.max_concurrent_shard_requests).toBe(undefined); }); }); describe('other defaults', () => { test('returns ignore_unavailable and track_total_hits', async () => { - const result = await getDefaultSearchParams(({ + const result = await getDefaultSearchParams({ get: jest.fn(), - } as unknown) as IUiSettingsClient); + } as unknown as IUiSettingsClient); expect(result).toHaveProperty('ignore_unavailable', true); expect(result).toHaveProperty('track_total_hits', true); }); diff --git a/src/plugins/data/server/search/strategies/es_search/response_utils.test.ts b/src/plugins/data/server/search/strategies/es_search/response_utils.test.ts index bd9babd61a7c4..fc35187429a98 100644 --- a/src/plugins/data/server/search/strategies/es_search/response_utils.test.ts +++ b/src/plugins/data/server/search/strategies/es_search/response_utils.test.ts @@ -12,14 +12,14 @@ import type { estypes } from '@elastic/elasticsearch'; describe('response utils', () => { describe('getTotalLoaded', () => { it('returns the total/loaded, not including skipped', () => { - const result = getTotalLoaded(({ + const result = getTotalLoaded({ _shards: { successful: 10, failed: 5, skipped: 5, total: 100, }, - } as unknown) as estypes.SearchResponse); + } as unknown as estypes.SearchResponse); expect(result).toEqual({ total: 100, @@ -30,14 +30,14 @@ describe('response utils', () => { describe('toKibanaSearchResponse', () => { it('returns rawResponse, isPartial, isRunning, total, and loaded', () => { - const result = toKibanaSearchResponse(({ + const result = toKibanaSearchResponse({ _shards: { successful: 10, failed: 5, skipped: 5, total: 100, }, - } as unknown) as estypes.SearchResponse); + } as unknown as estypes.SearchResponse); expect(result).toEqual({ rawResponse: { diff --git a/src/plugins/data/server/search/strategies/ese_search/ese_search_strategy.test.ts b/src/plugins/data/server/search/strategies/ese_search/ese_search_strategy.test.ts index 7a1ef2fe0a48b..8d5fbf98db2d3 100644 --- a/src/plugins/data/server/search/strategies/ese_search/ese_search_strategy.test.ts +++ b/src/plugins/data/server/search/strategies/ese_search/ese_search_strategy.test.ts @@ -48,7 +48,7 @@ describe('ES search strategy', () => { const mockLogger: any = { debug: () => {}, }; - const mockDeps = ({ + const mockDeps = { uiSettingsClient: { get: jest.fn(), }, @@ -63,7 +63,7 @@ describe('ES search strategy', () => { }, }, searchSessionsClient: createSearchSessionsClientMock(), - } as unknown) as SearchStrategyDependencies; + } as unknown as SearchStrategyDependencies; const mockLegacyConfig$ = new BehaviorSubject({ elasticsearch: { shardTimeout: { diff --git a/src/plugins/discover/public/__mocks__/config.ts b/src/plugins/discover/public/__mocks__/config.ts index 977dc5699a57a..42ecbd351af74 100644 --- a/src/plugins/discover/public/__mocks__/config.ts +++ b/src/plugins/discover/public/__mocks__/config.ts @@ -9,7 +9,7 @@ import { IUiSettingsClient } from 'kibana/public'; import { SORT_DEFAULT_ORDER_SETTING } from '../../common'; -export const configMock = ({ +export const configMock = { get: (key: string) => { if (key === 'defaultIndex') { return 'the-index-pattern-id'; @@ -19,4 +19,4 @@ export const configMock = ({ return ''; }, -} as unknown) as IUiSettingsClient; +} as unknown as IUiSettingsClient; diff --git a/src/plugins/discover/public/__mocks__/index_pattern.ts b/src/plugins/discover/public/__mocks__/index_pattern.ts index 9e7049187f639..f9cc202f9063e 100644 --- a/src/plugins/discover/public/__mocks__/index_pattern.ts +++ b/src/plugins/discover/public/__mocks__/index_pattern.ts @@ -69,7 +69,7 @@ fields.getAll = () => { return fields; }; -const indexPattern = ({ +const indexPattern = { id: 'the-index-pattern-id', title: 'the-index-pattern-title', metaFields: ['_index', '_score'], @@ -83,7 +83,7 @@ const indexPattern = ({ timeFieldName: '', docvalueFields: [], getFormatterForField: () => ({ convert: () => 'formatted' }), -} as unknown) as IndexPattern; +} as unknown as IndexPattern; indexPattern.flattenHit = indexPatterns.flattenHitWrapper(indexPattern, indexPattern.metaFields); indexPattern.isTimeBased = () => !!indexPattern.timeFieldName; diff --git a/src/plugins/discover/public/__mocks__/index_pattern_with_timefield.ts b/src/plugins/discover/public/__mocks__/index_pattern_with_timefield.ts index f52ab8fd1c296..f1f1d74f3af3a 100644 --- a/src/plugins/discover/public/__mocks__/index_pattern_with_timefield.ts +++ b/src/plugins/discover/public/__mocks__/index_pattern_with_timefield.ts @@ -60,7 +60,7 @@ fields.getAll = () => { return fields; }; -const indexPattern = ({ +const indexPattern = { id: 'index-pattern-with-timefield-id', title: 'index-pattern-with-timefield', metaFields: ['_index', '_score'], @@ -72,7 +72,7 @@ const indexPattern = ({ getFieldByName: (name: string) => fields.getByName(name), timeFieldName: 'timestamp', getFormatterForField: () => ({ convert: () => 'formatted' }), -} as unknown) as IndexPattern; +} as unknown as IndexPattern; indexPattern.flattenHit = indexPatterns.flattenHitWrapper(indexPattern, indexPattern.metaFields); indexPattern.isTimeBased = () => !!indexPattern.timeFieldName; diff --git a/src/plugins/discover/public/__mocks__/index_patterns.ts b/src/plugins/discover/public/__mocks__/index_patterns.ts index 3425ea42f4e62..88447eacc884d 100644 --- a/src/plugins/discover/public/__mocks__/index_patterns.ts +++ b/src/plugins/discover/public/__mocks__/index_patterns.ts @@ -9,7 +9,7 @@ import { IndexPatternsService } from '../../../data/common'; import { indexPatternMock } from './index_pattern'; -export const indexPatternsMock = ({ +export const indexPatternsMock = { getCache: () => { return [indexPatternMock]; }, @@ -19,4 +19,4 @@ export const indexPatternsMock = ({ } }, updateSavedObject: jest.fn(), -} as unknown) as jest.Mocked; +} as unknown as jest.Mocked; diff --git a/src/plugins/discover/public/__mocks__/saved_search.ts b/src/plugins/discover/public/__mocks__/saved_search.ts index c2d9bfeb1b4b5..ebe65a5770356 100644 --- a/src/plugins/discover/public/__mocks__/saved_search.ts +++ b/src/plugins/discover/public/__mocks__/saved_search.ts @@ -11,7 +11,7 @@ import { createSearchSourceMock } from '../../../data/public/mocks'; import { indexPatternMock } from './index_pattern'; import { indexPatternWithTimefieldMock } from './index_pattern_with_timefield'; -export const savedSearchMock = ({ +export const savedSearchMock = { id: 'the-saved-search-id', type: 'search', attributes: { @@ -31,9 +31,9 @@ export const savedSearchMock = ({ migrationVersion: { search: '7.5.0' }, error: undefined, searchSource: createSearchSourceMock({ index: indexPatternMock }), -} as unknown) as SavedSearch; +} as unknown as SavedSearch; -export const savedSearchMockWithTimeField = ({ +export const savedSearchMockWithTimeField = { id: 'the-saved-search-id-with-timefield', type: 'search', attributes: { @@ -53,4 +53,4 @@ export const savedSearchMockWithTimeField = ({ migrationVersion: { search: '7.5.0' }, error: undefined, searchSource: createSearchSourceMock({ index: indexPatternWithTimefieldMock }), -} as unknown) as SavedSearch; +} as unknown as SavedSearch; diff --git a/src/plugins/discover/public/__mocks__/services.ts b/src/plugins/discover/public/__mocks__/services.ts index 47c79c429f662..d24aefb6c8192 100644 --- a/src/plugins/discover/public/__mocks__/services.ts +++ b/src/plugins/discover/public/__mocks__/services.ts @@ -22,7 +22,7 @@ import { TopNavMenu } from '../../../navigation/public'; import { FORMATS_UI_SETTINGS } from 'src/plugins/field_formats/common'; const dataPlugin = dataPluginMock.createStartContract(); -export const discoverServiceMock = ({ +export const discoverServiceMock = { core: coreMock.createStart(), chrome: chromeServiceMock.createStartContract(), history: () => ({ @@ -89,4 +89,4 @@ export const discoverServiceMock = ({ useChartsTheme: jest.fn(() => EUI_CHARTS_THEME_LIGHT.theme), useChartsBaseTheme: jest.fn(() => EUI_CHARTS_THEME_LIGHT.theme), }, -} as unknown) as DiscoverServices; +} as unknown as DiscoverServices; diff --git a/src/plugins/discover/public/__mocks__/ui_settings.ts b/src/plugins/discover/public/__mocks__/ui_settings.ts index 95d3e6ad2ba8b..be50f73041f8d 100644 --- a/src/plugins/discover/public/__mocks__/ui_settings.ts +++ b/src/plugins/discover/public/__mocks__/ui_settings.ts @@ -16,7 +16,7 @@ import { SEARCH_FIELDS_FROM_SOURCE, } from '../../common'; -export const uiSettingsMock = ({ +export const uiSettingsMock = { get: (key: string) => { if (key === SAMPLE_SIZE_SETTING) { return 10; @@ -32,4 +32,4 @@ export const uiSettingsMock = ({ return false; } }, -} as unknown) as IUiSettingsClient; +} as unknown as IUiSettingsClient; diff --git a/src/plugins/discover/public/application/apps/context/context_app.test.tsx b/src/plugins/discover/public/application/apps/context/context_app.test.tsx index a21b035c335df..d54a4f8bed247 100644 --- a/src/plugins/discover/public/application/apps/context/context_app.test.tsx +++ b/src/plugins/discover/public/application/apps/context/context_app.test.tsx @@ -42,7 +42,7 @@ describe('ContextApp test', () => { }; beforeEach(() => { - setServices(({ + setServices({ data: { search: { searchSource: { @@ -65,7 +65,7 @@ describe('ContextApp test', () => { history: () => {}, filterManager: mockFilterManager, uiSettings: uiSettingsMock, - } as unknown) as DiscoverServices); + } as unknown as DiscoverServices); }); it('renders correctly', async () => { diff --git a/src/plugins/discover/public/application/apps/context/context_app_content.test.tsx b/src/plugins/discover/public/application/apps/context/context_app_content.test.tsx index 17caef09c4c07..9b1c47d37203f 100644 --- a/src/plugins/discover/public/application/apps/context/context_app_content.test.tsx +++ b/src/plugins/discover/public/application/apps/context/context_app_content.test.tsx @@ -48,15 +48,15 @@ describe('ContextAppContent test', () => { }, sort: [1603114502000, 2092], }; - defaultProps = ({ + defaultProps = { columns: ['order_date', '_source'], indexPattern: indexPatternMock, - appState: ({} as unknown) as AppState, - stateContainer: ({} as unknown) as GetStateReturn, + appState: {} as unknown as AppState, + stateContainer: {} as unknown as GetStateReturn, anchorStatus: LoadingStatus.LOADED, predecessorsStatus: LoadingStatus.LOADED, successorsStatus: LoadingStatus.LOADED, - rows: ([hit] as unknown) as EsHitRecordList, + rows: [hit] as unknown as EsHitRecordList, predecessors: [], successors: [], defaultStepSize: 5, @@ -72,7 +72,7 @@ describe('ContextAppContent test', () => { isLegacy: true, setAppState: () => {}, addFilter: () => {}, - } as unknown) as ContextAppContentProps; + } as unknown as ContextAppContentProps; }); it('should render legacy table correctly', () => { diff --git a/src/plugins/discover/public/application/apps/context/services/_stubs.ts b/src/plugins/discover/public/application/apps/context/services/_stubs.ts index d0318c9efbab7..7e1473b876afc 100644 --- a/src/plugins/discover/public/application/apps/context/services/_stubs.ts +++ b/src/plugins/discover/public/application/apps/context/services/_stubs.ts @@ -19,7 +19,7 @@ type SortHit = { }; export function createIndexPatternsStub() { - return ({ + return { get: sinon.spy((indexPatternId) => Promise.resolve({ id: indexPatternId, @@ -27,7 +27,7 @@ export function createIndexPatternsStub() { popularizeField: () => {}, }) ), - } as unknown) as IndexPatternsContract; + } as unknown as IndexPatternsContract; } /** diff --git a/src/plugins/discover/public/application/apps/context/services/anchor.test.ts b/src/plugins/discover/public/application/apps/context/services/anchor.test.ts index b58369781a4af..b4a76fa45ec2f 100644 --- a/src/plugins/discover/public/application/apps/context/services/anchor.test.ts +++ b/src/plugins/discover/public/application/apps/context/services/anchor.test.ts @@ -24,7 +24,7 @@ describe('context app', function () { describe('function fetchAnchor', function () { beforeEach(() => { - searchSourceStub = createSearchSourceStub(([{ _id: 'hit1' }] as unknown) as EsHitRecordList); + searchSourceStub = createSearchSourceStub([{ _id: 'hit1' }] as unknown as EsHitRecordList); fetchAnchor = fetchAnchorProvider(createIndexPatternsStub(), searchSourceStub); }); @@ -173,7 +173,7 @@ describe('context app', function () { describe('useNewFields API', () => { beforeEach(() => { - searchSourceStub = createSearchSourceStub(([{ _id: 'hit1' }] as unknown) as EsHitRecordList); + searchSourceStub = createSearchSourceStub([{ _id: 'hit1' }] as unknown as EsHitRecordList); fetchAnchor = fetchAnchorProvider(createIndexPatternsStub(), searchSourceStub, true); }); diff --git a/src/plugins/discover/public/application/apps/context/services/context.predecessors.test.ts b/src/plugins/discover/public/application/apps/context/services/context.predecessors.test.ts index 6fad858488c4e..028dec7b9fe19 100644 --- a/src/plugins/discover/public/application/apps/context/services/context.predecessors.test.ts +++ b/src/plugins/discover/public/application/apps/context/services/context.predecessors.test.ts @@ -46,7 +46,7 @@ describe('context predecessors', function () { beforeEach(() => { mockSearchSource = createContextSearchSourceStub('@timestamp'); - setServices(({ + setServices({ data: { search: { searchSource: { @@ -54,7 +54,7 @@ describe('context predecessors', function () { }, }, }, - } as unknown) as DiscoverServices); + } as unknown as DiscoverServices); fetchPredecessors = ( indexPatternId, @@ -238,7 +238,7 @@ describe('context predecessors', function () { beforeEach(() => { mockSearchSource = createContextSearchSourceStub('@timestamp'); - setServices(({ + setServices({ data: { search: { searchSource: { @@ -246,7 +246,7 @@ describe('context predecessors', function () { }, }, }, - } as unknown) as DiscoverServices); + } as unknown as DiscoverServices); fetchPredecessors = ( indexPatternId, diff --git a/src/plugins/discover/public/application/apps/context/services/context.successors.test.ts b/src/plugins/discover/public/application/apps/context/services/context.successors.test.ts index 6c44f0aa3f7b5..656491f01f9cf 100644 --- a/src/plugins/discover/public/application/apps/context/services/context.successors.test.ts +++ b/src/plugins/discover/public/application/apps/context/services/context.successors.test.ts @@ -45,7 +45,7 @@ describe('context successors', function () { beforeEach(() => { mockSearchSource = createContextSearchSourceStub('@timestamp'); - setServices(({ + setServices({ data: { search: { searchSource: { @@ -53,7 +53,7 @@ describe('context successors', function () { }, }, }, - } as unknown) as DiscoverServices); + } as unknown as DiscoverServices); fetchSuccessors = ( indexPatternId, @@ -240,7 +240,7 @@ describe('context successors', function () { beforeEach(() => { mockSearchSource = createContextSearchSourceStub('@timestamp'); - setServices(({ + setServices({ data: { search: { searchSource: { @@ -248,7 +248,7 @@ describe('context successors', function () { }, }, }, - } as unknown) as DiscoverServices); + } as unknown as DiscoverServices); fetchSuccessors = ( indexPatternId, diff --git a/src/plugins/discover/public/application/apps/context/services/context_state.test.ts b/src/plugins/discover/public/application/apps/context/services/context_state.test.ts index 401bc4d38a352..07491caf8989e 100644 --- a/src/plugins/discover/public/application/apps/context/services/context_state.test.ts +++ b/src/plugins/discover/public/application/apps/context/services/context_state.test.ts @@ -28,7 +28,7 @@ describe('Test Discover Context State', () => { history, uiSettings: { get: (key: string) => - ((key === SEARCH_FIELDS_FROM_SOURCE ? true : ['_source']) as unknown) as T, + (key === SEARCH_FIELDS_FROM_SOURCE ? true : ['_source']) as unknown as T, } as IUiSettingsClient, }); state.startSync(); diff --git a/src/plugins/discover/public/application/apps/context/services/utils/fetch_hits_in_interval.ts b/src/plugins/discover/public/application/apps/context/services/utils/fetch_hits_in_interval.ts index feacf940e312a..4cfbee2dc02bc 100644 --- a/src/plugins/discover/public/application/apps/context/services/utils/fetch_hits_in_interval.ts +++ b/src/plugins/discover/public/application/apps/context/services/utils/fetch_hits_in_interval.ts @@ -77,5 +77,5 @@ export async function fetchHitsInInterval( .fetch(); // TODO: There's a difference in the definition of SearchResponse and EsHitRecord - return ((response.hits?.hits as unknown) as EsHitRecord[]) || []; + return (response.hits?.hits as unknown as EsHitRecord[]) || []; } diff --git a/src/plugins/discover/public/application/apps/context/utils/use_context_app_fetch.test.ts b/src/plugins/discover/public/application/apps/context/utils/use_context_app_fetch.test.ts index 8d6d81bcaa493..5efd5e1195c5d 100644 --- a/src/plugins/discover/public/application/apps/context/utils/use_context_app_fetch.test.ts +++ b/src/plugins/discover/public/application/apps/context/utils/use_context_app_fetch.test.ts @@ -51,7 +51,7 @@ jest.mock('../services/anchor', () => ({ const initDefaults = (tieBreakerFields: string[], indexPatternId = 'the-index-pattern-id') => { const dangerNotification = jest.fn(); - setServices(({ + setServices({ data: { search: { searchSource: { @@ -71,11 +71,11 @@ const initDefaults = (tieBreakerFields: string[], indexPatternId = 'the-index-pa } }, }, - } as unknown) as DiscoverServices); + } as unknown as DiscoverServices); return { dangerNotification, - props: ({ + props: { anchorId: 'mock_anchor_id', indexPatternId, indexPattern: indexPatternMock, @@ -86,7 +86,7 @@ const initDefaults = (tieBreakerFields: string[], indexPatternId = 'the-index-pa }, useNewFieldsApi: false, services: getServices(), - } as unknown) as ContextAppFetchProps, + } as unknown as ContextAppFetchProps, }; }; diff --git a/src/plugins/discover/public/application/apps/main/components/chart/discover_chart.test.tsx b/src/plugins/discover/public/application/apps/main/components/chart/discover_chart.test.tsx index 732dee6106b36..63ce310e878ea 100644 --- a/src/plugins/discover/public/application/apps/main/components/chart/discover_chart.test.tsx +++ b/src/plugins/discover/public/application/apps/main/components/chart/discover_chart.test.tsx @@ -34,23 +34,11 @@ function getProps(timefield?: string) { result: Number(esHits.length), }) as DataTotalHits$; - const chartData = ({ + const chartData = { xAxisOrderedValues: [ - 1623880800000, - 1623967200000, - 1624053600000, - 1624140000000, - 1624226400000, - 1624312800000, - 1624399200000, - 1624485600000, - 1624572000000, - 1624658400000, - 1624744800000, - 1624831200000, - 1624917600000, - 1625004000000, - 1625090400000, + 1623880800000, 1623967200000, 1624053600000, 1624140000000, 1624226400000, 1624312800000, + 1624399200000, 1624485600000, 1624572000000, 1624658400000, 1624744800000, 1624831200000, + 1624917600000, 1625004000000, 1625090400000, ], xAxisFormat: { id: 'date', params: { pattern: 'YYYY-MM-DD' } }, xAxisLabel: 'order_date per day', @@ -83,7 +71,7 @@ function getProps(timefield?: string) { { x: 1625004000000, y: 137 }, { x: 1625090400000, y: 66 }, ], - } as unknown) as Chart; + } as unknown as Chart; const charts$ = new BehaviorSubject({ fetchStatus: FetchStatus.COMPLETE, diff --git a/src/plugins/discover/public/application/apps/main/components/chart/histogram.tsx b/src/plugins/discover/public/application/apps/main/components/chart/histogram.tsx index bfb4cd1380766..674db3f01e689 100644 --- a/src/plugins/discover/public/application/apps/main/components/chart/histogram.tsx +++ b/src/plugins/discover/public/application/apps/main/components/chart/histogram.tsx @@ -78,16 +78,17 @@ export function DiscoverHistogram({ ); const onElementClick = useCallback( - (xInterval: number): ElementClickListener => ([elementData]) => { - const startRange = (elementData as XYChartElementEvent)[0].x; + (xInterval: number): ElementClickListener => + ([elementData]) => { + const startRange = (elementData as XYChartElementEvent)[0].x; - const range = { - from: startRange, - to: startRange + xInterval, - }; + const range = { + from: startRange, + to: startRange + xInterval, + }; - timefilterUpdateHandler(range); - }, + timefilterUpdateHandler(range); + }, [timefilterUpdateHandler] ); diff --git a/src/plugins/discover/public/application/apps/main/components/doc_table/actions/columns.test.ts b/src/plugins/discover/public/application/apps/main/components/doc_table/actions/columns.test.ts index 3b73044b68e07..d0984ff6fa797 100644 --- a/src/plugins/discover/public/application/apps/main/components/doc_table/actions/columns.test.ts +++ b/src/plugins/discover/public/application/apps/main/components/doc_table/actions/columns.test.ts @@ -15,11 +15,11 @@ import { AppState } from '../../../services/discover_state'; function getStateColumnAction(state: {}, setAppState: (state: Partial) => void) { return getStateColumnActions({ - capabilities: ({ + capabilities: { discover: { save: false, }, - } as unknown) as Capabilities, + } as unknown as Capabilities, config: configMock, indexPattern: indexPatternMock, indexPatterns: indexPatternsMock, diff --git a/src/plugins/discover/public/application/apps/main/components/doc_table/components/table_header/table_header.test.tsx b/src/plugins/discover/public/application/apps/main/components/doc_table/components/table_header/table_header.test.tsx index 83320c1b6d3da..2738a04559fcf 100644 --- a/src/plugins/discover/public/application/apps/main/components/doc_table/components/table_header/table_header.test.tsx +++ b/src/plugins/discover/public/application/apps/main/components/doc_table/components/table_header/table_header.test.tsx @@ -14,7 +14,7 @@ import { findTestSubject } from '@elastic/eui/lib/test'; import { SortOrder } from './helpers'; function getMockIndexPattern() { - return ({ + return { id: 'test', title: 'Test', timeFieldName: 'time', @@ -41,7 +41,7 @@ function getMockIndexPattern() { } as IndexPatternField; } }, - } as unknown) as IndexPattern; + } as unknown as IndexPattern; } function getMockProps(props = {}) { diff --git a/src/plugins/discover/public/application/apps/main/components/doc_table/components/table_row.test.tsx b/src/plugins/discover/public/application/apps/main/components/doc_table/components/table_row.test.tsx index 59ced9d5668a0..887564168ac85 100644 --- a/src/plugins/discover/public/application/apps/main/components/doc_table/components/table_row.test.tsx +++ b/src/plugins/discover/public/application/apps/main/components/doc_table/components/table_row.test.tsx @@ -56,7 +56,7 @@ describe('Doc table row component', () => { beforeEach(() => { mockInlineFilter = jest.fn(); - defaultProps = ({ + defaultProps = { columns: ['_source'], filter: mockInlineFilter, indexPattern: indexPatternWithTimefieldMock, @@ -65,11 +65,11 @@ describe('Doc table row component', () => { filterManager: mockFilterManager, addBasePath: (path: string) => path, hideTimeColumn: true, - } as unknown) as TableRowProps; + } as unknown as TableRowProps; - setServices(({ + setServices({ uiSettings: uiSettingsMock, - } as unknown) as DiscoverServices); + } as unknown as DiscoverServices); setDocViewsRegistry(new DocViewsRegistry()); }); diff --git a/src/plugins/discover/public/application/apps/main/components/doc_table/doc_table_embeddable.tsx b/src/plugins/discover/public/application/apps/main/components/doc_table/doc_table_embeddable.tsx index c01f661eb116a..84edf147dea4c 100644 --- a/src/plugins/discover/public/application/apps/main/components/doc_table/doc_table_embeddable.tsx +++ b/src/plugins/discover/public/application/apps/main/components/doc_table/doc_table_embeddable.tsx @@ -25,17 +25,10 @@ const DocTableWrapperMemoized = memo(DocTableWrapper); export const DocTableEmbeddable = (props: DocTableEmbeddableProps) => { const tableWrapperRef = useRef(null); - const { - currentPage, - pageSize, - totalPages, - startIndex, - hasNextPage, - changePage, - changePageSize, - } = usePager({ - totalItems: props.rows.length, - }); + const { currentPage, pageSize, totalPages, startIndex, hasNextPage, changePage, changePageSize } = + usePager({ + totalItems: props.rows.length, + }); const showPagination = totalPages !== 0; const scrollTop = useCallback(() => { @@ -44,11 +37,10 @@ export const DocTableEmbeddable = (props: DocTableEmbeddableProps) => { } }, []); - const pageOfItems = useMemo(() => props.rows.slice(startIndex, pageSize + startIndex), [ - pageSize, - startIndex, - props.rows, - ]); + const pageOfItems = useMemo( + () => props.rows.slice(startIndex, pageSize + startIndex), + [pageSize, startIndex, props.rows] + ); const onPageChange = useCallback( (page: number) => { diff --git a/src/plugins/discover/public/application/apps/main/components/doc_table/lib/row_formatter.test.ts b/src/plugins/discover/public/application/apps/main/components/doc_table/lib/row_formatter.test.ts index c15c02264759c..9cd2959f5d72a 100644 --- a/src/plugins/discover/public/application/apps/main/components/doc_table/lib/row_formatter.test.ts +++ b/src/plugins/discover/public/application/apps/main/components/doc_table/lib/row_formatter.test.ts @@ -63,11 +63,11 @@ describe('Row formatter', () => { beforeEach(() => { // @ts-expect-error indexPattern.formatHit = formatHitMock; - setServices(({ + setServices({ uiSettings: { get: () => 100, }, - } as unknown) as DiscoverServices); + } as unknown as DiscoverServices); }); it('formats document properly', () => { @@ -110,11 +110,11 @@ describe('Row formatter', () => { }); it('limits number of rendered items', () => { - setServices(({ + setServices({ uiSettings: { get: () => 1, }, - } as unknown) as DiscoverServices); + } as unknown as DiscoverServices); expect(formatRow(hit, indexPattern, [])).toMatchInlineSnapshot(` { + const indexPatternList = [indexPattern].map((ip) => { return { ...ip, ...{ attributes: { title: ip.title } } }; - }) as unknown) as Array>; + }) as unknown as Array>; const main$ = new BehaviorSubject({ fetchStatus: FetchStatus.COMPLETE, @@ -60,23 +60,11 @@ function getProps(indexPattern: IndexPattern): DiscoverLayoutProps { result: Number(esHits.length), }) as DataTotalHits$; - const chartData = ({ + const chartData = { xAxisOrderedValues: [ - 1623880800000, - 1623967200000, - 1624053600000, - 1624140000000, - 1624226400000, - 1624312800000, - 1624399200000, - 1624485600000, - 1624572000000, - 1624658400000, - 1624744800000, - 1624831200000, - 1624917600000, - 1625004000000, - 1625090400000, + 1623880800000, 1623967200000, 1624053600000, 1624140000000, 1624226400000, 1624312800000, + 1624399200000, 1624485600000, 1624572000000, 1624658400000, 1624744800000, 1624831200000, + 1624917600000, 1625004000000, 1625090400000, ], xAxisFormat: { id: 'date', params: { pattern: 'YYYY-MM-DD' } }, xAxisLabel: 'order_date per day', @@ -109,7 +97,7 @@ function getProps(indexPattern: IndexPattern): DiscoverLayoutProps { { x: 1625004000000, y: 137 }, { x: 1625090400000, y: 66 }, ], - } as unknown) as Chart; + } as unknown as Chart; const charts$ = new BehaviorSubject({ fetchStatus: FetchStatus.COMPLETE, diff --git a/src/plugins/discover/public/application/apps/main/components/sidebar/change_indexpattern.tsx b/src/plugins/discover/public/application/apps/main/components/sidebar/change_indexpattern.tsx index 5f2f35e2419dd..1c44cebb2c9a3 100644 --- a/src/plugins/discover/public/application/apps/main/components/sidebar/change_indexpattern.tsx +++ b/src/plugins/discover/public/application/apps/main/components/sidebar/change_indexpattern.tsx @@ -83,7 +83,7 @@ export function ChangeIndexPattern({ checked: id === indexPatternId ? 'on' : undefined, }))} onChange={(choices) => { - const choice = (choices.find(({ checked }) => checked) as unknown) as { + const choice = choices.find(({ checked }) => checked) as unknown as { value: string; }; if (choice.value !== indexPatternId) { diff --git a/src/plugins/discover/public/application/apps/main/components/sidebar/discover_index_pattern.test.tsx b/src/plugins/discover/public/application/apps/main/components/sidebar/discover_index_pattern.test.tsx index 45d6faa9606e1..50af66511de30 100644 --- a/src/plugins/discover/public/application/apps/main/components/sidebar/discover_index_pattern.test.tsx +++ b/src/plugins/discover/public/application/apps/main/components/sidebar/discover_index_pattern.test.tsx @@ -66,11 +66,11 @@ function selectIndexPatternPickerOption(instance: ShallowWrapper, selectedLabel: describe('DiscoverIndexPattern', () => { test('Invalid props dont cause an exception', () => { - const props = ({ + const props = { indexPatternList: null, selectedIndexPattern: null, onChangeIndexPattern: jest.fn(), - } as unknown) as DiscoverIndexPatternProps; + } as unknown as DiscoverIndexPatternProps; expect(shallow()).toMatchSnapshot(`""`); }); diff --git a/src/plugins/discover/public/application/apps/main/components/sidebar/discover_index_pattern_management.test.tsx b/src/plugins/discover/public/application/apps/main/components/sidebar/discover_index_pattern_management.test.tsx index a7db6f22395e8..4e41c457ab8eb 100644 --- a/src/plugins/discover/public/application/apps/main/components/sidebar/discover_index_pattern_management.test.tsx +++ b/src/plugins/discover/public/application/apps/main/components/sidebar/discover_index_pattern_management.test.tsx @@ -14,7 +14,7 @@ import { DiscoverServices } from '../../../../../build_services'; import { DiscoverIndexPatternManagement } from './discover_index_pattern_management'; import { stubLogstashIndexPattern } from '../../../../../../../data/common/stubs'; -const mockServices = ({ +const mockServices = { history: () => ({ location: { search: '', @@ -48,7 +48,7 @@ const mockServices = ({ }, }, }, -} as unknown) as DiscoverServices; +} as unknown as DiscoverServices; describe('Discover IndexPattern Management', () => { const indexPattern = stubLogstashIndexPattern; diff --git a/src/plugins/discover/public/application/apps/main/components/sidebar/discover_index_pattern_management.tsx b/src/plugins/discover/public/application/apps/main/components/sidebar/discover_index_pattern_management.tsx index 644c673f0eff0..84f4cc1cecc0d 100644 --- a/src/plugins/discover/public/application/apps/main/components/sidebar/discover_index_pattern_management.tsx +++ b/src/plugins/discover/public/application/apps/main/components/sidebar/discover_index_pattern_management.tsx @@ -35,7 +35,8 @@ export interface DiscoverIndexPatternManagementProps { export function DiscoverIndexPatternManagement(props: DiscoverIndexPatternManagementProps) { const { indexPatternFieldEditor, core } = props.services; const { useNewFieldsApi, selectedIndexPattern, editField } = props; - const indexPatternFieldEditPermission = indexPatternFieldEditor?.userPermissions.editIndexPattern(); + const indexPatternFieldEditPermission = + indexPatternFieldEditor?.userPermissions.editIndexPattern(); const canEditIndexPatternField = !!indexPatternFieldEditPermission && useNewFieldsApi; const [isAddIndexPatternFieldPopoverOpen, setIsAddIndexPatternFieldPopoverOpen] = useState(false); diff --git a/src/plugins/discover/public/application/apps/main/components/sidebar/discover_sidebar.test.tsx b/src/plugins/discover/public/application/apps/main/components/sidebar/discover_sidebar.test.tsx index 988a434f913aa..e53bf006e2b4e 100644 --- a/src/plugins/discover/public/application/apps/main/components/sidebar/discover_sidebar.test.tsx +++ b/src/plugins/discover/public/application/apps/main/components/sidebar/discover_sidebar.test.tsx @@ -31,9 +31,9 @@ function getCompProps(): DiscoverSidebarProps { const indexPattern = stubLogstashIndexPattern; // @ts-expect-error _.each() is passing additional args to flattenHit - const hits = (each(cloneDeep(realHits), indexPattern.flattenHit) as Array< + const hits = each(cloneDeep(realHits), indexPattern.flattenHit) as Array< Record - >) as ElasticSearchHit[]; + > as ElasticSearchHit[]; const indexPatternList = [ { id: '0', attributes: { title: 'b' } } as SavedObject, diff --git a/src/plugins/discover/public/application/apps/main/components/sidebar/discover_sidebar.tsx b/src/plugins/discover/public/application/apps/main/components/sidebar/discover_sidebar.tsx index 189620282f2f6..97bc305065d30 100644 --- a/src/plugins/discover/public/application/apps/main/components/sidebar/discover_sidebar.tsx +++ b/src/plugins/discover/public/application/apps/main/components/sidebar/discover_sidebar.tsx @@ -101,7 +101,8 @@ export function DiscoverSidebarComponent({ const [fields, setFields] = useState(null); const { indexPatternFieldEditor } = services; - const indexPatternFieldEditPermission = indexPatternFieldEditor?.userPermissions.editIndexPattern(); + const indexPatternFieldEditPermission = + indexPatternFieldEditor?.userPermissions.editIndexPattern(); const canEditIndexPatternField = !!indexPatternFieldEditPermission && useNewFieldsApi; const [scrollContainer, setScrollContainer] = useState(null); const [fieldsToRender, setFieldsToRender] = useState(FIELDS_PER_PAGE); @@ -131,9 +132,10 @@ export function DiscoverSidebarComponent({ [documents, columns, selectedIndexPattern] ); - const popularLimit = useMemo(() => services.uiSettings.get(FIELDS_LIMIT_SETTING), [ - services.uiSettings, - ]); + const popularLimit = useMemo( + () => services.uiSettings.get(FIELDS_LIMIT_SETTING), + [services.uiSettings] + ); const { selected: selectedFields, diff --git a/src/plugins/discover/public/application/apps/main/components/sidebar/discover_sidebar_responsive.test.tsx b/src/plugins/discover/public/application/apps/main/components/sidebar/discover_sidebar_responsive.test.tsx index fc1c09ec8c829..9d73f885c988d 100644 --- a/src/plugins/discover/public/application/apps/main/components/sidebar/discover_sidebar_responsive.test.tsx +++ b/src/plugins/discover/public/application/apps/main/components/sidebar/discover_sidebar_responsive.test.tsx @@ -27,7 +27,7 @@ import { FetchStatus } from '../../../../types'; import { DataDocuments$ } from '../../services/use_saved_search'; import { stubLogstashIndexPattern } from '../../../../../../../data/common/stubs'; -const mockServices = ({ +const mockServices = { history: () => ({ location: { search: '', @@ -48,7 +48,7 @@ const mockServices = ({ } }, }, -} as unknown) as DiscoverServices; +} as unknown as DiscoverServices; const mockfieldCounts: Record = {}; const mockCalcFieldCounts = jest.fn(() => { @@ -72,9 +72,9 @@ function getCompProps(): DiscoverSidebarResponsiveProps { const indexPattern = stubLogstashIndexPattern; // @ts-expect-error _.each() is passing additional args to flattenHit - const hits = (each(cloneDeep(realHits), indexPattern.flattenHit) as Array< + const hits = each(cloneDeep(realHits), indexPattern.flattenHit) as Array< Record - >) as ElasticSearchHit[]; + > as ElasticSearchHit[]; const indexPatternList = [ { id: '0', attributes: { title: 'b' } } as SavedObject, diff --git a/src/plugins/discover/public/application/apps/main/components/sidebar/discover_sidebar_responsive.tsx b/src/plugins/discover/public/application/apps/main/components/sidebar/discover_sidebar_responsive.tsx index 90a3d33ddbe67..ade9c3aae4b28 100644 --- a/src/plugins/discover/public/application/apps/main/components/sidebar/discover_sidebar_responsive.tsx +++ b/src/plugins/discover/public/application/apps/main/components/sidebar/discover_sidebar_responsive.tsx @@ -179,7 +179,8 @@ export function DiscoverSidebarResponsive(props: DiscoverSidebarResponsiveProps) const editField = useCallback( (fieldName?: string) => { - const indexPatternFieldEditPermission = indexPatternFieldEditor?.userPermissions.editIndexPattern(); + const indexPatternFieldEditPermission = + indexPatternFieldEditor?.userPermissions.editIndexPattern(); const canEditIndexPatternField = !!indexPatternFieldEditPermission && useNewFieldsApi; if (!canEditIndexPatternField || !selectedIndexPattern) { return; diff --git a/src/plugins/discover/public/application/apps/main/components/timechart_header/timechart_header.test.tsx b/src/plugins/discover/public/application/apps/main/components/timechart_header/timechart_header.test.tsx index e942ec59c45e1..00dacc2166c6e 100644 --- a/src/plugins/discover/public/application/apps/main/components/timechart_header/timechart_header.test.tsx +++ b/src/plugins/discover/public/application/apps/main/components/timechart_header/timechart_header.test.tsx @@ -18,23 +18,11 @@ import { BehaviorSubject } from 'rxjs'; import { Chart } from '../chart/point_series'; import { DataCharts$ } from '../../services/use_saved_search'; -const chartData = ({ +const chartData = { xAxisOrderedValues: [ - 1623880800000, - 1623967200000, - 1624053600000, - 1624140000000, - 1624226400000, - 1624312800000, - 1624399200000, - 1624485600000, - 1624572000000, - 1624658400000, - 1624744800000, - 1624831200000, - 1624917600000, - 1625004000000, - 1625090400000, + 1623880800000, 1623967200000, 1624053600000, 1624140000000, 1624226400000, 1624312800000, + 1624399200000, 1624485600000, 1624572000000, 1624658400000, 1624744800000, 1624831200000, + 1624917600000, 1625004000000, 1625090400000, ], xAxisFormat: { id: 'date', params: { pattern: 'YYYY-MM-DD' } }, xAxisLabel: 'order_date per day', @@ -67,7 +55,7 @@ const chartData = ({ { x: 1625004000000, y: 137 }, { x: 1625090400000, y: 66 }, ], -} as unknown) as Chart; +} as unknown as Chart; describe('timechart header', function () { let props: TimechartHeaderProps; let component: ReactWrapper; diff --git a/src/plugins/discover/public/application/apps/main/components/top_nav/get_top_nav_links.test.ts b/src/plugins/discover/public/application/apps/main/components/top_nav/get_top_nav_links.test.ts index fd918429b57da..d31ac6e0f2fea 100644 --- a/src/plugins/discover/public/application/apps/main/components/top_nav/get_top_nav_links.test.ts +++ b/src/plugins/discover/public/application/apps/main/components/top_nav/get_top_nav_links.test.ts @@ -13,7 +13,7 @@ import { savedSearchMock } from '../../../../../__mocks__/saved_search'; import { DiscoverServices } from '../../../../../build_services'; import { GetStateReturn } from '../../services/discover_state'; -const services = ({ +const services = { capabilities: { discover: { save: true, @@ -22,9 +22,9 @@ const services = ({ save: true, }, }, -} as unknown) as DiscoverServices; +} as unknown as DiscoverServices; -const state = ({} as unknown) as GetStateReturn; +const state = {} as unknown as GetStateReturn; test('getTopNavLinks result', () => { const topNavLinks = getTopNavLinks({ diff --git a/src/plugins/discover/public/application/apps/main/components/top_nav/on_save_search.test.tsx b/src/plugins/discover/public/application/apps/main/components/top_nav/on_save_search.test.tsx index e5f44a0fbf214..1f0cee0b75672 100644 --- a/src/plugins/discover/public/application/apps/main/components/top_nav/on_save_search.test.tsx +++ b/src/plugins/discover/public/application/apps/main/components/top_nav/on_save_search.test.tsx @@ -17,12 +17,12 @@ import { GetStateReturn } from '../../services/discover_state'; import { i18nServiceMock } from '../../../../../../../../core/public/mocks'; test('onSaveSearch', async () => { - const serviceMock = ({ + const serviceMock = { core: { i18n: i18nServiceMock.create(), }, - } as unknown) as DiscoverServices; - const stateMock = ({} as unknown) as GetStateReturn; + } as unknown as DiscoverServices; + const stateMock = {} as unknown as GetStateReturn; await onSaveSearch({ indexPattern: indexPatternMock, diff --git a/src/plugins/discover/public/application/apps/main/discover_main_app.test.tsx b/src/plugins/discover/public/application/apps/main/discover_main_app.test.tsx index aa5a2bc9bfbad..db29da87b4641 100644 --- a/src/plugins/discover/public/application/apps/main/discover_main_app.test.tsx +++ b/src/plugins/discover/public/application/apps/main/discover_main_app.test.tsx @@ -22,9 +22,9 @@ setHeaderActionMenuMounter(jest.fn()); describe('DiscoverMainApp', () => { test('renders', () => { const { history } = createSearchSessionMock(); - const indexPatternList = ([indexPatternMock].map((ip) => { + const indexPatternList = [indexPatternMock].map((ip) => { return { ...ip, ...{ attributes: { title: ip.title } } }; - }) as unknown) as Array>; + }) as unknown as Array>; const props = { indexPatternList, diff --git a/src/plugins/discover/public/application/apps/main/discover_main_route.tsx b/src/plugins/discover/public/application/apps/main/discover_main_route.tsx index d7b49d0231049..53f95f38c96bd 100644 --- a/src/plugins/discover/public/application/apps/main/discover_main_route.tsx +++ b/src/plugins/discover/public/application/apps/main/discover_main_route.tsx @@ -85,7 +85,7 @@ export function DiscoverMainRoute({ services, history }: DiscoverMainProps) { setSavedSearch(loadedSavedSearch); if (savedSearchId) { chrome.recentlyAccessed.add( - ((loadedSavedSearch as unknown) as SavedObjectDeprecated).getFullPath(), + (loadedSavedSearch as unknown as SavedObjectDeprecated).getFullPath(), loadedSavedSearch.title, loadedSavedSearch.id ); diff --git a/src/plugins/discover/public/application/apps/main/services/discover_state.test.ts b/src/plugins/discover/public/application/apps/main/services/discover_state.test.ts index 8dad40d373f31..905d81a6fc716 100644 --- a/src/plugins/discover/public/application/apps/main/services/discover_state.test.ts +++ b/src/plugins/discover/public/application/apps/main/services/discover_state.test.ts @@ -22,8 +22,7 @@ let state: GetStateReturn; const getCurrentUrl = () => history.createHref(history.location); const uiSettingsMock = { - get: (key: string) => - ((key === SEARCH_FIELDS_FROM_SOURCE ? true : ['_source']) as unknown) as T, + get: (key: string) => (key === SEARCH_FIELDS_FROM_SOURCE ? true : ['_source']) as unknown as T, } as IUiSettingsClient; describe('Test discover state', () => { @@ -151,7 +150,7 @@ describe('Test discover state with legacy migration', () => { }); describe('createSearchSessionRestorationDataProvider', () => { - let mockSavedSearch: SavedSearch = ({} as unknown) as SavedSearch; + let mockSavedSearch: SavedSearch = {} as unknown as SavedSearch; const mockDataPlugin = dataPluginMock.createStartContract(); const searchSessionInfoProvider = createSearchSessionRestorationDataProvider({ data: mockDataPlugin, @@ -168,12 +167,12 @@ describe('createSearchSessionRestorationDataProvider', () => { }); test('Saved Search with a title returns saved search title', async () => { - mockSavedSearch = ({ id: 'id', title: 'Name' } as unknown) as SavedSearch; + mockSavedSearch = { id: 'id', title: 'Name' } as unknown as SavedSearch; expect(await searchSessionInfoProvider.getName()).toBe('Name'); }); test('Saved Search without a title returns default name', async () => { - mockSavedSearch = ({ id: 'id', title: undefined } as unknown) as SavedSearch; + mockSavedSearch = { id: 'id', title: undefined } as unknown as SavedSearch; expect(await searchSessionInfoProvider.getName()).toBe('Discover'); }); }); diff --git a/src/plugins/discover/public/application/apps/main/services/use_saved_search.ts b/src/plugins/discover/public/application/apps/main/services/use_saved_search.ts index 8ed6667f8acce..27b6fd3d487e7 100644 --- a/src/plugins/discover/public/application/apps/main/services/use_saved_search.ts +++ b/src/plugins/discover/public/application/apps/main/services/use_saved_search.ts @@ -217,10 +217,10 @@ export const useSavedSearch = ({ useNewFieldsApi, ]); - const reset = useCallback(() => sendResetMsg(dataSubjects, initialFetchStatus), [ - dataSubjects, - initialFetchStatus, - ]); + const reset = useCallback( + () => sendResetMsg(dataSubjects, initialFetchStatus), + [dataSubjects, initialFetchStatus] + ); return { refetch$, diff --git a/src/plugins/discover/public/application/apps/main/utils/calc_field_counts.test.ts b/src/plugins/discover/public/application/apps/main/utils/calc_field_counts.test.ts index bdea6611d3b7e..a13fd88df7c25 100644 --- a/src/plugins/discover/public/application/apps/main/utils/calc_field_counts.test.ts +++ b/src/plugins/discover/public/application/apps/main/utils/calc_field_counts.test.ts @@ -12,10 +12,10 @@ import { ElasticSearchHit } from '../../../doc_views/doc_views_types'; describe('calcFieldCounts', () => { test('returns valid field count data', async () => { - const rows = ([ + const rows = [ { _id: 1, _source: { message: 'test1', bytes: 20 } }, { _id: 2, _source: { name: 'test2', extension: 'jpg' } }, - ] as unknown) as ElasticSearchHit[]; + ] as unknown as ElasticSearchHit[]; const result = calcFieldCounts({}, rows, indexPatternMock); expect(result).toMatchInlineSnapshot(` Object { @@ -29,10 +29,10 @@ describe('calcFieldCounts', () => { `); }); test('updates field count data', async () => { - const rows = ([ + const rows = [ { _id: 1, _source: { message: 'test1', bytes: 20 } }, { _id: 2, _source: { name: 'test2', extension: 'jpg' } }, - ] as unknown) as ElasticSearchHit[]; + ] as unknown as ElasticSearchHit[]; const result = calcFieldCounts({ message: 2 }, rows, indexPatternMock); expect(result).toMatchInlineSnapshot(` Object { diff --git a/src/plugins/discover/public/application/apps/main/utils/fetch_chart.test.ts b/src/plugins/discover/public/application/apps/main/utils/fetch_chart.test.ts index 07228bf0e4c62..2c050a9391a86 100644 --- a/src/plugins/discover/public/application/apps/main/utils/fetch_chart.test.ts +++ b/src/plugins/discover/public/application/apps/main/utils/fetch_chart.test.ts @@ -89,7 +89,7 @@ describe('test fetchCharts', () => { subjects.totalHits$.subscribe((value) => stateArrHits.push(value.fetchStatus)); savedSearchMockWithTimeField.searchSource.fetch$ = () => - of(({ + of({ id: 'Fjk5bndxTHJWU2FldVRVQ0tYR0VqOFEcRWtWNDhOdG5SUzJYcFhONVVZVTBJQToxMDMwOQ==', rawResponse: { took: 2, @@ -113,7 +113,7 @@ describe('test fetchCharts', () => { total: 1, loaded: 1, isRestored: false, - } as unknown) as IKibanaSearchResponse>); + } as unknown as IKibanaSearchResponse>); fetchChart(subjects, savedSearchMockWithTimeField.searchSource, deps).subscribe({ complete: () => { diff --git a/src/plugins/discover/public/application/apps/main/utils/get_chart_agg_config.test.ts b/src/plugins/discover/public/application/apps/main/utils/get_chart_agg_config.test.ts index 1982050874650..3eef49fe6ddcb 100644 --- a/src/plugins/discover/public/application/apps/main/utils/get_chart_agg_config.test.ts +++ b/src/plugins/discover/public/application/apps/main/utils/get_chart_agg_config.test.ts @@ -14,7 +14,7 @@ describe('getChartAggConfigs', () => { test('is working', () => { const indexPattern = indexPatternWithTimefieldMock; const setField = jest.fn(); - const searchSource = ({ + const searchSource = { setField, getField: (name: string) => { if (name === 'index') { @@ -22,7 +22,7 @@ describe('getChartAggConfigs', () => { } }, removeField: jest.fn(), - } as unknown) as SearchSource; + } as unknown as SearchSource; const dataMock = dataPluginMock.createStartContract(); diff --git a/src/plugins/discover/public/application/apps/main/utils/get_dimensions.test.ts b/src/plugins/discover/public/application/apps/main/utils/get_dimensions.test.ts index 443fc634ba543..b98662f2db3b5 100644 --- a/src/plugins/discover/public/application/apps/main/utils/get_dimensions.test.ts +++ b/src/plugins/discover/public/application/apps/main/utils/get_dimensions.test.ts @@ -15,7 +15,7 @@ import { getChartAggConfigs } from './get_chart_agg_configs'; test('getDimensions', () => { const indexPattern = indexPatternWithTimefieldMock; const setField = jest.fn(); - const searchSource = ({ + const searchSource = { setField, removeField: jest.fn(), getField: (name: string) => { @@ -23,7 +23,7 @@ test('getDimensions', () => { return indexPattern; } }, - } as unknown) as SearchSource; + } as unknown as SearchSource; const dataMock = dataPluginMock.createStartContract(); dataMock.query.timefilter.timefilter.getTime = () => { diff --git a/src/plugins/discover/public/application/apps/main/utils/get_sharing_data.test.ts b/src/plugins/discover/public/application/apps/main/utils/get_sharing_data.test.ts index ffad3d955c1a3..25d0ca5d66eb4 100644 --- a/src/plugins/discover/public/application/apps/main/utils/get_sharing_data.test.ts +++ b/src/plugins/discover/public/application/apps/main/utils/get_sharing_data.test.ts @@ -17,7 +17,7 @@ describe('getSharingData', () => { let mockConfig: IUiSettingsClient; beforeEach(() => { - mockConfig = ({ + mockConfig = { get: (key: string) => { if (key === SORT_DEFAULT_ORDER_SETTING) { return 'desc'; @@ -27,7 +27,7 @@ describe('getSharingData', () => { } return false; }, - } as unknown) as IUiSettingsClient; + } as unknown as IUiSettingsClient; }); test('returns valid data for sharing', async () => { @@ -116,14 +116,14 @@ describe('getSharingData', () => { }); test('fields conditionally do not have prepended timeField', async () => { - mockConfig = ({ + mockConfig = { get: (key: string) => { if (key === DOC_HIDE_TIME_COLUMN_SETTING) { return true; } return false; }, - } as unknown) as IUiSettingsClient; + } as unknown as IUiSettingsClient; const index = { ...indexPatternMock } as IndexPattern; index.timeFieldName = 'cool-timefield'; diff --git a/src/plugins/discover/public/application/apps/main/utils/get_sharing_data.ts b/src/plugins/discover/public/application/apps/main/utils/get_sharing_data.ts index 225d90c61de12..65001f49f4d68 100644 --- a/src/plugins/discover/public/application/apps/main/utils/get_sharing_data.ts +++ b/src/plugins/discover/public/application/apps/main/utils/get_sharing_data.ts @@ -65,7 +65,7 @@ export interface DiscoverCapabilities { export const showPublicUrlSwitch = (anonymousUserCapabilities: Capabilities) => { if (!anonymousUserCapabilities.discover) return false; - const discover = (anonymousUserCapabilities.discover as unknown) as DiscoverCapabilities; + const discover = anonymousUserCapabilities.discover as unknown as DiscoverCapabilities; return !!discover.show; }; diff --git a/src/plugins/discover/public/application/apps/main/utils/resolve_index_pattern.test.ts b/src/plugins/discover/public/application/apps/main/utils/resolve_index_pattern.test.ts index 9ebbeafd28e10..56c4f8e6cd1b6 100644 --- a/src/plugins/discover/public/application/apps/main/utils/resolve_index_pattern.test.ts +++ b/src/plugins/discover/public/application/apps/main/utils/resolve_index_pattern.test.ts @@ -37,7 +37,7 @@ describe('Resolve index pattern tests', () => { test('getFallbackIndexPatternId with an indexPatterns array', async () => { const list = await indexPatternsMock.getCache(); const result = await getFallbackIndexPatternId( - (list as unknown) as IndexPatternSavedObject[], + list as unknown as IndexPatternSavedObject[], '' ); expect(result).toBe('the-index-pattern-id'); diff --git a/src/plugins/discover/public/application/apps/main/utils/resolve_index_pattern.ts b/src/plugins/discover/public/application/apps/main/utils/resolve_index_pattern.ts index 226db12114de8..d30b67db31186 100644 --- a/src/plugins/discover/public/application/apps/main/utils/resolve_index_pattern.ts +++ b/src/plugins/discover/public/application/apps/main/utils/resolve_index_pattern.ts @@ -78,7 +78,7 @@ export async function loadIndexPattern( indexPatterns: IndexPatternsContract, config: IUiSettingsClient ): Promise { - const indexPatternList = ((await indexPatterns.getCache()) as unknown) as IndexPatternSavedObject[]; + const indexPatternList = (await indexPatterns.getCache()) as unknown as IndexPatternSavedObject[]; const actualId = getIndexPatternId(id, indexPatternList, config.get('defaultIndex')); return { diff --git a/src/plugins/discover/public/application/components/discover_grid/discover_grid.tsx b/src/plugins/discover/public/application/components/discover_grid/discover_grid.tsx index ca0692a8c9039..0fe506b3b8537 100644 --- a/src/plugins/discover/public/application/components/discover_grid/discover_grid.tsx +++ b/src/plugins/discover/public/application/components/discover_grid/discover_grid.tsx @@ -218,10 +218,10 @@ export const DiscoverGrid = ({ */ const [pagination, setPagination] = useState({ pageIndex: 0, pageSize: defaultPageSize }); const rowCount = useMemo(() => (displayedRows ? displayedRows.length : 0), [displayedRows]); - const pageCount = useMemo(() => Math.ceil(rowCount / pagination.pageSize), [ - rowCount, - pagination, - ]); + const pageCount = useMemo( + () => Math.ceil(rowCount / pagination.pageSize), + [rowCount, pagination] + ); const isOnLastPage = pagination.pageIndex === pageCount - 1; const paginationObj = useMemo(() => { diff --git a/src/plugins/discover/public/application/components/discover_grid/discover_grid_context.tsx b/src/plugins/discover/public/application/components/discover_grid/discover_grid_context.tsx index 0103ad3d98870..8d0fbec9d7933 100644 --- a/src/plugins/discover/public/application/components/discover_grid/discover_grid_context.tsx +++ b/src/plugins/discover/public/application/components/discover_grid/discover_grid_context.tsx @@ -21,6 +21,6 @@ export interface GridContext { setSelectedDocs: (selected: string[]) => void; } -const defaultContext = ({} as unknown) as GridContext; +const defaultContext = {} as unknown as GridContext; export const DiscoverGridContext = React.createContext(defaultContext); diff --git a/src/plugins/discover/public/application/components/discover_grid/discover_grid_document_selection.tsx b/src/plugins/discover/public/application/components/discover_grid/discover_grid_document_selection.tsx index 03c17c801fa96..c87d425d601c5 100644 --- a/src/plugins/discover/public/application/components/discover_grid/discover_grid_document_selection.tsx +++ b/src/plugins/discover/public/application/components/discover_grid/discover_grid_document_selection.tsx @@ -31,9 +31,8 @@ export const getDocId = (doc: ElasticSearchHit & { _routing?: string }) => { return [doc._index, doc._id, routing].join('::'); }; export const SelectButton = ({ rowIndex, setCellProps }: EuiDataGridCellValueElementProps) => { - const { selectedDocs, expanded, rows, isDarkMode, setSelectedDocs } = useContext( - DiscoverGridContext - ); + const { selectedDocs, expanded, rows, isDarkMode, setSelectedDocs } = + useContext(DiscoverGridContext); const doc = useMemo(() => rows[rowIndex], [rows, rowIndex]); const id = useMemo(() => getDocId(doc), [doc]); const checked = useMemo(() => selectedDocs.includes(id), [selectedDocs, id]); diff --git a/src/plugins/discover/public/application/components/discover_grid/discover_grid_flyout.test.tsx b/src/plugins/discover/public/application/components/discover_grid/discover_grid_flyout.test.tsx index 60841799b1398..83fa447a50ba0 100644 --- a/src/plugins/discover/public/application/components/discover_grid/discover_grid_flyout.test.tsx +++ b/src/plugins/discover/public/application/components/discover_grid/discover_grid_flyout.test.tsx @@ -23,10 +23,10 @@ describe('Discover flyout', function () { const getProps = () => { const onClose = jest.fn(); - const services = ({ + const services = { filterManager: createFilterManagerMock(), addBasePath: (path: string) => `/base${path}`, - } as unknown) as DiscoverServices; + } as unknown as DiscoverServices; return { columns: ['date'], diff --git a/src/plugins/discover/public/application/components/discover_grid/get_render_cell_value.tsx b/src/plugins/discover/public/application/components/discover_grid/get_render_cell_value.tsx index ecef98915ff65..a052971580666 100644 --- a/src/plugins/discover/public/application/components/discover_grid/get_render_cell_value.tsx +++ b/src/plugins/discover/public/application/components/discover_grid/get_render_cell_value.tsx @@ -23,174 +23,180 @@ import { JsonCodeEditor } from '../json_code_editor/json_code_editor'; import { defaultMonacoEditorWidth } from './constants'; import { EsHitRecord } from '../../types'; -export const getRenderCellValueFn = ( - indexPattern: IndexPattern, - rows: ElasticSearchHit[] | undefined, - rowsFlattened: Array>, - useNewFieldsApi: boolean, - fieldsToShow: string[], - maxDocFieldsDisplayed: number -) => ({ rowIndex, columnId, isDetails, setCellProps }: EuiDataGridCellValueElementProps) => { - const row = rows ? rows[rowIndex] : undefined; - const rowFlattened = rowsFlattened - ? (rowsFlattened[rowIndex] as Record) - : undefined; - - const field = indexPattern.fields.getByName(columnId); - const ctx = useContext(DiscoverGridContext); - - useEffect(() => { - if ((row as EsHitRecord).isAnchor) { - setCellProps({ - className: 'dscDocsGrid__cell--highlight', - }); - } else if (ctx.expanded && row && ctx.expanded._id === row._id) { - setCellProps({ - style: { - backgroundColor: ctx.isDarkMode - ? themeDark.euiColorHighlight - : themeLight.euiColorHighlight, - }, - }); - } else { - setCellProps({ style: undefined }); - } - }, [ctx, row, setCellProps]); - - if (typeof row === 'undefined' || typeof rowFlattened === 'undefined') { - return -; - } - - if ( - useNewFieldsApi && - !field && - row && - row.fields && - !(row.fields as Record)[columnId] - ) { - const innerColumns = Object.fromEntries( - Object.entries(row.fields as Record).filter(([key]) => { - return key.indexOf(`${columnId}.`) === 0; - }) - ); - if (isDetails) { - // nicely formatted JSON for the expanded view - return {JSON.stringify(innerColumns, null, 2)}; +export const getRenderCellValueFn = + ( + indexPattern: IndexPattern, + rows: ElasticSearchHit[] | undefined, + rowsFlattened: Array>, + useNewFieldsApi: boolean, + fieldsToShow: string[], + maxDocFieldsDisplayed: number + ) => + ({ rowIndex, columnId, isDetails, setCellProps }: EuiDataGridCellValueElementProps) => { + const row = rows ? rows[rowIndex] : undefined; + const rowFlattened = rowsFlattened + ? (rowsFlattened[rowIndex] as Record) + : undefined; + + const field = indexPattern.fields.getByName(columnId); + const ctx = useContext(DiscoverGridContext); + + useEffect(() => { + if ((row as EsHitRecord).isAnchor) { + setCellProps({ + className: 'dscDocsGrid__cell--highlight', + }); + } else if (ctx.expanded && row && ctx.expanded._id === row._id) { + setCellProps({ + style: { + backgroundColor: ctx.isDarkMode + ? themeDark.euiColorHighlight + : themeLight.euiColorHighlight, + }, + }); + } else { + setCellProps({ style: undefined }); + } + }, [ctx, row, setCellProps]); + + if (typeof row === 'undefined' || typeof rowFlattened === 'undefined') { + return -; } - // Put the most important fields first - const highlights: Record = (row.highlight as Record) ?? {}; - const highlightPairs: Array<[string, string]> = []; - const sourcePairs: Array<[string, string]> = []; - Object.entries(innerColumns).forEach(([key, values]) => { - const subField = indexPattern.getFieldByName(key); - const displayKey = indexPattern.fields.getByName - ? indexPattern.fields.getByName(key)?.displayName - : undefined; - const formatter = subField - ? indexPattern.getFormatterForField(subField) - : { convert: (v: unknown, ...rest: unknown[]) => String(v) }; - const formatted = (values as unknown[]) - .map((val: unknown) => - formatter.convert(val, 'html', { - field: subField, - hit: row, - indexPattern, - }) - ) - .join(', '); - const pairs = highlights[key] ? highlightPairs : sourcePairs; - if (displayKey) { - if (fieldsToShow.includes(displayKey)) { - pairs.push([displayKey, formatted]); - } - } else { - pairs.push([key, formatted]); + if ( + useNewFieldsApi && + !field && + row && + row.fields && + !(row.fields as Record)[columnId] + ) { + const innerColumns = Object.fromEntries( + Object.entries(row.fields as Record).filter(([key]) => { + return key.indexOf(`${columnId}.`) === 0; + }) + ); + if (isDetails) { + // nicely formatted JSON for the expanded view + return {JSON.stringify(innerColumns, null, 2)}; } - }); - return ( - // If you change the styling of this list (specifically something that will change the line-height) - // make sure to adjust the img overwrites attached to dscDiscoverGrid__descriptionListDescription - // in discover_grid.scss - - {[...highlightPairs, ...sourcePairs].slice(0, maxDocFieldsDisplayed).map(([key, value]) => ( - - {key} - - - ))} - - ); - } + // Put the most important fields first + const highlights: Record = (row.highlight as Record) ?? {}; + const highlightPairs: Array<[string, string]> = []; + const sourcePairs: Array<[string, string]> = []; + Object.entries(innerColumns).forEach(([key, values]) => { + const subField = indexPattern.getFieldByName(key); + const displayKey = indexPattern.fields.getByName + ? indexPattern.fields.getByName(key)?.displayName + : undefined; + const formatter = subField + ? indexPattern.getFormatterForField(subField) + : { convert: (v: unknown, ...rest: unknown[]) => String(v) }; + const formatted = (values as unknown[]) + .map((val: unknown) => + formatter.convert(val, 'html', { + field: subField, + hit: row, + indexPattern, + }) + ) + .join(', '); + const pairs = highlights[key] ? highlightPairs : sourcePairs; + if (displayKey) { + if (fieldsToShow.includes(displayKey)) { + pairs.push([displayKey, formatted]); + } + } else { + pairs.push([key, formatted]); + } + }); - if (typeof rowFlattened[columnId] === 'object' && isDetails) { - return ( - } - width={defaultMonacoEditorWidth} - /> - ); - } + return ( + // If you change the styling of this list (specifically something that will change the line-height) + // make sure to adjust the img overwrites attached to dscDiscoverGrid__descriptionListDescription + // in discover_grid.scss + + {[...highlightPairs, ...sourcePairs] + .slice(0, maxDocFieldsDisplayed) + .map(([key, value]) => ( + + {key} + + + ))} + + ); + } - if (field && field.type === '_source') { - if (isDetails) { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - return ; + if (typeof rowFlattened[columnId] === 'object' && isDetails) { + return ( + } + width={defaultMonacoEditorWidth} + /> + ); } - const formatted = indexPattern.formatHit(row); - - // Put the most important fields first - const highlights: Record = (row.highlight as Record) ?? {}; - const highlightPairs: Array<[string, string]> = []; - const sourcePairs: Array<[string, string]> = []; - Object.entries(formatted).forEach(([key, val]) => { - const pairs = highlights[key] ? highlightPairs : sourcePairs; - const displayKey = indexPattern.fields.getByName - ? indexPattern.fields.getByName(key)?.displayName - : undefined; - if (displayKey) { - if (fieldsToShow.includes(displayKey)) { - pairs.push([displayKey, val as string]); - } - } else { - pairs.push([key, val as string]); + + if (field && field.type === '_source') { + if (isDetails) { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + return ; } - }); + const formatted = indexPattern.formatHit(row); + + // Put the most important fields first + const highlights: Record = (row.highlight as Record) ?? {}; + const highlightPairs: Array<[string, string]> = []; + const sourcePairs: Array<[string, string]> = []; + Object.entries(formatted).forEach(([key, val]) => { + const pairs = highlights[key] ? highlightPairs : sourcePairs; + const displayKey = indexPattern.fields.getByName + ? indexPattern.fields.getByName(key)?.displayName + : undefined; + if (displayKey) { + if (fieldsToShow.includes(displayKey)) { + pairs.push([displayKey, val as string]); + } + } else { + pairs.push([key, val as string]); + } + }); - return ( - - {[...highlightPairs, ...sourcePairs].slice(0, maxDocFieldsDisplayed).map(([key, value]) => ( - - {key} - - - ))} - - ); - } + return ( + + {[...highlightPairs, ...sourcePairs] + .slice(0, maxDocFieldsDisplayed) + .map(([key, value]) => ( + + {key} + + + ))} + + ); + } + + if (!field?.type && rowFlattened && typeof rowFlattened[columnId] === 'object') { + if (isDetails) { + // nicely formatted JSON for the expanded view + return {JSON.stringify(rowFlattened[columnId], null, 2)}; + } - if (!field?.type && rowFlattened && typeof rowFlattened[columnId] === 'object') { - if (isDetails) { - // nicely formatted JSON for the expanded view - return {JSON.stringify(rowFlattened[columnId], null, 2)}; + return {JSON.stringify(rowFlattened[columnId])}; } - return {JSON.stringify(rowFlattened[columnId])}; - } - - const valueFormatted = indexPattern.formatField(row, columnId); - if (typeof valueFormatted === 'undefined') { - return -; - } - return ( - // eslint-disable-next-line react/no-danger - - ); -}; + const valueFormatted = indexPattern.formatField(row, columnId); + if (typeof valueFormatted === 'undefined') { + return -; + } + return ( + // eslint-disable-next-line react/no-danger + + ); + }; diff --git a/src/plugins/discover/public/application/components/source_viewer/source_viewer.test.tsx b/src/plugins/discover/public/application/components/source_viewer/source_viewer.test.tsx index d9e9199e6586a..7895c1025dda9 100644 --- a/src/plugins/discover/public/application/components/source_viewer/source_viewer.test.tsx +++ b/src/plugins/discover/public/application/components/source_viewer/source_viewer.test.tsx @@ -25,9 +25,9 @@ const mockIndexPattern = { getComputedFields: () => [], } as never; const getMock = jest.fn(() => Promise.resolve(mockIndexPattern)); -const mockIndexPatternService = ({ +const mockIndexPatternService = { get: getMock, -} as unknown) as IndexPattern; +} as unknown as IndexPattern; (getServices as jest.Mock).mockImplementation(() => ({ uiSettings: { diff --git a/src/plugins/discover/public/application/components/table/table.test.tsx b/src/plugins/discover/public/application/components/table/table.test.tsx index 589c97b400eb4..3f010d9d07737 100644 --- a/src/plugins/discover/public/application/components/table/table.test.tsx +++ b/src/plugins/discover/public/application/components/table/table.test.tsx @@ -29,7 +29,7 @@ import { getServices } from '../../../kibana_services'; }, })); -const indexPattern = ({ +const indexPattern = { fields: { getAll: () => [ { @@ -67,7 +67,7 @@ const indexPattern = ({ metaFields: ['_index', '_score'], flattenHit: undefined, formatHit: jest.fn((hit) => hit._source), -} as unknown) as IndexPattern; +} as unknown as IndexPattern; indexPattern.fields.getByName = (name: string) => { return indexPattern.fields.getAll().find((field) => field.name === name); @@ -167,12 +167,14 @@ describe('DocViewTable at Discover', () => { expect(rowComponent.length).toBe(1); }); - ([ - 'addInclusiveFilterButton', - 'collapseBtn', - 'toggleColumnButton', - 'underscoreWarning', - ] as const).forEach((element) => { + ( + [ + 'addInclusiveFilterButton', + 'collapseBtn', + 'toggleColumnButton', + 'underscoreWarning', + ] as const + ).forEach((element) => { const elementExist = check[element]; if (typeof elementExist === 'boolean') { @@ -266,7 +268,7 @@ describe('DocViewTable at Discover Doc', () => { }); describe('DocViewTable at Discover Doc with Fields API', () => { - const indexPatterneCommerce = ({ + const indexPatterneCommerce = { fields: { getAll: () => [ { @@ -385,7 +387,7 @@ describe('DocViewTable at Discover Doc with Fields API', () => { }); return result; }), - } as unknown) as IndexPattern; + } as unknown as IndexPattern; indexPatterneCommerce.fields.getByName = (name: string) => { return indexPatterneCommerce.fields.getAll().find((field) => field.name === name); diff --git a/src/plugins/discover/public/application/components/table/table.tsx b/src/plugins/discover/public/application/components/table/table.tsx index e89b27e8069f1..eab3ba6e3d29a 100644 --- a/src/plugins/discover/public/application/components/table/table.tsx +++ b/src/plugins/discover/public/application/components/table/table.tsx @@ -58,9 +58,10 @@ export const DocViewerTable = ({ }: DocViewRenderProps) => { const showMultiFields = getServices().uiSettings.get(SHOW_MULTIFIELDS); - const mapping = useCallback((name: string) => indexPattern?.fields.getByName(name), [ - indexPattern?.fields, - ]); + const mapping = useCallback( + (name: string) => indexPattern?.fields.getByName(name), + [indexPattern?.fields] + ); const formattedHit = useMemo(() => indexPattern?.formatHit(hit, 'html'), [hit, indexPattern]); diff --git a/src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx b/src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx index e060a0fbae871..500bad34e2758 100644 --- a/src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx +++ b/src/plugins/discover/public/application/embeddable/saved_search_embeddable.tsx @@ -71,7 +71,8 @@ interface SearchEmbeddableConfig { export class SavedSearchEmbeddable extends Embeddable - implements ISearchEmbeddable { + implements ISearchEmbeddable +{ private readonly savedSearch: SavedSearch; private inspectorAdapters: Adapters; private panelTitle: string = ''; diff --git a/src/plugins/discover/public/application/embeddable/search_embeddable_factory.ts b/src/plugins/discover/public/application/embeddable/search_embeddable_factory.ts index b314d9ab55cd1..95f5b2d3ce284 100644 --- a/src/plugins/discover/public/application/embeddable/search_embeddable_factory.ts +++ b/src/plugins/discover/public/application/embeddable/search_embeddable_factory.ts @@ -27,7 +27,8 @@ interface StartServices { } export class SearchEmbeddableFactory - implements EmbeddableFactoryDefinition { + implements EmbeddableFactoryDefinition +{ public readonly type = SEARCH_EMBEDDABLE_TYPE; public readonly savedObjectMetaData = { name: i18n.translate('discover.savedSearch.savedObjectName', { diff --git a/src/plugins/discover/public/application/helpers/get_context_url.test.ts b/src/plugins/discover/public/application/helpers/get_context_url.test.ts index 4856c98845669..97d31ca43142d 100644 --- a/src/plugins/discover/public/application/helpers/get_context_url.test.ts +++ b/src/plugins/discover/public/application/helpers/get_context_url.test.ts @@ -8,10 +8,10 @@ import { getContextUrl } from './get_context_url'; import { FilterManager } from '../../../../data/public/query/filter_manager'; -const filterManager = ({ +const filterManager = { getGlobalFilters: () => [], getAppFilters: () => [], -} as unknown) as FilterManager; +} as unknown as FilterManager; const addBasePath = (path: string) => `/base${path}`; describe('Get context url', () => { diff --git a/src/plugins/discover/public/application/helpers/popularize_field.test.ts b/src/plugins/discover/public/application/helpers/popularize_field.test.ts index 7ae3994abd21a..91673fd17d3be 100644 --- a/src/plugins/discover/public/application/helpers/popularize_field.test.ts +++ b/src/plugins/discover/public/application/helpers/popularize_field.test.ts @@ -10,17 +10,17 @@ import { Capabilities } from 'kibana/public'; import { IndexPattern, IndexPatternsService } from '../../../../data/public'; import { popularizeField } from './popularize_field'; -const capabilities = ({ +const capabilities = { indexPatterns: { save: true, }, -} as unknown) as Capabilities; +} as unknown as Capabilities; describe('Popularize field', () => { test('returns undefined if index pattern lacks id', async () => { - const indexPattern = ({} as unknown) as IndexPattern; + const indexPattern = {} as unknown as IndexPattern; const fieldName = '@timestamp'; - const indexPatternsService = ({} as unknown) as IndexPatternsService; + const indexPatternsService = {} as unknown as IndexPatternsService; const result = await popularizeField( indexPattern, fieldName, @@ -31,13 +31,13 @@ describe('Popularize field', () => { }); test('returns undefined if field not found', async () => { - const indexPattern = ({ + const indexPattern = { fields: { getByName: () => {}, }, - } as unknown) as IndexPattern; + } as unknown as IndexPattern; const fieldName = '@timestamp'; - const indexPatternsService = ({} as unknown) as IndexPatternsService; + const indexPatternsService = {} as unknown as IndexPatternsService; const result = await popularizeField( indexPattern, fieldName, @@ -51,16 +51,16 @@ describe('Popularize field', () => { const field = { count: 0, }; - const indexPattern = ({ + const indexPattern = { id: 'id', fields: { getByName: () => field, }, - } as unknown) as IndexPattern; + } as unknown as IndexPattern; const fieldName = '@timestamp'; - const indexPatternsService = ({ + const indexPatternsService = { updateSavedObject: async () => {}, - } as unknown) as IndexPatternsService; + } as unknown as IndexPatternsService; const result = await popularizeField( indexPattern, fieldName, @@ -75,18 +75,18 @@ describe('Popularize field', () => { const field = { count: 0, }; - const indexPattern = ({ + const indexPattern = { id: 'id', fields: { getByName: () => field, }, - } as unknown) as IndexPattern; + } as unknown as IndexPattern; const fieldName = '@timestamp'; - const indexPatternsService = ({ + const indexPatternsService = { updateSavedObject: async () => { throw new Error('unknown error'); }, - } as unknown) as IndexPatternsService; + } as unknown as IndexPatternsService; const result = await popularizeField( indexPattern, fieldName, @@ -100,19 +100,19 @@ describe('Popularize field', () => { const field = { count: 0, }; - const indexPattern = ({ + const indexPattern = { id: 'id', fields: { getByName: () => field, }, - } as unknown) as IndexPattern; + } as unknown as IndexPattern; const fieldName = '@timestamp'; - const indexPatternsService = ({ + const indexPatternsService = { updateSavedObject: jest.fn(), - } as unknown) as IndexPatternsService; - const result = await popularizeField(indexPattern, fieldName, indexPatternsService, ({ + } as unknown as IndexPatternsService; + const result = await popularizeField(indexPattern, fieldName, indexPatternsService, { indexPatterns: { save: false }, - } as unknown) as Capabilities); + } as unknown as Capabilities); expect(result).toBeUndefined(); expect(indexPatternsService.updateSavedObject).not.toHaveBeenCalled(); expect(field.count).toEqual(0); diff --git a/src/plugins/discover/public/application/helpers/use_data_grid_columns.test.tsx b/src/plugins/discover/public/application/helpers/use_data_grid_columns.test.tsx index 565e9a04e7afe..ccee271b73e32 100644 --- a/src/plugins/discover/public/application/helpers/use_data_grid_columns.test.tsx +++ b/src/plugins/discover/public/application/helpers/use_data_grid_columns.test.tsx @@ -16,7 +16,7 @@ import { Capabilities } from '../../../../../core/types'; describe('useDataGridColumns', () => { const defaultProps = { - capabilities: ({ discover: { save: true } } as unknown) as Capabilities, + capabilities: { discover: { save: true } } as unknown as Capabilities, config: configMock, indexPattern: indexPatternMock, indexPatterns: indexPatternsMock, diff --git a/src/plugins/discover/public/application/services/use_es_doc_search.test.tsx b/src/plugins/discover/public/application/services/use_es_doc_search.test.tsx index 3fcb193c5f6f3..af7d189e62882 100644 --- a/src/plugins/discover/public/application/services/use_es_doc_search.test.tsx +++ b/src/plugins/discover/public/application/services/use_es_doc_search.test.tsx @@ -37,9 +37,9 @@ jest.mock('../../kibana_services', () => ({ describe('Test of helper / hook', () => { test('buildSearchBody given useNewFieldsApi is false', () => { - const indexPattern = ({ + const indexPattern = { getComputedFields: () => ({ storedFields: [], scriptFields: [], docvalueFields: [] }), - } as unknown) as IndexPattern; + } as unknown as IndexPattern; const actual = buildSearchBody('1', indexPattern, false); expect(actual).toMatchInlineSnapshot(` Object { @@ -62,9 +62,9 @@ describe('Test of helper / hook', () => { }); test('buildSearchBody useNewFieldsApi is true', () => { - const indexPattern = ({ + const indexPattern = { getComputedFields: () => ({ storedFields: [], scriptFields: [], docvalueFields: [] }), - } as unknown) as IndexPattern; + } as unknown as IndexPattern; const actual = buildSearchBody('1', indexPattern, true); expect(actual).toMatchInlineSnapshot(` Object { @@ -92,9 +92,9 @@ describe('Test of helper / hook', () => { }); test('buildSearchBody with requestSource', () => { - const indexPattern = ({ + const indexPattern = { getComputedFields: () => ({ storedFields: [], scriptFields: [], docvalueFields: [] }), - } as unknown) as IndexPattern; + } as unknown as IndexPattern; const actual = buildSearchBody('1', indexPattern, true, true); expect(actual).toMatchInlineSnapshot(` Object { @@ -123,7 +123,7 @@ describe('Test of helper / hook', () => { }); test('buildSearchBody with runtime fields', () => { - const indexPattern = ({ + const indexPattern = { getComputedFields: () => ({ storedFields: [], scriptFields: [], @@ -137,7 +137,7 @@ describe('Test of helper / hook', () => { }, }, }), - } as unknown) as IndexPattern; + } as unknown as IndexPattern; const actual = buildSearchBody('1', indexPattern, true); expect(actual).toMatchInlineSnapshot(` Object { @@ -176,15 +176,15 @@ describe('Test of helper / hook', () => { getComputedFields: () => [], }; const getMock = jest.fn(() => Promise.resolve(indexPattern)); - const indexPatternService = ({ + const indexPatternService = { get: getMock, - } as unknown) as IndexPattern; - const props = ({ + } as unknown as IndexPattern; + const props = { id: '1', index: 'index1', indexPatternId: 'xyz', indexPatternService, - } as unknown) as DocProps; + } as unknown as DocProps; // eslint-disable-next-line @typescript-eslint/no-explicit-any let hook: any; await act(async () => { diff --git a/src/plugins/discover/public/kibana_services.ts b/src/plugins/discover/public/kibana_services.ts index 72925a1578c30..c68d6fbf479a1 100644 --- a/src/plugins/discover/public/kibana_services.ts +++ b/src/plugins/discover/public/kibana_services.ts @@ -31,18 +31,16 @@ export function setServices(newServices: DiscoverServices) { export const setUiActions = (pluginUiActions: UiActionsStart) => (uiActions = pluginUiActions); export const getUiActions = () => uiActions; -export const [getHeaderActionMenuMounter, setHeaderActionMenuMounter] = createGetterSetter< - AppMountParameters['setHeaderActionMenu'] ->('headerActionMenuMounter'); +export const [getHeaderActionMenuMounter, setHeaderActionMenuMounter] = + createGetterSetter('headerActionMenuMounter'); export const [getUrlTracker, setUrlTracker] = createGetterSetter<{ setTrackedUrl: (url: string) => void; restorePreviousUrl: () => void; }>('urlTracker'); -export const [getDocViewsRegistry, setDocViewsRegistry] = createGetterSetter( - 'DocViewsRegistry' -); +export const [getDocViewsRegistry, setDocViewsRegistry] = + createGetterSetter('DocViewsRegistry'); /** * Makes sure discover and context are using one instance of history. @@ -68,6 +66,5 @@ export const syncHistoryLocations = () => { return h; }; -export const [getScopedHistory, setScopedHistory] = createGetterSetter( - 'scopedHistory' -); +export const [getScopedHistory, setScopedHistory] = + createGetterSetter('scopedHistory'); diff --git a/src/plugins/discover/public/mocks.ts b/src/plugins/discover/public/mocks.ts index 034b5b653747e..71de630132b0a 100644 --- a/src/plugins/discover/public/mocks.ts +++ b/src/plugins/discover/public/mocks.ts @@ -25,9 +25,9 @@ const createSetupContract = (): Setup => { const createStartContract = (): Start => { const startContract: Start = { savedSearchLoader: {} as DiscoverStart['savedSearchLoader'], - urlGenerator: ({ + urlGenerator: { createUrl: jest.fn(), - } as unknown) as DiscoverStart['urlGenerator'], + } as unknown as DiscoverStart['urlGenerator'], locator: sharePluginMock.createLocator(), }; return startContract; diff --git a/src/plugins/discover/public/plugin.tsx b/src/plugins/discover/public/plugin.tsx index 4624fa79ca14b..0327b25fd864e 100644 --- a/src/plugins/discover/public/plugin.tsx +++ b/src/plugins/discover/public/plugin.tsx @@ -195,7 +195,8 @@ export interface DiscoverStartPlugins { * Discover provides embeddables for Dashboards */ export class DiscoverPlugin - implements Plugin { + implements Plugin +{ constructor(private readonly initializerContext: PluginInitializerContext) {} private appStateUpdater = new BehaviorSubject(() => ({})); diff --git a/src/plugins/discover/public/saved_searches/_saved_search.ts b/src/plugins/discover/public/saved_searches/_saved_search.ts index 320332ca4ace5..56533ed20b31e 100644 --- a/src/plugins/discover/public/saved_searches/_saved_search.ts +++ b/src/plugins/discover/public/saved_searches/_saved_search.ts @@ -58,5 +58,5 @@ export function createSavedSearchClass(savedObjects: SavedObjectsStart) { } } - return (SavedSearch as unknown) as new (id: string) => SavedObject; + return SavedSearch as unknown as new (id: string) => SavedObject; } diff --git a/src/plugins/discover/public/url_generator.ts b/src/plugins/discover/public/url_generator.ts index 63dea20fecc0a..7cc729fd7f7e5 100644 --- a/src/plugins/discover/public/url_generator.ts +++ b/src/plugins/discover/public/url_generator.ts @@ -85,7 +85,8 @@ interface Params { export const SEARCH_SESSION_ID_QUERY_PARAM = 'searchSessionId'; export class DiscoverUrlGenerator - implements UrlGeneratorsDefinition { + implements UrlGeneratorsDefinition +{ constructor(private readonly params: Params) {} public readonly id = DISCOVER_APP_URL_GENERATOR; diff --git a/src/plugins/discover/server/saved_objects/search_migrations.test.ts b/src/plugins/discover/server/saved_objects/search_migrations.test.ts index fb608c0b6f3e8..122371642fabd 100644 --- a/src/plugins/discover/server/saved_objects/search_migrations.test.ts +++ b/src/plugins/discover/server/saved_objects/search_migrations.test.ts @@ -9,7 +9,7 @@ import { SavedObjectMigrationContext } from 'kibana/server'; import { searchMigrations } from './search_migrations'; -const savedObjectMigrationContext = (null as unknown) as SavedObjectMigrationContext; +const savedObjectMigrationContext = null as unknown as SavedObjectMigrationContext; const testMigrateMatchAllQuery = (migrationFn: Function) => { it('should migrate obsolete match_all query', () => { diff --git a/src/plugins/embeddable/common/mocks.ts b/src/plugins/embeddable/common/mocks.ts index 36d564d26b75d..353cb3fcf08e2 100644 --- a/src/plugins/embeddable/common/mocks.ts +++ b/src/plugins/embeddable/common/mocks.ts @@ -8,11 +8,12 @@ import { EmbeddablePersistableStateService } from './types'; -export const createEmbeddablePersistableStateServiceMock = (): jest.Mocked => { - return { - inject: jest.fn((state, references) => state), - extract: jest.fn((state) => ({ state, references: [] })), - getAllMigrations: jest.fn(() => ({})), - telemetry: jest.fn((state, collector) => ({})), +export const createEmbeddablePersistableStateServiceMock = + (): jest.Mocked => { + return { + inject: jest.fn((state, references) => state), + extract: jest.fn((state) => ({ state, references: [] })), + getAllMigrations: jest.fn(() => ({})), + telemetry: jest.fn((state, collector) => ({})), + }; }; -}; diff --git a/src/plugins/embeddable/public/lib/actions/edit_panel_action.test.tsx b/src/plugins/embeddable/public/lib/actions/edit_panel_action.test.tsx index eb6b585bfbcf3..1731907288460 100644 --- a/src/plugins/embeddable/public/lib/actions/edit_panel_action.test.tsx +++ b/src/plugins/embeddable/public/lib/actions/edit_panel_action.test.tsx @@ -46,12 +46,12 @@ test('redirects to app using state transfer with by value mode', async () => { applicationMock.currentAppId$ = of('superCoolCurrentApp'); const action = new EditPanelAction(getFactory, applicationMock, stateTransferMock); const embeddable = new EditableEmbeddable( - ({ + { id: '123', viewMode: ViewMode.EDIT, coolInput1: 1, coolInput2: 2, - } as unknown) as EmbeddableInput, + } as unknown as EmbeddableInput, true ); embeddable.getOutput = jest.fn(() => ({ editApp: 'ultraVisualize', editPath: '/123' })); diff --git a/src/plugins/embeddable/public/lib/containers/container.ts b/src/plugins/embeddable/public/lib/containers/container.ts index 5d51b0e172937..8b3780b269254 100644 --- a/src/plugins/embeddable/public/lib/containers/container.ts +++ b/src/plugins/embeddable/public/lib/containers/container.ts @@ -30,7 +30,8 @@ export abstract class Container< TContainerOutput extends ContainerOutput = ContainerOutput > extends Embeddable - implements IContainer { + implements IContainer +{ public readonly isContainer: boolean = true; public readonly children: { [key: string]: IEmbeddable | ErrorEmbeddable; @@ -150,13 +151,13 @@ export abstract class Container< explicitFiltered[key] = explicitInput[key]; }); - return ({ + return { ...containerInput, ...explicitFiltered, // Typescript has difficulties with inferring this type but it is accurate with all // tests I tried. Could probably be revisted with future releases of TS to see if // it can accurately infer the type. - } as unknown) as TEmbeddableInput; + } as unknown as TEmbeddableInput; } public destroy() { diff --git a/src/plugins/embeddable/public/lib/embeddables/embeddable.test.tsx b/src/plugins/embeddable/public/lib/embeddables/embeddable.test.tsx index 15e0e72eec2a2..de0bcf3f8654c 100644 --- a/src/plugins/embeddable/public/lib/embeddables/embeddable.test.tsx +++ b/src/plugins/embeddable/public/lib/embeddables/embeddable.test.tsx @@ -74,7 +74,7 @@ test('Embeddable reload is called if lastReloadRequest input time changes', asyn test('Embeddable reload is called if lastReloadRequest input time changed and new input is used', async () => { const hello = new FilterableEmbeddable({ id: '123', filters: [], lastReloadRequestTime: 0 }); - const aFilter = ({} as unknown) as MockFilter; + const aFilter = {} as unknown as MockFilter; hello.reload = jest.fn(() => { // when reload is called embeddable already has new input expect(hello.getInput().filters).toEqual([aFilter]); diff --git a/src/plugins/embeddable/public/lib/embeddables/embeddable.tsx b/src/plugins/embeddable/public/lib/embeddables/embeddable.tsx index 9dc82968541da..2e6a31e473e31 100644 --- a/src/plugins/embeddable/public/lib/embeddables/embeddable.tsx +++ b/src/plugins/embeddable/public/lib/embeddables/embeddable.tsx @@ -23,7 +23,8 @@ function getPanelTitle(input: EmbeddableInput, output: EmbeddableOutput) { export abstract class Embeddable< TEmbeddableInput extends EmbeddableInput = EmbeddableInput, TEmbeddableOutput extends EmbeddableOutput = EmbeddableOutput -> implements IEmbeddable { +> implements IEmbeddable +{ static runtimeId: number = 0; public readonly runtimeId = Embeddable.runtimeId++; diff --git a/src/plugins/embeddable/public/lib/panel/embeddable_panel.tsx b/src/plugins/embeddable/public/lib/panel/embeddable_panel.tsx index b66950c170d69..cce286bfe73b4 100644 --- a/src/plugins/embeddable/public/lib/panel/embeddable_panel.tsx +++ b/src/plugins/embeddable/public/lib/panel/embeddable_panel.tsx @@ -48,8 +48,10 @@ const sortByOrderField = ( { order: orderB }: { order?: number } ) => (orderB || 0) - (orderA || 0); -const removeById = (disabledActions: string[]) => ({ id }: { id: string }) => - disabledActions.indexOf(id) === -1; +const removeById = + (disabledActions: string[]) => + ({ id }: { id: string }) => + disabledActions.indexOf(id) === -1; interface Props { embeddable: IEmbeddable; diff --git a/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card_embeddable_factory.tsx b/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card_embeddable_factory.tsx index 72791d92591ac..6b33d6b44b936 100644 --- a/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card_embeddable_factory.tsx +++ b/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card_embeddable_factory.tsx @@ -20,7 +20,8 @@ import { ContactCardInitializer } from './contact_card_initializer'; export const CONTACT_CARD_EMBEDDABLE = 'CONTACT_CARD_EMBEDDABLE'; export class ContactCardEmbeddableFactory - implements EmbeddableFactoryDefinition { + implements EmbeddableFactoryDefinition +{ public readonly type = CONTACT_CARD_EMBEDDABLE; constructor( diff --git a/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card_exportable_embeddable_factory.tsx b/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card_exportable_embeddable_factory.tsx index f25623210fd8e..7b58d5c8b4983 100644 --- a/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card_exportable_embeddable_factory.tsx +++ b/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/contact_card_exportable_embeddable_factory.tsx @@ -21,7 +21,8 @@ import { ContactCardInitializer } from './contact_card_initializer'; export const CONTACT_CARD_EXPORTABLE_EMBEDDABLE = 'CONTACT_CARD_EXPORTABLE_EMBEDDABLE'; export class ContactCardExportableEmbeddableFactory - implements EmbeddableFactoryDefinition { + implements EmbeddableFactoryDefinition +{ public readonly type = CONTACT_CARD_EXPORTABLE_EMBEDDABLE; constructor( diff --git a/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/slow_contact_card_embeddable_factory.ts b/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/slow_contact_card_embeddable_factory.ts index ddb810650996b..7e9e01214e8cc 100644 --- a/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/slow_contact_card_embeddable_factory.ts +++ b/src/plugins/embeddable/public/lib/test_samples/embeddables/contact_card/slow_contact_card_embeddable_factory.ts @@ -17,7 +17,8 @@ interface SlowContactCardEmbeddableFactoryOptions { } export class SlowContactCardEmbeddableFactory - implements EmbeddableFactoryDefinition { + implements EmbeddableFactoryDefinition +{ private loadTickCount = 0; public readonly type = CONTACT_CARD_EMBEDDABLE; diff --git a/src/plugins/embeddable/public/lib/test_samples/embeddables/filterable_container_factory.ts b/src/plugins/embeddable/public/lib/test_samples/embeddables/filterable_container_factory.ts index 92bf3d81c7058..3d37ce488282f 100644 --- a/src/plugins/embeddable/public/lib/test_samples/embeddables/filterable_container_factory.ts +++ b/src/plugins/embeddable/public/lib/test_samples/embeddables/filterable_container_factory.ts @@ -16,7 +16,8 @@ import { import { EmbeddableStart } from '../../../plugin'; export class FilterableContainerFactory - implements EmbeddableFactoryDefinition { + implements EmbeddableFactoryDefinition +{ public readonly type = FILTERABLE_CONTAINER; constructor( diff --git a/src/plugins/embeddable/public/lib/test_samples/embeddables/filterable_embeddable_factory.ts b/src/plugins/embeddable/public/lib/test_samples/embeddables/filterable_embeddable_factory.ts index 3671ed6ca5c6d..acaad2c1e9a8e 100644 --- a/src/plugins/embeddable/public/lib/test_samples/embeddables/filterable_embeddable_factory.ts +++ b/src/plugins/embeddable/public/lib/test_samples/embeddables/filterable_embeddable_factory.ts @@ -16,7 +16,8 @@ import { EmbeddableFactoryDefinition } from '../../embeddables'; import { IContainer } from '../../containers'; export class FilterableEmbeddableFactory - implements EmbeddableFactoryDefinition { + implements EmbeddableFactoryDefinition +{ public readonly type = FILTERABLE_EMBEDDABLE; public async isEditable() { diff --git a/src/plugins/embeddable/public/mocks.tsx b/src/plugins/embeddable/public/mocks.tsx index ff2771f3fd582..94eb5e5cc6a02 100644 --- a/src/plugins/embeddable/public/mocks.tsx +++ b/src/plugins/embeddable/public/mocks.tsx @@ -89,7 +89,8 @@ export const mockRefOrValEmbeddable = < mockedByValueInput: ValTypeInput; } ): OriginalEmbeddableType & ReferenceOrValueEmbeddable => { - const newEmbeddable: ReferenceOrValueEmbeddable = (embeddable as unknown) as ReferenceOrValueEmbeddable; + const newEmbeddable: ReferenceOrValueEmbeddable = + embeddable as unknown as ReferenceOrValueEmbeddable; newEmbeddable.inputIsRefType = (input: unknown): input is RefTypeInput => !!(input as RefTypeInput).savedObjectId; newEmbeddable.getInputAsRefType = () => Promise.resolve(options.mockedByReferenceInput); diff --git a/src/plugins/embeddable/public/plugin.tsx b/src/plugins/embeddable/public/plugin.tsx index c644e1f3fdc23..994cdb709ccc0 100644 --- a/src/plugins/embeddable/public/plugin.tsx +++ b/src/plugins/embeddable/public/plugin.tsx @@ -100,10 +100,8 @@ export interface EmbeddableStart extends PersistableStateService; export class EmbeddablePublicPlugin implements Plugin { - private readonly embeddableFactoryDefinitions: Map< - string, - EmbeddableFactoryDefinition - > = new Map(); + private readonly embeddableFactoryDefinitions: Map = + new Map(); private readonly embeddableFactories: EmbeddableFactoryRegistry = new Map(); private readonly enhancements: EnhancementsRegistry = new Map(); private customEmbeddableFactoryProvider?: EmbeddableFactoryProvider; @@ -155,27 +153,24 @@ export class EmbeddablePublicPlugin implements Plugin ({ - embeddable, - hideHeader, - }: { - embeddable: IEmbeddable; - hideHeader?: boolean; - }) => ( - - ); + const getEmbeddablePanelHoc = + () => + ({ embeddable, hideHeader }: { embeddable: IEmbeddable; hideHeader?: boolean }) => + ( + + ); const commonContract = { getEmbeddableFactory: this.getEmbeddableFactory, diff --git a/src/plugins/embeddable/public/tests/container.test.ts b/src/plugins/embeddable/public/tests/container.test.ts index 78b3a8437d2b4..5f23add51bceb 100644 --- a/src/plugins/embeddable/public/tests/container.test.ts +++ b/src/plugins/embeddable/public/tests/container.test.ts @@ -286,19 +286,14 @@ test('Container view mode change propagates to children', async () => { }); test(`Container updates its state when a child's input is updated`, async (done) => { - const { - container, - embeddable, - start, - coreStart, - uiActions, - } = await creatHelloWorldContainerAndEmbeddable( - { id: 'hello', panels: {}, viewMode: ViewMode.VIEW }, - { - id: '123', - firstName: 'Susy', - } - ); + const { container, embeddable, start, coreStart, uiActions } = + await creatHelloWorldContainerAndEmbeddable( + { id: 'hello', panels: {}, viewMode: ViewMode.VIEW }, + { + id: '123', + firstName: 'Susy', + } + ); expect(isErrorEmbeddable(embeddable)).toBe(false); diff --git a/src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/authorization_provider.tsx b/src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/authorization_provider.tsx index f29ab120013c6..be49a7697afca 100644 --- a/src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/authorization_provider.tsx +++ b/src/plugins/es_ui_shared/__packages_do_not_import__/authorization/components/authorization_provider.tsx @@ -45,7 +45,11 @@ interface Props { } export const AuthorizationProvider = ({ privilegesEndpoint, httpClient, children }: Props) => { - const { isLoading, error, data: privilegesData } = useRequest(httpClient, { + const { + isLoading, + error, + data: privilegesData, + } = useRequest(httpClient, { path: privilegesEndpoint, method: 'get', }); diff --git a/src/plugins/es_ui_shared/public/components/json_editor/json_editor.tsx b/src/plugins/es_ui_shared/public/components/json_editor/json_editor.tsx index 9eb7695bbae00..8e662a97b2790 100644 --- a/src/plugins/es_ui_shared/public/components/json_editor/json_editor.tsx +++ b/src/plugins/es_ui_shared/public/components/json_editor/json_editor.tsx @@ -32,7 +32,12 @@ function JsonEditorComp({ euiCodeEditorProps, error: propsError, }: Props) { - const { content, setContent, error: internalError, isControlled } = useJson({ + const { + content, + setContent, + error: internalError, + isControlled, + } = useJson({ defaultValue, onUpdate, value, diff --git a/src/plugins/es_ui_shared/public/forms/multi_content/multi_content_context.tsx b/src/plugins/es_ui_shared/public/forms/multi_content/multi_content_context.tsx index 7223751fbe3f2..cda10c961c2c5 100644 --- a/src/plugins/es_ui_shared/public/forms/multi_content/multi_content_context.tsx +++ b/src/plugins/es_ui_shared/public/forms/multi_content/multi_content_context.tsx @@ -46,12 +46,8 @@ export function useMultiContentContext(contentId: K) { const isMounted = useRef(false); const defaultValue = useRef(undefined); - const { - updateContentAt, - saveSnapshotAndRemoveContent, - getData, - getSingleContentData, - } = useMultiContentContext(); + const { updateContentAt, saveSnapshotAndRemoveContent, getData, getSingleContentData } = + useMultiContentContext(); const updateContent = useCallback( (content: Content) => { diff --git a/src/plugins/es_ui_shared/public/request/use_request.test.ts b/src/plugins/es_ui_shared/public/request/use_request.test.ts index 4e56604ab1a29..68edde1336728 100644 --- a/src/plugins/es_ui_shared/public/request/use_request.test.ts +++ b/src/plugins/es_ui_shared/public/request/use_request.test.ts @@ -118,12 +118,8 @@ describe('useRequest hook', () => { }); it('surfaces body-shaped errors from requests', async () => { - const { - setupErrorWithBodyRequest, - completeRequest, - hookResult, - getErrorWithBodyResponse, - } = helpers; + const { setupErrorWithBodyRequest, completeRequest, hookResult, getErrorWithBodyResponse } = + helpers; setupErrorWithBodyRequest(); await completeRequest(); diff --git a/src/plugins/es_ui_shared/static/forms/components/fields/range_field.tsx b/src/plugins/es_ui_shared/static/forms/components/fields/range_field.tsx index 36bbd0a82ce03..c063e46a247b0 100644 --- a/src/plugins/es_ui_shared/static/forms/components/fields/range_field.tsx +++ b/src/plugins/es_ui_shared/static/forms/components/fields/range_field.tsx @@ -24,7 +24,7 @@ export const RangeField = ({ field, euiFieldProps = {}, idAria, ...rest }: Props const onChange = useCallback( (e: React.ChangeEvent | React.MouseEvent) => { - const event = ({ ...e, value: `${e.currentTarget.value}` } as unknown) as React.ChangeEvent<{ + const event = { ...e, value: `${e.currentTarget.value}` } as unknown as React.ChangeEvent<{ value: string; }>; onFieldChange(event); diff --git a/src/plugins/es_ui_shared/static/forms/components/fields/toggle_field.tsx b/src/plugins/es_ui_shared/static/forms/components/fields/toggle_field.tsx index db8ffb97f751b..c7e0cb65767d6 100644 --- a/src/plugins/es_ui_shared/static/forms/components/fields/toggle_field.tsx +++ b/src/plugins/es_ui_shared/static/forms/components/fields/toggle_field.tsx @@ -23,7 +23,7 @@ export const ToggleField = ({ field, euiFieldProps = {}, idAria, ...rest }: Prop // Shim for sufficient overlap between EuiSwitchEvent and FieldHook[onChange] event const onChange = (e: EuiSwitchEvent) => { - const event = ({ ...e, value: `${e.target.checked}` } as unknown) as React.ChangeEvent<{ + const event = { ...e, value: `${e.target.checked}` } as unknown as React.ChangeEvent<{ value: string; }>; field.onChange(event); diff --git a/src/plugins/es_ui_shared/static/forms/helpers/field_validators/contains_char.ts b/src/plugins/es_ui_shared/static/forms/helpers/field_validators/contains_char.ts index 0c883e1f5e733..8aa55b789f469 100644 --- a/src/plugins/es_ui_shared/static/forms/helpers/field_validators/contains_char.ts +++ b/src/plugins/es_ui_shared/static/forms/helpers/field_validators/contains_char.ts @@ -10,25 +10,27 @@ import { ValidationFunc, ValidationError } from '../../hook_form_lib'; import { containsChars } from '../../../validators/string'; import { ERROR_CODE } from './types'; -export const containsCharsField = ({ - message, - chars, -}: { - message: string | ((err: Partial) => string); - chars: string | string[]; -}) => (...args: Parameters): ReturnType> => { - const [{ value }] = args; +export const containsCharsField = + ({ + message, + chars, + }: { + message: string | ((err: Partial) => string); + chars: string | string[]; + }) => + (...args: Parameters): ReturnType> => { + const [{ value }] = args; - if (typeof value !== 'string') { - return; - } + if (typeof value !== 'string') { + return; + } - const { doesContain, charsFound } = containsChars(chars)(value as string); - if (doesContain) { - return { - code: 'ERR_INVALID_CHARS', - charsFound, - message: typeof message === 'function' ? message({ charsFound }) : message, - }; - } -}; + const { doesContain, charsFound } = containsChars(chars)(value as string); + if (doesContain) { + return { + code: 'ERR_INVALID_CHARS', + charsFound, + message: typeof message === 'function' ? message({ charsFound }) : message, + }; + } + }; diff --git a/src/plugins/es_ui_shared/static/forms/helpers/field_validators/empty_field.ts b/src/plugins/es_ui_shared/static/forms/helpers/field_validators/empty_field.ts index 42a71197fe4f3..3b0dd49b8096f 100644 --- a/src/plugins/es_ui_shared/static/forms/helpers/field_validators/empty_field.ts +++ b/src/plugins/es_ui_shared/static/forms/helpers/field_validators/empty_field.ts @@ -11,16 +11,16 @@ import { isEmptyString } from '../../../validators/string'; import { isEmptyArray } from '../../../validators/array'; import { ERROR_CODE } from './types'; -export const emptyField = (message: string) => ( - ...args: Parameters -): ReturnType> => { - const [{ value, path }] = args; +export const emptyField = + (message: string) => + (...args: Parameters): ReturnType> => { + const [{ value, path }] = args; - if (typeof value === 'string') { - return isEmptyString(value) ? { code: 'ERR_FIELD_MISSING', path, message } : undefined; - } + if (typeof value === 'string') { + return isEmptyString(value) ? { code: 'ERR_FIELD_MISSING', path, message } : undefined; + } - if (Array.isArray(value)) { - return isEmptyArray(value) ? { code: 'ERR_FIELD_MISSING', path, message } : undefined; - } -}; + if (Array.isArray(value)) { + return isEmptyArray(value) ? { code: 'ERR_FIELD_MISSING', path, message } : undefined; + } + }; diff --git a/src/plugins/es_ui_shared/static/forms/helpers/field_validators/index_name.ts b/src/plugins/es_ui_shared/static/forms/helpers/field_validators/index_name.ts index 3dbfd7c6c289d..7c0d29217334f 100644 --- a/src/plugins/es_ui_shared/static/forms/helpers/field_validators/index_name.ts +++ b/src/plugins/es_ui_shared/static/forms/helpers/field_validators/index_name.ts @@ -11,45 +11,45 @@ import { ValidationFunc } from '../../hook_form_lib'; import { startsWith, containsChars } from '../../../validators/string'; import { ERROR_CODE } from './types'; -export const indexNameField = (i18n: any) => ( - ...args: Parameters -): ReturnType> => { - const [{ value }] = args; +export const indexNameField = + (i18n: any) => + (...args: Parameters): ReturnType> => { + const [{ value }] = args; - if (startsWith('.')(value as string)) { - return { - code: 'ERR_FIELD_FORMAT', - formatType: 'INDEX_NAME', - message: i18n.translate('esUi.forms.fieldValidation.indexNameStartsWithDotError', { - defaultMessage: 'The index name cannot start with a dot (.).', - }), - }; - } + if (startsWith('.')(value as string)) { + return { + code: 'ERR_FIELD_FORMAT', + formatType: 'INDEX_NAME', + message: i18n.translate('esUi.forms.fieldValidation.indexNameStartsWithDotError', { + defaultMessage: 'The index name cannot start with a dot (.).', + }), + }; + } - const { doesContain: doesContainSpaces } = containsChars(' ')(value as string); - if (doesContainSpaces) { - return { - code: 'ERR_FIELD_FORMAT', - formatType: 'INDEX_NAME', - message: i18n.translate('esUi.forms.fieldValidation.indexNameSpacesError', { - defaultMessage: 'The index name cannot contain spaces.', - }), - }; - } + const { doesContain: doesContainSpaces } = containsChars(' ')(value as string); + if (doesContainSpaces) { + return { + code: 'ERR_FIELD_FORMAT', + formatType: 'INDEX_NAME', + message: i18n.translate('esUi.forms.fieldValidation.indexNameSpacesError', { + defaultMessage: 'The index name cannot contain spaces.', + }), + }; + } - const { charsFound, doesContain } = containsChars(indices.INDEX_ILLEGAL_CHARACTERS_VISIBLE)( - value as string - ); - if (doesContain) { - return { - message: i18n.translate('esUi.forms.fieldValidation.indexNameInvalidCharactersError', { - defaultMessage: - 'The index name contains the invalid {characterListLength, plural, one {character} other {characters}} { characterList }.', - values: { - characterList: charsFound.join(' '), - characterListLength: charsFound.length, - }, - }), - }; - } -}; + const { charsFound, doesContain } = containsChars(indices.INDEX_ILLEGAL_CHARACTERS_VISIBLE)( + value as string + ); + if (doesContain) { + return { + message: i18n.translate('esUi.forms.fieldValidation.indexNameInvalidCharactersError', { + defaultMessage: + 'The index name contains the invalid {characterListLength, plural, one {character} other {characters}} { characterList }.', + values: { + characterList: charsFound.join(' '), + characterListLength: charsFound.length, + }, + }), + }; + } + }; diff --git a/src/plugins/es_ui_shared/static/forms/helpers/field_validators/index_pattern_field.ts b/src/plugins/es_ui_shared/static/forms/helpers/field_validators/index_pattern_field.ts index aabd254b75f7e..5aadefa6005fa 100644 --- a/src/plugins/es_ui_shared/static/forms/helpers/field_validators/index_pattern_field.ts +++ b/src/plugins/es_ui_shared/static/forms/helpers/field_validators/index_pattern_field.ts @@ -12,43 +12,43 @@ import { ERROR_CODE } from './types'; import { indexPatterns } from '../../../../../data/public'; -export const indexPatternField = (i18n: any) => ( - ...args: Parameters -): ReturnType> => { - const [{ value }] = args; - - if (typeof value !== 'string') { - return; - } - - // Validate it does not contain spaces - const { doesContain } = containsChars(' ')(value); - - if (doesContain) { - return { - code: 'ERR_FIELD_FORMAT', - formatType: 'INDEX_PATTERN', - message: i18n.translate('esUi.forms.fieldValidation.indexPatternSpacesError', { - defaultMessage: 'The index pattern cannot contain spaces.', - }), - }; - } - - // Validate illegal characters - const errors = indexPatterns.validate(value); - - if (errors[indexPatterns.ILLEGAL_CHARACTERS_KEY]) { - return { - code: 'ERR_FIELD_FORMAT', - formatType: 'INDEX_PATTERN', - message: i18n.translate('esUi.forms.fieldValidation.indexPatternInvalidCharactersError', { - defaultMessage: - 'The index pattern contains the invalid {characterListLength, plural, one {character} other {characters}} { characterList }.', - values: { - characterList: errors[indexPatterns.ILLEGAL_CHARACTERS_KEY].join(' '), - characterListLength: errors[indexPatterns.ILLEGAL_CHARACTERS_KEY].length, - }, - }), - }; - } -}; +export const indexPatternField = + (i18n: any) => + (...args: Parameters): ReturnType> => { + const [{ value }] = args; + + if (typeof value !== 'string') { + return; + } + + // Validate it does not contain spaces + const { doesContain } = containsChars(' ')(value); + + if (doesContain) { + return { + code: 'ERR_FIELD_FORMAT', + formatType: 'INDEX_PATTERN', + message: i18n.translate('esUi.forms.fieldValidation.indexPatternSpacesError', { + defaultMessage: 'The index pattern cannot contain spaces.', + }), + }; + } + + // Validate illegal characters + const errors = indexPatterns.validate(value); + + if (errors[indexPatterns.ILLEGAL_CHARACTERS_KEY]) { + return { + code: 'ERR_FIELD_FORMAT', + formatType: 'INDEX_PATTERN', + message: i18n.translate('esUi.forms.fieldValidation.indexPatternInvalidCharactersError', { + defaultMessage: + 'The index pattern contains the invalid {characterListLength, plural, one {character} other {characters}} { characterList }.', + values: { + characterList: errors[indexPatterns.ILLEGAL_CHARACTERS_KEY].join(' '), + characterListLength: errors[indexPatterns.ILLEGAL_CHARACTERS_KEY].length, + }, + }), + }; + } + }; diff --git a/src/plugins/es_ui_shared/static/forms/helpers/field_validators/is_json.ts b/src/plugins/es_ui_shared/static/forms/helpers/field_validators/is_json.ts index cd23a2709daec..62817f0df4cff 100644 --- a/src/plugins/es_ui_shared/static/forms/helpers/field_validators/is_json.ts +++ b/src/plugins/es_ui_shared/static/forms/helpers/field_validators/is_json.ts @@ -10,20 +10,19 @@ import { ValidationFunc } from '../../hook_form_lib'; import { isJSON } from '../../../validators/string'; import { ERROR_CODE } from './types'; -export const isJsonField = ( - message: string, - { allowEmptyString = false }: { allowEmptyString?: boolean } = {} -) => (...args: Parameters): ReturnType> => { - const [{ value }] = args; +export const isJsonField = + (message: string, { allowEmptyString = false }: { allowEmptyString?: boolean } = {}) => + (...args: Parameters): ReturnType> => { + const [{ value }] = args; - if (typeof value !== 'string' || (allowEmptyString && value.trim() === '')) { - return; - } + if (typeof value !== 'string' || (allowEmptyString && value.trim() === '')) { + return; + } - if (!isJSON(value)) { - return { - code: 'ERR_JSON_FORMAT', - message, - }; - } -}; + if (!isJSON(value)) { + return { + code: 'ERR_JSON_FORMAT', + message, + }; + } + }; diff --git a/src/plugins/es_ui_shared/static/forms/helpers/field_validators/lowercase_string.ts b/src/plugins/es_ui_shared/static/forms/helpers/field_validators/lowercase_string.ts index 49b17aeb8c380..3fcc429a49a9f 100644 --- a/src/plugins/es_ui_shared/static/forms/helpers/field_validators/lowercase_string.ts +++ b/src/plugins/es_ui_shared/static/forms/helpers/field_validators/lowercase_string.ts @@ -10,19 +10,19 @@ import { ValidationFunc } from '../../hook_form_lib'; import { isLowerCaseString } from '../../../validators/string'; import { ERROR_CODE } from './types'; -export const lowerCaseStringField = (message: string) => ( - ...args: Parameters -): ReturnType> => { - const [{ value }] = args; +export const lowerCaseStringField = + (message: string) => + (...args: Parameters): ReturnType> => { + const [{ value }] = args; - if (typeof value !== 'string') { - return; - } + if (typeof value !== 'string') { + return; + } - if (!isLowerCaseString(value)) { - return { - code: 'ERR_LOWERCASE_STRING', - message, - }; - } -}; + if (!isLowerCaseString(value)) { + return { + code: 'ERR_LOWERCASE_STRING', + message, + }; + } + }; diff --git a/src/plugins/es_ui_shared/static/forms/helpers/field_validators/max_length.ts b/src/plugins/es_ui_shared/static/forms/helpers/field_validators/max_length.ts index 3ba0a272003c8..bf92bbe7d7bfd 100644 --- a/src/plugins/es_ui_shared/static/forms/helpers/field_validators/max_length.ts +++ b/src/plugins/es_ui_shared/static/forms/helpers/field_validators/max_length.ts @@ -11,32 +11,34 @@ import { hasMaxLengthString } from '../../../validators/string'; import { hasMaxLengthArray } from '../../../validators/array'; import { ERROR_CODE } from './types'; -export const maxLengthField = ({ - length = 0, - message, -}: { - length: number; - message: string | ((err: Partial) => string); -}) => (...args: Parameters): ReturnType> => { - const [{ value }] = args; +export const maxLengthField = + ({ + length = 0, + message, + }: { + length: number; + message: string | ((err: Partial) => string); + }) => + (...args: Parameters): ReturnType> => { + const [{ value }] = args; - // Validate for Arrays - if (Array.isArray(value)) { - return hasMaxLengthArray(length)(value) + // Validate for Arrays + if (Array.isArray(value)) { + return hasMaxLengthArray(length)(value) + ? undefined + : { + code: 'ERR_MAX_LENGTH', + length, + message: typeof message === 'function' ? message({ length }) : message, + }; + } + + // Validate for Strings + return hasMaxLengthString(length)((value as string).trim()) ? undefined : { code: 'ERR_MAX_LENGTH', length, message: typeof message === 'function' ? message({ length }) : message, }; - } - - // Validate for Strings - return hasMaxLengthString(length)((value as string).trim()) - ? undefined - : { - code: 'ERR_MAX_LENGTH', - length, - message: typeof message === 'function' ? message({ length }) : message, - }; -}; + }; diff --git a/src/plugins/es_ui_shared/static/forms/helpers/field_validators/min_length.ts b/src/plugins/es_ui_shared/static/forms/helpers/field_validators/min_length.ts index 7a0aa35da4bdd..851aae83521a8 100644 --- a/src/plugins/es_ui_shared/static/forms/helpers/field_validators/min_length.ts +++ b/src/plugins/es_ui_shared/static/forms/helpers/field_validators/min_length.ts @@ -11,32 +11,34 @@ import { hasMinLengthString } from '../../../validators/string'; import { hasMinLengthArray } from '../../../validators/array'; import { ERROR_CODE } from './types'; -export const minLengthField = ({ - length = 0, - message, -}: { - length: number; - message: string | ((err: Partial) => string); -}) => (...args: Parameters): ReturnType> => { - const [{ value }] = args; +export const minLengthField = + ({ + length = 0, + message, + }: { + length: number; + message: string | ((err: Partial) => string); + }) => + (...args: Parameters): ReturnType> => { + const [{ value }] = args; - // Validate for Arrays - if (Array.isArray(value)) { - return hasMinLengthArray(length)(value) + // Validate for Arrays + if (Array.isArray(value)) { + return hasMinLengthArray(length)(value) + ? undefined + : { + code: 'ERR_MIN_LENGTH', + length, + message: typeof message === 'function' ? message({ length }) : message, + }; + } + + // Validate for Strings + return hasMinLengthString(length)((value as string).trim()) ? undefined : { code: 'ERR_MIN_LENGTH', length, message: typeof message === 'function' ? message({ length }) : message, }; - } - - // Validate for Strings - return hasMinLengthString(length)((value as string).trim()) - ? undefined - : { - code: 'ERR_MIN_LENGTH', - length, - message: typeof message === 'function' ? message({ length }) : message, - }; -}; + }; diff --git a/src/plugins/es_ui_shared/static/forms/helpers/field_validators/min_selectable_selection.ts b/src/plugins/es_ui_shared/static/forms/helpers/field_validators/min_selectable_selection.ts index 9545012cc9488..f532881555db8 100644 --- a/src/plugins/es_ui_shared/static/forms/helpers/field_validators/min_selectable_selection.ts +++ b/src/plugins/es_ui_shared/static/forms/helpers/field_validators/min_selectable_selection.ts @@ -20,22 +20,24 @@ const { optionsToSelectedValue } = multiSelectComponent; * of items selected. * @param total Minimum number of items */ -export const minSelectableSelectionField = ({ - total = 0, - message, -}: { - total: number; - message: string | ((err: Partial) => string); -}) => (...args: Parameters): ReturnType> => { - const [{ value }] = args; +export const minSelectableSelectionField = + ({ + total = 0, + message, + }: { + total: number; + message: string | ((err: Partial) => string); + }) => + (...args: Parameters): ReturnType> => { + const [{ value }] = args; - // We need to convert all the options from the multi selectable component, to the - // an actual Array of selection _before_ validating the Array length. - return hasMinLengthArray(total)(optionsToSelectedValue(value as EuiSelectableOption[])) - ? undefined - : { - code: 'ERR_MIN_SELECTION', - total, - message: typeof message === 'function' ? message({ length }) : message, - }; -}; + // We need to convert all the options from the multi selectable component, to the + // an actual Array of selection _before_ validating the Array length. + return hasMinLengthArray(total)(optionsToSelectedValue(value as EuiSelectableOption[])) + ? undefined + : { + code: 'ERR_MIN_SELECTION', + total, + message: typeof message === 'function' ? message({ length }) : message, + }; + }; diff --git a/src/plugins/es_ui_shared/static/forms/helpers/field_validators/number_greater_than.ts b/src/plugins/es_ui_shared/static/forms/helpers/field_validators/number_greater_than.ts index aaa71d97016f6..da4b5b239f10e 100644 --- a/src/plugins/es_ui_shared/static/forms/helpers/field_validators/number_greater_than.ts +++ b/src/plugins/es_ui_shared/static/forms/helpers/field_validators/number_greater_than.ts @@ -10,22 +10,24 @@ import { ValidationFunc, ValidationError } from '../../hook_form_lib'; import { isNumberGreaterThan } from '../../../validators/number'; import { ERROR_CODE } from './types'; -export const numberGreaterThanField = ({ - than, - message, - allowEquality = false, -}: { - than: number; - message: string | ((err: Partial) => string); - allowEquality?: boolean; -}) => (...args: Parameters): ReturnType> => { - const [{ value }] = args; +export const numberGreaterThanField = + ({ + than, + message, + allowEquality = false, + }: { + than: number; + message: string | ((err: Partial) => string); + allowEquality?: boolean; + }) => + (...args: Parameters): ReturnType> => { + const [{ value }] = args; - return isNumberGreaterThan(than, allowEquality)(value as number) - ? undefined - : { - code: 'ERR_GREATER_THAN_NUMBER', - than, - message: typeof message === 'function' ? message({ than }) : message, - }; -}; + return isNumberGreaterThan(than, allowEquality)(value as number) + ? undefined + : { + code: 'ERR_GREATER_THAN_NUMBER', + than, + message: typeof message === 'function' ? message({ than }) : message, + }; + }; diff --git a/src/plugins/es_ui_shared/static/forms/helpers/field_validators/number_smaller_than.ts b/src/plugins/es_ui_shared/static/forms/helpers/field_validators/number_smaller_than.ts index a407cd45cbb90..5a965602f0c15 100644 --- a/src/plugins/es_ui_shared/static/forms/helpers/field_validators/number_smaller_than.ts +++ b/src/plugins/es_ui_shared/static/forms/helpers/field_validators/number_smaller_than.ts @@ -10,22 +10,24 @@ import { ValidationFunc, ValidationError } from '../../hook_form_lib'; import { isNumberSmallerThan } from '../../../validators/number'; import { ERROR_CODE } from './types'; -export const numberSmallerThanField = ({ - than, - message, - allowEquality = false, -}: { - than: number; - message: string | ((err: Partial) => string); - allowEquality?: boolean; -}) => (...args: Parameters): ReturnType> => { - const [{ value }] = args; +export const numberSmallerThanField = + ({ + than, + message, + allowEquality = false, + }: { + than: number; + message: string | ((err: Partial) => string); + allowEquality?: boolean; + }) => + (...args: Parameters): ReturnType> => { + const [{ value }] = args; - return isNumberSmallerThan(than, allowEquality)(value as number) - ? undefined - : { - code: 'ERR_SMALLER_THAN_NUMBER', - than, - message: typeof message === 'function' ? message({ than }) : message, - }; -}; + return isNumberSmallerThan(than, allowEquality)(value as number) + ? undefined + : { + code: 'ERR_SMALLER_THAN_NUMBER', + than, + message: typeof message === 'function' ? message({ than }) : message, + }; + }; diff --git a/src/plugins/es_ui_shared/static/forms/helpers/field_validators/starts_with.ts b/src/plugins/es_ui_shared/static/forms/helpers/field_validators/starts_with.ts index be8bb3c50309b..4043fd3e4b7b5 100644 --- a/src/plugins/es_ui_shared/static/forms/helpers/field_validators/starts_with.ts +++ b/src/plugins/es_ui_shared/static/forms/helpers/field_validators/starts_with.ts @@ -10,20 +10,20 @@ import { ValidationFunc } from '../../hook_form_lib'; import { startsWith } from '../../../validators/string'; import { ERROR_CODE } from './types'; -export const startsWithField = ({ message, char }: { message: string; char: string }) => ( - ...args: Parameters -): ReturnType> => { - const [{ value }] = args; +export const startsWithField = + ({ message, char }: { message: string; char: string }) => + (...args: Parameters): ReturnType> => { + const [{ value }] = args; - if (typeof value !== 'string') { - return; - } + if (typeof value !== 'string') { + return; + } - if (startsWith(char)(value)) { - return { - code: 'ERR_FIRST_CHAR', - char, - message, - }; - } -}; + if (startsWith(char)(value)) { + return { + code: 'ERR_FIRST_CHAR', + char, + message, + }; + } + }; diff --git a/src/plugins/es_ui_shared/static/forms/helpers/field_validators/url.ts b/src/plugins/es_ui_shared/static/forms/helpers/field_validators/url.ts index 2320c78954d42..ef05325030b20 100644 --- a/src/plugins/es_ui_shared/static/forms/helpers/field_validators/url.ts +++ b/src/plugins/es_ui_shared/static/forms/helpers/field_validators/url.ts @@ -10,20 +10,20 @@ import { ValidationFunc, ValidationError } from '../../hook_form_lib'; import { isUrl } from '../../../validators/string'; import { ERROR_CODE } from './types'; -export const urlField = (message: string) => ( - ...args: Parameters -): ReturnType> => { - const [{ value }] = args; +export const urlField = + (message: string) => + (...args: Parameters): ReturnType> => { + const [{ value }] = args; - const error: ValidationError = { - code: 'ERR_FIELD_FORMAT', - formatType: 'URL', - message, - }; + const error: ValidationError = { + code: 'ERR_FIELD_FORMAT', + formatType: 'URL', + message, + }; - if (typeof value !== 'string') { - return error; - } + if (typeof value !== 'string') { + return error; + } - return isUrl(value) ? undefined : error; -}; + return isUrl(value) ? undefined : error; + }; diff --git a/src/plugins/es_ui_shared/static/forms/hook_form_lib/components/use_field.tsx b/src/plugins/es_ui_shared/static/forms/hook_form_lib/components/use_field.tsx index 89eacfc0cb9df..a73eee1bd8bd3 100644 --- a/src/plugins/es_ui_shared/static/forms/hook_form_lib/components/use_field.tsx +++ b/src/plugins/es_ui_shared/static/forms/hook_form_lib/components/use_field.tsx @@ -106,7 +106,7 @@ function UseFieldComp(props: Props ); diff --git a/src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_field.ts b/src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_field.ts index ececf724db45d..af6904dbacdd9 100644 --- a/src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_field.ts +++ b/src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_field.ts @@ -40,7 +40,7 @@ export const useField = ( const { type = FIELD_TYPES.TEXT, defaultValue = '', // The value to use a fallback mecanism when no initial value is passed - initialValue = config.defaultValue ?? (('' as unknown) as I), // The value explicitly passed + initialValue = config.defaultValue ?? ('' as unknown as I), // The value explicitly passed isIncludedInOutput = true, label = '', labelAppend = '', @@ -364,7 +364,7 @@ export const useField = ( // ---------------------------------- const serializeValue: FieldHook['__serializeValue'] = useCallback( (internalValue: I = value) => { - return serializer ? serializer(internalValue) : ((internalValue as unknown) as T); + return serializer ? serializer(internalValue) : (internalValue as unknown as T); }, [serializer, value] ); @@ -463,7 +463,7 @@ export const useField = ( ? event.target.checked : event.target.value; - setValue((newValue as unknown) as I); + setValue(newValue as unknown as I); }, [setValue] ); diff --git a/src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form.ts b/src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form.ts index 864579a8c71f3..23827c0d1aa3b 100644 --- a/src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form.ts +++ b/src/plugins/es_ui_shared/static/forms/hook_form_lib/hooks/use_form.ts @@ -25,8 +25,15 @@ export interface UseFormReturn { export function useForm( formConfig?: FormConfig ): UseFormReturn { - const { onSubmit, schema, serializer, deserializer, options, id = 'default', defaultValue } = - formConfig ?? {}; + const { + onSubmit, + schema, + serializer, + deserializer, + options, + id = 'default', + defaultValue, + } = formConfig ?? {}; const initDefaultValue = useCallback( (_defaultValue?: Partial): { [key: string]: any } => { diff --git a/src/plugins/es_ui_shared/static/validators/array/has_max_length.ts b/src/plugins/es_ui_shared/static/validators/array/has_max_length.ts index 86524a7065f0c..75b8a763c1364 100644 --- a/src/plugins/es_ui_shared/static/validators/array/has_max_length.ts +++ b/src/plugins/es_ui_shared/static/validators/array/has_max_length.ts @@ -6,4 +6,7 @@ * Side Public License, v 1. */ -export const hasMaxLengthArray = (length = 5) => (value: any[]): boolean => value.length <= length; +export const hasMaxLengthArray = + (length = 5) => + (value: any[]): boolean => + value.length <= length; diff --git a/src/plugins/es_ui_shared/static/validators/array/has_min_length.ts b/src/plugins/es_ui_shared/static/validators/array/has_min_length.ts index 67ec079bd749e..b32687881012e 100644 --- a/src/plugins/es_ui_shared/static/validators/array/has_min_length.ts +++ b/src/plugins/es_ui_shared/static/validators/array/has_min_length.ts @@ -6,4 +6,7 @@ * Side Public License, v 1. */ -export const hasMinLengthArray = (length = 1) => (value: any[]): boolean => value.length >= length; +export const hasMinLengthArray = + (length = 1) => + (value: any[]): boolean => + value.length >= length; diff --git a/src/plugins/es_ui_shared/static/validators/number/greater_than.ts b/src/plugins/es_ui_shared/static/validators/number/greater_than.ts index 4d6c29ec340f8..6526fdc440618 100644 --- a/src/plugins/es_ui_shared/static/validators/number/greater_than.ts +++ b/src/plugins/es_ui_shared/static/validators/number/greater_than.ts @@ -6,5 +6,7 @@ * Side Public License, v 1. */ -export const isNumberGreaterThan = (than: number, allowEquality = false) => (value: number) => - allowEquality ? value >= than : value > than; +export const isNumberGreaterThan = + (than: number, allowEquality = false) => + (value: number) => + allowEquality ? value >= than : value > than; diff --git a/src/plugins/es_ui_shared/static/validators/number/smaller_than.ts b/src/plugins/es_ui_shared/static/validators/number/smaller_than.ts index 3f921587f3586..38001493f6ee7 100644 --- a/src/plugins/es_ui_shared/static/validators/number/smaller_than.ts +++ b/src/plugins/es_ui_shared/static/validators/number/smaller_than.ts @@ -6,5 +6,7 @@ * Side Public License, v 1. */ -export const isNumberSmallerThan = (than: number, allowEquality = false) => (value: number) => - allowEquality ? value <= than : value < than; +export const isNumberSmallerThan = + (than: number, allowEquality = false) => + (value: number) => + allowEquality ? value <= than : value < than; diff --git a/src/plugins/expression_error/public/plugin.ts b/src/plugins/expression_error/public/plugin.ts index 3727cab5436c9..0b82ccf5d2dba 100755 --- a/src/plugins/expression_error/public/plugin.ts +++ b/src/plugins/expression_error/public/plugin.ts @@ -22,7 +22,8 @@ export type ExpressionErrorPluginSetup = void; export type ExpressionErrorPluginStart = void; export class ExpressionErrorPlugin - implements Plugin { + implements Plugin +{ public setup(core: CoreSetup, { expressions }: SetupDeps): ExpressionErrorPluginSetup { expressions.registerRenderer(errorRenderer); expressions.registerRenderer(debugRenderer); diff --git a/src/plugins/expression_image/public/plugin.ts b/src/plugins/expression_image/public/plugin.ts index 44feea4121637..6e6c02248642f 100755 --- a/src/plugins/expression_image/public/plugin.ts +++ b/src/plugins/expression_image/public/plugin.ts @@ -23,7 +23,8 @@ export type ExpressionImagePluginSetup = void; export type ExpressionImagePluginStart = void; export class ExpressionImagePlugin - implements Plugin { + implements Plugin +{ public setup(core: CoreSetup, { expressions }: SetupDeps): ExpressionImagePluginSetup { expressions.registerFunction(imageFunction); expressions.registerRenderer(imageRenderer); diff --git a/src/plugins/expression_image/server/plugin.ts b/src/plugins/expression_image/server/plugin.ts index d3259d45107e5..b342bb96647ce 100755 --- a/src/plugins/expression_image/server/plugin.ts +++ b/src/plugins/expression_image/server/plugin.ts @@ -22,7 +22,8 @@ export type ExpressionImagePluginSetup = void; export type ExpressionImagePluginStart = void; export class ExpressionImagePlugin - implements Plugin { + implements Plugin +{ public setup(core: CoreSetup, { expressions }: SetupDeps): ExpressionImagePluginSetup { expressions.registerFunction(imageFunction); } diff --git a/src/plugins/expression_metric/public/plugin.ts b/src/plugins/expression_metric/public/plugin.ts index c11a5a4cdcade..8711a824fb7b5 100755 --- a/src/plugins/expression_metric/public/plugin.ts +++ b/src/plugins/expression_metric/public/plugin.ts @@ -23,8 +23,8 @@ export type ExpressionMetricPluginSetup = void; export type ExpressionMetricPluginStart = void; export class ExpressionMetricPlugin - implements - Plugin { + implements Plugin +{ public setup(core: CoreSetup, { expressions }: SetupDeps): ExpressionMetricPluginSetup { expressions.registerFunction(metricFunction); expressions.registerRenderer(metricRenderer); diff --git a/src/plugins/expression_metric/server/plugin.ts b/src/plugins/expression_metric/server/plugin.ts index 81c87f5c05580..29281faf0b790 100755 --- a/src/plugins/expression_metric/server/plugin.ts +++ b/src/plugins/expression_metric/server/plugin.ts @@ -22,8 +22,8 @@ export type ExpressionMetricPluginSetup = void; export type ExpressionMetricPluginStart = void; export class ExpressionMetricPlugin - implements - Plugin { + implements Plugin +{ public setup(core: CoreSetup, { expressions }: SetupDeps): ExpressionMetricPluginSetup { expressions.registerFunction(metricFunction); } diff --git a/src/plugins/expression_repeat_image/public/plugin.ts b/src/plugins/expression_repeat_image/public/plugin.ts index aba8fff219c4a..d71ce99eb1bd1 100755 --- a/src/plugins/expression_repeat_image/public/plugin.ts +++ b/src/plugins/expression_repeat_image/public/plugin.ts @@ -29,7 +29,8 @@ export class ExpressionRepeatImagePlugin ExpressionRepeatImagePluginStart, SetupDeps, StartDeps - > { + > +{ public setup(core: CoreSetup, { expressions }: SetupDeps): ExpressionRepeatImagePluginSetup { expressions.registerFunction(repeatImageFunction); expressions.registerRenderer(repeatImageRenderer); diff --git a/src/plugins/expression_repeat_image/server/plugin.ts b/src/plugins/expression_repeat_image/server/plugin.ts index 744a3fb7f35b8..eff5e24ef65fa 100755 --- a/src/plugins/expression_repeat_image/server/plugin.ts +++ b/src/plugins/expression_repeat_image/server/plugin.ts @@ -28,7 +28,8 @@ export class ExpressionRepeatImagePlugin ExpressionRepeatImagePluginStart, SetupDeps, StartDeps - > { + > +{ public setup(core: CoreSetup, { expressions }: SetupDeps): ExpressionRepeatImagePluginSetup { expressions.registerFunction(repeatImageFunction); } diff --git a/src/plugins/expression_reveal_image/public/plugin.ts b/src/plugins/expression_reveal_image/public/plugin.ts index c3522b43ca0ca..c5e1b5c8d916f 100755 --- a/src/plugins/expression_reveal_image/public/plugin.ts +++ b/src/plugins/expression_reveal_image/public/plugin.ts @@ -29,7 +29,8 @@ export class ExpressionRevealImagePlugin ExpressionRevealImagePluginStart, SetupDeps, StartDeps - > { + > +{ public setup(core: CoreSetup, { expressions }: SetupDeps): ExpressionRevealImagePluginSetup { expressions.registerFunction(revealImageFunction); expressions.registerRenderer(revealImageRenderer); diff --git a/src/plugins/expression_reveal_image/server/plugin.ts b/src/plugins/expression_reveal_image/server/plugin.ts index 446ef018eb7d3..c85ff9c620814 100644 --- a/src/plugins/expression_reveal_image/server/plugin.ts +++ b/src/plugins/expression_reveal_image/server/plugin.ts @@ -28,7 +28,8 @@ export class ExpressionRevealImagePlugin ExpressionRevealImagePluginStart, SetupDeps, StartDeps - > { + > +{ public setup(core: CoreSetup, { expressions }: SetupDeps): ExpressionRevealImagePluginSetup { expressions.registerFunction(revealImageFunction); } diff --git a/src/plugins/expression_shape/public/components/progress/shapes/unicorn.tsx b/src/plugins/expression_shape/public/components/progress/shapes/unicorn.tsx index 020176244e444..505a3b41bcbb2 100644 --- a/src/plugins/expression_shape/public/components/progress/shapes/unicorn.tsx +++ b/src/plugins/expression_shape/public/components/progress/shapes/unicorn.tsx @@ -17,8 +17,7 @@ export const Unicorn = createShape({ }, shapeType: SvgElementTypes.path, shapeProps: { - d: - 'M 123 189 C 93 141 129 126 102 96 L 78 102 L 48 117 L 42 129 Q 30 132 21 126 L 18 114 L 27 90 L 42 72 L 48 57 L 3 6 L 57 42 L 63 33 L 60 15 L 69 27 L 69 15 L 84 27 Q 162 36 195 108 Q 174 159 123 189 Z', + d: 'M 123 189 C 93 141 129 126 102 96 L 78 102 L 48 117 L 42 129 Q 30 132 21 126 L 18 114 L 27 90 L 42 72 L 48 57 L 3 6 L 57 42 L 63 33 L 60 15 L 69 27 L 69 15 L 84 27 Q 162 36 195 108 Q 174 159 123 189 Z', }, textAttributes: { x: '0', diff --git a/src/plugins/expression_shape/public/plugin.ts b/src/plugins/expression_shape/public/plugin.ts index 0b8fa274e2b08..9403bce0af728 100755 --- a/src/plugins/expression_shape/public/plugin.ts +++ b/src/plugins/expression_shape/public/plugin.ts @@ -23,7 +23,8 @@ export type ExpressionShapePluginSetup = void; export type ExpressionShapePluginStart = void; export class ExpressionShapePlugin - implements Plugin { + implements Plugin +{ public setup(core: CoreSetup, { expressions }: SetupDeps): ExpressionShapePluginSetup { expressions.registerFunction(shapeFunction); expressions.registerFunction(progressFunction); diff --git a/src/plugins/expression_shape/server/plugin.ts b/src/plugins/expression_shape/server/plugin.ts index d6eb7a8e717cd..a98d0fe3f17fe 100644 --- a/src/plugins/expression_shape/server/plugin.ts +++ b/src/plugins/expression_shape/server/plugin.ts @@ -22,7 +22,8 @@ export type ExpressionShapePluginSetup = void; export type ExpressionShapePluginStart = void; export class ExpressionShapePlugin - implements Plugin { + implements Plugin +{ public setup(core: CoreSetup, { expressions }: SetupDeps): ExpressionShapePluginSetup { expressions.registerFunction(shapeFunction); expressions.registerFunction(progressFunction); diff --git a/src/plugins/expressions/common/ast/build_function.ts b/src/plugins/expressions/common/ast/build_function.ts index 0003a5233d30a..1ccd8d8795a86 100644 --- a/src/plugins/expressions/common/ast/build_function.ts +++ b/src/plugins/expressions/common/ast/build_function.ts @@ -21,22 +21,20 @@ import { format } from './format'; // Infers the types from an ExpressionFunctionDefinition. // @internal -export type InferFunctionDefinition< - FnDef extends AnyExpressionFunctionDefinition -> = FnDef extends ExpressionFunctionDefinition< - infer Name, - infer Input, - infer Arguments, - infer Output, - infer Context -> - ? { name: Name; input: Input; arguments: Arguments; output: Output; context: Context } - : never; +export type InferFunctionDefinition = + FnDef extends ExpressionFunctionDefinition< + infer Name, + infer Input, + infer Arguments, + infer Output, + infer Context + > + ? { name: Name; input: Input; arguments: Arguments; output: Output; context: Context } + : never; // Shortcut for inferring args from a function definition. -type FunctionArgs< - FnDef extends AnyExpressionFunctionDefinition -> = InferFunctionDefinition['arguments']; +type FunctionArgs = + InferFunctionDefinition['arguments']; // Gets a list of possible arg names for a given function. type FunctionArgName = { diff --git a/src/plugins/expressions/common/execution/execution.ts b/src/plugins/expressions/common/execution/execution.ts index 75b6c9e606139..0c4185c82dc3c 100644 --- a/src/plugins/expressions/common/execution/execution.ts +++ b/src/plugins/expressions/common/execution/execution.ts @@ -158,11 +158,8 @@ export class Execution< * Contract is a public representation of `Execution` instances. Contract we * can return to other plugins for their consumption. */ - public readonly contract: ExecutionContract< - Input, - Output, - InspectorAdapters - > = new ExecutionContract(this); + public readonly contract: ExecutionContract = + new ExecutionContract(this); public readonly expression: string; @@ -474,17 +471,19 @@ export class Execution< // Create the functions to resolve the argument ASTs into values // These are what are passed to the actual functions if you opt out of resolving const resolveArgFns = mapValues(dealiasedArgAsts, (asts, argName) => - asts.map((item) => (subInput = input) => - this.interpret(item, subInput).pipe( - pluck('result'), - map((output) => { - if (isExpressionValueError(output)) { - throw output.error; - } - - return this.cast(output, argDefs[argName].types); - }) - ) + asts.map( + (item) => + (subInput = input) => + this.interpret(item, subInput).pipe( + pluck('result'), + map((output) => { + if (isExpressionValueError(output)) { + throw output.error; + } + + return this.cast(output, argDefs[argName].types); + }) + ) ) ); diff --git a/src/plugins/expressions/common/executor/container.ts b/src/plugins/expressions/common/executor/container.ts index 87c45bb2c40bf..9d3796ac64f45 100644 --- a/src/plugins/expressions/common/executor/container.ts +++ b/src/plugins/expressions/common/executor/container.ts @@ -49,12 +49,14 @@ export interface ExecutorPureSelectors { export const pureSelectors: ExecutorPureSelectors = { getFunction: (state) => (id) => state.functions[id] || null, getType: (state) => (id) => state.types[id] || null, - getContext: ({ context }) => () => context, + getContext: + ({ context }) => + () => + context, }; -export type ExecutorContainer< - Context extends Record = Record -> = StateContainer, ExecutorPureTransitions, ExecutorPureSelectors>; +export type ExecutorContainer = Record> = + StateContainer, ExecutorPureTransitions, ExecutorPureSelectors>; export const createExecutorContainer = < Context extends Record = Record diff --git a/src/plugins/expressions/common/executor/executor.test.ts b/src/plugins/expressions/common/executor/executor.test.ts index 75758dad783a0..4a3d6045a7b4a 100644 --- a/src/plugins/expressions/common/executor/executor.test.ts +++ b/src/plugins/expressions/common/executor/executor.test.ts @@ -173,12 +173,12 @@ describe('Executor', () => { return injectFn(state); }, migrations: { - '7.10.0': (((state: ExpressionAstFunction, version: string): ExpressionAstFunction => { + '7.10.0': ((state: ExpressionAstFunction, version: string): ExpressionAstFunction => { return migrateFn(state, version); - }) as any) as MigrateFunction, - '7.10.1': (((state: ExpressionAstFunction, version: string): ExpressionAstFunction => { + }) as any as MigrateFunction, + '7.10.1': ((state: ExpressionAstFunction, version: string): ExpressionAstFunction => { return migrateFn(state, version); - }) as any) as MigrateFunction, + }) as any as MigrateFunction, }, fn: jest.fn(), }; diff --git a/src/plugins/expressions/common/executor/executor.ts b/src/plugins/expressions/common/executor/executor.ts index eb0e344b6dd60..55d3a7b897864 100644 --- a/src/plugins/expressions/common/executor/executor.ts +++ b/src/plugins/expressions/common/executor/executor.ts @@ -84,7 +84,8 @@ export class FunctionsRegistry implements IRegistry { } export class Executor = Record> - implements PersistableStateService { + implements PersistableStateService +{ static createWithDefaults = Record>( state?: ExecutorState ): Executor { diff --git a/src/plugins/expressions/common/expression_functions/expression_function.ts b/src/plugins/expressions/common/expression_functions/expression_function.ts index 963d2186af733..05a5dbb638c01 100644 --- a/src/plugins/expressions/common/expression_functions/expression_function.ts +++ b/src/plugins/expressions/common/expression_functions/expression_function.ts @@ -58,9 +58,10 @@ export class ExpressionFunction implements PersistableState ) => Record; - extract: ( - state: ExpressionAstFunction['arguments'] - ) => { state: ExpressionAstFunction['arguments']; references: SavedObjectReference[] }; + extract: (state: ExpressionAstFunction['arguments']) => { + state: ExpressionAstFunction['arguments']; + references: SavedObjectReference[]; + }; inject: ( state: ExpressionAstFunction['arguments'], references: SavedObjectReference[] diff --git a/src/plugins/expressions/common/expression_functions/specs/tests/ui_setting.test.ts b/src/plugins/expressions/common/expression_functions/specs/tests/ui_setting.test.ts index fb2c87588a4d4..6b3a458aa7e57 100644 --- a/src/plugins/expressions/common/expression_functions/specs/tests/ui_setting.test.ts +++ b/src/plugins/expressions/common/expression_functions/specs/tests/ui_setting.test.ts @@ -20,12 +20,12 @@ describe('uiSetting', () => { let uiSettings: jest.Mocked; beforeEach(() => { - uiSettings = ({ + uiSettings = { get: jest.fn(), - } as unknown) as jest.Mocked; - getStartDependencies = (jest.fn(async () => ({ + } as unknown as jest.Mocked; + getStartDependencies = jest.fn(async () => ({ uiSettings, - })) as unknown) as typeof getStartDependencies; + })) as unknown as typeof getStartDependencies; uiSetting = getUiSettingFn({ getStartDependencies }); }); diff --git a/src/plugins/expressions/public/react_expression_renderer.tsx b/src/plugins/expressions/public/react_expression_renderer.tsx index 2640be16eae46..428419c4ff022 100644 --- a/src/plugins/expressions/public/react_expression_renderer.tsx +++ b/src/plugins/expressions/public/react_expression_renderer.tsx @@ -79,9 +79,8 @@ export const ReactExpressionRenderer = ({ const hasHandledErrorRef = useRef(false); // will call done() in LayoutEffect when done with rendering custom error state - const errorRenderHandlerRef: React.MutableRefObject = useRef( - null - ); + const errorRenderHandlerRef: React.MutableRefObject = + useRef(null); const [debouncedExpression, setDebouncedExpression] = useState(expression); const [waitingForDebounceToComplete, setDebouncePending] = useState(false); const firstRender = useRef(true); diff --git a/src/plugins/expressions/public/services/index.ts b/src/plugins/expressions/public/services/index.ts index db473037a0a4a..198ff129bcce3 100644 --- a/src/plugins/expressions/public/services/index.ts +++ b/src/plugins/expressions/public/services/index.ts @@ -10,18 +10,13 @@ import { NotificationsStart } from 'kibana/public'; import { createGetterSetter } from '../../../kibana_utils/public'; import { ExpressionsService, ExpressionRendererRegistry } from '../../common'; -export const [getNotifications, setNotifications] = createGetterSetter( - 'Notifications' -); +export const [getNotifications, setNotifications] = + createGetterSetter('Notifications'); -export const [ - getRenderersRegistry, - setRenderersRegistry, -] = createGetterSetter('Renderers registry'); +export const [getRenderersRegistry, setRenderersRegistry] = + createGetterSetter('Renderers registry'); -export const [ - getExpressionsService, - setExpressionsService, -] = createGetterSetter('ExpressionsService'); +export const [getExpressionsService, setExpressionsService] = + createGetterSetter('ExpressionsService'); export * from './expressions_services'; diff --git a/src/plugins/expressions/server/plugin.ts b/src/plugins/expressions/server/plugin.ts index 2e45daf6e0f8c..65942ddb0ec17 100644 --- a/src/plugins/expressions/server/plugin.ts +++ b/src/plugins/expressions/server/plugin.ts @@ -15,7 +15,8 @@ export type ExpressionsServerSetup = ExpressionsServiceSetup; export type ExpressionsServerStart = ExpressionsServiceStart; export class ExpressionsServerPlugin - implements Plugin { + implements Plugin +{ readonly expressions: ExpressionsService = new ExpressionsService(); constructor(initializerContext: PluginInitializerContext) {} diff --git a/src/plugins/field_formats/common/converters/duration.ts b/src/plugins/field_formats/common/converters/duration.ts index c913ee03d9d36..72f893b59ef4a 100644 --- a/src/plugins/field_formats/common/converters/duration.ts +++ b/src/plugins/field_formats/common/converters/duration.ts @@ -179,9 +179,9 @@ const outputFormats = [ function parseInputAsDuration(val: number, inputFormat: string) { const ratio = ratioToSeconds[inputFormat] || 1; - const kind = (inputFormat in ratioToSeconds - ? 'seconds' - : inputFormat) as unitOfTime.DurationConstructor; + const kind = ( + inputFormat in ratioToSeconds ? 'seconds' : inputFormat + ) as unitOfTime.DurationConstructor; return moment.duration(val * ratio, kind); } @@ -193,9 +193,9 @@ function formatInputHumanPrecise( includeSpace: string ) { const ratio = ratioToSeconds[inputFormat] || 1; - const kind = (inputFormat in ratioToSeconds - ? 'seconds' - : inputFormat) as unitOfTime.DurationConstructor; + const kind = ( + inputFormat in ratioToSeconds ? 'seconds' : inputFormat + ) as unitOfTime.DurationConstructor; const valueInDuration = moment.duration(val * ratio, kind); return formatDuration( diff --git a/src/plugins/home/public/application/components/add_data/add_data.test.tsx b/src/plugins/home/public/application/components/add_data/add_data.test.tsx index 3e324685c8402..4018ae67c19ee 100644 --- a/src/plugins/home/public/application/components/add_data/add_data.test.tsx +++ b/src/plugins/home/public/application/components/add_data/add_data.test.tsx @@ -27,7 +27,7 @@ beforeEach(() => { jest.clearAllMocks(); }); -const applicationStartMock = ({} as unknown) as ApplicationStart; +const applicationStartMock = {} as unknown as ApplicationStart; const addBasePathMock = jest.fn((path: string) => (path ? path : 'path')); diff --git a/src/plugins/home/public/application/components/manage_data/manage_data.test.tsx b/src/plugins/home/public/application/components/manage_data/manage_data.test.tsx index 24b8b118f7661..fb222be657786 100644 --- a/src/plugins/home/public/application/components/manage_data/manage_data.test.tsx +++ b/src/plugins/home/public/application/components/manage_data/manage_data.test.tsx @@ -29,13 +29,13 @@ beforeEach(() => { jest.clearAllMocks(); }); -const applicationStartMock = ({ +const applicationStartMock = { capabilities: { navLinks: { management: true, dev_tools: true } }, -} as unknown) as ApplicationStart; +} as unknown as ApplicationStart; -const applicationStartMockRestricted = ({ +const applicationStartMockRestricted = { capabilities: { navLinks: { management: false, dev_tools: false } }, -} as unknown) as ApplicationStart; +} as unknown as ApplicationStart; const addBasePathMock = jest.fn((path: string) => (path ? path : 'path')); diff --git a/src/plugins/home/public/application/components/manage_data/manage_data.tsx b/src/plugins/home/public/application/components/manage_data/manage_data.tsx index 746afad9d5b56..b374bdd2e1612 100644 --- a/src/plugins/home/public/application/components/manage_data/manage_data.tsx +++ b/src/plugins/home/public/application/components/manage_data/manage_data.tsx @@ -39,10 +39,8 @@ export const ManageData: FC = ({ addBasePath, application, features }) => ?.useUrl({ sectionId: '' }); if (features.length) { - const { - management: isManagementEnabled, - dev_tools: isDevToolsEnabled, - } = application.capabilities.navLinks; + const { management: isManagementEnabled, dev_tools: isDevToolsEnabled } = + application.capabilities.navLinks; return ( <> diff --git a/src/plugins/home/public/plugin.ts b/src/plugins/home/public/plugin.ts index f6a1566b267ac..7d0af7415640e 100644 --- a/src/plugins/home/public/plugin.ts +++ b/src/plugins/home/public/plugin.ts @@ -55,7 +55,8 @@ export class HomePublicPlugin HomePublicPluginStart, HomePluginSetupDependencies, HomePluginStartDependencies - > { + > +{ private readonly featuresCatalogueRegistry = new FeatureCatalogueRegistry(); private readonly environmentService = new EnvironmentService(); private readonly tutorialService = new TutorialService(); @@ -75,10 +76,8 @@ export class HomePublicPlugin const trackUiMetric = usageCollection ? usageCollection.reportUiCounter.bind(usageCollection, 'Kibana_home') : () => {}; - const [ - coreStart, - { telemetry, data, urlForwarding: urlForwardingStart }, - ] = await core.getStartServices(); + const [coreStart, { telemetry, data, urlForwarding: urlForwardingStart }] = + await core.getStartServices(); setServices({ share, trackUiMetric, diff --git a/src/plugins/home/public/services/feature_catalogue/feature_catalogue_registry.ts b/src/plugins/home/public/services/feature_catalogue/feature_catalogue_registry.ts index 4940a7dd5c221..0b38d8359890d 100644 --- a/src/plugins/home/public/services/feature_catalogue/feature_catalogue_registry.ts +++ b/src/plugins/home/public/services/feature_catalogue/feature_catalogue_registry.ts @@ -120,12 +120,14 @@ export class FeatureCatalogueRegistry { export type FeatureCatalogueRegistrySetup = ReturnType; -const compareByKey = (key: keyof T) => (left: T, right: T) => { - if (left[key] < right[key]) { - return -1; - } else if (left[key] > right[key]) { - return 1; - } else { - return 0; - } -}; +const compareByKey = + (key: keyof T) => + (left: T, right: T) => { + if (left[key] < right[key]) { + return -1; + } else if (left[key] > right[key]) { + return 1; + } else { + return 0; + } + }; diff --git a/src/plugins/home/server/services/sample_data/data_sets/flights/saved_objects.ts b/src/plugins/home/server/services/sample_data/data_sets/flights/saved_objects.ts index 8227e48501aa2..8552d74201fe2 100644 --- a/src/plugins/home/server/services/sample_data/data_sets/flights/saved_objects.ts +++ b/src/plugins/home/server/services/sample_data/data_sets/flights/saved_objects.ts @@ -254,20 +254,17 @@ export const getSavedObjects = (): SavedObject[] => [ }, { id: 'd3d7af60-4c81-11e8-b3d7-01146121b73d', - name: - 'aa810aa2-29c9-4a75-b39e-f4f267de1732:control_aa810aa2-29c9-4a75-b39e-f4f267de1732_0_index_pattern', + name: 'aa810aa2-29c9-4a75-b39e-f4f267de1732:control_aa810aa2-29c9-4a75-b39e-f4f267de1732_0_index_pattern', type: 'index-pattern', }, { id: 'd3d7af60-4c81-11e8-b3d7-01146121b73d', - name: - 'aa810aa2-29c9-4a75-b39e-f4f267de1732:control_aa810aa2-29c9-4a75-b39e-f4f267de1732_1_index_pattern', + name: 'aa810aa2-29c9-4a75-b39e-f4f267de1732:control_aa810aa2-29c9-4a75-b39e-f4f267de1732_1_index_pattern', type: 'index-pattern', }, { id: 'd3d7af60-4c81-11e8-b3d7-01146121b73d', - name: - 'aa810aa2-29c9-4a75-b39e-f4f267de1732:control_aa810aa2-29c9-4a75-b39e-f4f267de1732_2_index_pattern', + name: 'aa810aa2-29c9-4a75-b39e-f4f267de1732:control_aa810aa2-29c9-4a75-b39e-f4f267de1732_2_index_pattern', type: 'index-pattern', }, { @@ -277,8 +274,7 @@ export const getSavedObjects = (): SavedObject[] => [ }, { id: 'd3d7af60-4c81-11e8-b3d7-01146121b73d', - name: - '086ac2e9-dd16-4b45-92b8-1e43ff7e3f65:indexpattern-datasource-layer-03c34665-471c-49c7-acf1-5a11f517421c', + name: '086ac2e9-dd16-4b45-92b8-1e43ff7e3f65:indexpattern-datasource-layer-03c34665-471c-49c7-acf1-5a11f517421c', type: 'index-pattern', }, { @@ -288,8 +284,7 @@ export const getSavedObjects = (): SavedObject[] => [ }, { id: 'd3d7af60-4c81-11e8-b3d7-01146121b73d', - name: - '9271deff-5a61-4665-83fc-f9fdc6bf0c0b:indexpattern-datasource-layer-b4712d43-1e84-4f5b-878d-8e38ba748317', + name: '9271deff-5a61-4665-83fc-f9fdc6bf0c0b:indexpattern-datasource-layer-b4712d43-1e84-4f5b-878d-8e38ba748317', type: 'index-pattern', }, { @@ -299,8 +294,7 @@ export const getSavedObjects = (): SavedObject[] => [ }, { id: 'd3d7af60-4c81-11e8-b3d7-01146121b73d', - name: - 'aa591c29-1a31-4ee1-a71d-b829c06fd162:indexpattern-datasource-layer-b4712d43-1e84-4f5b-878d-8e38ba748317', + name: 'aa591c29-1a31-4ee1-a71d-b829c06fd162:indexpattern-datasource-layer-b4712d43-1e84-4f5b-878d-8e38ba748317', type: 'index-pattern', }, { @@ -315,8 +309,7 @@ export const getSavedObjects = (): SavedObject[] => [ }, { id: 'd3d7af60-4c81-11e8-b3d7-01146121b73d', - name: - 'b766e3b8-4544-46ed-99e6-9ecc4847e2a2:indexpattern-datasource-layer-b4712d43-1e84-4f5b-878d-8e38ba748317', + name: 'b766e3b8-4544-46ed-99e6-9ecc4847e2a2:indexpattern-datasource-layer-b4712d43-1e84-4f5b-878d-8e38ba748317', type: 'index-pattern', }, { @@ -326,8 +319,7 @@ export const getSavedObjects = (): SavedObject[] => [ }, { id: 'd3d7af60-4c81-11e8-b3d7-01146121b73d', - name: - '2e33ade5-96e5-40b4-b460-493e5d4fa834:indexpattern-datasource-layer-b4712d43-1e84-4f5b-878d-8e38ba748317', + name: '2e33ade5-96e5-40b4-b460-493e5d4fa834:indexpattern-datasource-layer-b4712d43-1e84-4f5b-878d-8e38ba748317', type: 'index-pattern', }, { @@ -342,8 +334,7 @@ export const getSavedObjects = (): SavedObject[] => [ }, { id: 'd3d7af60-4c81-11e8-b3d7-01146121b73d', - name: - 'fb86b32f-fb7a-45cf-9511-f366fef51bbd:indexpattern-datasource-layer-f26e8f7a-4118-4227-bea0-5c02d8b270f7', + name: 'fb86b32f-fb7a-45cf-9511-f366fef51bbd:indexpattern-datasource-layer-f26e8f7a-4118-4227-bea0-5c02d8b270f7', type: 'index-pattern', }, { @@ -353,8 +344,7 @@ export const getSavedObjects = (): SavedObject[] => [ }, { id: 'd3d7af60-4c81-11e8-b3d7-01146121b73d', - name: - '5d53db36-2d5a-4adc-af7b-cec4c1a294e0:indexpattern-datasource-layer-0c8e136b-a822-4fb3-836d-e06cbea4eea4', + name: '5d53db36-2d5a-4adc-af7b-cec4c1a294e0:indexpattern-datasource-layer-0c8e136b-a822-4fb3-836d-e06cbea4eea4', type: 'index-pattern', }, { @@ -369,8 +359,7 @@ export const getSavedObjects = (): SavedObject[] => [ }, { id: 'd3d7af60-4c81-11e8-b3d7-01146121b73d', - name: - '0cc42484-16f7-42ec-b38c-9bf8be69cde7:indexpattern-datasource-layer-e80cc05e-c52a-4e5f-ac71-4b37274867f5', + name: '0cc42484-16f7-42ec-b38c-9bf8be69cde7:indexpattern-datasource-layer-e80cc05e-c52a-4e5f-ac71-4b37274867f5', type: 'index-pattern', }, { @@ -380,8 +369,7 @@ export const getSavedObjects = (): SavedObject[] => [ }, { id: 'd3d7af60-4c81-11e8-b3d7-01146121b73d', - name: - '392b4936-f753-47bc-a98d-a4e41a0a4cd4:indexpattern-datasource-layer-8fa993db-c147-4954-adf7-4ff264d42576', + name: '392b4936-f753-47bc-a98d-a4e41a0a4cd4:indexpattern-datasource-layer-8fa993db-c147-4954-adf7-4ff264d42576', type: 'index-pattern', }, ], diff --git a/src/plugins/home/server/services/sample_data/data_sets/logs/saved_objects.ts b/src/plugins/home/server/services/sample_data/data_sets/logs/saved_objects.ts index f7e8c824030bd..c60110176b67b 100644 --- a/src/plugins/home/server/services/sample_data/data_sets/logs/saved_objects.ts +++ b/src/plugins/home/server/services/sample_data/data_sets/logs/saved_objects.ts @@ -396,20 +396,17 @@ export const getSavedObjects = (): SavedObject[] => [ }, { id: '90943e30-9a47-11e8-b64d-95841ca0b247', - name: - '30326cdb-4ddd-49eb-a4f1-b555caa21d7c:control_30326cdb-4ddd-49eb-a4f1-b555caa21d7c_0_index_pattern', + name: '30326cdb-4ddd-49eb-a4f1-b555caa21d7c:control_30326cdb-4ddd-49eb-a4f1-b555caa21d7c_0_index_pattern', type: 'index-pattern', }, { id: '90943e30-9a47-11e8-b64d-95841ca0b247', - name: - '30326cdb-4ddd-49eb-a4f1-b555caa21d7c:control_30326cdb-4ddd-49eb-a4f1-b555caa21d7c_1_index_pattern', + name: '30326cdb-4ddd-49eb-a4f1-b555caa21d7c:control_30326cdb-4ddd-49eb-a4f1-b555caa21d7c_1_index_pattern', type: 'index-pattern', }, { id: '90943e30-9a47-11e8-b64d-95841ca0b247', - name: - '30326cdb-4ddd-49eb-a4f1-b555caa21d7c:control_30326cdb-4ddd-49eb-a4f1-b555caa21d7c_2_index_pattern', + name: '30326cdb-4ddd-49eb-a4f1-b555caa21d7c:control_30326cdb-4ddd-49eb-a4f1-b555caa21d7c_2_index_pattern', type: 'index-pattern', }, { @@ -419,8 +416,7 @@ export const getSavedObjects = (): SavedObject[] => [ }, { id: '90943e30-9a47-11e8-b64d-95841ca0b247', - name: - 'bb94016e-f4a6-49ca-87a9-296a2869d570:indexpattern-datasource-layer-483defd2-775b-4a62-bdef-496c819bb8ed', + name: 'bb94016e-f4a6-49ca-87a9-296a2869d570:indexpattern-datasource-layer-483defd2-775b-4a62-bdef-496c819bb8ed', type: 'index-pattern', }, { @@ -430,8 +426,7 @@ export const getSavedObjects = (): SavedObject[] => [ }, { id: '90943e30-9a47-11e8-b64d-95841ca0b247', - name: - '01d8e435-91c0-484f-a11e-856747050b0a:indexpattern-datasource-layer-f3793bb7-3971-4753-866d-4008e77a9f9a', + name: '01d8e435-91c0-484f-a11e-856747050b0a:indexpattern-datasource-layer-f3793bb7-3971-4753-866d-4008e77a9f9a', type: 'index-pattern', }, { @@ -441,8 +436,7 @@ export const getSavedObjects = (): SavedObject[] => [ }, { id: '90943e30-9a47-11e8-b64d-95841ca0b247', - name: - '8c1456d4-1993-4ba2-b701-04aca02c9fef:indexpattern-datasource-layer-f3793bb7-3971-4753-866d-4008e77a9f9a', + name: '8c1456d4-1993-4ba2-b701-04aca02c9fef:indexpattern-datasource-layer-f3793bb7-3971-4753-866d-4008e77a9f9a', type: 'index-pattern', }, { @@ -457,8 +451,7 @@ export const getSavedObjects = (): SavedObject[] => [ }, { id: '90943e30-9a47-11e8-b64d-95841ca0b247', - name: - '1d5f0b3f-d9d2-4b26-997b-83bc5ca3090b:indexpattern-datasource-layer-c35dc8ee-50d1-4ef7-8b4b-9c21a7e7d3b0', + name: '1d5f0b3f-d9d2-4b26-997b-83bc5ca3090b:indexpattern-datasource-layer-c35dc8ee-50d1-4ef7-8b4b-9c21a7e7d3b0', type: 'index-pattern', }, { diff --git a/src/plugins/home/server/services/sample_data/routes/list.ts b/src/plugins/home/server/services/sample_data/routes/list.ts index 72d8c31cbafd7..e3e213196889c 100644 --- a/src/plugins/home/server/services/sample_data/routes/list.ts +++ b/src/plugins/home/server/services/sample_data/routes/list.ts @@ -36,11 +36,10 @@ export const createListRoute = (router: IRouter, sampleDatasets: SampleDatasetSc const dataIndexConfig = sampleDataset.dataIndices[i]; const index = createIndexName(sampleDataset.id, dataIndexConfig.id); try { - const { - body: indexExists, - } = await context.core.elasticsearch.client.asCurrentUser.indices.exists({ - index, - }); + const { body: indexExists } = + await context.core.elasticsearch.client.asCurrentUser.indices.exists({ + index, + }); if (!indexExists) { sampleDataset.status = NOT_INSTALLED; return; diff --git a/src/plugins/home/server/tutorials/instructions/logstash_instructions.ts b/src/plugins/home/server/tutorials/instructions/logstash_instructions.ts index 350464a47b406..28a99f21e25ce 100644 --- a/src/plugins/home/server/tutorials/instructions/logstash_instructions.ts +++ b/src/plugins/home/server/tutorials/instructions/logstash_instructions.ts @@ -37,8 +37,7 @@ export const createLogstashInstructions = () => ({ { defaultMessage: 'First time using Logstash? See the [Getting Started Guide]({link}).', values: { - link: - '{config.docs.base_url}guide/en/logstash/current/getting-started-with-logstash.html', + link: '{config.docs.base_url}guide/en/logstash/current/getting-started-with-logstash.html', }, } ), @@ -61,8 +60,7 @@ export const createLogstashInstructions = () => ({ { defaultMessage: 'Follow the installation instructions [here]({link}).', values: { - link: - 'https://docs.oracle.com/javase/8/docs/technotes/guides/install/windows_jre_install.html', + link: 'https://docs.oracle.com/javase/8/docs/technotes/guides/install/windows_jre_install.html', }, } ), diff --git a/src/plugins/index_pattern_editor/public/components/empty_prompts/empty_prompts.tsx b/src/plugins/index_pattern_editor/public/components/empty_prompts/empty_prompts.tsx index 591d3975acae7..51c64f4c13404 100644 --- a/src/plugins/index_pattern_editor/public/components/empty_prompts/empty_prompts.tsx +++ b/src/plugins/index_pattern_editor/public/components/empty_prompts/empty_prompts.tsx @@ -21,7 +21,7 @@ import { PromptFooter } from './prompt_footer'; import { FLEET_ASSETS_TO_IGNORE } from '../../../../data/common'; const removeAliases = (item: MatchedItem) => - !((item as unknown) as ResolveIndexResponseItemAlias).indices; + !(item as unknown as ResolveIndexResponseItemAlias).indices; interface Props { onCancel: () => void; diff --git a/src/plugins/index_pattern_editor/public/components/index_pattern_editor.tsx b/src/plugins/index_pattern_editor/public/components/index_pattern_editor.tsx index bc0b6156a7844..cbf6e4bdf7305 100644 --- a/src/plugins/index_pattern_editor/public/components/index_pattern_editor.tsx +++ b/src/plugins/index_pattern_editor/public/components/index_pattern_editor.tsx @@ -24,9 +24,8 @@ export const IndexPatternEditor = ({ defaultTypeIsRollup = false, requireTimestampField = false, }: IndexPatternEditorPropsWithServices) => { - const { - Provider: KibanaReactContextProvider, - } = createKibanaReactContext(services); + const { Provider: KibanaReactContextProvider } = + createKibanaReactContext(services); return ( diff --git a/src/plugins/index_pattern_editor/public/components/index_pattern_editor_flyout_content.tsx b/src/plugins/index_pattern_editor/public/components/index_pattern_editor_flyout_content.tsx index c4d8ed11fe7c2..707a0cedd39c8 100644 --- a/src/plugins/index_pattern_editor/public/components/index_pattern_editor_flyout_content.tsx +++ b/src/plugins/index_pattern_editor/public/components/index_pattern_editor_flyout_content.tsx @@ -126,10 +126,8 @@ const IndexPatternEditorFlyoutContentComponent = ({ const [isLoadingIndexPatterns, setIsLoadingIndexPatterns] = useState(true); const [existingIndexPatterns, setExistingIndexPatterns] = useState([]); const [rollupIndex, setRollupIndex] = useState(); - const [ - rollupIndicesCapabilities, - setRollupIndicesCapabilities, - ] = useState({}); + const [rollupIndicesCapabilities, setRollupIndicesCapabilities] = + useState({}); const [matchedIndices, setMatchedIndices] = useState({ allIndices: [], exactMatchedIndices: [], diff --git a/src/plugins/index_pattern_editor/public/components/preview_panel/indices_list/indices_list.test.tsx b/src/plugins/index_pattern_editor/public/components/preview_panel/indices_list/indices_list.test.tsx index 6d40861cb4e0f..c26ff17b2d8f1 100644 --- a/src/plugins/index_pattern_editor/public/components/preview_panel/indices_list/indices_list.test.tsx +++ b/src/plugins/index_pattern_editor/public/components/preview_panel/indices_list/indices_list.test.tsx @@ -11,10 +11,10 @@ import { IndicesList } from '../indices_list'; import { shallow } from 'enzyme'; import { MatchedItem } from '../../../types'; -const indices = ([ +const indices = [ { name: 'kibana', tags: [] }, { name: 'es', tags: [] }, -] as unknown) as MatchedItem[]; +] as unknown as MatchedItem[]; describe('IndicesList', () => { it('should render normally', () => { diff --git a/src/plugins/index_pattern_editor/public/components/preview_panel/status_message/status_message.test.tsx b/src/plugins/index_pattern_editor/public/components/preview_panel/status_message/status_message.test.tsx index 1bae9bdf3c666..c92a653c8c17d 100644 --- a/src/plugins/index_pattern_editor/public/components/preview_panel/status_message/status_message.test.tsx +++ b/src/plugins/index_pattern_editor/public/components/preview_panel/status_message/status_message.test.tsx @@ -16,12 +16,12 @@ const tagsPartial = { }; const matchedIndices = { - allIndices: ([ + allIndices: [ { name: 'kibana', ...tagsPartial }, { name: 'es', ...tagsPartial }, - ] as unknown) as MatchedItem[], + ] as unknown as MatchedItem[], exactMatchedIndices: [] as MatchedItem[], - partialMatchedIndices: ([{ name: 'kibana', ...tagsPartial }] as unknown) as MatchedItem[], + partialMatchedIndices: [{ name: 'kibana', ...tagsPartial }] as unknown as MatchedItem[], visibleIndices: [], }; @@ -42,7 +42,7 @@ describe('StatusMessage', () => { it('should render with exact matches', () => { const localMatchedIndices = { ...matchedIndices, - exactMatchedIndices: ([{ name: 'kibana', ...tagsPartial }] as unknown) as MatchedItem[], + exactMatchedIndices: [{ name: 'kibana', ...tagsPartial }] as unknown as MatchedItem[], }; const component = shallow( diff --git a/src/plugins/index_pattern_editor/public/lib/get_indices.ts b/src/plugins/index_pattern_editor/public/lib/get_indices.ts index 8d642174232ac..de93e2c177937 100644 --- a/src/plugins/index_pattern_editor/public/lib/get_indices.ts +++ b/src/plugins/index_pattern_editor/public/lib/get_indices.ts @@ -49,35 +49,34 @@ const getIndexTags = (isRollupIndex: (indexName: string) => boolean) => (indexNa ] : []; -export const searchResponseToArray = ( - getTags: (indexName: string) => Tag[], - showAllIndices: boolean -) => (response: IEsSearchResponse) => { - const { rawResponse } = response; - if (!rawResponse.aggregations) { - return []; - } else { - // @ts-expect-error @elastic/elasticsearch no way to declare a type for aggregation in the search response - return rawResponse.aggregations.indices.buckets - .map((bucket: { key: string }) => { - return bucket.key; - }) - .filter((indexName: string) => { - if (showAllIndices) { - return true; - } else { - return !indexName.startsWith('.'); - } - }) - .map((indexName: string) => { - return { - name: indexName, - tags: getTags(indexName), - item: {}, - }; - }); - } -}; +export const searchResponseToArray = + (getTags: (indexName: string) => Tag[], showAllIndices: boolean) => + (response: IEsSearchResponse) => { + const { rawResponse } = response; + if (!rawResponse.aggregations) { + return []; + } else { + // @ts-expect-error @elastic/elasticsearch no way to declare a type for aggregation in the search response + return rawResponse.aggregations.indices.buckets + .map((bucket: { key: string }) => { + return bucket.key; + }) + .filter((indexName: string) => { + if (showAllIndices) { + return true; + } else { + return !indexName.startsWith('.'); + } + }) + .map((indexName: string) => { + return { + name: indexName, + tags: getTags(indexName), + item: {}, + }; + }); + } + }; export const getIndicesViaSearch = async ({ pattern, diff --git a/src/plugins/index_pattern_editor/public/lib/get_matched_indices.test.ts b/src/plugins/index_pattern_editor/public/lib/get_matched_indices.test.ts index bb762e78cc893..b584532c61b52 100644 --- a/src/plugins/index_pattern_editor/public/lib/get_matched_indices.test.ts +++ b/src/plugins/index_pattern_editor/public/lib/get_matched_indices.test.ts @@ -36,12 +36,8 @@ const exactIndices = [ describe('getMatchedIndices', () => { it('should return all indices', () => { - const { - allIndices, - exactMatchedIndices, - partialMatchedIndices, - visibleIndices, - } = getMatchedIndices(indices, partialIndices, exactIndices, true); + const { allIndices, exactMatchedIndices, partialMatchedIndices, visibleIndices } = + getMatchedIndices(indices, partialIndices, exactIndices, true); expect(allIndices).toEqual([ { name: 'kibana', tags }, @@ -70,12 +66,8 @@ describe('getMatchedIndices', () => { }); it('should return all indices except for system indices', () => { - const { - allIndices, - exactMatchedIndices, - partialMatchedIndices, - visibleIndices, - } = getMatchedIndices(indices, partialIndices, exactIndices, false); + const { allIndices, exactMatchedIndices, partialMatchedIndices, visibleIndices } = + getMatchedIndices(indices, partialIndices, exactIndices, false); expect(allIndices).toEqual([ { name: 'kibana', tags }, diff --git a/src/plugins/index_pattern_editor/public/open_editor.tsx b/src/plugins/index_pattern_editor/public/open_editor.tsx index afeaff11f7403..290af83c94fea 100644 --- a/src/plugins/index_pattern_editor/public/open_editor.tsx +++ b/src/plugins/index_pattern_editor/public/open_editor.tsx @@ -26,69 +26,68 @@ interface Dependencies { searchClient: DataPublicPluginStart['search']['search']; } -export const getEditorOpener = ({ core, indexPatternService, searchClient }: Dependencies) => ( - options: IndexPatternEditorProps -): CloseEditor => { - const { uiSettings, overlays, docLinks, notifications, http, application } = core; - const { - Provider: KibanaReactContextProvider, - } = createKibanaReactContext({ - uiSettings, - docLinks, - http, - notifications, - application, - indexPatternService, - searchClient, - }); +export const getEditorOpener = + ({ core, indexPatternService, searchClient }: Dependencies) => + (options: IndexPatternEditorProps): CloseEditor => { + const { uiSettings, overlays, docLinks, notifications, http, application } = core; + const { Provider: KibanaReactContextProvider } = + createKibanaReactContext({ + uiSettings, + docLinks, + http, + notifications, + application, + indexPatternService, + searchClient, + }); - let overlayRef: OverlayRef | null = null; + let overlayRef: OverlayRef | null = null; - const openEditor = ({ - onSave, - onCancel = () => {}, - defaultTypeIsRollup = false, - requireTimestampField = false, - }: IndexPatternEditorProps): CloseEditor => { - const closeEditor = () => { - if (overlayRef) { - overlayRef.close(); - overlayRef = null; - } - }; + const openEditor = ({ + onSave, + onCancel = () => {}, + defaultTypeIsRollup = false, + requireTimestampField = false, + }: IndexPatternEditorProps): CloseEditor => { + const closeEditor = () => { + if (overlayRef) { + overlayRef.close(); + overlayRef = null; + } + }; - const onSaveIndexPattern = (indexPattern: IndexPattern) => { - closeEditor(); + const onSaveIndexPattern = (indexPattern: IndexPattern) => { + closeEditor(); - if (onSave) { - onSave(indexPattern); - } - }; + if (onSave) { + onSave(indexPattern); + } + }; - overlayRef = overlays.openFlyout( - toMountPoint( - - - { - closeEditor(); - onCancel(); - }} - defaultTypeIsRollup={defaultTypeIsRollup} - requireTimestampField={requireTimestampField} - /> - - - ), - { - hideCloseButton: true, - size: 'l', - } - ); + overlayRef = overlays.openFlyout( + toMountPoint( + + + { + closeEditor(); + onCancel(); + }} + defaultTypeIsRollup={defaultTypeIsRollup} + requireTimestampField={requireTimestampField} + /> + + + ), + { + hideCloseButton: true, + size: 'l', + } + ); - return closeEditor; - }; + return closeEditor; + }; - return openEditor(options); -}; + return openEditor(options); + }; diff --git a/src/plugins/index_pattern_editor/public/plugin.tsx b/src/plugins/index_pattern_editor/public/plugin.tsx index 246386c5800e4..f31abd76d7f5e 100644 --- a/src/plugins/index_pattern_editor/public/plugin.tsx +++ b/src/plugins/index_pattern_editor/public/plugin.tsx @@ -20,7 +20,8 @@ import { getEditorOpener } from './open_editor'; import { IndexPatternEditor } from './components/index_pattern_editor'; export class IndexPatternEditorPlugin - implements Plugin { + implements Plugin +{ public setup(core: CoreSetup, plugins: SetupPlugins): PluginSetup { return {}; } diff --git a/src/plugins/index_pattern_field_editor/__jest__/client_integration/helpers/setup_environment.tsx b/src/plugins/index_pattern_field_editor/__jest__/client_integration/helpers/setup_environment.tsx index d87b49d35c68e..a996a4ae512bc 100644 --- a/src/plugins/index_pattern_field_editor/__jest__/client_integration/helpers/setup_environment.tsx +++ b/src/plugins/index_pattern_field_editor/__jest__/client_integration/helpers/setup_environment.tsx @@ -59,64 +59,66 @@ export const fieldFormatsOptions = [{ id: 'upper', title: 'UpperCaseString' } as export const indexPatternNameForTest = 'testIndexPattern'; -export const WithFieldEditorDependencies = ( - Comp: FunctionComponent, - overridingDependencies?: Partial -) => (props: T) => { - // Setup mocks - (fieldFormats.getByFieldType as jest.MockedFunction< - typeof fieldFormats['getByFieldType'] - >).mockReturnValue(fieldFormatsOptions); - - (fieldFormats.getDefaultType as jest.MockedFunction< - typeof fieldFormats['getDefaultType'] - >).mockReturnValue({ id: 'testDefaultFormat', title: 'TestDefaultFormat' } as any); - - (fieldFormats.getInstance as jest.MockedFunction< - typeof fieldFormats['getInstance'] - >).mockImplementation((id: string) => { - if (id === 'upper') { - return { - convertObject: { - html(value: string = '') { - return `${value.toUpperCase()}`; +export const WithFieldEditorDependencies = + ( + Comp: FunctionComponent, + overridingDependencies?: Partial + ) => + (props: T) => { + // Setup mocks + ( + fieldFormats.getByFieldType as jest.MockedFunction + ).mockReturnValue(fieldFormatsOptions); + + ( + fieldFormats.getDefaultType as jest.MockedFunction + ).mockReturnValue({ id: 'testDefaultFormat', title: 'TestDefaultFormat' } as any); + + ( + fieldFormats.getInstance as jest.MockedFunction + ).mockImplementation((id: string) => { + if (id === 'upper') { + return { + convertObject: { + html(value: string = '') { + return `${value.toUpperCase()}`; + }, }, - }, - } as any; - } - }); - - const dependencies: Context = { - indexPattern: { - title: indexPatternNameForTest, - fields: { getAll: spyIndexPatternGetAllFields }, - } as any, - uiSettings: uiSettingsServiceMock.createStartContract(), - fieldTypeToProcess: 'runtime', - existingConcreteFields: [], - namesNotAllowed: [], - links: { - runtimePainless: 'https://elastic.co', - }, - services: { - notifications: notificationServiceMock.createStartContract(), - search, - api: apiService, - }, - fieldFormatEditors: { - getAll: () => [], - getById: () => undefined, - }, - fieldFormats, + } as any; + } + }); + + const dependencies: Context = { + indexPattern: { + title: indexPatternNameForTest, + fields: { getAll: spyIndexPatternGetAllFields }, + } as any, + uiSettings: uiSettingsServiceMock.createStartContract(), + fieldTypeToProcess: 'runtime', + existingConcreteFields: [], + namesNotAllowed: [], + links: { + runtimePainless: 'https://elastic.co', + }, + services: { + notifications: notificationServiceMock.createStartContract(), + search, + api: apiService, + }, + fieldFormatEditors: { + getAll: () => [], + getById: () => undefined, + }, + fieldFormats, + }; + + const mergedDependencies = merge({}, dependencies, overridingDependencies); + + return ( + + + + + + ); }; - - const mergedDependencies = merge({}, dependencies, overridingDependencies); - - return ( - - - - - - ); -}; diff --git a/src/plugins/index_pattern_field_editor/public/components/field_editor/field_editor.tsx b/src/plugins/index_pattern_field_editor/public/components/field_editor/field_editor.tsx index b46d587dc4146..11183d575e955 100644 --- a/src/plugins/index_pattern_field_editor/public/components/field_editor/field_editor.tsx +++ b/src/plugins/index_pattern_field_editor/public/components/field_editor/field_editor.tsx @@ -151,12 +151,8 @@ const formSerializer = (field: FieldFormInternal): Field => { }; const FieldEditorComponent = ({ field, onChange, onFormModifiedChange, syntaxError }: Props) => { - const { - links, - namesNotAllowed, - existingConcreteFields, - fieldTypeToProcess, - } = useFieldEditorContext(); + const { links, namesNotAllowed, existingConcreteFields, fieldTypeToProcess } = + useFieldEditorContext(); const { params: { update: updatePreviewParams }, panel: { setIsVisible: setIsPanelVisible }, diff --git a/src/plugins/index_pattern_field_editor/public/components/field_editor/lib.ts b/src/plugins/index_pattern_field_editor/public/components/field_editor/lib.ts index ba44682ba65e0..5b2e66c66fe39 100644 --- a/src/plugins/index_pattern_field_editor/public/components/field_editor/lib.ts +++ b/src/plugins/index_pattern_field_editor/public/components/field_editor/lib.ts @@ -13,20 +13,20 @@ import { Field } from '../../types'; import { schema } from './form_schema'; import type { Props } from './field_editor'; -const createNameNotAllowedValidator = ( - namesNotAllowed: string[] -): ValidationFunc<{}, string, string> => ({ value }) => { - if (namesNotAllowed.includes(value)) { - return { - message: i18n.translate( - 'indexPatternFieldEditor.editor.runtimeFieldsEditor.existRuntimeFieldNamesValidationErrorMessage', - { - defaultMessage: 'A field with this name already exists.', - } - ), - }; - } -}; +const createNameNotAllowedValidator = + (namesNotAllowed: string[]): ValidationFunc<{}, string, string> => + ({ value }) => { + if (namesNotAllowed.includes(value)) { + return { + message: i18n.translate( + 'indexPatternFieldEditor.editor.runtimeFieldsEditor.existRuntimeFieldNamesValidationErrorMessage', + { + defaultMessage: 'A field with this name already exists.', + } + ), + }; + } + }; /** * Dynamically retrieve the config for the "name" field, adding diff --git a/src/plugins/index_pattern_field_editor/public/components/field_editor_flyout_content_container.tsx b/src/plugins/index_pattern_field_editor/public/components/field_editor_flyout_content_container.tsx index cf2b29bbc97e8..ea981662c1ff7 100644 --- a/src/plugins/index_pattern_field_editor/public/components/field_editor_flyout_content_container.tsx +++ b/src/plugins/index_pattern_field_editor/public/components/field_editor_flyout_content_container.tsx @@ -103,10 +103,10 @@ export const FieldEditorFlyoutContentContainer = ({ return existing; }, [fields, field]); - const validateRuntimeField = useMemo(() => getRuntimeFieldValidator(indexPattern.title, search), [ - search, - indexPattern, - ]); + const validateRuntimeField = useMemo( + () => getRuntimeFieldValidator(indexPattern.title, search), + [search, indexPattern] + ); const services = useMemo( () => ({ diff --git a/src/plugins/index_pattern_field_editor/public/components/field_format_editor/editors/bytes/bytes.test.tsx b/src/plugins/index_pattern_field_editor/public/components/field_format_editor/editors/bytes/bytes.test.tsx index 219a51e421b44..afca37bd6f214 100644 --- a/src/plugins/index_pattern_field_editor/public/components/field_format_editor/editors/bytes/bytes.test.tsx +++ b/src/plugins/index_pattern_field_editor/public/components/field_format_editor/editors/bytes/bytes.test.tsx @@ -51,7 +51,7 @@ describe('BytesFormatEditor', () => { const component = shallow( { const component = shallowWithI18nProvider( { const component = shallowWithI18nProvider( { const component = shallowWithI18nProvider( { const component = shallow( { const component = shallow( { const component = shallow( { const component = shallow( { shallow( { const component = shallow( { const component = shallow( { const component = shallow( (input: number | Record) => - typeof input === 'number' ? input.toFixed(2) : JSON.stringify(input) + .mockImplementation( + () => (input: number | Record) => + typeof input === 'number' ? input.toFixed(2) : JSON.stringify(input) ), getParamDefaults: jest.fn().mockImplementation(() => { return { id: 'number', params: {} }; @@ -40,7 +41,7 @@ describe('HistogramFormatEditor', () => { const component = shallow( { const component = shallow( { const component = shallow( { const component = shallowWithI18nProvider( { const component = shallowWithI18nProvider( { const component = shallow( { const component = shallow( { const component = shallow( { }, }; - await input!.invoke('onChange')!((changeEvent as unknown) as ChangeEvent); + await input!.invoke('onChange')!(changeEvent as unknown as ChangeEvent); expect(onError).toBeCalledWith(changeEvent.target.validationMessage); expect(onChange).not.toBeCalled(); @@ -79,7 +79,7 @@ describe('TruncateFormatEditor', () => { const component = shallow( { }, }; onError.mockClear(); - await input!.invoke('onChange')!((changeEvent as unknown) as ChangeEvent); + await input!.invoke('onChange')!(changeEvent as unknown as ChangeEvent); expect(onError).not.toBeCalled(); expect(onChange).toBeCalledWith({ fieldLength: 123 }); }); diff --git a/src/plugins/index_pattern_field_editor/public/components/field_format_editor/editors/url/url.test.tsx b/src/plugins/index_pattern_field_editor/public/components/field_format_editor/editors/url/url.test.tsx index 79dc63230dc33..48d3a5dfea7c6 100644 --- a/src/plugins/index_pattern_field_editor/public/components/field_format_editor/editors/url/url.test.tsx +++ b/src/plugins/index_pattern_field_editor/public/components/field_format_editor/editors/url/url.test.tsx @@ -22,7 +22,7 @@ jest.mock('@elastic/eui/lib/services/accessibility', () => { }); const fieldType = 'string'; -const format = ({ +const format = { getConverterFor: jest .fn() .mockImplementation(() => (input: string) => `converted url for ${input}`), @@ -33,7 +33,7 @@ const format = ({ { kind: 'audio', text: 'Audio' }, ], }, -} as unknown) as FieldFormat; +} as unknown as FieldFormat; const formatParams = { openLinkInCurrentTab: true, urlTemplate: '', diff --git a/src/plugins/index_pattern_field_editor/public/components/flyout_panels/flyout_panel.tsx b/src/plugins/index_pattern_field_editor/public/components/flyout_panels/flyout_panel.tsx index 05f127c09c996..fcd09ce6a38d5 100644 --- a/src/plugins/index_pattern_field_editor/public/components/flyout_panels/flyout_panel.tsx +++ b/src/plugins/index_pattern_field_editor/public/components/flyout_panels/flyout_panel.tsx @@ -91,10 +91,10 @@ export const Panel: React.FC> = ({ }); }, []); - const ctx = useMemo(() => ({ registerContent, registerFooter }), [ - registerFooter, - registerContent, - ]); + const ctx = useMemo( + () => ({ registerContent, registerFooter }), + [registerFooter, registerContent] + ); useLayoutEffect(() => { const { removePanel, isFixedWidth } = addPanel({ width }); diff --git a/src/plugins/index_pattern_field_editor/public/components/preview/field_preview_context.tsx b/src/plugins/index_pattern_field_editor/public/components/preview/field_preview_context.tsx index e1fc4b05883f4..e49e0ef6885d0 100644 --- a/src/plugins/index_pattern_field_editor/public/components/preview/field_preview_context.tsx +++ b/src/plugins/index_pattern_field_editor/public/components/preview/field_preview_context.tsx @@ -159,10 +159,10 @@ export const FieldPreviewProvider: FunctionComponent = ({ children }) => { const [pinnedFields, setPinnedFields] = useState<{ [key: string]: boolean }>({}); const { documents, currentIdx } = clusterData; - const currentDocument: EsDocument | undefined = useMemo(() => documents[currentIdx], [ - documents, - currentIdx, - ]); + const currentDocument: EsDocument | undefined = useMemo( + () => documents[currentIdx], + [documents, currentIdx] + ); const currentDocIndex = currentDocument?._index; const currentDocId: string = currentDocument?._id ?? ''; @@ -180,9 +180,9 @@ export const FieldPreviewProvider: FunctionComponent = ({ children }) => { return false; } - const allParamsDefined = (['type', 'script', 'index', 'document'] as Array< - keyof Params - >).every((key) => Boolean(params[key])); + const allParamsDefined = (['type', 'script', 'index', 'document'] as Array).every( + (key) => Boolean(params[key]) + ); if (!allParamsDefined) { return false; diff --git a/src/plugins/index_pattern_field_editor/public/lib/runtime_field_validation.ts b/src/plugins/index_pattern_field_editor/public/lib/runtime_field_validation.ts index 789c4f7fa71fc..5f80b7823b6a0 100644 --- a/src/plugins/index_pattern_field_editor/public/lib/runtime_field_validation.ts +++ b/src/plugins/index_pattern_field_editor/public/lib/runtime_field_validation.ts @@ -92,28 +92,27 @@ export const parseEsError = ( * This is a temporary solution. In a future work we will have a dedicate * ES API to debug the script. */ -export const getRuntimeFieldValidator = ( - index: string, - searchService: DataPublicPluginStart['search'] -) => async (runtimeField: EsRuntimeField) => { - return await searchService - .search({ - params: { - index, - body: { - runtime_mappings: { - temp: runtimeField, - }, - size: 0, - query: { - match_none: {}, +export const getRuntimeFieldValidator = + (index: string, searchService: DataPublicPluginStart['search']) => + async (runtimeField: EsRuntimeField) => { + return await searchService + .search({ + params: { + index, + body: { + runtime_mappings: { + temp: runtimeField, + }, + size: 0, + query: { + match_none: {}, + }, }, }, - }, - }) - .toPromise() - .then(() => null) - .catch((e) => { - return parseEsError(e.attributes); - }); -}; + }) + .toPromise() + .then(() => null) + .catch((e) => { + return parseEsError(e.attributes); + }); + }; diff --git a/src/plugins/index_pattern_field_editor/public/open_delete_modal.tsx b/src/plugins/index_pattern_field_editor/public/open_delete_modal.tsx index 72dbb76863353..19ed7010ca3e7 100644 --- a/src/plugins/index_pattern_field_editor/public/open_delete_modal.tsx +++ b/src/plugins/index_pattern_field_editor/public/open_delete_modal.tsx @@ -35,54 +35,52 @@ interface Dependencies { usageCollection: UsageCollectionStart; } -export const getFieldDeleteModalOpener = ({ - core, - indexPatternService, - usageCollection, -}: Dependencies) => (options: OpenFieldDeleteModalOptions): CloseEditor => { - const { overlays, notifications } = core; +export const getFieldDeleteModalOpener = + ({ core, indexPatternService, usageCollection }: Dependencies) => + (options: OpenFieldDeleteModalOptions): CloseEditor => { + const { overlays, notifications } = core; - let overlayRef: OverlayRef | null = null; + let overlayRef: OverlayRef | null = null; - const openDeleteModal = ({ - onDelete, - fieldName, - ctx: { indexPattern }, - }: OpenFieldDeleteModalOptions): CloseEditor => { - const fieldsToDelete = Array.isArray(fieldName) ? fieldName : [fieldName]; - const closeModal = () => { - if (overlayRef) { - overlayRef.close(); - overlayRef = null; - } - }; + const openDeleteModal = ({ + onDelete, + fieldName, + ctx: { indexPattern }, + }: OpenFieldDeleteModalOptions): CloseEditor => { + const fieldsToDelete = Array.isArray(fieldName) ? fieldName : [fieldName]; + const closeModal = () => { + if (overlayRef) { + overlayRef.close(); + overlayRef = null; + } + }; - const onConfirmDelete = async () => { - closeModal(); + const onConfirmDelete = async () => { + closeModal(); - await removeFields(fieldsToDelete, indexPattern, { - indexPatternService, - usageCollection, - notifications, - }); + await removeFields(fieldsToDelete, indexPattern, { + indexPatternService, + usageCollection, + notifications, + }); - if (onDelete) { - onDelete(fieldsToDelete); - } - }; + if (onDelete) { + onDelete(fieldsToDelete); + } + }; - overlayRef = overlays.openModal( - toMountPoint( - - ) - ); + overlayRef = overlays.openModal( + toMountPoint( + + ) + ); - return closeModal; - }; + return closeModal; + }; - return openDeleteModal(options); -}; + return openDeleteModal(options); + }; diff --git a/src/plugins/index_pattern_field_editor/public/open_editor.tsx b/src/plugins/index_pattern_field_editor/public/open_editor.tsx index 946e666bf8205..19b5d1fde8315 100644 --- a/src/plugins/index_pattern_field_editor/public/open_editor.tsx +++ b/src/plugins/index_pattern_field_editor/public/open_editor.tsx @@ -43,116 +43,118 @@ interface Dependencies { usageCollection: UsageCollectionStart; } -export const getFieldEditorOpener = ({ - core, - indexPatternService, - fieldFormats, - fieldFormatEditors, - search, - usageCollection, - apiService, -}: Dependencies) => (options: OpenFieldEditorOptions): CloseEditor => { - const { uiSettings, overlays, docLinks, notifications } = core; - const { Provider: KibanaReactContextProvider } = createKibanaReactContext({ - uiSettings, - docLinks, - http: core.http, - }); - - let overlayRef: OverlayRef | null = null; - const canCloseValidator = { - current: () => true, - }; - - const onMounted = (args: { canCloseValidator: () => boolean }) => { - canCloseValidator.current = args.canCloseValidator; - }; - - const openEditor = ({ - onSave, - fieldName, - ctx: { indexPattern }, - }: OpenFieldEditorOptions): CloseEditor => { - const closeEditor = () => { - if (overlayRef) { - overlayRef.close(); - overlayRef = null; - } +export const getFieldEditorOpener = + ({ + core, + indexPatternService, + fieldFormats, + fieldFormatEditors, + search, + usageCollection, + apiService, + }: Dependencies) => + (options: OpenFieldEditorOptions): CloseEditor => { + const { uiSettings, overlays, docLinks, notifications } = core; + const { Provider: KibanaReactContextProvider } = createKibanaReactContext({ + uiSettings, + docLinks, + http: core.http, + }); + + let overlayRef: OverlayRef | null = null; + const canCloseValidator = { + current: () => true, }; - const onSaveField = (updatedField: IndexPatternField) => { - closeEditor(); + const onMounted = (args: { canCloseValidator: () => boolean }) => { + canCloseValidator.current = args.canCloseValidator; + }; - if (onSave) { - onSave(updatedField); + const openEditor = ({ + onSave, + fieldName, + ctx: { indexPattern }, + }: OpenFieldEditorOptions): CloseEditor => { + const closeEditor = () => { + if (overlayRef) { + overlayRef.close(); + overlayRef = null; + } + }; + + const onSaveField = (updatedField: IndexPatternField) => { + closeEditor(); + + if (onSave) { + onSave(updatedField); + } + }; + + const field = fieldName ? indexPattern.getFieldByName(fieldName) : undefined; + + if (fieldName && !field) { + const err = i18n.translate('indexPatternFieldEditor.noSuchFieldName', { + defaultMessage: "Field named '{fieldName}' not found on index pattern", + values: { fieldName }, + }); + notifications.toasts.addDanger(err); + return closeEditor; } - }; - const field = fieldName ? indexPattern.getFieldByName(fieldName) : undefined; + const isNewRuntimeField = !fieldName; + const isExistingRuntimeField = field && field.runtimeField && !field.isMapped; + const fieldTypeToProcess: InternalFieldType = + isNewRuntimeField || isExistingRuntimeField ? 'runtime' : 'concrete'; + + overlayRef = overlays.openFlyout( + toMountPoint( + + + + ), + { + className: euiFlyoutClassname, + maxWidth: 708, + size: 'l', + ownFocus: true, + hideCloseButton: true, + 'aria-label': isNewRuntimeField + ? i18n.translate('indexPatternFieldEditor.createField.flyoutAriaLabel', { + defaultMessage: 'Create field', + }) + : i18n.translate('indexPatternFieldEditor.editField.flyoutAriaLabel', { + defaultMessage: 'Edit {fieldName} field', + values: { + fieldName, + }, + }), + onClose: (flyout) => { + const canClose = canCloseValidator.current(); + if (canClose) { + flyout.close(); + } + }, + } + ); - if (fieldName && !field) { - const err = i18n.translate('indexPatternFieldEditor.noSuchFieldName', { - defaultMessage: "Field named '{fieldName}' not found on index pattern", - values: { fieldName }, - }); - notifications.toasts.addDanger(err); return closeEditor; - } - - const isNewRuntimeField = !fieldName; - const isExistingRuntimeField = field && field.runtimeField && !field.isMapped; - const fieldTypeToProcess: InternalFieldType = - isNewRuntimeField || isExistingRuntimeField ? 'runtime' : 'concrete'; - - overlayRef = overlays.openFlyout( - toMountPoint( - - - - ), - { - className: euiFlyoutClassname, - maxWidth: 708, - size: 'l', - ownFocus: true, - hideCloseButton: true, - 'aria-label': isNewRuntimeField - ? i18n.translate('indexPatternFieldEditor.createField.flyoutAriaLabel', { - defaultMessage: 'Create field', - }) - : i18n.translate('indexPatternFieldEditor.editField.flyoutAriaLabel', { - defaultMessage: 'Edit {fieldName} field', - values: { - fieldName, - }, - }), - onClose: (flyout) => { - const canClose = canCloseValidator.current(); - if (canClose) { - flyout.close(); - } - }, - } - ); + }; - return closeEditor; + return openEditor(options); }; - - return openEditor(options); -}; diff --git a/src/plugins/index_pattern_field_editor/public/plugin.test.tsx b/src/plugins/index_pattern_field_editor/public/plugin.test.tsx index 75bb1322d305e..de7a88b4c6d2a 100644 --- a/src/plugins/index_pattern_field_editor/public/plugin.test.tsx +++ b/src/plugins/index_pattern_field_editor/public/plugin.test.tsx @@ -112,7 +112,7 @@ describe('IndexPatternFieldEditorPlugin', () => { }; const { openDeleteModal } = await plugin.start(coreStartMocked, pluginStartMocked); - const indexPatternMock = ({ removeRuntimeField: removeFieldSpy } as unknown) as IndexPattern; + const indexPatternMock = { removeRuntimeField: removeFieldSpy } as unknown as IndexPattern; openDeleteModal({ onDelete: onDeleteSpy, diff --git a/src/plugins/index_pattern_field_editor/public/plugin.ts b/src/plugins/index_pattern_field_editor/public/plugin.ts index 4bf8dd5c1c4e8..c6d4aab1a95bf 100644 --- a/src/plugins/index_pattern_field_editor/public/plugin.ts +++ b/src/plugins/index_pattern_field_editor/public/plugin.ts @@ -16,7 +16,8 @@ import { getFieldDeleteModalOpener } from './open_delete_modal'; import { initApi } from './lib/api'; export class IndexPatternFieldEditorPlugin - implements Plugin { + implements Plugin +{ private readonly formatEditorService = new FormatEditorService(); public setup(core: CoreSetup, plugins: SetupPlugins): PluginSetup { diff --git a/src/plugins/index_pattern_field_editor/server/routes/field_preview.ts b/src/plugins/index_pattern_field_editor/server/routes/field_preview.ts index 238701904e22c..11ec1ca7d5666 100644 --- a/src/plugins/index_pattern_field_editor/server/routes/field_preview.ts +++ b/src/plugins/index_pattern_field_editor/server/routes/field_preview.ts @@ -54,7 +54,7 @@ export const registerFieldPreviewRoute = ({ router }: RouteDependencies): void = body, }); - const fieldValue = (response.body.result as any[]) as HttpResponsePayload; + const fieldValue = response.body.result as any[] as HttpResponsePayload; return res.ok({ body: { values: fieldValue } }); } catch (error) { diff --git a/src/plugins/index_pattern_management/public/components/edit_index_pattern/create_edit_field/create_edit_field.tsx b/src/plugins/index_pattern_management/public/components/edit_index_pattern/create_edit_field/create_edit_field.tsx index 0c0adc6dd5029..5b5c472ad235f 100644 --- a/src/plugins/index_pattern_management/public/components/edit_index_pattern/create_edit_field/create_edit_field.tsx +++ b/src/plugins/index_pattern_management/public/components/edit_index_pattern/create_edit_field/create_edit_field.tsx @@ -34,20 +34,16 @@ const newFieldPlaceholder = i18n.translate( export const CreateEditField = withRouter( ({ indexPattern, mode, fieldName, history }: CreateEditFieldProps) => { - const { - uiSettings, - chrome, - notifications, - data, - } = useKibana().services; + const { uiSettings, chrome, notifications, data } = + useKibana().services; const spec = mode === 'edit' && fieldName ? indexPattern.fields.getByName(fieldName)?.spec - : (({ + : ({ scripted: true, type: 'number', name: undefined, - } as unknown) as IndexPatternField); + } as unknown as IndexPatternField); const url = `/patterns/${indexPattern.id}`; diff --git a/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx b/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx index f23696ac6c7db..11961714e9f8a 100644 --- a/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx +++ b/src/plugins/index_pattern_management/public/components/edit_index_pattern/edit_index_pattern.tsx @@ -56,12 +56,8 @@ const confirmModalOptionsDelete = { export const EditIndexPattern = withRouter( ({ indexPattern, history, location }: EditIndexPatternProps) => { - const { - uiSettings, - overlays, - chrome, - data, - } = useKibana().services; + const { uiSettings, overlays, chrome, data } = + useKibana().services; const [fields, setFields] = useState(indexPattern.getNonScriptedFields()); const [conflictedFields, setConflictedFields] = useState( indexPattern.fields.getAll().filter((field) => field.type === 'conflict') diff --git a/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.test.tsx b/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.test.tsx index 2f288dc072914..4928e3026d151 100644 --- a/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.test.tsx +++ b/src/plugins/index_pattern_management/public/components/edit_index_pattern/indexed_fields_table/indexed_fields_table.test.tsx @@ -33,12 +33,12 @@ const helpers = { getFieldInfo, }; -const indexPattern = ({ +const indexPattern = { getNonScriptedFields: () => fields, getFormatterForFieldNoDefault: () => ({ params: () => ({}) }), -} as unknown) as IndexPattern; +} as unknown as IndexPattern; -const rollupIndexPattern = ({ +const rollupIndexPattern = { type: IndexPatternType.ROLLUP, typeMeta: { params: { @@ -64,12 +64,12 @@ const rollupIndexPattern = ({ }, getNonScriptedFields: () => fields, getFormatterForFieldNoDefault: () => ({ params: () => ({}) }), -} as unknown) as IndexPattern; +} as unknown as IndexPattern; const mockFieldToIndexPatternField = ( spec: Record ) => { - return new IndexPatternField((spec as unknown) as IndexPatternField['spec']); + return new IndexPatternField(spec as unknown as IndexPatternField['spec']); }; const fields = [ diff --git a/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/components/header/header.test.tsx b/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/components/header/header.test.tsx index 609769690dbae..99ffb4ada6369 100644 --- a/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/components/header/header.test.tsx +++ b/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/components/header/header.test.tsx @@ -22,9 +22,9 @@ describe('Header', () => { const component = mount( , { wrappingComponent: KibanaContextProvider, diff --git a/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/scripted_field_table.test.tsx b/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/scripted_field_table.test.tsx index 75da4dce74368..1f5220aa01c44 100644 --- a/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/scripted_field_table.test.tsx +++ b/src/plugins/index_pattern_management/public/components/edit_index_pattern/scripted_fields_table/scripted_field_table.test.tsx @@ -168,10 +168,10 @@ describe('ScriptedFieldsTable', () => { const component = shallow( , index: number = 0 ) => { - const columns = component.prop>>( - 'columns' - ); + const columns = + component.prop>>('columns'); return { render: columns[index].render as (...args: any) => ReactElement, }; diff --git a/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/tabs.tsx b/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/tabs.tsx index 6594d677884c2..e6c4edfc13e9c 100644 --- a/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/tabs.tsx +++ b/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/tabs.tsx @@ -80,11 +80,8 @@ export function Tabs({ location, refreshFields, }: TabsProps) { - const { - uiSettings, - docLinks, - indexPatternFieldEditor, - } = useKibana().services; + const { uiSettings, docLinks, indexPatternFieldEditor } = + useKibana().services; const [fieldFilter, setFieldFilter] = useState(''); const [indexedFieldTypeFilter, setIndexedFieldTypeFilter] = useState(''); const [scriptedFieldLanguageFilter, setScriptedFieldLanguageFilter] = useState(''); @@ -304,15 +301,11 @@ export function Tabs({ const [selectedTabId, setSelectedTabId] = useState(euiTabs[0].id); useEffect(() => { - const { - startSyncingState, - stopSyncingState, - setCurrentTab, - getCurrentTab, - } = createEditIndexPatternPageStateContainer({ - useHashedUrl: uiSettings.get('state:storeInSessionStorage'), - defaultTab: TAB_INDEXED_FIELDS, - }); + const { startSyncingState, stopSyncingState, setCurrentTab, getCurrentTab } = + createEditIndexPatternPageStateContainer({ + useHashedUrl: uiSettings.get('state:storeInSessionStorage'), + defaultTab: TAB_INDEXED_FIELDS, + }); startSyncingState(); setSyncingStateFunc({ diff --git a/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/utils.test.ts b/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/utils.test.ts index f52fdaf1af631..6bc51c1d67db5 100644 --- a/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/utils.test.ts +++ b/src/plugins/index_pattern_management/public/components/edit_index_pattern/tabs/utils.test.ts @@ -12,8 +12,8 @@ import { IndexPatternField, IndexPattern } from '../../../../../data/public'; test('getPath() should encode "fieldName"', () => { expect( getPath( - ({ name: 'Memory: Allocated Bytes/sec' } as unknown) as IndexPatternField, - ({ id: 'id' } as unknown) as IndexPattern + { name: 'Memory: Allocated Bytes/sec' } as unknown as IndexPatternField, + { id: 'id' } as unknown as IndexPattern ) ).toMatchInlineSnapshot(`"/patterns/id/field/Memory%3A%20Allocated%20Bytes%2Fsec"`); }); diff --git a/src/plugins/index_pattern_management/public/components/field_editor/components/scripting_help/help_flyout.test.tsx b/src/plugins/index_pattern_management/public/components/field_editor/components/scripting_help/help_flyout.test.tsx index 79bd2fdf353e4..3eeb97351eb39 100644 --- a/src/plugins/index_pattern_management/public/components/field_editor/components/scripting_help/help_flyout.test.tsx +++ b/src/plugins/index_pattern_management/public/components/field_editor/components/scripting_help/help_flyout.test.tsx @@ -30,7 +30,7 @@ describe('ScriptingHelpFlyout', () => { isVisible={true} indexPattern={indexPatternMock} lang="painless" - executeScript={((() => {}) as unknown) as ExecuteScript} + executeScript={(() => {}) as unknown as ExecuteScript} onClose={() => {}} /> ); @@ -44,7 +44,7 @@ describe('ScriptingHelpFlyout', () => { isVisible={true} indexPattern={indexPatternMock} lang="painless" - executeScript={((() => {}) as unknown) as ExecuteScript} + executeScript={(() => {}) as unknown as ExecuteScript} onClose={() => {}} /> ); diff --git a/src/plugins/index_pattern_management/public/components/field_editor/components/scripting_help/scripting_syntax.tsx b/src/plugins/index_pattern_management/public/components/field_editor/components/scripting_help/scripting_syntax.tsx index 47162d59d883e..779dc7822379f 100644 --- a/src/plugins/index_pattern_management/public/components/field_editor/components/scripting_help/scripting_syntax.tsx +++ b/src/plugins/index_pattern_management/public/components/field_editor/components/scripting_help/scripting_syntax.tsx @@ -14,8 +14,8 @@ import { useKibana } from '../../../../../../../plugins/kibana_react/public'; import { IndexPatternManagmentContext } from '../../../../types'; export const ScriptingSyntax = () => { - const docLinksScriptedFields = useKibana().services.docLinks?.links - .scriptedFields; + const docLinksScriptedFields = + useKibana().services.docLinks?.links.scriptedFields; return ( diff --git a/src/plugins/index_pattern_management/public/components/field_editor/field_editor.test.tsx b/src/plugins/index_pattern_management/public/components/field_editor/field_editor.test.tsx index 18c749d448da8..584662acbe62f 100644 --- a/src/plugins/index_pattern_management/public/components/field_editor/field_editor.test.tsx +++ b/src/plugins/index_pattern_management/public/components/field_editor/field_editor.test.tsx @@ -97,22 +97,22 @@ describe('FieldEditor', () => { const mockContext = mockManagementPlugin.createIndexPatternManagmentContext(); mockContext.data.fieldFormats.getDefaultType = jest.fn( - () => (({} as unknown) as FieldFormatInstanceType) + () => ({} as unknown as FieldFormatInstanceType) ); mockContext.data.fieldFormats.getByFieldType = jest.fn((fieldType) => { if (fieldType === 'number') { - return [({} as unknown) as FieldFormatInstanceType]; + return [{} as unknown as FieldFormatInstanceType]; } else { return []; } }); beforeEach(() => { - indexPattern = ({ + indexPattern = { fields, getFormatterForField: () => ({ params: () => ({}) }), getFormatterForFieldNoDefault: () => ({ params: () => ({}) }), - } as unknown) as IndexPattern; + } as unknown as IndexPattern; }); it('should render create new scripted field correctly', async () => { @@ -120,7 +120,7 @@ describe('FieldEditor', () => { FieldEditor, { indexPattern, - spec: (field as unknown) as IndexPatternField, + spec: field as unknown as IndexPatternField, services, }, mockContext @@ -137,19 +137,19 @@ describe('FieldEditor', () => { name: 'test', script: 'doc.test.value', }; - fieldList.push((testField as unknown) as IndexPatternField); + fieldList.push(testField as unknown as IndexPatternField); indexPattern.fields.getByName = (name) => { const flds = { [testField.name]: testField, }; - return (flds[name] as unknown) as IndexPatternField; + return flds[name] as unknown as IndexPatternField; }; const component = createComponentWithContext( FieldEditor, { indexPattern, - spec: (testField as unknown) as IndexPatternField, + spec: testField as unknown as IndexPatternField, services, }, mockContext @@ -161,13 +161,13 @@ describe('FieldEditor', () => { }); it('should display and update a custom label correctly', async () => { - let testField = ({ + let testField = { name: 'test', format: new Format(), lang: undefined, type: 'string', customLabel: 'Test', - } as unknown) as IndexPatternField; + } as unknown as IndexPatternField; fieldList.push(testField); indexPattern.fields.getByName = (name) => { const flds = { @@ -179,7 +179,7 @@ describe('FieldEditor', () => { ...indexPattern.fields, ...{ update: (fld) => { - testField = (fld as unknown) as IndexPatternField; + testField = fld as unknown as IndexPatternField; }, add: jest.fn(), }, @@ -191,12 +191,12 @@ describe('FieldEditor', () => { FieldEditor, { indexPattern, - spec: (testField as unknown) as IndexPatternField, + spec: testField as unknown as IndexPatternField, services: { redirectAway: () => {}, - indexPatternService: ({ + indexPatternService: { updateSavedObject: jest.fn(() => Promise.resolve()), - } as unknown) as IndexPatternsService, + } as unknown as IndexPatternsService, }, }, mockContext @@ -221,19 +221,19 @@ describe('FieldEditor', () => { script: 'doc.test.value', lang: 'testlang', }; - fieldList.push((testField as unknown) as IndexPatternField); + fieldList.push(testField as unknown as IndexPatternField); indexPattern.fields.getByName = (name) => { const flds = { [testField.name]: testField, }; - return (flds[name] as unknown) as IndexPatternField; + return flds[name] as unknown as IndexPatternField; }; const component = createComponentWithContext( FieldEditor, { indexPattern, - spec: (testField as unknown) as IndexPatternField, + spec: testField as unknown as IndexPatternField, services, }, mockContext @@ -250,7 +250,7 @@ describe('FieldEditor', () => { FieldEditor, { indexPattern, - spec: (testField as unknown) as IndexPatternField, + spec: testField as unknown as IndexPatternField, services, }, mockContext @@ -275,7 +275,7 @@ describe('FieldEditor', () => { FieldEditor, { indexPattern, - spec: (testField as unknown) as IndexPatternField, + spec: testField as unknown as IndexPatternField, services, }, mockContext diff --git a/src/plugins/index_pattern_management/public/components/utils.test.ts b/src/plugins/index_pattern_management/public/components/utils.test.ts index 6215a8dd15c4c..5e36d1bbc907f 100644 --- a/src/plugins/index_pattern_management/public/components/utils.test.ts +++ b/src/plugins/index_pattern_management/public/components/utils.test.ts @@ -8,7 +8,7 @@ import { IndexPatternsContract } from 'src/plugins/data/public'; import { getIndexPatterns } from './utils'; -const indexPatternContractMock = ({ +const indexPatternContractMock = { getIdsWithTitle: jest.fn().mockReturnValue( Promise.resolve([ { @@ -22,7 +22,7 @@ const indexPatternContractMock = ({ ]) ), get: jest.fn().mockReturnValue(Promise.resolve({})), -} as unknown) as jest.Mocked; +} as unknown as jest.Mocked; test('getting index patterns', async () => { const indexPatterns = await getIndexPatterns('test', indexPatternContractMock); diff --git a/src/plugins/index_pattern_management/public/mocks.ts b/src/plugins/index_pattern_management/public/mocks.ts index 5bcca1f09029f..ec71c5fa3264e 100644 --- a/src/plugins/index_pattern_management/public/mocks.ts +++ b/src/plugins/index_pattern_management/public/mocks.ts @@ -71,8 +71,8 @@ const createIndexPatternManagmentContext = (): { indexPatternManagementStart: createStartContract(), setBreadcrumbs: () => {}, fieldFormatEditors: indexPatternFieldEditor.fieldFormatEditors, - IndexPatternEditor: indexPatternEditorPluginMock.createStartContract() - .IndexPatternEditorComponent, + IndexPatternEditor: + indexPatternEditorPluginMock.createStartContract().IndexPatternEditorComponent, }; }; diff --git a/src/plugins/index_pattern_management/public/plugin.ts b/src/plugins/index_pattern_management/public/plugin.ts index 9527a04a6b0e2..ac0e794c2c2ce 100644 --- a/src/plugins/index_pattern_management/public/plugin.ts +++ b/src/plugins/index_pattern_management/public/plugin.ts @@ -45,7 +45,8 @@ export class IndexPatternManagementPlugin IndexPatternManagementStart, IndexPatternManagementSetupDependencies, IndexPatternManagementStartDependencies - > { + > +{ constructor(initializerContext: PluginInitializerContext) {} public setup( diff --git a/src/plugins/index_pattern_management/public/types.ts b/src/plugins/index_pattern_management/public/types.ts index b2c77fccf90b9..7f21f1b82a059 100644 --- a/src/plugins/index_pattern_management/public/types.ts +++ b/src/plugins/index_pattern_management/public/types.ts @@ -38,4 +38,5 @@ export interface IndexPatternManagmentContext { IndexPatternEditor: IndexPatternEditorStart['IndexPatternEditorComponent']; } -export type IndexPatternManagmentContextValue = KibanaReactContextValue; +export type IndexPatternManagmentContextValue = + KibanaReactContextValue; diff --git a/src/plugins/index_pattern_management/server/routes/preview_scripted_field.test.ts b/src/plugins/index_pattern_management/server/routes/preview_scripted_field.test.ts index 1343b20365a44..19e42c856fba5 100644 --- a/src/plugins/index_pattern_management/server/routes/preview_scripted_field.test.ts +++ b/src/plugins/index_pattern_management/server/routes/preview_scripted_field.test.ts @@ -42,7 +42,7 @@ describe('preview_scripted_field route', () => { const mockRouter = mockCoreSetup.http.createRouter.mock.results[0].value; const handler = mockRouter.post.mock.calls[0][1]; - await handler((mockContext as unknown) as RequestHandlerContext, mockRequest, mockResponse); + await handler(mockContext as unknown as RequestHandlerContext, mockRequest, mockResponse); expect(mockClient.search.mock.calls[0][0]).toMatchInlineSnapshot(` Object { @@ -98,7 +98,7 @@ describe('preview_scripted_field route', () => { const mockRouter = mockCoreSetup.http.createRouter.mock.results[0].value; const handler = mockRouter.post.mock.calls[0][1]; - await handler((mockContext as unknown) as RequestHandlerContext, mockRequest, mockResponse); + await handler(mockContext as unknown as RequestHandlerContext, mockRequest, mockResponse); expect(mockClient.search.mock.calls[0][0]).toMatchInlineSnapshot(` Object { @@ -152,7 +152,7 @@ describe('preview_scripted_field route', () => { const mockRouter = mockCoreSetup.http.createRouter.mock.results[0].value; const handler = mockRouter.post.mock.calls[0][1]; - await handler((mockContext as unknown) as RequestHandlerContext, mockRequest, mockResponse); + await handler(mockContext as unknown as RequestHandlerContext, mockRequest, mockResponse); expect(mockClient.search).toBeCalled(); expect(mockResponse.customError).toBeCalled(); diff --git a/src/plugins/input_control_vis/public/components/editor/controls_tab.test.tsx b/src/plugins/input_control_vis/public/components/editor/controls_tab.test.tsx index d84ad6b38b244..3257b7dab0825 100644 --- a/src/plugins/input_control_vis/public/components/editor/controls_tab.test.tsx +++ b/src/plugins/input_control_vis/public/components/editor/controls_tab.test.tsx @@ -19,9 +19,9 @@ const indexPatternsMock = { let props: ControlsTabProps; beforeEach(() => { - props = ({ + props = { deps: getDepsMock(), - vis: ({ + vis: { API: { indexPatterns: indexPatternsMock, }, @@ -33,7 +33,7 @@ beforeEach(() => { requiresSearch: false, hidden: false, }, - } as unknown) as Vis, + } as unknown as Vis, stateParams: { controls: [ { @@ -65,7 +65,7 @@ beforeEach(() => { }, setValue: jest.fn(), intl: null as any, - } as unknown) as ControlsTabProps; + } as unknown as ControlsTabProps; }); test('renders ControlsTab', () => { diff --git a/src/plugins/input_control_vis/public/components/editor/index.tsx b/src/plugins/input_control_vis/public/components/editor/index.tsx index 876010af74939..f34bdcf7b63ec 100644 --- a/src/plugins/input_control_vis/public/components/editor/index.tsx +++ b/src/plugins/input_control_vis/public/components/editor/index.tsx @@ -14,9 +14,9 @@ import { InputControlVisParams } from '../../types'; const ControlsTab = lazy(() => import('./controls_tab')); const OptionsTab = lazy(() => import('./options_tab')); -export const getControlsTab = (deps: InputControlVisDependencies) => ( - props: VisEditorOptionsProps -) => ; +export const getControlsTab = + (deps: InputControlVisDependencies) => (props: VisEditorOptionsProps) => + ; export const OptionsTabLazy = (props: VisEditorOptionsProps) => ( diff --git a/src/plugins/input_control_vis/public/components/editor/options_tab.test.tsx b/src/plugins/input_control_vis/public/components/editor/options_tab.test.tsx index 5d4b1f3a8ef4c..8b886134c1173 100644 --- a/src/plugins/input_control_vis/public/components/editor/options_tab.test.tsx +++ b/src/plugins/input_control_vis/public/components/editor/options_tab.test.tsx @@ -17,7 +17,7 @@ describe('OptionsTab', () => { let props: OptionsTabProps; beforeEach(() => { - props = ({ + props = { vis: {} as Vis, stateParams: { updateFiltersOnChange: false, @@ -25,7 +25,7 @@ describe('OptionsTab', () => { pinFilters: false, }, setValue: jest.fn(), - } as unknown) as OptionsTabProps; + } as unknown as OptionsTabProps; }); it('should renders OptionsTab', () => { diff --git a/src/plugins/input_control_vis/public/control/filter_manager/phrase_filter_manager.test.ts b/src/plugins/input_control_vis/public/control/filter_manager/phrase_filter_manager.test.ts index c9f802666dab7..14a616e8a0dbe 100644 --- a/src/plugins/input_control_vis/public/control/filter_manager/phrase_filter_manager.test.ts +++ b/src/plugins/input_control_vis/public/control/filter_manager/phrase_filter_manager.test.ts @@ -36,9 +36,9 @@ describe('PhraseFilterManager', function () { }, }, } as IndexPattern; - const indexPatternsServiceMock = ({ + const indexPatternsServiceMock = { get: jest.fn().mockReturnValue(Promise.resolve(indexPatternMock)), - } as unknown) as jest.Mocked; + } as unknown as jest.Mocked; const queryFilterMock: QueryFilterManager = {} as QueryFilterManager; let filterManager: PhraseFilterManager; beforeEach(async () => { diff --git a/src/plugins/input_control_vis/public/control/filter_manager/range_filter_manager.test.ts b/src/plugins/input_control_vis/public/control/filter_manager/range_filter_manager.test.ts index ced93e6ad319d..f524ac2a0d7ee 100644 --- a/src/plugins/input_control_vis/public/control/filter_manager/range_filter_manager.test.ts +++ b/src/plugins/input_control_vis/public/control/filter_manager/range_filter_manager.test.ts @@ -35,9 +35,9 @@ describe('RangeFilterManager', function () { }, }, } as IndexPattern; - const indexPatternsServiceMock = ({ + const indexPatternsServiceMock = { get: jest.fn().mockReturnValue(Promise.resolve(indexPatternMock)), - } as unknown) as jest.Mocked; + } as unknown as jest.Mocked; const queryFilterMock: QueryFilterManager = {} as QueryFilterManager; let filterManager: RangeFilterManager; beforeEach(async () => { diff --git a/src/plugins/inspector/public/ui/inspector_panel.test.tsx b/src/plugins/inspector/public/ui/inspector_panel.test.tsx index 879cd3d181951..03b71219b1e9f 100644 --- a/src/plugins/inspector/public/ui/inspector_panel.test.tsx +++ b/src/plugins/inspector/public/ui/inspector_panel.test.tsx @@ -18,12 +18,12 @@ import { applicationServiceMock } from '../../../../core/public/mocks'; describe('InspectorPanel', () => { let adapters: Adapters; let views: InspectorViewDescription[]; - const dependencies = ({ + const dependencies = { application: applicationServiceMock.createStartContract(), http: {}, share: {}, uiSettings: {}, - } as unknown) as { + } as unknown as { application: ApplicationStart; http: HttpSetup; share: SharePluginStart; diff --git a/src/plugins/interactive_setup/public/app.tsx b/src/plugins/interactive_setup/public/app.tsx index da1318d84cf03..0f1c1b04d7c90 100644 --- a/src/plugins/interactive_setup/public/app.tsx +++ b/src/plugins/interactive_setup/public/app.tsx @@ -26,9 +26,8 @@ export interface AppProps { export const App: FunctionComponent = ({ onSuccess }) => { const [page, setPage] = useState<'token' | 'manual' | 'success'>('token'); - const [cluster, setCluster] = useState< - Omit - >(); + const [cluster, setCluster] = + useState>(); return (
diff --git a/src/plugins/interactive_setup/public/enrollment_token_form.test.tsx b/src/plugins/interactive_setup/public/enrollment_token_form.test.tsx index d2f08eac1fac5..0f64c47b7355e 100644 --- a/src/plugins/interactive_setup/public/enrollment_token_form.test.tsx +++ b/src/plugins/interactive_setup/public/enrollment_token_form.test.tsx @@ -22,8 +22,7 @@ jest.mock('@elastic/eui/lib/services/accessibility/html_id_generator', () => ({ const token: EnrollmentToken = { ver: '8.0.0', adr: ['localhost:9200'], - fgr: - 'AA:C8:2C:2E:09:58:F4:FE:A1:D2:AB:7F:13:70:C2:7D:EB:FD:A2:23:88:13:E4:DA:3A:D0:59:D0:09:00:07:36', + fgr: 'AA:C8:2C:2E:09:58:F4:FE:A1:D2:AB:7F:13:70:C2:7D:EB:FD:A2:23:88:13:E4:DA:3A:D0:59:D0:09:00:07:36', key: 'JH-36HoBo4EYIoVhHh2F:uEo4dksARMq_BSHaAHUr8Q', }; @@ -84,8 +83,7 @@ describe('decodeEnrollmentToken', () => { it('should decode a valid token', () => { expect(decodeEnrollmentToken(btoa(JSON.stringify(token)))).toEqual({ adr: ['https://localhost:9200'], - fgr: - 'AA:C8:2C:2E:09:58:F4:FE:A1:D2:AB:7F:13:70:C2:7D:EB:FD:A2:23:88:13:E4:DA:3A:D0:59:D0:09:00:07:36', + fgr: 'AA:C8:2C:2E:09:58:F4:FE:A1:D2:AB:7F:13:70:C2:7D:EB:FD:A2:23:88:13:E4:DA:3A:D0:59:D0:09:00:07:36', key: 'SkgtMzZIb0JvNEVZSW9WaEhoMkY6dUVvNGRrc0FSTXFfQlNIYUFIVXI4UQ==', ver: '8.0.0', }); diff --git a/src/plugins/interactive_setup/server/elasticsearch_service.test.ts b/src/plugins/interactive_setup/server/elasticsearch_service.test.ts index f15e8e41956e2..9baed65db299d 100644 --- a/src/plugins/interactive_setup/server/elasticsearch_service.test.ts +++ b/src/plugins/interactive_setup/server/elasticsearch_service.test.ts @@ -385,7 +385,8 @@ describe('ElasticsearchService', () => { it('iterates through all provided hosts until find an accessible one', async () => { mockElasticsearchPreboot.createClient.mockClear(); - const mockHostOneEnrollScopedClusterClient = elasticsearchServiceMock.createScopedClusterClient(); + const mockHostOneEnrollScopedClusterClient = + elasticsearchServiceMock.createScopedClusterClient(); mockHostOneEnrollScopedClusterClient.asCurrentUser.transport.request.mockRejectedValue( new errors.ConnectionError( 'some-message', @@ -393,7 +394,8 @@ describe('ElasticsearchService', () => { ) ); - const mockHostTwoEnrollScopedClusterClient = elasticsearchServiceMock.createScopedClusterClient(); + const mockHostTwoEnrollScopedClusterClient = + elasticsearchServiceMock.createScopedClusterClient(); mockHostTwoEnrollScopedClusterClient.asCurrentUser.transport.request.mockResolvedValue( interactiveSetupMock.createApiResponse({ statusCode: 200, @@ -588,7 +590,7 @@ some weird+ca/with ) ); - tlsConnectMock.mockReturnValue(({ + tlsConnectMock.mockReturnValue({ once: jest.fn((event, fn) => { if (event === 'secureConnect') { fn(); @@ -596,7 +598,7 @@ some weird+ca/with }), getPeerCertificate: jest.fn().mockReturnValue({ raw: Buffer.from('cert') }), destroy: jest.fn(), - } as unknown) as tls.TLSSocket); + } as unknown as tls.TLSSocket); await expect(setupContract.ping('https://localhost:9200')).resolves.toEqual({ authRequired: true, @@ -621,13 +623,13 @@ some weird+ca/with ) ); - tlsConnectMock.mockReturnValue(({ + tlsConnectMock.mockReturnValue({ once: jest.fn((event, fn) => { if (event === 'error') { fn(new Error('some-message')); } }), - } as unknown) as tls.TLSSocket); + } as unknown as tls.TLSSocket); await expect(setupContract.ping('https://localhost:9200')).rejects.toMatchInlineSnapshot( `[Error: some-message]` diff --git a/src/plugins/interactive_setup/server/elasticsearch_service.ts b/src/plugins/interactive_setup/server/elasticsearch_service.ts index 1b1b2781f1c7e..99cf0950eec72 100644 --- a/src/plugins/interactive_setup/server/elasticsearch_service.ts +++ b/src/plugins/interactive_setup/server/elasticsearch_service.ts @@ -119,9 +119,8 @@ export class ElasticsearchService { elasticsearch, connectionCheckInterval, }: ElasticsearchServiceSetupDeps): ElasticsearchServiceSetup { - const connectionStatusClient = (this.connectionStatusClient = elasticsearch.createClient( - 'connectionStatus' - )); + const connectionStatusClient = (this.connectionStatusClient = + elasticsearch.createClient('connectionStatus')); return { connectionStatus$: timer(0, connectionCheckInterval.asMilliseconds()).pipe( diff --git a/src/plugins/interactive_setup/server/routes/configure.test.ts b/src/plugins/interactive_setup/server/routes/configure.test.ts index ac4507331db4b..be264655c8bf9 100644 --- a/src/plugins/interactive_setup/server/routes/configure.test.ts +++ b/src/plugins/interactive_setup/server/routes/configure.test.ts @@ -26,7 +26,7 @@ describe('Configure routes', () => { mockRouteParams = routeDefinitionParamsMock.create(); router = mockRouteParams.router; - mockContext = ({} as unknown) as RequestHandlerContext; + mockContext = {} as unknown as RequestHandlerContext; defineConfigureRoute(mockRouteParams); }); diff --git a/src/plugins/interactive_setup/server/routes/enroll.test.ts b/src/plugins/interactive_setup/server/routes/enroll.test.ts index 859c3fb70ce83..c3552b65fcbbc 100644 --- a/src/plugins/interactive_setup/server/routes/enroll.test.ts +++ b/src/plugins/interactive_setup/server/routes/enroll.test.ts @@ -26,7 +26,7 @@ describe('Enroll routes', () => { mockRouteParams = routeDefinitionParamsMock.create(); router = mockRouteParams.router; - mockContext = ({} as unknown) as RequestHandlerContext; + mockContext = {} as unknown as RequestHandlerContext; defineEnrollRoutes(mockRouteParams); }); diff --git a/src/plugins/interactive_setup/server/routes/ping.test.ts b/src/plugins/interactive_setup/server/routes/ping.test.ts index 295ad3b612992..15c9d5ae963c8 100644 --- a/src/plugins/interactive_setup/server/routes/ping.test.ts +++ b/src/plugins/interactive_setup/server/routes/ping.test.ts @@ -25,7 +25,7 @@ describe('Configure routes', () => { mockRouteParams = routeDefinitionParamsMock.create(); router = mockRouteParams.router; - mockContext = ({} as unknown) as RequestHandlerContext; + mockContext = {} as unknown as RequestHandlerContext; definePingRoute(mockRouteParams); }); diff --git a/src/plugins/interactive_setup/server/routes/verify.test.ts b/src/plugins/interactive_setup/server/routes/verify.test.ts index ff8a7753320c2..05858dce0f710 100644 --- a/src/plugins/interactive_setup/server/routes/verify.test.ts +++ b/src/plugins/interactive_setup/server/routes/verify.test.ts @@ -22,7 +22,7 @@ describe('Configure routes', () => { mockRouteParams = routeDefinitionParamsMock.create(); router = mockRouteParams.router; - mockContext = ({} as unknown) as RequestHandlerContext; + mockContext = {} as unknown as RequestHandlerContext; defineVerifyRoute(mockRouteParams); }); diff --git a/src/plugins/kibana_legacy/public/angular/angular_config.tsx b/src/plugins/kibana_legacy/public/angular/angular_config.tsx index 48ee6d2db269e..7eebc90001699 100644 --- a/src/plugins/kibana_legacy/public/angular/angular_config.tsx +++ b/src/plugins/kibana_legacy/public/angular/angular_config.tsx @@ -168,149 +168,143 @@ export const $setupXsrfRequestInterceptor = (version: string) => { * active $http requests on each digest loop and expose the count to * the core.loadingCount api */ -const capture$httpLoadingCount = (newPlatform: CoreStart) => ( - $rootScope: IRootScopeService, - $http: IHttpService -) => { - newPlatform.http.addLoadingCountSource( - new Rx.Observable((observer) => { - const unwatch = $rootScope.$watch(() => { - const reqs = $http.pendingRequests || []; - observer.next(reqs.filter((req) => !isSystemApiRequest(req)).length); - }); - - return unwatch; - }) - ); -}; +const capture$httpLoadingCount = + (newPlatform: CoreStart) => ($rootScope: IRootScopeService, $http: IHttpService) => { + newPlatform.http.addLoadingCountSource( + new Rx.Observable((observer) => { + const unwatch = $rootScope.$watch(() => { + const reqs = $http.pendingRequests || []; + observer.next(reqs.filter((req) => !isSystemApiRequest(req)).length); + }); + + return unwatch; + }) + ); + }; /** * integrates with angular to automatically redirect to home if required * capability is not met */ -const $setupUICapabilityRedirect = (newPlatform: CoreStart) => ( - $rootScope: IRootScopeService, - $injector: any -) => { - const isKibanaAppRoute = window.location.pathname.endsWith('/app/kibana'); - // this feature only works within kibana app for now after everything is - // switched to the application service, this can be changed to handle all - // apps. - if (!isKibanaAppRoute) { - return; - } - $rootScope.$on( - '$routeChangeStart', - (event, { $$route: route }: { $$route?: RouteConfiguration } = {}) => { - if (!route || !route.requireUICapability) { - return; - } - - if (!get(newPlatform.application.capabilities, route.requireUICapability)) { - $injector.get('$location').url('/home'); - event.preventDefault(); - } +const $setupUICapabilityRedirect = + (newPlatform: CoreStart) => ($rootScope: IRootScopeService, $injector: any) => { + const isKibanaAppRoute = window.location.pathname.endsWith('/app/kibana'); + // this feature only works within kibana app for now after everything is + // switched to the application service, this can be changed to handle all + // apps. + if (!isKibanaAppRoute) { + return; } - ); -}; + $rootScope.$on( + '$routeChangeStart', + (event, { $$route: route }: { $$route?: RouteConfiguration } = {}) => { + if (!route || !route.requireUICapability) { + return; + } + + if (!get(newPlatform.application.capabilities, route.requireUICapability)) { + $injector.get('$location').url('/home'); + event.preventDefault(); + } + } + ); + }; /** * internal angular run function that will be called when angular bootstraps and * lets us integrate with the angular router so that we can automatically clear * the breadcrumbs if we switch to a Kibana app that does not use breadcrumbs correctly */ -const $setupBreadcrumbsAutoClear = (newPlatform: CoreStart, isLocalAngular: boolean) => ( - $rootScope: IRootScopeService, - $injector: any -) => { - // A flag used to determine if we should automatically - // clear the breadcrumbs between angular route changes. - let breadcrumbSetSinceRouteChange = false; - const $route = $injector.has('$route') ? $injector.get('$route') : {}; - - // reset breadcrumbSetSinceRouteChange any time the breadcrumbs change, even - // if it was done directly through the new platform - newPlatform.chrome.getBreadcrumbs$().subscribe({ - next() { - breadcrumbSetSinceRouteChange = true; - }, - }); +const $setupBreadcrumbsAutoClear = + (newPlatform: CoreStart, isLocalAngular: boolean) => + ($rootScope: IRootScopeService, $injector: any) => { + // A flag used to determine if we should automatically + // clear the breadcrumbs between angular route changes. + let breadcrumbSetSinceRouteChange = false; + const $route = $injector.has('$route') ? $injector.get('$route') : {}; + + // reset breadcrumbSetSinceRouteChange any time the breadcrumbs change, even + // if it was done directly through the new platform + newPlatform.chrome.getBreadcrumbs$().subscribe({ + next() { + breadcrumbSetSinceRouteChange = true; + }, + }); - $rootScope.$on('$routeChangeStart', () => { - breadcrumbSetSinceRouteChange = false; - }); + $rootScope.$on('$routeChangeStart', () => { + breadcrumbSetSinceRouteChange = false; + }); - $rootScope.$on('$routeChangeSuccess', () => { - if (isDummyRoute($route, isLocalAngular)) { - return; - } - const current = $route.current || {}; + $rootScope.$on('$routeChangeSuccess', () => { + if (isDummyRoute($route, isLocalAngular)) { + return; + } + const current = $route.current || {}; - if (breadcrumbSetSinceRouteChange || (current.$$route && current.$$route.redirectTo)) { - return; - } + if (breadcrumbSetSinceRouteChange || (current.$$route && current.$$route.redirectTo)) { + return; + } - const k7BreadcrumbsProvider = current.k7Breadcrumbs; - if (!k7BreadcrumbsProvider) { - newPlatform.chrome.setBreadcrumbs([]); - return; - } + const k7BreadcrumbsProvider = current.k7Breadcrumbs; + if (!k7BreadcrumbsProvider) { + newPlatform.chrome.setBreadcrumbs([]); + return; + } - try { - newPlatform.chrome.setBreadcrumbs($injector.invoke(k7BreadcrumbsProvider)); - } catch (error) { - if (isAngularHttpError(error)) { - error = formatAngularHttpError(error); + try { + newPlatform.chrome.setBreadcrumbs($injector.invoke(k7BreadcrumbsProvider)); + } catch (error) { + if (isAngularHttpError(error)) { + error = formatAngularHttpError(error); + } + newPlatform.fatalErrors.add(error, 'location'); } - newPlatform.fatalErrors.add(error, 'location'); - } - }); -}; + }); + }; /** * internal angular run function that will be called when angular bootstraps and * lets us integrate with the angular router so that we can automatically clear * the badge if we switch to a Kibana app that does not use the badge correctly */ -const $setupBadgeAutoClear = (newPlatform: CoreStart, isLocalAngular: boolean) => ( - $rootScope: IRootScopeService, - $injector: any -) => { - // A flag used to determine if we should automatically - // clear the badge between angular route changes. - let badgeSetSinceRouteChange = false; - const $route = $injector.has('$route') ? $injector.get('$route') : {}; - - $rootScope.$on('$routeChangeStart', () => { - badgeSetSinceRouteChange = false; - }); +const $setupBadgeAutoClear = + (newPlatform: CoreStart, isLocalAngular: boolean) => + ($rootScope: IRootScopeService, $injector: any) => { + // A flag used to determine if we should automatically + // clear the badge between angular route changes. + let badgeSetSinceRouteChange = false; + const $route = $injector.has('$route') ? $injector.get('$route') : {}; + + $rootScope.$on('$routeChangeStart', () => { + badgeSetSinceRouteChange = false; + }); - $rootScope.$on('$routeChangeSuccess', () => { - if (isDummyRoute($route, isLocalAngular)) { - return; - } - const current = $route.current || {}; + $rootScope.$on('$routeChangeSuccess', () => { + if (isDummyRoute($route, isLocalAngular)) { + return; + } + const current = $route.current || {}; - if (badgeSetSinceRouteChange || (current.$$route && current.$$route.redirectTo)) { - return; - } + if (badgeSetSinceRouteChange || (current.$$route && current.$$route.redirectTo)) { + return; + } - const badgeProvider = current.badge; - if (!badgeProvider) { - newPlatform.chrome.setBadge(undefined); - return; - } + const badgeProvider = current.badge; + if (!badgeProvider) { + newPlatform.chrome.setBadge(undefined); + return; + } - try { - newPlatform.chrome.setBadge($injector.invoke(badgeProvider)); - } catch (error) { - if (isAngularHttpError(error)) { - error = formatAngularHttpError(error); + try { + newPlatform.chrome.setBadge($injector.invoke(badgeProvider)); + } catch (error) { + if (isAngularHttpError(error)) { + error = formatAngularHttpError(error); + } + newPlatform.fatalErrors.add(error, 'location'); } - newPlatform.fatalErrors.add(error, 'location'); - } - }); -}; + }); + }; /** * internal angular run function that will be called when angular bootstraps and @@ -318,40 +312,39 @@ const $setupBadgeAutoClear = (newPlatform: CoreStart, isLocalAngular: boolean) = * the helpExtension if we switch to a Kibana app that does not set its own * helpExtension */ -const $setupHelpExtensionAutoClear = (newPlatform: CoreStart, isLocalAngular: boolean) => ( - $rootScope: IRootScopeService, - $injector: any -) => { - /** - * reset helpExtensionSetSinceRouteChange any time the helpExtension changes, even - * if it was done directly through the new platform - */ - let helpExtensionSetSinceRouteChange = false; - newPlatform.chrome.getHelpExtension$().subscribe({ - next() { - helpExtensionSetSinceRouteChange = true; - }, - }); +const $setupHelpExtensionAutoClear = + (newPlatform: CoreStart, isLocalAngular: boolean) => + ($rootScope: IRootScopeService, $injector: any) => { + /** + * reset helpExtensionSetSinceRouteChange any time the helpExtension changes, even + * if it was done directly through the new platform + */ + let helpExtensionSetSinceRouteChange = false; + newPlatform.chrome.getHelpExtension$().subscribe({ + next() { + helpExtensionSetSinceRouteChange = true; + }, + }); - const $route = $injector.has('$route') ? $injector.get('$route') : {}; + const $route = $injector.has('$route') ? $injector.get('$route') : {}; - $rootScope.$on('$routeChangeStart', () => { - if (isDummyRoute($route, isLocalAngular)) { - return; - } - helpExtensionSetSinceRouteChange = false; - }); + $rootScope.$on('$routeChangeStart', () => { + if (isDummyRoute($route, isLocalAngular)) { + return; + } + helpExtensionSetSinceRouteChange = false; + }); - $rootScope.$on('$routeChangeSuccess', () => { - if (isDummyRoute($route, isLocalAngular)) { - return; - } - const current = $route.current || {}; + $rootScope.$on('$routeChangeSuccess', () => { + if (isDummyRoute($route, isLocalAngular)) { + return; + } + const current = $route.current || {}; - if (helpExtensionSetSinceRouteChange || (current.$$route && current.$$route.redirectTo)) { - return; - } + if (helpExtensionSetSinceRouteChange || (current.$$route && current.$$route.redirectTo)) { + return; + } - newPlatform.chrome.setHelpExtension(current.helpExtension); - }); -}; + newPlatform.chrome.setHelpExtension(current.helpExtension); + }); + }; diff --git a/src/plugins/kibana_legacy/public/angular/kbn_top_nav.js b/src/plugins/kibana_legacy/public/angular/kbn_top_nav.js index 5d7008480e66a..afdb7fedef999 100644 --- a/src/plugins/kibana_legacy/public/angular/kbn_top_nav.js +++ b/src/plugins/kibana_legacy/public/angular/kbn_top_nav.js @@ -60,50 +60,52 @@ export function createTopNavDirective() { }; } -export const createTopNavHelper = ({ TopNavMenu }) => (reactDirective) => { - return reactDirective(TopNavMenu, [ - ['config', { watchDepth: 'value' }], - ['setMenuMountPoint', { watchDepth: 'reference' }], - ['disabledButtons', { watchDepth: 'reference' }], - - ['query', { watchDepth: 'reference' }], - ['savedQuery', { watchDepth: 'reference' }], - ['intl', { watchDepth: 'reference' }], - - ['onQuerySubmit', { watchDepth: 'reference' }], - ['onFiltersUpdated', { watchDepth: 'reference' }], - ['onRefreshChange', { watchDepth: 'reference' }], - ['onClearSavedQuery', { watchDepth: 'reference' }], - ['onSaved', { watchDepth: 'reference' }], - ['onSavedQueryUpdated', { watchDepth: 'reference' }], - ['onSavedQueryIdChange', { watchDepth: 'reference' }], - - ['indexPatterns', { watchDepth: 'collection' }], - ['filters', { watchDepth: 'collection' }], - - // All modifiers default to true. - // Set to false to hide subcomponents. - 'showSearchBar', - 'showQueryBar', - 'showQueryInput', - 'showSaveQuery', - 'showDatePicker', - 'showFilterBar', - - 'appName', - 'screenTitle', - 'dateRangeFrom', - 'dateRangeTo', - 'savedQueryId', - 'isRefreshPaused', - 'refreshInterval', - 'disableAutoFocus', - 'showAutoRefreshOnly', - - // temporary flag to use the stateful components - 'useDefaultBehaviors', - ]); -}; +export const createTopNavHelper = + ({ TopNavMenu }) => + (reactDirective) => { + return reactDirective(TopNavMenu, [ + ['config', { watchDepth: 'value' }], + ['setMenuMountPoint', { watchDepth: 'reference' }], + ['disabledButtons', { watchDepth: 'reference' }], + + ['query', { watchDepth: 'reference' }], + ['savedQuery', { watchDepth: 'reference' }], + ['intl', { watchDepth: 'reference' }], + + ['onQuerySubmit', { watchDepth: 'reference' }], + ['onFiltersUpdated', { watchDepth: 'reference' }], + ['onRefreshChange', { watchDepth: 'reference' }], + ['onClearSavedQuery', { watchDepth: 'reference' }], + ['onSaved', { watchDepth: 'reference' }], + ['onSavedQueryUpdated', { watchDepth: 'reference' }], + ['onSavedQueryIdChange', { watchDepth: 'reference' }], + + ['indexPatterns', { watchDepth: 'collection' }], + ['filters', { watchDepth: 'collection' }], + + // All modifiers default to true. + // Set to false to hide subcomponents. + 'showSearchBar', + 'showQueryBar', + 'showQueryInput', + 'showSaveQuery', + 'showDatePicker', + 'showFilterBar', + + 'appName', + 'screenTitle', + 'dateRangeFrom', + 'dateRangeTo', + 'savedQueryId', + 'isRefreshPaused', + 'refreshInterval', + 'disableAutoFocus', + 'showAutoRefreshOnly', + + // temporary flag to use the stateful components + 'useDefaultBehaviors', + ]); + }; let isLoaded = false; diff --git a/src/plugins/kibana_overview/public/plugin.ts b/src/plugins/kibana_overview/public/plugin.ts index d0b681ea1b482..2b0340fc7fe55 100644 --- a/src/plugins/kibana_overview/public/plugin.ts +++ b/src/plugins/kibana_overview/public/plugin.ts @@ -34,7 +34,8 @@ export class KibanaOverviewPlugin KibanaOverviewPluginStart, AppPluginSetupDependencies, AppPluginStartDependencies - > { + > +{ public setup( core: CoreSetup, { home, usageCollection }: AppPluginSetupDependencies diff --git a/src/plugins/kibana_react/common/eui_styled_components.tsx b/src/plugins/kibana_react/common/eui_styled_components.tsx index b66f4b3a0a6c6..4f680d944b958 100644 --- a/src/plugins/kibana_react/common/eui_styled_components.tsx +++ b/src/plugins/kibana_react/common/eui_styled_components.tsx @@ -51,6 +51,6 @@ const { createGlobalStyle, keyframes, withTheme, -} = (styledComponents as unknown) as ThemedStyledComponentsModule; +} = styledComponents as unknown as ThemedStyledComponentsModule; export { css, euiStyled, EuiThemeProvider, createGlobalStyle, keyframes, withTheme }; diff --git a/src/plugins/kibana_react/public/adapters/react_to_ui_component.ts b/src/plugins/kibana_react/public/adapters/react_to_ui_component.ts index 8936a37754499..038e39a0060f1 100644 --- a/src/plugins/kibana_react/public/adapters/react_to_ui_component.ts +++ b/src/plugins/kibana_react/public/adapters/react_to_ui_component.ts @@ -15,24 +15,24 @@ import { UiComponent, UiComponentInstance } from '../../../kibana_utils/public'; * * @param ReactComp A React component. */ -export const reactToUiComponent = ( - ReactComp: ComponentType -): UiComponent => () => { - let lastEl: HTMLElement | undefined; +export const reactToUiComponent = + (ReactComp: ComponentType): UiComponent => + () => { + let lastEl: HTMLElement | undefined; - const render: UiComponentInstance['render'] = (el, props) => { - lastEl = el; - renderReact(h(ReactComp, props), el); - }; + const render: UiComponentInstance['render'] = (el, props) => { + lastEl = el; + renderReact(h(ReactComp, props), el); + }; - const unmount: UiComponentInstance['unmount'] = () => { - if (lastEl) unmountComponentAtNode(lastEl); - }; + const unmount: UiComponentInstance['unmount'] = () => { + if (lastEl) unmountComponentAtNode(lastEl); + }; - const comp: UiComponentInstance = { - render, - unmount, - }; + const comp: UiComponentInstance = { + render, + unmount, + }; - return comp; -}; + return comp; + }; diff --git a/src/plugins/kibana_react/public/adapters/ui_to_react_component.ts b/src/plugins/kibana_react/public/adapters/ui_to_react_component.ts index 2e0a816f55e86..c85366e4bc4f7 100644 --- a/src/plugins/kibana_react/public/adapters/ui_to_react_component.ts +++ b/src/plugins/kibana_react/public/adapters/ui_to_react_component.ts @@ -12,26 +12,25 @@ import { UiComponent, UiComponentInstance } from '../../../kibana_utils/public'; /** * Transforms `UiComponent` into a React component. */ -export const uiToReactComponent = ( - Comp: UiComponent, - as: string = 'div' -): FC => (props) => { - const ref = useRef(); - const comp = useMemo>(() => Comp(), [Comp]); +export const uiToReactComponent = + (Comp: UiComponent, as: string = 'div'): FC => + (props) => { + const ref = useRef(); + const comp = useMemo>(() => Comp(), [Comp]); - useLayoutEffect(() => { - if (!ref.current) return; - comp.render(ref.current, props); - }); + useLayoutEffect(() => { + if (!ref.current) return; + comp.render(ref.current, props); + }); - useLayoutEffect(() => { - if (!comp.unmount) return; - return () => { - if (comp.unmount) comp.unmount(); - }; - }, [comp]); + useLayoutEffect(() => { + if (!comp.unmount) return; + return () => { + if (comp.unmount) comp.unmount(); + }; + }, [comp]); - return h(as, { - ref, - }); -}; + return h(as, { + ref, + }); + }; diff --git a/src/plugins/kibana_react/public/app_links/click_handler.test.ts b/src/plugins/kibana_react/public/app_links/click_handler.test.ts index 9bb6263f22628..1569203c394df 100644 --- a/src/plugins/kibana_react/public/app_links/click_handler.test.ts +++ b/src/plugins/kibana_react/public/app_links/click_handler.test.ts @@ -33,13 +33,13 @@ const createEvent = ({ defaultPrevented?: boolean; modifierKey?: boolean; }): MouseEvent => { - return ({ + return { target, button, defaultPrevented, ctrlKey: modifierKey, preventDefault: jest.fn(), - } as unknown) as MouseEvent; + } as unknown as MouseEvent; }; describe('createNavigateToUrlClickHandler', () => { diff --git a/src/plugins/kibana_react/public/code_editor/code_editor.stories.tsx b/src/plugins/kibana_react/public/code_editor/code_editor.stories.tsx index 09c46bf7a327e..c85e03c433d67 100644 --- a/src/plugins/kibana_react/public/code_editor/code_editor.stories.tsx +++ b/src/plugins/kibana_react/public/code_editor/code_editor.stories.tsx @@ -106,8 +106,7 @@ storiesOf('CodeEditor', module) ), { info: { - text: - 'Custom language example. Language definition taken from [here](https://microsoft.github.io/monaco-editor/playground.html#extending-language-services-custom-languages)', + text: 'Custom language example. Language definition taken from [here](https://microsoft.github.io/monaco-editor/playground.html#extending-language-services-custom-languages)', }, } ) diff --git a/src/plugins/kibana_react/public/context/context.test.tsx b/src/plugins/kibana_react/public/context/context.test.tsx index 4b381722c717a..a806f3eb66f75 100644 --- a/src/plugins/kibana_react/public/context/context.test.tsx +++ b/src/plugins/kibana_react/public/context/context.test.tsx @@ -184,19 +184,19 @@ test('notifications wrapper uses the closest notifications service', () => { }; const core1 = { - notifications: ({ + notifications: { toasts: { add: jest.fn(), }, - } as unknown) as CoreStart['notifications'], + } as unknown as CoreStart['notifications'], } as Partial; const core2 = { - notifications: ({ + notifications: { toasts: { add: jest.fn(), }, - } as unknown) as CoreStart['notifications'], + } as unknown as CoreStart['notifications'], } as Partial; ReactDOM.render( @@ -221,19 +221,19 @@ test('overlays wrapper uses available overlays service, higher up in ; const core2 = { - notifications: ({ + notifications: { toasts: { add: jest.fn(), }, - } as unknown) as CoreStart['notifications'], + } as unknown as CoreStart['notifications'], } as Partial; expect(core1.overlays!.openFlyout).toHaveBeenCalledTimes(0); diff --git a/src/plugins/kibana_react/public/context/context.tsx b/src/plugins/kibana_react/public/context/context.tsx index dae0093a6f1c8..974bd4e894791 100644 --- a/src/plugins/kibana_react/public/context/context.tsx +++ b/src/plugins/kibana_react/public/context/context.tsx @@ -24,9 +24,7 @@ export const context = createContext>(de export const useKibana = (): KibanaReactContextValue< KibanaServices & Extra > => - useContext( - (context as unknown) as React.Context> - ); + useContext(context as unknown as React.Context>); export const withKibana = }>( type: React.ComponentType @@ -69,7 +67,7 @@ export const createKibanaReactContext = ( return { value, Provider, - Consumer: (context.Consumer as unknown) as React.Consumer>, + Consumer: context.Consumer as unknown as React.Consumer>, }; }; diff --git a/src/plugins/kibana_react/public/exit_full_screen_button/exit_full_screen_button.test.tsx b/src/plugins/kibana_react/public/exit_full_screen_button/exit_full_screen_button.test.tsx index 430eae9f1234f..273f0209da991 100644 --- a/src/plugins/kibana_react/public/exit_full_screen_button/exit_full_screen_button.test.tsx +++ b/src/plugins/kibana_react/public/exit_full_screen_button/exit_full_screen_button.test.tsx @@ -13,9 +13,9 @@ import { keys } from '@elastic/eui'; import { mount } from 'enzyme'; import type { ChromeStart } from '../../../../core/public'; -const MockChrome = ({ +const MockChrome = { setIsVisible: () => {}, -} as unknown) as ChromeStart; +} as unknown as ChromeStart; test('is rendered', () => { const component = mount( diff --git a/src/plugins/kibana_react/public/overview_page/overview_page_actions/overview_page_actions.test.tsx b/src/plugins/kibana_react/public/overview_page/overview_page_actions/overview_page_actions.test.tsx index 34abf9439c1c4..389cccd08da8e 100644 --- a/src/plugins/kibana_react/public/overview_page/overview_page_actions/overview_page_actions.test.tsx +++ b/src/plugins/kibana_react/public/overview_page/overview_page_actions/overview_page_actions.test.tsx @@ -15,9 +15,9 @@ jest.mock('../../app_links', () => ({ afterAll(() => jest.clearAllMocks()); -const applicationStartMock = ({ +const applicationStartMock = { capabilities: { navLinks: { management: true, dev_tools: true } }, -} as unknown) as ApplicationStart; +} as unknown as ApplicationStart; describe('overviewPageActions', () => { test('only add data button', () => { diff --git a/src/plugins/kibana_react/public/overview_page/overview_page_actions/overview_page_actions.tsx b/src/plugins/kibana_react/public/overview_page/overview_page_actions/overview_page_actions.tsx index 5903a51ae3170..19a3a0e9a760c 100644 --- a/src/plugins/kibana_react/public/overview_page/overview_page_actions/overview_page_actions.tsx +++ b/src/plugins/kibana_react/public/overview_page/overview_page_actions/overview_page_actions.tsx @@ -31,10 +31,8 @@ export const overviewPageActions = ({ showDevToolsLink, showManagementLink, }: Props) => { - const { - management: isManagementEnabled, - dev_tools: isDevToolsEnabled, - } = application.capabilities.navLinks; + const { management: isManagementEnabled, dev_tools: isDevToolsEnabled } = + application.capabilities.navLinks; const actionAddData = ( diff --git a/src/plugins/kibana_react/public/page_template/solution_nav/solution_nav.tsx b/src/plugins/kibana_react/public/page_template/solution_nav/solution_nav.tsx index 2165cb1cc101b..0f23e64a73a58 100644 --- a/src/plugins/kibana_react/public/page_template/solution_nav/solution_nav.tsx +++ b/src/plugins/kibana_react/public/page_template/solution_nav/solution_nav.tsx @@ -53,113 +53,107 @@ const setTabIndex = (items: Array>, isHidden: boolean) => /** * A wrapper around EuiSideNav but also creates the appropriate title with optional solution logo */ -export const KibanaPageTemplateSolutionNav: FunctionComponent = ({ - name, - icon, - items, - isOpenOnDesktop = false, - onCollapse, - ...rest -}) => { - // The EuiShowFor and EuiHideFor components are not in sync with the euiBreakpoint() function :( - const isSmallerBreakpoint = useIsWithinBreakpoints(['xs', 's']); - const isMediumBreakpoint = useIsWithinBreakpoints(['m']); - const isLargerBreakpoint = useIsWithinBreakpoints(['l', 'xl']); +export const KibanaPageTemplateSolutionNav: FunctionComponent = + ({ name, icon, items, isOpenOnDesktop = false, onCollapse, ...rest }) => { + // The EuiShowFor and EuiHideFor components are not in sync with the euiBreakpoint() function :( + const isSmallerBreakpoint = useIsWithinBreakpoints(['xs', 's']); + const isMediumBreakpoint = useIsWithinBreakpoints(['m']); + const isLargerBreakpoint = useIsWithinBreakpoints(['l', 'xl']); - // This is used for both the EuiSideNav and EuiFlyout toggling - const [isSideNavOpenOnMobile, setIsSideNavOpenOnMobile] = useState(false); - const toggleOpenOnMobile = () => { - setIsSideNavOpenOnMobile(!isSideNavOpenOnMobile); - }; + // This is used for both the EuiSideNav and EuiFlyout toggling + const [isSideNavOpenOnMobile, setIsSideNavOpenOnMobile] = useState(false); + const toggleOpenOnMobile = () => { + setIsSideNavOpenOnMobile(!isSideNavOpenOnMobile); + }; - const isHidden = isLargerBreakpoint && !isOpenOnDesktop; + const isHidden = isLargerBreakpoint && !isOpenOnDesktop; - /** - * Create the avatar - */ - let solutionAvatar; - if (icon) { - solutionAvatar = ; - } + /** + * Create the avatar + */ + let solutionAvatar; + if (icon) { + solutionAvatar = ; + } - /** - * Create the titles - */ - const titleText = ( - - {solutionAvatar} - {name} - - ); - const mobileTitleText = ( - - ); + /** + * Create the titles + */ + const titleText = ( + + {solutionAvatar} + {name} + + ); + const mobileTitleText = ( + + ); - /** - * Create the side nav component - */ - let sideNav; - if (items) { - const sideNavClasses = classNames('kbnPageTemplateSolutionNav', { - 'kbnPageTemplateSolutionNav--hidden': isHidden, - }); + /** + * Create the side nav component + */ + let sideNav; + if (items) { + const sideNavClasses = classNames('kbnPageTemplateSolutionNav', { + 'kbnPageTemplateSolutionNav--hidden': isHidden, + }); + + sideNav = ( + + {solutionAvatar} + {mobileTitleText} + + } + toggleOpenOnMobile={toggleOpenOnMobile} + isOpenOnMobile={isSideNavOpenOnMobile} + items={setTabIndex(items, isHidden)} + {...rest} + /> + ); + } - sideNav = ( - + {isSmallerBreakpoint && sideNav} + {isMediumBreakpoint && ( - {solutionAvatar} - {mobileTitleText} + {isSideNavOpenOnMobile && ( + setIsSideNavOpenOnMobile(false)} + side="left" + size={248} + closeButtonPosition="outside" + className="kbnPageTemplateSolutionNav__flyout" + > + {sideNav} + + )} + - } - toggleOpenOnMobile={toggleOpenOnMobile} - isOpenOnMobile={isSideNavOpenOnMobile} - items={setTabIndex(items, isHidden)} - {...rest} - /> + )} + {isLargerBreakpoint && ( + + {sideNav} + + + )} + ); - } - - return ( - - {isSmallerBreakpoint && sideNav} - {isMediumBreakpoint && ( - - {isSideNavOpenOnMobile && ( - setIsSideNavOpenOnMobile(false)} - side="left" - size={248} - closeButtonPosition="outside" - className="kbnPageTemplateSolutionNav__flyout" - > - {sideNav} - - )} - - - )} - {isLargerBreakpoint && ( - - {sideNav} - - - )} - - ); -}; + }; diff --git a/src/plugins/kibana_react/public/page_template/solution_nav/solution_nav_avatar.tsx b/src/plugins/kibana_react/public/page_template/solution_nav/solution_nav_avatar.tsx index 135c0d598651a..6b286edee0ffa 100644 --- a/src/plugins/kibana_react/public/page_template/solution_nav/solution_nav_avatar.tsx +++ b/src/plugins/kibana_react/public/page_template/solution_nav/solution_nav_avatar.tsx @@ -22,25 +22,22 @@ export type KibanaPageTemplateSolutionNavAvatarProps = DistributiveOmit = ({ - className, - size, - ...rest -}) => { - return ( - // @ts-ignore Complains about ExclusiveUnion between `iconSize` and `iconType`, but works fine - - ); -}; +export const KibanaPageTemplateSolutionNavAvatar: FunctionComponent = + ({ className, size, ...rest }) => { + return ( + // @ts-ignore Complains about ExclusiveUnion between `iconSize` and `iconType`, but works fine + + ); + }; diff --git a/src/plugins/kibana_react/public/page_template/solution_nav/solution_nav_collapse_button.tsx b/src/plugins/kibana_react/public/page_template/solution_nav/solution_nav_collapse_button.tsx index 65e36d781f821..f56f720dcd52e 100644 --- a/src/plugins/kibana_react/public/page_template/solution_nav/solution_nav_collapse_button.tsx +++ b/src/plugins/kibana_react/public/page_template/solution_nav/solution_nav_collapse_button.tsx @@ -13,46 +13,44 @@ import classNames from 'classnames'; import { EuiButtonIcon, EuiButtonIconPropsForButton } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -export type KibanaPageTemplateSolutionNavCollapseButtonProps = Partial & { - /** - * Boolean state of current collapsed status - */ - isCollapsed: boolean; -}; +export type KibanaPageTemplateSolutionNavCollapseButtonProps = + Partial & { + /** + * Boolean state of current collapsed status + */ + isCollapsed: boolean; + }; /** * Creates the styled icon button for showing/hiding solution nav */ -export const KibanaPageTemplateSolutionNavCollapseButton: FunctionComponent = ({ - className, - isCollapsed, - ...rest -}) => { - const classes = classNames( - 'kbnPageTemplateSolutionNavCollapseButton', - { - 'kbnPageTemplateSolutionNavCollapseButton-isCollapsed': isCollapsed, - }, - className - ); +export const KibanaPageTemplateSolutionNavCollapseButton: FunctionComponent = + ({ className, isCollapsed, ...rest }) => { + const classes = classNames( + 'kbnPageTemplateSolutionNavCollapseButton', + { + 'kbnPageTemplateSolutionNavCollapseButton-isCollapsed': isCollapsed, + }, + className + ); - const collapseLabel = i18n.translate('kibana-react.solutionNav.collapsibleLabel', { - defaultMessage: 'Collapse side navigation', - }); + const collapseLabel = i18n.translate('kibana-react.solutionNav.collapsibleLabel', { + defaultMessage: 'Collapse side navigation', + }); - const openLabel = i18n.translate('kibana-react.solutionNav.openLabel', { - defaultMessage: 'Open side navigation', - }); + const openLabel = i18n.translate('kibana-react.solutionNav.openLabel', { + defaultMessage: 'Open side navigation', + }); - return ( - - ); -}; + return ( + + ); + }; diff --git a/src/plugins/kibana_react/public/react_router_navigate/react_router_navigate.tsx b/src/plugins/kibana_react/public/react_router_navigate/react_router_navigate.tsx index ebfd0e51fbf0d..db122d034371d 100644 --- a/src/plugins/kibana_react/public/react_router_navigate/react_router_navigate.tsx +++ b/src/plugins/kibana_react/public/react_router_navigate/react_router_navigate.tsx @@ -32,28 +32,26 @@ export const reactRouterNavigate = ( onClick: reactRouterOnClickHandler(history, toLocationObject(to), onClickCallback), }); -export const reactRouterOnClickHandler = ( - history: ScopedHistory | History, - to: string | LocationObject, - onClickCallback?: Function -) => (event: any) => { - if (onClickCallback) { - onClickCallback(event); - } - - if (event.defaultPrevented) { - return; - } - - if (event.target.getAttribute('target')) { - return; - } - - if (isModifiedEvent(event) || !isLeftClickEvent(event)) { - return; - } - - // prevents page reload - event.preventDefault(); - history.push(toLocationObject(to)); -}; +export const reactRouterOnClickHandler = + (history: ScopedHistory | History, to: string | LocationObject, onClickCallback?: Function) => + (event: any) => { + if (onClickCallback) { + onClickCallback(event); + } + + if (event.defaultPrevented) { + return; + } + + if (event.target.getAttribute('target')) { + return; + } + + if (isModifiedEvent(event) || !isLeftClickEvent(event)) { + return; + } + + // prevents page reload + event.preventDefault(); + history.push(toLocationObject(to)); + }; diff --git a/src/plugins/kibana_react/public/ui_settings/use_ui_setting.test.tsx b/src/plugins/kibana_react/public/ui_settings/use_ui_setting.test.tsx index 8117699b95ca2..44dea2aa420a7 100644 --- a/src/plugins/kibana_react/public/ui_settings/use_ui_setting.test.tsx +++ b/src/plugins/kibana_react/public/ui_settings/use_ui_setting.test.tsx @@ -17,7 +17,7 @@ import { coreMock } from '../../../../core/public/mocks'; import useObservable from 'react-use/lib/useObservable'; jest.mock('react-use/lib/useObservable'); -const useObservableSpy = (useObservable as any) as jest.SpyInstance; +const useObservableSpy = useObservable as any as jest.SpyInstance; useObservableSpy.mockImplementation((observable, def) => def); const mock = (): [KibanaServices, Subject] => { diff --git a/src/plugins/kibana_react/public/ui_settings/use_ui_setting.ts b/src/plugins/kibana_react/public/ui_settings/use_ui_setting.ts index 234fd6de517c4..d73b8721c7f47 100644 --- a/src/plugins/kibana_react/public/ui_settings/use_ui_setting.ts +++ b/src/plugins/kibana_react/public/ui_settings/use_ui_setting.ts @@ -51,11 +51,10 @@ export const useUiSetting$ = (key: string, defaultValue?: T): [T, Setter] throw new TypeError('uiSettings service not available in kibana-react context.'); } - const observable$ = useMemo(() => services.uiSettings!.get$(key, defaultValue), [ - key, - defaultValue, - services.uiSettings, - ]); + const observable$ = useMemo( + () => services.uiSettings!.get$(key, defaultValue), + [key, defaultValue, services.uiSettings] + ); const value = useObservable(observable$, services.uiSettings!.get(key, defaultValue)); const set = useCallback((newValue: T) => services.uiSettings!.set(key, newValue), [key]); diff --git a/src/plugins/kibana_usage_collection/server/collectors/application_usage/rollups/daily.ts b/src/plugins/kibana_usage_collection/server/collectors/application_usage/rollups/daily.ts index a7873c7d5dfe9..4a00818336082 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/application_usage/rollups/daily.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/application_usage/rollups/daily.ts @@ -46,12 +46,11 @@ export async function rollDailyData( let toCreate: Map; do { toCreate = new Map(); - const { - saved_objects: rawApplicationUsageTransactional, - } = await savedObjectsClient.find({ - type: SAVED_OBJECTS_TRANSACTIONAL_TYPE, - perPage: 1000, // Process 1000 at a time as a compromise of speed and overload - }); + const { saved_objects: rawApplicationUsageTransactional } = + await savedObjectsClient.find({ + type: SAVED_OBJECTS_TRANSACTIONAL_TYPE, + perPage: 1000, // Process 1000 at a time as a compromise of speed and overload + }); for (const doc of rawApplicationUsageTransactional) { const { diff --git a/src/plugins/kibana_usage_collection/server/collectors/cloud/detector/cloud_detector.test.ts b/src/plugins/kibana_usage_collection/server/collectors/cloud/detector/cloud_detector.test.ts index f0b54046565c9..f5a94a2a90218 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/cloud/detector/cloud_detector.test.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/cloud/detector/cloud_detector.test.ts @@ -44,12 +44,12 @@ describe('CloudDetector', () => { }; }, }; - const cloudServices = ([ + const cloudServices = [ cloudService1, cloudService2, cloudService3, cloudService4, - ] as unknown) as CloudService[]; + ] as unknown as CloudService[]; describe('getCloudDetails', () => { it('returns undefined by default', () => { @@ -70,7 +70,7 @@ describe('CloudDetector', () => { }); it('returns null if none match', async () => { - const services = ([cloudService1, cloudService2] as unknown) as CloudService[]; + const services = [cloudService1, cloudService2] as unknown as CloudService[]; const detector1 = new CloudDetector({ cloudServices: services }); await detector1.detectCloudService(); @@ -83,7 +83,7 @@ describe('CloudDetector', () => { // this is already tested above, but this just tests it explicitly it('ignores exceptions from cloud services', async () => { - const services = ([cloudService2] as unknown) as CloudService[]; + const services = [cloudService2] as unknown as CloudService[]; const detector = new CloudDetector({ cloudServices: services }); await detector.detectCloudService(); diff --git a/src/plugins/kibana_usage_collection/server/collectors/config_usage/register_config_usage_collector.test.ts b/src/plugins/kibana_usage_collection/server/collectors/config_usage/register_config_usage_collector.test.ts index bc6f8c956b669..8f78bc962dd28 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/config_usage/register_config_usage_collector.test.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/config_usage/register_config_usage_collector.test.ts @@ -28,7 +28,7 @@ describe('kibana_config_usage', () => { const collectorFetchContext = createCollectorFetchContextMock(); const coreUsageDataStart = coreUsageDataServiceMock.createStartContract(); - const mockConfigUsage = (Symbol('config usage telemetry') as unknown) as ConfigUsageData; + const mockConfigUsage = Symbol('config usage telemetry') as unknown as ConfigUsageData; coreUsageDataStart.getConfigsUsageData.mockResolvedValue(mockConfigUsage); beforeAll(() => registerConfigUsageCollector(usageCollectionMock, () => coreUsageDataStart)); diff --git a/src/plugins/kibana_usage_collection/server/collectors/core/core_usage_collector.test.ts b/src/plugins/kibana_usage_collection/server/collectors/core/core_usage_collector.test.ts index 5410e491a85fd..0bb3b2ff923fa 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/core/core_usage_collector.test.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/core/core_usage_collector.test.ts @@ -28,7 +28,7 @@ describe('telemetry_core', () => { const collectorFetchContext = createCollectorFetchContextMock(); const coreUsageDataStart = coreUsageDataServiceMock.createStartContract(); - const getCoreUsageDataReturnValue = (Symbol('core telemetry') as unknown) as CoreUsageData; + const getCoreUsageDataReturnValue = Symbol('core telemetry') as unknown as CoreUsageData; coreUsageDataStart.getCoreUsageData.mockResolvedValue(getCoreUsageDataReturnValue); beforeAll(() => registerCoreUsageCollector(usageCollectionMock, () => coreUsageDataStart)); diff --git a/src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/event_loop_delays_usage_collector.test.ts b/src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/event_loop_delays_usage_collector.test.ts index 06c51f6afa3a8..96d5240c935f8 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/event_loop_delays_usage_collector.test.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/event_loop_delays_usage_collector.test.ts @@ -55,9 +55,9 @@ describe('registerEventLoopDelaysCollector', () => { }); it('returns objects from event_loop_delays_daily from fetch function', async () => { - const mockFind = jest.fn().mockResolvedValue(({ + const mockFind = jest.fn().mockResolvedValue({ saved_objects: [{ attributes: { test: 1 } }], - } as unknown) as SavedObjectsFindResponse); + } as unknown as SavedObjectsFindResponse); mockInternalRepository.find = mockFind; const fetchResult = await collector.fetch(collectorFetchContext); diff --git a/src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/rollups/integration_tests/daily_rollups.test.ts b/src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/rollups/integration_tests/daily_rollups.test.ts index 64668a5f23de1..dafd4414db192 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/rollups/integration_tests/daily_rollups.test.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/event_loop_delays/rollups/integration_tests/daily_rollups.test.ts @@ -85,10 +85,8 @@ describe('daily rollups integration test', () => { it('deletes documents older that 3 days from the saved objects repository', async () => { await rollDailyData(logger, internalRepository); - const { - total, - saved_objects: savedObjects, - } = await internalRepository.find({ type: SAVED_OBJECTS_DAILY_TYPE }); + const { total, saved_objects: savedObjects } = + await internalRepository.find({ type: SAVED_OBJECTS_DAILY_TYPE }); expect(total).toBe(rawEventLoopDelaysDaily.length); expect(savedObjects.map(({ id, type, attributes }) => ({ id, type, attributes }))).toEqual( rawEventLoopDelaysDaily diff --git a/src/plugins/kibana_usage_collection/server/collectors/localization/telemetry_localization_collector.test.ts b/src/plugins/kibana_usage_collection/server/collectors/localization/telemetry_localization_collector.test.ts index 0b2650cd5ebb9..80605b6caee2e 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/localization/telemetry_localization_collector.test.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/localization/telemetry_localization_collector.test.ts @@ -11,13 +11,13 @@ interface TranslationsMock { } const createI18nLoaderMock = (translations: TranslationsMock) => { - return ({ + return { getTranslationsByLocale() { return { messages: translations, }; }, - } as unknown) as typeof i18nLoader; + } as unknown as typeof i18nLoader; }; import { getTranslationCount } from './telemetry_localization_collector'; diff --git a/src/plugins/kibana_usage_collection/server/collectors/management/telemetry_management_collector.ts b/src/plugins/kibana_usage_collection/server/collectors/management/telemetry_management_collector.ts index 7dd1a4dc4410e..3c29824d96f96 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/management/telemetry_management_collector.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/management/telemetry_management_collector.ts @@ -28,7 +28,7 @@ export function createCollectorFetch(getUiSettingsClient: () => IUiSettingsClien return obj; }, {}); // TODO: It would be Partial, but the telemetry-tools for the schema extraction still does not support it. We need to fix it before setting the right Partial type - return (modifiedEntries as unknown) as UsageStats; + return modifiedEntries as unknown as UsageStats; }; } diff --git a/src/plugins/kibana_usage_collection/server/collectors/saved_objects_counts/kibana_usage_collector.ts b/src/plugins/kibana_usage_collection/server/collectors/saved_objects_counts/kibana_usage_collector.ts index 13b9d0ca2104c..75d5af2737772 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/saved_objects_counts/kibana_usage_collector.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/saved_objects_counts/kibana_usage_collector.ts @@ -33,9 +33,9 @@ export async function getKibanaSavedObjectCounts( ): Promise { const buckets = await getSavedObjectsCounts(esClient, kibanaIndex, TYPES); - const allZeros = (Object.fromEntries( + const allZeros = Object.fromEntries( TYPES.map((type) => [snakeCase(type), { total: 0 }]) - ) as unknown) as KibanaSavedObjectCounts; + ) as unknown as KibanaSavedObjectCounts; return buckets.reduce((acc, { key, doc_count: total = 0 }) => { const type = snakeCase(key) as keyof KibanaSavedObjectCounts; diff --git a/src/plugins/kibana_usage_collection/server/collectors/ui_counters/register_ui_counters_collector.ts b/src/plugins/kibana_usage_collection/server/collectors/ui_counters/register_ui_counters_collector.ts index 19190de45d96b..12c0a21f5353d 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/ui_counters/register_ui_counters_collector.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/ui_counters/register_ui_counters_collector.ts @@ -95,14 +95,13 @@ export function transformRawUsageCounterObject( export const createFetchUiCounters = (stopUsingUiCounterIndicies$: Subject) => async function fetchUiCounters({ soClient }: CollectorFetchContext) { - const { - saved_objects: rawUsageCounters, - } = await soClient.find({ - type: USAGE_COUNTERS_SAVED_OBJECT_TYPE, - fields: ['count', 'counterName', 'counterType', 'domainId'], - filter: `${USAGE_COUNTERS_SAVED_OBJECT_TYPE}.attributes.domainId: uiCounter`, - perPage: 10000, - }); + const { saved_objects: rawUsageCounters } = + await soClient.find({ + type: USAGE_COUNTERS_SAVED_OBJECT_TYPE, + fields: ['count', 'counterName', 'counterType', 'domainId'], + filter: `${USAGE_COUNTERS_SAVED_OBJECT_TYPE}.attributes.domainId: uiCounter`, + perPage: 10000, + }); const skipFetchingUiCounters = stopUsingUiCounterIndicies$.isStopped; const result = diff --git a/src/plugins/kibana_usage_collection/server/collectors/ui_metric/index.test.ts b/src/plugins/kibana_usage_collection/server/collectors/ui_metric/index.test.ts index 31cb869d14e57..cbc848bb5af46 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/ui_metric/index.test.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/ui_metric/index.test.ts @@ -79,8 +79,7 @@ describe('telemetry_ui_metric', () => { }, { ...commonSavedObjectsAttributes, - id: - 'kibana-user_agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:80.0) Gecko/20100101 Firefox/80.0', + id: 'kibana-user_agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:80.0) Gecko/20100101 Firefox/80.0', attributes: { count: 1 }, }, ], diff --git a/src/plugins/kibana_usage_collection/server/collectors/usage_counters/register_usage_counters_collector.ts b/src/plugins/kibana_usage_collection/server/collectors/usage_counters/register_usage_counters_collector.ts index 9c6db00fb3597..ad940c825c436 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/usage_counters/register_usage_counters_collector.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/usage_counters/register_usage_counters_collector.ts @@ -86,14 +86,13 @@ export function registerUsageCountersUsageCollector(usageCollection: UsageCollec }, }, fetch: async ({ soClient }: CollectorFetchContext) => { - const { - saved_objects: rawUsageCounters, - } = await soClient.find({ - type: USAGE_COUNTERS_SAVED_OBJECT_TYPE, - fields: ['count', 'counterName', 'counterType', 'domainId'], - filter: `NOT ${USAGE_COUNTERS_SAVED_OBJECT_TYPE}.attributes.domainId: uiCounter`, - perPage: 10000, - }); + const { saved_objects: rawUsageCounters } = + await soClient.find({ + type: USAGE_COUNTERS_SAVED_OBJECT_TYPE, + fields: ['count', 'counterName', 'counterType', 'domainId'], + filter: `NOT ${USAGE_COUNTERS_SAVED_OBJECT_TYPE}.attributes.domainId: uiCounter`, + perPage: 10000, + }); return { dailyEvents: rawUsageCounters.reduce((acc, rawUsageCounter) => { diff --git a/src/plugins/kibana_usage_collection/server/collectors/usage_counters/rollups/rollups.ts b/src/plugins/kibana_usage_collection/server/collectors/usage_counters/rollups/rollups.ts index c07ea37536f2d..99bbcee368d1c 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/usage_counters/rollups/rollups.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/usage_counters/rollups/rollups.ts @@ -48,12 +48,11 @@ export async function rollUsageCountersIndices( const now = moment(); try { - const { - saved_objects: rawUiCounterDocs, - } = await savedObjectsClient.find({ - type: USAGE_COUNTERS_SAVED_OBJECT_TYPE, - perPage: 1000, // Process 1000 at a time as a compromise of speed and overload - }); + const { saved_objects: rawUiCounterDocs } = + await savedObjectsClient.find({ + type: USAGE_COUNTERS_SAVED_OBJECT_TYPE, + perPage: 1000, // Process 1000 at a time as a compromise of speed and overload + }); const docsToDelete = rawUiCounterDocs.filter((doc) => isSavedObjectOlderThan({ diff --git a/src/plugins/kibana_utils/common/abort_utils.ts b/src/plugins/kibana_utils/common/abort_utils.ts index 051f947b68c1b..70f3881acc3de 100644 --- a/src/plugins/kibana_utils/common/abort_utils.ts +++ b/src/plugins/kibana_utils/common/abort_utils.ts @@ -25,9 +25,10 @@ export class AbortError extends Error { * * @param signal The `AbortSignal` to generate the `Promise` from */ -export function abortSignalToPromise( - signal: AbortSignal -): { promise: Promise; cleanup: () => void } { +export function abortSignalToPromise(signal: AbortSignal): { + promise: Promise; + cleanup: () => void; +} { let abortHandler: () => void; const cleanup = () => { if (abortHandler) { diff --git a/src/plugins/kibana_utils/common/persistable_state/migrate_to_latest.test.ts b/src/plugins/kibana_utils/common/persistable_state/migrate_to_latest.test.ts index 2a857b821aced..7f863b603bbf3 100644 --- a/src/plugins/kibana_utils/common/persistable_state/migrate_to_latest.test.ts +++ b/src/plugins/kibana_utils/common/persistable_state/migrate_to_latest.test.ts @@ -57,7 +57,7 @@ test('returns the same object if there are no migrations to be applied', () => { test('applies a single migration', () => { const newState = migrateToLatest( { - '0.0.2': (migrationV2 as unknown) as MigrateFunction, + '0.0.2': migrationV2 as unknown as MigrateFunction, }, { state: { name: 'Foo' }, @@ -74,7 +74,7 @@ test('applies a single migration', () => { test('does not apply migration if it has the same version as state', () => { const newState = migrateToLatest( { - '0.0.54': (migrationV2 as unknown) as MigrateFunction, + '0.0.54': migrationV2 as unknown as MigrateFunction, }, { state: { name: 'Foo' }, @@ -90,7 +90,7 @@ test('does not apply migration if it has the same version as state', () => { test('does not apply migration if it has lower version', () => { const newState = migrateToLatest( { - '0.2.2': (migrationV2 as unknown) as MigrateFunction, + '0.2.2': migrationV2 as unknown as MigrateFunction, }, { state: { name: 'Foo' }, @@ -106,8 +106,8 @@ test('does not apply migration if it has lower version', () => { test('applies two migrations consecutively', () => { const newState = migrateToLatest( { - '7.14.0': (migrationV2 as unknown) as MigrateFunction, - '7.14.2': (migrationV3 as unknown) as MigrateFunction, + '7.14.0': migrationV2 as unknown as MigrateFunction, + '7.14.2': migrationV3 as unknown as MigrateFunction, }, { state: { name: 'Foo' }, @@ -126,9 +126,9 @@ test('applies two migrations consecutively', () => { test('applies only migrations which are have higher semver version', () => { const newState = migrateToLatest( { - '7.14.0': (migrationV2 as unknown) as MigrateFunction, // not applied + '7.14.0': migrationV2 as unknown as MigrateFunction, // not applied '7.14.1': (() => ({})) as MigrateFunction, // not applied - '7.14.2': (migrationV3 as unknown) as MigrateFunction, + '7.14.2': migrationV3 as unknown as MigrateFunction, }, { state: { firstName: 'FooBar', lastName: 'Baz' }, diff --git a/src/plugins/kibana_utils/common/state_containers/create_state_container_react_helpers.test.tsx b/src/plugins/kibana_utils/common/state_containers/create_state_container_react_helpers.test.tsx index 37d3ae4ad5732..997a3710c58cb 100644 --- a/src/plugins/kibana_utils/common/state_containers/create_state_container_react_helpers.test.tsx +++ b/src/plugins/kibana_utils/common/state_containers/create_state_container_react_helpers.test.tsx @@ -182,9 +182,8 @@ describe('hooks', () => { } ); - const { Provider, useState, useTransitions } = createStateContainerReactHelpers< - typeof stateContainer - >(); + const { Provider, useState, useTransitions } = + createStateContainerReactHelpers(); const Demo: React.FC<{}> = () => { const { cnt } = useState(); const { increment } = useTransitions(); diff --git a/src/plugins/kibana_utils/common/state_containers/types.ts b/src/plugins/kibana_utils/common/state_containers/types.ts index 988a28ad3990a..16571e341912c 100644 --- a/src/plugins/kibana_utils/common/state_containers/types.ts +++ b/src/plugins/kibana_utils/common/state_containers/types.ts @@ -132,16 +132,14 @@ export type Reducer = ( * Utility type for inferring state shape from {@link StateContainer} * @public */ -export type UnboxState< - Container extends StateContainer -> = Container extends StateContainer ? T : never; +export type UnboxState> = + Container extends StateContainer ? T : never; /** * Utility type for inferring transitions type from {@link StateContainer} * @public */ -export type UnboxTransitions< - Container extends StateContainer -> = Container extends StateContainer ? T : never; +export type UnboxTransitions> = + Container extends StateContainer ? T : never; /** * @public diff --git a/src/plugins/kibana_utils/public/state_management/state_encoder/encode_decode_state.ts b/src/plugins/kibana_utils/public/state_management/state_encoder/encode_decode_state.ts index a53bf104228bf..3fa11164fad28 100644 --- a/src/plugins/kibana_utils/public/state_management/state_encoder/encode_decode_state.ts +++ b/src/plugins/kibana_utils/public/state_management/state_encoder/encode_decode_state.ts @@ -17,7 +17,7 @@ export function decodeState(expandedOrHashedState: string): State { if (isStateHash(expandedOrHashedState)) { return retrieveState(expandedOrHashedState); } else { - return (rison.decode(expandedOrHashedState) as unknown) as State; + return rison.decode(expandedOrHashedState) as unknown as State; } } @@ -29,7 +29,7 @@ export function encodeState(state: State, useHash: boolean): string { if (useHash) { return persistState(state); } else { - return rison.encode((state as unknown) as RisonValue); + return rison.encode(state as unknown as RisonValue); } } diff --git a/src/plugins/management/common/locator.ts b/src/plugins/management/common/locator.ts index f56b2885be092..bff90cea5d111 100644 --- a/src/plugins/management/common/locator.ts +++ b/src/plugins/management/common/locator.ts @@ -20,7 +20,8 @@ export interface ManagementAppLocatorParams extends SerializableRecord { export type ManagementAppLocator = LocatorPublic; export class ManagementAppLocatorDefinition - implements LocatorDefinition { + implements LocatorDefinition +{ public readonly id = MANAGEMENT_APP_LOCATOR; public readonly getLocation = async (params: ManagementAppLocatorParams) => { diff --git a/src/plugins/management/public/management_sections_service.ts b/src/plugins/management/public/management_sections_service.ts index 9d939df46a5d6..219de9b0d8a74 100644 --- a/src/plugins/management/public/management_sections_service.ts +++ b/src/plugins/management/public/management_sections_service.ts @@ -25,10 +25,8 @@ import { } from './types'; import { createGetterSetter } from '../../kibana_utils/public'; -const [ - getSectionsServiceStartPrivate, - setSectionsServiceStartPrivate, -] = createGetterSetter('SectionsServiceStartPrivate'); +const [getSectionsServiceStartPrivate, setSectionsServiceStartPrivate] = + createGetterSetter('SectionsServiceStartPrivate'); export { getSectionsServiceStartPrivate }; diff --git a/src/plugins/management/public/mocks/index.ts b/src/plugins/management/public/mocks/index.ts index 6714e2e0894b7..bf9a7ff0b8216 100644 --- a/src/plugins/management/public/mocks/index.ts +++ b/src/plugins/management/public/mocks/index.ts @@ -11,25 +11,25 @@ import { ManagementSection } from '../index'; import { sharePluginMock } from '../../../share/public/mocks'; export const createManagementSectionMock = () => - (({ + ({ disable: jest.fn(), enable: jest.fn(), registerApp: jest.fn(), getApp: jest.fn(), getEnabledItems: jest.fn().mockReturnValue([]), - } as unknown) as ManagementSection); + } as unknown as ManagementSection); const createSetupContract = (): ManagementSetup => ({ sections: { register: jest.fn(() => createManagementSectionMock()), - section: ({ + section: { ingest: createManagementSectionMock(), data: createManagementSectionMock(), insightsAndAlerting: createManagementSectionMock(), security: createManagementSectionMock(), kibana: createManagementSectionMock(), stack: createManagementSectionMock(), - } as unknown) as DefinedSections, + } as unknown as DefinedSections, }, locator: { ...sharePluginMock.createLocator(), diff --git a/src/plugins/management/public/plugin.ts b/src/plugins/management/public/plugin.ts index 34719fb5070e1..acec140fd6521 100644 --- a/src/plugins/management/public/plugin.ts +++ b/src/plugins/management/public/plugin.ts @@ -48,7 +48,8 @@ export class ManagementPlugin ManagementStart, ManagementSetupDependencies, ManagementStartDependencies - > { + > +{ private readonly managementSections = new ManagementSectionsService(); private readonly appUpdater = new BehaviorSubject(() => { diff --git a/src/plugins/management/server/plugin.ts b/src/plugins/management/server/plugin.ts index cc3798d855c59..13471ad73083d 100644 --- a/src/plugins/management/server/plugin.ts +++ b/src/plugins/management/server/plugin.ts @@ -21,7 +21,8 @@ export interface ManagementSetup { } export class ManagementServerPlugin - implements Plugin { + implements Plugin +{ private readonly logger: Logger; constructor(initializerContext: PluginInitializerContext) { diff --git a/src/plugins/maps_ems/public/service_settings/service_settings.test.js b/src/plugins/maps_ems/public/service_settings/service_settings.test.js index eb67997c253b9..997bf5de599d6 100644 --- a/src/plugins/maps_ems/public/service_settings/service_settings.test.js +++ b/src/plugins/maps_ems/public/service_settings/service_settings.test.js @@ -125,8 +125,7 @@ describe('service_settings (FKA tile_map test)', function () { { id: 'road_map', name: 'Road Map - Bright', - url: - 'https://tiles.foobar/raster/styles/osm-bright/{z}/{x}/{y}.png?elastic_tile_service_tos=agree&my_app_name=kibana&my_app_version=1.2.3&license=sspl', + url: 'https://tiles.foobar/raster/styles/osm-bright/{z}/{x}/{y}.png?elastic_tile_service_tos=agree&my_app_name=kibana&my_app_version=1.2.3&license=sspl', minZoom: 0, maxZoom: 10, attribution: diff --git a/src/plugins/navigation/public/plugin.ts b/src/plugins/navigation/public/plugin.ts index 436390c630ea7..e9a95312cba92 100644 --- a/src/plugins/navigation/public/plugin.ts +++ b/src/plugins/navigation/public/plugin.ts @@ -15,8 +15,10 @@ import { import { TopNavMenuExtensionsRegistry, createTopNav } from './top_nav_menu'; export class NavigationPublicPlugin - implements Plugin { - private readonly topNavMenuExtensionsRegistry: TopNavMenuExtensionsRegistry = new TopNavMenuExtensionsRegistry(); + implements Plugin +{ + private readonly topNavMenuExtensionsRegistry: TopNavMenuExtensionsRegistry = + new TopNavMenuExtensionsRegistry(); constructor(initializerContext: PluginInitializerContext) {} diff --git a/src/plugins/newsfeed/public/plugin.tsx b/src/plugins/newsfeed/public/plugin.tsx index 656fc2ef00bb9..babfb1dbeeb92 100644 --- a/src/plugins/newsfeed/public/plugin.tsx +++ b/src/plugins/newsfeed/public/plugin.tsx @@ -21,7 +21,8 @@ export type NewsfeedPublicPluginSetup = ReturnType; export class NewsfeedPublicPlugin - implements Plugin { + implements Plugin +{ private readonly kibanaVersion: string; private readonly config: NewsfeedPluginBrowserConfig; private readonly stop$ = new Rx.ReplaySubject(1); diff --git a/src/plugins/presentation_util/common/lib/test_helpers/test_styles.ts b/src/plugins/presentation_util/common/lib/test_helpers/test_styles.ts index 99b7ce6c38d2b..a2282c8d5cc9a 100644 --- a/src/plugins/presentation_util/common/lib/test_helpers/test_styles.ts +++ b/src/plugins/presentation_util/common/lib/test_helpers/test_styles.ts @@ -18,6 +18,5 @@ export const fontStyle = { fontSize: '14px', lineHeight: '21px', }, - css: - 'font-family:Chalkboard, serif;font-weight:bolder;font-style:normal;text-decoration:underline;color:pink;text-align:center;font-size:14px;line-height:21px', + css: 'font-family:Chalkboard, serif;font-weight:bolder;font-style:normal;text-decoration:underline;color:pink;text-align:center;font-size:14px;line-height:21px', }; diff --git a/src/plugins/presentation_util/public/__stories__/wait_for.tsx b/src/plugins/presentation_util/public/__stories__/wait_for.tsx index b6421ec7adf5e..7dd8d8514b840 100644 --- a/src/plugins/presentation_util/public/__stories__/wait_for.tsx +++ b/src/plugins/presentation_util/public/__stories__/wait_for.tsx @@ -12,30 +12,29 @@ import { Story } from '@storybook/react'; import { StoryFnReactReturnType } from '@storybook/react/dist/client/preview/types'; import { EuiLoadingSpinner } from '@elastic/eui'; -export const waitFor = ( - waitTarget: Promise, - spinner: ReactElement | null = -) => (CurrentStory: Story) => { - const [storyComponent, setStory] = useState(); - const componentIsMounted = useRef(false); +export const waitFor = + (waitTarget: Promise, spinner: ReactElement | null = ) => + (CurrentStory: Story) => { + const [storyComponent, setStory] = useState(); + const componentIsMounted = useRef(false); - useEffect(() => { - componentIsMounted.current = true; - return () => { - componentIsMounted.current = false; - }; - }, []); + useEffect(() => { + componentIsMounted.current = true; + return () => { + componentIsMounted.current = false; + }; + }, []); - useEffect(() => { - if (!storyComponent) { - waitTarget.then((waitedTarget: any) => { - if (!componentIsMounted.current) return; - act(() => { - setStory(); + useEffect(() => { + if (!storyComponent) { + waitTarget.then((waitedTarget: any) => { + if (!componentIsMounted.current) return; + act(() => { + setStory(); + }); }); - }); - } - }, [CurrentStory, storyComponent]); + } + }, [CurrentStory, storyComponent]); - return storyComponent ?? spinner; -}; + return storyComponent ?? spinner; + }; diff --git a/src/plugins/presentation_util/public/plugin.ts b/src/plugins/presentation_util/public/plugin.ts index 00931c5730fe3..f34bd2f1f8afe 100644 --- a/src/plugins/presentation_util/public/plugin.ts +++ b/src/plugins/presentation_util/public/plugin.ts @@ -23,7 +23,8 @@ export class PresentationUtilPlugin PresentationUtilPluginStart, PresentationUtilPluginSetupDeps, PresentationUtilPluginStartDeps - > { + > +{ public setup( _coreSetup: CoreSetup, _setupPlugins: PresentationUtilPluginSetupDeps diff --git a/src/plugins/saved_objects/public/finder/saved_object_finder.test.tsx b/src/plugins/saved_objects/public/finder/saved_object_finder.test.tsx index c589908ea7a2b..758ae14db8e17 100644 --- a/src/plugins/saved_objects/public/finder/saved_object_finder.test.tsx +++ b/src/plugins/saved_objects/public/finder/saved_object_finder.test.tsx @@ -53,7 +53,7 @@ describe('SavedObjectsFinder', () => { it('should call saved object client on startup', async () => { const core = coreMock.createStart(); - ((core.savedObjects.client.find as any) as jest.SpyInstance).mockImplementation(() => + (core.savedObjects.client.find as any as jest.SpyInstance).mockImplementation(() => Promise.resolve({ savedObjects: [doc] }) ); core.uiSettings.get.mockImplementation(() => 10); @@ -80,7 +80,7 @@ describe('SavedObjectsFinder', () => { it('should list initial items', async () => { const core = coreMock.createStart(); - ((core.savedObjects.client.find as any) as jest.SpyInstance).mockImplementation(() => + (core.savedObjects.client.find as any as jest.SpyInstance).mockImplementation(() => Promise.resolve({ savedObjects: [doc] }) ); core.uiSettings.get.mockImplementation(() => 10); @@ -103,7 +103,7 @@ describe('SavedObjectsFinder', () => { it('should call onChoose on item click', async () => { const chooseStub = sinon.stub(); const core = coreMock.createStart(); - ((core.savedObjects.client.find as any) as jest.SpyInstance).mockImplementation(() => + (core.savedObjects.client.find as any as jest.SpyInstance).mockImplementation(() => Promise.resolve({ savedObjects: [doc] }) ); core.uiSettings.get.mockImplementation(() => 10); @@ -128,7 +128,7 @@ describe('SavedObjectsFinder', () => { describe('sorting', () => { it('should list items ascending', async () => { const core = coreMock.createStart(); - ((core.savedObjects.client.find as any) as jest.SpyInstance).mockImplementation(() => + (core.savedObjects.client.find as any as jest.SpyInstance).mockImplementation(() => Promise.resolve({ savedObjects: [doc, doc2] }) ); core.uiSettings.get.mockImplementation(() => 10); @@ -149,7 +149,7 @@ describe('SavedObjectsFinder', () => { it('should list items descending', async () => { const core = coreMock.createStart(); - ((core.savedObjects.client.find as any) as jest.SpyInstance).mockImplementation(() => + (core.savedObjects.client.find as any as jest.SpyInstance).mockImplementation(() => Promise.resolve({ savedObjects: [doc, doc2] }) ); core.uiSettings.get.mockImplementation(() => 10); @@ -173,7 +173,7 @@ describe('SavedObjectsFinder', () => { it('should not show the saved objects which get filtered by showSavedObject', async () => { const core = coreMock.createStart(); - ((core.savedObjects.client.find as any) as jest.SpyInstance).mockImplementation(() => + (core.savedObjects.client.find as any as jest.SpyInstance).mockImplementation(() => Promise.resolve({ savedObjects: [doc, doc2] }) ); core.uiSettings.get.mockImplementation(() => 10); @@ -203,7 +203,7 @@ describe('SavedObjectsFinder', () => { describe('search', () => { it('should request filtered list on search input', async () => { const core = coreMock.createStart(); - ((core.savedObjects.client.find as any) as jest.SpyInstance).mockImplementation(() => + (core.savedObjects.client.find as any as jest.SpyInstance).mockImplementation(() => Promise.resolve({ savedObjects: [doc, doc2] }) ); core.uiSettings.get.mockImplementation(() => 10); @@ -278,7 +278,7 @@ describe('SavedObjectsFinder', () => { it('should respect response order on search input', async () => { const core = coreMock.createStart(); - ((core.savedObjects.client.find as any) as jest.SpyInstance).mockImplementation(() => + (core.savedObjects.client.find as any as jest.SpyInstance).mockImplementation(() => Promise.resolve({ savedObjects: [doc, doc2] }) ); core.uiSettings.get.mockImplementation(() => 10); @@ -306,7 +306,7 @@ describe('SavedObjectsFinder', () => { it('should request multiple saved object types at once', async () => { const core = coreMock.createStart(); - ((core.savedObjects.client.find as any) as jest.SpyInstance).mockImplementation(() => + (core.savedObjects.client.find as any as jest.SpyInstance).mockImplementation(() => Promise.resolve({ savedObjects: [doc, doc2] }) ); core.uiSettings.get.mockImplementation(() => 10); @@ -358,7 +358,7 @@ describe('SavedObjectsFinder', () => { it('should not render filter buttons if disabled', async () => { const core = coreMock.createStart(); - ((core.savedObjects.client.find as any) as jest.SpyInstance).mockImplementation(() => + (core.savedObjects.client.find as any as jest.SpyInstance).mockImplementation(() => Promise.resolve({ savedObjects: [doc, doc2, doc3], }) @@ -383,7 +383,7 @@ describe('SavedObjectsFinder', () => { it('should not render filter buttons if there is only one type in the list', async () => { const core = coreMock.createStart(); - ((core.savedObjects.client.find as any) as jest.SpyInstance).mockImplementation(() => + (core.savedObjects.client.find as any as jest.SpyInstance).mockImplementation(() => Promise.resolve({ savedObjects: [doc, doc2], }) @@ -408,7 +408,7 @@ describe('SavedObjectsFinder', () => { it('should apply filter if selected', async () => { const core = coreMock.createStart(); - ((core.savedObjects.client.find as any) as jest.SpyInstance).mockImplementation(() => + (core.savedObjects.client.find as any as jest.SpyInstance).mockImplementation(() => Promise.resolve({ savedObjects: [doc, doc2, doc3], }) @@ -438,7 +438,7 @@ describe('SavedObjectsFinder', () => { it('should display no items message if there are no items', async () => { const core = coreMock.createStart(); - ((core.savedObjects.client.find as any) as jest.SpyInstance).mockImplementation(() => + (core.savedObjects.client.find as any as jest.SpyInstance).mockImplementation(() => Promise.resolve({ savedObjects: [] }) ); core.uiSettings.get.mockImplementation(() => 10); @@ -469,7 +469,7 @@ describe('SavedObjectsFinder', () => { it('should show a table pagination with initial per page', async () => { const core = coreMock.createStart(); - ((core.savedObjects.client.find as any) as jest.SpyInstance).mockImplementation(() => + (core.savedObjects.client.find as any as jest.SpyInstance).mockImplementation(() => Promise.resolve({ savedObjects: longItemList }) ); core.uiSettings.get.mockImplementation(() => 10); @@ -491,7 +491,7 @@ describe('SavedObjectsFinder', () => { it('should allow switching the page size', async () => { const core = coreMock.createStart(); - ((core.savedObjects.client.find as any) as jest.SpyInstance).mockImplementation(() => + (core.savedObjects.client.find as any as jest.SpyInstance).mockImplementation(() => Promise.resolve({ savedObjects: longItemList }) ); core.uiSettings.get.mockImplementation(() => 10); @@ -513,7 +513,7 @@ describe('SavedObjectsFinder', () => { it('should switch page correctly', async () => { const core = coreMock.createStart(); - ((core.savedObjects.client.find as any) as jest.SpyInstance).mockImplementation(() => + (core.savedObjects.client.find as any as jest.SpyInstance).mockImplementation(() => Promise.resolve({ savedObjects: longItemList }) ); core.uiSettings.get.mockImplementation(() => 10); @@ -535,7 +535,7 @@ describe('SavedObjectsFinder', () => { it('should show an ordinary pagination for fixed page sizes', async () => { const core = coreMock.createStart(); - ((core.savedObjects.client.find as any) as jest.SpyInstance).mockImplementation(() => + (core.savedObjects.client.find as any as jest.SpyInstance).mockImplementation(() => Promise.resolve({ savedObjects: longItemList }) ); core.uiSettings.get.mockImplementation(() => 10); @@ -557,7 +557,7 @@ describe('SavedObjectsFinder', () => { it('should switch page correctly for fixed page sizes', async () => { const core = coreMock.createStart(); - ((core.savedObjects.client.find as any) as jest.SpyInstance).mockImplementation(() => + (core.savedObjects.client.find as any as jest.SpyInstance).mockImplementation(() => Promise.resolve({ savedObjects: longItemList }) ); core.uiSettings.get.mockImplementation(() => 10); @@ -596,7 +596,7 @@ describe('SavedObjectsFinder', () => { it('should hide the spinner if data is shown', async () => { const core = coreMock.createStart(); - ((core.savedObjects.client.find as any) as jest.SpyInstance).mockImplementation(() => + (core.savedObjects.client.find as any as jest.SpyInstance).mockImplementation(() => Promise.resolve({ savedObjects: [doc] }) ); @@ -621,7 +621,7 @@ describe('SavedObjectsFinder', () => { it('should not show the spinner if there are already items', async () => { const core = coreMock.createStart(); - ((core.savedObjects.client.find as any) as jest.SpyInstance).mockImplementation(() => + (core.savedObjects.client.find as any as jest.SpyInstance).mockImplementation(() => Promise.resolve({ savedObjects: [doc] }) ); @@ -648,7 +648,7 @@ describe('SavedObjectsFinder', () => { it('should render with children', async () => { const core = coreMock.createStart(); - ((core.savedObjects.client.find as any) as jest.SpyInstance).mockImplementation(() => + (core.savedObjects.client.find as any as jest.SpyInstance).mockImplementation(() => Promise.resolve({ savedObjects: [doc, doc2] }) ); core.uiSettings.get.mockImplementation(() => 10); diff --git a/src/plugins/saved_objects/public/plugin.ts b/src/plugins/saved_objects/public/plugin.ts index c8e62efc1a867..d1b9f0f57fcfc 100644 --- a/src/plugins/saved_objects/public/plugin.ts +++ b/src/plugins/saved_objects/public/plugin.ts @@ -39,7 +39,8 @@ export interface SavedObjectsStartDeps { } export class SavedObjectsPublicPlugin - implements Plugin { + implements Plugin +{ private decoratorRegistry = new SavedObjectDecoratorRegistry(); public setup(): SavedObjectSetup { diff --git a/src/plugins/saved_objects/public/saved_object/helpers/serialize_saved_object.ts b/src/plugins/saved_objects/public/saved_object/helpers/serialize_saved_object.ts index efe7a85f8f1e1..c5e6e158a2cbd 100644 --- a/src/plugins/saved_objects/public/saved_object/helpers/serialize_saved_object.ts +++ b/src/plugins/saved_objects/public/saved_object/helpers/serialize_saved_object.ts @@ -31,10 +31,8 @@ export function serializeSavedObject(savedObject: SavedObject, config: SavedObje }); if (savedObject.searchSource) { - const { - searchSourceJSON, - references: searchSourceReferences, - } = savedObject.searchSource.serialize(); + const { searchSourceJSON, references: searchSourceReferences } = + savedObject.searchSource.serialize(); attributes.kibanaSavedObjectMeta = { searchSourceJSON }; references.push(...searchSourceReferences); } diff --git a/src/plugins/saved_objects/public/saved_object/saved_object.test.ts b/src/plugins/saved_objects/public/saved_object/saved_object.test.ts index 6d35f94eec510..2f45ee211c8c9 100644 --- a/src/plugins/saved_objects/public/saved_object/saved_object.test.ts +++ b/src/plugins/saved_objects/public/saved_object/saved_object.test.ts @@ -93,7 +93,7 @@ describe('Saved Object', () => { const initSavedObjectClass = () => { SavedObjectClass = createSavedObjectClass( - ({ + { savedObjectsClient: savedObjectsClientStub, indexPatterns: dataStartMock.indexPatterns, search: { @@ -104,7 +104,7 @@ describe('Saved Object', () => { createEmpty: createSearchSourceMock, }, }, - } as unknown) as SavedObjectKibanaServices, + } as unknown as SavedObjectKibanaServices, decoratorRegistry ); }; @@ -653,13 +653,13 @@ describe('Saved Object', () => { it('passes references to search source parsing function', async () => { SavedObjectClass = createSavedObjectClass( - ({ + { savedObjectsClient: savedObjectsClientStub, indexPatterns: dataStartMock.indexPatterns, search: { ...dataStartMock.search, }, - } as unknown) as SavedObjectKibanaServices, + } as unknown as SavedObjectKibanaServices, decoratorRegistry ); const savedObject = new SavedObjectClass({ type: 'dashboard', searchSource: true }); diff --git a/src/plugins/saved_objects_management/public/management_section/mount_section.tsx b/src/plugins/saved_objects_management/public/management_section/mount_section.tsx index e5aaec6fa4bbc..43cd5c93aa807 100644 --- a/src/plugins/saved_objects_management/public/management_section/mount_section.tsx +++ b/src/plugins/saved_objects_management/public/management_section/mount_section.tsx @@ -37,11 +37,8 @@ export const mountManagementSection = async ({ mountParams, serviceRegistry, }: MountParams) => { - const [ - coreStart, - { data, savedObjectsTaggingOss, spaces: spacesApi }, - pluginStart, - ] = await core.getStartServices(); + const [coreStart, { data, savedObjectsTaggingOss, spaces: spacesApi }, pluginStart] = + await core.getStartServices(); const { element, history, setBreadcrumbs } = mountParams; if (allowedObjectTypes === undefined) { allowedObjectTypes = await getAllowedTypes(coreStart.http); diff --git a/src/plugins/saved_objects_management/public/management_section/object_view/saved_object_view.tsx b/src/plugins/saved_objects_management/public/management_section/object_view/saved_object_view.tsx index 3bf70de1abdad..079a1c07da197 100644 --- a/src/plugins/saved_objects_management/public/management_section/object_view/saved_object_view.tsx +++ b/src/plugins/saved_objects_management/public/management_section/object_view/saved_object_view.tsx @@ -86,14 +86,8 @@ export class SavedObjectEdition extends Component< } render() { - const { - capabilities, - notFoundType, - serviceRegistry, - http, - serviceName, - savedObjectsClient, - } = this.props; + const { capabilities, notFoundType, serviceRegistry, http, serviceName, savedObjectsClient } = + this.props; const { type } = this.state; const { object } = this.state; const { edit: canEdit, delete: canDelete } = capabilities.savedObjectsManagement as Record< diff --git a/src/plugins/saved_objects_management/public/management_section/objects_table/components/flyout.test.tsx b/src/plugins/saved_objects_management/public/management_section/objects_table/components/flyout.test.tsx index f055817f69105..30d172b89256e 100644 --- a/src/plugins/saved_objects_management/public/management_section/objects_table/components/flyout.test.tsx +++ b/src/plugins/saved_objects_management/public/management_section/objects_table/components/flyout.test.tsx @@ -16,16 +16,16 @@ import { Flyout, FlyoutProps, FlyoutState } from './flyout'; import { ShallowWrapper } from 'enzyme'; import { dataPluginMock } from '../../../../../data/public/mocks'; -const mockFile = ({ +const mockFile = { name: 'foo.ndjson', path: '/home/foo.ndjson', -} as unknown) as File; +} as unknown as File; describe('Flyout', () => { let defaultProps: FlyoutProps; const shallowRender = (props: FlyoutProps) => { - return (shallowWithI18nProvider() as unknown) as ShallowWrapper< + return shallowWithI18nProvider() as unknown as ShallowWrapper< FlyoutProps, FlyoutState, Flyout diff --git a/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.test.tsx b/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.test.tsx index 9b8474fc08bbd..21a629097cbb4 100644 --- a/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.test.tsx +++ b/src/plugins/saved_objects_management/public/management_section/objects_table/saved_objects_table.test.tsx @@ -81,9 +81,9 @@ describe('SavedObjectsTable', () => { let search: ReturnType['search']; const shallowRender = (overrides: Partial = {}) => { - return (shallowWithI18nProvider( + return shallowWithI18nProvider( - ) as unknown) as ShallowWrapper< + ) as unknown as ShallowWrapper< SavedObjectsTableProps, SavedObjectsTableState, SavedObjectsTable diff --git a/src/plugins/saved_objects_management/public/plugin.ts b/src/plugins/saved_objects_management/public/plugin.ts index cc6bd83005463..9f0a7aa352540 100644 --- a/src/plugins/saved_objects_management/public/plugin.ts +++ b/src/plugins/saved_objects_management/public/plugin.ts @@ -60,7 +60,8 @@ export class SavedObjectsManagementPlugin SavedObjectsManagementPluginStart, SetupDependencies, StartDependencies - > { + > +{ private actionService = new SavedObjectsManagementActionService(); private columnService = new SavedObjectsManagementColumnService(); private serviceRegistry = new SavedObjectsManagementServiceRegistry(); diff --git a/src/plugins/saved_objects_management/public/services/columns/share_saved_objects_to_space_column.tsx b/src/plugins/saved_objects_management/public/services/columns/share_saved_objects_to_space_column.tsx index 736b656f15d93..6971021a81e84 100644 --- a/src/plugins/saved_objects_management/public/services/columns/share_saved_objects_to_space_column.tsx +++ b/src/plugins/saved_objects_management/public/services/columns/share_saved_objects_to_space_column.tsx @@ -25,7 +25,8 @@ const Wrapper = ({ spacesApiUi, props }: WrapperProps) => { }; export class ShareToSpaceSavedObjectsManagementColumn - implements SavedObjectsManagementColumn { + implements SavedObjectsManagementColumn +{ public id: string = 'share_saved_objects_to_space'; public euiColumn = { diff --git a/src/plugins/saved_objects_management/public/services/service_registry.ts b/src/plugins/saved_objects_management/public/services/service_registry.ts index 0b4c33a63ea74..9e4ed5a48993c 100644 --- a/src/plugins/saved_objects_management/public/services/service_registry.ts +++ b/src/plugins/saved_objects_management/public/services/service_registry.ts @@ -15,7 +15,8 @@ export interface SavedObjectsManagementServiceRegistryEntry { title: string; } -export type ISavedObjectsManagementServiceRegistry = PublicMethodsOf; +export type ISavedObjectsManagementServiceRegistry = + PublicMethodsOf; export class SavedObjectsManagementServiceRegistry { private readonly registry = new Map(); diff --git a/src/plugins/saved_objects_management/server/plugin.ts b/src/plugins/saved_objects_management/server/plugin.ts index cc0fb068a7a75..c84f7b6277207 100644 --- a/src/plugins/saved_objects_management/server/plugin.ts +++ b/src/plugins/saved_objects_management/server/plugin.ts @@ -15,7 +15,8 @@ import { registerRoutes } from './routes'; import { capabilitiesProvider } from './capabilities_provider'; export class SavedObjectsManagementPlugin - implements Plugin { + implements Plugin +{ private readonly logger: Logger; private managementService$ = new Subject(); diff --git a/src/plugins/saved_objects_tagging_oss/public/decorator/factory.ts b/src/plugins/saved_objects_tagging_oss/public/decorator/factory.ts index e3f4353d9cb11..ebd490a8761eb 100644 --- a/src/plugins/saved_objects_tagging_oss/public/decorator/factory.ts +++ b/src/plugins/saved_objects_tagging_oss/public/decorator/factory.ts @@ -13,10 +13,11 @@ import { decorateObject } from './decorate_object'; export const decoratorId = 'tag'; -export const tagDecoratorFactory: SavedObjectDecoratorFactory = () => { - return { - getId: () => decoratorId, - decorateConfig, - decorateObject, +export const tagDecoratorFactory: SavedObjectDecoratorFactory = + () => { + return { + getId: () => decoratorId, + decorateConfig, + decorateObject, + }; }; -}; diff --git a/src/plugins/saved_objects_tagging_oss/public/decorator/inject_tag_references.ts b/src/plugins/saved_objects_tagging_oss/public/decorator/inject_tag_references.ts index bcaf03e60783f..a73b70dd87c06 100644 --- a/src/plugins/saved_objects_tagging_oss/public/decorator/inject_tag_references.ts +++ b/src/plugins/saved_objects_tagging_oss/public/decorator/inject_tag_references.ts @@ -18,7 +18,7 @@ export const injectTagReferences: Required['injectReferences' object, references = [] ) => { - ((object as unknown) as InternalTagDecoratedSavedObject).__tags = references + (object as unknown as InternalTagDecoratedSavedObject).__tags = references .filter(({ type }) => type === 'tag') .map(({ id }) => id); }; diff --git a/src/plugins/saved_objects_tagging_oss/public/plugin.ts b/src/plugins/saved_objects_tagging_oss/public/plugin.ts index 82592dca296f5..f923a08eb0b06 100644 --- a/src/plugins/saved_objects_tagging_oss/public/plugin.ts +++ b/src/plugins/saved_objects_tagging_oss/public/plugin.ts @@ -18,7 +18,8 @@ interface SetupDeps { export class SavedObjectTaggingOssPlugin implements - Plugin { + Plugin +{ private apiRegistered = false; private api?: SavedObjectsTaggingApi; diff --git a/src/plugins/screenshot_mode/common/get_set_browser_screenshot_mode.ts b/src/plugins/screenshot_mode/common/get_set_browser_screenshot_mode.ts index 7714f88cebeec..ff79ccf0126f4 100644 --- a/src/plugins/screenshot_mode/common/get_set_browser_screenshot_mode.ts +++ b/src/plugins/screenshot_mode/common/get_set_browser_screenshot_mode.ts @@ -21,7 +21,7 @@ export const KBN_SCREENSHOT_MODE_ENABLED_KEY = '__KBN_SCREENSHOT_MODE_ENABLED_KE */ export const getScreenshotMode = (): boolean => { return ( - ((window as unknown) as Record)[KBN_SCREENSHOT_MODE_ENABLED_KEY] === true || + (window as unknown as Record)[KBN_SCREENSHOT_MODE_ENABLED_KEY] === true || window.localStorage.getItem(KBN_SCREENSHOT_MODE_ENABLED_KEY) === 'true' ); }; diff --git a/src/plugins/screenshot_mode/server/plugin.ts b/src/plugins/screenshot_mode/server/plugin.ts index 9ef410d999ea5..9295451f640c2 100644 --- a/src/plugins/screenshot_mode/server/plugin.ts +++ b/src/plugins/screenshot_mode/server/plugin.ts @@ -15,7 +15,8 @@ import { import { isScreenshotMode } from './is_screenshot_mode'; export class ScreenshotModePlugin - implements Plugin { + implements Plugin +{ public setup(core: CoreSetup): ScreenshotModePluginSetup { core.http.registerRouteHandlerContext( 'screenshotMode', diff --git a/src/plugins/security_oss/public/insecure_cluster_service/components/default_alert.tsx b/src/plugins/security_oss/public/insecure_cluster_service/components/default_alert.tsx index 288d49457a64f..192be5188041b 100644 --- a/src/plugins/security_oss/public/insecure_cluster_service/components/default_alert.tsx +++ b/src/plugins/security_oss/public/insecure_cluster_service/components/default_alert.tsx @@ -25,63 +25,62 @@ export const defaultAlertTitle = i18n.translate('security.checkup.insecureCluste defaultMessage: 'Your data is not secure', }); -export const defaultAlertText: (onDismiss: (persist: boolean) => void) => MountPoint = ( - onDismiss -) => (e) => { - const AlertText = () => { - const [persist, setPersist] = useState(false); +export const defaultAlertText: (onDismiss: (persist: boolean) => void) => MountPoint = + (onDismiss) => (e) => { + const AlertText = () => { + const [persist, setPersist] = useState(false); - return ( - -
- - +
+ + + + + setPersist(changeEvent.target.checked)} + label={i18n.translate('security.checkup.dontShowAgain', { + defaultMessage: `Don't show again`, + })} /> - - - setPersist(changeEvent.target.checked)} - label={i18n.translate('security.checkup.dontShowAgain', { - defaultMessage: `Don't show again`, - })} - /> - - - - - {i18n.translate('security.checkup.learnMoreButtonText', { - defaultMessage: `Learn more`, - })} - - - - onDismiss(persist)} - data-test-subj="defaultDismissAlertButton" - > - {i18n.translate('security.checkup.dismissButtonText', { - defaultMessage: `Dismiss`, - })} - - - -
- - ); - }; + + + + + {i18n.translate('security.checkup.learnMoreButtonText', { + defaultMessage: `Learn more`, + })} + + + + onDismiss(persist)} + data-test-subj="defaultDismissAlertButton" + > + {i18n.translate('security.checkup.dismissButtonText', { + defaultMessage: `Dismiss`, + })} + + + +
+
+ ); + }; - render(, e); + render(, e); - return () => unmountComponentAtNode(e); -}; + return () => unmountComponentAtNode(e); + }; diff --git a/src/plugins/security_oss/public/plugin.mock.ts b/src/plugins/security_oss/public/plugin.mock.ts index 324e0cdfd8524..23a6050a0e501 100644 --- a/src/plugins/security_oss/public/plugin.mock.ts +++ b/src/plugins/security_oss/public/plugin.mock.ts @@ -20,7 +20,8 @@ export const mockSecurityOssPlugin = { }, createStart: () => { return { - insecureCluster: mockInsecureClusterService.createStart() as jest.Mocked, + insecureCluster: + mockInsecureClusterService.createStart() as jest.Mocked, anonymousAccess: { getAccessURLParameters: jest.fn().mockResolvedValue(null), getCapabilities: jest.fn().mockResolvedValue({}), diff --git a/src/plugins/security_oss/public/plugin.ts b/src/plugins/security_oss/public/plugin.ts index 0104950f22366..c26323b01f356 100644 --- a/src/plugins/security_oss/public/plugin.ts +++ b/src/plugins/security_oss/public/plugin.ts @@ -35,7 +35,8 @@ export interface SecurityOssPluginStart { } export class SecurityOssPlugin - implements Plugin { + implements Plugin +{ private readonly config = this.initializerContext.config.get(); private readonly insecureClusterService = new InsecureClusterService(this.config, localStorage); private readonly appStateService = new AppStateService(); diff --git a/src/plugins/share/public/components/url_panel_content.test.tsx b/src/plugins/share/public/components/url_panel_content.test.tsx index 422cd0573a427..5d99609cd0e02 100644 --- a/src/plugins/share/public/components/url_panel_content.test.tsx +++ b/src/plugins/share/public/components/url_panel_content.test.tsx @@ -73,9 +73,9 @@ describe('share url panel content', () => { /> ); await act(async () => { - component.find(EuiSwitch).prop('onChange')!(({ + component.find(EuiSwitch).prop('onChange')!({ target: { checked: true }, - } as unknown) as EuiSwitchEvent); + } as unknown as EuiSwitchEvent); }); expect(shortenUrlMock).toHaveBeenCalledWith( 'http://localhost:5601/app/myapp#/?_g=()&_a=()', @@ -164,9 +164,9 @@ describe('share url panel content', () => { /> ); await act(async () => { - component.find(EuiSwitch).prop('onChange')!(({ + component.find(EuiSwitch).prop('onChange')!({ target: { checked: true }, - } as unknown) as EuiSwitchEvent); + } as unknown as EuiSwitchEvent); }); expect(shortenUrlMock).toHaveBeenCalledWith( 'http://localhost:5601/app/myapp#/?embed=true&_g=()&_a=()', diff --git a/src/plugins/share/public/components/url_panel_content.tsx b/src/plugins/share/public/components/url_panel_content.tsx index 009d70befca66..80c29f10b57d5 100644 --- a/src/plugins/share/public/components/url_panel_content.tsx +++ b/src/plugins/share/public/components/url_panel_content.tsx @@ -104,7 +104,8 @@ export class UrlPanelContent extends Component { if (this.props.anonymousAccess) { (async () => { - const anonymousAccessParameters = await this.props.anonymousAccess!.getAccessURLParameters(); + const anonymousAccessParameters = + await this.props.anonymousAccess!.getAccessURLParameters(); if (!this.mounted) { return; @@ -542,19 +543,19 @@ export class UrlPanelContent extends Component { return; } - const setParamValue = (paramName: string) => ( - values: { [queryParam: string]: boolean } = {} - ): void => { - const stateUpdate = { - urlParams: { - ...this.state.urlParams, - [paramName]: { - ...values, + const setParamValue = + (paramName: string) => + (values: { [queryParam: string]: boolean } = {}): void => { + const stateUpdate = { + urlParams: { + ...this.state.urlParams, + [paramName]: { + ...values, + }, }, - }, + }; + this.setState(stateUpdate, this.state.useShortUrl ? this.createShortUrl : this.setUrl); }; - this.setState(stateUpdate, this.state.useShortUrl ? this.createShortUrl : this.setUrl); - }; return ( diff --git a/src/plugins/share/public/lib/url_shortener.test.ts b/src/plugins/share/public/lib/url_shortener.test.ts index 83db0e84a4a54..865fbc6f7e909 100644 --- a/src/plugins/share/public/lib/url_shortener.test.ts +++ b/src/plugins/share/public/lib/url_shortener.test.ts @@ -96,8 +96,7 @@ describe('Url shortener', () => { }); expect(shortUrl).toBe(`http://localhost${basePath}/goto/${shareId}`); expect(postStub).toHaveBeenCalledWith(`/api/shorten_url`, { - body: - '{"url":"/app/discover#/?_g=(refreshInterval:(pause:!f,value:0),time:(from:now-15m,mode:quick,to:now))&_a=(columns:!(_source),index:%27logstash-*%27,interval:auto,query:(query_string:(analyze_wildcard:!t,query:%27*%27)),sort:!(%27@timestamp%27,desc))"}', + body: '{"url":"/app/discover#/?_g=(refreshInterval:(pause:!f,value:0),time:(from:now-15m,mode:quick,to:now))&_a=(columns:!(_source),index:%27logstash-*%27,interval:auto,query:(query_string:(analyze_wildcard:!t,query:%27*%27)),sort:!(%27@timestamp%27,desc))"}', }); }); }); diff --git a/src/plugins/share/public/url_generators/url_generator_contract.ts b/src/plugins/share/public/url_generators/url_generator_contract.ts index b66ba02bde8d1..b21e0f2a35c88 100644 --- a/src/plugins/share/public/url_generators/url_generator_contract.ts +++ b/src/plugins/share/public/url_generators/url_generator_contract.ts @@ -12,9 +12,7 @@ export interface UrlGeneratorContract { id: Id; createUrl(state: UrlGeneratorStateMapping[Id]['State']): Promise; isDeprecated: boolean; - migrate( - state: UrlGeneratorStateMapping[Id]['State'] - ): Promise<{ + migrate(state: UrlGeneratorStateMapping[Id]['State']): Promise<{ state: UrlGeneratorStateMapping[Id]['MigratedState']; id: UrlGeneratorStateMapping[Id]['MigratedId']; }>; diff --git a/src/plugins/share/public/url_generators/url_generator_definition.ts b/src/plugins/share/public/url_generators/url_generator_definition.ts index 5456550c16b3c..32fe51a16d197 100644 --- a/src/plugins/share/public/url_generators/url_generator_definition.ts +++ b/src/plugins/share/public/url_generators/url_generator_definition.ts @@ -31,9 +31,7 @@ export interface UrlGeneratorsDefinition { id: Id; createUrl?: (state: UrlGeneratorStateMapping[Id]['State']) => Promise; isDeprecated?: boolean; - migrate?: ( - state: UrlGeneratorStateMapping[Id]['State'] - ) => Promise<{ + migrate?: (state: UrlGeneratorStateMapping[Id]['State']) => Promise<{ state: UrlGeneratorStateMapping[Id]['MigratedState']; id: UrlGeneratorStateMapping[Id]['MigratedId']; }>; diff --git a/src/plugins/share/public/url_service/redirect/redirect_manager.test.ts b/src/plugins/share/public/url_service/redirect/redirect_manager.test.ts index f610268f529bc..7296ef6d0c137 100644 --- a/src/plugins/share/public/url_service/redirect/redirect_manager.test.ts +++ b/src/plugins/share/public/url_service/redirect/redirect_manager.test.ts @@ -22,7 +22,7 @@ const setup = () => { }; }, migrations: { - '0.0.2': ((({ num }: { num: number }) => ({ num: num * 2 })) as unknown) as MigrateFunction, + '0.0.2': (({ num }: { num: number }) => ({ num: num * 2 })) as unknown as MigrateFunction, }, }); const manager = new RedirectManager({ diff --git a/src/plugins/telemetry/server/collectors/telemetry_plugin/telemetry_plugin_collector.ts b/src/plugins/telemetry/server/collectors/telemetry_plugin/telemetry_plugin_collector.ts index 95bcb8553a459..6d1266b7f27a7 100644 --- a/src/plugins/telemetry/server/collectors/telemetry_plugin/telemetry_plugin_collector.ts +++ b/src/plugins/telemetry/server/collectors/telemetry_plugin/telemetry_plugin_collector.ts @@ -32,9 +32,11 @@ export function createCollectorFetch({ getSavedObjectsClient, }: TelemetryPluginUsageCollectorOptions) { return async function fetchUsageStats(): Promise { - const { sendUsageFrom, allowChangingOptInStatus, optIn = null } = await config$ - .pipe(take(1)) - .toPromise(); + const { + sendUsageFrom, + allowChangingOptInStatus, + optIn = null, + } = await config$.pipe(take(1)).toPromise(); const configTelemetrySendUsageFrom = sendUsageFrom; const configTelemetryOptIn = optIn; diff --git a/src/plugins/telemetry/server/telemetry_collection/get_local_stats.test.ts b/src/plugins/telemetry/server/telemetry_collection/get_local_stats.test.ts index bacfa5e77107f..1a00d0e428016 100644 --- a/src/plugins/telemetry/server/telemetry_collection/get_local_stats.test.ts +++ b/src/plugins/telemetry/server/telemetry_collection/get_local_stats.test.ts @@ -114,13 +114,13 @@ describe('get_local_stats', () => { }, }, ]; - const clusterStats = ({ + const clusterStats = { _nodes: { failed: 123 }, cluster_name: 'real-cool', indices: { totally: 456 }, nodes: { yup: 'abc' }, random: 123, - } as unknown) as estypes.ClusterStatsResponse; + } as unknown as estypes.ClusterStatsResponse; const kibana = { kibana: { diff --git a/src/plugins/telemetry_collection_manager/server/encryption/telemetry_jwks.ts b/src/plugins/telemetry_collection_manager/server/encryption/telemetry_jwks.ts index bf4c2a952c431..b7f4c8a064ac1 100644 --- a/src/plugins/telemetry_collection_manager/server/encryption/telemetry_jwks.ts +++ b/src/plugins/telemetry_collection_manager/server/encryption/telemetry_jwks.ts @@ -16,8 +16,7 @@ export const telemetryJWKS: PublicJWKS = { use: 'enc', alg: 'RSA-OAEP', e: 'AQAB', - n: - 'gjwVNVkOqbTZ6QrxdeYbKDnBzhCZGXM97Iq0dXJlpa-7UegcBemI1ALZkbX6AaDrCmqzetsnxJbVz2gr-uzkc97zzjTvPAn-jM-9cfjfsb-nd70qLY7ru3qdyOLb5-ho8cjmjnAp7VaEPuiNOjZ6V6tXq8Cn5LHH8G6K8oZLU1N4RWqkcAvEIlfaLusfMnl15fe7aZkYaKfVFjD-pti_2JGRV9XZ0knRI2oIRMaroBYpfYJxbpR0NLhR7ND6U5WlvxfnaVvRK4c_plVLOtcROqZVn98Z8yZ6GU14vCcvkIBox2D_xd1gSkpMammTQ3tVAEAvoq_wEn_qEbls1Uucgw', + n: 'gjwVNVkOqbTZ6QrxdeYbKDnBzhCZGXM97Iq0dXJlpa-7UegcBemI1ALZkbX6AaDrCmqzetsnxJbVz2gr-uzkc97zzjTvPAn-jM-9cfjfsb-nd70qLY7ru3qdyOLb5-ho8cjmjnAp7VaEPuiNOjZ6V6tXq8Cn5LHH8G6K8oZLU1N4RWqkcAvEIlfaLusfMnl15fe7aZkYaKfVFjD-pti_2JGRV9XZ0knRI2oIRMaroBYpfYJxbpR0NLhR7ND6U5WlvxfnaVvRK4c_plVLOtcROqZVn98Z8yZ6GU14vCcvkIBox2D_xd1gSkpMammTQ3tVAEAvoq_wEn_qEbls1Uucgw', }, { kty: 'RSA', @@ -25,8 +24,7 @@ export const telemetryJWKS: PublicJWKS = { use: 'enc', alg: 'RSA-OAEP', e: 'AQAB', - n: - 'rEi54h-9hCbqy9Mj_tJmx-dJdtrMmMzkhX5Wd63Pp3dABHpnLJSy--y8QoEa9K9ACaRfExSxgYQ-3K17Yy-UYj3ChAl3hrqZcP2AT3O18Lr2BN7EBjy88lTM0oeck9KLL_iGf8wz8_jeqQFIo3AWrBBuR3VFE0_k-_N1KCenSVm_fE3Nk_ZXm1ByFbgxWUFrYgLfEQn2v0FQYVpfTlbV_awtqoZLYGtuHmaLZhErzJFh6W8zrx8oSpGn8VlVLjF-AR3ugfw2F_HM8ZR8zY1dHVxvoLGz13F5aY8DHn0_ao9t0Yz2Y_SUNviyxMx0eIEJeo2njM2vMzYQNaT1Ghgc-w', + n: 'rEi54h-9hCbqy9Mj_tJmx-dJdtrMmMzkhX5Wd63Pp3dABHpnLJSy--y8QoEa9K9ACaRfExSxgYQ-3K17Yy-UYj3ChAl3hrqZcP2AT3O18Lr2BN7EBjy88lTM0oeck9KLL_iGf8wz8_jeqQFIo3AWrBBuR3VFE0_k-_N1KCenSVm_fE3Nk_ZXm1ByFbgxWUFrYgLfEQn2v0FQYVpfTlbV_awtqoZLYGtuHmaLZhErzJFh6W8zrx8oSpGn8VlVLjF-AR3ugfw2F_HM8ZR8zY1dHVxvoLGz13F5aY8DHn0_ao9t0Yz2Y_SUNviyxMx0eIEJeo2njM2vMzYQNaT1Ghgc-w', }, ], }; diff --git a/src/plugins/telemetry_collection_manager/server/plugin.ts b/src/plugins/telemetry_collection_manager/server/plugin.ts index 0efdde5eeafd6..9770395e0ec0c 100644 --- a/src/plugins/telemetry_collection_manager/server/plugin.ts +++ b/src/plugins/telemetry_collection_manager/server/plugin.ts @@ -40,7 +40,8 @@ interface TelemetryCollectionPluginsDepsSetup { } export class TelemetryCollectionManagerPlugin - implements Plugin { + implements Plugin +{ private readonly logger: Logger; private collectionStrategy: CollectionStrategy | undefined; private usageGetterMethodPriority = -1; diff --git a/src/plugins/telemetry_management_section/public/plugin.tsx b/src/plugins/telemetry_management_section/public/plugin.tsx index 2e3b1beb64d3c..8f2d85f9107b6 100644 --- a/src/plugins/telemetry_management_section/public/plugin.tsx +++ b/src/plugins/telemetry_management_section/public/plugin.tsx @@ -28,7 +28,8 @@ export interface TelemetryManagementSectionPluginSetup { } export class TelemetryManagementSectionPlugin - implements Plugin { + implements Plugin +{ private showSecuritySolutionExample = false; private shouldShowSecuritySolutionExample = () => { return this.showSecuritySolutionExample; diff --git a/src/plugins/ui_actions/public/actions/action_internal.ts b/src/plugins/ui_actions/public/actions/action_internal.ts index 1b7d57e35f43a..9abddf3929833 100644 --- a/src/plugins/ui_actions/public/actions/action_internal.ts +++ b/src/plugins/ui_actions/public/actions/action_internal.ts @@ -16,7 +16,8 @@ import { uiToReactComponent } from '../../../kibana_react/public'; * @internal */ export class ActionInternal - implements Action>, Presentable> { + implements Action>, Presentable> +{ constructor(public readonly definition: A) {} public readonly id: string = this.definition.id; diff --git a/src/plugins/ui_actions/public/context_menu/build_eui_context_menu_panels.tsx b/src/plugins/ui_actions/public/context_menu/build_eui_context_menu_panels.tsx index 03ce6dd9d1f87..f389a2fac8a71 100644 --- a/src/plugins/ui_actions/public/context_menu/build_eui_context_menu_panels.tsx +++ b/src/plugins/ui_actions/public/context_menu/build_eui_context_menu_panels.tsx @@ -43,23 +43,23 @@ type PanelDescriptor = EuiContextMenuPanelDescriptor & { items: ItemDescriptor[]; }; -const onClick = (action: Action, context: ActionExecutionContext, close: () => void) => ( - event: React.MouseEvent -) => { - if (event.currentTarget instanceof HTMLAnchorElement) { - // from react-router's - if ( - !event.defaultPrevented && // onClick prevented default - event.button === 0 && // ignore everything but left clicks - (!event.currentTarget.target || event.currentTarget.target === '_self') && // let browser handle "target=_blank" etc. - !(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey) // ignore clicks with modifier keys - ) { - event.preventDefault(); - action.execute(context); - } - } else action.execute(context); - close(); -}; +const onClick = + (action: Action, context: ActionExecutionContext, close: () => void) => + (event: React.MouseEvent) => { + if (event.currentTarget instanceof HTMLAnchorElement) { + // from react-router's + if ( + !event.defaultPrevented && // onClick prevented default + event.button === 0 && // ignore everything but left clicks + (!event.currentTarget.target || event.currentTarget.target === '_self') && // let browser handle "target=_blank" etc. + !(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey) // ignore clicks with modifier keys + ) { + event.preventDefault(); + action.execute(context); + } + } else action.execute(context); + close(); + }; /** * This method adds "More" item to panels, which have more than 4 items; and diff --git a/src/plugins/ui_actions/public/service/ui_actions_service.test.ts b/src/plugins/ui_actions/public/service/ui_actions_service.test.ts index 41fc6546b7caa..8d89b62ec208d 100644 --- a/src/plugins/ui_actions/public/service/ui_actions_service.test.ts +++ b/src/plugins/ui_actions/public/service/ui_actions_service.test.ts @@ -162,7 +162,7 @@ describe('UiActionsService', () => { test('can register and get actions', async () => { const actions: ActionRegistry = new Map(); const service = new UiActionsService({ actions }); - const helloWorldAction = createHelloWorldAction(({} as unknown) as OverlayStart); + const helloWorldAction = createHelloWorldAction({} as unknown as OverlayStart); const length = actions.size; service.registerAction(helloWorldAction); @@ -173,7 +173,7 @@ describe('UiActionsService', () => { test('getTriggerCompatibleActions returns attached actions', async () => { const service = new UiActionsService(); - const helloWorldAction = createHelloWorldAction(({} as unknown) as OverlayStart); + const helloWorldAction = createHelloWorldAction({} as unknown as OverlayStart); service.registerAction(helloWorldAction); @@ -373,10 +373,10 @@ describe('UiActionsService', () => { const actions: ActionRegistry = new Map(); const service = new UiActionsService({ actions }); - service.registerAction(({ + service.registerAction({ id: ACTION_HELLO_WORLD, order: 13, - } as unknown) as ActionDefinition); + } as unknown as ActionDefinition); expect(actions.get(ACTION_HELLO_WORLD)).toMatchObject({ id: ACTION_HELLO_WORLD, @@ -390,10 +390,10 @@ describe('UiActionsService', () => { const trigger: Trigger = { id: MY_TRIGGER, }; - const action = ({ + const action = { id: ACTION_HELLO_WORLD, order: 25, - } as unknown) as ActionDefinition; + } as unknown as ActionDefinition; service.registerTrigger(trigger); service.addTriggerAction(MY_TRIGGER, action); @@ -410,10 +410,10 @@ describe('UiActionsService', () => { const trigger: Trigger = { id: MY_TRIGGER, }; - const action = ({ + const action = { id: ACTION_HELLO_WORLD, order: 25, - } as unknown) as ActionDefinition; + } as unknown as ActionDefinition; service.registerTrigger(trigger); service.registerAction(action); @@ -427,10 +427,10 @@ describe('UiActionsService', () => { test('detaching an invalid action from a trigger throws an error', async () => { const service = new UiActionsService(); - const action = ({ + const action = { id: ACTION_HELLO_WORLD, order: 25, - } as unknown) as ActionDefinition; + } as unknown as ActionDefinition; service.registerAction(action); expect(() => service.detachAction('i do not exist', ACTION_HELLO_WORLD)).toThrowError( @@ -441,10 +441,10 @@ describe('UiActionsService', () => { test('attaching an invalid action to a trigger throws an error', async () => { const service = new UiActionsService(); - const action = ({ + const action = { id: ACTION_HELLO_WORLD, order: 25, - } as unknown) as ActionDefinition; + } as unknown as ActionDefinition; service.registerAction(action); expect(() => service.addTriggerAction('i do not exist', action)).toThrowError( @@ -455,10 +455,10 @@ describe('UiActionsService', () => { test('cannot register another action with the same ID', async () => { const service = new UiActionsService(); - const action = ({ + const action = { id: ACTION_HELLO_WORLD, order: 25, - } as unknown) as ActionDefinition; + } as unknown as ActionDefinition; service.registerAction(action); expect(() => service.registerAction(action)).toThrowError( @@ -469,7 +469,7 @@ describe('UiActionsService', () => { test('cannot register another trigger with the same ID', async () => { const service = new UiActionsService(); - const trigger = ({ id: 'MY-TRIGGER' } as unknown) as Trigger; + const trigger = { id: 'MY-TRIGGER' } as unknown as Trigger; service.registerTrigger(trigger); expect(() => service.registerTrigger(trigger)).toThrowError( diff --git a/src/plugins/ui_actions/public/tests/execute_trigger_actions.test.ts b/src/plugins/ui_actions/public/tests/execute_trigger_actions.test.ts index 4aba3a9c68108..3c87857591e69 100644 --- a/src/plugins/ui_actions/public/tests/execute_trigger_actions.test.ts +++ b/src/plugins/ui_actions/public/tests/execute_trigger_actions.test.ts @@ -15,7 +15,7 @@ import { waitFor } from '@testing-library/dom'; jest.mock('../context_menu'); const executeFn = jest.fn(); -const openContextMenuSpy = (openContextMenu as unknown) as jest.SpyInstance; +const openContextMenuSpy = openContextMenu as unknown as jest.SpyInstance; const CONTACT_USER_TRIGGER = 'CONTACT_USER_TRIGGER'; diff --git a/src/plugins/ui_actions/public/tests/get_trigger_actions.test.ts b/src/plugins/ui_actions/public/tests/get_trigger_actions.test.ts index 9a5de81b18548..b0a8ccaecb0d5 100644 --- a/src/plugins/ui_actions/public/tests/get_trigger_actions.test.ts +++ b/src/plugins/ui_actions/public/tests/get_trigger_actions.test.ts @@ -9,16 +9,16 @@ import { ActionInternal, Action } from '../actions'; import { uiActionsPluginMock } from '../mocks'; -const action1: Action = ({ +const action1: Action = { id: 'action1', order: 1, type: 'type1', -} as unknown) as Action; -const action2: Action = ({ +} as unknown as Action; +const action2: Action = { id: 'action2', order: 2, type: 'type2', -} as unknown) as Action; +} as unknown as Action; test('returns actions set on trigger', () => { const { setup, doStart } = uiActionsPluginMock.createPlugin(); diff --git a/src/plugins/ui_actions/public/tests/get_trigger_compatible_actions.test.ts b/src/plugins/ui_actions/public/tests/get_trigger_compatible_actions.test.ts index 2d1c284e66ad4..d372064c9ad37 100644 --- a/src/plugins/ui_actions/public/tests/get_trigger_compatible_actions.test.ts +++ b/src/plugins/ui_actions/public/tests/get_trigger_compatible_actions.test.ts @@ -32,14 +32,14 @@ beforeEach(() => { test('can register action', async () => { const { setup } = uiActions; - const helloWorldAction = createHelloWorldAction(({} as unknown) as OverlayStart); + const helloWorldAction = createHelloWorldAction({} as unknown as OverlayStart); setup.registerAction(helloWorldAction); }); test('getTriggerCompatibleActions returns attached actions', async () => { const { setup, doStart } = uiActions; - const helloWorldAction = createHelloWorldAction(({} as unknown) as OverlayStart); + const helloWorldAction = createHelloWorldAction({} as unknown as OverlayStart); setup.registerAction(helloWorldAction); diff --git a/src/plugins/usage_collection/server/collector/collector.ts b/src/plugins/usage_collection/server/collector/collector.ts index 21f8229718c87..74373d44a359b 100644 --- a/src/plugins/usage_collection/server/collector/collector.ts +++ b/src/plugins/usage_collection/server/collector/collector.ts @@ -15,7 +15,8 @@ import type { } from './types'; export class Collector - implements ICollector { + implements ICollector +{ public readonly extendFetchContext: CollectorOptionsFetchExtendedContext; public readonly type: CollectorOptions['type']; public readonly fetch: CollectorFetchMethod; diff --git a/src/plugins/usage_collection/server/collector/types.ts b/src/plugins/usage_collection/server/collector/types.ts index 4258d5e4dd2e8..bf1e9f4644b1b 100644 --- a/src/plugins/usage_collection/server/collector/types.ts +++ b/src/plugins/usage_collection/server/collector/types.ts @@ -122,12 +122,11 @@ export interface ICollectorOptionsFetchExtendedContext = ICollectorOptionsFetchExtendedContext & - (WithKibanaRequest extends true // If enforced to true via Types, the config must be expected - ? Required, 'kibanaRequest'>> - : {}); +export type CollectorOptionsFetchExtendedContext = + ICollectorOptionsFetchExtendedContext & + (WithKibanaRequest extends true // If enforced to true via Types, the config must be expected + ? Required, 'kibanaRequest'>> + : {}); /** * Options to instantiate a collector diff --git a/src/plugins/usage_collection/server/mocks.ts b/src/plugins/usage_collection/server/mocks.ts index ca3bdfe1e7522..5505e816532a1 100644 --- a/src/plugins/usage_collection/server/mocks.ts +++ b/src/plugins/usage_collection/server/mocks.ts @@ -25,10 +25,8 @@ export const createUsageCollectionSetupMock = () => { logger: loggingSystemMock.createLogger(), maximumWaitTimeForAllCollectorsInS: 1, }); - const { - createUsageCounter, - getUsageCounterByType, - } = usageCountersServiceMock.createSetupContract(); + const { createUsageCounter, getUsageCounterByType } = + usageCountersServiceMock.createSetupContract(); const usageCollectionSetupMock: jest.Mocked = { createUsageCounter, diff --git a/src/plugins/usage_collection/server/usage_counters/usage_counters_service.mock.ts b/src/plugins/usage_collection/server/usage_counters/usage_counters_service.mock.ts index beb67d1eb2607..0d96def540540 100644 --- a/src/plugins/usage_collection/server/usage_counters/usage_counters_service.mock.ts +++ b/src/plugins/usage_collection/server/usage_counters/usage_counters_service.mock.ts @@ -16,9 +16,9 @@ const createSetupContractMock = () => { getUsageCounterByType: jest.fn(), }; - setupContract.createUsageCounter.mockReturnValue(({ + setupContract.createUsageCounter.mockReturnValue({ incrementCounter: jest.fn(), - } as unknown) as jest.Mocked); + } as unknown as jest.Mocked); return setupContract; }; diff --git a/src/plugins/vis_default_editor/public/components/agg.test.tsx b/src/plugins/vis_default_editor/public/components/agg.test.tsx index 483ad4486218e..d82a91620bd70 100644 --- a/src/plugins/vis_default_editor/public/components/agg.test.tsx +++ b/src/plugins/vis_default_editor/public/components/agg.test.tsx @@ -249,9 +249,10 @@ describe('DefaultEditorAgg component', () => { expect(compHistogram.find(DefaultEditorAggParams).props()).toHaveProperty('disabledParams', [ 'min_doc_count', ]); - expect( - compDateHistogram.find(DefaultEditorAggParams).props() - ).toHaveProperty('disabledParams', ['min_doc_count']); + expect(compDateHistogram.find(DefaultEditorAggParams).props()).toHaveProperty( + 'disabledParams', + ['min_doc_count'] + ); }); it('should set error when agg is not histogram or date_histogram', () => { diff --git a/src/plugins/vis_default_editor/public/components/agg_params.test.tsx b/src/plugins/vis_default_editor/public/components/agg_params.test.tsx index 973f9167d3084..2f71ae3b7ecd1 100644 --- a/src/plugins/vis_default_editor/public/components/agg_params.test.tsx +++ b/src/plugins/vis_default_editor/public/components/agg_params.test.tsx @@ -84,7 +84,7 @@ describe('DefaultEditorAggParams component', () => { intervalDeserialize = jest.fn(() => 'deserialized'); defaultProps = { - agg: ({ + agg: { type: { params: [{ name: 'interval', deserialize: intervalDeserialize }], }, @@ -92,7 +92,7 @@ describe('DefaultEditorAggParams component', () => { schema: { title: '', }, - } as any) as IAggConfig, + } as any as IAggConfig, groupName: AggGroupNames.Metrics, formIsTouched: false, indexPattern: {} as IndexPattern, diff --git a/src/plugins/vis_default_editor/public/components/agg_params.tsx b/src/plugins/vis_default_editor/public/components/agg_params.tsx index 39de530dab72a..03c4823d22c8c 100644 --- a/src/plugins/vis_default_editor/public/components/agg_params.tsx +++ b/src/plugins/vis_default_editor/public/components/agg_params.tsx @@ -75,14 +75,15 @@ function DefaultEditorAggParams({ hideCustomLabel = false, }: DefaultEditorAggParamsProps) { const schema = useMemo(() => getSchemaByName(schemas, agg.schema), [agg.schema, schemas]); - const aggFilter = useMemo(() => [...allowedAggs, ...(schema.aggFilter || [])], [ - allowedAggs, - schema.aggFilter, - ]); + const aggFilter = useMemo( + () => [...allowedAggs, ...(schema.aggFilter || [])], + [allowedAggs, schema.aggFilter] + ); const { services } = useKibana(); - const aggTypes = useMemo(() => services.data.search.aggs.types.getAll(), [ - services.data.search.aggs.types, - ]); + const aggTypes = useMemo( + () => services.data.search.aggs.types.getAll(), + [services.data.search.aggs.types] + ); const groupedAggTypeOptions = useMemo( () => getAggTypeOptions(aggTypes, agg, indexPattern, groupName, aggFilter), [aggTypes, agg, indexPattern, groupName, aggFilter] @@ -96,11 +97,10 @@ function DefaultEditorAggParams({ : ''; const aggTypeName = agg.type?.name; const fieldName = agg.params?.field?.name; - const editorConfig = useMemo(() => getEditorConfig(indexPattern, aggTypeName, fieldName), [ - indexPattern, - aggTypeName, - fieldName, - ]); + const editorConfig = useMemo( + () => getEditorConfig(indexPattern, aggTypeName, fieldName), + [indexPattern, aggTypeName, fieldName] + ); const params = useMemo( () => getAggParamsToRender({ agg, editorConfig, metricAggs, state, schemas, hideCustomLabel }), [agg, editorConfig, metricAggs, state, schemas, hideCustomLabel] diff --git a/src/plugins/vis_default_editor/public/components/agg_params_helper.test.ts b/src/plugins/vis_default_editor/public/components/agg_params_helper.test.ts index fb071e224b4b4..c38af03646216 100644 --- a/src/plugins/vis_default_editor/public/components/agg_params_helper.test.ts +++ b/src/plugins/vis_default_editor/public/components/agg_params_helper.test.ts @@ -85,12 +85,12 @@ describe('DefaultEditorAggParams helpers', () => { }); it('should skip customLabel param if it is hidden', () => { - agg = ({ + agg = { type: { params: [{ name: 'customLabel' }], }, schema: 'metric2', - } as any) as IAggConfig; + } as any as IAggConfig; const params = getAggParamsToRender({ agg, editorConfig, metricAggs, state, schemas }); expect(params).toEqual(emptyParams); @@ -98,7 +98,7 @@ describe('DefaultEditorAggParams helpers', () => { it('should create a basic params field and orderBy', () => { const filterFieldTypes = ['number', 'boolean', 'date']; - agg = ({ + agg = { type: { type: AggGroupNames.Buckets, name: BUCKET_TYPES.TERMS, @@ -130,7 +130,7 @@ describe('DefaultEditorAggParams helpers', () => { orderBy: 'orderBy', field: 'field', }, - } as any) as IAggConfig; + } as any as IAggConfig; const params = getAggParamsToRender({ agg, editorConfig, metricAggs, state, schemas }); expect(params).toEqual({ diff --git a/src/plugins/vis_default_editor/public/components/controls/date_ranges.tsx b/src/plugins/vis_default_editor/public/components/controls/date_ranges.tsx index 7a8737a8d918d..fd88659f472fa 100644 --- a/src/plugins/vis_default_editor/public/components/controls/date_ranges.tsx +++ b/src/plugins/vis_default_editor/public/components/controls/date_ranges.tsx @@ -74,10 +74,10 @@ function DateRangesParamEditor({ [setValue] ); - const onAddRange = useCallback(() => updateRanges([...ranges, { id: generateId() }]), [ - ranges, - updateRanges, - ]); + const onAddRange = useCallback( + () => updateRanges([...ranges, { id: generateId() }]), + [ranges, updateRanges] + ); useMount(() => { // set up an initial range when there is no default range diff --git a/src/plugins/vis_default_editor/public/components/controls/field.test.tsx b/src/plugins/vis_default_editor/public/components/controls/field.test.tsx index 277804567c2b7..55ea1dbfc56a3 100644 --- a/src/plugins/vis_default_editor/public/components/controls/field.test.tsx +++ b/src/plugins/vis_default_editor/public/components/controls/field.test.tsx @@ -55,10 +55,10 @@ describe('FieldParamEditor component', () => { agg: { type: { params: [ - ({ + { name: 'field', filterFieldTypes: ['bytes'], - } as unknown) as AggParam, + } as unknown as AggParam, ], }, } as IAggConfig, diff --git a/src/plugins/vis_default_editor/public/components/controls/top_aggregate.test.tsx b/src/plugins/vis_default_editor/public/components/controls/top_aggregate.test.tsx index 9b004b6574735..9c83403c60cb4 100644 --- a/src/plugins/vis_default_editor/public/components/controls/top_aggregate.test.tsx +++ b/src/plugins/vis_default_editor/public/components/controls/top_aggregate.test.tsx @@ -51,14 +51,14 @@ describe('TopAggregateParamEditor', () => { aggParam = { options, }; - agg = ({ + agg = { params: { field: { type: 'number', }, }, getAggParams: jest.fn(() => [{ name: 'aggregate', options }]), - } as any) as IAggConfig; + } as any as IAggConfig; defaultProps = { ...aggParamCommonPropsMock, agg, diff --git a/src/plugins/vis_default_editor/public/components/controls/utils/inline_comp_wrapper.tsx b/src/plugins/vis_default_editor/public/components/controls/utils/inline_comp_wrapper.tsx index bea25b2d59006..5afd51b58d654 100644 --- a/src/plugins/vis_default_editor/public/components/controls/utils/inline_comp_wrapper.tsx +++ b/src/plugins/vis_default_editor/public/components/controls/utils/inline_comp_wrapper.tsx @@ -9,10 +9,11 @@ import React, { ComponentType } from 'react'; import { AggParamEditorProps } from '../../agg_param_props'; -export const wrapWithInlineComp = ( - WrapComponent: ComponentType> -) => (props: AggParamEditorProps) => ( -
- -
-); +export const wrapWithInlineComp = + (WrapComponent: ComponentType>) => + (props: AggParamEditorProps) => + ( +
+ +
+ ); diff --git a/src/plugins/vis_default_editor/public/components/options/color_ranges.tsx b/src/plugins/vis_default_editor/public/components/options/color_ranges.tsx index ad2bd7c003a97..67a6c9c6e8f40 100644 --- a/src/plugins/vis_default_editor/public/components/options/color_ranges.tsx +++ b/src/plugins/vis_default_editor/public/components/options/color_ranges.tsx @@ -53,9 +53,10 @@ function ColorRanges({ [colorsRange] ); - const setColorRanges = useCallback((value: RangeValues[]) => setValue('colorsRange', value), [ - setValue, - ]); + const setColorRanges = useCallback( + (value: RangeValues[]) => setValue('colorsRange', value), + [setValue] + ); return ( { it('should call setValue when value is changes in the number input', () => { component = mountWithIntl(); const numberField = component.find(EuiFieldNumber); - numberField.props().onChange!(({ + numberField.props().onChange!({ target: { value: 3, }, - } as unknown) as React.ChangeEvent); + } as unknown as React.ChangeEvent); expect(props.setValue).toHaveBeenCalledWith('maxLegendLines', 3); }); diff --git a/src/plugins/vis_default_editor/public/components/sidebar/data_tab.tsx b/src/plugins/vis_default_editor/public/components/sidebar/data_tab.tsx index 5eb0266bc1e1d..15169500aad62 100644 --- a/src/plugins/vis_default_editor/public/components/sidebar/data_tab.tsx +++ b/src/plugins/vis_default_editor/public/components/sidebar/data_tab.tsx @@ -73,9 +73,10 @@ function DefaultEditorDataTab({ [dispatch, schemas] ); - const onReorderAggs: ReorderAggs = useCallback((...props) => dispatch(reorderAggs(...props)), [ - dispatch, - ]); + const onReorderAggs: ReorderAggs = useCallback( + (...props) => dispatch(reorderAggs(...props)), + [dispatch] + ); const onAggParamValueChange: DefaultEditorAggCommonProps['setAggParamValue'] = useCallback( (...props) => dispatch(setAggParamValue(...props)), diff --git a/src/plugins/vis_default_editor/public/components/sidebar/sidebar.tsx b/src/plugins/vis_default_editor/public/components/sidebar/sidebar.tsx index 52d8109b352a1..dab982e5a8070 100644 --- a/src/plugins/vis_default_editor/public/components/sidebar/sidebar.tsx +++ b/src/plugins/vis_default_editor/public/components/sidebar/sidebar.tsx @@ -62,17 +62,19 @@ function DefaultEditorSideBarComponent({ const { formState, setTouched, setValidity, resetValidity } = useEditorFormState(); const [optionTabs, setSelectedTab] = useOptionTabs(vis); - const responseAggs = useMemo(() => (state.data.aggs ? state.data.aggs.getResponseAggs() : []), [ - state.data.aggs, - ]); + const responseAggs = useMemo( + () => (state.data.aggs ? state.data.aggs.getResponseAggs() : []), + [state.data.aggs] + ); const metricSchemas = (vis.type.schemas.metrics || []).map((s: Schema) => s.name); const metricAggs = useMemo( () => responseAggs.filter((agg) => agg.schema && metricSchemas.includes(agg.schema)), [responseAggs, metricSchemas] ); - const hasHistogramAgg = useMemo(() => responseAggs.some((agg) => agg.type.name === 'histogram'), [ - responseAggs, - ]); + const hasHistogramAgg = useMemo( + () => responseAggs.some((agg) => agg.type.name === 'histogram'), + [responseAggs] + ); const setStateValidity = useCallback( (value: boolean) => { diff --git a/src/plugins/vis_default_editor/public/components/sidebar/state/reducers.ts b/src/plugins/vis_default_editor/public/components/sidebar/state/reducers.ts index 48ac8ac1d28f3..ee2b715fad25f 100644 --- a/src/plugins/vis_default_editor/public/components/sidebar/state/reducers.ts +++ b/src/plugins/vis_default_editor/public/components/sidebar/state/reducers.ts @@ -22,185 +22,182 @@ function initEditorState(vis: Vis) { export type EditorVisState = Pick; -const createEditorStateReducer = ({ - aggs: { createAggConfigs }, -}: DataPublicPluginStart['search']) => ( - state: EditorVisState, - action: EditorAction -): EditorVisState => { - switch (action.type) { - case EditorStateActionTypes.ADD_NEW_AGG: { - const { schema } = action.payload; - const defaultConfig = - !state.data.aggs!.aggs.find((agg) => agg.schema === schema.name) && schema.defaults - ? (schema as any).defaults.slice(0, schema.max) - : { schema: schema.name }; - const aggConfig = state.data.aggs!.createAggConfig(defaultConfig, { - addToAggConfigs: false, - }); - aggConfig.brandNew = true; - const newAggs = [...state.data.aggs!.aggs, aggConfig]; - - return { - ...state, - data: { - ...state.data, - aggs: createAggConfigs(state.data.indexPattern!, newAggs), - }, - }; - } +const createEditorStateReducer = + ({ aggs: { createAggConfigs } }: DataPublicPluginStart['search']) => + (state: EditorVisState, action: EditorAction): EditorVisState => { + switch (action.type) { + case EditorStateActionTypes.ADD_NEW_AGG: { + const { schema } = action.payload; + const defaultConfig = + !state.data.aggs!.aggs.find((agg) => agg.schema === schema.name) && schema.defaults + ? (schema as any).defaults.slice(0, schema.max) + : { schema: schema.name }; + const aggConfig = state.data.aggs!.createAggConfig(defaultConfig, { + addToAggConfigs: false, + }); + aggConfig.brandNew = true; + const newAggs = [...state.data.aggs!.aggs, aggConfig]; + + return { + ...state, + data: { + ...state.data, + aggs: createAggConfigs(state.data.indexPattern!, newAggs), + }, + }; + } - case EditorStateActionTypes.DISCARD_CHANGES: { - return initEditorState(action.payload); - } + case EditorStateActionTypes.DISCARD_CHANGES: { + return initEditorState(action.payload); + } - case EditorStateActionTypes.CHANGE_AGG_TYPE: { - const { aggId, value } = action.payload; + case EditorStateActionTypes.CHANGE_AGG_TYPE: { + const { aggId, value } = action.payload; - const newAggs = state.data.aggs!.aggs.map((agg) => { - if (agg.id === aggId) { - agg.type = value; + const newAggs = state.data.aggs!.aggs.map((agg) => { + if (agg.id === aggId) { + agg.type = value; - return agg.toJSON(); - } + return agg.toJSON(); + } - return agg; - }); + return agg; + }); - return { - ...state, - data: { - ...state.data, - aggs: createAggConfigs(state.data.indexPattern!, newAggs), - }, - }; - } + return { + ...state, + data: { + ...state.data, + aggs: createAggConfigs(state.data.indexPattern!, newAggs), + }, + }; + } - case EditorStateActionTypes.SET_AGG_PARAM_VALUE: { - const { aggId, paramName, value } = action.payload; + case EditorStateActionTypes.SET_AGG_PARAM_VALUE: { + const { aggId, paramName, value } = action.payload; - const newAggs = state.data.aggs!.aggs.map((agg) => { - if (agg.id === aggId) { - const parsedAgg = agg.toJSON(); + const newAggs = state.data.aggs!.aggs.map((agg) => { + if (agg.id === aggId) { + const parsedAgg = agg.toJSON(); - return { - ...parsedAgg, - params: { - ...parsedAgg.params, - [paramName]: value, - }, - }; - } + return { + ...parsedAgg, + params: { + ...parsedAgg.params, + [paramName]: value, + }, + }; + } - return agg; - }); + return agg; + }); - return { - ...state, - data: { - ...state.data, - aggs: createAggConfigs(state.data.indexPattern!, newAggs), - }, - }; - } + return { + ...state, + data: { + ...state.data, + aggs: createAggConfigs(state.data.indexPattern!, newAggs), + }, + }; + } - case EditorStateActionTypes.SET_STATE_PARAM_VALUE: { - const { paramName, value } = action.payload; + case EditorStateActionTypes.SET_STATE_PARAM_VALUE: { + const { paramName, value } = action.payload; - return { - ...state, - params: { - ...state.params, - [paramName]: value, - }, - }; - } + return { + ...state, + params: { + ...state.params, + [paramName]: value, + }, + }; + } - case EditorStateActionTypes.REMOVE_AGG: { - let isMetric = false; - const newAggs = state.data.aggs!.aggs.filter(({ id, schema }) => { - if (id === action.payload.aggId) { - const schemaDef = action.payload.schemas.find((s) => s.name === schema); - if (schemaDef && schemaDef.group === AggGroupNames.Metrics) { - isMetric = true; - } + case EditorStateActionTypes.REMOVE_AGG: { + let isMetric = false; + const newAggs = state.data.aggs!.aggs.filter(({ id, schema }) => { + if (id === action.payload.aggId) { + const schemaDef = action.payload.schemas.find((s) => s.name === schema); + if (schemaDef && schemaDef.group === AggGroupNames.Metrics) { + isMetric = true; + } - return false; - } + return false; + } - return true; - }); + return true; + }); - if (isMetric && getEnabledMetricAggsCount(newAggs) === 0) { - const aggToEnable = newAggs.find((agg) => agg.schema === 'metric'); + if (isMetric && getEnabledMetricAggsCount(newAggs) === 0) { + const aggToEnable = newAggs.find((agg) => agg.schema === 'metric'); - if (aggToEnable) { - aggToEnable.enabled = true; + if (aggToEnable) { + aggToEnable.enabled = true; + } } - } - return { - ...state, - data: { - ...state.data, - aggs: createAggConfigs(state.data.indexPattern!, newAggs), - }, - }; - } + return { + ...state, + data: { + ...state.data, + aggs: createAggConfigs(state.data.indexPattern!, newAggs), + }, + }; + } - case EditorStateActionTypes.REORDER_AGGS: { - const { sourceAgg, destinationAgg } = action.payload; - const destinationIndex = state.data.aggs!.aggs.indexOf(destinationAgg); - const newAggs = [...state.data.aggs!.aggs]; - newAggs.splice( - destinationIndex, - 0, - newAggs.splice(state.data.aggs!.aggs.indexOf(sourceAgg), 1)[0] - ); - - return { - ...state, - data: { - ...state.data, - aggs: createAggConfigs(state.data.indexPattern!, newAggs), - }, - }; - } + case EditorStateActionTypes.REORDER_AGGS: { + const { sourceAgg, destinationAgg } = action.payload; + const destinationIndex = state.data.aggs!.aggs.indexOf(destinationAgg); + const newAggs = [...state.data.aggs!.aggs]; + newAggs.splice( + destinationIndex, + 0, + newAggs.splice(state.data.aggs!.aggs.indexOf(sourceAgg), 1)[0] + ); + + return { + ...state, + data: { + ...state.data, + aggs: createAggConfigs(state.data.indexPattern!, newAggs), + }, + }; + } - case EditorStateActionTypes.TOGGLE_ENABLED_AGG: { - const { aggId, enabled } = action.payload; + case EditorStateActionTypes.TOGGLE_ENABLED_AGG: { + const { aggId, enabled } = action.payload; - const newAggs = state.data.aggs!.aggs.map((agg) => { - if (agg.id === aggId) { - const parsedAgg = agg.toJSON(); + const newAggs = state.data.aggs!.aggs.map((agg) => { + if (agg.id === aggId) { + const parsedAgg = agg.toJSON(); - return { - ...parsedAgg, - enabled, - }; - } + return { + ...parsedAgg, + enabled, + }; + } - return agg; - }); + return agg; + }); - return { - ...state, - data: { - ...state.data, - aggs: createAggConfigs(state.data.indexPattern!, newAggs), - }, - }; - } + return { + ...state, + data: { + ...state.data, + aggs: createAggConfigs(state.data.indexPattern!, newAggs), + }, + }; + } - case EditorStateActionTypes.UPDATE_STATE_PARAMS: { - const { params } = action.payload; + case EditorStateActionTypes.UPDATE_STATE_PARAMS: { + const { params } = action.payload; - return { - ...state, - params: cloneDeep(params), - }; + return { + ...state, + params: cloneDeep(params), + }; + } } - } -}; + }; export { createEditorStateReducer, initEditorState }; diff --git a/src/plugins/vis_default_editor/public/plugin.ts b/src/plugins/vis_default_editor/public/plugin.ts index 637ea53e6b2d0..fd0d69bf297b6 100644 --- a/src/plugins/vis_default_editor/public/plugin.ts +++ b/src/plugins/vis_default_editor/public/plugin.ts @@ -16,7 +16,8 @@ export interface VisDefaultEditorSetupDependencies { } export class VisDefaultEditorPlugin - implements Plugin { + implements Plugin +{ public setup(core: CoreSetup, { visualize }: VisDefaultEditorSetupDependencies) { if (visualize) { visualize.visEditorsRegistry.registerDefault(DefaultEditorController); diff --git a/src/plugins/vis_type_markdown/public/markdown_options.test.tsx b/src/plugins/vis_type_markdown/public/markdown_options.test.tsx index f86cc44a4391d..93e00bf2badae 100644 --- a/src/plugins/vis_type_markdown/public/markdown_options.test.tsx +++ b/src/plugins/vis_type_markdown/public/markdown_options.test.tsx @@ -14,14 +14,14 @@ import { MarkdownVisParams } from './types'; import { MarkdownOptions } from './markdown_options'; describe('MarkdownOptions', () => { - const props = ({ + const props = { stateParams: { fontSize: 12, markdown: 'hello from 2020 🥳', openLinksInNewTab: false, }, setValue: jest.fn(), - } as unknown) as VisEditorOptionsProps; + } as unknown as VisEditorOptionsProps; it('should match snapshot', () => { const comp = shallow(); diff --git a/src/plugins/vis_type_timeseries/common/calculate_label.test.ts b/src/plugins/vis_type_timeseries/common/calculate_label.test.ts index 1d1acb55df586..7083711246e7b 100644 --- a/src/plugins/vis_type_timeseries/common/calculate_label.test.ts +++ b/src/plugins/vis_type_timeseries/common/calculate_label.test.ts @@ -36,71 +36,71 @@ describe('calculateLabel(metric, metrics)', () => { }); test('returns formatted label for pipeline aggs', () => { - const metric = ({ id: 2, type: 'derivative', field: 1 } as unknown) as Metric; - const metrics = ([ + const metric = { id: 2, type: 'derivative', field: 1 } as unknown as Metric; + const metrics = [ { id: 1, type: 'max', field: 'network.out.bytes' }, metric, - ] as unknown) as Metric[]; + ] as unknown as Metric[]; const label = calculateLabel(metric, metrics); expect(label).toEqual('Derivative of Max of network.out.bytes'); }); test('returns formatted label for derivative of percentile', () => { - const metric = ({ + const metric = { id: 2, type: 'derivative', field: '1[50.0]', - } as unknown) as Metric; - const metrics = ([ + } as unknown as Metric; + const metrics = [ { id: 1, type: 'percentile', field: 'network.out.bytes' }, metric, - ] as unknown) as Metric[]; + ] as unknown as Metric[]; const label = calculateLabel(metric, metrics); expect(label).toEqual('Derivative of Percentile of network.out.bytes (50.0)'); }); test('returns formatted label for pipeline aggs (deep)', () => { - const metric = ({ id: 3, type: 'derivative', field: 2 } as unknown) as Metric; - const metrics = ([ + const metric = { id: 3, type: 'derivative', field: 2 } as unknown as Metric; + const metrics = [ { id: 1, type: 'max', field: 'network.out.bytes' }, { id: 2, type: 'moving_average', field: 1 }, metric, - ] as unknown) as Metric[]; + ] as unknown as Metric[]; const label = calculateLabel(metric, metrics); expect(label).toEqual('Derivative of Moving Average of Max of network.out.bytes'); }); test('returns formatted label for pipeline aggs uses alias for field metric', () => { - const metric = ({ id: 2, type: 'derivative', field: 1 } as unknown) as Metric; - const metrics = ([ + const metric = { id: 2, type: 'derivative', field: 1 } as unknown as Metric; + const metrics = [ { id: 1, type: 'max', field: 'network.out.bytes', alias: 'Outbound Traffic' }, metric, - ] as unknown) as Metric[]; + ] as unknown as Metric[]; const label = calculateLabel(metric, metrics); expect(label).toEqual('Derivative of Outbound Traffic'); }); test('should throw an error if field not found', () => { - const metric = ({ id: 2, type: 'max', field: 3 } as unknown) as Metric; - const metrics = ([ + const metric = { id: 2, type: 'max', field: 3 } as unknown as Metric; + const metrics = [ { id: 1, type: 'max', field: 'network.out.bytes', alias: 'Outbound Traffic' }, metric, - ] as unknown) as Metric[]; + ] as unknown as Metric[]; const fields: SanitizedFieldType[] = [{ name: '2', label: '2', type: 'field' }]; expect(() => calculateLabel(metric, metrics, fields)).toThrowError('Field "3" not found'); }); test('should not throw an error if field not found (isThrowErrorOnFieldNotFound is false)', () => { - const metric = ({ id: 2, type: 'max', field: 3 } as unknown) as Metric; - const metrics = ([ + const metric = { id: 2, type: 'max', field: 3 } as unknown as Metric; + const metrics = [ { id: 1, type: 'max', field: 'network.out.bytes', alias: 'Outbound Traffic' }, metric, - ] as unknown) as Metric[]; + ] as unknown as Metric[]; const fields: SanitizedFieldType[] = [{ name: '2', label: '2', type: 'field' }]; expect(calculateLabel(metric, metrics, fields, false)).toBe('Max of 3'); diff --git a/src/plugins/vis_type_timeseries/common/index_patterns_utils.test.ts b/src/plugins/vis_type_timeseries/common/index_patterns_utils.test.ts index f8dd206f8f4d5..cac607f7c0f90 100644 --- a/src/plugins/vis_type_timeseries/common/index_patterns_utils.test.ts +++ b/src/plugins/vis_type_timeseries/common/index_patterns_utils.test.ts @@ -60,11 +60,11 @@ describe('fetchIndexPattern', () => { beforeEach(() => { mockedIndices = []; - indexPatternsService = ({ + indexPatternsService = { getDefault: jest.fn(() => Promise.resolve({ id: 'default', title: 'index' })), get: jest.fn(() => Promise.resolve(mockedIndices[0])), find: jest.fn(() => Promise.resolve(mockedIndices || [])), - } as unknown) as IndexPatternsService; + } as unknown as IndexPatternsService; }); test('should return default index on no input value', async () => { diff --git a/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.js b/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.js index 90a5633926c88..6a3f57e502796 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.js +++ b/src/plugins/vis_type_timeseries/public/application/components/aggs/filter_ratio.js @@ -40,14 +40,15 @@ const isFieldHistogram = (fields, indexPattern, field) => { export const FilterRatioAgg = (props) => { const { series, fields, panel } = props; - const handleChange = useMemo(() => createChangeHandler(props.onChange, props.model), [ - props.model, - props.onChange, - ]); + const handleChange = useMemo( + () => createChangeHandler(props.onChange, props.model), + [props.model, props.onChange] + ); const handleSelectChange = createSelectHandler(handleChange); - const handleNumeratorQueryChange = useCallback((query) => handleChange({ numerator: query }), [ - handleChange, - ]); + const handleNumeratorQueryChange = useCallback( + (query) => handleChange({ numerator: query }), + [handleChange] + ); const handleDenominatorQueryChange = useCallback( (query) => handleChange({ denominator: query }), [handleChange] diff --git a/src/plugins/vis_type_timeseries/public/application/components/aggs/invalid_agg.tsx b/src/plugins/vis_type_timeseries/public/application/components/aggs/invalid_agg.tsx index 7fb4b31c2347e..4fd8ea615b6c1 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/aggs/invalid_agg.tsx +++ b/src/plugins/vis_type_timeseries/public/application/components/aggs/invalid_agg.tsx @@ -21,21 +21,20 @@ interface InvalidAggProps { onDelete: () => void; } -export const getInvalidAggComponent = (message: JSX.Element | string) => ( - props: InvalidAggProps -) => { - return ( - - - {message} - - - ); -}; +export const getInvalidAggComponent = + (message: JSX.Element | string) => (props: InvalidAggProps) => { + return ( + + + {message} + + + ); + }; diff --git a/src/plugins/vis_type_timeseries/public/application/components/annotation_row.tsx b/src/plugins/vis_type_timeseries/public/application/components/annotation_row.tsx index cc737561bedac..379c74d0d4bba 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/annotation_row.tsx +++ b/src/plugins/vis_type_timeseries/public/application/components/annotation_row.tsx @@ -104,12 +104,11 @@ export const AnnotationRow = ({ ); const handleChange = useCallback( - (name: string) => ( - event: Array> | ChangeEvent - ) => - onChange({ - [name]: Array.isArray(event) ? event?.[0]?.value : event.target.value, - }), + (name: string) => + (event: Array> | ChangeEvent) => + onChange({ + [name]: Array.isArray(event) ? event?.[0]?.value : event.target.value, + }), [onChange] ); diff --git a/src/plugins/vis_type_timeseries/public/application/components/color_rules.test.tsx b/src/plugins/vis_type_timeseries/public/application/components/color_rules.test.tsx index 3b1356d571749..d6009a214941f 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/color_rules.test.tsx +++ b/src/plugins/vis_type_timeseries/public/application/components/color_rules.test.tsx @@ -34,37 +34,37 @@ describe('src/legacy/core_plugins/metrics/public/components/color_rules.test.js' onChange: jest.fn(), }); - const defaultProps = (getColorRulesProps([ + const defaultProps = getColorRulesProps([ { gauge: null, value: 0, id: 'unique value', }, - ]) as unknown) as ColorRulesProps; + ]) as unknown as ColorRulesProps; - const emptyColorRuleProps = (getColorRulesProps([ + const emptyColorRuleProps = getColorRulesProps([ { operator: emptyRule?.method, value: emptyRule?.value, id: 'unique value', }, - ]) as unknown) as ColorRulesProps; + ]) as unknown as ColorRulesProps; - const notEmptyColorRuleProps = (getColorRulesProps([ + const notEmptyColorRuleProps = getColorRulesProps([ { operator: notEmptyRule?.method, value: notEmptyRule?.value, id: 'unique value', }, - ]) as unknown) as ColorRulesProps; + ]) as unknown as ColorRulesProps; describe('ColorRules', () => { it('should render empty
node', () => { - const emptyProps = ({ + const emptyProps = { name: 'gauge_color_rules', model: {}, onChange: jest.fn(), - } as unknown) as ColorRulesProps; + } as unknown as ColorRulesProps; const wrapper = mountWithIntl(); const isNode = wrapper.find('div').children().exists(); expect(isNode).toBeFalsy(); diff --git a/src/plugins/vis_type_timeseries/public/application/components/lib/collection_actions.test.ts b/src/plugins/vis_type_timeseries/public/application/components/lib/collection_actions.test.ts index e8b2f03b71d1b..2b4f6864858fe 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/lib/collection_actions.test.ts +++ b/src/plugins/vis_type_timeseries/public/application/components/lib/collection_actions.test.ts @@ -16,11 +16,11 @@ import { describe('collection actions', () => { test('handleChange() calls props.onChange() with updated collection', () => { const fn = jest.fn(); - const props = ({ + const props = { model: { test: [{ id: '1', title: 'foo' }] }, name: 'test', onChange: fn, - } as unknown) as CollectionActionsProps; + } as unknown as CollectionActionsProps; handleChange.call(null, props, { id: '1', type: 'bar' }); expect(fn.mock.calls.length).toEqual(1); expect(fn.mock.calls[0][0]).toEqual({ @@ -31,11 +31,11 @@ describe('collection actions', () => { test('handleAdd() calls props.onChange() with update collection', () => { const newItemFn = jest.fn(() => ({ id: '2', text: 'example' })); const fn = jest.fn(); - const props = ({ + const props = { model: { test: [{ id: '1', text: 'foo' }] }, name: 'test', onChange: fn, - } as unknown) as CollectionActionsProps; + } as unknown as CollectionActionsProps; handleAdd.call(null, props, newItemFn); expect(fn.mock.calls.length).toEqual(1); expect(newItemFn.mock.calls.length).toEqual(1); @@ -49,11 +49,11 @@ describe('collection actions', () => { test('handleDelete() calls props.onChange() with update collection', () => { const fn = jest.fn(); - const props = ({ + const props = { model: { test: [{ id: '1', title: 'foo' }] }, name: 'test', onChange: fn, - } as unknown) as CollectionActionsProps; + } as unknown as CollectionActionsProps; handleDelete.call(null, props, { id: '1' }); expect(fn.mock.calls.length).toEqual(1); expect(fn.mock.calls[0][0]).toEqual({ diff --git a/src/plugins/vis_type_timeseries/public/application/components/lib/collection_actions.ts b/src/plugins/vis_type_timeseries/public/application/components/lib/collection_actions.ts index 8307969faa97e..e4cb53fd2d743 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/lib/collection_actions.ts +++ b/src/plugins/vis_type_timeseries/public/application/components/lib/collection_actions.ts @@ -23,21 +23,21 @@ export interface CollectionActionsProps { export function handleChange(props: CollectionActionsProps, doc: P) { const { model, name } = props; - const collection = ((model[name] as unknown) as DocType[]) || []; + const collection = (model[name] as unknown as DocType[]) || []; const part = { [name]: collection.map((row) => (row.id === doc.id ? doc : row)) }; props.onChange({ ...model, ...part }); } export function handleDelete(props: CollectionActionsProps, doc: P) { const { model, name } = props; - const collection = ((model[name] as unknown) as DocType[]) || []; + const collection = (model[name] as unknown as DocType[]) || []; const part = { [name]: collection.filter((row) => row.id !== doc.id) }; props.onChange?.({ ...model, ...part }); } export function handleAdd(props: CollectionActionsProps, fn = newFn) { const { model, name } = props; - const collection = ((model[name] as unknown) as DocType[]) || []; + const collection = (model[name] as unknown as DocType[]) || []; const part = { [name]: collection.concat([fn()]) }; props.onChange?.({ ...model, ...part }); } diff --git a/src/plugins/vis_type_timeseries/public/application/components/lib/convert_series_to_datatable.test.ts b/src/plugins/vis_type_timeseries/public/application/components/lib/convert_series_to_datatable.test.ts index ff7b2f497fd70..bffc9200c9d6f 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/lib/convert_series_to_datatable.test.ts +++ b/src/plugins/vis_type_timeseries/public/application/components/lib/convert_series_to_datatable.test.ts @@ -158,7 +158,7 @@ describe('convert series to datatables', () => { }, ], } as TimeseriesVisParams; - const series = ([ + const series = [ { id: 'series1:0', label: 0, @@ -187,7 +187,7 @@ describe('convert series to datatables', () => { seriesId: 'series1', isSplitByTerms: true, }, - ] as unknown) as PanelData[]; + ] as unknown as PanelData[]; test('creates one table for one layer series with the correct columns', async () => { const tables = await convertSeriesToDataTable(model, series, indexPattern); expect(Object.keys(tables).sort()).toEqual([model.series[0].id].sort()); diff --git a/src/plugins/vis_type_timeseries/public/application/components/lib/create_field_formatter.test.ts b/src/plugins/vis_type_timeseries/public/application/components/lib/create_field_formatter.test.ts index 0173ca4db15ae..c56c6820fff48 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/lib/create_field_formatter.test.ts +++ b/src/plugins/vis_type_timeseries/public/application/components/lib/create_field_formatter.test.ts @@ -12,17 +12,17 @@ import { setFieldFormats } from '../../../services'; import { FORMATS_UI_SETTINGS } from 'src/plugins/field_formats/common'; import type { CoreSetup } from 'kibana/public'; -const mockUiSettings = ({ +const mockUiSettings = { get: jest.fn((item: keyof typeof mockUiSettings) => mockUiSettings[item]), [FORMATS_UI_SETTINGS.FORMAT_BYTES_DEFAULT_PATTERN]: '0,0.[000]b', [FORMATS_UI_SETTINGS.FORMAT_NUMBER_DEFAULT_PATTERN]: '0,0.[000]', -} as unknown) as CoreSetup['uiSettings']; +} as unknown as CoreSetup['uiSettings']; describe('createFieldFormatter(fieldName, fieldFormatMap?, contextType?, hasColorRules)', () => { setFieldFormats( - getFieldFormatsRegistry(({ + getFieldFormatsRegistry({ uiSettings: mockUiSettings, - } as unknown) as CoreSetup) + } as unknown as CoreSetup) ); const value = 1234567890; const stringValue = 'some string'; diff --git a/src/plugins/vis_type_timeseries/public/application/components/lib/create_number_handler.test.ts b/src/plugins/vis_type_timeseries/public/application/components/lib/create_number_handler.test.ts index 10463be82901a..ea65c0c24f6dc 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/lib/create_number_handler.test.ts +++ b/src/plugins/vis_type_timeseries/public/application/components/lib/create_number_handler.test.ts @@ -16,10 +16,10 @@ describe('createNumberHandler()', () => { beforeEach(() => { handleChange = jest.fn(); changeHandler = createNumberHandler(handleChange); - event = ({ + event = { preventDefault: jest.fn(), target: { value: '1' }, - } as unknown) as React.ChangeEvent; + } as unknown as React.ChangeEvent; const fn = changeHandler('unit'); fn(event); }); diff --git a/src/plugins/vis_type_timeseries/public/application/components/lib/create_select_handler.ts b/src/plugins/vis_type_timeseries/public/application/components/lib/create_select_handler.ts index 7df7feaeb91c1..98cd4ba393856 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/lib/create_select_handler.ts +++ b/src/plugins/vis_type_timeseries/public/application/components/lib/create_select_handler.ts @@ -10,9 +10,10 @@ import { EuiComboBoxOptionOption } from '@elastic/eui'; export type HandleChange = (partialModel: Record) => void; -export const createSelectHandler = (handleChange: HandleChange) => (name: string) => ( - selected: EuiComboBoxOptionOption[] = [] -) => - handleChange?.({ - [name]: selected[0]?.value ?? null, - }); +export const createSelectHandler = + (handleChange: HandleChange) => + (name: string) => + (selected: EuiComboBoxOptionOption[] = []) => + handleChange?.({ + [name]: selected[0]?.value ?? null, + }); diff --git a/src/plugins/vis_type_timeseries/public/application/components/lib/create_text_handler.test.ts b/src/plugins/vis_type_timeseries/public/application/components/lib/create_text_handler.test.ts index 367e09c5968e9..d97f606f6328c 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/lib/create_text_handler.test.ts +++ b/src/plugins/vis_type_timeseries/public/application/components/lib/create_text_handler.test.ts @@ -16,10 +16,10 @@ describe('createTextHandler()', () => { beforeEach(() => { handleChange = jest.fn(); changeHandler = createTextHandler(handleChange); - event = ({ + event = { preventDefault: jest.fn(), target: { value: 'foo' }, - } as unknown) as React.ChangeEvent; + } as unknown as React.ChangeEvent; const fn = changeHandler('axis_scale'); fn(event); }); diff --git a/src/plugins/vis_type_timeseries/public/application/components/lib/create_text_handler.ts b/src/plugins/vis_type_timeseries/public/application/components/lib/create_text_handler.ts index b5b6255d614d2..d5893cc076514 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/lib/create_text_handler.ts +++ b/src/plugins/vis_type_timeseries/public/application/components/lib/create_text_handler.ts @@ -12,7 +12,7 @@ import { TimeseriesVisParams } from '../../../types'; export const createTextHandler = ( handleChange: (partialModel: Partial) => void ) => { - return (name: keyof TimeseriesVisParams, defaultValue?: string) => ( - e: React.ChangeEvent - ) => handleChange({ [name]: e.target.value ?? defaultValue }); + return (name: keyof TimeseriesVisParams, defaultValue?: string) => + (e: React.ChangeEvent) => + handleChange({ [name]: e.target.value ?? defaultValue }); }; diff --git a/src/plugins/vis_type_timeseries/public/application/components/lib/get_click_filter_data.test.ts b/src/plugins/vis_type_timeseries/public/application/components/lib/get_click_filter_data.test.ts index 2b9a1f930c15a..80c84ff125817 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/lib/get_click_filter_data.test.ts +++ b/src/plugins/vis_type_timeseries/public/application/components/lib/get_click_filter_data.test.ts @@ -21,8 +21,7 @@ describe('getClickFilterData', () => { datum: [1620032400000, 72], }, { - key: - 'groupId{yaxis_50589930-ad98-11eb-b6f6-59011d7388b7_main_group}spec{61ca57f1-469d-11e7-af02-69e470af7417}yAccessor{1}splitAccessors{}', + key: 'groupId{yaxis_50589930-ad98-11eb-b6f6-59011d7388b7_main_group}spec{61ca57f1-469d-11e7-af02-69e470af7417}yAccessor{1}splitAccessors{}', specId: '61ca57f1-469d-11e7-af02-69e470af7417', yAccessor: 1, }, @@ -102,8 +101,7 @@ describe('getClickFilterData', () => { datum: [1619481600000, 3], }, { - key: - 'groupId{yaxis_6e0353a0-ad9b-11eb-b112-89cce8e43380_main_group}spec{61ca57f1-469d-11e7-af02-69e470af7417:1}yAccessor{1}splitAccessors{}', + key: 'groupId{yaxis_6e0353a0-ad9b-11eb-b112-89cce8e43380_main_group}spec{61ca57f1-469d-11e7-af02-69e470af7417:1}yAccessor{1}splitAccessors{}', specId: '61ca57f1-469d-11e7-af02-69e470af7417:1', }, ], diff --git a/src/plugins/vis_type_timeseries/public/application/components/panel_config/gauge.test.tsx b/src/plugins/vis_type_timeseries/public/application/components/panel_config/gauge.test.tsx index 8b4f5d9134162..70c6df9c36aee 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/panel_config/gauge.test.tsx +++ b/src/plugins/vis_type_timeseries/public/application/components/panel_config/gauge.test.tsx @@ -18,11 +18,11 @@ import { PanelConfigProps } from './types'; describe('GaugePanelConfig', () => { it('call switch tab onChange={handleChange}', () => { - const props = ({ + const props = { fields: {}, model: {}, onChange: jest.fn(), - } as unknown) as PanelConfigProps; + } as unknown as PanelConfigProps; const wrapper = shallow(); wrapper.find('EuiTab').first().simulate('onClick'); @@ -30,11 +30,11 @@ describe('GaugePanelConfig', () => { }); it('call onChange={handleChange}', () => { - const props = ({ + const props = { fields: {}, model: {}, onChange: jest.fn(), - } as unknown) as PanelConfigProps; + } as unknown as PanelConfigProps; const wrapper = shallow(); wrapper.simulate('onClick'); diff --git a/src/plugins/vis_type_timeseries/public/application/components/panel_config/gauge.tsx b/src/plugins/vis_type_timeseries/public/application/components/panel_config/gauge.tsx index ac9dd23a2414f..8dcb385df9d25 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/panel_config/gauge.tsx +++ b/src/plugins/vis_type_timeseries/public/application/components/panel_config/gauge.tsx @@ -68,9 +68,9 @@ export class GaugePanelConfig extends Component< this.setState({ selectedTab }); } - handleTextChange = (name: keyof TimeseriesVisParams) => ( - e: React.ChangeEvent - ) => this.props.onChange({ [name]: e.target.value }); + handleTextChange = + (name: keyof TimeseriesVisParams) => (e: React.ChangeEvent) => + this.props.onChange({ [name]: e.target.value }); render() { const { selectedTab } = this.state; diff --git a/src/plugins/vis_type_timeseries/public/application/components/panel_config/table.tsx b/src/plugins/vis_type_timeseries/public/application/components/panel_config/table.tsx index d9d5401fd131f..38cbd57b0b517 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/panel_config/table.tsx +++ b/src/plugins/vis_type_timeseries/public/application/components/panel_config/table.tsx @@ -77,9 +77,9 @@ export class TablePanelConfig extends Component< }); }; - handleTextChange = (name: keyof TimeseriesVisParams) => ( - e: React.ChangeEvent - ) => this.props.onChange({ [name]: e.target.value }); + handleTextChange = + (name: keyof TimeseriesVisParams) => (e: React.ChangeEvent) => + this.props.onChange({ [name]: e.target.value }); render() { const { selectedTab } = this.state; diff --git a/src/plugins/vis_type_timeseries/public/application/components/panel_config/timeseries.test.tsx b/src/plugins/vis_type_timeseries/public/application/components/panel_config/timeseries.test.tsx index 02f28f3135880..b8af2e7ef8539 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/panel_config/timeseries.test.tsx +++ b/src/plugins/vis_type_timeseries/public/application/components/panel_config/timeseries.test.tsx @@ -18,13 +18,13 @@ import { PanelConfigProps } from './types'; describe('TimeseriesPanelConfig', () => { it('sets the number input to the given value', () => { - const props = ({ + const props = { fields: {}, model: { max_lines_legend: 2, }, onChange: jest.fn(), - } as unknown) as PanelConfigProps; + } as unknown as PanelConfigProps; const wrapper = shallow(); wrapper.instance().setState({ selectedTab: 'options' }); expect( @@ -33,14 +33,14 @@ describe('TimeseriesPanelConfig', () => { }); it('switches on the truncate legend switch if the prop is set to 1 ', () => { - const props = ({ + const props = { fields: {}, model: { max_lines_legend: 2, truncate_legend: 1, }, onChange: jest.fn(), - } as unknown) as PanelConfigProps; + } as unknown as PanelConfigProps; const wrapper = shallow(); wrapper.instance().setState({ selectedTab: 'options' }); expect( @@ -49,14 +49,14 @@ describe('TimeseriesPanelConfig', () => { }); it('switches off the truncate legend switch if the prop is set to 0', () => { - const props = ({ + const props = { fields: {}, model: { max_lines_legend: 2, truncate_legend: 0, }, onChange: jest.fn(), - } as unknown) as PanelConfigProps; + } as unknown as PanelConfigProps; const wrapper = shallow(); wrapper.instance().setState({ selectedTab: 'options' }); expect( @@ -65,14 +65,14 @@ describe('TimeseriesPanelConfig', () => { }); it('disables the max lines number input if the truncate legend switch is off', () => { - const props = ({ + const props = { fields: {}, model: { max_lines_legend: 2, truncate_legend: 0, }, onChange: jest.fn(), - } as unknown) as PanelConfigProps; + } as unknown as PanelConfigProps; const wrapper = shallow(); wrapper.instance().setState({ selectedTab: 'options' }); expect( diff --git a/src/plugins/vis_type_timeseries/public/application/components/panel_config/timeseries.tsx b/src/plugins/vis_type_timeseries/public/application/components/panel_config/timeseries.tsx index 25e6c7906d831..905b23a49f795 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/panel_config/timeseries.tsx +++ b/src/plugins/vis_type_timeseries/public/application/components/panel_config/timeseries.tsx @@ -119,9 +119,9 @@ export class TimeseriesPanelConfig extends Component< this.setState({ selectedTab }); } - handleTextChange = (name: keyof TimeseriesVisParams) => ( - e: React.ChangeEvent - ) => this.props.onChange({ [name]: e.target.value }); + handleTextChange = + (name: keyof TimeseriesVisParams) => (e: React.ChangeEvent) => + this.props.onChange({ [name]: e.target.value }); render() { const defaults = { diff --git a/src/plugins/vis_type_timeseries/public/application/components/panel_config/top_n.tsx b/src/plugins/vis_type_timeseries/public/application/components/panel_config/top_n.tsx index 30d65f6edd845..3cf41aa335eb6 100644 --- a/src/plugins/vis_type_timeseries/public/application/components/panel_config/top_n.tsx +++ b/src/plugins/vis_type_timeseries/public/application/components/panel_config/top_n.tsx @@ -57,9 +57,9 @@ export class TopNPanelConfig extends Component< this.setState({ selectedTab }); } - handleTextChange = (name: keyof TimeseriesVisParams) => ( - e: React.ChangeEvent - ) => this.props.onChange({ [name]: e.target.value }); + handleTextChange = + (name: keyof TimeseriesVisParams) => (e: React.ChangeEvent) => + this.props.onChange({ [name]: e.target.value }); render() { const { selectedTab } = this.state; diff --git a/src/plugins/vis_type_timeseries/public/application/lib/get_split_by_terms_color.test.ts b/src/plugins/vis_type_timeseries/public/application/lib/get_split_by_terms_color.test.ts index 1d81531642566..0a78e525796ff 100644 --- a/src/plugins/vis_type_timeseries/public/application/lib/get_split_by_terms_color.test.ts +++ b/src/plugins/vis_type_timeseries/public/application/lib/get_split_by_terms_color.test.ts @@ -9,7 +9,7 @@ import { chartPluginMock } from '../../../../charts/public/mocks'; import { getSplitByTermsColor, SplitByTermsColorProps } from './get_split_by_terms_color'; const chartsRegistry = chartPluginMock.createPaletteRegistry(); -const props = ({ +const props = { seriesById: [ { id: '61ca57f1-469d-11e7-af02-69e470af7417', @@ -54,11 +54,11 @@ const props = ({ }, palettesRegistry: chartsRegistry, syncColors: false, -} as unknown) as SplitByTermsColorProps; +} as unknown as SplitByTermsColorProps; describe('getSplitByTermsColor Function', () => { it('Should return null if no palette given', () => { - const newProps = ({ ...props, seriesPalette: null } as unknown) as SplitByTermsColorProps; + const newProps = { ...props, seriesPalette: null } as unknown as SplitByTermsColorProps; const color = getSplitByTermsColor(newProps); expect(color).toEqual(null); }); @@ -83,10 +83,10 @@ describe('getSplitByTermsColor Function', () => { gradient: true, }, }; - const newProps = ({ + const newProps = { ...props, seriesPalette: gradientPalette, - } as unknown) as SplitByTermsColorProps; + } as unknown as SplitByTermsColorProps; getSplitByTermsColor(newProps); expect(spy).toHaveBeenCalledWith('custom'); }); diff --git a/src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/index.js b/src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/index.js index 35f0118cc8525..1edaf38ef403c 100644 --- a/src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/index.js +++ b/src/plugins/vis_type_timeseries/public/application/visualizations/views/timeseries/index.js @@ -45,7 +45,10 @@ const generateAnnotationData = (values, formatter) => }), })); -const decorateFormatter = (formatter) => ({ value }) => formatter(value); +const decorateFormatter = + (formatter) => + ({ value }) => + formatter(value); /** When displaying the annotation, we must slightly shift the labels for * the x-axis so that they do not overlap the annotations. **/ diff --git a/src/plugins/vis_type_timeseries/public/services.ts b/src/plugins/vis_type_timeseries/public/services.ts index da1fd0fbdc2d3..ba7ab4a25c8a2 100644 --- a/src/plugins/vis_type_timeseries/public/services.ts +++ b/src/plugins/vis_type_timeseries/public/services.ts @@ -13,9 +13,8 @@ import { DataPublicPluginStart } from '../../data/public'; export const [getUISettings, setUISettings] = createGetterSetter('UISettings'); -export const [getFieldFormats, setFieldFormats] = createGetterSetter< - DataPublicPluginStart['fieldFormats'] ->('FieldFormats'); +export const [getFieldFormats, setFieldFormats] = + createGetterSetter('FieldFormats'); export const [getCoreStart, setCoreStart] = createGetterSetter('CoreStart'); diff --git a/src/plugins/vis_type_timeseries/server/lib/get_fields.ts b/src/plugins/vis_type_timeseries/server/lib/get_fields.ts index b0e85f8e44fbe..ef667a574f63d 100644 --- a/src/plugins/vis_type_timeseries/server/lib/get_fields.ts +++ b/src/plugins/vis_type_timeseries/server/lib/get_fields.ts @@ -29,14 +29,12 @@ export async function getFields( const fetchedIndex = await cachedIndexPatternFetcher(indexPatternString); - const { - searchStrategy, - capabilities, - } = (await framework.searchStrategyRegistry.getViableStrategy( - requestContext, - request, - fetchedIndex - ))!; + const { searchStrategy, capabilities } = + (await framework.searchStrategyRegistry.getViableStrategy( + requestContext, + request, + fetchedIndex + ))!; const fields = await searchStrategy.getFieldsForWildcard( fetchedIndex, diff --git a/src/plugins/vis_type_timeseries/server/lib/search_strategies/capabilities/rollup_search_capabilities.ts b/src/plugins/vis_type_timeseries/server/lib/search_strategies/capabilities/rollup_search_capabilities.ts index eafd5a0ee1cf4..44b0cec4e825b 100644 --- a/src/plugins/vis_type_timeseries/server/lib/search_strategies/capabilities/rollup_search_capabilities.ts +++ b/src/plugins/vis_type_timeseries/server/lib/search_strategies/capabilities/rollup_search_capabilities.ts @@ -112,9 +112,11 @@ export class RollupSearchCapabilities extends DefaultSearchCapabilities { unit: parsedRollupJobInterval!.unit, }); - const { value, unit } = (isCalendarInterval(parsedRollupJobInterval!) - ? getValidCalendarInterval - : getValidFixedInterval)(); + const { value, unit } = ( + isCalendarInterval(parsedRollupJobInterval!) + ? getValidCalendarInterval + : getValidFixedInterval + )(); return `${value}${unit}`; } diff --git a/src/plugins/vis_type_timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts b/src/plugins/vis_type_timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts index 813b0a22c0c37..fe2c4604c48f6 100644 --- a/src/plugins/vis_type_timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts +++ b/src/plugins/vis_type_timeseries/server/lib/search_strategies/lib/cached_index_pattern_fetcher.test.ts @@ -22,11 +22,11 @@ describe('CachedIndexPatternFetcher', () => { beforeEach(() => { mockedIndices = []; - const indexPatternsService = ({ + const indexPatternsService = { getDefault: jest.fn(() => Promise.resolve({ id: 'default', title: 'index' })), get: jest.fn(() => Promise.resolve(mockedIndices[0])), find: jest.fn(() => Promise.resolve(mockedIndices || [])), - } as unknown) as IndexPatternsService; + } as unknown as IndexPatternsService; (fetchIndexPattern as jest.Mock).mockClear(); diff --git a/src/plugins/vis_type_timeseries/server/lib/search_strategies/search_strategies_registry.test.ts b/src/plugins/vis_type_timeseries/server/lib/search_strategies/search_strategies_registry.test.ts index 7f5f12602998f..47b89178fcd4c 100644 --- a/src/plugins/vis_type_timeseries/server/lib/search_strategies/search_strategies_registry.test.ts +++ b/src/plugins/vis_type_timeseries/server/lib/search_strategies/search_strategies_registry.test.ts @@ -25,7 +25,7 @@ class MockSearchStrategy extends AbstractSearchStrategy { } describe('SearchStrategyRegister', () => { - const requestContext = ({ + const requestContext = { core: { uiSettings: { client: { @@ -33,7 +33,7 @@ describe('SearchStrategyRegister', () => { }, }, }, - } as unknown) as VisTypeTimeseriesRequestHandlerContext; + } as unknown as VisTypeTimeseriesRequestHandlerContext; let registry: SearchStrategyRegistry; beforeAll(() => { diff --git a/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.test.ts b/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.test.ts index 767d5c00d7a33..0a9b3d0047c80 100644 --- a/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.test.ts +++ b/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/abstract_search_strategy.test.ts @@ -26,7 +26,7 @@ describe('AbstractSearchStrategy', () => { beforeEach(() => { mockedFields = []; - requestContext = ({ + requestContext = { core: { elasticsearch: { client: { @@ -40,7 +40,7 @@ describe('AbstractSearchStrategy', () => { search: { search: jest.fn().mockReturnValue(from(Promise.resolve({}))), }, - } as unknown) as VisTypeTimeseriesRequestHandlerContext; + } as unknown as VisTypeTimeseriesRequestHandlerContext; abstractSearchStrategy = new FooSearchStrategy(); }); @@ -53,10 +53,10 @@ describe('AbstractSearchStrategy', () => { test('should return fields for wildcard', async () => { const fields = await abstractSearchStrategy.getFieldsForWildcard( { indexPatternString: '', indexPattern: undefined }, - ({ + { getDefault: jest.fn(), getFieldsForWildcard: jest.fn(() => Promise.resolve(mockedFields)), - } as unknown) as IndexPatternsService, + } as unknown as IndexPatternsService, (() => Promise.resolve({}) as unknown) as CachedIndexPatternFetcher ); @@ -68,7 +68,7 @@ describe('AbstractSearchStrategy', () => { const responses = await abstractSearchStrategy.search( requestContext, - ({ + { body: { searchSession: { sessionId: '1', @@ -76,7 +76,7 @@ describe('AbstractSearchStrategy', () => { isStored: true, }, }, - } as unknown) as VisTypeTimeseriesVisDataRequest, + } as unknown as VisTypeTimeseriesVisDataRequest, searches ); diff --git a/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/default_search_strategy.test.ts b/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/default_search_strategy.test.ts index 3638a438ec736..393271aaa578c 100644 --- a/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/default_search_strategy.test.ts +++ b/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/default_search_strategy.test.ts @@ -13,7 +13,7 @@ import { import { DefaultSearchStrategy } from './default_search_strategy'; describe('DefaultSearchStrategy', () => { - const requestContext = ({ + const requestContext = { core: { uiSettings: { client: { @@ -21,17 +21,17 @@ describe('DefaultSearchStrategy', () => { }, }, }, - } as unknown) as VisTypeTimeseriesRequestHandlerContext; + } as unknown as VisTypeTimeseriesRequestHandlerContext; let defaultSearchStrategy: DefaultSearchStrategy; let req: VisTypeTimeseriesVisDataRequest; beforeEach(() => { - req = ({ + req = { body: { panels: [], }, - } as unknown) as VisTypeTimeseriesVisDataRequest; + } as unknown as VisTypeTimeseriesVisDataRequest; defaultSearchStrategy = new DefaultSearchStrategy(); }); diff --git a/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/rollup_search_strategy.test.ts b/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/rollup_search_strategy.test.ts index c798f58b0b67b..85b8bcdf57b93 100644 --- a/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/rollup_search_strategy.test.ts +++ b/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/rollup_search_strategy.test.ts @@ -38,7 +38,7 @@ jest.mock('./abstract_search_strategy', () => { describe('Rollup Search Strategy', () => { let rollupResolvedData: Promise; - const requestContext = ({ + const requestContext = { core: { elasticsearch: { client: { @@ -50,7 +50,7 @@ describe('Rollup Search Strategy', () => { }, }, }, - } as unknown) as VisTypeTimeseriesRequestHandlerContext; + } as unknown as VisTypeTimeseriesRequestHandlerContext; const indexPattern = 'indexPattern'; @@ -100,7 +100,7 @@ describe('Rollup Search Strategy', () => { const result = await rollupSearchStrategy.checkForViability( requestContext, {} as VisTypeTimeseriesVisDataRequest, - { indexPatternString: (null as unknown) as string, indexPattern: undefined } + { indexPatternString: null as unknown as string, indexPattern: undefined } ); expect(result).toEqual({ diff --git a/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/rollup_search_strategy.ts b/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/rollup_search_strategy.ts index 7a1d1574aa7bb..f68c877cf7a3f 100644 --- a/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/rollup_search_strategy.ts +++ b/src/plugins/vis_type_timeseries/server/lib/search_strategies/strategies/rollup_search_strategy.ts @@ -36,11 +36,10 @@ export class RollupSearchStrategy extends AbstractSearchStrategy { indexPattern: string ) { try { - const { - body, - } = await requestContext.core.elasticsearch.client.asCurrentUser.rollup.getRollupIndexCaps({ - index: indexPattern, - }); + const { body } = + await requestContext.core.elasticsearch.client.asCurrentUser.rollup.getRollupIndexCaps({ + index: indexPattern, + }); return body; } catch (e) { diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/get_interval_and_timefield.test.ts b/src/plugins/vis_type_timeseries/server/lib/vis_data/get_interval_and_timefield.test.ts index 62220e08b7e10..45e0b410b6a6b 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/get_interval_and_timefield.test.ts +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/get_interval_and_timefield.test.ts @@ -29,11 +29,11 @@ describe('getIntervalAndTimefield(panel, series)', () => { test('returns the series interval and timefield', () => { const panel = { time_field: '@timestamp', interval: 'auto' } as Panel; - const series = ({ + const series = { override_index_pattern: true, series_interval: '1m', series_time_field: 'time', - } as unknown) as Series; + } as unknown as Series; expect(getIntervalAndTimefield(panel, index, params, series)).toEqual({ timeField: 'time', diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/handle_error_response.test.ts b/src/plugins/vis_type_timeseries/server/lib/vis_data/handle_error_response.test.ts index eeb22a3dc32cf..cac84583618fe 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/handle_error_response.test.ts +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/handle_error_response.test.ts @@ -10,9 +10,9 @@ import { Panel } from '../../../common/types'; import { handleErrorResponse, ErrorResponse } from './handle_error_response'; describe('handleErrorResponse', () => { - const handleError = handleErrorResponse(({ + const handleError = handleErrorResponse({ id: 'test_panel', - } as unknown) as Panel); + } as unknown as Panel); test('should only handle errors that contain errBody', () => { expect(handleError(new Error('Test Error'))).toMatchInlineSnapshot(`Object {}`); diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/helpers/get_bucket_size.test.ts b/src/plugins/vis_type_timeseries/server/lib/vis_data/helpers/get_bucket_size.test.ts index b90ae765196d7..cb33588bde424 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/helpers/get_bucket_size.test.ts +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/helpers/get_bucket_size.test.ts @@ -21,11 +21,11 @@ describe('getBucketSize', () => { }, } as VisTypeTimeseriesVisDataRequest; - const capabilities = ({ + const capabilities = { timezone: 'UTC', maxBucketsLimit: 200000, getValidTimeInterval: jest.fn((v) => v), - } as unknown) as SearchCapabilities; + } as unknown as SearchCapabilities; test('returns auto calculated buckets', () => { const result = getBucketSize(req, 'auto', capabilities, 100); diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/helpers/get_buckets_path.test.ts b/src/plugins/vis_type_timeseries/server/lib/vis_data/helpers/get_buckets_path.test.ts index d5a6d25ca60f9..230ddcff4ad5e 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/helpers/get_buckets_path.test.ts +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/helpers/get_buckets_path.test.ts @@ -10,7 +10,7 @@ import { getBucketsPath } from './get_buckets_path'; import type { Metric } from '../../../../common/types'; describe('getBucketsPath', () => { - const metrics = ([ + const metrics = [ { id: 1, type: 'derivative' }, { id: 2, type: 'percentile', percentiles: [{ value: '50' }] }, { id: 3, type: 'percentile', percentiles: [{ value: '20.0' }, { value: '10.0' }] }, @@ -20,7 +20,7 @@ describe('getBucketsPath', () => { { id: 7, type: 'sum_of_squares' }, { id: 8, type: 'variance' }, { id: 9, type: 'max' }, - ] as unknown) as Metric[]; + ] as unknown as Metric[]; test('return path for derivative', () => { expect(getBucketsPath('1', metrics)).toEqual('1[normalized_value]'); diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/helpers/get_last_metric.test.ts b/src/plugins/vis_type_timeseries/server/lib/vis_data/helpers/get_last_metric.test.ts index c6c5e0b3c05e4..47fe31589e16d 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/helpers/get_last_metric.test.ts +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/helpers/get_last_metric.test.ts @@ -11,23 +11,23 @@ import type { Series } from '../../../../common/types'; describe('getLastMetric(series)', () => { test('returns the last metric', () => { - const series = ({ + const series = { metrics: [ { id: 1, type: 'avg' }, { id: 2, type: 'moving_average' }, ], - } as unknown) as Series; + } as unknown as Series; expect(getLastMetric(series)).toEqual({ id: 2, type: 'moving_average' }); }); test('returns the last metric that not a series_agg', () => { - const series = ({ + const series = { metrics: [ { id: 1, type: 'avg' }, { id: 2, type: 'series_agg' }, ], - } as unknown) as Series; + } as unknown as Series; expect(getLastMetric(series)).toEqual({ id: 1, type: 'avg' }); }); diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/helpers/get_timerange.test.ts b/src/plugins/vis_type_timeseries/server/lib/vis_data/helpers/get_timerange.test.ts index 117cb8c48952a..9a71e2b60e6b1 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/helpers/get_timerange.test.ts +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/helpers/get_timerange.test.ts @@ -12,14 +12,14 @@ import { getTimerange } from './get_timerange'; describe('getTimerange(req)', () => { test('should return a moment object for to and from', () => { - const req = ({ + const req = { body: { timerange: { min: '2017-01-01T00:00:00Z', max: '2017-01-01T01:00:00Z', }, }, - } as unknown) as VisTypeTimeseriesVisDataRequest; + } as unknown as VisTypeTimeseriesVisDataRequest; const { from, to } = getTimerange(req); expect(moment.isMoment(from)).toEqual(true); diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/date_histogram.ts b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/date_histogram.ts index 27470d5868a5c..5dee812dd4c56 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/date_histogram.ts +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/date_histogram.ts @@ -16,69 +16,27 @@ import type { TableRequestProcessorsFunction, TableSearchRequestMeta } from './t const { dateHistogramInterval } = search.aggs; -export const dateHistogram: TableRequestProcessorsFunction = ({ - req, - panel, - seriesIndex, - capabilities, - uiSettings, - buildSeriesMetaParams, -}) => (next) => async (doc) => { - const barTargetUiSettings = await uiSettings.get(UI_SETTINGS.HISTOGRAM_BAR_TARGET); - const { timeField, interval } = await buildSeriesMetaParams(); - const { from, to } = getTimerange(req); - - const meta: TableSearchRequestMeta = { - timeField, - index: panel.use_kibana_indexes ? seriesIndex.indexPattern?.id : undefined, - panelId: panel.id, - }; - - const { intervalString } = getBucketSize(req, interval, capabilities, barTargetUiSettings); - const { timezone } = capabilities; - - const overwriteDateHistogramForLastBucketMode = () => { - panel.series.forEach((column) => { - const aggRoot = calculateAggRoot(doc, column); - - overwrite(doc, `${aggRoot}.timeseries.date_histogram`, { - field: timeField, - min_doc_count: 0, - time_zone: timezone, - extended_bounds: { - min: from.valueOf(), - max: to.valueOf(), - }, - ...dateHistogramInterval(intervalString), - }); - - overwrite(doc, aggRoot.replace(/\.aggs$/, '.meta'), { - ...meta, - intervalString, - }); - }); - }; - - const overwriteDateHistogramForEntireTimerangeMode = () => { - const metricAggs = getAggsByType((agg) => agg.id)[AGG_TYPE.METRIC]; - let bucketInterval; - - panel.series.forEach((column) => { - const aggRoot = calculateAggRoot(doc, column); +export const dateHistogram: TableRequestProcessorsFunction = + ({ req, panel, seriesIndex, capabilities, uiSettings, buildSeriesMetaParams }) => + (next) => + async (doc) => { + const barTargetUiSettings = await uiSettings.get(UI_SETTINGS.HISTOGRAM_BAR_TARGET); + const { timeField, interval } = await buildSeriesMetaParams(); + const { from, to } = getTimerange(req); + + const meta: TableSearchRequestMeta = { + timeField, + index: panel.use_kibana_indexes ? seriesIndex.indexPattern?.id : undefined, + panelId: panel.id, + }; + + const { intervalString } = getBucketSize(req, interval, capabilities, barTargetUiSettings); + const { timezone } = capabilities; + + const overwriteDateHistogramForLastBucketMode = () => { + panel.series.forEach((column) => { + const aggRoot = calculateAggRoot(doc, column); - // we should use auto_date_histogram only for metric aggregations and math - if ( - column.metrics.every( - (metric) => metricAggs.includes(metric.type) || metric.type === TSVB_METRIC_TYPES.MATH - ) - ) { - overwrite(doc, `${aggRoot}.timeseries.auto_date_histogram`, { - field: timeField, - buckets: 1, - }); - - bucketInterval = `${to.valueOf() - from.valueOf()}ms`; - } else { overwrite(doc, `${aggRoot}.timeseries.date_histogram`, { field: timeField, min_doc_count: 0, @@ -89,21 +47,59 @@ export const dateHistogram: TableRequestProcessorsFunction = ({ }, ...dateHistogramInterval(intervalString), }); - bucketInterval = intervalString; - } - overwrite(doc, aggRoot.replace(/\.aggs$/, '.meta'), { - ...meta, - intervalString: bucketInterval, + overwrite(doc, aggRoot.replace(/\.aggs$/, '.meta'), { + ...meta, + intervalString, + }); }); - }); - }; + }; + + const overwriteDateHistogramForEntireTimerangeMode = () => { + const metricAggs = getAggsByType((agg) => agg.id)[AGG_TYPE.METRIC]; + let bucketInterval; + + panel.series.forEach((column) => { + const aggRoot = calculateAggRoot(doc, column); + + // we should use auto_date_histogram only for metric aggregations and math + if ( + column.metrics.every( + (metric) => metricAggs.includes(metric.type) || metric.type === TSVB_METRIC_TYPES.MATH + ) + ) { + overwrite(doc, `${aggRoot}.timeseries.auto_date_histogram`, { + field: timeField, + buckets: 1, + }); + + bucketInterval = `${to.valueOf() - from.valueOf()}ms`; + } else { + overwrite(doc, `${aggRoot}.timeseries.date_histogram`, { + field: timeField, + min_doc_count: 0, + time_zone: timezone, + extended_bounds: { + min: from.valueOf(), + max: to.valueOf(), + }, + ...dateHistogramInterval(intervalString), + }); + bucketInterval = intervalString; + } + + overwrite(doc, aggRoot.replace(/\.aggs$/, '.meta'), { + ...meta, + intervalString: bucketInterval, + }); + }); + }; - if (isLastValueTimerangeMode(panel)) { - overwriteDateHistogramForLastBucketMode(); - } else { - overwriteDateHistogramForEntireTimerangeMode(); - } + if (isLastValueTimerangeMode(panel)) { + overwriteDateHistogramForLastBucketMode(); + } else { + overwriteDateHistogramForEntireTimerangeMode(); + } - return next(doc); -}; + return next(doc); + }; diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/metric_buckets.ts b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/metric_buckets.ts index 511c03d609132..9adcb5f0a59e6 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/metric_buckets.ts +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/metric_buckets.ts @@ -12,27 +12,28 @@ import { calculateAggRoot } from './calculate_agg_root'; import type { TableRequestProcessorsFunction } from './types'; -export const metricBuckets: TableRequestProcessorsFunction = ({ req, panel }) => (next) => async ( - doc -) => { - panel.series.forEach((column) => { - const aggRoot = calculateAggRoot(doc, column); - column.metrics - .filter((row) => !/_bucket$/.test(row.type) && !/^series/.test(row.type)) - .forEach((metric) => { - const fn = bucketTransform[metric.type]; - if (fn) { - try { - const intervalString = get(doc, aggRoot.replace(/\.aggs$/, '.meta.intervalString')); - const bucket = fn(metric, column.metrics, intervalString); +export const metricBuckets: TableRequestProcessorsFunction = + ({ req, panel }) => + (next) => + async (doc) => { + panel.series.forEach((column) => { + const aggRoot = calculateAggRoot(doc, column); + column.metrics + .filter((row) => !/_bucket$/.test(row.type) && !/^series/.test(row.type)) + .forEach((metric) => { + const fn = bucketTransform[metric.type]; + if (fn) { + try { + const intervalString = get(doc, aggRoot.replace(/\.aggs$/, '.meta.intervalString')); + const bucket = fn(metric, column.metrics, intervalString); - overwrite(doc, `${aggRoot}.timeseries.aggs.${metric.id}`, bucket); - } catch (e) { - // meh + overwrite(doc, `${aggRoot}.timeseries.aggs.${metric.id}`, bucket); + } catch (e) { + // meh + } } - } - }); - }); + }); + }); - return next(doc); -}; + return next(doc); + }; diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/normalize_query.test.ts b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/normalize_query.test.ts index 7b42af173441e..3d69faed863de 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/normalize_query.test.ts +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/normalize_query.test.ts @@ -20,7 +20,7 @@ describe('normalizeQuery', () => { const panelId = '39d49073-a924-426b-aa32-35acb40a9bb7'; const tableRequestProcessorsParams = {} as TableRequestProcessorsParams; - const next = (jest.fn((x) => x) as unknown) as ReturnType< + const next = jest.fn((x) => x) as unknown as ReturnType< ReturnType >; diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/pivot.ts b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/pivot.ts index fad14b8c439cf..692d4ea23bc59 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/pivot.ts +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/pivot.ts @@ -13,32 +13,38 @@ import { basicAggs } from '../../../../../common/basic_aggs'; import type { TableRequestProcessorsFunction } from './types'; -export const pivot: TableRequestProcessorsFunction = ({ req, panel }) => (next) => (doc) => { - const { sort } = req.body.state; +export const pivot: TableRequestProcessorsFunction = + ({ req, panel }) => + (next) => + (doc) => { + const { sort } = req.body.state; - if (panel.pivot_id) { - overwrite(doc, 'aggs.pivot.terms.field', panel.pivot_id); - overwrite(doc, 'aggs.pivot.terms.size', panel.pivot_rows); - if (sort) { - const series = panel.series.find((item) => item.id === sort.column); - const metric = series && last(series.metrics); - if (metric && metric.type === 'count') { - overwrite(doc, 'aggs.pivot.terms.order', { _count: sort.order }); - } else if (metric && series && basicAggs.includes(metric.type)) { - const sortAggKey = `${metric.id}-SORT`; - const fn = bucketTransform[metric.type]; - const bucketPath = getBucketsPath(metric.id, series.metrics).replace(metric.id, sortAggKey); - overwrite(doc, `aggs.pivot.terms.order`, { [bucketPath]: sort.order }); - overwrite(doc, `aggs.pivot.aggs`, { [sortAggKey]: fn(metric) }); - } else { - overwrite(doc, 'aggs.pivot.terms.order', { - _key: get(sort, 'order', 'asc'), - }); + if (panel.pivot_id) { + overwrite(doc, 'aggs.pivot.terms.field', panel.pivot_id); + overwrite(doc, 'aggs.pivot.terms.size', panel.pivot_rows); + if (sort) { + const series = panel.series.find((item) => item.id === sort.column); + const metric = series && last(series.metrics); + if (metric && metric.type === 'count') { + overwrite(doc, 'aggs.pivot.terms.order', { _count: sort.order }); + } else if (metric && series && basicAggs.includes(metric.type)) { + const sortAggKey = `${metric.id}-SORT`; + const fn = bucketTransform[metric.type]; + const bucketPath = getBucketsPath(metric.id, series.metrics).replace( + metric.id, + sortAggKey + ); + overwrite(doc, `aggs.pivot.terms.order`, { [bucketPath]: sort.order }); + overwrite(doc, `aggs.pivot.aggs`, { [sortAggKey]: fn(metric) }); + } else { + overwrite(doc, 'aggs.pivot.terms.order', { + _key: get(sort, 'order', 'asc'), + }); + } } + } else { + overwrite(doc, 'aggs.pivot.filter.match_all', {}); } - } else { - overwrite(doc, 'aggs.pivot.filter.match_all', {}); - } - return next(doc); -}; + return next(doc); + }; diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/positive_rate.ts b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/positive_rate.ts index a9f6a7301b1a2..85a817e124aa1 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/positive_rate.ts +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/positive_rate.ts @@ -15,20 +15,17 @@ import type { TableRequestProcessorsFunction } from './types'; // @ts-expect-error not typed yet import { createPositiveRate, filter } from '../series/positive_rate'; -export const positiveRate: TableRequestProcessorsFunction = ({ - req, - panel, - capabilities, - uiSettings, - buildSeriesMetaParams, -}) => (next) => async (doc) => { - const barTargetUiSettings = await uiSettings.get(UI_SETTINGS.HISTOGRAM_BAR_TARGET); - const { interval } = await buildSeriesMetaParams(); - const { intervalString } = getBucketSize(req, interval, capabilities, barTargetUiSettings); +export const positiveRate: TableRequestProcessorsFunction = + ({ req, panel, capabilities, uiSettings, buildSeriesMetaParams }) => + (next) => + async (doc) => { + const barTargetUiSettings = await uiSettings.get(UI_SETTINGS.HISTOGRAM_BAR_TARGET); + const { interval } = await buildSeriesMetaParams(); + const { intervalString } = getBucketSize(req, interval, capabilities, barTargetUiSettings); - panel.series.forEach((column) => { - const aggRoot = calculateAggRoot(doc, column); - column.metrics.filter(filter).forEach(createPositiveRate(doc, intervalString, aggRoot)); - }); - return next(doc); -}; + panel.series.forEach((column) => { + const aggRoot = calculateAggRoot(doc, column); + column.metrics.filter(filter).forEach(createPositiveRate(doc, intervalString, aggRoot)); + }); + return next(doc); + }; diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/query.ts b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/query.ts index c6419ae3da159..5ddf83e1134b3 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/query.ts +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/query.ts @@ -10,43 +10,40 @@ import { getTimerange, overwrite } from '../../helpers'; import { esQuery } from '../../../../../../data/server'; import type { TableRequestProcessorsFunction } from './types'; -export const query: TableRequestProcessorsFunction = ({ - req, - panel, - esQueryConfig, - seriesIndex, - buildSeriesMetaParams, -}) => (next) => async (doc) => { - const { timeField } = await buildSeriesMetaParams(); - const { from, to } = getTimerange(req); - const indexPattern = seriesIndex.indexPattern || undefined; - - doc.size = 0; - - const queries = !panel.ignore_global_filter ? req.body.query : []; - const filters = !panel.ignore_global_filter ? req.body.filters : []; - doc.query = esQuery.buildEsQuery(indexPattern, queries, filters, esQueryConfig); - - const boolFilters: unknown[] = []; - - if (timeField) { - const timerange = { - range: { - [timeField]: { - gte: from.toISOString(), - lte: to.toISOString(), - format: 'strict_date_optional_time', +export const query: TableRequestProcessorsFunction = + ({ req, panel, esQueryConfig, seriesIndex, buildSeriesMetaParams }) => + (next) => + async (doc) => { + const { timeField } = await buildSeriesMetaParams(); + const { from, to } = getTimerange(req); + const indexPattern = seriesIndex.indexPattern || undefined; + + doc.size = 0; + + const queries = !panel.ignore_global_filter ? req.body.query : []; + const filters = !panel.ignore_global_filter ? req.body.filters : []; + doc.query = esQuery.buildEsQuery(indexPattern, queries, filters, esQueryConfig); + + const boolFilters: unknown[] = []; + + if (timeField) { + const timerange = { + range: { + [timeField]: { + gte: from.toISOString(), + lte: to.toISOString(), + format: 'strict_date_optional_time', + }, }, - }, - }; + }; - boolFilters.push(timerange); - } - if (panel.filter) { - boolFilters.push(esQuery.buildEsQuery(indexPattern, [panel.filter], [], esQueryConfig)); - } + boolFilters.push(timerange); + } + if (panel.filter) { + boolFilters.push(esQuery.buildEsQuery(indexPattern, [panel.filter], [], esQueryConfig)); + } - overwrite(doc, 'query.bool.must', boolFilters); + overwrite(doc, 'query.bool.must', boolFilters); - return next(doc); -}; + return next(doc); + }; diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/sibling_buckets.ts b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/sibling_buckets.ts index af9bbdb5ce603..fd31b10dc585e 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/sibling_buckets.ts +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/sibling_buckets.ts @@ -10,29 +10,30 @@ import { overwrite, bucketTransform } from '../../helpers'; import { calculateAggRoot } from './calculate_agg_root'; import type { TableRequestProcessorsFunction } from './types'; -export const siblingBuckets: TableRequestProcessorsFunction = ({ panel }) => (next) => async ( - doc -) => { - panel.series.forEach((column) => { - const aggRoot = calculateAggRoot(doc, column); +export const siblingBuckets: TableRequestProcessorsFunction = + ({ panel }) => + (next) => + async (doc) => { + panel.series.forEach((column) => { + const aggRoot = calculateAggRoot(doc, column); - column.metrics - .filter((row) => /_bucket$/.test(row.type)) - .forEach((metric) => { - const fn = bucketTransform[metric.type]; + column.metrics + .filter((row) => /_bucket$/.test(row.type)) + .forEach((metric) => { + const fn = bucketTransform[metric.type]; - if (fn) { - try { - const intervalString = get(doc, aggRoot.replace(/\.aggs$/, '.meta.intervalString')); - const bucket = fn(metric, column.metrics, intervalString); + if (fn) { + try { + const intervalString = get(doc, aggRoot.replace(/\.aggs$/, '.meta.intervalString')); + const bucket = fn(metric, column.metrics, intervalString); - overwrite(doc, `${aggRoot}.${metric.id}`, bucket); - } catch (e) { - // meh + overwrite(doc, `${aggRoot}.${metric.id}`, bucket); + } catch (e) { + // meh + } } - } - }); - }); + }); + }); - return next(doc); -}; + return next(doc); + }; diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/split_by_everything.ts b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/split_by_everything.ts index 79efa7715f75a..cca86a1960fcd 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/split_by_everything.ts +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/request_processors/table/split_by_everything.ts @@ -11,26 +11,25 @@ import { esQuery } from '../../../../../../data/server'; import type { TableRequestProcessorsFunction } from './types'; -export const splitByEverything: TableRequestProcessorsFunction = ({ - panel, - esQueryConfig, - seriesIndex, -}) => (next) => (doc) => { - const indexPattern = seriesIndex.indexPattern || undefined; +export const splitByEverything: TableRequestProcessorsFunction = + ({ panel, esQueryConfig, seriesIndex }) => + (next) => + (doc) => { + const indexPattern = seriesIndex.indexPattern || undefined; - panel.series - .filter((c) => !(c.aggregate_by && c.aggregate_function)) - .forEach((column) => { - if (column.filter) { - overwrite( - doc, - `aggs.pivot.aggs.${column.id}.filter`, - esQuery.buildEsQuery(indexPattern, [column.filter], [], esQueryConfig) - ); - } else { - overwrite(doc, `aggs.pivot.aggs.${column.id}.filter.match_all`, {}); - } - }); + panel.series + .filter((c) => !(c.aggregate_by && c.aggregate_function)) + .forEach((column) => { + if (column.filter) { + overwrite( + doc, + `aggs.pivot.aggs.${column.id}.filter`, + esQuery.buildEsQuery(indexPattern, [column.filter], [], esQueryConfig) + ); + } else { + overwrite(doc, `aggs.pivot.aggs.${column.id}.filter.match_all`, {}); + } + }); - return next(doc); -}; + return next(doc); + }; diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/response_processors/series/percentile_rank.test.ts b/src/plugins/vis_type_timeseries/server/lib/vis_data/response_processors/series/percentile_rank.test.ts index c1e5bd006ef68..79c3eab91c3c9 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/response_processors/series/percentile_rank.test.ts +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/response_processors/series/percentile_rank.test.ts @@ -18,7 +18,7 @@ describe('percentile_rank(resp, panel, series, meta, extractFields)', () => { panel = { time_field: 'timestamp', } as Panel; - series = ({ + series = { chart_type: 'line', stacked: 'stacked', line_width: 1, @@ -36,7 +36,7 @@ describe('percentile_rank(resp, panel, series, meta, extractFields)', () => { colors: ['#000028', '#0000FF'], }, ], - } as unknown) as Series; + } as unknown as Series; resp = { aggregations: { test: { diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/response_processors/table/drop_last_bucket.ts b/src/plugins/vis_type_timeseries/server/lib/vis_data/response_processors/table/drop_last_bucket.ts index 3c7d46b172300..aff784ff886a6 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/response_processors/table/drop_last_bucket.ts +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/response_processors/table/drop_last_bucket.ts @@ -13,16 +13,17 @@ import { dropLastBucket } from '../series/drop_last_bucket'; import type { TableResponseProcessorsFunction } from './types'; -export const dropLastBucketFn: TableResponseProcessorsFunction = ({ bucket, panel, series }) => ( - next -) => (results) => { - const shouldDropLastBucket = isLastValueTimerangeMode(panel); +export const dropLastBucketFn: TableResponseProcessorsFunction = + ({ bucket, panel, series }) => + (next) => + (results) => { + const shouldDropLastBucket = isLastValueTimerangeMode(panel); - if (shouldDropLastBucket) { - const fn = dropLastBucket({ aggregations: bucket }, panel, series); + if (shouldDropLastBucket) { + const fn = dropLastBucket({ aggregations: bucket }, panel, series); - return fn(next)(results); - } + return fn(next)(results); + } - return next(results); -}; + return next(results); + }; diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/response_processors/table/math.ts b/src/plugins/vis_type_timeseries/server/lib/vis_data/response_processors/table/math.ts index b806d93a691a4..b1b6c41296115 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/response_processors/table/math.ts +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/response_processors/table/math.ts @@ -11,13 +11,10 @@ import { mathAgg } from '../series/math'; import type { TableResponseProcessorsFunction } from './types'; -export const math: TableResponseProcessorsFunction = ({ - bucket, - panel, - series, - meta, - extractFields, -}) => (next) => (results) => { - const mathFn = mathAgg({ aggregations: bucket }, panel, series, meta, extractFields); - return mathFn(next)(results); -}; +export const math: TableResponseProcessorsFunction = + ({ bucket, panel, series, meta, extractFields }) => + (next) => + (results) => { + const mathFn = mathAgg({ aggregations: bucket }, panel, series, meta, extractFields); + return mathFn(next)(results); + }; diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/response_processors/table/percentile.ts b/src/plugins/vis_type_timeseries/server/lib/vis_data/response_processors/table/percentile.ts index 723a72f661cf8..18e087255c834 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/response_processors/table/percentile.ts +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/response_processors/table/percentile.ts @@ -14,38 +14,35 @@ import { TSVB_METRIC_TYPES } from '../../../../../common/enums'; import type { TableResponseProcessorsFunction } from './types'; import type { PanelDataArray } from '../../../../../common/types/vis_data'; -export const percentile: TableResponseProcessorsFunction = ({ - bucket, - panel, - series, - meta, - extractFields, -}) => (next) => async (results) => { - const metric = getLastMetric(series); - - if (metric.type !== TSVB_METRIC_TYPES.PERCENTILE) { - return next(results); - } - - const fakeResp = { - aggregations: bucket, - }; - - (await getSplits(fakeResp, panel, series, meta, extractFields)).forEach((split) => { - // table allows only one percentile in a series (the last one will be chosen in case of several) - const lastPercentile = last(metric.percentiles)?.value ?? 0; - const percentileKey = toPercentileNumber(lastPercentile); - const data = split.timeseries.buckets.map((b) => [ - b.key, - b[metric.id].values[percentileKey], - ]) as PanelDataArray[]; - - results.push({ - id: split.id, - label: `${split.label} (${lastPercentile ?? 0})`, - data: data!, +export const percentile: TableResponseProcessorsFunction = + ({ bucket, panel, series, meta, extractFields }) => + (next) => + async (results) => { + const metric = getLastMetric(series); + + if (metric.type !== TSVB_METRIC_TYPES.PERCENTILE) { + return next(results); + } + + const fakeResp = { + aggregations: bucket, + }; + + (await getSplits(fakeResp, panel, series, meta, extractFields)).forEach((split) => { + // table allows only one percentile in a series (the last one will be chosen in case of several) + const lastPercentile = last(metric.percentiles)?.value ?? 0; + const percentileKey = toPercentileNumber(lastPercentile); + const data = split.timeseries.buckets.map((b) => [ + b.key, + b[metric.id].values[percentileKey], + ]) as PanelDataArray[]; + + results.push({ + id: split.id, + label: `${split.label} (${lastPercentile ?? 0})`, + data: data!, + }); }); - }); - return next(results); -}; + return next(results); + }; diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/response_processors/table/percentile_rank.ts b/src/plugins/vis_type_timeseries/server/lib/vis_data/response_processors/table/percentile_rank.ts index 31f9f1fd99041..b924682d9bdc8 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/response_processors/table/percentile_rank.ts +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/response_processors/table/percentile_rank.ts @@ -14,42 +14,39 @@ import { TSVB_METRIC_TYPES } from '../../../../../common/enums'; import type { TableResponseProcessorsFunction } from './types'; import type { PanelDataArray } from '../../../../../common/types/vis_data'; -export const percentileRank: TableResponseProcessorsFunction = ({ - bucket, - panel, - series, - meta, - extractFields, -}) => (next) => async (results) => { - const metric = getLastMetric(series); - - if (metric.type !== TSVB_METRIC_TYPES.PERCENTILE_RANK) { - return next(results); - } - - const fakeResp = { - aggregations: bucket, - }; - - (await getSplits(fakeResp, panel, series, meta, extractFields)).forEach((split) => { - // table allows only one percentile rank in a series (the last one will be chosen in case of several) - const lastRankValue = last(metric.values) ?? 0; - const lastPercentileNumber = toPercentileNumber(lastRankValue); - - const data = split.timeseries.buckets.map((b) => [ - b.key, - getAggValue(b, { - ...metric, - value: lastPercentileNumber, - }), - ]) as PanelDataArray[]; - - results.push({ - data, - id: split.id, - label: `${split.label} (${lastRankValue ?? 0})`, +export const percentileRank: TableResponseProcessorsFunction = + ({ bucket, panel, series, meta, extractFields }) => + (next) => + async (results) => { + const metric = getLastMetric(series); + + if (metric.type !== TSVB_METRIC_TYPES.PERCENTILE_RANK) { + return next(results); + } + + const fakeResp = { + aggregations: bucket, + }; + + (await getSplits(fakeResp, panel, series, meta, extractFields)).forEach((split) => { + // table allows only one percentile rank in a series (the last one will be chosen in case of several) + const lastRankValue = last(metric.values) ?? 0; + const lastPercentileNumber = toPercentileNumber(lastRankValue); + + const data = split.timeseries.buckets.map((b) => [ + b.key, + getAggValue(b, { + ...metric, + value: lastPercentileNumber, + }), + ]) as PanelDataArray[]; + + results.push({ + data, + id: split.id, + label: `${split.label} (${lastRankValue ?? 0})`, + }); }); - }); - return next(results); -}; + return next(results); + }; diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/response_processors/table/series_agg.ts b/src/plugins/vis_type_timeseries/server/lib/vis_data/response_processors/table/series_agg.ts index 3b089a2b0de87..f64daf91da126 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/response_processors/table/series_agg.ts +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/response_processors/table/series_agg.ts @@ -16,31 +16,33 @@ import { SeriesAgg } from './_series_agg'; import type { TableResponseProcessorsFunction } from './types'; import type { PanelDataArray } from '../../../../../common/types/vis_data'; -export const seriesAgg: TableResponseProcessorsFunction = ({ series, meta, extractFields }) => ( - next -) => async (results) => { - if (series.aggregate_by && series.aggregate_function) { - const targetSeries: PanelDataArray[][] = []; - - // Filter out the seires with the matching metric and store them - // in targetSeries - results = results.filter((s) => { - if (s.id && s.id.split(/:/)[0] === series.id) { - targetSeries.push(s.data!); - return false; - } - return true; - }); - - const fn = SeriesAgg[series.aggregate_function]; - const data = fn(targetSeries); - const fieldsForSeries = meta.index ? await extractFields({ id: meta.index }) : []; - - results.push({ - id: `${series.id}`, - label: series.label || calculateLabel(last(series.metrics)!, series.metrics, fieldsForSeries), - data: data[0], - }); - } - return next(results); -}; +export const seriesAgg: TableResponseProcessorsFunction = + ({ series, meta, extractFields }) => + (next) => + async (results) => { + if (series.aggregate_by && series.aggregate_function) { + const targetSeries: PanelDataArray[][] = []; + + // Filter out the seires with the matching metric and store them + // in targetSeries + results = results.filter((s) => { + if (s.id && s.id.split(/:/)[0] === series.id) { + targetSeries.push(s.data!); + return false; + } + return true; + }); + + const fn = SeriesAgg[series.aggregate_function]; + const data = fn(targetSeries); + const fieldsForSeries = meta.index ? await extractFields({ id: meta.index }) : []; + + results.push({ + id: `${series.id}`, + label: + series.label || calculateLabel(last(series.metrics)!, series.metrics, fieldsForSeries), + data: data[0], + }); + } + return next(results); + }; diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/response_processors/table/std_metric.ts b/src/plugins/vis_type_timeseries/server/lib/vis_data/response_processors/table/std_metric.ts index eb537bf16f51c..ffcbfb422103d 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/response_processors/table/std_metric.ts +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/response_processors/table/std_metric.ts @@ -11,44 +11,41 @@ import { TSVB_METRIC_TYPES } from '../../../../../common/enums'; import type { TableResponseProcessorsFunction } from './types'; -export const stdMetric: TableResponseProcessorsFunction = ({ - bucket, - panel, - series, - meta, - extractFields, -}) => (next) => async (results) => { - const metric = getLastMetric(series); - - if (metric.type === TSVB_METRIC_TYPES.STD_DEVIATION && metric.mode === 'band') { - return next(results); - } - - if ( - [TSVB_METRIC_TYPES.PERCENTILE_RANK, TSVB_METRIC_TYPES.PERCENTILE].includes( - metric.type as TSVB_METRIC_TYPES - ) - ) { - return next(results); - } +export const stdMetric: TableResponseProcessorsFunction = + ({ bucket, panel, series, meta, extractFields }) => + (next) => + async (results) => { + const metric = getLastMetric(series); + + if (metric.type === TSVB_METRIC_TYPES.STD_DEVIATION && metric.mode === 'band') { + return next(results); + } + + if ( + [TSVB_METRIC_TYPES.PERCENTILE_RANK, TSVB_METRIC_TYPES.PERCENTILE].includes( + metric.type as TSVB_METRIC_TYPES + ) + ) { + return next(results); + } + + if (/_bucket$/.test(metric.type)) { + return next(results); + } + + const fakeResp = { + aggregations: bucket, + }; + + (await getSplits(fakeResp, panel, series, meta, extractFields)).forEach((split) => { + const data = mapEmptyToZero(metric, split.timeseries.buckets); + + results.push({ + id: split.id, + label: split.label, + data, + }); + }); - if (/_bucket$/.test(metric.type)) { return next(results); - } - - const fakeResp = { - aggregations: bucket, }; - - (await getSplits(fakeResp, panel, series, meta, extractFields)).forEach((split) => { - const data = mapEmptyToZero(metric, split.timeseries.buckets); - - results.push({ - id: split.id, - label: split.label, - data, - }); - }); - - return next(results); -}; diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/response_processors/table/std_sibling.ts b/src/plugins/vis_type_timeseries/server/lib/vis_data/response_processors/table/std_sibling.ts index 414108291a24f..5c114266de39b 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/response_processors/table/std_sibling.ts +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/response_processors/table/std_sibling.ts @@ -11,30 +11,27 @@ import { getSplits, getLastMetric, getSiblingAggValue } from '../../helpers'; import type { TableResponseProcessorsFunction } from './types'; import type { PanelDataArray } from '../../../../../common/types/vis_data'; -export const stdSibling: TableResponseProcessorsFunction = ({ - bucket, - panel, - series, - meta, - extractFields, -}) => (next) => async (results) => { - const metric = getLastMetric(series); +export const stdSibling: TableResponseProcessorsFunction = + ({ bucket, panel, series, meta, extractFields }) => + (next) => + async (results) => { + const metric = getLastMetric(series); - if (!/_bucket$/.test(metric.type)) return next(results); - if (metric.type === 'std_deviation_bucket' && metric.mode === 'band') return next(results); + if (!/_bucket$/.test(metric.type)) return next(results); + if (metric.type === 'std_deviation_bucket' && metric.mode === 'band') return next(results); - const fakeResp = { aggregations: bucket }; - (await getSplits(fakeResp, panel, series, meta, extractFields)).forEach((split) => { - const data: PanelDataArray[] = split.timeseries.buckets.map((b) => { - return [b.key, getSiblingAggValue(split, metric)]; - }); + const fakeResp = { aggregations: bucket }; + (await getSplits(fakeResp, panel, series, meta, extractFields)).forEach((split) => { + const data: PanelDataArray[] = split.timeseries.buckets.map((b) => { + return [b.key, getSiblingAggValue(split, metric)]; + }); - results.push({ - id: split.id, - label: split.label, - data, + results.push({ + id: split.id, + label: split.label, + data, + }); }); - }); - return next(results); -}; + return next(results); + }; diff --git a/src/plugins/vis_type_timeseries/server/lib/vis_data/table/process_bucket.test.ts b/src/plugins/vis_type_timeseries/server/lib/vis_data/table/process_bucket.test.ts index 4a6c36c50599c..6e0b599e57e24 100644 --- a/src/plugins/vis_type_timeseries/server/lib/vis_data/table/process_bucket.test.ts +++ b/src/plugins/vis_type_timeseries/server/lib/vis_data/table/process_bucket.test.ts @@ -32,11 +32,11 @@ function createPanel(series: string[]) { return { type: 'table', time_field: '', - series: (series.map((seriesId) => ({ + series: series.map((seriesId) => ({ id: seriesId, metrics: [{ id: seriesId, type: 'count' }], trend_arrows: 1, - })) as unknown) as Series[], + })) as unknown as Series[], } as Panel; } diff --git a/src/plugins/vis_type_timeseries/server/usage_collector/get_usage_collector.test.ts b/src/plugins/vis_type_timeseries/server/usage_collector/get_usage_collector.test.ts index 6bb5f3bbfcadd..91daf09121f18 100644 --- a/src/plugins/vis_type_timeseries/server/usage_collector/get_usage_collector.test.ts +++ b/src/plugins/vis_type_timeseries/server/usage_collector/get_usage_collector.test.ts @@ -88,7 +88,7 @@ const getMockCollectorFetchContext = ( ) => { const fetchParamsMock = createCollectorFetchContextMock(); - fetchParamsMock.soClient = ({ + fetchParamsMock.soClient = { find: jest.fn().mockResolvedValue({ saved_objects: savedObjectsByValue, }), @@ -98,14 +98,14 @@ const getMockCollectorFetchContext = ( yield savedObjects; }, }), - } as unknown) as SavedObjectsClientContract; + } as unknown as SavedObjectsClientContract; return fetchParamsMock; }; describe('Timeseries visualization usage collector', () => { test('Returns undefined when no results found (undefined)', async () => { const mockCollectorFetchContext = getMockCollectorFetchContext( - ({ saved_objects: [] } as unknown) as SavedObjectsFindResponse, + { saved_objects: [] } as unknown as SavedObjectsFindResponse, [] ); const result = await getStats(mockCollectorFetchContext.soClient); diff --git a/src/plugins/vis_type_timeseries/server/usage_collector/get_usage_collector.ts b/src/plugins/vis_type_timeseries/server/usage_collector/get_usage_collector.ts index b5b22e06b51c9..a8d64afaf8cee 100644 --- a/src/plugins/vis_type_timeseries/server/usage_collector/get_usage_collector.ts +++ b/src/plugins/vis_type_timeseries/server/usage_collector/get_usage_collector.ts @@ -53,7 +53,7 @@ const doTelemetryForByValueVisualizations = async ( const byValueVisualizations = await findByValueEmbeddables(soClient, 'visualization'); for (const item of byValueVisualizations) { - telemetryUseLastValueMode((item.savedVis as unknown) as SavedVisState); + telemetryUseLastValueMode(item.savedVis as unknown as SavedVisState); } }; diff --git a/src/plugins/vis_types/metric/public/to_ast.test.ts b/src/plugins/vis_types/metric/public/to_ast.test.ts index 4931b40d597bd..1c8987bfab5d5 100644 --- a/src/plugins/vis_types/metric/public/to_ast.test.ts +++ b/src/plugins/vis_types/metric/public/to_ast.test.ts @@ -16,7 +16,7 @@ describe('metric vis toExpressionAst function', () => { let vis: Vis; beforeEach(() => { - vis = ({ + vis = { isHierarchical: () => false, type: {}, params: { @@ -29,7 +29,7 @@ describe('metric vis toExpressionAst function', () => { aggs: [], } as any, }, - } as unknown) as Vis; + } as unknown as Vis; }); it('without params', () => { diff --git a/src/plugins/vis_types/pie/public/editor/components/index.tsx b/src/plugins/vis_types/pie/public/editor/components/index.tsx index 5f7c744db0716..1d44dc21c68e8 100644 --- a/src/plugins/vis_types/pie/public/editor/components/index.tsx +++ b/src/plugins/vis_types/pie/public/editor/components/index.tsx @@ -12,15 +12,14 @@ import { PieVisParams, PieTypeProps } from '../../types'; const PieOptionsLazy = lazy(() => import('./pie')); -export const getPieOptions = ({ - showElasticChartsOptions, - palettes, - trackUiMetric, -}: PieTypeProps) => (props: VisEditorOptionsProps) => ( - -); +export const getPieOptions = + ({ showElasticChartsOptions, palettes, trackUiMetric }: PieTypeProps) => + (props: VisEditorOptionsProps) => + ( + + ); diff --git a/src/plugins/vis_types/pie/public/editor/components/pie.test.tsx b/src/plugins/vis_types/pie/public/editor/components/pie.test.tsx index ee8d0bf19ecac..ac02b33b92add 100644 --- a/src/plugins/vis_types/pie/public/editor/components/pie.test.tsx +++ b/src/plugins/vis_types/pie/public/editor/components/pie.test.tsx @@ -19,7 +19,7 @@ describe('PalettePicker', function () { let component: ReactWrapper; beforeAll(() => { - props = ({ + props = { palettes: chartPluginMock.createSetupContract().palettes, showElasticChartsOptions: true, vis: { @@ -56,7 +56,7 @@ describe('PalettePicker', function () { }, }, setValue: jest.fn(), - } as unknown) as PieOptionsProps; + } as unknown as PieOptionsProps; }); it('renders the nested legend switch for the elastic charts implementation', async () => { diff --git a/src/plugins/vis_types/pie/public/mocks.ts b/src/plugins/vis_types/pie/public/mocks.ts index f7ba4056c77e4..cd57aeb54afbc 100644 --- a/src/plugins/vis_types/pie/public/mocks.ts +++ b/src/plugins/vis_types/pie/public/mocks.ts @@ -265,7 +265,7 @@ export const createMockVisData = (): Datatable => { }; export const createMockPieParams = (): PieVisParams => { - return ({ + return { addLegend: true, addTooltip: true, isDonut: true, @@ -326,5 +326,5 @@ export const createMockPieParams = (): PieVisParams => { }, ], }, - } as unknown) as PieVisParams; + } as unknown as PieVisParams; }; diff --git a/src/plugins/vis_types/pie/public/pie_component.test.tsx b/src/plugins/vis_types/pie/public/pie_component.test.tsx index 846daa1e45710..85ce1947087ad 100644 --- a/src/plugins/vis_types/pie/public/pie_component.test.tsx +++ b/src/plugins/vis_types/pie/public/pie_component.test.tsx @@ -123,7 +123,7 @@ describe('PieComponent', function () { }); it('renders the no results component if all the values are zero', () => { - const newVisData = ({ + const newVisData = { type: 'datatable', columns: [ { @@ -145,14 +145,14 @@ describe('PieComponent', function () { 'col-1-1': 0, }, ], - } as unknown) as Datatable; + } as unknown as Datatable; const newProps = { ...wrapperProps, visData: newVisData }; const component = mount(); expect(findTestSubject(component, 'pieVisualizationError').text()).toEqual('No results found'); }); it('renders the no results component if there are negative values', () => { - const newVisData = ({ + const newVisData = { type: 'datatable', columns: [ { @@ -174,7 +174,7 @@ describe('PieComponent', function () { 'col-1-1': -10, }, ], - } as unknown) as Datatable; + } as unknown as Datatable; const newProps = { ...wrapperProps, visData: newVisData }; const component = mount(); expect(findTestSubject(component, 'pieVisualizationError').text()).toEqual( diff --git a/src/plugins/vis_types/pie/public/pie_component.tsx b/src/plugins/vis_types/pie/public/pie_component.tsx index c41b47f9aa683..9211274a8abc8 100644 --- a/src/plugins/vis_types/pie/public/pie_component.tsx +++ b/src/plugins/vis_types/pie/public/pie_component.tsx @@ -129,17 +129,18 @@ const PieComponent = (props: PieComponentProps) => { // handles legend action event data const getLegendActionEventData = useCallback( - (visData: Datatable) => (series: SeriesIdentifier): ClickTriggerEvent | null => { - const data = getFilterEventData(visData, series); + (visData: Datatable) => + (series: SeriesIdentifier): ClickTriggerEvent | null => { + const data = getFilterEventData(visData, series); - return { - name: 'filterBucket', - data: { - negate: false, - data, - }, - }; - }, + return { + name: 'filterBucket', + data: { + negate: false, + data, + }, + }; + }, [] ); @@ -207,10 +208,10 @@ const PieComponent = (props: PieComponentProps) => { }, }); - const { bucketColumns, metricColumn } = useMemo(() => getColumns(visParams, visData), [ - visData, - visParams, - ]); + const { bucketColumns, metricColumn } = useMemo( + () => getColumns(visParams, visData), + [visData, visParams] + ); const layers = useMemo( () => @@ -233,11 +234,10 @@ const PieComponent = (props: PieComponentProps) => { syncColors, ] ); - const config = useMemo(() => getConfig(visParams, chartTheme, dimensions), [ - chartTheme, - visParams, - dimensions, - ]); + const config = useMemo( + () => getConfig(visParams, chartTheme, dimensions), + [chartTheme, visParams, dimensions] + ); const tooltip: TooltipProps = { type: visParams.addTooltip ? TooltipType.Follow : TooltipType.None, }; @@ -288,10 +288,10 @@ const PieComponent = (props: PieComponentProps) => { * Checks whether data have all zero values. * If so, the no data container is loaded. */ - const isAllZeros = useMemo(() => visData.rows.every((row) => row[metricColumn.id] === 0), [ - visData.rows, - metricColumn, - ]); + const isAllZeros = useMemo( + () => visData.rows.every((row) => row[metricColumn.id] === 0), + [visData.rows, metricColumn] + ); /** * Checks whether data have negative values. diff --git a/src/plugins/vis_types/pie/public/utils/get_color_picker.test.tsx b/src/plugins/vis_types/pie/public/utils/get_color_picker.test.tsx index bb4cbd8c08ae2..c129fdd356a66 100644 --- a/src/plugins/vis_types/pie/public/utils/get_color_picker.test.tsx +++ b/src/plugins/vis_types/pie/public/utils/get_color_picker.test.tsx @@ -30,14 +30,14 @@ jest.mock('@elastic/charts', () => { describe('getColorPicker', function () { const mockState = new Map(); - const uiState = ({ + const uiState = { get: jest .fn() .mockImplementation((key, fallback) => (mockState.has(key) ? mockState.get(key) : fallback)), set: jest.fn().mockImplementation((key, value) => mockState.set(key, value)), emit: jest.fn(), setSilent: jest.fn(), - } as unknown) as PersistedState; + } as unknown as PersistedState; let wrapperProps: LegendColorPickerProps; const Component: ComponentType = getColorPicker( diff --git a/src/plugins/vis_types/pie/public/utils/get_color_picker.tsx b/src/plugins/vis_types/pie/public/utils/get_color_picker.tsx index 68daa7bb82df7..6bfd231aa75a6 100644 --- a/src/plugins/vis_types/pie/public/utils/get_color_picker.tsx +++ b/src/plugins/vis_types/pie/public/utils/get_color_picker.tsx @@ -48,74 +48,71 @@ function isOnInnerLayer( return data.find((d) => firstBucket.id && d[firstBucket.id] === seriesKey); } -export const getColorPicker = ( - legendPosition: Position, - setColor: (newColor: string | null, seriesKey: string | number) => void, - bucketColumns: Array>, - palette: string, - data: DatatableRow[], - uiState: PersistedState, - distinctColors: boolean -): LegendColorPicker => ({ - anchor, - color, - onClose, - onChange, - seriesIdentifiers: [seriesIdentifier], -}) => { - const seriesName = seriesIdentifier.key; - const overwriteColors: Record = uiState?.get('vis.colors', {}) ?? {}; - const colorIsOverwritten = Object.keys(overwriteColors).includes(seriesName.toString()); - let keyDownEventOn = false; - const handleChange = (newColor: string | null) => { - if (newColor) { - onChange(newColor); - } - setColor(newColor, seriesName); - // close the popover if no color is applied or the user has clicked a color - if (!newColor || !keyDownEventOn) { - onClose(); - } - }; +export const getColorPicker = + ( + legendPosition: Position, + setColor: (newColor: string | null, seriesKey: string | number) => void, + bucketColumns: Array>, + palette: string, + data: DatatableRow[], + uiState: PersistedState, + distinctColors: boolean + ): LegendColorPicker => + ({ anchor, color, onClose, onChange, seriesIdentifiers: [seriesIdentifier] }) => { + const seriesName = seriesIdentifier.key; + const overwriteColors: Record = uiState?.get('vis.colors', {}) ?? {}; + const colorIsOverwritten = Object.keys(overwriteColors).includes(seriesName.toString()); + let keyDownEventOn = false; + const handleChange = (newColor: string | null) => { + if (newColor) { + onChange(newColor); + } + setColor(newColor, seriesName); + // close the popover if no color is applied or the user has clicked a color + if (!newColor || !keyDownEventOn) { + onClose(); + } + }; + + const onKeyDown = (e: React.KeyboardEvent) => { + if (e.keyCode === KEY_CODE_ENTER) { + onClose?.(); + } + keyDownEventOn = true; + }; - const onKeyDown = (e: React.KeyboardEvent) => { - if (e.keyCode === KEY_CODE_ENTER) { + const handleOutsideClick = useCallback(() => { onClose?.(); + }, [onClose]); + + if (!distinctColors) { + const enablePicker = + isOnInnerLayer(bucketColumns[0], data, seriesName) || !bucketColumns[0].id; + if (!enablePicker) return null; } - keyDownEventOn = true; + const hexColor = new Color(color).hex(); + return ( + + + + + + ); }; - - const handleOutsideClick = useCallback(() => { - onClose?.(); - }, [onClose]); - - if (!distinctColors) { - const enablePicker = isOnInnerLayer(bucketColumns[0], data, seriesName) || !bucketColumns[0].id; - if (!enablePicker) return null; - } - const hexColor = new Color(color).hex(); - return ( - - - - - - ); -}; diff --git a/src/plugins/vis_types/pie/public/utils/get_columns.test.ts b/src/plugins/vis_types/pie/public/utils/get_columns.test.ts index 9f64266ed0e0e..7752f4300dbbf 100644 --- a/src/plugins/vis_types/pie/public/utils/get_columns.test.ts +++ b/src/plugins/vis_types/pie/public/utils/get_columns.test.ts @@ -130,7 +130,7 @@ describe('getColumns', () => { }); it('should return the first data column if no buckets specified', () => { - const visParamsOnlyMetric = ({ + const visParamsOnlyMetric = { addLegend: true, addTooltip: true, isDonut: true, @@ -162,7 +162,7 @@ describe('getColumns', () => { aggType: 'count', }, }, - } as unknown) as PieVisParams; + } as unknown as PieVisParams; const { metricColumn } = getColumns(visParamsOnlyMetric, visData); expect(metricColumn).toEqual({ id: 'col-1-1', @@ -187,7 +187,7 @@ describe('getColumns', () => { }); it('should return an object with the name of the metric if no buckets specified', () => { - const visParamsOnlyMetric = ({ + const visParamsOnlyMetric = { addLegend: true, addTooltip: true, isDonut: true, @@ -217,7 +217,7 @@ describe('getColumns', () => { aggType: 'count', }, }, - } as unknown) as PieVisParams; + } as unknown as PieVisParams; const { bucketColumns, metricColumn } = getColumns(visParamsOnlyMetric, visData); expect(bucketColumns).toEqual([{ name: metricColumn.name }]); }); diff --git a/src/plugins/vis_types/pie/public/utils/get_layers.test.ts b/src/plugins/vis_types/pie/public/utils/get_layers.test.ts index 859d0daf07a02..39c3ccfc45a93 100644 --- a/src/plugins/vis_types/pie/public/utils/get_layers.test.ts +++ b/src/plugins/vis_types/pie/public/utils/get_layers.test.ts @@ -22,13 +22,13 @@ interface RangeProps { lt: number; } -dataMock.fieldFormats = ({ +dataMock.fieldFormats = { deserialize: jest.fn(() => ({ convert: jest.fn((s: RangeProps) => { return `≥ ${s.gte} and < ${s.lt}`; }), })), -} as unknown) as DataPublicPluginStart['fieldFormats']; +} as unknown as DataPublicPluginStart['fieldFormats']; export const getPaletteRegistry = () => { const mockPalette1: jest.Mocked = { @@ -58,7 +58,7 @@ export const getPaletteRegistry = () => { describe('computeColor', () => { it('should return the correct color based on the parent sortIndex', () => { - const d = ({ + const d = { dataName: 'ES-Air', depth: 1, sortIndex: 0, @@ -67,7 +67,7 @@ describe('computeColor', () => { depth: 0, sortIndex: 0, }, - } as unknown) as ShapeTreeNode; + } as unknown as ShapeTreeNode; const color = computeColor( d, false, @@ -83,7 +83,7 @@ describe('computeColor', () => { }); it('slices with the same label should have the same color for small multiples', () => { - const d = ({ + const d = { dataName: 'ES-Air', depth: 1, sortIndex: 0, @@ -92,7 +92,7 @@ describe('computeColor', () => { depth: 0, sortIndex: 0, }, - } as unknown) as ShapeTreeNode; + } as unknown as ShapeTreeNode; const color = computeColor( d, true, @@ -107,7 +107,7 @@ describe('computeColor', () => { expect(color).toEqual('color3'); }); it('returns the overwriteColor if exists', () => { - const d = ({ + const d = { dataName: 'ES-Air', depth: 1, sortIndex: 0, @@ -116,7 +116,7 @@ describe('computeColor', () => { depth: 0, sortIndex: 0, }, - } as unknown) as ShapeTreeNode; + } as unknown as ShapeTreeNode; const color = computeColor( d, true, @@ -132,7 +132,7 @@ describe('computeColor', () => { }); it('returns the overwriteColor for older visualizations with formatted values', () => { - const d = ({ + const d = { dataName: { gte: 1000, lt: 2000, @@ -157,7 +157,7 @@ describe('computeColor', () => { depth: 0, sortIndex: 0, }, - } as unknown) as ShapeTreeNode; + } as unknown as ShapeTreeNode; const visParamsNew = { ...visParams, distinctColors: true, diff --git a/src/plugins/vis_types/pie/public/utils/get_split_dimension_accessor.ts b/src/plugins/vis_types/pie/public/utils/get_split_dimension_accessor.ts index 4f30d4f8b3cc4..b2ca7560b63c8 100644 --- a/src/plugins/vis_types/pie/public/utils/get_split_dimension_accessor.ts +++ b/src/plugins/vis_types/pie/public/utils/get_split_dimension_accessor.ts @@ -10,22 +10,21 @@ import { DatatableColumn } from '../../../../expressions/public'; import type { FieldFormatsStart } from '../../../../field_formats/public'; import { Dimension } from '../types'; -export const getSplitDimensionAccessor = ( - fieldFormats: FieldFormatsStart, - columns: DatatableColumn[] -) => (splitDimension: Dimension): AccessorFn => { - const formatter = fieldFormats.deserialize(splitDimension.format); - const splitChartColumn = columns[splitDimension.accessor]; - const accessor = splitChartColumn.id; +export const getSplitDimensionAccessor = + (fieldFormats: FieldFormatsStart, columns: DatatableColumn[]) => + (splitDimension: Dimension): AccessorFn => { + const formatter = fieldFormats.deserialize(splitDimension.format); + const splitChartColumn = columns[splitDimension.accessor]; + const accessor = splitChartColumn.id; - const fn: AccessorFn = (d) => { - const v = d[accessor]; - if (v === undefined) { - return; - } - const f = formatter.convert(v); - return f; - }; + const fn: AccessorFn = (d) => { + const v = d[accessor]; + if (v === undefined) { + return; + } + const f = formatter.convert(v); + return f; + }; - return fn; -}; + return fn; + }; diff --git a/src/plugins/vis_types/table/public/components/table_vis_basic.tsx b/src/plugins/vis_types/table/public/components/table_vis_basic.tsx index 572efd90e61aa..e627b9e7f92f2 100644 --- a/src/plugins/vis_types/table/public/components/table_vis_basic.tsx +++ b/src/plugins/vis_types/table/public/components/table_vis_basic.tsx @@ -46,10 +46,10 @@ export const TableVisBasic = memo( ); // renderCellValue is a component which renders a cell based on column and row indexes - const renderCellValue = useMemo(() => createTableVisCell(sortedRows, formattedColumns), [ - formattedColumns, - sortedRows, - ]); + const renderCellValue = useMemo( + () => createTableVisCell(sortedRows, formattedColumns), + [formattedColumns, sortedRows] + ); // Columns config const gridColumns = createGridColumns( diff --git a/src/plugins/vis_types/table/public/components/table_vis_cell.test.tsx b/src/plugins/vis_types/table/public/components/table_vis_cell.test.tsx index 322ceacbe002e..46dc6d55a2fa5 100644 --- a/src/plugins/vis_types/table/public/components/table_vis_cell.test.tsx +++ b/src/plugins/vis_types/table/public/components/table_vis_cell.test.tsx @@ -15,13 +15,13 @@ import { FormattedColumns } from '../types'; describe('table vis cell', () => { it('should return a cell component with data in scope', () => { const rows = [{ first: 1, second: 2 }]; - const formattedColumns = ({ + const formattedColumns = { second: { formatter: { convert: jest.fn(), }, }, - } as unknown) as FormattedColumns; + } as unknown as FormattedColumns; const Cell = createTableVisCell(rows, formattedColumns); const cellProps = { rowIndex: 0, diff --git a/src/plugins/vis_types/table/public/components/table_vis_cell.tsx b/src/plugins/vis_types/table/public/components/table_vis_cell.tsx index 16a4ccf568a2a..9749cdcb5740c 100644 --- a/src/plugins/vis_types/table/public/components/table_vis_cell.tsx +++ b/src/plugins/vis_types/table/public/components/table_vis_cell.tsx @@ -12,26 +12,25 @@ import { EuiDataGridCellValueElementProps } from '@elastic/eui'; import { DatatableRow } from 'src/plugins/expressions'; import { FormattedColumns } from '../types'; -export const createTableVisCell = (rows: DatatableRow[], formattedColumns: FormattedColumns) => ({ - rowIndex, - columnId, -}: EuiDataGridCellValueElementProps) => { - const rowValue = rows[rowIndex][columnId]; - const column = formattedColumns[columnId]; - const content = column.formatter.convert(rowValue, 'html'); +export const createTableVisCell = + (rows: DatatableRow[], formattedColumns: FormattedColumns) => + ({ rowIndex, columnId }: EuiDataGridCellValueElementProps) => { + const rowValue = rows[rowIndex][columnId]; + const column = formattedColumns[columnId]; + const content = column.formatter.convert(rowValue, 'html'); - const cellContent = ( -
- ); + const cellContent = ( +
+ ); - return cellContent; -}; + return cellContent; + }; diff --git a/src/plugins/vis_types/table/public/components/table_vis_columns.tsx b/src/plugins/vis_types/table/public/components/table_vis_columns.tsx index f994e71f9fcb5..23918e7df3f8e 100644 --- a/src/plugins/vis_types/table/public/components/table_vis_columns.tsx +++ b/src/plugins/vis_types/table/public/components/table_vis_columns.tsx @@ -51,115 +51,113 @@ export const createGridColumns = ( }); }; - return columns.map( - (col, colIndex): EuiDataGridColumn => { - const formattedColumn = formattedColumns[col.id]; - const cellActions = formattedColumn.filterable - ? [ - ({ rowIndex, columnId, Component, closePopover }: EuiDataGridColumnCellActionProps) => { - const rowValue = rows[rowIndex][columnId]; - const contentsIsDefined = rowValue !== null && rowValue !== undefined; - const cellContent = formattedColumn.formatter.convert(rowValue); + return columns.map((col, colIndex): EuiDataGridColumn => { + const formattedColumn = formattedColumns[col.id]; + const cellActions = formattedColumn.filterable + ? [ + ({ rowIndex, columnId, Component, closePopover }: EuiDataGridColumnCellActionProps) => { + const rowValue = rows[rowIndex][columnId]; + const contentsIsDefined = rowValue !== null && rowValue !== undefined; + const cellContent = formattedColumn.formatter.convert(rowValue); - const filterForText = i18n.translate( - 'visTypeTable.tableCellFilter.filterForValueText', - { - defaultMessage: 'Filter for value', - } - ); - const filterForAriaLabel = i18n.translate( - 'visTypeTable.tableCellFilter.filterForValueAriaLabel', - { - defaultMessage: 'Filter for value: {cellContent}', - values: { - cellContent, - }, - } - ); + const filterForText = i18n.translate( + 'visTypeTable.tableCellFilter.filterForValueText', + { + defaultMessage: 'Filter for value', + } + ); + const filterForAriaLabel = i18n.translate( + 'visTypeTable.tableCellFilter.filterForValueAriaLabel', + { + defaultMessage: 'Filter for value: {cellContent}', + values: { + cellContent, + }, + } + ); - return ( - contentsIsDefined && ( - { - onFilterClick({ row: rowIndex, column: colIndex, value: rowValue }, false); - closePopover(); - }} - iconType="plusInCircle" - > - {filterForText} - - ) - ); - }, - ({ rowIndex, columnId, Component, closePopover }: EuiDataGridColumnCellActionProps) => { - const rowValue = rows[rowIndex][columnId]; - const contentsIsDefined = rowValue !== null && rowValue !== undefined; - const cellContent = formattedColumn.formatter.convert(rowValue); + return ( + contentsIsDefined && ( + { + onFilterClick({ row: rowIndex, column: colIndex, value: rowValue }, false); + closePopover(); + }} + iconType="plusInCircle" + > + {filterForText} + + ) + ); + }, + ({ rowIndex, columnId, Component, closePopover }: EuiDataGridColumnCellActionProps) => { + const rowValue = rows[rowIndex][columnId]; + const contentsIsDefined = rowValue !== null && rowValue !== undefined; + const cellContent = formattedColumn.formatter.convert(rowValue); - const filterOutText = i18n.translate( - 'visTypeTable.tableCellFilter.filterOutValueText', - { - defaultMessage: 'Filter out value', - } - ); - const filterOutAriaLabel = i18n.translate( - 'visTypeTable.tableCellFilter.filterOutValueAriaLabel', - { - defaultMessage: 'Filter out value: {cellContent}', - values: { - cellContent, - }, - } - ); + const filterOutText = i18n.translate( + 'visTypeTable.tableCellFilter.filterOutValueText', + { + defaultMessage: 'Filter out value', + } + ); + const filterOutAriaLabel = i18n.translate( + 'visTypeTable.tableCellFilter.filterOutValueAriaLabel', + { + defaultMessage: 'Filter out value: {cellContent}', + values: { + cellContent, + }, + } + ); - return ( - contentsIsDefined && ( - { - onFilterClick({ row: rowIndex, column: colIndex, value: rowValue }, true); - closePopover(); - }} - iconType="minusInCircle" - > - {filterOutText} - - ) - ); - }, - ] - : undefined; - - const initialWidth = columnsWidth.find((c) => c.colIndex === colIndex); - const column: EuiDataGridColumn = { - id: col.id, - display: col.name, - displayAsText: col.name, - actions: { - showHide: false, - showMoveLeft: false, - showMoveRight: false, - showSortAsc: { - label: i18n.translate('visTypeTable.sort.ascLabel', { - defaultMessage: 'Sort asc', - }), - }, - showSortDesc: { - label: i18n.translate('visTypeTable.sort.descLabel', { - defaultMessage: 'Sort desc', - }), + return ( + contentsIsDefined && ( + { + onFilterClick({ row: rowIndex, column: colIndex, value: rowValue }, true); + closePopover(); + }} + iconType="minusInCircle" + > + {filterOutText} + + ) + ); }, - }, - cellActions, - }; + ] + : undefined; - if (initialWidth) { - column.initialWidth = initialWidth.width; - } + const initialWidth = columnsWidth.find((c) => c.colIndex === colIndex); + const column: EuiDataGridColumn = { + id: col.id, + display: col.name, + displayAsText: col.name, + actions: { + showHide: false, + showMoveLeft: false, + showMoveRight: false, + showSortAsc: { + label: i18n.translate('visTypeTable.sort.ascLabel', { + defaultMessage: 'Sort asc', + }), + }, + showSortDesc: { + label: i18n.translate('visTypeTable.sort.descLabel', { + defaultMessage: 'Sort desc', + }), + }, + }, + cellActions, + }; - return column; + if (initialWidth) { + column.initialWidth = initialWidth.width; } - ); + + return column; + }); }; diff --git a/src/plugins/vis_types/table/public/components/table_visualization.test.tsx b/src/plugins/vis_types/table/public/components/table_visualization.test.tsx index 0de7e8c15105a..a8c0ae2507373 100644 --- a/src/plugins/vis_types/table/public/components/table_visualization.test.tsx +++ b/src/plugins/vis_types/table/public/components/table_visualization.test.tsx @@ -20,11 +20,11 @@ import { useUiState } from '../utils'; describe('TableVisualizationComponent', () => { const coreStartMock = coreMock.createStart(); - const handlers = ({ + const handlers = { done: jest.fn(), uiState: 'uiState', event: 'event', - } as unknown) as IInterpreterRenderHandlers; + } as unknown as IInterpreterRenderHandlers; const visData: TableVisData = { table: { columns: [], @@ -33,7 +33,7 @@ describe('TableVisualizationComponent', () => { }, tables: [], }; - const visConfig = ({} as unknown) as TableVisConfig; + const visConfig = {} as unknown as TableVisConfig; it('should render the basic table', () => { const comp = shallow( diff --git a/src/plugins/vis_types/table/public/plugin.ts b/src/plugins/vis_types/table/public/plugin.ts index fa02550f5048d..e36b4a14c3a57 100644 --- a/src/plugins/vis_types/table/public/plugin.ts +++ b/src/plugins/vis_types/table/public/plugin.ts @@ -29,7 +29,8 @@ export interface TablePluginStartDependencies { /** @internal */ export class TableVisPlugin - implements Plugin { + implements Plugin +{ public setup(core: CoreSetup, deps: TablePluginSetupDependencies) { registerTableVis(core, deps); } diff --git a/src/plugins/vis_types/table/public/services.ts b/src/plugins/vis_types/table/public/services.ts index d4d83c9e92c67..e1e6daf3615ef 100644 --- a/src/plugins/vis_types/table/public/services.ts +++ b/src/plugins/vis_types/table/public/services.ts @@ -9,6 +9,5 @@ import { createGetterSetter } from '../../../kibana_utils/public'; import { DataPublicPluginStart } from '../../../data/public'; -export const [getFormatService, setFormatService] = createGetterSetter< - DataPublicPluginStart['fieldFormats'] ->('table data.fieldFormats'); +export const [getFormatService, setFormatService] = + createGetterSetter('table data.fieldFormats'); diff --git a/src/plugins/vis_types/table/server/usage_collector/get_stats.test.ts b/src/plugins/vis_types/table/server/usage_collector/get_stats.test.ts index 4c91def40300e..85912aa4d5bdf 100644 --- a/src/plugins/vis_types/table/server/usage_collector/get_stats.test.ts +++ b/src/plugins/vis_types/table/server/usage_collector/get_stats.test.ts @@ -41,14 +41,14 @@ const mockVisualizations = { }; describe('vis_type_table getStats', () => { - const mockSoClient = ({ + const mockSoClient = { createPointInTimeFinder: jest.fn().mockResolvedValue({ close: jest.fn(), find: function* asyncGenerator() { yield mockVisualizations; }, }), - } as unknown) as SavedObjectsClientContract; + } as unknown as SavedObjectsClientContract; test('Returns stats from saved objects for table vis only', async () => { const result = await getStats(mockSoClient); diff --git a/src/plugins/vis_types/tagcloud/public/components/get_tag_cloud_options.tsx b/src/plugins/vis_types/tagcloud/public/components/get_tag_cloud_options.tsx index 82663bbf7070c..bb5af48bf0075 100644 --- a/src/plugins/vis_types/tagcloud/public/components/get_tag_cloud_options.tsx +++ b/src/plugins/vis_types/tagcloud/public/components/get_tag_cloud_options.tsx @@ -12,6 +12,7 @@ import { TagCloudVisParams, TagCloudTypeProps } from '../types'; const TagCloudOptionsLazy = lazy(() => import('./tag_cloud_options')); -export const getTagCloudOptions = ({ palettes }: TagCloudTypeProps) => ( - props: VisEditorOptionsProps -) => ; +export const getTagCloudOptions = + ({ palettes }: TagCloudTypeProps) => + (props: VisEditorOptionsProps) => + ; diff --git a/src/plugins/vis_types/tagcloud/public/to_ast.test.ts b/src/plugins/vis_types/tagcloud/public/to_ast.test.ts index 6de1d4fb3e75d..789acda46ec5e 100644 --- a/src/plugins/vis_types/tagcloud/public/to_ast.test.ts +++ b/src/plugins/vis_types/tagcloud/public/to_ast.test.ts @@ -38,7 +38,7 @@ describe('tagcloud vis toExpressionAst function', () => { let vis: Vis; beforeEach(() => { - vis = ({ + vis = { isHierarchical: () => false, type: {}, params: { @@ -51,7 +51,7 @@ describe('tagcloud vis toExpressionAst function', () => { aggs: [], }, }, - } as unknown) as Vis; + } as unknown as Vis; }); it('should match snapshot without params', () => { diff --git a/src/plugins/vis_types/timelion/public/components/timelion_vis_component.tsx b/src/plugins/vis_types/timelion/public/components/timelion_vis_component.tsx index 9a15159b33a1d..d7b7bb14723d7 100644 --- a/src/plugins/vis_types/timelion/public/components/timelion_vis_component.tsx +++ b/src/plugins/vis_types/timelion/public/components/timelion_vis_component.tsx @@ -132,9 +132,10 @@ const TimelionVisComponent = ({ [renderComplete] ); - const title: string = useMemo(() => last(compact(map(seriesList.list, '_title'))) || '', [ - seriesList.list, - ]); + const title: string = useMemo( + () => last(compact(map(seriesList.list, '_title'))) || '', + [seriesList.list] + ); const tickFormat = useMemo( () => createTickFormat(interval, kibana.services.timefilter, kibana.services.uiSettings), @@ -153,8 +154,11 @@ const TimelionVisComponent = ({ chart.forEach((series) => { if (series._global?.legend) { - const { show = true, position, noColumns = legendPosition.floatingColumns } = - series._global?.legend ?? {}; + const { + show = true, + position, + noColumns = legendPosition.floatingColumns, + } = series._global?.legend ?? {}; if (validateLegendPositionValue(position)) { const [vAlign, hAlign] = position.split(''); diff --git a/src/plugins/vis_types/timelion/public/helpers/panel_utils.ts b/src/plugins/vis_types/timelion/public/helpers/panel_utils.ts index 1ee834b7d30ed..3c76b95bd05ca 100644 --- a/src/plugins/vis_types/timelion/public/helpers/panel_utils.ts +++ b/src/plugins/vis_types/timelion/public/helpers/panel_utils.ts @@ -66,11 +66,11 @@ export const createTickFormat = ( export const MAIN_GROUP_ID = 1; export const withStaticPadding = (domain: AxisSpec['domain']): AxisSpec['domain'] => - (({ + ({ ...domain, padding: 50, paddingUnit: 'pixel', - } as unknown) as AxisSpec['domain']); + } as unknown as AxisSpec['domain']); const adaptYaxisParams = (yaxis: IAxis) => { const y = { ...yaxis }; diff --git a/src/plugins/vis_types/timelion/public/helpers/plugin_services.ts b/src/plugins/vis_types/timelion/public/helpers/plugin_services.ts index 0e9014437b325..c88097efa9bf1 100644 --- a/src/plugins/vis_types/timelion/public/helpers/plugin_services.ts +++ b/src/plugins/vis_types/timelion/public/helpers/plugin_services.ts @@ -10,9 +10,8 @@ import type { IndexPatternsContract, ISearchStart } from 'src/plugins/data/publi import type { ChartsPluginStart } from 'src/plugins/charts/public'; import { createGetterSetter } from '../../../../kibana_utils/public'; -export const [getIndexPatterns, setIndexPatterns] = createGetterSetter( - 'IndexPatterns' -); +export const [getIndexPatterns, setIndexPatterns] = + createGetterSetter('IndexPatterns'); export const [getDataSearch, setDataSearch] = createGetterSetter('Search'); diff --git a/src/plugins/vis_types/timelion/public/legacy/timelion_vis_component.tsx b/src/plugins/vis_types/timelion/public/legacy/timelion_vis_component.tsx index 1fdb1b37f1c8b..136544ac068a3 100644 --- a/src/plugins/vis_types/timelion/public/legacy/timelion_vis_component.tsx +++ b/src/plugins/vis_types/timelion/public/legacy/timelion_vis_component.tsx @@ -300,9 +300,9 @@ function TimelionVisComponent({ legendValueNumbers.eq(i).empty(); } else { let label = y.toFixed(precision); - const formatter = ((series.yaxis as unknown) as LegacyAxis).tickFormatter; + const formatter = (series.yaxis as unknown as LegacyAxis).tickFormatter; if (formatter) { - label = formatter(Number(label), (series.yaxis as unknown) as LegacyAxis); + label = formatter(Number(label), series.yaxis as unknown as LegacyAxis); } legendValueNumbers.eq(i).text(`(${label})`); } @@ -401,9 +401,10 @@ function TimelionVisComponent({ } }, [chartElem, plotHoverHandler]); - const title: string = useMemo(() => last(compact(map(seriesList.list, '_title'))) || '', [ - seriesList.list, - ]); + const title: string = useMemo( + () => last(compact(map(seriesList.list, '_title'))) || '', + [seriesList.list] + ); return (
diff --git a/src/plugins/vis_types/timelion/public/plugin.ts b/src/plugins/vis_types/timelion/public/plugin.ts index acc10f9914695..d37e15a9938b8 100644 --- a/src/plugins/vis_types/timelion/public/plugin.ts +++ b/src/plugins/vis_types/timelion/public/plugin.ts @@ -66,7 +66,8 @@ export class TimelionVisPlugin VisTypeTimelionPluginStart, TimelionVisSetupDependencies, TimelionVisStartDependencies - > { + > +{ constructor(public initializerContext: PluginInitializerContext) {} public setup( diff --git a/src/plugins/vis_types/timelion/server/series_functions/movingaverage.test.js b/src/plugins/vis_types/timelion/server/series_functions/movingaverage.test.js index b2d98df49f720..6a5b62497ec68 100644 --- a/src/plugins/vis_types/timelion/server/series_functions/movingaverage.test.js +++ b/src/plugins/vis_types/timelion/server/series_functions/movingaverage.test.js @@ -18,13 +18,11 @@ import invoke from './helpers/invoke_series_fn.js'; function getFivePointSeries() { return getSeriesList([ - getSeries('Five', [].concat(buckets).push(moment('1984-01-01T00:00:00.000Z')), [ - 10, - 20, - 30, - 40, - 50, - ]), + getSeries( + 'Five', + [].concat(buckets).push(moment('1984-01-01T00:00:00.000Z')), + [10, 20, 30, 40, 50] + ), ]); } diff --git a/src/plugins/vis_types/timelion/server/series_functions/movingstd.test.js b/src/plugins/vis_types/timelion/server/series_functions/movingstd.test.js index 0a1178ece9ccf..3c91cc4ec05b9 100644 --- a/src/plugins/vis_types/timelion/server/series_functions/movingstd.test.js +++ b/src/plugins/vis_types/timelion/server/series_functions/movingstd.test.js @@ -17,32 +17,9 @@ import getSeriesList from './helpers/get_series_list'; describe('movingstd.js', () => { it('computes the moving standard deviation of a list', async () => { const points = [ - 108.48, - 111.56, - 112.13, - 113.75, - 114.25, - 110.79, - 111.21, - 116.82, - 117.16, - 120.38, - 116.96, - 119.56, - 118.97, - 117.54, - 114.42, - 111.01, - 114.2, - 116.43, - 117.74, - 119.9, - 124.65, - 124.98, - 124.7, - 123.6, - 124.5, - 126.85, + 108.48, 111.56, 112.13, 113.75, 114.25, 110.79, 111.21, 116.82, 117.16, 120.38, 116.96, + 119.56, 118.97, 117.54, 114.42, 111.01, 114.2, 116.43, 117.74, 119.9, 124.65, 124.98, 124.7, + 123.6, 124.5, 126.85, ]; const buckets = []; buckets[0] = moment('2018-01-01T00:00:00.000Z'); @@ -63,27 +40,8 @@ describe('movingstd.js', () => { const trimmedResultPoints = resultPoints.slice(numWindows); const expectedPoints = [ - 2.28, - 1.46, - 1.53, - 2.46, - 3.0, - 4.14, - 3.31, - 1.67, - 1.5, - 1.41, - 2.01, - 3.56, - 3.12, - 2.5, - 2.56, - 3.41, - 3.97, - 3.92, - 3.35, - 2.12, - 0.52, + 2.28, 1.46, 1.53, 2.46, 3.0, 4.14, 3.31, 1.67, 1.5, 1.41, 2.01, 3.56, 3.12, 2.5, 2.56, 3.41, + 3.97, 3.92, 3.35, 2.12, 0.52, ]; expectedPoints.forEach((value, index) => { diff --git a/src/plugins/vis_types/timelion/server/series_functions/subtract.test.js b/src/plugins/vis_types/timelion/server/series_functions/subtract.test.js index f0b6547873760..a452365164126 100644 --- a/src/plugins/vis_types/timelion/server/series_functions/subtract.test.js +++ b/src/plugins/vis_types/timelion/server/series_functions/subtract.test.js @@ -32,10 +32,7 @@ describe('subtract.js', () => { const outputSeries = await invoke(fn, [seriesList]); expect(outputSeries.output.list.length).to.eql(1); expect(_.map(outputSeries.output.list[0].data, 1)).to.eql([ - -165.1415926535, - -136, - 19.561, - -2.3424234999999998, + -165.1415926535, -136, 19.561, -2.3424234999999998, ]); }); diff --git a/src/plugins/vis_types/vega/public/data_model/search_api.test.ts b/src/plugins/vis_types/vega/public/data_model/search_api.test.ts index 27dc1627ae229..9ecc160246e28 100644 --- a/src/plugins/vis_types/vega/public/data_model/search_api.test.ts +++ b/src/plugins/vis_types/vega/public/data_model/search_api.test.ts @@ -53,13 +53,13 @@ describe('extendSearchParamsWithRuntimeFields', () => { }); test('should use runtime mappings from spec if it is specified', async () => { - const requestParams = ({ + const requestParams = { body: { runtime_mappings: { test: {}, }, }, - } as unknown) as ReturnType; + } as unknown as ReturnType; const runtimeFields = { foo: {} }; mockComputedFields(dataStart, 'index', runtimeFields); diff --git a/src/plugins/vis_types/vega/public/lib/extract_index_pattern.test.ts b/src/plugins/vis_types/vega/public/lib/extract_index_pattern.test.ts index 39aadc009b93c..8d9ab0e10ebc9 100644 --- a/src/plugins/vis_types/vega/public/lib/extract_index_pattern.test.ts +++ b/src/plugins/vis_types/vega/public/lib/extract_index_pattern.test.ts @@ -12,7 +12,7 @@ import { setData } from '../services'; import type { VegaSpec } from '../data_model/types'; -const getMockedSpec = (mockedObj: any) => (mockedObj as unknown) as VegaSpec; +const getMockedSpec = (mockedObj: any) => mockedObj as unknown as VegaSpec; describe('extractIndexPatternsFromSpec', () => { const dataStart = dataPluginMock.createStartContract(); diff --git a/src/plugins/vis_types/vega/public/services.ts b/src/plugins/vis_types/vega/public/services.ts index 1cdb24ff7b02c..47cf0de3fdae7 100644 --- a/src/plugins/vis_types/vega/public/services.ts +++ b/src/plugins/vis_types/vega/public/services.ts @@ -14,20 +14,16 @@ import { MapServiceSettings } from './vega_view/vega_map_view/map_service_settin export const [getData, setData] = createGetterSetter('Data'); -export const [getNotifications, setNotifications] = createGetterSetter( - 'Notifications' -); +export const [getNotifications, setNotifications] = + createGetterSetter('Notifications'); export const [getUISettings, setUISettings] = createGetterSetter('UISettings'); -export const [getInjectedMetadata, setInjectedMetadata] = createGetterSetter< - CoreStart['injectedMetadata'] ->('InjectedMetadata'); +export const [getInjectedMetadata, setInjectedMetadata] = + createGetterSetter('InjectedMetadata'); -export const [ - getMapServiceSettings, - setMapServiceSettings, -] = createGetterSetter('MapServiceSettings'); +export const [getMapServiceSettings, setMapServiceSettings] = + createGetterSetter('MapServiceSettings'); export const [getInjectedVars, setInjectedVars] = createGetterSetter<{ enableExternalUrls: boolean; diff --git a/src/plugins/vis_types/vega/public/vega_inspector/components/inspector_data_grid.tsx b/src/plugins/vis_types/vega/public/vega_inspector/components/inspector_data_grid.tsx index 7d317c46ca806..97890b3373cf8 100644 --- a/src/plugins/vis_types/vega/public/vega_inspector/components/inspector_data_grid.tsx +++ b/src/plugins/vis_types/vega/public/vega_inspector/components/inspector_data_grid.tsx @@ -23,9 +23,10 @@ export const InspectorDataGrid = ({ columns, data, dataGridAriaLabel }: Inspecto [setPagination] ); - const onChangePage = useCallback((pageIndex) => setPagination((p) => ({ ...p, pageIndex })), [ - setPagination, - ]); + const onChangePage = useCallback( + (pageIndex) => setPagination((p) => ({ ...p, pageIndex })), + [setPagination] + ); // Column visibility const [visibleColumns, setVisibleColumns] = useState([]); diff --git a/src/plugins/vis_types/vega/public/vega_view/vega_map_view/layers/tms_raster_layer.test.ts b/src/plugins/vis_types/vega/public/vega_view/vega_map_view/layers/tms_raster_layer.test.ts index f8b064f002182..4a755dc2ad872 100644 --- a/src/plugins/vis_types/vega/public/vega_view/vega_map_view/layers/tms_raster_layer.test.ts +++ b/src/plugins/vis_types/vega/public/vega_view/vega_map_view/layers/tms_raster_layer.test.ts @@ -21,10 +21,10 @@ describe('vega_map_view/tms_raster_layer', () => { beforeEach(() => { id = 'foo_tms_layer_id'; - map = ({ + map = { addSource: jest.fn(), addLayer: jest.fn(), - } as unknown) as MapType; + } as unknown as MapType; context = { tiles: ['http://some.tile.com/map/{z}/{x}/{y}.jpg'], maxZoom: 10, diff --git a/src/plugins/vis_types/vega/public/vega_view/vega_map_view/layers/vega_layer.test.ts b/src/plugins/vis_types/vega/public/vega_view/vega_map_view/layers/vega_layer.test.ts index 53337388dc190..d4e761cdb4802 100644 --- a/src/plugins/vis_types/vega/public/vega_view/vega_map_view/layers/vega_layer.test.ts +++ b/src/plugins/vis_types/vega/public/vega_view/vega_map_view/layers/vega_layer.test.ts @@ -22,7 +22,7 @@ describe('vega_map_view/tms_raster_layer', () => { beforeEach(() => { id = 'foo_vega_layer_id'; - map = ({ + map = { getCanvasContainer: () => document.createElement('div'), getCanvas: () => ({ style: { @@ -31,11 +31,11 @@ describe('vega_map_view/tms_raster_layer', () => { }, }), addLayer: jest.fn(), - } as unknown) as MapType; + } as unknown as MapType; context = { - vegaView: ({ + vegaView: { initialize: jest.fn(), - } as unknown) as View, + } as unknown as View, vegaControls: 'element', updateVegaView: jest.fn(), }; diff --git a/src/plugins/vis_types/vega/public/vega_view/vega_map_view/map_service_settings.test.ts b/src/plugins/vis_types/vega/public/vega_view/vega_map_view/map_service_settings.test.ts index 95fee2ea3820d..acaccb6dbcb1a 100644 --- a/src/plugins/vis_types/vega/public/vega_view/vega_map_view/map_service_settings.test.ts +++ b/src/plugins/vis_types/vega/public/vega_view/vega_map_view/map_service_settings.test.ts @@ -88,12 +88,12 @@ describe('vega_map_view/map_service_settings', () => { }); test('getAttributionsForTmsService method should return attributes in a correct form', () => { - const tmsService = ({ + const tmsService = { getAttributions: jest.fn(() => [ { url: 'https://fist_attr.com', label: 'fist_attr' }, { url: 'https://second_attr.com', label: 'second_attr' }, ]), - } as unknown) as TMSService; + } as unknown as TMSService; expect(getAttributionsForTmsService(tmsService)).toMatchInlineSnapshot(` Array [ diff --git a/src/plugins/vis_types/vega/public/vega_view/vega_map_view/utils/vsi_helper.test.ts b/src/plugins/vis_types/vega/public/vega_view/vega_map_view/utils/vsi_helper.test.ts index dcec9e66dc466..987c415637109 100644 --- a/src/plugins/vis_types/vega/public/vega_view/vega_map_view/utils/vsi_helper.test.ts +++ b/src/plugins/vis_types/vega/public/vega_view/vega_map_view/utils/vsi_helper.test.ts @@ -12,12 +12,12 @@ import { VegaSpec } from '../../../data_model/types'; describe('vega_map_view/vsi_helper', () => { describe('injectMapPropsIntoSpec', () => { test('should inject map properties into vega spec', () => { - const spec = ({ + const spec = { $schema: 'https://vega.github.io/schema/vega/v5.json', config: { kibana: { type: 'map', latitude: 25, longitude: -70, zoom: 3 }, }, - } as unknown) as VegaSpec; + } as unknown as VegaSpec; expect(injectMapPropsIntoSpec(spec)).toMatchInlineSnapshot(` Object { diff --git a/src/plugins/vis_types/vega/public/vega_view/vega_map_view/view.test.ts b/src/plugins/vis_types/vega/public/vega_view/vega_map_view/view.test.ts index e4bf4977094fd..d3d0b6cb0411e 100644 --- a/src/plugins/vis_types/vega/public/vega_view/vega_map_view/view.test.ts +++ b/src/plugins/vis_types/vega/public/vega_view/vega_map_view/view.test.ts @@ -78,7 +78,7 @@ describe('vega_map_view/view', () => { setNotifications(coreStart.notifications); setUISettings(coreStart.uiSettings); - const getTmsService = jest.fn().mockReturnValue(({ + const getTmsService = jest.fn().mockReturnValue({ getVectorStyleSheet: () => ({ version: 8, sources: {}, @@ -88,7 +88,7 @@ describe('vega_map_view/view', () => { getMaxZoom: async () => 20, getMinZoom: async () => 0, getAttributions: () => [{ url: 'tms_attributions' }], - } as unknown) as TMSService); + } as unknown as TMSService); const config = { tilemap: { url: 'test', @@ -101,16 +101,16 @@ describe('vega_map_view/view', () => { } as MapsEmsConfig; function setMapService(defaultTmsLayer: string) { - setMapServiceSettings(({ + setMapServiceSettings({ getTmsService, defaultTmsLayer: () => defaultTmsLayer, config, - } as unknown) as MapServiceSettings); + } as unknown as MapServiceSettings); } async function createVegaMapView() { await vegaParser.parseAsync(); - return new VegaMapView(({ + return new VegaMapView({ vegaParser, filterManager: dataPluginStart.query.filterManager, timefilter: dataPluginStart.query.timefilter.timefilter, @@ -121,7 +121,7 @@ describe('vega_map_view/view', () => { restore: jest.fn(), clear: jest.fn(), }, - } as unknown) as VegaViewParams); + } as unknown as VegaViewParams); } beforeEach(() => { diff --git a/src/plugins/vis_types/vega/server/usage_collector/get_usage_collector.test.ts b/src/plugins/vis_types/vega/server/usage_collector/get_usage_collector.test.ts index aa1b8e447bbca..627f8c2eea83c 100644 --- a/src/plugins/vis_types/vega/server/usage_collector/get_usage_collector.test.ts +++ b/src/plugins/vis_types/vega/server/usage_collector/get_usage_collector.test.ts @@ -40,8 +40,7 @@ const mockedSavedObjects = [ visState: JSON.stringify({ type: 'vega', params: { - spec: - '{"$schema": "https://vega.github.io/schema/vega/v3.json" \n "config": { "kibana" : { "type": "map" }} }', + spec: '{"$schema": "https://vega.github.io/schema/vega/v3.json" \n "config": { "kibana" : { "type": "map" }} }', }, }), }, @@ -51,21 +50,21 @@ const mockedSavedObjects = [ const getMockCollectorFetchContext = (savedObjects?: unknown[]) => { const fetchParamsMock = createCollectorFetchContextMock(); - fetchParamsMock.soClient = ({ + fetchParamsMock.soClient = { createPointInTimeFinder: jest.fn().mockResolvedValue({ close: jest.fn(), find: function* asyncGenerator() { yield { saved_objects: savedObjects }; }, }), - } as unknown) as SavedObjectsClientContract; + } as unknown as SavedObjectsClientContract; return fetchParamsMock; }; describe('Vega visualization usage collector', () => { const mockDeps = { - home: ({ + home: { sampleData: { getSampleDatasets: jest.fn().mockReturnValue([ { @@ -86,7 +85,7 @@ describe('Vega visualization usage collector', () => { }, ]), }, - } as unknown) as HomeServerPluginSetup, + } as unknown as HomeServerPluginSetup, }; test('Returns undefined when no results found (undefined)', async () => { diff --git a/src/plugins/vis_types/vega/server/usage_collector/register_vega_collector.test.ts b/src/plugins/vis_types/vega/server/usage_collector/register_vega_collector.test.ts index 137dd2f17375c..0597f3b856f04 100644 --- a/src/plugins/vis_types/vega/server/usage_collector/register_vega_collector.test.ts +++ b/src/plugins/vis_types/vega/server/usage_collector/register_vega_collector.test.ts @@ -17,7 +17,7 @@ import type { HomeServerPluginSetup } from '../../../../home/server'; import type { ConfigObservable } from '../types'; describe('registerVegaUsageCollector', () => { - const mockDeps = { home: ({} as unknown) as HomeServerPluginSetup }; + const mockDeps = { home: {} as unknown as HomeServerPluginSetup }; const mockConfig = {} as ConfigObservable; test('makes a usage collector and registers it`', () => { diff --git a/src/plugins/vis_types/vislib/public/fixtures/mock_data/date_histogram/_columns.js b/src/plugins/vis_types/vislib/public/fixtures/mock_data/date_histogram/_columns.js index b3eff8b2f82ff..bc42445ddb180 100644 --- a/src/plugins/vis_types/vislib/public/fixtures/mock_data/date_histogram/_columns.js +++ b/src/plugins/vis_types/vislib/public/fixtures/mock_data/date_histogram/_columns.js @@ -272,36 +272,11 @@ export default { }, ], xAxisOrderedValues: [ - 1415826600000, - 1415826630000, - 1415826660000, - 1415826690000, - 1415826720000, - 1415826750000, - 1415826780000, - 1415826810000, - 1415826840000, - 1415826870000, - 1415826900000, - 1415826930000, - 1415826960000, - 1415826990000, - 1415827020000, - 1415827050000, - 1415827080000, - 1415827110000, - 1415827140000, - 1415827170000, - 1415827200000, - 1415827230000, - 1415827260000, - 1415827290000, - 1415827320000, - 1415827350000, - 1415827380000, - 1415827410000, - 1415827440000, - 1415827470000, + 1415826600000, 1415826630000, 1415826660000, 1415826690000, 1415826720000, 1415826750000, + 1415826780000, 1415826810000, 1415826840000, 1415826870000, 1415826900000, 1415826930000, + 1415826960000, 1415826990000, 1415827020000, 1415827050000, 1415827080000, 1415827110000, + 1415827140000, 1415827170000, 1415827200000, 1415827230000, 1415827260000, 1415827290000, + 1415827320000, 1415827350000, 1415827380000, 1415827410000, 1415827440000, 1415827470000, 1415827500000, ], hits: 225, diff --git a/src/plugins/vis_types/vislib/public/fixtures/mock_data/date_histogram/_rows.js b/src/plugins/vis_types/vislib/public/fixtures/mock_data/date_histogram/_rows.js index 9ee922ed3d2e1..87eecea5f2ed2 100644 --- a/src/plugins/vis_types/vislib/public/fixtures/mock_data/date_histogram/_rows.js +++ b/src/plugins/vis_types/vislib/public/fixtures/mock_data/date_histogram/_rows.js @@ -1650,36 +1650,11 @@ export default { }, ], xAxisOrderedValues: [ - 1415826240000, - 1415826270000, - 1415826300000, - 1415826330000, - 1415826360000, - 1415826390000, - 1415826420000, - 1415826450000, - 1415826480000, - 1415826510000, - 1415826540000, - 1415826570000, - 1415826600000, - 1415826630000, - 1415826660000, - 1415826690000, - 1415826720000, - 1415826750000, - 1415826780000, - 1415826810000, - 1415826840000, - 1415826870000, - 1415826900000, - 1415826930000, - 1415826960000, - 1415826990000, - 1415827020000, - 1415827050000, - 1415827080000, - 1415827110000, + 1415826240000, 1415826270000, 1415826300000, 1415826330000, 1415826360000, 1415826390000, + 1415826420000, 1415826450000, 1415826480000, 1415826510000, 1415826540000, 1415826570000, + 1415826600000, 1415826630000, 1415826660000, 1415826690000, 1415826720000, 1415826750000, + 1415826780000, 1415826810000, 1415826840000, 1415826870000, 1415826900000, 1415826930000, + 1415826960000, 1415826990000, 1415827020000, 1415827050000, 1415827080000, 1415827110000, 1415827140000, ], hits: 236, diff --git a/src/plugins/vis_types/vislib/public/fixtures/mock_data/date_histogram/_rows_series_with_holes.js b/src/plugins/vis_types/vislib/public/fixtures/mock_data/date_histogram/_rows_series_with_holes.js index 3b67e12827cf8..a752a76be5866 100644 --- a/src/plugins/vis_types/vislib/public/fixtures/mock_data/date_histogram/_rows_series_with_holes.js +++ b/src/plugins/vis_types/vislib/public/fixtures/mock_data/date_histogram/_rows_series_with_holes.js @@ -109,23 +109,8 @@ export const rowsSeriesWithHoles = { }, ], xAxisOrderedValues: [ - 1411761450000, - 1411761510000, - 1411761540000, - 1411761840000, - 1411761870000, - 1411761900000, - 1411761930000, - 1411761960000, - 1411761990000, - 1411762020000, - 1411762050000, - 1411762080000, - 1411762110000, - 1411762140000, - 1411762170000, - 1411762200000, - 1411762320000, - 1411762350000, + 1411761450000, 1411761510000, 1411761540000, 1411761840000, 1411761870000, 1411761900000, + 1411761930000, 1411761960000, 1411761990000, 1411762020000, 1411762050000, 1411762080000, + 1411762110000, 1411762140000, 1411762170000, 1411762200000, 1411762320000, 1411762350000, ], }; diff --git a/src/plugins/vis_types/vislib/public/fixtures/mock_data/date_histogram/_series.js b/src/plugins/vis_types/vislib/public/fixtures/mock_data/date_histogram/_series.js index 43962b4cc8854..58970e55e2b89 100644 --- a/src/plugins/vis_types/vislib/public/fixtures/mock_data/date_histogram/_series.js +++ b/src/plugins/vis_types/vislib/public/fixtures/mock_data/date_histogram/_series.js @@ -151,36 +151,11 @@ export default { ], hits: 533, xAxisOrderedValues: [ - 1411761450000, - 1411761480000, - 1411761510000, - 1411761540000, - 1411761570000, - 1411761600000, - 1411761630000, - 1411761660000, - 1411761690000, - 1411761720000, - 1411761750000, - 1411761780000, - 1411761810000, - 1411761840000, - 1411761870000, - 1411761900000, - 1411761930000, - 1411761960000, - 1411761990000, - 1411762020000, - 1411762050000, - 1411762080000, - 1411762110000, - 1411762140000, - 1411762170000, - 1411762200000, - 1411762230000, - 1411762260000, - 1411762290000, - 1411762320000, + 1411761450000, 1411761480000, 1411761510000, 1411761540000, 1411761570000, 1411761600000, + 1411761630000, 1411761660000, 1411761690000, 1411761720000, 1411761750000, 1411761780000, + 1411761810000, 1411761840000, 1411761870000, 1411761900000, 1411761930000, 1411761960000, + 1411761990000, 1411762020000, 1411762050000, 1411762080000, 1411762110000, 1411762140000, + 1411762170000, 1411762200000, 1411762230000, 1411762260000, 1411762290000, 1411762320000, 1411762350000, ], xAxisFormatter: function (thing) { diff --git a/src/plugins/vis_types/vislib/public/fixtures/mock_data/date_histogram/_series_monthly_interval.js b/src/plugins/vis_types/vislib/public/fixtures/mock_data/date_histogram/_series_monthly_interval.js index 6b154158fdbe0..f29bab822286f 100644 --- a/src/plugins/vis_types/vislib/public/fixtures/mock_data/date_histogram/_series_monthly_interval.js +++ b/src/plugins/vis_types/vislib/public/fixtures/mock_data/date_histogram/_series_monthly_interval.js @@ -75,18 +75,8 @@ export const seriesMonthlyInterval = { ], hits: 533, xAxisOrderedValues: [ - 1451631600000, - 1454310000000, - 1456815600000, - 1459490400000, - 1462082400000, - 1464760800000, - 1467352800000, - 1470031200000, - 1472709600000, - 1475301600000, - 1477980000000, - 1480575600000, + 1451631600000, 1454310000000, 1456815600000, 1459490400000, 1462082400000, 1464760800000, + 1467352800000, 1470031200000, 1472709600000, 1475301600000, 1477980000000, 1480575600000, ], xAxisFormatter: function (thing) { return moment(thing); diff --git a/src/plugins/vis_types/vislib/public/fixtures/mock_data/date_histogram/_series_neg.js b/src/plugins/vis_types/vislib/public/fixtures/mock_data/date_histogram/_series_neg.js index 3bc3445482401..79ec01b0253f8 100644 --- a/src/plugins/vis_types/vislib/public/fixtures/mock_data/date_histogram/_series_neg.js +++ b/src/plugins/vis_types/vislib/public/fixtures/mock_data/date_histogram/_series_neg.js @@ -151,36 +151,11 @@ export default { ], hits: 533, xAxisOrderedValues: [ - 1411761450000, - 1411761480000, - 1411761510000, - 1411761540000, - 1411761570000, - 1411761600000, - 1411761630000, - 1411761660000, - 1411761690000, - 1411761720000, - 1411761750000, - 1411761780000, - 1411761810000, - 1411761840000, - 1411761870000, - 1411761900000, - 1411761930000, - 1411761960000, - 1411761990000, - 1411762020000, - 1411762050000, - 1411762080000, - 1411762110000, - 1411762140000, - 1411762170000, - 1411762200000, - 1411762230000, - 1411762260000, - 1411762290000, - 1411762320000, + 1411761450000, 1411761480000, 1411761510000, 1411761540000, 1411761570000, 1411761600000, + 1411761630000, 1411761660000, 1411761690000, 1411761720000, 1411761750000, 1411761780000, + 1411761810000, 1411761840000, 1411761870000, 1411761900000, 1411761930000, 1411761960000, + 1411761990000, 1411762020000, 1411762050000, 1411762080000, 1411762110000, 1411762140000, + 1411762170000, 1411762200000, 1411762230000, 1411762260000, 1411762290000, 1411762320000, 1411762350000, ], xAxisFormatter: function (thing) { diff --git a/src/plugins/vis_types/vislib/public/fixtures/mock_data/date_histogram/_series_pos_neg.js b/src/plugins/vis_types/vislib/public/fixtures/mock_data/date_histogram/_series_pos_neg.js index 680d4ee011331..d99d25d67ff76 100644 --- a/src/plugins/vis_types/vislib/public/fixtures/mock_data/date_histogram/_series_pos_neg.js +++ b/src/plugins/vis_types/vislib/public/fixtures/mock_data/date_histogram/_series_pos_neg.js @@ -151,36 +151,11 @@ export default { ], hits: 533, xAxisOrderedValues: [ - 1411761450000, - 1411761480000, - 1411761510000, - 1411761540000, - 1411761570000, - 1411761600000, - 1411761630000, - 1411761660000, - 1411761690000, - 1411761720000, - 1411761750000, - 1411761780000, - 1411761810000, - 1411761840000, - 1411761870000, - 1411761900000, - 1411761930000, - 1411761960000, - 1411761990000, - 1411762020000, - 1411762050000, - 1411762080000, - 1411762110000, - 1411762140000, - 1411762170000, - 1411762200000, - 1411762230000, - 1411762260000, - 1411762290000, - 1411762320000, + 1411761450000, 1411761480000, 1411761510000, 1411761540000, 1411761570000, 1411761600000, + 1411761630000, 1411761660000, 1411761690000, 1411761720000, 1411761750000, 1411761780000, + 1411761810000, 1411761840000, 1411761870000, 1411761900000, 1411761930000, 1411761960000, + 1411761990000, 1411762020000, 1411762050000, 1411762080000, 1411762110000, 1411762140000, + 1411762170000, 1411762200000, 1411762230000, 1411762260000, 1411762290000, 1411762320000, 1411762350000, ], xAxisFormatter: function (thing) { diff --git a/src/plugins/vis_types/vislib/public/fixtures/mock_data/date_histogram/_stacked_series.js b/src/plugins/vis_types/vislib/public/fixtures/mock_data/date_histogram/_stacked_series.js index 9d7873fd9011c..7605f8cdd69b4 100644 --- a/src/plugins/vis_types/vislib/public/fixtures/mock_data/date_histogram/_stacked_series.js +++ b/src/plugins/vis_types/vislib/public/fixtures/mock_data/date_histogram/_stacked_series.js @@ -1483,78 +1483,18 @@ export default { ], hits: 108970, xAxisOrderedValues: [ - 1413543600000, - 1413544200000, - 1413544800000, - 1413545400000, - 1413546000000, - 1413546600000, - 1413547200000, - 1413547800000, - 1413548400000, - 1413549000000, - 1413549600000, - 1413550200000, - 1413550800000, - 1413551400000, - 1413552000000, - 1413552600000, - 1413553200000, - 1413553800000, - 1413554400000, - 1413555000000, - 1413555600000, - 1413556200000, - 1413556800000, - 1413557400000, - 1413558000000, - 1413558600000, - 1413559200000, - 1413559800000, - 1413560400000, - 1413561000000, - 1413561600000, - 1413562200000, - 1413562800000, - 1413563400000, - 1413564000000, - 1413564600000, - 1413565200000, - 1413565800000, - 1413566400000, - 1413567000000, - 1413567600000, - 1413568200000, - 1413568800000, - 1413569400000, - 1413570000000, - 1413570600000, - 1413571200000, - 1413571800000, - 1413572400000, - 1413573600000, - 1413574200000, - 1413574800000, - 1413575400000, - 1413576000000, - 1413576600000, - 1413577200000, - 1413577800000, - 1413578400000, - 1413579000000, - 1413579600000, - 1413580200000, - 1413580800000, - 1413581400000, - 1413582000000, - 1413582600000, - 1413583200000, - 1413583800000, - 1413584400000, - 1413585000000, - 1413585600000, - 1413586200000, - 1413586800000, + 1413543600000, 1413544200000, 1413544800000, 1413545400000, 1413546000000, 1413546600000, + 1413547200000, 1413547800000, 1413548400000, 1413549000000, 1413549600000, 1413550200000, + 1413550800000, 1413551400000, 1413552000000, 1413552600000, 1413553200000, 1413553800000, + 1413554400000, 1413555000000, 1413555600000, 1413556200000, 1413556800000, 1413557400000, + 1413558000000, 1413558600000, 1413559200000, 1413559800000, 1413560400000, 1413561000000, + 1413561600000, 1413562200000, 1413562800000, 1413563400000, 1413564000000, 1413564600000, + 1413565200000, 1413565800000, 1413566400000, 1413567000000, 1413567600000, 1413568200000, + 1413568800000, 1413569400000, 1413570000000, 1413570600000, 1413571200000, 1413571800000, + 1413572400000, 1413573600000, 1413574200000, 1413574800000, 1413575400000, 1413576000000, + 1413576600000, 1413577200000, 1413577800000, 1413578400000, 1413579000000, 1413579600000, + 1413580200000, 1413580800000, 1413581400000, 1413582000000, 1413582600000, 1413583200000, + 1413583800000, 1413584400000, 1413585000000, 1413585600000, 1413586200000, 1413586800000, ], xAxisFormatter: function (thing) { return moment(thing); diff --git a/src/plugins/vis_types/vislib/public/fixtures/mock_data/histogram/_columns.js b/src/plugins/vis_types/vislib/public/fixtures/mock_data/histogram/_columns.js index 19e242a7a24e5..9181a064f955b 100644 --- a/src/plugins/vis_types/vislib/public/fixtures/mock_data/histogram/_columns.js +++ b/src/plugins/vis_types/vislib/public/fixtures/mock_data/histogram/_columns.js @@ -348,23 +348,9 @@ export default { }, ], xAxisOrderedValues: [ - 2147483600, - 3221225400, - 4294967200, - 5368709100, - 6442450900, - 7516192700, - 8589934500, - 10737418200, - 11811160000, - 12884901800, - 13958643700, - 15032385500, - 16106127300, - 18253611000, - 19327352800, - 20401094600, - 21474836400, + 2147483600, 3221225400, 4294967200, 5368709100, 6442450900, 7516192700, 8589934500, 10737418200, + 11811160000, 12884901800, 13958643700, 15032385500, 16106127300, 18253611000, 19327352800, + 20401094600, 21474836400, ], hits: 40, }; diff --git a/src/plugins/vis_types/vislib/public/fixtures/mock_data/histogram/_rows.js b/src/plugins/vis_types/vislib/public/fixtures/mock_data/histogram/_rows.js index a5cd5a5481d34..29fe11a311993 100644 --- a/src/plugins/vis_types/vislib/public/fixtures/mock_data/histogram/_rows.js +++ b/src/plugins/vis_types/vislib/public/fixtures/mock_data/histogram/_rows.js @@ -189,26 +189,9 @@ export default { }, ], xAxisOrderedValues: [ - 2147483600, - 3221225400, - 4294967200, - 5368709100, - 6442450900, - 7516192700, - 8589934500, - 9663676400, - 10737418200, - 11811160000, - 12884901800, - 13958643700, - 15032385500, - 16106127300, - 17179869100, - 18253611000, - 19327352800, - 20401094600, - 21474836400, - 32212254700, + 2147483600, 3221225400, 4294967200, 5368709100, 6442450900, 7516192700, 8589934500, 9663676400, + 10737418200, 11811160000, 12884901800, 13958643700, 15032385500, 16106127300, 17179869100, + 18253611000, 19327352800, 20401094600, 21474836400, 32212254700, ], hits: 51, }; diff --git a/src/plugins/vis_types/vislib/public/fixtures/mock_data/histogram/_series.js b/src/plugins/vis_types/vislib/public/fixtures/mock_data/histogram/_series.js index 8b732f359b844..8d4a8666753f5 100644 --- a/src/plugins/vis_types/vislib/public/fixtures/mock_data/histogram/_series.js +++ b/src/plugins/vis_types/vislib/public/fixtures/mock_data/histogram/_series.js @@ -96,24 +96,9 @@ export default { ], hits: 71, xAxisOrderedValues: [ - 3221225400, - 4294967200, - 5368709100, - 6442450900, - 7516192700, - 9663676400, - 10737418200, - 11811160000, - 12884901800, - 13958643700, - 15032385500, - 16106127300, - 17179869100, - 18253611000, - 19327352800, - 20401094600, - 21474836400, - 32212254700, + 3221225400, 4294967200, 5368709100, 6442450900, 7516192700, 9663676400, 10737418200, + 11811160000, 12884901800, 13958643700, 15032385500, 16106127300, 17179869100, 18253611000, + 19327352800, 20401094600, 21474836400, 32212254700, ], xAxisFormatter: function (val) { if (_.isObject(val)) { diff --git a/src/plugins/vis_types/vislib/public/fixtures/mock_data/histogram/_slices.js b/src/plugins/vis_types/vislib/public/fixtures/mock_data/histogram/_slices.js index b120bb6cf1cb6..bfe5a31a8aba2 100644 --- a/src/plugins/vis_types/vislib/public/fixtures/mock_data/histogram/_slices.js +++ b/src/plugins/vis_types/vislib/public/fixtures/mock_data/histogram/_slices.js @@ -288,27 +288,8 @@ export default { ], }, names: [ - 0, - 1000, - 2000, - 3000, - 4000, - 5000, - 6000, - 7000, - 8000, - 9000, - 10000, - 11000, - 12000, - 13000, - 14000, - 15000, - 16000, - 17000, - 18000, - 19000, - 20000, + 0, 1000, 2000, 3000, 4000, 5000, 6000, 7000, 8000, 9000, 10000, 11000, 12000, 13000, 14000, + 15000, 16000, 17000, 18000, 19000, 20000, ], hits: 3967374, tooltipFormatter: function (event) { diff --git a/src/plugins/vis_types/vislib/public/fixtures/mock_data/stacked/_stacked.js b/src/plugins/vis_types/vislib/public/fixtures/mock_data/stacked/_stacked.js index 3da5c1a5d6d73..3ba912657efa1 100644 --- a/src/plugins/vis_types/vislib/public/fixtures/mock_data/stacked/_stacked.js +++ b/src/plugins/vis_types/vislib/public/fixtures/mock_data/stacked/_stacked.js @@ -19,66 +19,16 @@ export default { }, yAxisLabel: 'Count of documents', xAxisOrderedValues: [ - 1416850320000, - 1416850350000, - 1416850380000, - 1416850410000, - 1416850440000, - 1416850470000, - 1416850500000, - 1416850530000, - 1416850560000, - 1416850590000, - 1416850620000, - 1416850650000, - 1416850680000, - 1416850710000, - 1416850740000, - 1416850770000, - 1416850800000, - 1416850830000, - 1416850860000, - 1416850890000, - 1416850920000, - 1416850950000, - 1416850980000, - 1416851010000, - 1416851040000, - 1416851070000, - 1416851100000, - 1416851130000, - 1416851160000, - 1416851190000, - 1416851220000, - 1416851250000, - 1416851280000, - 1416851310000, - 1416851340000, - 1416851370000, - 1416851400000, - 1416851430000, - 1416851460000, - 1416851490000, - 1416851520000, - 1416851550000, - 1416851580000, - 1416851610000, - 1416851640000, - 1416851670000, - 1416851700000, - 1416851730000, - 1416851760000, - 1416851790000, - 1416851820000, - 1416851850000, - 1416851880000, - 1416851910000, - 1416851940000, - 1416851970000, - 1416852000000, - 1416852030000, - 1416852060000, - 1416852090000, + 1416850320000, 1416850350000, 1416850380000, 1416850410000, 1416850440000, 1416850470000, + 1416850500000, 1416850530000, 1416850560000, 1416850590000, 1416850620000, 1416850650000, + 1416850680000, 1416850710000, 1416850740000, 1416850770000, 1416850800000, 1416850830000, + 1416850860000, 1416850890000, 1416850920000, 1416850950000, 1416850980000, 1416851010000, + 1416851040000, 1416851070000, 1416851100000, 1416851130000, 1416851160000, 1416851190000, + 1416851220000, 1416851250000, 1416851280000, 1416851310000, 1416851340000, 1416851370000, + 1416851400000, 1416851430000, 1416851460000, 1416851490000, 1416851520000, 1416851550000, + 1416851580000, 1416851610000, 1416851640000, 1416851670000, 1416851700000, 1416851730000, + 1416851760000, 1416851790000, 1416851820000, 1416851850000, 1416851880000, 1416851910000, + 1416851940000, 1416851970000, 1416852000000, 1416852030000, 1416852060000, 1416852090000, 1416852120000, ], series: [ diff --git a/src/plugins/vis_types/vislib/public/plugin.ts b/src/plugins/vis_types/vislib/public/plugin.ts index b0385475f7105..7e9095ce41990 100644 --- a/src/plugins/vis_types/vislib/public/plugin.ts +++ b/src/plugins/vis_types/vislib/public/plugin.ts @@ -39,7 +39,8 @@ export type VisTypeVislibCoreSetup = CoreSetup { + Plugin +{ constructor(public initializerContext: PluginInitializerContext) {} public setup( diff --git a/src/plugins/vis_types/vislib/public/services.ts b/src/plugins/vis_types/vislib/public/services.ts index d111007598b8b..21fb77a4d41ca 100644 --- a/src/plugins/vis_types/vislib/public/services.ts +++ b/src/plugins/vis_types/vislib/public/services.ts @@ -9,9 +9,8 @@ import { createGetterSetter } from '../../../kibana_utils/public'; import { DataPublicPluginStart } from '../../../data/public'; -export const [getDataActions, setDataActions] = createGetterSetter< - DataPublicPluginStart['actions'] ->('vislib data.actions'); +export const [getDataActions, setDataActions] = + createGetterSetter('vislib data.actions'); export const [getFormatService, setFormatService] = createGetterSetter< DataPublicPluginStart['fieldFormats'] diff --git a/src/plugins/vis_types/vislib/public/vislib/components/zero_injection/zero_injection.test.js b/src/plugins/vis_types/vislib/public/vislib/components/zero_injection/zero_injection.test.js index 54c981ddb33d3..5def9a7c72ea5 100644 --- a/src/plugins/vis_types/vislib/public/vislib/components/zero_injection/zero_injection.test.js +++ b/src/plugins/vis_types/vislib/public/vislib/components/zero_injection/zero_injection.test.js @@ -17,12 +17,7 @@ import { zeroFillDataArray } from './zero_fill_data_array'; describe('Vislib Zero Injection Module Test Suite', function () { const dateHistogramRowsObj = { xAxisOrderedValues: [ - 1418410560000, - 1418410620000, - 1418410680000, - 1418410740000, - 1418410800000, - 1418410860000, + 1418410560000, 1418410620000, 1418410680000, 1418410740000, 1418410800000, 1418410860000, 1418410920000, ], series: [ diff --git a/src/plugins/vis_types/vislib/public/vislib/lib/axis/x_axis.test.js b/src/plugins/vis_types/vislib/public/vislib/lib/axis/x_axis.test.js index 1ded9e48fcfd3..6b41c55242e20 100644 --- a/src/plugins/vis_types/vislib/public/vislib/lib/axis/x_axis.test.js +++ b/src/plugins/vis_types/vislib/public/vislib/lib/axis/x_axis.test.js @@ -28,16 +28,8 @@ describe('Vislib xAxis Class Test Suite', function () { min: 1408734082458, }, xAxisOrderedValues: [ - 1408734060000, - 1408734090000, - 1408734120000, - 1408734150000, - 1408734180000, - 1408734210000, - 1408734240000, - 1408734270000, - 1408734300000, - 1408734330000, + 1408734060000, 1408734090000, 1408734120000, 1408734150000, 1408734180000, 1408734210000, + 1408734240000, 1408734270000, 1408734300000, 1408734330000, ], series: [ { diff --git a/src/plugins/vis_types/vislib/public/vislib/lib/axis/y_axis.test.js b/src/plugins/vis_types/vislib/public/vislib/lib/axis/y_axis.test.js index 5bbfde01197e5..9c1e27e7731f1 100644 --- a/src/plugins/vis_types/vislib/public/vislib/lib/axis/y_axis.test.js +++ b/src/plugins/vis_types/vislib/public/vislib/lib/axis/y_axis.test.js @@ -22,16 +22,8 @@ let yAxis; let yAxisDiv; const timeSeries = [ - 1408734060000, - 1408734090000, - 1408734120000, - 1408734150000, - 1408734180000, - 1408734210000, - 1408734240000, - 1408734270000, - 1408734300000, - 1408734330000, + 1408734060000, 1408734090000, 1408734120000, 1408734150000, 1408734180000, 1408734210000, + 1408734240000, 1408734270000, 1408734300000, 1408734330000, ]; const defaultGraphData = [ diff --git a/src/plugins/vis_types/vislib/public/vislib/visualizations/chart.test.js b/src/plugins/vis_types/vislib/public/vislib/visualizations/chart.test.js index c105102dc6ab9..21ec67707126c 100644 --- a/src/plugins/vis_types/vislib/public/vislib/visualizations/chart.test.js +++ b/src/plugins/vis_types/vislib/public/vislib/visualizations/chart.test.js @@ -32,16 +32,8 @@ describe('Vislib _chart Test Suite', function () { min: 1408734082458, }, xAxisOrderedValues: [ - 1408734060000, - 1408734090000, - 1408734120000, - 1408734150000, - 1408734180000, - 1408734210000, - 1408734240000, - 1408734270000, - 1408734300000, - 1408734330000, + 1408734060000, 1408734090000, 1408734120000, 1408734150000, 1408734180000, 1408734210000, + 1408734240000, 1408734270000, 1408734300000, 1408734330000, ], series: [ { diff --git a/src/plugins/vis_types/xy/public/components/detailed_tooltip.mock.ts b/src/plugins/vis_types/xy/public/components/detailed_tooltip.mock.ts index 25310ea1ee7ff..bc6a1f292dad3 100644 --- a/src/plugins/vis_types/xy/public/components/detailed_tooltip.mock.ts +++ b/src/plugins/vis_types/xy/public/components/detailed_tooltip.mock.ts @@ -148,8 +148,7 @@ export const aspectsWithSplitRow = { export const header = { seriesIdentifier: { - key: - 'groupId{__pseudo_stacked_group-ValueAxis-1__}spec{area-col-1-1}yAccessor{col-1-1}splitAccessors{}smV{__ECH_DEFAULT_SINGLE_PANEL_SM_VALUE__}smH{__ECH_DEFAULT_SINGLE_PANEL_SM_VALUE__}', + key: 'groupId{__pseudo_stacked_group-ValueAxis-1__}spec{area-col-1-1}yAccessor{col-1-1}splitAccessors{}smV{__ECH_DEFAULT_SINGLE_PANEL_SM_VALUE__}smH{__ECH_DEFAULT_SINGLE_PANEL_SM_VALUE__}', specId: 'area-col-1-1', yAccessor: 'col-1-1', splitAccessors: {}, @@ -169,8 +168,7 @@ export const header = { export const value = { seriesIdentifier: { - key: - 'groupId{__pseudo_stacked_group-ValueAxis-1__}spec{area-col-1-1}yAccessor{col-1-1}splitAccessors{}smV{__ECH_DEFAULT_SINGLE_PANEL_SM_VALUE__}smH{__ECH_DEFAULT_SINGLE_PANEL_SM_VALUE__}', + key: 'groupId{__pseudo_stacked_group-ValueAxis-1__}spec{area-col-1-1}yAccessor{col-1-1}splitAccessors{}smV{__ECH_DEFAULT_SINGLE_PANEL_SM_VALUE__}smH{__ECH_DEFAULT_SINGLE_PANEL_SM_VALUE__}', specId: 'area-col-1-1', yAccessor: 'col-1-1', splitAccessors: [], diff --git a/src/plugins/vis_types/xy/public/components/detailed_tooltip.tsx b/src/plugins/vis_types/xy/public/components/detailed_tooltip.tsx index fb6b4bb41d9ba..a7eb7a909615b 100644 --- a/src/plugins/vis_types/xy/public/components/detailed_tooltip.tsx +++ b/src/plugins/vis_types/xy/public/components/detailed_tooltip.tsx @@ -113,34 +113,34 @@ const renderData = ({ label, value }: TooltipData, index: number) => { ) : null; }; -export const getDetailedTooltip = (aspects: Aspects) => ( - headerFormatter?: TooltipValueFormatter -): CustomTooltip => { - return function DetailedTooltip({ header, values }) { - // Note: first value is not necessarily the closest value - // To be fixed with https://github.com/elastic/elastic-charts/issues/835 - // TODO: Allow multiple values to be displayed in tooltip - const highlightedValue = values.find(({ isHighlighted }) => isHighlighted); - - if (!highlightedValue) { - return null; - } - - const tooltipData = getTooltipData(aspects, header, highlightedValue); - - if (tooltipData.length === 0) { - return null; - } - - return ( -
- {headerFormatter && header && ( -
{headerFormatter(header)}
- )} - - {tooltipData.map(renderData)} -
-
- ); +export const getDetailedTooltip = + (aspects: Aspects) => + (headerFormatter?: TooltipValueFormatter): CustomTooltip => { + return function DetailedTooltip({ header, values }) { + // Note: first value is not necessarily the closest value + // To be fixed with https://github.com/elastic/elastic-charts/issues/835 + // TODO: Allow multiple values to be displayed in tooltip + const highlightedValue = values.find(({ isHighlighted }) => isHighlighted); + + if (!highlightedValue) { + return null; + } + + const tooltipData = getTooltipData(aspects, header, highlightedValue); + + if (tooltipData.length === 0) { + return null; + } + + return ( +
+ {headerFormatter && header && ( +
{headerFormatter(header)}
+ )} + + {tooltipData.map(renderData)} +
+
+ ); + }; }; -}; diff --git a/src/plugins/vis_types/xy/public/config/get_axis.ts b/src/plugins/vis_types/xy/public/config/get_axis.ts index 4750724ca3d42..b5cc96830e46a 100644 --- a/src/plugins/vis_types/xy/public/config/get_axis.ts +++ b/src/plugins/vis_types/xy/public/config/get_axis.ts @@ -126,14 +126,16 @@ function getScale( format: Aspect['format'], isCategoryAxis: boolean ): ScaleConfig { - const type = (isCategoryAxis - ? getScaleType( - scale, - format?.id === 'number' || (format?.params?.id === 'number' && format?.id !== 'range'), - 'date' in params, - 'interval' in params - ) - : getScaleType(scale, true)) as S; + const type = ( + isCategoryAxis + ? getScaleType( + scale, + format?.id === 'number' || (format?.params?.id === 'number' && format?.id !== 'range'), + 'date' in params, + 'interval' in params + ) + : getScaleType(scale, true) + ) as S; return { ...scale, diff --git a/src/plugins/vis_types/xy/public/config/get_threshold_line.ts b/src/plugins/vis_types/xy/public/config/get_threshold_line.ts index 9f0cf4c515ab7..64eb7e5e24a80 100644 --- a/src/plugins/vis_types/xy/public/config/get_threshold_line.ts +++ b/src/plugins/vis_types/xy/public/config/get_threshold_line.ts @@ -20,8 +20,9 @@ export function getThresholdLine( yAxes: Array>, seriesParams: SeriesParam[] ): ThresholdLineConfig { - const groupId = yAxes.find(({ id }) => seriesParams.some(({ valueAxis }) => id === valueAxis)) - ?.groupId; + const groupId = yAxes.find(({ id }) => + seriesParams.some(({ valueAxis }) => id === valueAxis) + )?.groupId; return { ...rest, diff --git a/src/plugins/vis_types/xy/public/editor/components/options/metrics_axes/mocks.ts b/src/plugins/vis_types/xy/public/editor/components/options/metrics_axes/mocks.ts index cbc970c7ed7d8..1541837dacc30 100644 --- a/src/plugins/vis_types/xy/public/editor/components/options/metrics_axes/mocks.ts +++ b/src/plugins/vis_types/xy/public/editor/components/options/metrics_axes/mocks.ts @@ -80,10 +80,10 @@ const seriesParam: SeriesParam = { valueAxis: defaultValueAxisId, }; -const vis = ({ +const vis = { type: { editorConfig: {}, }, -} as any) as Vis; +} as any as Vis; export { defaultValueAxisId, categoryAxis, valueAxis, seriesParam, vis }; diff --git a/src/plugins/vis_types/xy/public/editor/components/options/point_series/point_series.test.tsx b/src/plugins/vis_types/xy/public/editor/components/options/point_series/point_series.test.tsx index 6367494bf9268..5bf9486bbc4ee 100644 --- a/src/plugins/vis_types/xy/public/editor/components/options/point_series/point_series.test.tsx +++ b/src/plugins/vis_types/xy/public/editor/components/options/point_series/point_series.test.tsx @@ -31,7 +31,7 @@ describe('PointSeries Editor', function () { let component: ReactWrapper; beforeEach(() => { - props = ({ + props = { aggs: getAggs(), hasHistogramAgg: false, isTabSelected: false, @@ -41,7 +41,7 @@ describe('PointSeries Editor', function () { setValidity: jest.fn(), stateParams: getStateParams(ChartType.Histogram, false), vis: getVis('date_histogram'), - } as unknown) as PointSeriesOptionsProps; + } as unknown as PointSeriesOptionsProps; }); it('renders the showValuesOnChart switch for a bar chart', async () => { @@ -52,10 +52,10 @@ describe('PointSeries Editor', function () { }); it('not renders the showValuesOnChart switch for an area chart', async () => { - const areaVisProps = ({ + const areaVisProps = { ...props, stateParams: getStateParams(ChartType.Area, false), - } as unknown) as PointSeriesOptionsProps; + } as unknown as PointSeriesOptionsProps; component = mountWithIntl(); await act(async () => { expect(findTestSubject(component, 'showValuesOnChart').length).toBe(0); @@ -71,10 +71,10 @@ describe('PointSeries Editor', function () { }); it('renders the orderBucketsBySum switch for a non date histogram bucket', async () => { - const newVisProps = ({ + const newVisProps = { ...props, vis: getVis('terms'), - } as unknown) as PointSeriesOptionsProps; + } as unknown as PointSeriesOptionsProps; component = mountWithIntl(); await act(async () => { expect(findTestSubject(component, 'addTimeMarker').length).toBe(0); @@ -104,10 +104,10 @@ describe('PointSeries Editor', function () { }); it('renders the fitting function for a line chart', async () => { - const newVisProps = ({ + const newVisProps = { ...props, stateParams: getStateParams(ChartType.Line, false), - } as unknown) as PointSeriesOptionsProps; + } as unknown as PointSeriesOptionsProps; component = mountWithIntl(); await act(async () => { expect(findTestSubject(component, 'fittingFunction').length).toBe(1); @@ -129,10 +129,10 @@ describe('PointSeries Editor', function () { }); it('renders the threshold panel if the Show threshold line switch is on', async () => { - const newVisProps = ({ + const newVisProps = { ...props, stateParams: getStateParams(ChartType.Histogram, true), - } as unknown) as PointSeriesOptionsProps; + } as unknown as PointSeriesOptionsProps; component = mountWithIntl(); await act(async () => { expect(findTestSubject(component, 'thresholdValueInputOption').length).toBe(1); diff --git a/src/plugins/vis_types/xy/public/plugin.ts b/src/plugins/vis_types/xy/public/plugin.ts index 600e78b5b3949..c79ead242e35b 100644 --- a/src/plugins/vis_types/xy/public/plugin.ts +++ b/src/plugins/vis_types/xy/public/plugin.ts @@ -59,7 +59,8 @@ export class VisTypeXyPlugin VisTypeXyPluginStart, VisTypeXyPluginSetupDependencies, VisTypeXyPluginStartDependencies - > { + > +{ public setup( core: VisTypeXyCoreSetup, { expressions, visualizations, charts, usageCollection }: VisTypeXyPluginSetupDependencies diff --git a/src/plugins/vis_types/xy/public/services.ts b/src/plugins/vis_types/xy/public/services.ts index 7f1f7e8728151..d8c8689eee298 100644 --- a/src/plugins/vis_types/xy/public/services.ts +++ b/src/plugins/vis_types/xy/public/services.ts @@ -12,32 +12,27 @@ import { createGetterSetter } from '../../../kibana_utils/public'; import { DataPublicPluginStart } from '../../../data/public'; import { ChartsPluginSetup, ChartsPluginStart } from '../../../charts/public'; -export const [getUISettings, setUISettings] = createGetterSetter( - 'xy core.uiSettings' -); +export const [getUISettings, setUISettings] = + createGetterSetter('xy core.uiSettings'); -export const [getDataActions, setDataActions] = createGetterSetter< - DataPublicPluginStart['actions'] ->('xy data.actions'); +export const [getDataActions, setDataActions] = + createGetterSetter('xy data.actions'); -export const [getFormatService, setFormatService] = createGetterSetter< - DataPublicPluginStart['fieldFormats'] ->('xy data.fieldFormats'); +export const [getFormatService, setFormatService] = + createGetterSetter('xy data.fieldFormats'); -export const [getThemeService, setThemeService] = createGetterSetter( - 'xy charts.theme' -); +export const [getThemeService, setThemeService] = + createGetterSetter('xy charts.theme'); -export const [getActiveCursor, setActiveCursor] = createGetterSetter< - ChartsPluginStart['activeCursor'] ->('xy charts.activeCursor'); +export const [getActiveCursor, setActiveCursor] = + createGetterSetter('xy charts.activeCursor'); -export const [getPalettesService, setPalettesService] = createGetterSetter< - ChartsPluginSetup['palettes'] ->('xy charts.palette'); +export const [getPalettesService, setPalettesService] = + createGetterSetter('xy charts.palette'); export const [getDocLinks, setDocLinks] = createGetterSetter('DocLinks'); -export const [getTrackUiMetric, setTrackUiMetric] = createGetterSetter< - (metricType: UiCounterMetricType, eventName: string | string[]) => void ->('trackUiMetric'); +export const [getTrackUiMetric, setTrackUiMetric] = + createGetterSetter<(metricType: UiCounterMetricType, eventName: string | string[]) => void>( + 'trackUiMetric' + ); diff --git a/src/plugins/vis_types/xy/public/utils/accessors.tsx b/src/plugins/vis_types/xy/public/utils/accessors.tsx index 748430e3b16a6..9566f819ba145 100644 --- a/src/plugins/vis_types/xy/public/utils/accessors.tsx +++ b/src/plugins/vis_types/xy/public/utils/accessors.tsx @@ -36,33 +36,32 @@ export const isRangeAggType = (type: string | null) => * @param aspect * @param isComplex - forces to be functional/complex accessor */ -export const getComplexAccessor = (fieldName: string, isComplex: boolean = false) => ( - aspect: Aspect, - index?: number -): Accessor | AccessorFn | undefined => { - if (!aspect.accessor || aspect.aggType === SHARD_DELAY) { - return; - } - - if (!((isComplex || isRangeAggType(aspect.aggType)) && aspect.formatter)) { - return aspect.accessor; - } - - const formatter = aspect.formatter; - const accessor = aspect.accessor; - const fn: AccessorFn = (d) => { - const v = d[accessor]; - if (v === undefined) { +export const getComplexAccessor = + (fieldName: string, isComplex: boolean = false) => + (aspect: Aspect, index?: number): Accessor | AccessorFn | undefined => { + if (!aspect.accessor || aspect.aggType === SHARD_DELAY) { return; } - const f = formatter(v); - return f; - }; - fn.fieldName = getFieldName(fieldName, index); + if (!((isComplex || isRangeAggType(aspect.aggType)) && aspect.formatter)) { + return aspect.accessor; + } + + const formatter = aspect.formatter; + const accessor = aspect.accessor; + const fn: AccessorFn = (d) => { + const v = d[accessor]; + if (v === undefined) { + return; + } + const f = formatter(v); + return f; + }; - return fn; -}; + fn.fieldName = getFieldName(fieldName, index); + + return fn; + }; export const getSplitSeriesAccessorFnMap = ( splitSeriesAccessors: Array diff --git a/src/plugins/vis_types/xy/public/utils/get_color_picker.test.tsx b/src/plugins/vis_types/xy/public/utils/get_color_picker.test.tsx index e015521f7436e..352cff0d4c4a9 100644 --- a/src/plugins/vis_types/xy/public/utils/get_color_picker.test.tsx +++ b/src/plugins/vis_types/xy/public/utils/get_color_picker.test.tsx @@ -26,14 +26,14 @@ jest.mock('@elastic/charts', () => { describe('getColorPicker', function () { const mockState = new Map(); - const uiState = ({ + const uiState = { get: jest .fn() .mockImplementation((key, fallback) => (mockState.has(key) ? mockState.get(key) : fallback)), set: jest.fn().mockImplementation((key, value) => mockState.set(key, value)), emit: jest.fn(), setSilent: jest.fn(), - } as unknown) as PersistedState; + } as unknown as PersistedState; let wrapperProps: LegendColorPickerProps; const Component: ComponentType = getColorPicker( @@ -57,8 +57,7 @@ describe('getColorPicker', function () { splitAccessors: {}, seriesKeys: ['Logstash Airways', 'col-2-1'], specId: 'histogram-col-2-1', - key: - 'groupId{__pseudo_stacked_group-ValueAxis-1__}spec{histogram-col-2-1}yAccessor{col-2-1}splitAccessors{col-1-3-Logstash Airways}', + key: 'groupId{__pseudo_stacked_group-ValueAxis-1__}spec{histogram-col-2-1}yAccessor{col-2-1}splitAccessors{col-1-3-Logstash Airways}', } as XYChartSeriesIdentifier, ], }; diff --git a/src/plugins/vis_types/xy/public/utils/get_color_picker.tsx b/src/plugins/vis_types/xy/public/utils/get_color_picker.tsx index 1b5a16a8894aa..6e1a61875b5af 100644 --- a/src/plugins/vis_types/xy/public/utils/get_color_picker.tsx +++ b/src/plugins/vis_types/xy/public/utils/get_color_picker.tsx @@ -28,69 +28,65 @@ function getAnchorPosition(legendPosition: Position): PopoverAnchorPosition { const KEY_CODE_ENTER = 13; -export const getColorPicker = ( - legendPosition: Position, - setColor: (newColor: string | null, seriesKey: string | number) => void, - getSeriesName: (series: XYChartSeriesIdentifier) => SeriesName, - paletteName: string, - uiState: PersistedState -): LegendColorPicker => ({ - anchor, - color, - onClose, - onChange, - seriesIdentifiers: [seriesIdentifier], -}) => { - const seriesName = getSeriesName(seriesIdentifier as XYChartSeriesIdentifier); - const overwriteColors: Record = uiState?.get('vis.colors', {}); - const colorIsOverwritten = Object.keys(overwriteColors).includes(seriesName as string); - let keyDownEventOn = false; +export const getColorPicker = + ( + legendPosition: Position, + setColor: (newColor: string | null, seriesKey: string | number) => void, + getSeriesName: (series: XYChartSeriesIdentifier) => SeriesName, + paletteName: string, + uiState: PersistedState + ): LegendColorPicker => + ({ anchor, color, onClose, onChange, seriesIdentifiers: [seriesIdentifier] }) => { + const seriesName = getSeriesName(seriesIdentifier as XYChartSeriesIdentifier); + const overwriteColors: Record = uiState?.get('vis.colors', {}); + const colorIsOverwritten = Object.keys(overwriteColors).includes(seriesName as string); + let keyDownEventOn = false; - const handleChange = (newColor: string | null) => { - if (!seriesName) { - return; - } - if (newColor) { - onChange(newColor); - } - setColor(newColor, seriesName); - // close the popover if no color is applied or the user has clicked a color - if (!newColor || !keyDownEventOn) { - onClose(); - } - }; + const handleChange = (newColor: string | null) => { + if (!seriesName) { + return; + } + if (newColor) { + onChange(newColor); + } + setColor(newColor, seriesName); + // close the popover if no color is applied or the user has clicked a color + if (!newColor || !keyDownEventOn) { + onClose(); + } + }; - const onKeyDown = (e: React.KeyboardEvent) => { - if (e.keyCode === KEY_CODE_ENTER) { - onClose?.(); - } - keyDownEventOn = true; - }; + const onKeyDown = (e: React.KeyboardEvent) => { + if (e.keyCode === KEY_CODE_ENTER) { + onClose?.(); + } + keyDownEventOn = true; + }; - const handleOutsideClick = useCallback(() => { - onClose?.(); - }, [onClose]); + const handleOutsideClick = useCallback(() => { + onClose?.(); + }, [onClose]); - return ( - - - - - - ); -}; + return ( + + + + + + ); + }; diff --git a/src/plugins/vis_types/xy/public/utils/get_series_name_fn.test.ts b/src/plugins/vis_types/xy/public/utils/get_series_name_fn.test.ts index 8853e6075e269..88be9ab160896 100644 --- a/src/plugins/vis_types/xy/public/utils/get_series_name_fn.test.ts +++ b/src/plugins/vis_types/xy/public/utils/get_series_name_fn.test.ts @@ -63,7 +63,7 @@ const aspects = { ], }; -const series = ({ +const series = { specId: 'histogram-col-1-1', seriesKeys: ['col-1-1'], yAccessor: 'col-1-1', @@ -73,12 +73,12 @@ const series = ({ groupId: '__pseudo_stacked_group-ValueAxis-1__', seriesType: 'bar', isStacked: true, -} as unknown) as XYChartSeriesIdentifier; +} as unknown as XYChartSeriesIdentifier; const splitAccessors = new Map(); splitAccessors.set('col-1-3', 'Weather Delay'); -const seriesSplitAccessors = ({ +const seriesSplitAccessors = { specId: 'histogram-col-2-1', seriesKeys: ['Weather Delay', 'col-2-1'], yAccessor: 'col-2-1', @@ -88,7 +88,7 @@ const seriesSplitAccessors = ({ groupId: '__pseudo_stacked_group-ValueAxis-1__', seriesType: 'bar', isStacked: true, -} as unknown) as XYChartSeriesIdentifier; +} as unknown as XYChartSeriesIdentifier; describe('getSeriesNameFn', () => { it('returns the y aspects title if splitAccessors are empty array', () => { diff --git a/src/plugins/vis_types/xy/public/utils/get_series_name_fn.ts b/src/plugins/vis_types/xy/public/utils/get_series_name_fn.ts index 137f8a5558010..8019e36c1e6d5 100644 --- a/src/plugins/vis_types/xy/public/utils/get_series_name_fn.ts +++ b/src/plugins/vis_types/xy/public/utils/get_series_name_fn.ts @@ -29,23 +29,20 @@ function getSplitValues( } export const getSeriesNameFn = (aspects: VisConfig['aspects'], multipleY = false) => - memoize( - ({ splitAccessors, yAccessor }: XYChartSeriesIdentifier): SeriesName => { - const splitValues = getSplitValues(splitAccessors, aspects.series); - const yAccessorTitle = - aspects.y.find(({ accessor }) => accessor === yAccessor)?.title ?? null; - - if (!yAccessorTitle) { - return null; - } + memoize(({ splitAccessors, yAccessor }: XYChartSeriesIdentifier): SeriesName => { + const splitValues = getSplitValues(splitAccessors, aspects.series); + const yAccessorTitle = aspects.y.find(({ accessor }) => accessor === yAccessor)?.title ?? null; - if (multipleY) { - if (splitValues.length === 0) { - return yAccessorTitle; - } - return `${splitValues.join(' - ')}: ${yAccessorTitle}`; - } + if (!yAccessorTitle) { + return null; + } - return splitValues.length > 0 ? splitValues.join(' - ') : yAccessorTitle; + if (multipleY) { + if (splitValues.length === 0) { + return yAccessorTitle; + } + return `${splitValues.join(' - ')}: ${yAccessorTitle}`; } - ); + + return splitValues.length > 0 ? splitValues.join(' - ') : yAccessorTitle; + }); diff --git a/src/plugins/vis_types/xy/public/vis_component.tsx b/src/plugins/vis_types/xy/public/vis_component.tsx index 3e4f3e1ffe294..f4d566f49602e 100644 --- a/src/plugins/vis_types/xy/public/vis_component.tsx +++ b/src/plugins/vis_types/xy/public/vis_component.tsx @@ -221,9 +221,10 @@ const VisComponent = (props: VisComponentProps) => { config.xAxis.scale.type === ScaleType.Ordinal ? undefined : getAdjustedDomain(visData.rows, config.aspects.x, timeZone, xDomain, hasBars); - const legendPosition = useMemo(() => config.legend.position ?? Position.Right, [ - config.legend.position, - ]); + const legendPosition = useMemo( + () => config.legend.position ?? Position.Right, + [config.legend.position] + ); const isDarkMode = getThemeService().useDarkMode(); const getSeriesName = getSeriesNameFn(config.aspects, config.aspects.y.length > 1); @@ -231,11 +232,10 @@ const VisComponent = (props: VisComponentProps) => { return { accessor, formatter }; }); - const allSeries = useMemo(() => getAllSeries(visData.rows, splitAccessors, config.aspects.y), [ - config.aspects.y, - splitAccessors, - visData.rows, - ]); + const allSeries = useMemo( + () => getAllSeries(visData.rows, splitAccessors, config.aspects.y), + [config.aspects.y, splitAccessors, visData.rows] + ); const getSeriesColor = useCallback( (series: XYChartSeriesIdentifier) => { diff --git a/src/plugins/visualizations/public/embeddable/create_vis_embeddable_from_object.ts b/src/plugins/visualizations/public/embeddable/create_vis_embeddable_from_object.ts index b2c729b5cbeae..cfa871f17b0e0 100644 --- a/src/plugins/visualizations/public/embeddable/create_vis_embeddable_from_object.ts +++ b/src/plugins/visualizations/public/embeddable/create_vis_embeddable_from_object.ts @@ -33,63 +33,65 @@ import { SavedVisualizationsLoader } from '../saved_visualizations'; import { IndexPattern } from '../../../data/public'; import { createVisualizeEmbeddableAsync } from './visualize_embeddable_async'; -export const createVisEmbeddableFromObject = (deps: VisualizeEmbeddableFactoryDeps) => async ( - vis: Vis, - input: Partial & { id: string }, - savedVisualizationsLoader?: SavedVisualizationsLoader, - attributeService?: AttributeService< - VisualizeSavedObjectAttributes, - VisualizeByValueInput, - VisualizeByReferenceInput - >, - parent?: IContainer -): Promise => { - const savedVisualizations = getSavedVisualizationsLoader(); +export const createVisEmbeddableFromObject = + (deps: VisualizeEmbeddableFactoryDeps) => + async ( + vis: Vis, + input: Partial & { id: string }, + savedVisualizationsLoader?: SavedVisualizationsLoader, + attributeService?: AttributeService< + VisualizeSavedObjectAttributes, + VisualizeByValueInput, + VisualizeByReferenceInput + >, + parent?: IContainer + ): Promise => { + const savedVisualizations = getSavedVisualizationsLoader(); - try { - const visId = vis.id as string; + try { + const visId = vis.id as string; - const editPath = visId ? savedVisualizations.urlFor(visId) : '#/edit_by_value'; + const editPath = visId ? savedVisualizations.urlFor(visId) : '#/edit_by_value'; - const editUrl = visId - ? getHttp().basePath.prepend(`/app/visualize${savedVisualizations.urlFor(visId)}`) - : ''; - const isLabsEnabled = getUISettings().get(VISUALIZE_ENABLE_LABS_SETTING); + const editUrl = visId + ? getHttp().basePath.prepend(`/app/visualize${savedVisualizations.urlFor(visId)}`) + : ''; + const isLabsEnabled = getUISettings().get(VISUALIZE_ENABLE_LABS_SETTING); - if (!isLabsEnabled && vis.type.stage === 'experimental') { - return new DisabledLabEmbeddable(vis.title, input); - } + if (!isLabsEnabled && vis.type.stage === 'experimental') { + return new DisabledLabEmbeddable(vis.title, input); + } - let indexPatterns: IndexPattern[] = []; + let indexPatterns: IndexPattern[] = []; - if (vis.type.getUsedIndexPattern) { - indexPatterns = await vis.type.getUsedIndexPattern(vis.params); - } else if (vis.data.indexPattern) { - indexPatterns = [vis.data.indexPattern]; - } + if (vis.type.getUsedIndexPattern) { + indexPatterns = await vis.type.getUsedIndexPattern(vis.params); + } else if (vis.data.indexPattern) { + indexPatterns = [vis.data.indexPattern]; + } - const capabilities = { - visualizeSave: Boolean(getCapabilities().visualize.save), - dashboardSave: Boolean(getCapabilities().dashboard?.showWriteControls), - }; + const capabilities = { + visualizeSave: Boolean(getCapabilities().visualize.save), + dashboardSave: Boolean(getCapabilities().dashboard?.showWriteControls), + }; - return createVisualizeEmbeddableAsync( - getTimeFilter(), - { - vis, - indexPatterns, - editPath, - editUrl, - deps, - capabilities, - }, - input, - attributeService, - savedVisualizationsLoader, - parent - ); - } catch (e) { - console.error(e); // eslint-disable-line no-console - return new ErrorEmbeddable(e, input, parent); - } -}; + return createVisualizeEmbeddableAsync( + getTimeFilter(), + { + vis, + indexPatterns, + editPath, + editUrl, + deps, + capabilities, + }, + input, + attributeService, + savedVisualizationsLoader, + parent + ); + } catch (e) { + console.error(e); // eslint-disable-line no-console + return new ErrorEmbeddable(e, input, parent); + } + }; diff --git a/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts b/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts index 637334067b513..75809bd06ba4a 100644 --- a/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts +++ b/src/plugins/visualizations/public/embeddable/visualize_embeddable.ts @@ -85,7 +85,8 @@ type ExpressionLoader = InstanceType; export class VisualizeEmbeddable extends Embeddable - implements ReferenceOrValueEmbeddable { + implements ReferenceOrValueEmbeddable +{ private handler?: ExpressionLoader; private timefilter: TimefilterContract; private timeRange?: TimeRange; diff --git a/src/plugins/visualizations/public/embeddable/visualize_embeddable_factory.tsx b/src/plugins/visualizations/public/embeddable/visualize_embeddable_factory.tsx index 872132416352f..9e22b33bdee9d 100644 --- a/src/plugins/visualizations/public/embeddable/visualize_embeddable_factory.tsx +++ b/src/plugins/visualizations/public/embeddable/visualize_embeddable_factory.tsx @@ -70,7 +70,8 @@ export class VisualizeEmbeddableFactory VisualizeOutput | EmbeddableOutput, VisualizeEmbeddable | DisabledLabEmbeddable, VisualizationAttributes - > { + > +{ public readonly type = VISUALIZE_EMBEDDABLE_TYPE; private attributeService?: AttributeService< @@ -205,7 +206,7 @@ export class VisualizeEmbeddableFactory savedVis.copyOnSave = false; savedVis.description = ''; savedVis.searchSourceFields = visObj?.data.searchSource?.getSerializedFields(); - const serializedVis = ((visObj as unknown) as Vis).serialize(); + const serializedVis = (visObj as unknown as Vis).serialize(); const { params, data } = serializedVis; savedVis.visState = { title, @@ -251,7 +252,7 @@ export class VisualizeEmbeddableFactory } public inject(_state: EmbeddableStateWithType, references: SavedObjectReference[]) { - const state = (_state as unknown) as VisualizeInput; + const state = _state as unknown as VisualizeInput; const { type, params } = state.savedVis ?? {}; @@ -264,7 +265,7 @@ export class VisualizeEmbeddableFactory } public extract(_state: EmbeddableStateWithType) { - const state = (_state as unknown) as VisualizeInput; + const state = _state as unknown as VisualizeInput; const references = []; if (state.savedVis?.data.searchSource) { diff --git a/src/plugins/visualizations/public/plugin.ts b/src/plugins/visualizations/public/plugin.ts index ae97080b31fc5..ee3e914aa4bc6 100644 --- a/src/plugins/visualizations/public/plugin.ts +++ b/src/plugins/visualizations/public/plugin.ts @@ -120,7 +120,8 @@ export class VisualizationsPlugin VisualizationsStart, VisualizationsSetupDeps, VisualizationsStartDeps - > { + > +{ private readonly types: TypesService = new TypesService(); private getStartServicesOrDie?: StartServicesGetter; diff --git a/src/plugins/visualizations/public/saved_visualizations/_saved_vis.ts b/src/plugins/visualizations/public/saved_visualizations/_saved_vis.ts index f1fba28297e45..fb6c99ac8ef02 100644 --- a/src/plugins/visualizations/public/saved_visualizations/_saved_vis.ts +++ b/src/plugins/visualizations/public/saved_visualizations/_saved_vis.ts @@ -103,7 +103,7 @@ export function createSavedVisClass(services: SavedVisServices) { version: 1, }, afterESResp: async (savedObject: SavedObject) => { - const savedVis = (savedObject as any) as ISavedVis; + const savedVis = savedObject as any as ISavedVis; savedVis.visState = await updateOldState(savedVis.visState); if (savedVis.searchSourceFields?.index) { await services.indexPatterns.get(savedVis.searchSourceFields.index as any); @@ -111,7 +111,7 @@ export function createSavedVisClass(services: SavedVisServices) { if (savedVis.savedSearchId) { await savedSearch.get(savedVis.savedSearchId); } - return (savedVis as any) as SavedObject; + return savedVis as any as SavedObject; }, }); this.showInRecentlyAccessed = true; @@ -121,5 +121,5 @@ export function createSavedVisClass(services: SavedVisServices) { } } - return (SavedVis as unknown) as new (opts: Record | string) => SavedObject; + return SavedVis as unknown as new (opts: Record | string) => SavedObject; } diff --git a/src/plugins/visualizations/public/saved_visualizations/saved_visualization_references/saved_visualization_references.test.ts b/src/plugins/visualizations/public/saved_visualizations/saved_visualization_references/saved_visualization_references.test.ts index 9c832414e7f00..ee0e3d481929d 100644 --- a/src/plugins/visualizations/public/saved_visualizations/saved_visualization_references/saved_visualization_references.test.ts +++ b/src/plugins/visualizations/public/saved_visualizations/saved_visualization_references/saved_visualization_references.test.ts @@ -115,11 +115,11 @@ describe('injectReferences', () => { }); test('injects references into context', () => { - const context = ({ + const context = { id: '1', title: 'test', savedSearchRefName: 'search_0', - visState: ({ + visState: { type: 'input_control_vis', params: { controls: [ @@ -132,8 +132,8 @@ describe('injectReferences', () => { }, ], }, - } as unknown) as SavedVisState, - } as unknown) as VisSavedObject; + } as unknown as SavedVisState, + } as unknown as VisSavedObject; const references = [ { name: 'search_0', @@ -182,10 +182,10 @@ describe('injectReferences', () => { }); test(`fails when it can't find the index pattern reference in the array`, () => { - const context = ({ + const context = { id: '1', title: 'test', - visState: ({ + visState: { type: 'input_control_vis', params: { controls: [ @@ -195,8 +195,8 @@ describe('injectReferences', () => { }, ], }, - } as unknown) as SavedVisState, - } as unknown) as VisSavedObject; + } as unknown as SavedVisState, + } as unknown as VisSavedObject; expect(() => injectReferences(context, [])).toThrowErrorMatchingInlineSnapshot( `"Could not find index pattern reference \\"control_0_index_pattern\\""` ); diff --git a/src/plugins/visualizations/public/services.ts b/src/plugins/visualizations/public/services.ts index b135e0556ace4..f1ab9077cd207 100644 --- a/src/plugins/visualizations/public/services.ts +++ b/src/plugins/visualizations/public/services.ts @@ -36,9 +36,8 @@ export const [getApplication, setApplication] = createGetterSetter('Embeddable'); -export const [getSavedObjects, setSavedObjects] = createGetterSetter( - 'SavedObjects' -); +export const [getSavedObjects, setSavedObjects] = + createGetterSetter('SavedObjects'); export const [getTypes, setTypes] = createGetterSetter('Types'); @@ -48,27 +47,22 @@ export const [getTimeFilter, setTimeFilter] = createGetterSetter('Search'); -export const [getUsageCollector, setUsageCollector] = createGetterSetter( - 'UsageCollection' -); +export const [getUsageCollector, setUsageCollector] = + createGetterSetter('UsageCollection'); export const [getExpressions, setExpressions] = createGetterSetter('Expressions'); export const [getUiActions, setUiActions] = createGetterSetter('UiActions'); -export const [ - getSavedVisualizationsLoader, - setSavedVisualizationsLoader, -] = createGetterSetter('SavedVisualisationsLoader'); +export const [getSavedVisualizationsLoader, setSavedVisualizationsLoader] = + createGetterSetter('SavedVisualisationsLoader'); -export const [getAggs, setAggs] = createGetterSetter( - 'AggConfigs' -); +export const [getAggs, setAggs] = + createGetterSetter('AggConfigs'); export const [getOverlays, setOverlays] = createGetterSetter('Overlays'); export const [getChrome, setChrome] = createGetterSetter('Chrome'); -export const [getSavedSearchLoader, setSavedSearchLoader] = createGetterSetter( - 'savedSearchLoader' -); +export const [getSavedSearchLoader, setSavedSearchLoader] = + createGetterSetter('savedSearchLoader'); diff --git a/src/plugins/visualizations/public/wizard/agg_based_selection/agg_based_selection.test.tsx b/src/plugins/visualizations/public/wizard/agg_based_selection/agg_based_selection.test.tsx index c96dc17abf83f..e3707a7aace79 100644 --- a/src/plugins/visualizations/public/wizard/agg_based_selection/agg_based_selection.test.tsx +++ b/src/plugins/visualizations/public/wizard/agg_based_selection/agg_based_selection.test.tsx @@ -48,7 +48,7 @@ describe('AggBasedSelection', () => { const visTypes: TypesStart = { get(id: string): BaseVisType { - return (_visTypes.find((vis) => vis.name === id) as unknown) as BaseVisType; + return _visTypes.find((vis) => vis.name === id) as unknown as BaseVisType; }, all: () => _visTypes, getAliases: () => [], diff --git a/src/plugins/visualizations/public/wizard/group_selection/group_selection.test.tsx b/src/plugins/visualizations/public/wizard/group_selection/group_selection.test.tsx index 708be0d749380..04824ae25704d 100644 --- a/src/plugins/visualizations/public/wizard/group_selection/group_selection.test.tsx +++ b/src/plugins/visualizations/public/wizard/group_selection/group_selection.test.tsx @@ -58,17 +58,17 @@ describe('GroupSelection', () => { const visTypesRegistry = (visTypes: BaseVisType[]): TypesStart => { return { get(id: string): BaseVisType { - return (visTypes.find((vis) => vis.name === id) as unknown) as BaseVisType; + return visTypes.find((vis) => vis.name === id) as unknown as BaseVisType; }, all: () => { - return (visTypes as unknown) as BaseVisType[]; + return visTypes as unknown as BaseVisType[]; }, getAliases: () => [], unRegisterAlias: () => [], getByGroup: (group: VisGroups) => { - return (visTypes.filter((type) => { + return visTypes.filter((type) => { return type.group === group; - }) as unknown) as BaseVisType[]; + }) as unknown as BaseVisType[]; }, }; }; diff --git a/src/plugins/visualizations/public/wizard/new_vis_modal.test.tsx b/src/plugins/visualizations/public/wizard/new_vis_modal.test.tsx index 29d8c58e617e2..7514f467840e5 100644 --- a/src/plugins/visualizations/public/wizard/new_vis_modal.test.tsx +++ b/src/plugins/visualizations/public/wizard/new_vis_modal.test.tsx @@ -58,7 +58,7 @@ describe('NewVisModal', () => { ] as BaseVisType[]; const visTypes: TypesStart = { get(id: string): BaseVisType { - return (_visTypes.find((vis) => vis.name === id) as unknown) as BaseVisType; + return _visTypes.find((vis) => vis.name === id) as unknown as BaseVisType; }, all: () => _visTypes, getAliases: () => [], @@ -190,7 +190,7 @@ describe('NewVisModal', () => { originatingApp={'coolJestTestApp'} addBasePath={addBasePath} uiSettings={uiSettings} - application={({ navigateToApp } as unknown) as ApplicationStart} + application={{ navigateToApp } as unknown as ApplicationStart} docLinks={docLinks as DocLinksStart} stateTransfer={stateTransfer} savedObjects={{} as SavedObjectsStart} @@ -216,7 +216,7 @@ describe('NewVisModal', () => { editorParams={['foo=true', 'bar=42']} addBasePath={addBasePath} uiSettings={uiSettings} - application={({ navigateToApp } as unknown) as ApplicationStart} + application={{ navigateToApp } as unknown as ApplicationStart} docLinks={docLinks as DocLinksStart} savedObjects={{} as SavedObjectsStart} /> diff --git a/src/plugins/visualizations/server/migrations/visualization_saved_object_migrations.test.ts b/src/plugins/visualizations/server/migrations/visualization_saved_object_migrations.test.ts index 00c7e26715e6c..d9801b8a59504 100644 --- a/src/plugins/visualizations/server/migrations/visualization_saved_object_migrations.test.ts +++ b/src/plugins/visualizations/server/migrations/visualization_saved_object_migrations.test.ts @@ -9,7 +9,7 @@ import { visualizationSavedObjectTypeMigrations } from './visualization_saved_object_migrations'; import { SavedObjectMigrationContext, SavedObjectMigrationFn } from 'kibana/server'; -const savedObjectMigrationContext = (null as unknown) as SavedObjectMigrationContext; +const savedObjectMigrationContext = null as unknown as SavedObjectMigrationContext; const testMigrateMatchAllQuery = (migrate: Function) => { it('should migrate obsolete match_all query', () => { @@ -922,11 +922,11 @@ describe('migration visualization', () => { describe('7.3.0', () => { const logMsgArr: string[] = []; - const logger = ({ + const logger = { log: { warn: (msg: string) => logMsgArr.push(msg), }, - } as unknown) as SavedObjectMigrationContext; + } as unknown as SavedObjectMigrationContext; const migrate = (doc: any) => visualizationSavedObjectTypeMigrations['7.3.0']( @@ -1636,10 +1636,8 @@ describe('migration visualization', () => { const migratedtimeSeriesDoc = migrate(timeSeriesDoc); expect(migratedtimeSeriesDoc.attributes.kibanaSavedObjectMeta.searchSourceJSON).toEqual('{}'); const { kibanaSavedObjectMeta, ...attributes } = migratedtimeSeriesDoc.attributes; - const { - kibanaSavedObjectMeta: oldKibanaSavedObjectMeta, - ...oldAttributes - } = migratedtimeSeriesDoc.attributes; + const { kibanaSavedObjectMeta: oldKibanaSavedObjectMeta, ...oldAttributes } = + migratedtimeSeriesDoc.attributes; expect(attributes).toEqual(oldAttributes); }); }); diff --git a/src/plugins/visualizations/server/plugin.ts b/src/plugins/visualizations/server/plugin.ts index 6b87c0206347f..991d1b16ee236 100644 --- a/src/plugins/visualizations/server/plugin.ts +++ b/src/plugins/visualizations/server/plugin.ts @@ -26,7 +26,8 @@ import type { EmbeddableSetup } from '../../embeddable/server'; import { visualizeEmbeddableFactory } from './embeddable/visualize_embeddable_factory'; export class VisualizationsPlugin - implements Plugin { + implements Plugin +{ private readonly logger: Logger; constructor(initializerContext: PluginInitializerContext) { diff --git a/src/plugins/visualizations/server/usage_collector/get_usage_collector.test.ts b/src/plugins/visualizations/server/usage_collector/get_usage_collector.test.ts index 24c290ca849ed..ab31d622e62c7 100644 --- a/src/plugins/visualizations/server/usage_collector/get_usage_collector.test.ts +++ b/src/plugins/visualizations/server/usage_collector/get_usage_collector.test.ts @@ -85,14 +85,14 @@ const enlargedMockSavedObjects = [ describe('Visualizations usage collector', () => { const getMockCallCluster = (savedObjects: unknown[]) => - (({ + ({ createPointInTimeFinder: jest.fn().mockResolvedValue({ close: jest.fn(), find: function* asyncGenerator() { yield { saved_objects: savedObjects }; }, }), - } as unknown) as SavedObjectsClientContract); + } as unknown as SavedObjectsClientContract); test('Returns undefined when no results found (undefined)', async () => { const result = await getStats(getMockCallCluster(undefined as any)); diff --git a/src/plugins/visualize/public/application/components/visualize_editor.tsx b/src/plugins/visualize/public/application/components/visualize_editor.tsx index 546738bf36c3f..e81a886cee5a1 100644 --- a/src/plugins/visualize/public/application/components/visualize_editor.tsx +++ b/src/plugins/visualize/public/application/components/visualize_editor.tsx @@ -57,8 +57,11 @@ export const VisualizeEditor = ({ onAppLeave }: VisualizeAppProps) => { useEffect(() => { const { stateTransferService, data } = services; - const { originatingApp: value, searchSessionId, embeddableId } = - stateTransferService.getIncomingEditorState(VisualizeConstants.APP_ID) || {}; + const { + originatingApp: value, + searchSessionId, + embeddableId, + } = stateTransferService.getIncomingEditorState(VisualizeConstants.APP_ID) || {}; if (searchSessionId) { data.search.session.continue(searchSessionId); diff --git a/src/plugins/visualize/public/application/utils/create_visualize_app_state.test.ts b/src/plugins/visualize/public/application/utils/create_visualize_app_state.test.ts index 3711a0d945f99..0474e60cea676 100644 --- a/src/plugins/visualize/public/application/utils/create_visualize_app_state.test.ts +++ b/src/plugins/visualize/public/application/utils/create_visualize_app_state.test.ts @@ -28,10 +28,10 @@ jest.mock('./migrate_app_state', () => ({ const { createStateContainer, syncState } = jest.requireMock('../../../../kibana_utils/public'); describe('createVisualizeAppState', () => { - const kbnUrlStateStorage = ({ + const kbnUrlStateStorage = { set: jest.fn(), get: jest.fn(() => ({ linked: false })), - } as unknown) as IKbnUrlStateStorage; + } as unknown as IKbnUrlStateStorage; const { stateContainer, stopStateSync } = createVisualizeAppState({ stateDefaults: visualizeAppStateStub, diff --git a/src/plugins/visualize/public/application/utils/create_visualize_app_state.ts b/src/plugins/visualize/public/application/utils/create_visualize_app_state.ts index 10c573090da34..9e6ab5b1d7fc1 100644 --- a/src/plugins/visualize/public/application/utils/create_visualize_app_state.ts +++ b/src/plugins/visualize/public/application/utils/create_visualize_app_state.ts @@ -39,12 +39,14 @@ const pureTransitions = { ...vis, }, }), - unlinkSavedSearch: (state) => ({ query, parentFilters = [] }) => ({ - ...state, - query: query || state.query, - filters: union(state.filters, parentFilters), - linked: false, - }), + unlinkSavedSearch: + (state) => + ({ query, parentFilters = [] }) => ({ + ...state, + query: query || state.query, + filters: union(state.filters, parentFilters), + linked: false, + }), updateVisState: (state) => (newVisState) => ({ ...state, vis: toObject(newVisState) }), updateSavedQuery: (state) => (savedQueryId) => { const updatedState = { diff --git a/src/plugins/visualize/public/application/utils/get_top_nav_config.tsx b/src/plugins/visualize/public/application/utils/get_top_nav_config.tsx index a4421d9535c71..0dc37ca00a6aa 100644 --- a/src/plugins/visualize/public/application/utils/get_top_nav_config.tsx +++ b/src/plugins/visualize/public/application/utils/get_top_nav_config.tsx @@ -64,7 +64,7 @@ const SavedObjectSaveModalDashboard = withSuspense(LazySavedObjectSaveModalDashb export const showPublicUrlSwitch = (anonymousUserCapabilities: Capabilities) => { if (!anonymousUserCapabilities.visualize) return false; - const visualize = (anonymousUserCapabilities.visualize as unknown) as VisualizeCapabilities; + const visualize = anonymousUserCapabilities.visualize as unknown as VisualizeCapabilities; return !!visualize.show; }; diff --git a/src/plugins/visualize/public/application/utils/get_visualization_instance.test.ts b/src/plugins/visualize/public/application/utils/get_visualization_instance.test.ts index 4b00a15789631..83462ba9ae7b9 100644 --- a/src/plugins/visualize/public/application/utils/get_visualization_instance.test.ts +++ b/src/plugins/visualize/public/application/utils/get_visualization_instance.test.ts @@ -152,7 +152,7 @@ describe('getVisualizationInstanceInput', () => { }); test('should create new instances of savedVis, vis and embeddableHandler', async () => { - const input = ({ + const input = { id: 'test-id', savedVis: { title: '', @@ -179,13 +179,9 @@ describe('getVisualizationInstanceInput', () => { }, }, }, - } as unknown) as VisualizeInput; - const { - savedVis, - savedSearch, - vis, - embeddableHandler, - } = await getVisualizationInstanceFromInput(mockServices, input); + } as unknown as VisualizeInput; + const { savedVis, savedSearch, vis, embeddableHandler } = + await getVisualizationInstanceFromInput(mockServices, input); expect(mockServices.savedVisualizations.get).toHaveBeenCalled(); expect(mockServices.visualizations.createVis).toHaveBeenCalledWith( diff --git a/src/plugins/visualize/public/application/utils/get_visualization_instance.ts b/src/plugins/visualize/public/application/utils/get_visualization_instance.ts index 8898076d7ddbd..88797ce264e25 100644 --- a/src/plugins/visualize/public/application/utils/get_visualization_instance.ts +++ b/src/plugins/visualize/public/application/utils/get_visualization_instance.ts @@ -33,12 +33,8 @@ const createVisualizeEmbeddableAndLinkSavedSearch = async ( vis: Vis, visualizeServices: VisualizeServices ) => { - const { - data, - createVisEmbeddableFromObject, - savedObjects, - savedObjectsPublic, - } = visualizeServices; + const { data, createVisEmbeddableFromObject, savedObjects, savedObjectsPublic } = + visualizeServices; const embeddableHandler = (await createVisEmbeddableFromObject(vis, { id: '', timeRange: data.query.timefilter.timefilter.getTime(), @@ -49,7 +45,7 @@ const createVisualizeEmbeddableAndLinkSavedSearch = async ( embeddableHandler.getOutput$().subscribe((output) => { if (output.error && !isErrorRelatedToRuntimeFields(output.error)) { data.search.showError( - ((output.error as unknown) as ExpressionValueError['error']).original || output.error + (output.error as unknown as ExpressionValueError['error']).original || output.error ); } }); diff --git a/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.test.ts b/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.test.ts index 8a7bc33001d5f..e138acf2e9e85 100644 --- a/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.test.ts +++ b/src/plugins/visualize/public/application/utils/get_visualize_list_item_link.test.ts @@ -21,11 +21,11 @@ jest.mock('../../services', () => { }; }); -const application = ({ +const application = { getUrlForApp: jest.fn((appId: string, options?: { path?: string; absolute?: boolean }) => { return `/app/${appId}${options?.path}`; }), -} as unknown) as ApplicationStart; +} as unknown as ApplicationStart; const history = createHashHistory(); const kbnUrlStateStorage = createKbnUrlStateStorage({ diff --git a/src/plugins/visualize/public/application/utils/mocks.ts b/src/plugins/visualize/public/application/utils/mocks.ts index fc73ca1e68419..a7029071851ca 100644 --- a/src/plugins/visualize/public/application/utils/mocks.ts +++ b/src/plugins/visualize/public/application/utils/mocks.ts @@ -17,7 +17,7 @@ export const createVisualizeServicesMock = () => { const toastNotifications = coreStartMock.notifications.toasts; const visualizations = visualizationsPluginMock.createStartContract(); - return ({ + return { ...coreStartMock, data: dataStartMock, toastNotifications, @@ -28,5 +28,5 @@ export const createVisualizeServicesMock = () => { visualizations, savedVisualizations: visualizations.savedVisualizationsLoader, createVisEmbeddableFromObject: visualizations.__LEGACY.createVisEmbeddableFromObject, - } as unknown) as jest.Mocked; + } as unknown as jest.Mocked; }; diff --git a/src/plugins/visualize/public/application/utils/use/use_editor_updates.test.ts b/src/plugins/visualize/public/application/utils/use/use_editor_updates.test.ts index b3e70043ec692..9e1cfe60caa3c 100644 --- a/src/plugins/visualize/public/application/utils/use/use_editor_updates.test.ts +++ b/src/plugins/visualize/public/application/utils/use/use_editor_updates.test.ts @@ -55,14 +55,14 @@ describe('useEditorUpdates', () => { beforeEach(() => { unsubscribeStateUpdatesMock = jest.fn(); - appState = ({ + appState = { getState: jest.fn(() => visualizeAppStateStub), subscribe: jest.fn(() => unsubscribeStateUpdatesMock), transitions: { set: jest.fn(), }, - } as unknown) as VisualizeAppStateContainer; - savedVisInstance = ({ + } as unknown as VisualizeAppStateContainer; + savedVisInstance = { vis: { uiState: { on: jest.fn(), @@ -80,7 +80,7 @@ describe('useEditorUpdates', () => { reload: jest.fn(), }, savedVis: {}, - } as unknown) as SavedVisInstance; + } as unknown as SavedVisInstance; visEditorController = { render: jest.fn(), destroy: jest.fn(), diff --git a/src/plugins/visualize/public/application/utils/use/use_linked_search_updates.test.ts b/src/plugins/visualize/public/application/utils/use/use_linked_search_updates.test.ts index 7b0ecdc11d343..71b2aeaf3ebe5 100644 --- a/src/plugins/visualize/public/application/utils/use/use_linked_search_updates.test.ts +++ b/src/plugins/visualize/public/application/utils/use/use_linked_search_updates.test.ts @@ -16,7 +16,7 @@ import { createVisualizeServicesMock } from '../mocks'; describe('useLinkedSearchUpdates', () => { let mockServices: jest.Mocked; const eventEmitter = new EventEmitter(); - const savedVisInstance = ({ + const savedVisInstance = { vis: { data: { searchSource: { setField: jest.fn(), setParent: jest.fn() }, @@ -24,7 +24,7 @@ describe('useLinkedSearchUpdates', () => { }, savedVis: {}, embeddableHandler: {}, - } as unknown) as SavedVisInstance; + } as unknown as SavedVisInstance; beforeEach(() => { mockServices = createVisualizeServicesMock(); @@ -37,19 +37,19 @@ describe('useLinkedSearchUpdates', () => { }); it('should subscribe on unlinkFromSavedSearch event if vis is based on saved search', () => { - const mockAppState = ({ + const mockAppState = { transitions: { unlinkSavedSearch: jest.fn(), }, - } as unknown) as VisualizeAppStateContainer; - savedVisInstance.savedSearch = ({ + } as unknown as VisualizeAppStateContainer; + savedVisInstance.savedSearch = { searchSource: { getParent: jest.fn(), getField: jest.fn(), getOwnField: jest.fn(), }, title: 'savedSearch', - } as unknown) as SavedVisInstance['savedSearch']; + } as unknown as SavedVisInstance['savedSearch']; renderHook(() => useLinkedSearchUpdates(mockServices, eventEmitter, mockAppState, savedVisInstance) diff --git a/src/plugins/visualize/public/application/utils/use/use_saved_vis_instance.test.ts b/src/plugins/visualize/public/application/utils/use/use_saved_vis_instance.test.ts index 6a597ecc45365..b142f3fcd4061 100644 --- a/src/plugins/visualize/public/application/utils/use/use_saved_vis_instance.test.ts +++ b/src/plugins/visualize/public/application/utils/use/use_saved_vis_instance.test.ts @@ -55,8 +55,9 @@ jest.mock('../../../../../kibana_utils/public', () => { }; }); -const mockGetVisualizationInstance = jest.requireMock('../get_visualization_instance') - .getVisualizationInstance; +const mockGetVisualizationInstance = jest.requireMock( + '../get_visualization_instance' +).getVisualizationInstance; describe('useSavedVisInstance', () => { const coreStartMock = coreMock.createStart(); @@ -73,7 +74,7 @@ describe('useSavedVisInstance', () => { setVisEditorsRegistry(registry); - mockServices = ({ + mockServices = { ...coreStartMock, toastNotifications, stateTransferService: createEmbeddableStateTransferMock(), @@ -97,7 +98,7 @@ describe('useSavedVisInstance', () => { { name: 'gauge' }, ]), }, - } as unknown) as VisualizeServices; + } as unknown as VisualizeServices; mockDefaultEditorControllerDestroy.mockClear(); mockEmbeddableHandlerDestroy.mockClear(); diff --git a/src/plugins/visualize/public/application/utils/use/use_visualize_app_state.test.ts b/src/plugins/visualize/public/application/utils/use/use_visualize_app_state.test.ts index 26f866d22ce4e..10b23a27ef326 100644 --- a/src/plugins/visualize/public/application/utils/use/use_visualize_app_state.test.ts +++ b/src/plugins/visualize/public/application/utils/use/use_visualize_app_state.test.ts @@ -44,14 +44,14 @@ describe('useVisualizeAppState', () => { connectToQueryState.mockImplementation(() => stopSyncingAppFiltersMock); const eventEmitter = new EventEmitter(); - const savedVisInstance = ({ + const savedVisInstance = { vis: { setState: jest.fn().mockResolvedValue({}), data: {}, }, savedVis: {}, embeddableHandler: {}, - } as unknown) as SavedVisInstance; + } as unknown as SavedVisInstance; let mockServices: jest.Mocked; beforeEach(() => { diff --git a/src/plugins/visualize/public/plugin.ts b/src/plugins/visualize/public/plugin.ts index d71e7fd81f1d9..aef131ce8d530 100644 --- a/src/plugins/visualize/public/plugin.ts +++ b/src/plugins/visualize/public/plugin.ts @@ -81,7 +81,8 @@ export class VisualizePlugin void, VisualizePluginSetupDependencies, VisualizePluginStartDependencies - > { + > +{ private appStateUpdater = new BehaviorSubject(() => ({})); private stopUrlTracking: (() => void) | undefined = undefined; private currentHistory: ScopedHistory | undefined = undefined; diff --git a/src/plugins/visualize/public/services.ts b/src/plugins/visualize/public/services.ts index 8b8f98e9a15ed..7efb054fc636a 100644 --- a/src/plugins/visualize/public/services.ts +++ b/src/plugins/visualize/public/services.ts @@ -13,11 +13,8 @@ import type { UsageCollectionStart } from '../../usage_collection/public'; export const [getUISettings, setUISettings] = createGetterSetter('UISettings'); -export const [getUsageCollector, setUsageCollector] = createGetterSetter( - 'UsageCollection' -); +export const [getUsageCollector, setUsageCollector] = + createGetterSetter('UsageCollection'); -export const [ - getVisEditorsRegistry, - setVisEditorsRegistry, -] = createGetterSetter('VisEditorsRegistry'); +export const [getVisEditorsRegistry, setVisEditorsRegistry] = + createGetterSetter('VisEditorsRegistry'); diff --git a/test/accessibility/apps/management.ts b/test/accessibility/apps/management.ts index 69b799cc3b9e7..0f65a3561c4a0 100644 --- a/test/accessibility/apps/management.ts +++ b/test/accessibility/apps/management.ts @@ -65,7 +65,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.settings.setCustomLabel('custom label'); await testSubjects.click('toggleAdvancedSetting'); // Let's make sure the field preview is visible before testing the snapshot - const isFieldPreviewVisible = await PageObjects.indexPatternFieldEditorObjects.isFieldPreviewVisible(); + const isFieldPreviewVisible = + await PageObjects.indexPatternFieldEditorObjects.isFieldPreviewVisible(); expect(isFieldPreviewVisible).to.be(true); await a11y.testAppSnapshot(); diff --git a/test/api_integration/apis/saved_objects_management/find.ts b/test/api_integration/apis/saved_objects_management/find.ts index 6e36303cc1fe0..f3f4b56cdccf5 100644 --- a/test/api_integration/apis/saved_objects_management/find.ts +++ b/test/api_integration/apis/saved_objects_management/find.ts @@ -255,8 +255,7 @@ export default function ({ getService }: FtrProviderContext) { editUrl: '/management/kibana/indexPatterns/patterns/8963ca30-3224-11e8-a572-ffca06da1357', inAppUrl: { - path: - '/app/management/kibana/indexPatterns/patterns/8963ca30-3224-11e8-a572-ffca06da1357', + path: '/app/management/kibana/indexPatterns/patterns/8963ca30-3224-11e8-a572-ffca06da1357', uiCapabilitiesPath: 'management.kibana.indexPatterns', }, namespaceType: 'single', diff --git a/test/api_integration/apis/saved_objects_management/relationships.ts b/test/api_integration/apis/saved_objects_management/relationships.ts index aa488942edbeb..5fbd5cad8ec84 100644 --- a/test/api_integration/apis/saved_objects_management/relationships.ts +++ b/test/api_integration/apis/saved_objects_management/relationships.ts @@ -89,8 +89,7 @@ export default function ({ getService }: FtrProviderContext) { editUrl: '/management/kibana/indexPatterns/patterns/8963ca30-3224-11e8-a572-ffca06da1357', inAppUrl: { - path: - '/app/management/kibana/indexPatterns/patterns/8963ca30-3224-11e8-a572-ffca06da1357', + path: '/app/management/kibana/indexPatterns/patterns/8963ca30-3224-11e8-a572-ffca06da1357', uiCapabilitiesPath: 'management.kibana.indexPatterns', }, namespaceType: 'single', @@ -134,8 +133,7 @@ export default function ({ getService }: FtrProviderContext) { editUrl: '/management/kibana/indexPatterns/patterns/8963ca30-3224-11e8-a572-ffca06da1357', inAppUrl: { - path: - '/app/management/kibana/indexPatterns/patterns/8963ca30-3224-11e8-a572-ffca06da1357', + path: '/app/management/kibana/indexPatterns/patterns/8963ca30-3224-11e8-a572-ffca06da1357', uiCapabilitiesPath: 'management.kibana.indexPatterns', }, namespaceType: 'single', diff --git a/test/common/services/saved_object_info/saved_object_info.ts b/test/common/services/saved_object_info/saved_object_info.ts index 2084ff8e9f4f3..61472ea98d879 100644 --- a/test/common/services/saved_object_info/saved_object_info.ts +++ b/test/common/services/saved_object_info/saved_object_info.ts @@ -16,8 +16,10 @@ import { ToolingLog } from '@kbn/dev-utils'; import { FtrService } from '../../ftr_provider_context'; import { print } from './utils'; -const pluck = (key: string) => (obj: any): Either => - fromNullable(new Error(`Missing ${key}`))(obj[key]); +const pluck = + (key: string) => + (obj: any): Either => + fromNullable(new Error(`Missing ${key}`))(obj[key]); const query = { aggs: { @@ -29,29 +31,31 @@ const query = { }, }; -export const types = (node: string) => async (index: string = '.kibana') => - await pipe( - TE.tryCatch( - async () => { - const { body } = await new Client({ node }).search({ - index, - size: 0, - body: query, - }); - return body; - }, - (reason: any) => toError(reason) - ), - TE.map((resp: any) => - flow( - pluck('aggregations'), - chain(pluck('savedobjs')), - chain(pluck('buckets')), - getOrElse((err: Error) => err.message) - )(resp) - ), - TE.fold((x) => T.of(`Error while searching for saved object types: ${x}`), T.of) - )(); +export const types = + (node: string) => + async (index: string = '.kibana') => + await pipe( + TE.tryCatch( + async () => { + const { body } = await new Client({ node }).search({ + index, + size: 0, + body: query, + }); + return body; + }, + (reason: any) => toError(reason) + ), + TE.map((resp: any) => + flow( + pluck('aggregations'), + chain(pluck('savedobjs')), + chain(pluck('buckets')), + getOrElse((err: Error) => err.message) + )(resp) + ), + TE.fold((x) => T.of(`Error while searching for saved object types: ${x}`), T.of) + )(); export class SavedObjectInfoService extends FtrService { private readonly config = this.ctx.getService('config'); diff --git a/test/common/services/saved_object_info/utils.ts b/test/common/services/saved_object_info/utils.ts index 658803560eb6d..64b39e5ebeede 100644 --- a/test/common/services/saved_object_info/utils.ts +++ b/test/common/services/saved_object_info/utils.ts @@ -33,10 +33,11 @@ export const areValid = (flags: any) => { return true; }; -export const print = (log: ToolingLog) => (msg: string | null = null) => ({ - xs, - count, -}: ResolvedPayload) => log.write(`\n### Saved Object Types ${msg || 'Count: ' + count}\n${xs}`); +export const print = + (log: ToolingLog) => + (msg: string | null = null) => + ({ xs, count }: ResolvedPayload) => + log.write(`\n### Saved Object Types ${msg || 'Count: ' + count}\n${xs}`); export const expectedFlags = () => ({ string: ['esUrl'], diff --git a/test/examples/field_formats/index.ts b/test/examples/field_formats/index.ts index 82f66aed3b299..bbef5cca2e447 100644 --- a/test/examples/field_formats/index.ts +++ b/test/examples/field_formats/index.ts @@ -22,18 +22,18 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('renders field formats example 1', async () => { const formattedValues = await Promise.all( - (await testSubjects.findAll('example1 sample formatted')).map((wrapper) => - wrapper.getVisibleText() - ) + ( + await testSubjects.findAll('example1 sample formatted') + ).map((wrapper) => wrapper.getVisibleText()) ); expect(formattedValues).to.eql(['1000.00B', '97.66KB', '95.37MB']); }); it('renders field formats example 2', async () => { const formattedValues = await Promise.all( - (await testSubjects.findAll('example2 sample formatted')).map((wrapper) => - wrapper.getVisibleText() - ) + ( + await testSubjects.findAll('example2 sample formatted') + ).map((wrapper) => wrapper.getVisibleText()) ); expect(formattedValues).to.eql(['$1,000.00', '$100,000.00', '$100,000,000.00']); }); diff --git a/test/functional/apps/discover/_discover.ts b/test/functional/apps/discover/_discover.ts index 4704f75f34289..7bc5c57e086b0 100644 --- a/test/functional/apps/discover/_discover.ts +++ b/test/functional/apps/discover/_discover.ts @@ -230,10 +230,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async () => { await PageObjects.discover.loadSavedSearch(expected.title); - const { - title, - description, - } = await PageObjects.common.getSharedItemTitleAndDescription(); + const { title, description } = + await PageObjects.common.getSharedItemTitleAndDescription(); expect(title).to.eql(expected.title); expect(description).to.eql(expected.description); }); diff --git a/test/functional/apps/management/_field_formatter.ts b/test/functional/apps/management/_field_formatter.ts index e070b262af9ed..2377e714418ee 100644 --- a/test/functional/apps/management/_field_formatter.ts +++ b/test/functional/apps/management/_field_formatter.ts @@ -491,9 +491,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { ( await Promise.all( ( - await (await testSubjects.find('editorSelectedFormatId')).findAllByTagName( - 'option' - ) + await ( + await testSubjects.find('editorSelectedFormatId') + ).findAllByTagName('option') ).map((option) => option.getAttribute('value')) ) ).filter(Boolean) diff --git a/test/functional/apps/management/_handle_version_conflict.js b/test/functional/apps/management/_handle_version_conflict.js index f73489a5185b5..89426805bd503 100644 --- a/test/functional/apps/management/_handle_version_conflict.js +++ b/test/functional/apps/management/_handle_version_conflict.js @@ -71,9 +71,9 @@ export default function ({ getService, getPageObjects }) { await PageObjects.settings.openControlsByName(fieldName); log.debug('controls are open'); await ( - await (await testSubjects.find('formatRow')).findAllByCssSelector( - '[data-test-subj="toggle"]' - ) + await ( + await testSubjects.find('formatRow') + ).findAllByCssSelector('[data-test-subj="toggle"]') )[0].click(); await PageObjects.settings.setFieldFormat('url'); const response = await es.update({ diff --git a/test/functional/apps/visualize/_area_chart.ts b/test/functional/apps/visualize/_area_chart.ts index 4e4fe5e2902b9..2a5be39403002 100644 --- a/test/functional/apps/visualize/_area_chart.ts +++ b/test/functional/apps/visualize/_area_chart.ts @@ -103,30 +103,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { ]; const yAxisLabels = ['0', '200', '400', '600', '800', '1,000', '1,200', '1,400']; const expectedAreaChartData = [ - 37, - 202, - 740, - 1437, - 1371, - 751, - 188, - 31, - 42, - 202, - 683, - 1361, - 1415, - 707, - 177, - 27, - 32, - 175, - 707, - 1408, - 1355, - 726, - 201, - 29, + 37, 202, 740, 1437, 1371, 751, 188, 31, 42, 202, 683, 1361, 1415, 707, 177, 27, 32, 175, + 707, 1408, 1355, 726, 201, 29, ]; await retry.try(async function tryingForTime() { diff --git a/test/functional/apps/visualize/_point_series_options.ts b/test/functional/apps/visualize/_point_series_options.ts index 0d68ea4984ec2..dbe26ba099590 100644 --- a/test/functional/apps/visualize/_point_series_options.ts +++ b/test/functional/apps/visualize/_point_series_options.ts @@ -71,56 +71,14 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should show correct chart', async function () { const expectedChartValues = [ [ - 37, - 202, - 740, - 1437, - 1371, - 751, - 188, - 31, - 42, - 202, - 683, - 1361, - 1415, - 707, - 177, - 27, - 32, - 175, - 707, - 1408, - 1355, - 726, - 201, - 29, + 37, 202, 740, 1437, 1371, 751, 188, 31, 42, 202, 683, 1361, 1415, 707, 177, 27, 32, 175, + 707, 1408, 1355, 726, 201, 29, ], [ - 14018300000, - 13284800000, - 13198800000, - 13093400000, - 13067800000, - 12976600000, - 13561800000, - 14339600000, - 14011000000, - 12775300000, - 13304500000, - 12988900000, - 13143500000, - 13244400000, - 12154800000, - 15907300000, - 13757300000, - 13022200000, - 12807300000, - 13375700000, - 13190800000, - 12627500000, - 12731500000, - 13153300000, + 14018300000, 13284800000, 13198800000, 13093400000, 13067800000, 12976600000, + 13561800000, 14339600000, 14011000000, 12775300000, 13304500000, 12988900000, + 13143500000, 13244400000, 12154800000, 15907300000, 13757300000, 13022200000, + 12807300000, 13375700000, 13190800000, 12627500000, 12731500000, 13153300000, ], ]; diff --git a/test/functional/apps/visualize/_tag_cloud.ts b/test/functional/apps/visualize/_tag_cloud.ts index d18c85f3b58be..9380f40e0d36c 100644 --- a/test/functional/apps/visualize/_tag_cloud.ts +++ b/test/functional/apps/visualize/_tag_cloud.ts @@ -148,9 +148,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.settings.filterField(termsField); await PageObjects.settings.openControlsByName(termsField); await ( - await (await testSubjects.find('formatRow')).findAllByCssSelector( - '[data-test-subj="toggle"]' - ) + await ( + await testSubjects.find('formatRow') + ).findAllByCssSelector('[data-test-subj="toggle"]') )[0].click(); await PageObjects.settings.setFieldFormat('bytes'); await PageObjects.settings.controlChangeSave(); diff --git a/test/functional/apps/visualize/_vertical_bar_chart.ts b/test/functional/apps/visualize/_vertical_bar_chart.ts index 93022b5d2f0e8..7c4f989724ad9 100644 --- a/test/functional/apps/visualize/_vertical_bar_chart.ts +++ b/test/functional/apps/visualize/_vertical_bar_chart.ts @@ -116,30 +116,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should show correct chart', async function () { const expectedChartValues = [ - 37, - 202, - 740, - 1437, - 1371, - 751, - 188, - 31, - 42, - 202, - 683, - 1361, - 1415, - 707, - 177, - 27, - 32, - 175, - 707, - 1408, - 1355, - 726, - 201, - 29, + 37, 202, 740, 1437, 1371, 751, 188, 31, 42, 202, 683, 1361, 1415, 707, 177, 27, 32, 175, + 707, 1408, 1355, 726, 201, 29, ]; // Most recent failure on Jenkins usually indicates the bar chart is still being drawn? @@ -190,67 +168,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.timePicker.setAbsoluteRange(fromTime, toTime); let expectedChartValues = [ - 82, - 218, - 341, - 440, - 480, - 517, - 522, - 446, - 403, - 321, - 258, - 172, - 95, - 55, - 38, - 24, - 3, - 4, - 11, - 14, - 17, - 38, - 49, - 115, - 152, - 216, - 315, - 402, - 446, - 513, - 520, - 474, - 421, - 307, - 230, - 170, - 99, - 48, - 30, - 15, - 10, - 2, - 8, - 7, - 17, - 34, - 37, - 104, - 153, - 241, - 313, - 404, - 492, - 512, - 503, - 473, - 379, - 293, - 277, - 156, - 56, + 82, 218, 341, 440, 480, 517, 522, 446, 403, 321, 258, 172, 95, 55, 38, 24, 3, 4, 11, 14, 17, + 38, 49, 115, 152, 216, 315, 402, 446, 513, 520, 474, 421, 307, 230, 170, 99, 48, 30, 15, 10, + 2, 8, 7, 17, 34, 37, 104, 153, 241, 313, 404, 492, 512, 503, 473, 379, 293, 277, 156, 56, ]; // Most recent failure on Jenkins usually indicates the bar chart is still being drawn? @@ -268,65 +188,9 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await PageObjects.visEditor.clickGo(true); expectedChartValues = [ - 218, - 341, - 440, - 480, - 517, - 522, - 446, - 403, - 321, - 258, - 172, - 95, - 55, - 38, - 24, - 3, - 4, - 11, - 14, - 17, - 38, - 49, - 115, - 152, - 216, - 315, - 402, - 446, - 513, - 520, - 474, - 421, - 307, - 230, - 170, - 99, - 48, - 30, - 15, - 10, - 2, - 8, - 7, - 17, - 34, - 37, - 104, - 153, - 241, - 313, - 404, - 492, - 512, - 503, - 473, - 379, - 293, - 277, - 156, + 218, 341, 440, 480, 517, 522, 446, 403, 321, 258, 172, 95, 55, 38, 24, 3, 4, 11, 14, 17, 38, + 49, 115, 152, 216, 315, 402, 446, 513, 520, 474, 421, 307, 230, 170, 99, 48, 30, 15, 10, 2, + 8, 7, 17, 34, 37, 104, 153, 241, 313, 404, 492, 512, 503, 473, 379, 293, 277, 156, ]; // Most recent failure on Jenkins usually indicates the bar chart is still being drawn? diff --git a/test/functional/apps/visualize/_vertical_bar_chart_nontimeindex.ts b/test/functional/apps/visualize/_vertical_bar_chart_nontimeindex.ts index e9f39a45d7892..eadc7c58af5a5 100644 --- a/test/functional/apps/visualize/_vertical_bar_chart_nontimeindex.ts +++ b/test/functional/apps/visualize/_vertical_bar_chart_nontimeindex.ts @@ -59,30 +59,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should show correct chart', async function () { const expectedChartValues = [ - 37, - 202, - 740, - 1437, - 1371, - 751, - 188, - 31, - 42, - 202, - 683, - 1361, - 1415, - 707, - 177, - 27, - 32, - 175, - 707, - 1408, - 1355, - 726, - 201, - 29, + 37, 202, 740, 1437, 1371, 751, 188, 31, 42, 202, 683, 1361, 1415, 707, 177, 27, 32, 175, + 707, 1408, 1355, 726, 201, 29, ]; // Most recent failure on Jenkins usually indicates the bar chart is still being drawn? diff --git a/test/functional/page_objects/visualize_editor_page.ts b/test/functional/page_objects/visualize_editor_page.ts index 50b275d04eabb..ce73208280114 100644 --- a/test/functional/page_objects/visualize_editor_page.ts +++ b/test/functional/page_objects/visualize_editor_page.ts @@ -413,9 +413,9 @@ export class VisualizeEditorPageObject extends FtrService { } public async selectXAxisPosition(position: string) { - const option = await (await this.testSubjects.find('categoryAxisPosition')).findByCssSelector( - `option[value="${position}"]` - ); + const option = await ( + await this.testSubjects.find('categoryAxisPosition') + ).findByCssSelector(`option[value="${position}"]`); await option.click(); } diff --git a/test/functional/services/field_editor.ts b/test/functional/services/field_editor.ts index 03f256051b78f..27cb8cf010d92 100644 --- a/test/functional/services/field_editor.ts +++ b/test/functional/services/field_editor.ts @@ -31,9 +31,9 @@ export class FieldEditorService extends FtrService { await this.testSubjects.setEuiSwitch('valueRow > toggle', 'uncheck'); } public async typeScript(script: string) { - const editor = await (await this.testSubjects.find('valueRow')).findByClassName( - 'react-monaco-editor-container' - ); + const editor = await ( + await this.testSubjects.find('valueRow') + ).findByClassName('react-monaco-editor-container'); const textarea = await editor.findByClassName('monaco-mouse-cursor-text'); await textarea.click(); diff --git a/test/functional/services/management/management_menu.ts b/test/functional/services/management/management_menu.ts index 2b93fce4daa51..46bd2368e9125 100644 --- a/test/functional/services/management/management_menu.ts +++ b/test/functional/services/management/management_menu.ts @@ -19,13 +19,13 @@ export class ManagementMenuService extends FtrService { const sections = []; for (const el of sectionsElements) { - const sectionId = await (await el.findByClassName('euiSideNavItemButton')).getAttribute( - 'data-test-subj' - ); + const sectionId = await ( + await el.findByClassName('euiSideNavItemButton') + ).getAttribute('data-test-subj'); const sectionLinks = await Promise.all( - (await el.findAllByCssSelector('.euiSideNavItem > a.euiSideNavItemButton')).map((item) => - item.getAttribute('data-test-subj') - ) + ( + await el.findAllByCssSelector('.euiSideNavItem > a.euiSideNavItemButton') + ).map((item) => item.getAttribute('data-test-subj')) ); sections.push({ sectionId, sectionLinks }); diff --git a/test/plugin_functional/plugins/core_plugin_appleave/public/plugin.tsx b/test/plugin_functional/plugins/core_plugin_appleave/public/plugin.tsx index 69011ac74cca9..0739c858307c8 100644 --- a/test/plugin_functional/plugins/core_plugin_appleave/public/plugin.tsx +++ b/test/plugin_functional/plugins/core_plugin_appleave/public/plugin.tsx @@ -9,7 +9,8 @@ import { Plugin, CoreSetup } from 'kibana/public'; export class CoreAppLeavePlugin - implements Plugin { + implements Plugin +{ public setup(core: CoreSetup, deps: {}) { core.application.register({ id: 'appleave1', diff --git a/test/plugin_functional/plugins/core_plugin_b/public/plugin.tsx b/test/plugin_functional/plugins/core_plugin_b/public/plugin.tsx index 5bab0275439df..2fbf57b2a7104 100644 --- a/test/plugin_functional/plugins/core_plugin_b/public/plugin.tsx +++ b/test/plugin_functional/plugins/core_plugin_b/public/plugin.tsx @@ -20,7 +20,8 @@ export interface CorePluginBDeps { } export class CorePluginBPlugin - implements Plugin { + implements Plugin +{ constructor(pluginContext: PluginInitializerContext) { window.env = pluginContext.env; } diff --git a/test/plugin_functional/plugins/core_plugin_chromeless/public/plugin.tsx b/test/plugin_functional/plugins/core_plugin_chromeless/public/plugin.tsx index 175bac128b7d7..47b33479e45ff 100644 --- a/test/plugin_functional/plugins/core_plugin_chromeless/public/plugin.tsx +++ b/test/plugin_functional/plugins/core_plugin_chromeless/public/plugin.tsx @@ -9,7 +9,8 @@ import { Plugin, CoreSetup } from 'kibana/public'; export class CorePluginChromelessPlugin - implements Plugin { + implements Plugin +{ public setup(core: CoreSetup, deps: {}) { core.application.register({ id: 'chromeless', diff --git a/test/plugin_functional/plugins/core_plugin_deep_links/public/plugin.tsx b/test/plugin_functional/plugins/core_plugin_deep_links/public/plugin.tsx index 48f11132ffb40..d53810d32c324 100644 --- a/test/plugin_functional/plugins/core_plugin_deep_links/public/plugin.tsx +++ b/test/plugin_functional/plugins/core_plugin_deep_links/public/plugin.tsx @@ -10,7 +10,8 @@ import { Plugin, CoreSetup } from 'kibana/public'; import { DEFAULT_APP_CATEGORIES, AppNavLinkStatus } from '../../../../../src/core/public'; export class CorePluginDeepLinksPlugin - implements Plugin { + implements Plugin +{ public setup(core: CoreSetup, deps: {}) { core.application.register({ id: 'deeplinks', diff --git a/test/plugin_functional/plugins/core_plugin_deprecations/public/plugin.tsx b/test/plugin_functional/plugins/core_plugin_deprecations/public/plugin.tsx index bf807145e14bf..1ae9b15be97d1 100644 --- a/test/plugin_functional/plugins/core_plugin_deprecations/public/plugin.tsx +++ b/test/plugin_functional/plugins/core_plugin_deprecations/public/plugin.tsx @@ -15,7 +15,8 @@ declare global { } export class CorePluginDeprecationsPlugin - implements Plugin { + implements Plugin +{ constructor(pluginContext: PluginInitializerContext) { window.env = pluginContext.env; } diff --git a/test/plugin_functional/plugins/core_plugin_helpmenu/public/plugin.tsx b/test/plugin_functional/plugins/core_plugin_helpmenu/public/plugin.tsx index ba710c4d869b2..15357639f155b 100644 --- a/test/plugin_functional/plugins/core_plugin_helpmenu/public/plugin.tsx +++ b/test/plugin_functional/plugins/core_plugin_helpmenu/public/plugin.tsx @@ -9,7 +9,8 @@ import { Plugin, CoreSetup } from 'kibana/public'; export class CoreHelpMenuPlugin - implements Plugin { + implements Plugin +{ public setup(core: CoreSetup, deps: {}) { core.application.register({ id: 'core_help_menu', diff --git a/test/plugin_functional/plugins/data_search/server/plugin.ts b/test/plugin_functional/plugins/data_search/server/plugin.ts index f6c83a53a805c..f2d1096425301 100644 --- a/test/plugin_functional/plugins/data_search/server/plugin.ts +++ b/test/plugin_functional/plugins/data_search/server/plugin.ts @@ -15,7 +15,8 @@ export interface DataSearchTestStartDeps { } export class DataSearchTestPlugin - implements Plugin { + implements Plugin +{ public setup(core: CoreSetup) { const router = core.http.createRouter(); diff --git a/test/plugin_functional/plugins/index_patterns/server/index.ts b/test/plugin_functional/plugins/index_patterns/server/index.ts index f776ad9a76224..10111fafe1b0f 100644 --- a/test/plugin_functional/plugins/index_patterns/server/index.ts +++ b/test/plugin_functional/plugins/index_patterns/server/index.ts @@ -13,7 +13,5 @@ import { IndexPatternsTestPluginStart, } from './plugin'; -export const plugin: PluginInitializer< - IndexPatternsTestPluginSetup, - IndexPatternsTestPluginStart -> = () => new IndexPatternsTestPlugin(); +export const plugin: PluginInitializer = + () => new IndexPatternsTestPlugin(); diff --git a/test/plugin_functional/plugins/index_patterns/server/plugin.ts b/test/plugin_functional/plugins/index_patterns/server/plugin.ts index 7314419576a31..1fe3326a6d1d2 100644 --- a/test/plugin_functional/plugins/index_patterns/server/plugin.ts +++ b/test/plugin_functional/plugins/index_patterns/server/plugin.ts @@ -21,7 +21,8 @@ export class IndexPatternsTestPlugin IndexPatternsTestPluginStart, {}, IndexPatternsTestStartDeps - > { + > +{ public setup(core: CoreSetup) { const router = core.http.createRouter(); diff --git a/test/plugin_functional/plugins/kbn_sample_panel_action/public/plugin.ts b/test/plugin_functional/plugins/kbn_sample_panel_action/public/plugin.ts index 4d3579ca9ba1e..b1ff7ba4ee7ff 100644 --- a/test/plugin_functional/plugins/kbn_sample_panel_action/public/plugin.ts +++ b/test/plugin_functional/plugins/kbn_sample_panel_action/public/plugin.ts @@ -13,7 +13,8 @@ import { createSamplePanelAction } from './sample_panel_action'; import { createSamplePanelLink } from './sample_panel_link'; export class SampelPanelActionTestPlugin - implements Plugin { + implements Plugin +{ public setup(core: CoreSetup, { uiActions }: { uiActions: UiActionsSetup }) { const samplePanelAction = createSamplePanelAction(core.getStartServices); const samplePanelLink = createSamplePanelLink(); diff --git a/test/plugin_functional/plugins/kbn_tp_custom_visualizations/public/plugin.ts b/test/plugin_functional/plugins/kbn_tp_custom_visualizations/public/plugin.ts index df676b28e5dbc..b1f1cec78bd64 100644 --- a/test/plugin_functional/plugins/kbn_tp_custom_visualizations/public/plugin.ts +++ b/test/plugin_functional/plugins/kbn_tp_custom_visualizations/public/plugin.ts @@ -21,7 +21,8 @@ export interface SetupDependencies { } export class CustomVisualizationsPublicPlugin - implements Plugin { + implements Plugin +{ public setup(core: CoreSetup, { expressions, visualizations }: SetupDependencies) { /** * Register an expression function with type "render" for your visualization diff --git a/test/plugin_functional/plugins/kbn_tp_custom_visualizations/public/self_changing_vis_fn.ts b/test/plugin_functional/plugins/kbn_tp_custom_visualizations/public/self_changing_vis_fn.ts index 21f937c07ac06..6176173e24717 100644 --- a/test/plugin_functional/plugins/kbn_tp_custom_visualizations/public/self_changing_vis_fn.ts +++ b/test/plugin_functional/plugins/kbn_tp_custom_visualizations/public/self_changing_vis_fn.ts @@ -32,8 +32,7 @@ export const selfChangingVisFn: SelfChangingVisExpressionFunctionDefinition = { name: 'self_changing_vis', type: 'render', inputTypes: ['kibana_context'], - help: - 'The expression function definition should be registered for a custom visualization to be rendered', + help: 'The expression function definition should be registered for a custom visualization to be rendered', args: { counter: { types: ['number'], diff --git a/test/plugin_functional/plugins/management_test_plugin/public/plugin.tsx b/test/plugin_functional/plugins/management_test_plugin/public/plugin.tsx index 67d54ce40b76f..a2cbe6aa5e48f 100644 --- a/test/plugin_functional/plugins/management_test_plugin/public/plugin.tsx +++ b/test/plugin_functional/plugins/management_test_plugin/public/plugin.tsx @@ -13,7 +13,8 @@ import { CoreSetup, Plugin } from 'kibana/public'; import { ManagementSetup } from '../../../../../src/plugins/management/public'; export class ManagementTestPlugin - implements Plugin { + implements Plugin +{ public setup(core: CoreSetup, { management }: { management: ManagementSetup }) { const testSection = management.sections.section.data; diff --git a/test/plugin_functional/test_suites/core/deprecations.ts b/test/plugin_functional/test_suites/core/deprecations.ts index 25ac5f24a97c9..dbaf10008e35e 100644 --- a/test/plugin_functional/test_suites/core/deprecations.ts +++ b/test/plugin_functional/test_suites/core/deprecations.ts @@ -254,11 +254,9 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide const { deprecations } = await supertest .get('/api/deprecations/') .set('kbn-xsrf', 'true') - .then( - ({ body }): Promise => { - return body; - } - ); + .then(({ body }): Promise => { + return body; + }); const deprecation = deprecations.find( ({ message }) => message === 'SavedObject test-deprecations-plugin is still being used.' diff --git a/test/plugin_functional/test_suites/saved_objects_management/export_transform.ts b/test/plugin_functional/test_suites/saved_objects_management/export_transform.ts index 8437e050091fb..90cb27e5babef 100644 --- a/test/plugin_functional/test_suites/saved_objects_management/export_transform.ts +++ b/test/plugin_functional/test_suites/saved_objects_management/export_transform.ts @@ -242,9 +242,9 @@ export default function ({ getService }: PluginFunctionalProviderContext) { .expect(200) .then((resp) => { const objects = parseNdJson(resp.text); - const exportDetails = (objects[ + const exportDetails = objects[ objects.length - 1 - ] as unknown) as SavedObjectsExportResultDetails; + ] as unknown as SavedObjectsExportResultDetails; expect(exportDetails.excludedObjectsCount).to.eql(2); expect(exportDetails.excludedObjects).to.eql([ @@ -287,9 +287,9 @@ export default function ({ getService }: PluginFunctionalProviderContext) { expect([objects[0]].map((obj) => `${obj.type}:${obj.id}`)).to.eql([ 'test-is-exportable:5', ]); - const exportDetails = (objects[ + const exportDetails = objects[ objects.length - 1 - ] as unknown) as SavedObjectsExportResultDetails; + ] as unknown as SavedObjectsExportResultDetails; expect(exportDetails.excludedObjects).to.eql([ { type: 'test-is-exportable', diff --git a/test/plugin_functional/test_suites/telemetry/telemetry.ts b/test/plugin_functional/test_suites/telemetry/telemetry.ts index 8ebc78c9b2f84..97db6593874ea 100644 --- a/test/plugin_functional/test_suites/telemetry/telemetry.ts +++ b/test/plugin_functional/test_suites/telemetry/telemetry.ts @@ -17,7 +17,7 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide describe('Telemetry service', () => { const checkCanSendTelemetry = (): Promise => { return browser.executeAsync((cb) => { - ((window as unknown) as Record Promise>) + (window as unknown as Record Promise>) ._checkCanSendTelemetry() .then(cb); }); @@ -26,7 +26,7 @@ export default function ({ getService, getPageObjects }: PluginFunctionalProvide after(async () => { await browser.removeLocalStorageItem(KBN_SCREENSHOT_MODE_ENABLED_KEY); await browser.executeAsync((cb) => { - ((window as unknown) as Record Promise>) + (window as unknown as Record Promise>) ._resetTelemetry() .then(() => cb()); }); diff --git a/x-pack/examples/alerting_example/public/components/create_alert.tsx b/x-pack/examples/alerting_example/public/components/create_alert.tsx index 889b0c7f2d7d6..de5ffbee64523 100644 --- a/x-pack/examples/alerting_example/public/components/create_alert.tsx +++ b/x-pack/examples/alerting_example/public/components/create_alert.tsx @@ -17,9 +17,10 @@ export const CreateAlert = ({ }: Pick) => { const [alertFlyoutVisible, setAlertFlyoutVisibility] = useState(false); - const onCloseAlertFlyout = useCallback(() => setAlertFlyoutVisibility(false), [ - setAlertFlyoutVisibility, - ]); + const onCloseAlertFlyout = useCallback( + () => setAlertFlyoutVisibility(false), + [setAlertFlyoutVisibility] + ); const AddAlertFlyout = useMemo( () => diff --git a/x-pack/examples/embedded_lens_example/public/app.tsx b/x-pack/examples/embedded_lens_example/public/app.tsx index 55f2b4ccd71e9..3921b3a51dc45 100644 --- a/x-pack/examples/embedded_lens_example/public/app.tsx +++ b/x-pack/examples/embedded_lens_example/public/app.tsx @@ -260,10 +260,10 @@ export const App = (props: { {isSaveModalVisible && ( {}} onClose={() => setIsSaveModalVisible(false)} diff --git a/x-pack/examples/embedded_lens_example/public/mount.tsx b/x-pack/examples/embedded_lens_example/public/mount.tsx index ff1e6ef8818f0..58ec363223270 100644 --- a/x-pack/examples/embedded_lens_example/public/mount.tsx +++ b/x-pack/examples/embedded_lens_example/public/mount.tsx @@ -10,26 +10,26 @@ import { render, unmountComponentAtNode } from 'react-dom'; import { CoreSetup, AppMountParameters } from 'kibana/public'; import { StartDependencies } from './plugin'; -export const mount = (coreSetup: CoreSetup) => async ({ - element, -}: AppMountParameters) => { - const [core, plugins] = await coreSetup.getStartServices(); - const { App } = await import('./app'); +export const mount = + (coreSetup: CoreSetup) => + async ({ element }: AppMountParameters) => { + const [core, plugins] = await coreSetup.getStartServices(); + const { App } = await import('./app'); - const deps = { - core, - plugins, - }; + const deps = { + core, + plugins, + }; - const defaultIndexPattern = await plugins.data.indexPatterns.getDefault(); + const defaultIndexPattern = await plugins.data.indexPatterns.getDefault(); - const i18nCore = core.i18n; + const i18nCore = core.i18n; - const reactElement = ( - - - - ); - render(reactElement, element); - return () => unmountComponentAtNode(element); -}; + const reactElement = ( + + + + ); + render(reactElement, element); + return () => unmountComponentAtNode(element); + }; diff --git a/x-pack/examples/embedded_lens_example/public/plugin.ts b/x-pack/examples/embedded_lens_example/public/plugin.ts index 4f454ffe5c3c3..991c506ed5796 100644 --- a/x-pack/examples/embedded_lens_example/public/plugin.ts +++ b/x-pack/examples/embedded_lens_example/public/plugin.ts @@ -21,7 +21,8 @@ export interface StartDependencies { } export class EmbeddedLensExamplePlugin - implements Plugin { + implements Plugin +{ public setup(core: CoreSetup, { developerExamples }: SetupDependencies) { core.application.register({ id: 'embedded_lens_example', @@ -38,8 +39,7 @@ export class EmbeddedLensExamplePlugin links: [ { label: 'README', - href: - 'https://github.com/elastic/kibana/tree/master/x-pack/examples/embedded_lens_example', + href: 'https://github.com/elastic/kibana/tree/master/x-pack/examples/embedded_lens_example', iconType: 'logoGithub', size: 's', target: '_blank', diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_hello_world_only_range_select_drilldown/index.tsx b/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_hello_world_only_range_select_drilldown/index.tsx index 81a6f6aa5e66f..c7c50fa6dc433 100644 --- a/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_hello_world_only_range_select_drilldown/index.tsx +++ b/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_hello_world_only_range_select_drilldown/index.tsx @@ -24,7 +24,8 @@ const SAMPLE_DASHBOARD_HELLO_WORLD_DRILLDOWN_ONLY_RANGE_SELECT = 'SAMPLE_DASHBOARD_HELLO_WORLD_DRILLDOWN_ONLY_RANGE_SELECT'; export class DashboardHelloWorldOnlyRangeSelectDrilldown - implements Drilldown { + implements Drilldown +{ public readonly id = SAMPLE_DASHBOARD_HELLO_WORLD_DRILLDOWN_ONLY_RANGE_SELECT; public readonly order = 7; diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_to_discover_drilldown/drilldown.tsx b/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_to_discover_drilldown/drilldown.tsx index bdaf7e43eaab2..d1482c55429f4 100644 --- a/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_to_discover_drilldown/drilldown.tsx +++ b/x-pack/examples/ui_actions_enhanced_examples/public/drilldowns/dashboard_to_discover_drilldown/drilldown.tsx @@ -31,7 +31,8 @@ export interface Params { } export class DashboardToDiscoverDrilldown - implements Drilldown { + implements Drilldown +{ constructor(protected readonly params: Params) {} public readonly id = SAMPLE_DASHBOARD_TO_DISCOVER_DRILLDOWN; diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/mount.tsx b/x-pack/examples/ui_actions_enhanced_examples/public/mount.tsx index 711649ed68f59..3fd42488b2839 100644 --- a/x-pack/examples/ui_actions_enhanced_examples/public/mount.tsx +++ b/x-pack/examples/ui_actions_enhanced_examples/public/mount.tsx @@ -11,29 +11,29 @@ import { CoreSetup, AppMountParameters } from 'kibana/public'; import { StartDependencies, UiActionsEnhancedExamplesStart } from './plugin'; import { UiActionsExampleAppContextValue, context } from './context'; -export const mount = ( - coreSetup: CoreSetup -) => async ({ appBasePath, element }: AppMountParameters) => { - const [ - core, - plugins, - { managerWithoutEmbeddable, managerWithoutEmbeddableSingleButton, managerWithEmbeddable }, - ] = await coreSetup.getStartServices(); - const { App } = await import('./containers/app'); +export const mount = + (coreSetup: CoreSetup) => + async ({ appBasePath, element }: AppMountParameters) => { + const [ + core, + plugins, + { managerWithoutEmbeddable, managerWithoutEmbeddableSingleButton, managerWithEmbeddable }, + ] = await coreSetup.getStartServices(); + const { App } = await import('./containers/app'); - const deps: UiActionsExampleAppContextValue = { - appBasePath, - core, - plugins, - managerWithoutEmbeddable, - managerWithoutEmbeddableSingleButton, - managerWithEmbeddable, + const deps: UiActionsExampleAppContextValue = { + appBasePath, + core, + plugins, + managerWithoutEmbeddable, + managerWithoutEmbeddableSingleButton, + managerWithEmbeddable, + }; + const reactElement = ( + + + + ); + render(reactElement, element); + return () => unmountComponentAtNode(element); }; - const reactElement = ( - - - - ); - render(reactElement, element); - return () => unmountComponentAtNode(element); -}; diff --git a/x-pack/examples/ui_actions_enhanced_examples/public/plugin.ts b/x-pack/examples/ui_actions_enhanced_examples/public/plugin.ts index 8496450745190..d41b18addcca4 100644 --- a/x-pack/examples/ui_actions_enhanced_examples/public/plugin.ts +++ b/x-pack/examples/ui_actions_enhanced_examples/public/plugin.ts @@ -58,7 +58,8 @@ export interface UiActionsEnhancedExamplesStart { } export class UiActionsEnhancedExamplesPlugin - implements Plugin { + implements Plugin +{ public setup( core: CoreSetup, { uiActionsEnhanced: uiActions, developerExamples }: SetupDependencies @@ -140,8 +141,7 @@ export class UiActionsEnhancedExamplesPlugin links: [ { label: 'README', - href: - 'https://github.com/elastic/kibana/tree/master/x-pack/examples/ui_actions_enhanced_examples#ui-actions-enhanced-examples', + href: 'https://github.com/elastic/kibana/tree/master/x-pack/examples/ui_actions_enhanced_examples#ui-actions-enhanced-examples', iconType: 'logoGithub', size: 's', target: '_blank', diff --git a/x-pack/plugins/actions/common/alert_history_schema.ts b/x-pack/plugins/actions/common/alert_history_schema.ts index e1c923ab23f44..71781c57fe392 100644 --- a/x-pack/plugins/actions/common/alert_history_schema.ts +++ b/x-pack/plugins/actions/common/alert_history_schema.ts @@ -12,7 +12,14 @@ export const AlertHistoryDefaultIndexName = `${ALERT_HISTORY_PREFIX}default`; export const AlertHistoryEsIndexConnectorId = 'preconfigured-alert-history-es-index'; export const buildAlertHistoryDocument = (variables: Record) => { - const { date, alert: alertVariables, context, params, tags, rule: ruleVariables } = variables as { + const { + date, + alert: alertVariables, + context, + params, + tags, + rule: ruleVariables, + } = variables as { date: string; alert: Record; context: Record; @@ -25,13 +32,22 @@ export const buildAlertHistoryDocument = (variables: Record) => return null; } - const { actionGroup, actionGroupName, id: alertId } = alertVariables as { + const { + actionGroup, + actionGroupName, + id: alertId, + } = alertVariables as { actionGroup: string; actionGroupName: string; id: string; }; - const { id: ruleId, name, spaceId, type } = ruleVariables as { + const { + id: ruleId, + name, + spaceId, + type, + } = ruleVariables as { id: string; name: string; spaceId: string; diff --git a/x-pack/plugins/actions/server/actions_client.test.ts b/x-pack/plugins/actions/server/actions_client.test.ts index 4a35b5c7dfbeb..a341cdf58b9e2 100644 --- a/x-pack/plugins/actions/server/actions_client.test.ts +++ b/x-pack/plugins/actions/server/actions_client.test.ts @@ -80,7 +80,7 @@ beforeEach(() => { executionEnqueuer, ephemeralExecutionEnqueuer, request, - authorization: (authorization as unknown) as ActionsAuthorization, + authorization: authorization as unknown as ActionsAuthorization, auditLogger, }); }); @@ -457,7 +457,7 @@ describe('create()', () => { executionEnqueuer, ephemeralExecutionEnqueuer, request, - authorization: (authorization as unknown) as ActionsAuthorization, + authorization: authorization as unknown as ActionsAuthorization, }); const savedObjectCreateResult = { @@ -558,7 +558,7 @@ describe('get()', () => { executionEnqueuer, ephemeralExecutionEnqueuer, request, - authorization: (authorization as unknown) as ActionsAuthorization, + authorization: authorization as unknown as ActionsAuthorization, preconfiguredActions: [ { id: 'testPreconfigured', @@ -614,7 +614,7 @@ describe('get()', () => { executionEnqueuer, ephemeralExecutionEnqueuer, request, - authorization: (authorization as unknown) as ActionsAuthorization, + authorization: authorization as unknown as ActionsAuthorization, preconfiguredActions: [ { id: 'testPreconfigured', @@ -731,7 +731,7 @@ describe('get()', () => { executionEnqueuer, ephemeralExecutionEnqueuer, request, - authorization: (authorization as unknown) as ActionsAuthorization, + authorization: authorization as unknown as ActionsAuthorization, preconfiguredActions: [ { id: 'testPreconfigured', @@ -801,7 +801,7 @@ describe('getAll()', () => { executionEnqueuer, ephemeralExecutionEnqueuer, request, - authorization: (authorization as unknown) as ActionsAuthorization, + authorization: authorization as unknown as ActionsAuthorization, preconfiguredActions: [ { id: 'testPreconfigured', @@ -939,7 +939,7 @@ describe('getAll()', () => { executionEnqueuer, ephemeralExecutionEnqueuer, request, - authorization: (authorization as unknown) as ActionsAuthorization, + authorization: authorization as unknown as ActionsAuthorization, preconfiguredActions: [ { id: 'testPreconfigured', @@ -1015,7 +1015,7 @@ describe('getBulk()', () => { executionEnqueuer, ephemeralExecutionEnqueuer, request, - authorization: (authorization as unknown) as ActionsAuthorization, + authorization: authorization as unknown as ActionsAuthorization, preconfiguredActions: [ { id: 'testPreconfigured', @@ -1147,7 +1147,7 @@ describe('getBulk()', () => { executionEnqueuer, ephemeralExecutionEnqueuer, request, - authorization: (authorization as unknown) as ActionsAuthorization, + authorization: authorization as unknown as ActionsAuthorization, preconfiguredActions: [ { id: 'testPreconfigured', @@ -1835,7 +1835,7 @@ describe('isPreconfigured()', () => { executionEnqueuer, ephemeralExecutionEnqueuer, request, - authorization: (authorization as unknown) as ActionsAuthorization, + authorization: authorization as unknown as ActionsAuthorization, preconfiguredActions: [ { id: 'testPreconfigured', @@ -1865,7 +1865,7 @@ describe('isPreconfigured()', () => { executionEnqueuer, ephemeralExecutionEnqueuer, request, - authorization: (authorization as unknown) as ActionsAuthorization, + authorization: authorization as unknown as ActionsAuthorization, preconfiguredActions: [ { id: 'testPreconfigured', diff --git a/x-pack/plugins/actions/server/actions_client.ts b/x-pack/plugins/actions/server/actions_client.ts index f1bedbe44ece8..d6f6037ecd8b8 100644 --- a/x-pack/plugins/actions/server/actions_client.ts +++ b/x-pack/plugins/actions/server/actions_client.ts @@ -208,11 +208,8 @@ export class ActionsClient { ); throw error; } - const { - attributes, - references, - version, - } = await this.unsecuredSavedObjectsClient.get('action', id); + const { attributes, references, version } = + await this.unsecuredSavedObjectsClient.get('action', id); const { actionTypeId } = attributes; const { name, config, secrets } = action; const actionType = this.actionTypeRegistry.get(actionTypeId); diff --git a/x-pack/plugins/actions/server/authorization/actions_authorization.test.ts b/x-pack/plugins/actions/server/authorization/actions_authorization.test.ts index 00807c07d6ff5..ddf0e126116a5 100644 --- a/x-pack/plugins/actions/server/authorization/actions_authorization.test.ts +++ b/x-pack/plugins/actions/server/authorization/actions_authorization.test.ts @@ -28,9 +28,11 @@ function mockSecurity() { const authorization = security.authz; const authentication = security.authc; // typescript is having trouble inferring jest's automocking - (authorization.actions.savedObject.get as jest.MockedFunction< - typeof authorization.actions.savedObject.get - >).mockImplementation(mockAuthorizationAction); + ( + authorization.actions.savedObject.get as jest.MockedFunction< + typeof authorization.actions.savedObject.get + > + ).mockImplementation(mockAuthorizationAction); authorization.mode.useRbacForRequest.mockReturnValue(true); return { authorization, authentication }; } @@ -215,9 +217,9 @@ describe('ensureAuthorized', () => { authorizationMode: AuthorizationMode.Legacy, }); - authentication.getCurrentUser.mockReturnValueOnce(({ + authentication.getCurrentUser.mockReturnValueOnce({ username: 'some-user', - } as unknown) as AuthenticatedUser); + } as unknown as AuthenticatedUser); await actionsAuthorization.ensureAuthorized('execute', 'myType'); diff --git a/x-pack/plugins/actions/server/authorization/audit_logger.mock.ts b/x-pack/plugins/actions/server/authorization/audit_logger.mock.ts index 5cec395694918..0be62fc0f35f2 100644 --- a/x-pack/plugins/actions/server/authorization/audit_logger.mock.ts +++ b/x-pack/plugins/actions/server/authorization/audit_logger.mock.ts @@ -8,11 +8,11 @@ import { ActionsAuthorizationAuditLogger } from './audit_logger'; const createActionsAuthorizationAuditLoggerMock = () => { - const mocked = ({ + const mocked = { getAuthorizationMessage: jest.fn(), actionsAuthorizationFailure: jest.fn(), actionsAuthorizationSuccess: jest.fn(), - } as unknown) as jest.Mocked; + } as unknown as jest.Mocked; return mocked; }; diff --git a/x-pack/plugins/actions/server/builtin_action_types/es_index.test.ts b/x-pack/plugins/actions/server/builtin_action_types/es_index.test.ts index 5c0f720e8c5fc..738fa236f89c0 100644 --- a/x-pack/plugins/actions/server/builtin_action_types/es_index.test.ts +++ b/x-pack/plugins/actions/server/builtin_action_types/es_index.test.ts @@ -174,8 +174,9 @@ describe('execute()', () => { params, services, }; - const scopedClusterClient = elasticsearchClientMock.createClusterClient().asScoped() - .asCurrentUser; + const scopedClusterClient = elasticsearchClientMock + .createClusterClient() + .asScoped().asCurrentUser; await actionType.executor({ ...executorOptions, services: { ...services, scopedClusterClient }, @@ -553,8 +554,9 @@ describe('execute()', () => { }; const actionId = 'some-id'; - const scopedClusterClient = elasticsearchClientMock.createClusterClient().asScoped() - .asCurrentUser; + const scopedClusterClient = elasticsearchClientMock + .createClusterClient() + .asScoped().asCurrentUser; scopedClusterClient.bulk.mockResolvedValue( elasticsearchClientMock.createSuccessTransportRequestPromise({ took: 0, diff --git a/x-pack/plugins/actions/server/builtin_action_types/jira/index.ts b/x-pack/plugins/actions/server/builtin_action_types/jira/index.ts index aa439787ad96f..c8b107094723f 100644 --- a/x-pack/plugins/actions/server/builtin_action_types/jira/index.ts +++ b/x-pack/plugins/actions/server/builtin_action_types/jira/index.ts @@ -145,7 +145,8 @@ async function executor( } if (subAction === 'fieldsByIssueType') { - const getFieldsByIssueTypeParams = subActionParams as ExecutorSubActionGetFieldsByIssueTypeParams; + const getFieldsByIssueTypeParams = + subActionParams as ExecutorSubActionGetFieldsByIssueTypeParams; data = await api.fieldsByIssueType({ externalService, params: getFieldsByIssueTypeParams, diff --git a/x-pack/plugins/actions/server/builtin_action_types/jira/service.test.ts b/x-pack/plugins/actions/server/builtin_action_types/jira/service.test.ts index 9430d734287d3..af518f0cebc07 100644 --- a/x-pack/plugins/actions/server/builtin_action_types/jira/service.test.ts +++ b/x-pack/plugins/actions/server/builtin_action_types/jira/service.test.ts @@ -657,8 +657,7 @@ describe('Jira service', () => { logger, method: 'get', configurationUtilities, - url: - 'https://siem-kibana.atlassian.net/rest/api/2/issue/createmeta?projectKeys=CK&expand=projects.issuetypes.fields', + url: 'https://siem-kibana.atlassian.net/rest/api/2/issue/createmeta?projectKeys=CK&expand=projects.issuetypes.fields', }); }); @@ -824,8 +823,7 @@ describe('Jira service', () => { logger, method: 'get', configurationUtilities, - url: - 'https://siem-kibana.atlassian.net/rest/api/2/issue/createmeta?projectKeys=CK&issuetypeIds=10006&expand=projects.issuetypes.fields', + url: 'https://siem-kibana.atlassian.net/rest/api/2/issue/createmeta?projectKeys=CK&issuetypeIds=10006&expand=projects.issuetypes.fields', }); }); diff --git a/x-pack/plugins/actions/server/builtin_action_types/lib/axios_utils.test.ts b/x-pack/plugins/actions/server/builtin_action_types/lib/axios_utils.test.ts index 292471aaf9b6d..287f74c6bc703 100644 --- a/x-pack/plugins/actions/server/builtin_action_types/lib/axios_utils.test.ts +++ b/x-pack/plugins/actions/server/builtin_action_types/lib/axios_utils.test.ts @@ -20,7 +20,7 @@ const TestUrl = 'https://elastic.co/foo/bar/baz'; const logger = loggingSystemMock.create().get() as jest.Mocked; let configurationUtilities = actionsConfigMock.create(); jest.mock('axios'); -const axiosMock = (axios as unknown) as jest.Mock; +const axiosMock = axios as unknown as jest.Mock; describe('addTimeZoneToDate', () => { test('adds timezone with default', () => { diff --git a/x-pack/plugins/actions/server/builtin_action_types/lib/get_custom_agents.ts b/x-pack/plugins/actions/server/builtin_action_types/lib/get_custom_agents.ts index 83d31ae1355d3..a98622a374bea 100644 --- a/x-pack/plugins/actions/server/builtin_action_types/lib/get_custom_agents.ts +++ b/x-pack/plugins/actions/server/builtin_action_types/lib/get_custom_agents.ts @@ -115,14 +115,14 @@ export function getCustomAgents( // We will though, copy over the calculated ssl options from above, into // the https agent. const httpAgent = new HttpProxyAgent(proxySettings.proxyUrl); - const httpsAgent = (new HttpsProxyAgent({ + const httpsAgent = new HttpsProxyAgent({ host: proxyUrl.hostname, port: Number(proxyUrl.port), protocol: proxyUrl.protocol, headers: proxySettings.proxyHeaders, // do not fail on invalid certs if value is false ...proxyNodeSSLOptions, - }) as unknown) as HttpsAgent; + }) as unknown as HttpsAgent; // vsCode wasn't convinced HttpsProxyAgent is an https.Agent, so we convinced it if (agentOptions) { diff --git a/x-pack/plugins/actions/server/builtin_action_types/resilient/service.test.ts b/x-pack/plugins/actions/server/builtin_action_types/resilient/service.test.ts index 3f7da4a3bf903..ba55543386225 100644 --- a/x-pack/plugins/actions/server/builtin_action_types/resilient/service.test.ts +++ b/x-pack/plugins/actions/server/builtin_action_types/resilient/service.test.ts @@ -299,8 +299,7 @@ describe('IBM Resilient service', () => { expect(requestMock).toHaveBeenCalledWith({ axios, - url: - 'https://resilient.elastic.co/rest/orgs/201/incidents?text_content_output_format=objects_convert', + url: 'https://resilient.elastic.co/rest/orgs/201/incidents?text_content_output_format=objects_convert', logger, method: 'post', configurationUtilities, diff --git a/x-pack/plugins/actions/server/builtin_action_types/servicenow/index.test.ts b/x-pack/plugins/actions/server/builtin_action_types/servicenow/index.test.ts index 848575798f10a..b342844033994 100644 --- a/x-pack/plugins/actions/server/builtin_action_types/servicenow/index.test.ts +++ b/x-pack/plugins/actions/server/builtin_action_types/servicenow/index.test.ts @@ -70,13 +70,13 @@ describe('ServiceNow', () => { test('it pass the correct comment field key', async () => { const actionId = 'some-action-id'; - const executorOptions = ({ + const executorOptions = { actionId, config, secrets, params, services, - } as unknown) as ServiceNowActionTypeExecutorOptions; + } as unknown as ServiceNowActionTypeExecutorOptions; await actionType.executor(executorOptions); expect((api.pushToService as jest.Mock).mock.calls[0][0].commentFieldKey).toBe( 'work_notes' @@ -105,13 +105,13 @@ describe('ServiceNow', () => { test('it pass the correct comment field key', async () => { const actionId = 'some-action-id'; - const executorOptions = ({ + const executorOptions = { actionId, config, secrets, params, services, - } as unknown) as ServiceNowActionTypeExecutorOptions; + } as unknown as ServiceNowActionTypeExecutorOptions; await actionType.executor(executorOptions); expect((api.pushToService as jest.Mock).mock.calls[0][0].commentFieldKey).toBe( 'work_notes' diff --git a/x-pack/plugins/actions/server/builtin_action_types/servicenow/service.test.ts b/x-pack/plugins/actions/server/builtin_action_types/servicenow/service.test.ts index aab27db852275..37bfb662508a2 100644 --- a/x-pack/plugins/actions/server/builtin_action_types/servicenow/service.test.ts +++ b/x-pack/plugins/actions/server/builtin_action_types/servicenow/service.test.ts @@ -388,8 +388,7 @@ describe('ServiceNow service', () => { axios, logger, configurationUtilities, - url: - 'https://dev102283.service-now.com/api/now/v2/table/sys_dictionary?sysparm_query=name=task^ORname=incident^internal_type=string&active=true&array=false&read_only=false&sysparm_fields=max_length,element,column_label,mandatory', + url: 'https://dev102283.service-now.com/api/now/v2/table/sys_dictionary?sysparm_query=name=task^ORname=incident^internal_type=string&active=true&array=false&read_only=false&sysparm_fields=max_length,element,column_label,mandatory', }); }); @@ -421,8 +420,7 @@ describe('ServiceNow service', () => { axios, logger, configurationUtilities, - url: - 'https://dev102283.service-now.com/api/now/v2/table/sys_dictionary?sysparm_query=name=task^ORname=sn_si_incident^internal_type=string&active=true&array=false&read_only=false&sysparm_fields=max_length,element,column_label,mandatory', + url: 'https://dev102283.service-now.com/api/now/v2/table/sys_dictionary?sysparm_query=name=task^ORname=sn_si_incident^internal_type=string&active=true&array=false&read_only=false&sysparm_fields=max_length,element,column_label,mandatory', }); }); @@ -458,8 +456,7 @@ describe('ServiceNow service', () => { axios, logger, configurationUtilities, - url: - 'https://dev102283.service-now.com/api/now/v2/table/sys_choice?sysparm_query=name=task^ORname=incident^element=priority^ORelement=category&sysparm_fields=label,value,dependent_value,element', + url: 'https://dev102283.service-now.com/api/now/v2/table/sys_choice?sysparm_query=name=task^ORname=incident^element=priority^ORelement=category&sysparm_fields=label,value,dependent_value,element', }); }); @@ -492,8 +489,7 @@ describe('ServiceNow service', () => { axios, logger, configurationUtilities, - url: - 'https://dev102283.service-now.com/api/now/v2/table/sys_choice?sysparm_query=name=task^ORname=sn_si_incident^element=priority^ORelement=category&sysparm_fields=label,value,dependent_value,element', + url: 'https://dev102283.service-now.com/api/now/v2/table/sys_choice?sysparm_query=name=task^ORname=sn_si_incident^element=priority^ORelement=category&sysparm_fields=label,value,dependent_value,element', }); }); diff --git a/x-pack/plugins/actions/server/cleanup_failed_executions/cleanup_tasks.test.ts b/x-pack/plugins/actions/server/cleanup_failed_executions/cleanup_tasks.test.ts index 07c09a2dfef76..451e12b9cf29a 100644 --- a/x-pack/plugins/actions/server/cleanup_failed_executions/cleanup_tasks.test.ts +++ b/x-pack/plugins/actions/server/cleanup_failed_executions/cleanup_tasks.test.ts @@ -16,14 +16,14 @@ describe('cleanupTasks', () => { const logger = loggingSystemMock.create().get(); const esClient = elasticsearchServiceMock.createElasticsearchClient(); const spaces = spacesMock.createStart(); - const savedObjectsSerializer = ({ + const savedObjectsSerializer = { generateRawId: jest .fn() .mockImplementation((namespace: string | undefined, type: string, id: string) => { const namespacePrefix = namespace ? `${namespace}:` : ''; return `${namespacePrefix}${type}:${id}`; }), - } as unknown) as SavedObjectsSerializer; + } as unknown as SavedObjectsSerializer; const cleanupTasksOpts: CleanupTasksOpts = { logger, @@ -69,9 +69,9 @@ describe('cleanupTasks', () => { }); it('should delete action_task_params and task objects', async () => { - esClient.bulk.mockResolvedValue(({ + esClient.bulk.mockResolvedValue({ body: { items: [], errors: false, took: 1 }, - } as unknown) as ApiResponse); + } as unknown as ApiResponse); const result = await cleanupTasks({ ...cleanupTasksOpts, tasks: [taskSO], @@ -90,7 +90,7 @@ describe('cleanupTasks', () => { }); it('should not delete the task if the action_task_params failed to delete', async () => { - esClient.bulk.mockResolvedValue(({ + esClient.bulk.mockResolvedValue({ body: { items: [ { @@ -106,7 +106,7 @@ describe('cleanupTasks', () => { errors: true, took: 1, }, - } as unknown) as ApiResponse); + } as unknown as ApiResponse); const result = await cleanupTasks({ ...cleanupTasksOpts, tasks: [taskSO], diff --git a/x-pack/plugins/actions/server/cleanup_failed_executions/find_and_cleanup_tasks.test.ts b/x-pack/plugins/actions/server/cleanup_failed_executions/find_and_cleanup_tasks.test.ts index 81c2a348bc096..e7ac962251f87 100644 --- a/x-pack/plugins/actions/server/cleanup_failed_executions/find_and_cleanup_tasks.test.ts +++ b/x-pack/plugins/actions/server/cleanup_failed_executions/find_and_cleanup_tasks.test.ts @@ -31,7 +31,7 @@ describe('findAndCleanupTasks', () => { const esStart = elasticsearchServiceMock.createStart(); const spaces = spacesMock.createStart(); const soService = savedObjectsServiceMock.createStartContract(); - const coreStartServices = (Promise.resolve([ + const coreStartServices = Promise.resolve([ { savedObjects: { ...soService, @@ -43,7 +43,7 @@ describe('findAndCleanupTasks', () => { spaces, }, {}, - ]) as unknown) as Promise<[CoreStart, ActionsPluginsStart, unknown]>; + ]) as unknown as Promise<[CoreStart, ActionsPluginsStart, unknown]>; const config: ActionsConfig['cleanupFailedExecutionsTask'] = { enabled: true, diff --git a/x-pack/plugins/actions/server/index.test.ts b/x-pack/plugins/actions/server/index.test.ts index 56f3533b47e3f..dbe8fca806f17 100644 --- a/x-pack/plugins/actions/server/index.test.ts +++ b/x-pack/plugins/actions/server/index.test.ts @@ -20,7 +20,9 @@ const applyStackAlertDeprecations = (settings: Record = {}) => deprecation, path: CONFIG_PATH, })), - () => ({ message }) => deprecationMessages.push(message) + () => + ({ message }) => + deprecationMessages.push(message) ); return { messages: deprecationMessages, diff --git a/x-pack/plugins/actions/server/lib/errors/preconfigured_action_disabled_modification.ts b/x-pack/plugins/actions/server/lib/errors/preconfigured_action_disabled_modification.ts index e3b3c98a94e04..eec099b211146 100644 --- a/x-pack/plugins/actions/server/lib/errors/preconfigured_action_disabled_modification.ts +++ b/x-pack/plugins/actions/server/lib/errors/preconfigured_action_disabled_modification.ts @@ -12,7 +12,8 @@ export type PreconfiguredActionDisabledFrom = 'update' | 'delete'; export class PreconfiguredActionDisabledModificationError extends Error - implements ErrorThatHandlesItsOwnResponse { + implements ErrorThatHandlesItsOwnResponse +{ public readonly disabledFrom: PreconfiguredActionDisabledFrom; constructor(message: string, disabledFrom: PreconfiguredActionDisabledFrom) { diff --git a/x-pack/plugins/actions/server/lib/mustache_renderer.ts b/x-pack/plugins/actions/server/lib/mustache_renderer.ts index 3cacdf7704a8b..1e7f2dd3ab644 100644 --- a/x-pack/plugins/actions/server/lib/mustache_renderer.ts +++ b/x-pack/plugins/actions/server/lib/mustache_renderer.ts @@ -40,7 +40,7 @@ export function renderMustacheObject(params: Params, variables: Variable // The return type signature for `cloneDeep()` ends up taking the return // type signature for the customizer, but rather than pollute the customizer // with casts, seemed better to just do it in one place, here. - return (result as unknown) as Params; + return result as unknown as Params; } // return variables cloned, with a toString() added to objects diff --git a/x-pack/plugins/actions/server/lib/task_runner_factory.test.ts b/x-pack/plugins/actions/server/lib/task_runner_factory.test.ts index 85d819ba09b8a..ec0aa48ef291e 100644 --- a/x-pack/plugins/actions/server/lib/task_runner_factory.test.ts +++ b/x-pack/plugins/actions/server/lib/task_runner_factory.test.ts @@ -119,9 +119,11 @@ test('executes the task by calling the executor with proper parameters, using gi expect(runnerResult).toBeUndefined(); expect(spaceIdToNamespace).toHaveBeenCalledWith('test'); - expect( - mockedEncryptedSavedObjectsClient.getDecryptedAsInternalUser - ).toHaveBeenCalledWith('action_task_params', '3', { namespace: 'namespace-test' }); + expect(mockedEncryptedSavedObjectsClient.getDecryptedAsInternalUser).toHaveBeenCalledWith( + 'action_task_params', + '3', + { namespace: 'namespace-test' } + ); expect(mockedActionExecutor.execute).toHaveBeenCalledWith({ actionId: '2', @@ -175,9 +177,11 @@ test('executes the task by calling the executor with proper parameters, using st expect(runnerResult).toBeUndefined(); expect(spaceIdToNamespace).toHaveBeenCalledWith('test'); - expect( - mockedEncryptedSavedObjectsClient.getDecryptedAsInternalUser - ).toHaveBeenCalledWith('action_task_params', '3', { namespace: 'namespace-test' }); + expect(mockedEncryptedSavedObjectsClient.getDecryptedAsInternalUser).toHaveBeenCalledWith( + 'action_task_params', + '3', + { namespace: 'namespace-test' } + ); expect(mockedActionExecutor.execute).toHaveBeenCalledWith({ actionId: '9', diff --git a/x-pack/plugins/actions/server/lib/task_runner_factory.ts b/x-pack/plugins/actions/server/lib/task_runner_factory.ts index 9a3856bbf7cee..4f6b9ac2e8b7d 100644 --- a/x-pack/plugins/actions/server/lib/task_runner_factory.ts +++ b/x-pack/plugins/actions/server/lib/task_runner_factory.ts @@ -103,7 +103,7 @@ export class TaskRunnerFactory { // Since we're using API keys and accessing elasticsearch can only be done // via a request, we're faking one with the proper authorization headers. - const fakeRequest = KibanaRequest.from(({ + const fakeRequest = KibanaRequest.from({ headers: requestHeaders, path: '/', route: { settings: {} }, @@ -115,7 +115,7 @@ export class TaskRunnerFactory { url: '/', }, }, - } as unknown) as Request); + } as unknown as Request); basePathService.set(fakeRequest, path); @@ -205,21 +205,20 @@ async function getActionTaskParams( const { spaceId } = executorParams; const namespace = spaceIdToNamespace(spaceId); if (isPersistedActionTask(executorParams)) { - const actionTask = await encryptedSavedObjectsClient.getDecryptedAsInternalUser( - ACTION_TASK_PARAMS_SAVED_OBJECT_TYPE, - executorParams.actionTaskParamsId, - { namespace } - ); + const actionTask = + await encryptedSavedObjectsClient.getDecryptedAsInternalUser( + ACTION_TASK_PARAMS_SAVED_OBJECT_TYPE, + executorParams.actionTaskParamsId, + { namespace } + ); const { attributes: { relatedSavedObjects }, references, } = actionTask; - const { - actionId, - relatedSavedObjects: injectedRelatedSavedObjects, - } = injectSavedObjectReferences(references, relatedSavedObjects as RelatedSavedObjects); + const { actionId, relatedSavedObjects: injectedRelatedSavedObjects } = + injectSavedObjectReferences(references, relatedSavedObjects as RelatedSavedObjects); return { ...actionTask, diff --git a/x-pack/plugins/actions/server/plugin.test.ts b/x-pack/plugins/actions/server/plugin.test.ts index 1ae5eaf882cfc..86d2de783ebe5 100644 --- a/x-pack/plugins/actions/server/plugin.test.ts +++ b/x-pack/plugins/actions/server/plugin.test.ts @@ -88,8 +88,8 @@ describe('Actions Plugin', () => { ]; expect(handler[0]).toEqual('actions'); - const actionsContextHandler = ((await handler[1]( - ({ + const actionsContextHandler = (await handler[1]( + { core: { savedObjects: { client: {}, @@ -98,10 +98,10 @@ describe('Actions Plugin', () => { client: jest.fn(), }, }, - } as unknown) as RequestHandlerContext, + } as unknown as RequestHandlerContext, httpServerMock.createKibanaRequest(), httpServerMock.createResponseFactory() - )) as unknown) as ActionsApiRequestHandlerContext; + )) as unknown as ActionsApiRequestHandlerContext; actionsContextHandler!.getActionsClient(); }); @@ -115,17 +115,17 @@ describe('Actions Plugin', () => { ]; expect(handler[0]).toEqual('actions'); - const actionsContextHandler = ((await handler[1]( - ({ + const actionsContextHandler = (await handler[1]( + { core: { savedObjects: { client: {}, }, }, - } as unknown) as RequestHandlerContext, + } as unknown as RequestHandlerContext, httpServerMock.createKibanaRequest(), httpServerMock.createResponseFactory() - )) as unknown) as ActionsApiRequestHandlerContext; + )) as unknown as ActionsApiRequestHandlerContext; expect(() => actionsContextHandler!.getActionsClient()).toThrowErrorMatchingInlineSnapshot( `"Unable to create actions client because the Encrypted Saved Objects plugin is missing encryption key. Please set xpack.encryptedSavedObjects.encryptionKey in the kibana.yml or use the bin/kibana-encryption-keys command."` ); diff --git a/x-pack/plugins/actions/server/routes/execute.test.ts b/x-pack/plugins/actions/server/routes/execute.test.ts index 54e10698e5af9..322c9aeb15600 100644 --- a/x-pack/plugins/actions/server/routes/execute.test.ts +++ b/x-pack/plugins/actions/server/routes/execute.test.ts @@ -76,9 +76,7 @@ describe('executeActionRoute', () => { const router = httpServiceMock.createRouter(); const actionsClient = actionsClientMock.create(); - actionsClient.execute.mockResolvedValueOnce( - (null as unknown) as ActionTypeExecutorResult - ); + actionsClient.execute.mockResolvedValueOnce(null as unknown as ActionTypeExecutorResult); const [context, req, res] = mockHandlerArguments( { actionsClient }, diff --git a/x-pack/plugins/actions/server/routes/legacy/_mock_handler_arguments.ts b/x-pack/plugins/actions/server/routes/legacy/_mock_handler_arguments.ts index 2a2452b02cc7d..c5d0776d6c58b 100644 --- a/x-pack/plugins/actions/server/routes/legacy/_mock_handler_arguments.ts +++ b/x-pack/plugins/actions/server/routes/legacy/_mock_handler_arguments.ts @@ -23,7 +23,7 @@ export function mockHandlerArguments( ): [ActionsRequestHandlerContext, KibanaRequest, KibanaResponseFactory] { const listTypes = jest.fn(() => listTypesRes); return [ - ({ + { actions: { listTypes, getActionsClient() { @@ -38,7 +38,7 @@ export function mockHandlerArguments( ); }, }, - } as unknown) as ActionsRequestHandlerContext, + } as unknown as ActionsRequestHandlerContext, req as KibanaRequest, mockResponseFactory(res), ]; @@ -53,5 +53,5 @@ export const mockResponseFactory = (resToMock: Array { const router = httpServiceMock.createRouter(); const actionsClient = actionsClientMock.create(); - actionsClient.execute.mockResolvedValueOnce( - (null as unknown) as ActionTypeExecutorResult - ); + actionsClient.execute.mockResolvedValueOnce(null as unknown as ActionTypeExecutorResult); const [context, req, res] = mockHandlerArguments( { actionsClient }, diff --git a/x-pack/plugins/actions/server/saved_objects/get_import_warnings.test.ts b/x-pack/plugins/actions/server/saved_objects/get_import_warnings.test.ts index de4ccf5016379..f52cd14382658 100644 --- a/x-pack/plugins/actions/server/saved_objects/get_import_warnings.test.ts +++ b/x-pack/plugins/actions/server/saved_objects/get_import_warnings.test.ts @@ -46,7 +46,7 @@ describe('getImportWarnings', () => { }, ]; const warnings = getImportWarnings( - (savedObjectConnectors as unknown) as Array> + savedObjectConnectors as unknown as Array> ); expect(warnings[0].message).toBe('1 connector has sensitive information that require updates.'); }); @@ -89,7 +89,7 @@ describe('getImportWarnings', () => { }, ]; const warnings = getImportWarnings( - (savedObjectConnectors as unknown) as Array> + savedObjectConnectors as unknown as Array> ); expect(warnings.length).toBe(0); }); diff --git a/x-pack/plugins/actions/server/usage/actions_usage_collector.test.ts b/x-pack/plugins/actions/server/usage/actions_usage_collector.test.ts index df43cbd084be8..6288b022e4736 100644 --- a/x-pack/plugins/actions/server/usage/actions_usage_collector.test.ts +++ b/x-pack/plugins/actions/server/usage/actions_usage_collector.test.ts @@ -19,10 +19,10 @@ describe('registerActionsUsageCollector', () => { let usageCollectionMock: jest.Mocked; beforeEach(() => { config = configSchema.validate({}); - usageCollectionMock = ({ + usageCollectionMock = { makeUsageCollector: jest.fn(), registerCollector: jest.fn(), - } as unknown) as jest.Mocked; + } as unknown as jest.Mocked; }); it('should call registerCollector', () => { diff --git a/x-pack/plugins/alerting/public/alert_navigation_registry/alert_navigation_registry.ts b/x-pack/plugins/alerting/public/alert_navigation_registry/alert_navigation_registry.ts index 21f3917f2f077..65b7c1e68e431 100644 --- a/x-pack/plugins/alerting/public/alert_navigation_registry/alert_navigation_registry.ts +++ b/x-pack/plugins/alerting/public/alert_navigation_registry/alert_navigation_registry.ts @@ -11,10 +11,8 @@ import { AlertNavigationHandler } from './types'; const DEFAULT_HANDLER = Symbol('*'); export class AlertNavigationRegistry { - private readonly alertNavigations: Map< - string, - Map - > = new Map(); + private readonly alertNavigations: Map> = + new Map(); public has(consumer: string, alertType: AlertType) { return this.hasTypedHandler(consumer, alertType) || this.hasDefaultHandler(consumer); diff --git a/x-pack/plugins/alerting/server/alerting_authorization_client_factory.test.ts b/x-pack/plugins/alerting/server/alerting_authorization_client_factory.test.ts index 2ba3580745d59..ebd9ef3305a09 100644 --- a/x-pack/plugins/alerting/server/alerting_authorization_client_factory.test.ts +++ b/x-pack/plugins/alerting/server/alerting_authorization_client_factory.test.ts @@ -26,14 +26,15 @@ const features = featuresPluginMock.createStart(); const securityPluginSetup = securityMock.createSetup(); const securityPluginStart = securityMock.createStart(); -const alertingAuthorizationClientFactoryParams: jest.Mocked = { - ruleTypeRegistry: ruleTypeRegistryMock.create(), - getSpace: jest.fn(), - getSpaceId: jest.fn(), - features, -}; +const alertingAuthorizationClientFactoryParams: jest.Mocked = + { + ruleTypeRegistry: ruleTypeRegistryMock.create(), + getSpace: jest.fn(), + getSpaceId: jest.fn(), + features, + }; -const fakeRequest = ({ +const fakeRequest = { app: {}, headers: {}, getBasePath: () => '', @@ -48,7 +49,7 @@ const fakeRequest = ({ }, }, getSavedObjectsClient: () => savedObjectsClient, -} as unknown) as Request; +} as unknown as Request; beforeEach(() => { jest.resetAllMocks(); diff --git a/x-pack/plugins/alerting/server/authorization/alerting_authorization.test.ts b/x-pack/plugins/alerting/server/authorization/alerting_authorization.test.ts index 7f5b06031c18c..212d8238f8400 100644 --- a/x-pack/plugins/alerting/server/authorization/alerting_authorization.test.ts +++ b/x-pack/plugins/alerting/server/authorization/alerting_authorization.test.ts @@ -47,9 +47,11 @@ function mockSecurity() { const security = securityMock.createSetup(); const authorization = security.authz; // typescript is having trouble inferring jest's automocking - (authorization.actions.alerting.get as jest.MockedFunction< - typeof authorization.actions.alerting.get - >).mockImplementation(mockAuthorizationAction); + ( + authorization.actions.alerting.get as jest.MockedFunction< + typeof authorization.actions.alerting.get + > + ).mockImplementation(mockAuthorizationAction); authorization.mode.useRbacForRequest.mockReturnValue(true); return { authorization }; } @@ -933,16 +935,14 @@ describe('AlertingAuthorization', () => { getSpace, getSpaceId, }); - const { - filter, - ensureRuleTypeIsAuthorized, - } = await alertAuthorization.getFindAuthorizationFilter(AlertingAuthorizationEntity.Rule, { - type: AlertingAuthorizationFilterType.KQL, - fieldNames: { - ruleTypeId: 'ruleId', - consumer: 'consumer', - }, - }); + const { filter, ensureRuleTypeIsAuthorized } = + await alertAuthorization.getFindAuthorizationFilter(AlertingAuthorizationEntity.Rule, { + type: AlertingAuthorizationFilterType.KQL, + fieldNames: { + ruleTypeId: 'ruleId', + consumer: 'consumer', + }, + }); expect(() => ensureRuleTypeIsAuthorized('someMadeUpType', 'myApp', 'rule')).not.toThrow(); expect(filter).toEqual(undefined); }); @@ -1242,16 +1242,14 @@ describe('AlertingAuthorization', () => { getSpaceId, }); ruleTypeRegistry.list.mockReturnValue(setOfAlertTypes); - const { - ensureRuleTypeIsAuthorized, - logSuccessfulAuthorization, - } = await alertAuthorization.getFindAuthorizationFilter(AlertingAuthorizationEntity.Rule, { - type: AlertingAuthorizationFilterType.KQL, - fieldNames: { - ruleTypeId: 'ruleId', - consumer: 'consumer', - }, - }); + const { ensureRuleTypeIsAuthorized, logSuccessfulAuthorization } = + await alertAuthorization.getFindAuthorizationFilter(AlertingAuthorizationEntity.Rule, { + type: AlertingAuthorizationFilterType.KQL, + fieldNames: { + ruleTypeId: 'ruleId', + consumer: 'consumer', + }, + }); expect(() => { ensureRuleTypeIsAuthorized('myAppAlertType', 'myOtherApp', 'rule'); ensureRuleTypeIsAuthorized('mySecondAppAlertType', 'myOtherApp', 'rule'); diff --git a/x-pack/plugins/alerting/server/authorization/alerting_authorization.ts b/x-pack/plugins/alerting/server/authorization/alerting_authorization.ts index 90fe1ff83ad05..271214fa9fc07 100644 --- a/x-pack/plugins/alerting/server/authorization/alerting_authorization.ts +++ b/x-pack/plugins/alerting/server/authorization/alerting_authorization.ts @@ -435,12 +435,8 @@ export class AlertingAuthorization { : // only has some of the required privileges privileges.kibana.reduce((authorizedRuleTypes, { authorized, privilege }) => { if (authorized && privilegeToRuleType.has(privilege)) { - const [ - ruleType, - feature, - hasPrivileges, - isAuthorizedAtProducerLevel, - ] = privilegeToRuleType.get(privilege)!; + const [ruleType, feature, hasPrivileges, isAuthorizedAtProducerLevel] = + privilegeToRuleType.get(privilege)!; ruleType.authorizedConsumers[feature] = mergeHasPrivileges( hasPrivileges, ruleType.authorizedConsumers[feature] @@ -490,8 +486,8 @@ function mergeHasPrivileges(left: HasPrivileges, right?: HasPrivileges): HasPriv } function hasPrivilegeByOperation(operation: ReadOperations | WriteOperations): HasPrivileges { - const read = Object.values(ReadOperations).includes((operation as unknown) as ReadOperations); - const all = Object.values(WriteOperations).includes((operation as unknown) as WriteOperations); + const read = Object.values(ReadOperations).includes(operation as unknown as ReadOperations); + const all = Object.values(WriteOperations).includes(operation as unknown as WriteOperations); return { read: read || all, all, diff --git a/x-pack/plugins/alerting/server/authorization/audit_logger.mock.ts b/x-pack/plugins/alerting/server/authorization/audit_logger.mock.ts index 30fa6c9ef1e28..8e2c072336a18 100644 --- a/x-pack/plugins/alerting/server/authorization/audit_logger.mock.ts +++ b/x-pack/plugins/alerting/server/authorization/audit_logger.mock.ts @@ -8,13 +8,13 @@ import { AlertingAuthorizationAuditLogger } from './audit_logger'; const createAlertingAuthorizationAuditLoggerMock = () => { - const mocked = ({ + const mocked = { getAuthorizationMessage: jest.fn(), logAuthorizationFailure: jest.fn(), logUnscopedAuthorizationFailure: jest.fn(), logAuthorizationSuccess: jest.fn(), logBulkAuthorizationSuccess: jest.fn(), - } as unknown) as jest.Mocked; + } as unknown as jest.Mocked; return mocked; }; diff --git a/x-pack/plugins/alerting/server/health/task.ts b/x-pack/plugins/alerting/server/health/task.ts index 999e76fde696e..8d69cbe565136 100644 --- a/x-pack/plugins/alerting/server/health/task.ts +++ b/x-pack/plugins/alerting/server/health/task.ts @@ -72,7 +72,9 @@ export function healthCheckTaskRunner( async run() { try { return await getAlertingHealthStatus( - (await coreStartServices)[0].savedObjects, + ( + await coreStartServices + )[0].savedObjects, state.runs ); } catch (errMsg) { diff --git a/x-pack/plugins/alerting/server/index.test.ts b/x-pack/plugins/alerting/server/index.test.ts index 45a632e0ef4ad..b1e64935d7cd9 100644 --- a/x-pack/plugins/alerting/server/index.test.ts +++ b/x-pack/plugins/alerting/server/index.test.ts @@ -20,7 +20,9 @@ const applyStackAlertDeprecations = (settings: Record = {}) => deprecation, path: CONFIG_PATH, })), - () => ({ message }) => deprecationMessages.push(message) + () => + ({ message }) => + deprecationMessages.push(message) ); return { messages: deprecationMessages, diff --git a/x-pack/plugins/alerting/server/invalidate_pending_api_keys/task.ts b/x-pack/plugins/alerting/server/invalidate_pending_api_keys/task.ts index 4ef0e8d25c574..f17ed8bc90aa0 100644 --- a/x-pack/plugins/alerting/server/invalidate_pending_api_keys/task.ts +++ b/x-pack/plugins/alerting/server/invalidate_pending_api_keys/task.ts @@ -94,7 +94,7 @@ function registerApiKeyInvalidatorTaskDefinition( function getFakeKibanaRequest(basePath: string) { const requestHeaders: Record = {}; - return ({ + return { headers: requestHeaders, getBasePath: () => basePath, path: '/', @@ -107,7 +107,7 @@ function getFakeKibanaRequest(basePath: string) { url: '/', }, }, - } as unknown) as KibanaRequest; + } as unknown as KibanaRequest; } function taskRunner( @@ -122,10 +122,8 @@ function taskRunner( let totalInvalidated = 0; const configResult = await config; try { - const [ - { savedObjects, http }, - { encryptedSavedObjects, security }, - ] = await coreStartServices; + const [{ savedObjects, http }, { encryptedSavedObjects, security }] = + await coreStartServices; const savedObjectsClient = savedObjects.getScopedClient( getFakeKibanaRequest(http.basePath.serverBasePath), { @@ -197,10 +195,11 @@ async function invalidateApiKeys( let totalInvalidated = 0; const apiKeyIds = await Promise.all( apiKeysToInvalidate.saved_objects.map(async (apiKeyObj) => { - const decryptedApiKey = await encryptedSavedObjectsClient.getDecryptedAsInternalUser( - 'api_key_pending_invalidation', - apiKeyObj.id - ); + const decryptedApiKey = + await encryptedSavedObjectsClient.getDecryptedAsInternalUser( + 'api_key_pending_invalidation', + apiKeyObj.id + ); return decryptedApiKey.attributes.apiKeyId; }) ); diff --git a/x-pack/plugins/alerting/server/mocks.ts b/x-pack/plugins/alerting/server/mocks.ts index e9f2b564734db..639ba166e00a8 100644 --- a/x-pack/plugins/alerting/server/mocks.ts +++ b/x-pack/plugins/alerting/server/mocks.ts @@ -59,7 +59,7 @@ const createAlertInstanceFactoryMock = < mock.unscheduleActions.mockReturnValue(mock); mock.scheduleActions.mockReturnValue(mock); - return (mock as unknown) as AlertInstanceMock; + return mock as unknown as AlertInstanceMock; }; const createAlertServicesMock = < diff --git a/x-pack/plugins/alerting/server/plugin.test.ts b/x-pack/plugins/alerting/server/plugin.test.ts index 57b55c25e6778..4cfa1d91758ea 100644 --- a/x-pack/plugins/alerting/server/plugin.test.ts +++ b/x-pack/plugins/alerting/server/plugin.test.ts @@ -222,7 +222,7 @@ describe('Alerting Plugin', () => { taskManager: taskManagerMock.createStart(), }); - const fakeRequest = ({ + const fakeRequest = { headers: {}, getBasePath: () => '', path: '/', @@ -236,7 +236,7 @@ describe('Alerting Plugin', () => { }, }, getSavedObjectsClient: jest.fn(), - } as unknown) as KibanaRequest; + } as unknown as KibanaRequest; startContract.getRulesClientWithRequest(fakeRequest); }); }); @@ -276,7 +276,7 @@ describe('Alerting Plugin', () => { taskManager: taskManagerMock.createStart(), }); - const fakeRequest = ({ + const fakeRequest = { headers: {}, getBasePath: () => '', path: '/', @@ -290,7 +290,7 @@ describe('Alerting Plugin', () => { }, }, getSavedObjectsClient: jest.fn(), - } as unknown) as KibanaRequest; + } as unknown as KibanaRequest; startContract.getAlertingAuthorizationWithRequest(fakeRequest); }); }); diff --git a/x-pack/plugins/alerting/server/routes/_mock_handler_arguments.ts b/x-pack/plugins/alerting/server/routes/_mock_handler_arguments.ts index de1d0d1326710..c19beee0e841f 100644 --- a/x-pack/plugins/alerting/server/routes/_mock_handler_arguments.ts +++ b/x-pack/plugins/alerting/server/routes/_mock_handler_arguments.ts @@ -35,7 +35,7 @@ export function mockHandlerArguments( ] { const listTypes = jest.fn(() => listTypesRes); return [ - ({ + { alerting: { listTypes, getRulesClient() { @@ -44,7 +44,7 @@ export function mockHandlerArguments( getFrameworkHealth, areApiKeysEnabled: areApiKeysEnabled ? areApiKeysEnabled : () => Promise.resolve(true), }, - } as unknown) as AlertingRequestHandlerContext, + } as unknown as AlertingRequestHandlerContext, req as KibanaRequest, mockResponseFactory(res), ]; @@ -59,5 +59,5 @@ export const mockResponseFactory = (resToMock: Array = await rulesClient.create( - { + const createdRule: SanitizedAlert = + await rulesClient.create({ data: rewriteBodyReq({ ...rule, notify_when: rule.notify_when as AlertNotifyWhenType, }), options: { id: params?.id }, - } - ); + }); return res.ok({ body: rewriteBodyRes(createdRule), }); diff --git a/x-pack/plugins/alerting/server/routes/legacy/create.ts b/x-pack/plugins/alerting/server/routes/legacy/create.ts index ec5db463f7abf..8deeb733fd3b5 100644 --- a/x-pack/plugins/alerting/server/routes/legacy/create.ts +++ b/x-pack/plugins/alerting/server/routes/legacy/create.ts @@ -78,12 +78,11 @@ export const createAlertRoute = ({ router, licenseState, usageCounter }: RouteOp }); try { - const alertRes: SanitizedAlert = await rulesClient.create( - { + const alertRes: SanitizedAlert = + await rulesClient.create({ data: { ...alert, notifyWhen }, options: { id: params?.id }, - } - ); + }); return res.ok({ body: alertRes, }); diff --git a/x-pack/plugins/alerting/server/rule_type_registry.test.ts b/x-pack/plugins/alerting/server/rule_type_registry.test.ts index 5b80fb3019632..f8067a2281f65 100644 --- a/x-pack/plugins/alerting/server/rule_type_registry.test.ts +++ b/x-pack/plugins/alerting/server/rule_type_registry.test.ts @@ -91,7 +91,7 @@ describe('register()', () => { test('throws if AlertType Id isnt a string', () => { const alertType: AlertType = { - id: (123 as unknown) as string, + id: 123 as unknown as string, name: 'Test', actionGroups: [ { @@ -125,10 +125,10 @@ describe('register()', () => { * The type system will ensure you can't use the `recovered` action group * but we also want to ensure this at runtime */ - ({ + { id: 'recovered', name: 'Recovered', - } as unknown) as ActionGroup<'NotReserved'>, + } as unknown as ActionGroup<'NotReserved'>, ], defaultActionGroupId: 'default', minimumLicenseRequired: 'basic', diff --git a/x-pack/plugins/alerting/server/rule_type_registry.ts b/x-pack/plugins/alerting/server/rule_type_registry.ts index a761816808741..3cd21d0c64dd5 100644 --- a/x-pack/plugins/alerting/server/rule_type_registry.ts +++ b/x-pack/plugins/alerting/server/rule_type_registry.ts @@ -185,7 +185,7 @@ export class RuleTypeRegistry { this.ruleTypes.set( alertIdSchema.validate(alertType.id), /** stripping the typing is required in order to store the AlertTypes in a Map */ - (normalizedAlertType as unknown) as UntypedNormalizedAlertType + normalizedAlertType as unknown as UntypedNormalizedAlertType ); this.taskManager.registerTaskDefinitions({ [`alerting:${alertType.id}`]: { @@ -245,7 +245,7 @@ export class RuleTypeRegistry { * This means that returning a typed AlertType in `get` is an inherently * unsafe operation. Down casting to `unknown` is the only way to achieve this. */ - return (this.ruleTypes.get(id)! as unknown) as NormalizedAlertType< + return this.ruleTypes.get(id)! as unknown as NormalizedAlertType< Params, ExtractedParams, State, diff --git a/x-pack/plugins/alerting/server/rules_client/rules_client.ts b/x-pack/plugins/alerting/server/rules_client/rules_client.ts index 51f27916e015a..231d19ce9a6f8 100644 --- a/x-pack/plugins/alerting/server/rules_client/rules_client.ts +++ b/x-pack/plugins/alerting/server/rules_client/rules_client.ts @@ -297,11 +297,11 @@ export class RulesClient { await this.validateActions(ruleType, data.actions); // Extract saved object references for this rule - const { references, params: updatedParams, actions } = await this.extractReferences( - ruleType, - data.actions, - validatedAlertTypeParams - ); + const { + references, + params: updatedParams, + actions, + } = await this.extractReferences(ruleType, data.actions, validatedAlertTypeParams); const createTime = Date.now(); const legacyId = Semver.lt(this.kibanaVersion, '8.0.0') ? id : null; @@ -429,10 +429,8 @@ export class RulesClient { }: { id: string; }): Promise> { - const { - saved_object: result, - ...resolveResponse - } = await this.unsecuredSavedObjectsClient.resolve('alert', id); + const { saved_object: result, ...resolveResponse } = + await this.unsecuredSavedObjectsClient.resolve('alert', id); try { await this.authorization.ensureAuthorized({ ruleTypeId: result.attributes.alertTypeId, @@ -633,13 +631,11 @@ export class RulesClient { // Replace this when saved objects supports aggregations https://github.com/elastic/kibana/pull/64002 const alertExecutionStatus = await Promise.all( AlertExecutionStatusValues.map(async (status: string) => { - const { - filter: authorizationFilter, - logSuccessfulAuthorization, - } = await this.authorization.getFindAuthorizationFilter( - AlertingAuthorizationEntity.Rule, - alertingAuthorizationFilterOpts - ); + const { filter: authorizationFilter, logSuccessfulAuthorization } = + await this.authorization.getFindAuthorizationFilter( + AlertingAuthorizationEntity.Rule, + alertingAuthorizationFilterOpts + ); const filter = options.filter ? `${options.filter} and alert.attributes.executionStatus.status:(${status})` : `alert.attributes.executionStatus.status:(${status})`; @@ -685,11 +681,10 @@ export class RulesClient { let attributes: RawAlert; try { - const decryptedAlert = await this.encryptedSavedObjectsClient.getDecryptedAsInternalUser( - 'alert', - id, - { namespace: this.namespace } - ); + const decryptedAlert = + await this.encryptedSavedObjectsClient.getDecryptedAsInternalUser('alert', id, { + namespace: this.namespace, + }); apiKeyToInvalidate = decryptedAlert.attributes.apiKey; taskIdToRemove = decryptedAlert.attributes.scheduledTaskId; attributes = decryptedAlert.attributes; @@ -764,11 +759,10 @@ export class RulesClient { let alertSavedObject: SavedObject; try { - alertSavedObject = await this.encryptedSavedObjectsClient.getDecryptedAsInternalUser( - 'alert', - id, - { namespace: this.namespace } - ); + alertSavedObject = + await this.encryptedSavedObjectsClient.getDecryptedAsInternalUser('alert', id, { + namespace: this.namespace, + }); } catch (e) { // We'll skip invalidating the API key since we failed to load the decrypted saved object this.logger.error( @@ -854,11 +848,11 @@ export class RulesClient { await this.validateActions(ruleType, data.actions); // Extract saved object references for this rule - const { references, params: updatedParams, actions } = await this.extractReferences( - ruleType, - data.actions, - validatedAlertTypeParams - ); + const { + references, + params: updatedParams, + actions, + } = await this.extractReferences(ruleType, data.actions, validatedAlertTypeParams); const username = await this.getUserName(); @@ -943,11 +937,10 @@ export class RulesClient { let version: string | undefined; try { - const decryptedAlert = await this.encryptedSavedObjectsClient.getDecryptedAsInternalUser( - 'alert', - id, - { namespace: this.namespace } - ); + const decryptedAlert = + await this.encryptedSavedObjectsClient.getDecryptedAsInternalUser('alert', id, { + namespace: this.namespace, + }); apiKeyToInvalidate = decryptedAlert.attributes.apiKey; attributes = decryptedAlert.attributes; version = decryptedAlert.version; @@ -1048,11 +1041,10 @@ export class RulesClient { let version: string | undefined; try { - const decryptedAlert = await this.encryptedSavedObjectsClient.getDecryptedAsInternalUser( - 'alert', - id, - { namespace: this.namespace } - ); + const decryptedAlert = + await this.encryptedSavedObjectsClient.getDecryptedAsInternalUser('alert', id, { + namespace: this.namespace, + }); apiKeyToInvalidate = decryptedAlert.attributes.apiKey; attributes = decryptedAlert.attributes; version = decryptedAlert.version; @@ -1166,11 +1158,10 @@ export class RulesClient { let version: string | undefined; try { - const decryptedAlert = await this.encryptedSavedObjectsClient.getDecryptedAsInternalUser( - 'alert', - id, - { namespace: this.namespace } - ); + const decryptedAlert = + await this.encryptedSavedObjectsClient.getDecryptedAsInternalUser('alert', id, { + namespace: this.namespace, + }); apiKeyToInvalidate = decryptedAlert.attributes.apiKey; attributes = decryptedAlert.attributes; version = decryptedAlert.version; diff --git a/x-pack/plugins/alerting/server/rules_client/tests/aggregate.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/aggregate.test.ts index a336b961ace00..537a2a2a4cdce 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/aggregate.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/aggregate.test.ts @@ -32,8 +32,8 @@ const rulesClientParams: jest.Mocked = { taskManager, ruleTypeRegistry, unsecuredSavedObjectsClient, - authorization: (authorization as unknown) as AlertingAuthorization, - actionsAuthorization: (actionsAuthorization as unknown) as ActionsAuthorization, + authorization: authorization as unknown as AlertingAuthorization, + actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', getUserName: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/create.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/create.test.ts index 7bb0829912a33..2bb92046db68f 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/create.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/create.test.ts @@ -40,8 +40,8 @@ const rulesClientParams: jest.Mocked = { taskManager, ruleTypeRegistry, unsecuredSavedObjectsClient, - authorization: (authorization as unknown) as AlertingAuthorization, - actionsAuthorization: (actionsAuthorization as unknown) as ActionsAuthorization, + authorization: authorization as unknown as AlertingAuthorization, + actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', getUserName: jest.fn(), @@ -61,9 +61,7 @@ beforeEach(() => { setGlobalDate(); -function getMockData( - overwrites: Record = {} -): CreateOptions<{ +function getMockData(overwrites: Record = {}): CreateOptions<{ bar: boolean; }>['data'] { return { diff --git a/x-pack/plugins/alerting/server/rules_client/tests/delete.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/delete.test.ts index 681af1415f347..4847314a2ceae 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/delete.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/delete.test.ts @@ -31,8 +31,8 @@ const rulesClientParams: jest.Mocked = { taskManager, ruleTypeRegistry, unsecuredSavedObjectsClient, - authorization: (authorization as unknown) as AlertingAuthorization, - actionsAuthorization: (actionsAuthorization as unknown) as ActionsAuthorization, + authorization: authorization as unknown as AlertingAuthorization, + actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', getUserName: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/disable.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/disable.test.ts index 3cfc649cfcc3b..6b9b2021db68b 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/disable.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/disable.test.ts @@ -32,8 +32,8 @@ const rulesClientParams: jest.Mocked = { taskManager, ruleTypeRegistry, unsecuredSavedObjectsClient, - authorization: (authorization as unknown) as AlertingAuthorization, - actionsAuthorization: (actionsAuthorization as unknown) as ActionsAuthorization, + authorization: authorization as unknown as AlertingAuthorization, + actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', getUserName: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/enable.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/enable.test.ts index ca3773c4d51e2..7b8fbff4fca5a 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/enable.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/enable.test.ts @@ -33,8 +33,8 @@ const rulesClientParams: jest.Mocked = { taskManager, ruleTypeRegistry, unsecuredSavedObjectsClient, - authorization: (authorization as unknown) as AlertingAuthorization, - actionsAuthorization: (actionsAuthorization as unknown) as ActionsAuthorization, + authorization: authorization as unknown as AlertingAuthorization, + actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', getUserName: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/find.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/find.test.ts index cbbce77dc3bfe..e151188cf3979 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/find.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/find.test.ts @@ -35,8 +35,8 @@ const rulesClientParams: jest.Mocked = { taskManager, ruleTypeRegistry, unsecuredSavedObjectsClient, - authorization: (authorization as unknown) as AlertingAuthorization, - actionsAuthorization: (actionsAuthorization as unknown) as ActionsAuthorization, + authorization: authorization as unknown as AlertingAuthorization, + actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', getUserName: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/get.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/get.test.ts index 2209322768a77..d61796431a1ee 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/get.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/get.test.ts @@ -32,8 +32,8 @@ const rulesClientParams: jest.Mocked = { taskManager, ruleTypeRegistry, unsecuredSavedObjectsClient, - authorization: (authorization as unknown) as AlertingAuthorization, - actionsAuthorization: (actionsAuthorization as unknown) as ActionsAuthorization, + authorization: authorization as unknown as AlertingAuthorization, + actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', getUserName: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/get_alert_instance_summary.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/get_alert_instance_summary.test.ts index 6b018fb342d99..e116f18d779ea 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/get_alert_instance_summary.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/get_alert_instance_summary.test.ts @@ -35,8 +35,8 @@ const rulesClientParams: jest.Mocked = { taskManager, ruleTypeRegistry, unsecuredSavedObjectsClient, - authorization: (authorization as unknown) as AlertingAuthorization, - actionsAuthorization: (actionsAuthorization as unknown) as ActionsAuthorization, + authorization: authorization as unknown as AlertingAuthorization, + actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', getUserName: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/get_alert_state.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/get_alert_state.test.ts index 8f1d115765763..2bc355343ea89 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/get_alert_state.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/get_alert_state.test.ts @@ -30,8 +30,8 @@ const rulesClientParams: jest.Mocked = { taskManager, ruleTypeRegistry, unsecuredSavedObjectsClient, - authorization: (authorization as unknown) as AlertingAuthorization, - actionsAuthorization: (actionsAuthorization as unknown) as ActionsAuthorization, + authorization: authorization as unknown as AlertingAuthorization, + actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', getUserName: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/list_alert_types.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/list_alert_types.test.ts index 19296f25a9a64..3ef7cd6f4046e 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/list_alert_types.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/list_alert_types.test.ts @@ -34,8 +34,8 @@ const rulesClientParams: jest.Mocked = { taskManager, ruleTypeRegistry, unsecuredSavedObjectsClient, - authorization: (authorization as unknown) as AlertingAuthorization, - actionsAuthorization: (actionsAuthorization as unknown) as ActionsAuthorization, + authorization: authorization as unknown as AlertingAuthorization, + actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', getUserName: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/mute_all.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/mute_all.test.ts index bea4c33659a1c..883885c28aff7 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/mute_all.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/mute_all.test.ts @@ -31,8 +31,8 @@ const rulesClientParams: jest.Mocked = { taskManager, ruleTypeRegistry, unsecuredSavedObjectsClient, - authorization: (authorization as unknown) as AlertingAuthorization, - actionsAuthorization: (actionsAuthorization as unknown) as ActionsAuthorization, + authorization: authorization as unknown as AlertingAuthorization, + actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', getUserName: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/mute_instance.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/mute_instance.test.ts index 40baa663438e3..cb19066500bde 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/mute_instance.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/mute_instance.test.ts @@ -31,8 +31,8 @@ const rulesClientParams: jest.Mocked = { taskManager, ruleTypeRegistry, unsecuredSavedObjectsClient, - authorization: (authorization as unknown) as AlertingAuthorization, - actionsAuthorization: (actionsAuthorization as unknown) as ActionsAuthorization, + authorization: authorization as unknown as AlertingAuthorization, + actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', getUserName: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/resolve.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/resolve.test.ts index 63feb4ff3147a..537d890217cfb 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/resolve.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/resolve.test.ts @@ -32,8 +32,8 @@ const rulesClientParams: jest.Mocked = { taskManager, ruleTypeRegistry, unsecuredSavedObjectsClient, - authorization: (authorization as unknown) as AlertingAuthorization, - actionsAuthorization: (actionsAuthorization as unknown) as ActionsAuthorization, + authorization: authorization as unknown as AlertingAuthorization, + actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', getUserName: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/unmute_all.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/unmute_all.test.ts index b863d87f28d69..4d08da7289e4c 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/unmute_all.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/unmute_all.test.ts @@ -31,8 +31,8 @@ const rulesClientParams: jest.Mocked = { taskManager, ruleTypeRegistry, unsecuredSavedObjectsClient, - authorization: (authorization as unknown) as AlertingAuthorization, - actionsAuthorization: (actionsAuthorization as unknown) as ActionsAuthorization, + authorization: authorization as unknown as AlertingAuthorization, + actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', getUserName: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/unmute_instance.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/unmute_instance.test.ts index 6a1cca4a3821c..8319c486e965f 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/unmute_instance.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/unmute_instance.test.ts @@ -31,8 +31,8 @@ const rulesClientParams: jest.Mocked = { taskManager, ruleTypeRegistry, unsecuredSavedObjectsClient, - authorization: (authorization as unknown) as AlertingAuthorization, - actionsAuthorization: (actionsAuthorization as unknown) as ActionsAuthorization, + authorization: authorization as unknown as AlertingAuthorization, + actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', getUserName: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/update.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/update.test.ts index b72d8dd621ba1..1328b666f96e7 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/update.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/update.test.ts @@ -43,8 +43,8 @@ const rulesClientParams: jest.Mocked = { taskManager, ruleTypeRegistry, unsecuredSavedObjectsClient, - authorization: (authorization as unknown) as AlertingAuthorization, - actionsAuthorization: (actionsAuthorization as unknown) as ActionsAuthorization, + authorization: authorization as unknown as AlertingAuthorization, + actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', getUserName: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client/tests/update_api_key.test.ts b/x-pack/plugins/alerting/server/rules_client/tests/update_api_key.test.ts index 8c99cea9e12c3..0ee6d1162eca8 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/update_api_key.test.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/update_api_key.test.ts @@ -32,8 +32,8 @@ const rulesClientParams: jest.Mocked = { taskManager, ruleTypeRegistry, unsecuredSavedObjectsClient, - authorization: (authorization as unknown) as AlertingAuthorization, - actionsAuthorization: (actionsAuthorization as unknown) as ActionsAuthorization, + authorization: authorization as unknown as AlertingAuthorization, + actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', getUserName: jest.fn(), diff --git a/x-pack/plugins/alerting/server/rules_client_conflict_retries.test.ts b/x-pack/plugins/alerting/server/rules_client_conflict_retries.test.ts index f4ac4084dc6f7..dfc55efad41c6 100644 --- a/x-pack/plugins/alerting/server/rules_client_conflict_retries.test.ts +++ b/x-pack/plugins/alerting/server/rules_client_conflict_retries.test.ts @@ -41,8 +41,8 @@ const rulesClientParams: jest.Mocked = { taskManager, ruleTypeRegistry, unsecuredSavedObjectsClient, - authorization: (authorization as unknown) as AlertingAuthorization, - actionsAuthorization: (actionsAuthorization as unknown) as ActionsAuthorization, + authorization: authorization as unknown as AlertingAuthorization, + actionsAuthorization: actionsAuthorization as unknown as ActionsAuthorization, spaceId: 'default', namespace: 'default', getUserName: jest.fn(), @@ -210,8 +210,10 @@ function expectSuccess( // tests to run when the method is expected to fail function expectConflict(success: boolean, err: Error, method: 'update' | 'create' = 'update') { - const conflictErrorMessage = SavedObjectsErrorHelpers.createConflictError('alert', MockAlertId) - .message; + const conflictErrorMessage = SavedObjectsErrorHelpers.createConflictError( + 'alert', + MockAlertId + ).message; expect(`${err}`).toBe(`Error: ${conflictErrorMessage}`); expect(success).toBe(false); diff --git a/x-pack/plugins/alerting/server/rules_client_factory.test.ts b/x-pack/plugins/alerting/server/rules_client_factory.test.ts index 188ec652f40ce..6ccde13ff12a6 100644 --- a/x-pack/plugins/alerting/server/rules_client_factory.test.ts +++ b/x-pack/plugins/alerting/server/rules_client_factory.test.ts @@ -50,10 +50,11 @@ const rulesClientFactoryParams: jest.Mocked = { actions: actionsMock.createStart(), eventLog: eventLogMock.createStart(), kibanaVersion: '7.10.0', - authorization: (alertingAuthorizationClientFactory as unknown) as AlertingAuthorizationClientFactory, + authorization: + alertingAuthorizationClientFactory as unknown as AlertingAuthorizationClientFactory, }; -const fakeRequest = ({ +const fakeRequest = { app: {}, headers: {}, getBasePath: () => '', @@ -68,16 +69,16 @@ const fakeRequest = ({ }, }, getSavedObjectsClient: () => savedObjectsClient, -} as unknown) as Request; +} as unknown as Request; const actionsAuthorization = actionsAuthorizationMock.create(); beforeEach(() => { jest.resetAllMocks(); rulesClientFactoryParams.actions = actionsMock.createStart(); - (rulesClientFactoryParams.actions as jest.Mocked).getActionsAuthorizationWithRequest.mockReturnValue( - actionsAuthorization - ); + ( + rulesClientFactoryParams.actions as jest.Mocked + ).getActionsAuthorizationWithRequest.mockReturnValue(actionsAuthorization); rulesClientFactoryParams.getSpaceId.mockReturnValue('default'); rulesClientFactoryParams.spaceIdToNamespace.mockReturnValue('default'); }); @@ -89,7 +90,7 @@ test('creates an alerts client with proper constructor arguments when security i savedObjectsService.getScopedClient.mockReturnValue(savedObjectsClient); alertingAuthorizationClientFactory.create.mockReturnValue( - (alertsAuthorization as unknown) as AlertingAuthorization + alertsAuthorization as unknown as AlertingAuthorization ); const logger = { @@ -135,7 +136,7 @@ test('creates an alerts client with proper constructor arguments', async () => { savedObjectsService.getScopedClient.mockReturnValue(savedObjectsClient); alertingAuthorizationClientFactory.create.mockReturnValue( - (alertsAuthorization as unknown) as AlertingAuthorization + alertsAuthorization as unknown as AlertingAuthorization ); factory.create(request, savedObjectsService); @@ -185,9 +186,9 @@ test('getUserName() returns a name when security is enabled', async () => { factory.create(KibanaRequest.from(fakeRequest), savedObjectsService); const constructorCall = jest.requireMock('./rules_client').RulesClient.mock.calls[0][0]; - securityPluginStart.authc.getCurrentUser.mockReturnValueOnce(({ + securityPluginStart.authc.getCurrentUser.mockReturnValueOnce({ username: 'bob', - } as unknown) as AuthenticatedUser); + } as unknown as AuthenticatedUser); const userNameResult = await constructorCall.getUserName(); expect(userNameResult).toEqual('bob'); }); diff --git a/x-pack/plugins/alerting/server/saved_objects/get_import_warnings.test.ts b/x-pack/plugins/alerting/server/saved_objects/get_import_warnings.test.ts index d76e151b8d47b..18c26336721fc 100644 --- a/x-pack/plugins/alerting/server/saved_objects/get_import_warnings.test.ts +++ b/x-pack/plugins/alerting/server/saved_objects/get_import_warnings.test.ts @@ -71,17 +71,13 @@ describe('getImportWarnings', () => { references: [], }, ]; - const warnings = getImportWarnings( - (savedObjectRules as unknown) as Array> - ); + const warnings = getImportWarnings(savedObjectRules as unknown as Array>); expect(warnings[0].message).toBe('2 rules must be enabled after the import.'); }); it('return no warning messages if no rules were imported', () => { const savedObjectRules = [] as Array>; - const warnings = getImportWarnings( - (savedObjectRules as unknown) as Array> - ); + const warnings = getImportWarnings(savedObjectRules as unknown as Array>); expect(warnings.length).toBe(0); }); }); diff --git a/x-pack/plugins/alerting/server/saved_objects/migrations.test.ts b/x-pack/plugins/alerting/server/saved_objects/migrations.test.ts index 5e850ad3226f8..729286b594089 100644 --- a/x-pack/plugins/alerting/server/saved_objects/migrations.test.ts +++ b/x-pack/plugins/alerting/server/saved_objects/migrations.test.ts @@ -692,8 +692,7 @@ describe('successful migrations', () => { references: [ 'https://www.fireeye.com/blog/threat-research/2018/08/fin7-pursuing-an-enigmatic-and-evasive-global-criminal-operation.html', ], - note: - 'In the event this rule identifies benign domains in your environment, the `destination.domain` field in the rule can be modified to include those domains. Example: `...AND NOT destination.domain:(zoom.us OR benign.domain1 OR benign.domain2)`.', + note: 'In the event this rule identifies benign domains in your environment, the `destination.domain` field in the rule can be modified to include those domains. Example: `...AND NOT destination.domain:(zoom.us OR benign.domain1 OR benign.domain2)`.', version: 1, exceptionsList: null, threshold: { @@ -734,8 +733,7 @@ describe('successful migrations', () => { references: [ 'https://www.fireeye.com/blog/threat-research/2018/08/fin7-pursuing-an-enigmatic-and-evasive-global-criminal-operation.html', ], - note: - 'In the event this rule identifies benign domains in your environment, the `destination.domain` field in the rule can be modified to include those domains. Example: `...AND NOT destination.domain:(zoom.us OR benign.domain1 OR benign.domain2)`.', + note: 'In the event this rule identifies benign domains in your environment, the `destination.domain` field in the rule can be modified to include those domains. Example: `...AND NOT destination.domain:(zoom.us OR benign.domain1 OR benign.domain2)`.', version: 1, exceptionsList: [], threshold: { @@ -806,8 +804,7 @@ describe('successful migrations', () => { references: [ 'https://www.fireeye.com/blog/threat-research/2018/08/fin7-pursuing-an-enigmatic-and-evasive-global-criminal-operation.html', ], - note: - 'In the event this rule identifies benign domains in your environment, the `destination.domain` field in the rule can be modified to include those domains. Example: `...AND NOT destination.domain:(zoom.us OR benign.domain1 OR benign.domain2)`.', + note: 'In the event this rule identifies benign domains in your environment, the `destination.domain` field in the rule can be modified to include those domains. Example: `...AND NOT destination.domain:(zoom.us OR benign.domain1 OR benign.domain2)`.', version: 1, exceptionsList: ['exceptions-list'], }, diff --git a/x-pack/plugins/alerting/server/saved_objects/migrations.ts b/x-pack/plugins/alerting/server/saved_objects/migrations.ts index 287636c69bb75..bd795b9efc61f 100644 --- a/x-pack/plugins/alerting/server/saved_objects/migrations.ts +++ b/x-pack/plugins/alerting/server/saved_objects/migrations.ts @@ -313,25 +313,17 @@ function restructureConnectorsThatSupportIncident( }, ] as RawAlertAction[]; } else if (action.actionTypeId === '.jira') { - const { - title, - comments, - description, - issueType, - priority, - labels, - parent, - summary, - } = action.params.subActionParams as { - title: string; - description: string; - issueType: string; - priority?: string; - labels?: string[]; - parent?: string; - comments?: unknown[]; - summary?: string; - }; + const { title, comments, description, issueType, priority, labels, parent, summary } = + action.params.subActionParams as { + title: string; + description: string; + issueType: string; + priority?: string; + labels?: string[]; + parent?: string; + comments?: unknown[]; + summary?: string; + }; return [ ...acc, { diff --git a/x-pack/plugins/alerting/server/saved_objects/partially_update_alert.test.ts b/x-pack/plugins/alerting/server/saved_objects/partially_update_alert.test.ts index d890089132c01..37729dada3168 100644 --- a/x-pack/plugins/alerting/server/saved_objects/partially_update_alert.test.ts +++ b/x-pack/plugins/alerting/server/saved_objects/partially_update_alert.test.ts @@ -15,7 +15,8 @@ import { partiallyUpdateAlert, PartiallyUpdateableAlertAttributes } from './part import { savedObjectsClientMock } from '../../../../../src/core/server/mocks'; const MockSavedObjectsClientContract = savedObjectsClientMock.create(); -const MockISavedObjectsRepository = (MockSavedObjectsClientContract as unknown) as jest.Mocked; +const MockISavedObjectsRepository = + MockSavedObjectsClientContract as unknown as jest.Mocked; describe('partially_update_alert', () => { beforeEach(() => { @@ -32,7 +33,7 @@ describe('partially_update_alert', () => { }); test('should work with extraneous attributes ', async () => { - const attributes = (InvalidAttributes as unknown) as PartiallyUpdateableAlertAttributes; + const attributes = InvalidAttributes as unknown as PartiallyUpdateableAlertAttributes; soClient.update.mockResolvedValueOnce(MockUpdateValue); await partiallyUpdateAlert(soClient, MockAlertId, attributes); diff --git a/x-pack/plugins/alerting/server/task_runner/task_runner.test.ts b/x-pack/plugins/alerting/server/task_runner/task_runner.test.ts index 26b17d76553fd..bc477136ec111 100644 --- a/x-pack/plugins/alerting/server/task_runner/task_runner.test.ts +++ b/x-pack/plugins/alerting/server/task_runner/task_runner.test.ts @@ -360,48 +360,49 @@ describe('Task Runner', () => { testAgainstEphemeralSupport( 'actionsPlugin.execute is called per alert instance that is scheduled', ( - customTaskRunnerFactoryInitializerParams: TaskRunnerFactoryInitializerParamsType, - enqueueFunction: (options: ExecuteOptions) => Promise - ) => async () => { - customTaskRunnerFactoryInitializerParams.actionsPlugin.isActionTypeEnabled.mockReturnValue( - true - ); - customTaskRunnerFactoryInitializerParams.actionsPlugin.isActionExecutable.mockReturnValue( - true - ); - actionsClient.ephemeralEnqueuedExecution.mockResolvedValue(new Promise(() => {})); - alertType.executor.mockImplementation( - async ({ - services: executorServices, - }: AlertExecutorOptions< - AlertTypeParams, - AlertTypeState, - AlertInstanceState, - AlertInstanceContext, - string - >) => { - executorServices - .alertInstanceFactory('1') - .scheduleActionsWithSubGroup('default', 'subDefault'); - } - ); - const taskRunner = new TaskRunner( - alertType, - mockedTaskInstance, - customTaskRunnerFactoryInitializerParams - ); - rulesClient.get.mockResolvedValue(mockedAlertTypeSavedObject); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - }, - references: [], - }); - await taskRunner.run(); - expect(enqueueFunction).toHaveBeenCalledTimes(1); - expect((enqueueFunction as jest.Mock).mock.calls[0]).toMatchInlineSnapshot(` + customTaskRunnerFactoryInitializerParams: TaskRunnerFactoryInitializerParamsType, + enqueueFunction: (options: ExecuteOptions) => Promise + ) => + async () => { + customTaskRunnerFactoryInitializerParams.actionsPlugin.isActionTypeEnabled.mockReturnValue( + true + ); + customTaskRunnerFactoryInitializerParams.actionsPlugin.isActionExecutable.mockReturnValue( + true + ); + actionsClient.ephemeralEnqueuedExecution.mockResolvedValue(new Promise(() => {})); + alertType.executor.mockImplementation( + async ({ + services: executorServices, + }: AlertExecutorOptions< + AlertTypeParams, + AlertTypeState, + AlertInstanceState, + AlertInstanceContext, + string + >) => { + executorServices + .alertInstanceFactory('1') + .scheduleActionsWithSubGroup('default', 'subDefault'); + } + ); + const taskRunner = new TaskRunner( + alertType, + mockedTaskInstance, + customTaskRunnerFactoryInitializerParams + ); + rulesClient.get.mockResolvedValue(mockedAlertTypeSavedObject); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ + id: '1', + type: 'alert', + attributes: { + apiKey: Buffer.from('123:abc').toString('base64'), + }, + references: [], + }); + await taskRunner.run(); + expect(enqueueFunction).toHaveBeenCalledTimes(1); + expect((enqueueFunction as jest.Mock).mock.calls[0]).toMatchInlineSnapshot(` Array [ Object { "apiKey": "MTIzOmFiYw==", @@ -429,180 +430,184 @@ describe('Task Runner', () => { ] `); - const logger = customTaskRunnerFactoryInitializerParams.logger; - expect(logger.debug).toHaveBeenCalledTimes(3); - expect(logger.debug).nthCalledWith(1, 'executing alert test:1 at 1970-01-01T00:00:00.000Z'); - expect(logger.debug).nthCalledWith( - 2, - `alert test:1: 'alert-name' has 1 active alert instances: [{\"instanceId\":\"1\",\"actionGroup\":\"default\"}]` - ); - expect(logger.debug).nthCalledWith( - 3, - 'alertExecutionStatus for test:1: {"lastExecutionDate":"1970-01-01T00:00:00.000Z","status":"active"}' - ); - // alertExecutionStatus for test:1: {\"lastExecutionDate\":\"1970-01-01T00:00:00.000Z\",\"status\":\"error\",\"error\":{\"reason\":\"unknown\",\"message\":\"Cannot read property 'catch' of undefined\"}} - - const eventLogger = customTaskRunnerFactoryInitializerParams.eventLogger; - expect(eventLogger.logEvent).toHaveBeenCalledTimes(5); - expect(eventLogger.logEvent).toHaveBeenNthCalledWith(1, { - '@timestamp': '1970-01-01T00:00:00.000Z', - event: { - action: 'execute-start', - category: ['alerts'], - kind: 'alert', - }, - kibana: { - task: { - schedule_delay: 0, - scheduled: '1970-01-01T00:00:00.000Z', + const logger = customTaskRunnerFactoryInitializerParams.logger; + expect(logger.debug).toHaveBeenCalledTimes(3); + expect(logger.debug).nthCalledWith(1, 'executing alert test:1 at 1970-01-01T00:00:00.000Z'); + expect(logger.debug).nthCalledWith( + 2, + `alert test:1: 'alert-name' has 1 active alert instances: [{\"instanceId\":\"1\",\"actionGroup\":\"default\"}]` + ); + expect(logger.debug).nthCalledWith( + 3, + 'alertExecutionStatus for test:1: {"lastExecutionDate":"1970-01-01T00:00:00.000Z","status":"active"}' + ); + // alertExecutionStatus for test:1: {\"lastExecutionDate\":\"1970-01-01T00:00:00.000Z\",\"status\":\"error\",\"error\":{\"reason\":\"unknown\",\"message\":\"Cannot read property 'catch' of undefined\"}} + + const eventLogger = customTaskRunnerFactoryInitializerParams.eventLogger; + expect(eventLogger.logEvent).toHaveBeenCalledTimes(5); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith(1, { + '@timestamp': '1970-01-01T00:00:00.000Z', + event: { + action: 'execute-start', + category: ['alerts'], + kind: 'alert', }, - saved_objects: [ - { - id: '1', - namespace: undefined, - rel: 'primary', - type: 'alert', - type_id: 'test', - }, - ], - }, - message: `alert execution start: "1"`, - rule: { - category: 'test', - id: '1', - license: 'basic', - ruleset: 'alerts', - }, - }); - expect(eventLogger.logEvent).toHaveBeenNthCalledWith(2, { - event: { - action: 'new-instance', - category: ['alerts'], - kind: 'alert', - duration: 0, - start: '1970-01-01T00:00:00.000Z', - }, - kibana: { - alerting: { - action_group_id: 'default', - action_subgroup: 'subDefault', - instance_id: '1', + kibana: { + task: { + schedule_delay: 0, + scheduled: '1970-01-01T00:00:00.000Z', + }, + saved_objects: [ + { + id: '1', + namespace: undefined, + rel: 'primary', + type: 'alert', + type_id: 'test', + }, + ], }, - saved_objects: [ - { - id: '1', - namespace: undefined, - rel: 'primary', - type: 'alert', - type_id: 'test', - }, - ], - }, - message: "test:1: 'alert-name' created new instance: '1'", - rule: { - category: 'test', - id: '1', - license: 'basic', - name: 'alert-name', - namespace: undefined, - ruleset: 'alerts', - }, - }); - expect(eventLogger.logEvent).toHaveBeenNthCalledWith(3, { - event: { - action: 'active-instance', - category: ['alerts'], - duration: 0, - kind: 'alert', - start: '1970-01-01T00:00:00.000Z', - }, - kibana: { - alerting: { action_group_id: 'default', action_subgroup: 'subDefault', instance_id: '1' }, - saved_objects: [ - { id: '1', namespace: undefined, rel: 'primary', type: 'alert', type_id: 'test' }, - ], - }, - message: - "test:1: 'alert-name' active instance: '1' in actionGroup(subgroup): 'default(subDefault)'", - rule: { - category: 'test', - id: '1', - license: 'basic', - name: 'alert-name', - namespace: undefined, - ruleset: 'alerts', - }, - }); - expect(eventLogger.logEvent).toHaveBeenNthCalledWith(4, { - event: { - action: 'execute-action', - category: ['alerts'], - kind: 'alert', - }, - kibana: { - alerting: { - instance_id: '1', - action_group_id: 'default', - action_subgroup: 'subDefault', + message: `alert execution start: "1"`, + rule: { + category: 'test', + id: '1', + license: 'basic', + ruleset: 'alerts', }, - saved_objects: [ - { - id: '1', - namespace: undefined, - rel: 'primary', - type: 'alert', - type_id: 'test', - }, - { - id: '1', - namespace: undefined, - type: 'action', - type_id: 'action', - }, - ], - }, - message: - "alert: test:1: 'alert-name' instanceId: '1' scheduled actionGroup(subgroup): 'default(subDefault)' action: action:1", - rule: { - category: 'test', - id: '1', - license: 'basic', - name: 'alert-name', - namespace: undefined, - ruleset: 'alerts', - }, - }); - expect(eventLogger.logEvent).toHaveBeenNthCalledWith(5, { - '@timestamp': '1970-01-01T00:00:00.000Z', - event: { action: 'execute', category: ['alerts'], kind: 'alert', outcome: 'success' }, - kibana: { - alerting: { - status: 'active', + }); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith(2, { + event: { + action: 'new-instance', + category: ['alerts'], + kind: 'alert', + duration: 0, + start: '1970-01-01T00:00:00.000Z', }, - task: { - schedule_delay: 0, - scheduled: '1970-01-01T00:00:00.000Z', + kibana: { + alerting: { + action_group_id: 'default', + action_subgroup: 'subDefault', + instance_id: '1', + }, + saved_objects: [ + { + id: '1', + namespace: undefined, + rel: 'primary', + type: 'alert', + type_id: 'test', + }, + ], }, - saved_objects: [ - { - id: '1', - namespace: undefined, - rel: 'primary', - type: 'alert', - type_id: 'test', - }, - ], - }, - message: "alert executed: test:1: 'alert-name'", - rule: { - category: 'test', - id: '1', - license: 'basic', - name: 'alert-name', - ruleset: 'alerts', - }, - }); - } + message: "test:1: 'alert-name' created new instance: '1'", + rule: { + category: 'test', + id: '1', + license: 'basic', + name: 'alert-name', + namespace: undefined, + ruleset: 'alerts', + }, + }); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith(3, { + event: { + action: 'active-instance', + category: ['alerts'], + duration: 0, + kind: 'alert', + start: '1970-01-01T00:00:00.000Z', + }, + kibana: { + alerting: { + action_group_id: 'default', + action_subgroup: 'subDefault', + instance_id: '1', + }, + saved_objects: [ + { id: '1', namespace: undefined, rel: 'primary', type: 'alert', type_id: 'test' }, + ], + }, + message: + "test:1: 'alert-name' active instance: '1' in actionGroup(subgroup): 'default(subDefault)'", + rule: { + category: 'test', + id: '1', + license: 'basic', + name: 'alert-name', + namespace: undefined, + ruleset: 'alerts', + }, + }); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith(4, { + event: { + action: 'execute-action', + category: ['alerts'], + kind: 'alert', + }, + kibana: { + alerting: { + instance_id: '1', + action_group_id: 'default', + action_subgroup: 'subDefault', + }, + saved_objects: [ + { + id: '1', + namespace: undefined, + rel: 'primary', + type: 'alert', + type_id: 'test', + }, + { + id: '1', + namespace: undefined, + type: 'action', + type_id: 'action', + }, + ], + }, + message: + "alert: test:1: 'alert-name' instanceId: '1' scheduled actionGroup(subgroup): 'default(subDefault)' action: action:1", + rule: { + category: 'test', + id: '1', + license: 'basic', + name: 'alert-name', + namespace: undefined, + ruleset: 'alerts', + }, + }); + expect(eventLogger.logEvent).toHaveBeenNthCalledWith(5, { + '@timestamp': '1970-01-01T00:00:00.000Z', + event: { action: 'execute', category: ['alerts'], kind: 'alert', outcome: 'success' }, + kibana: { + alerting: { + status: 'active', + }, + task: { + schedule_delay: 0, + scheduled: '1970-01-01T00:00:00.000Z', + }, + saved_objects: [ + { + id: '1', + namespace: undefined, + rel: 'primary', + type: 'alert', + type_id: 'test', + }, + ], + }, + message: "alert executed: test:1: 'alert-name'", + rule: { + category: 'test', + id: '1', + license: 'basic', + name: 'alert-name', + ruleset: 'alerts', + }, + }); + } ); test('actionsPlugin.execute is skipped if muteAll is true', async () => { @@ -796,66 +801,67 @@ describe('Task Runner', () => { testAgainstEphemeralSupport( 'skips firing actions for active instance if instance is muted', ( - customTaskRunnerFactoryInitializerParams: TaskRunnerFactoryInitializerParamsType, - enqueueFunction: (options: ExecuteOptions) => Promise - ) => async () => { - customTaskRunnerFactoryInitializerParams.actionsPlugin.isActionTypeEnabled.mockReturnValue( - true - ); - customTaskRunnerFactoryInitializerParams.actionsPlugin.isActionExecutable.mockReturnValue( - true - ); - actionsClient.ephemeralEnqueuedExecution.mockResolvedValue(new Promise(() => {})); - alertType.executor.mockImplementation( - async ({ - services: executorServices, - }: AlertExecutorOptions< - AlertTypeParams, - AlertTypeState, - AlertInstanceState, - AlertInstanceContext, - string - >) => { - executorServices.alertInstanceFactory('1').scheduleActions('default'); - executorServices.alertInstanceFactory('2').scheduleActions('default'); - } - ); - const taskRunner = new TaskRunner( - alertType, - mockedTaskInstance, - customTaskRunnerFactoryInitializerParams - ); - rulesClient.get.mockResolvedValue({ - ...mockedAlertTypeSavedObject, - mutedInstanceIds: ['2'], - }); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - }, - references: [], - }); - await taskRunner.run(); - expect(enqueueFunction).toHaveBeenCalledTimes(1); - - const logger = customTaskRunnerFactoryInitializerParams.logger; - expect(logger.debug).toHaveBeenCalledTimes(4); - expect(logger.debug).nthCalledWith(1, 'executing alert test:1 at 1970-01-01T00:00:00.000Z'); - expect(logger.debug).nthCalledWith( - 2, - `alert test:1: 'alert-name' has 2 active alert instances: [{\"instanceId\":\"1\",\"actionGroup\":\"default\"},{\"instanceId\":\"2\",\"actionGroup\":\"default\"}]` - ); - expect(logger.debug).nthCalledWith( - 3, - `skipping scheduling of actions for '2' in alert test:1: 'alert-name': instance is muted` - ); - expect(logger.debug).nthCalledWith( - 4, - 'alertExecutionStatus for test:1: {"lastExecutionDate":"1970-01-01T00:00:00.000Z","status":"active"}' - ); - } + customTaskRunnerFactoryInitializerParams: TaskRunnerFactoryInitializerParamsType, + enqueueFunction: (options: ExecuteOptions) => Promise + ) => + async () => { + customTaskRunnerFactoryInitializerParams.actionsPlugin.isActionTypeEnabled.mockReturnValue( + true + ); + customTaskRunnerFactoryInitializerParams.actionsPlugin.isActionExecutable.mockReturnValue( + true + ); + actionsClient.ephemeralEnqueuedExecution.mockResolvedValue(new Promise(() => {})); + alertType.executor.mockImplementation( + async ({ + services: executorServices, + }: AlertExecutorOptions< + AlertTypeParams, + AlertTypeState, + AlertInstanceState, + AlertInstanceContext, + string + >) => { + executorServices.alertInstanceFactory('1').scheduleActions('default'); + executorServices.alertInstanceFactory('2').scheduleActions('default'); + } + ); + const taskRunner = new TaskRunner( + alertType, + mockedTaskInstance, + customTaskRunnerFactoryInitializerParams + ); + rulesClient.get.mockResolvedValue({ + ...mockedAlertTypeSavedObject, + mutedInstanceIds: ['2'], + }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ + id: '1', + type: 'alert', + attributes: { + apiKey: Buffer.from('123:abc').toString('base64'), + }, + references: [], + }); + await taskRunner.run(); + expect(enqueueFunction).toHaveBeenCalledTimes(1); + + const logger = customTaskRunnerFactoryInitializerParams.logger; + expect(logger.debug).toHaveBeenCalledTimes(4); + expect(logger.debug).nthCalledWith(1, 'executing alert test:1 at 1970-01-01T00:00:00.000Z'); + expect(logger.debug).nthCalledWith( + 2, + `alert test:1: 'alert-name' has 2 active alert instances: [{\"instanceId\":\"1\",\"actionGroup\":\"default\"},{\"instanceId\":\"2\",\"actionGroup\":\"default\"}]` + ); + expect(logger.debug).nthCalledWith( + 3, + `skipping scheduling of actions for '2' in alert test:1: 'alert-name': instance is muted` + ); + expect(logger.debug).nthCalledWith( + 4, + 'alertExecutionStatus for test:1: {"lastExecutionDate":"1970-01-01T00:00:00.000Z","status":"active"}' + ); + } ); test('actionsPlugin.execute is not called when notifyWhen=onActionGroupChange and alert instance state does not change', async () => { @@ -1032,193 +1038,196 @@ describe('Task Runner', () => { testAgainstEphemeralSupport( 'actionsPlugin.execute is called when notifyWhen=onActionGroupChange and alert instance state has changed', ( - customTaskRunnerFactoryInitializerParams: TaskRunnerFactoryInitializerParamsType, - enqueueFunction: (options: ExecuteOptions) => Promise - ) => async () => { - customTaskRunnerFactoryInitializerParams.actionsPlugin.isActionTypeEnabled.mockReturnValue( - true - ); - customTaskRunnerFactoryInitializerParams.actionsPlugin.isActionExecutable.mockReturnValue( - true - ); - alertType.executor.mockImplementation( - async ({ - services: executorServices, - }: AlertExecutorOptions< - AlertTypeParams, - AlertTypeState, - AlertInstanceState, - AlertInstanceContext, - string - >) => { - executorServices.alertInstanceFactory('1').scheduleActions('default'); - } - ); - const taskRunner = new TaskRunner( - alertType, - { - ...mockedTaskInstance, - state: { - ...mockedTaskInstance.state, - alertInstances: { - '1': { - meta: { - lastScheduledActions: { group: 'newGroup', date: new Date().toISOString() }, + customTaskRunnerFactoryInitializerParams: TaskRunnerFactoryInitializerParamsType, + enqueueFunction: (options: ExecuteOptions) => Promise + ) => + async () => { + customTaskRunnerFactoryInitializerParams.actionsPlugin.isActionTypeEnabled.mockReturnValue( + true + ); + customTaskRunnerFactoryInitializerParams.actionsPlugin.isActionExecutable.mockReturnValue( + true + ); + alertType.executor.mockImplementation( + async ({ + services: executorServices, + }: AlertExecutorOptions< + AlertTypeParams, + AlertTypeState, + AlertInstanceState, + AlertInstanceContext, + string + >) => { + executorServices.alertInstanceFactory('1').scheduleActions('default'); + } + ); + const taskRunner = new TaskRunner( + alertType, + { + ...mockedTaskInstance, + state: { + ...mockedTaskInstance.state, + alertInstances: { + '1': { + meta: { + lastScheduledActions: { group: 'newGroup', date: new Date().toISOString() }, + }, + state: { bar: false }, }, - state: { bar: false }, }, }, }, - }, - customTaskRunnerFactoryInitializerParams - ); - rulesClient.get.mockResolvedValue({ - ...mockedAlertTypeSavedObject, - notifyWhen: 'onActionGroupChange', - }); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - }, - references: [], - }); - await taskRunner.run(); - expect(enqueueFunction).toHaveBeenCalledTimes(1); - } + customTaskRunnerFactoryInitializerParams + ); + rulesClient.get.mockResolvedValue({ + ...mockedAlertTypeSavedObject, + notifyWhen: 'onActionGroupChange', + }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ + id: '1', + type: 'alert', + attributes: { + apiKey: Buffer.from('123:abc').toString('base64'), + }, + references: [], + }); + await taskRunner.run(); + expect(enqueueFunction).toHaveBeenCalledTimes(1); + } ); testAgainstEphemeralSupport( 'actionsPlugin.execute is called when notifyWhen=onActionGroupChange and alert instance state subgroup has changed', ( - customTaskRunnerFactoryInitializerParams: TaskRunnerFactoryInitializerParamsType, - enqueueFunction: (options: ExecuteOptions) => Promise - ) => async () => { - customTaskRunnerFactoryInitializerParams.actionsPlugin.isActionTypeEnabled.mockReturnValue( - true - ); - - customTaskRunnerFactoryInitializerParams.actionsPlugin.isActionExecutable.mockReturnValue( - true - ); - alertType.executor.mockImplementation( - async ({ - services: executorServices, - }: AlertExecutorOptions< - AlertTypeParams, - AlertTypeState, - AlertInstanceState, - AlertInstanceContext, - string - >) => { - executorServices - .alertInstanceFactory('1') - .scheduleActionsWithSubGroup('default', 'subgroup1'); - } - ); - const taskRunner = new TaskRunner( - alertType, - { - ...mockedTaskInstance, - state: { - ...mockedTaskInstance.state, - alertInstances: { - '1': { - meta: { - lastScheduledActions: { - group: 'default', - subgroup: 'newSubgroup', - date: new Date().toISOString(), + customTaskRunnerFactoryInitializerParams: TaskRunnerFactoryInitializerParamsType, + enqueueFunction: (options: ExecuteOptions) => Promise + ) => + async () => { + customTaskRunnerFactoryInitializerParams.actionsPlugin.isActionTypeEnabled.mockReturnValue( + true + ); + + customTaskRunnerFactoryInitializerParams.actionsPlugin.isActionExecutable.mockReturnValue( + true + ); + alertType.executor.mockImplementation( + async ({ + services: executorServices, + }: AlertExecutorOptions< + AlertTypeParams, + AlertTypeState, + AlertInstanceState, + AlertInstanceContext, + string + >) => { + executorServices + .alertInstanceFactory('1') + .scheduleActionsWithSubGroup('default', 'subgroup1'); + } + ); + const taskRunner = new TaskRunner( + alertType, + { + ...mockedTaskInstance, + state: { + ...mockedTaskInstance.state, + alertInstances: { + '1': { + meta: { + lastScheduledActions: { + group: 'default', + subgroup: 'newSubgroup', + date: new Date().toISOString(), + }, }, + state: { bar: false }, }, - state: { bar: false }, }, }, }, - }, - customTaskRunnerFactoryInitializerParams - ); - rulesClient.get.mockResolvedValue({ - ...mockedAlertTypeSavedObject, - notifyWhen: 'onActionGroupChange', - }); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - }, - references: [], - }); - await taskRunner.run(); - expect(enqueueFunction).toHaveBeenCalledTimes(1); - } + customTaskRunnerFactoryInitializerParams + ); + rulesClient.get.mockResolvedValue({ + ...mockedAlertTypeSavedObject, + notifyWhen: 'onActionGroupChange', + }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ + id: '1', + type: 'alert', + attributes: { + apiKey: Buffer.from('123:abc').toString('base64'), + }, + references: [], + }); + await taskRunner.run(); + expect(enqueueFunction).toHaveBeenCalledTimes(1); + } ); testAgainstEphemeralSupport( 'includes the apiKey in the request used to initialize the actionsClient', ( - customTaskRunnerFactoryInitializerParams: TaskRunnerFactoryInitializerParamsType, - enqueueFunction: (options: ExecuteOptions) => Promise - ) => async () => { - customTaskRunnerFactoryInitializerParams.actionsPlugin.isActionTypeEnabled.mockReturnValue( - true - ); - customTaskRunnerFactoryInitializerParams.actionsPlugin.isActionExecutable.mockReturnValue( - true - ); - actionsClient.ephemeralEnqueuedExecution.mockResolvedValue(new Promise(() => {})); - alertType.executor.mockImplementation( - async ({ - services: executorServices, - }: AlertExecutorOptions< - AlertTypeParams, - AlertTypeState, - AlertInstanceState, - AlertInstanceContext, - string - >) => { - executorServices.alertInstanceFactory('1').scheduleActions('default'); - } - ); - const taskRunner = new TaskRunner( - alertType, - mockedTaskInstance, - customTaskRunnerFactoryInitializerParams - ); - rulesClient.get.mockResolvedValue(mockedAlertTypeSavedObject); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValueOnce({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - }, - references: [], - }); - await taskRunner.run(); - expect( - customTaskRunnerFactoryInitializerParams.actionsPlugin.getActionsClientWithRequest - ).toHaveBeenCalledWith( - expect.objectContaining({ - headers: { - // base64 encoded "123:abc" - authorization: 'ApiKey MTIzOmFiYw==', + customTaskRunnerFactoryInitializerParams: TaskRunnerFactoryInitializerParamsType, + enqueueFunction: (options: ExecuteOptions) => Promise + ) => + async () => { + customTaskRunnerFactoryInitializerParams.actionsPlugin.isActionTypeEnabled.mockReturnValue( + true + ); + customTaskRunnerFactoryInitializerParams.actionsPlugin.isActionExecutable.mockReturnValue( + true + ); + actionsClient.ephemeralEnqueuedExecution.mockResolvedValue(new Promise(() => {})); + alertType.executor.mockImplementation( + async ({ + services: executorServices, + }: AlertExecutorOptions< + AlertTypeParams, + AlertTypeState, + AlertInstanceState, + AlertInstanceContext, + string + >) => { + executorServices.alertInstanceFactory('1').scheduleActions('default'); + } + ); + const taskRunner = new TaskRunner( + alertType, + mockedTaskInstance, + customTaskRunnerFactoryInitializerParams + ); + rulesClient.get.mockResolvedValue(mockedAlertTypeSavedObject); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValueOnce({ + id: '1', + type: 'alert', + attributes: { + apiKey: Buffer.from('123:abc').toString('base64'), }, - }) - ); - - const [ - request, - ] = customTaskRunnerFactoryInitializerParams.actionsPlugin.getActionsClientWithRequest.mock.calls[0]; - - expect(customTaskRunnerFactoryInitializerParams.basePathService.set).toHaveBeenCalledWith( - request, - '/' - ); - - expect(enqueueFunction).toHaveBeenCalledTimes(1); - expect((enqueueFunction as jest.Mock).mock.calls[0]).toMatchInlineSnapshot(` + references: [], + }); + await taskRunner.run(); + expect( + customTaskRunnerFactoryInitializerParams.actionsPlugin.getActionsClientWithRequest + ).toHaveBeenCalledWith( + expect.objectContaining({ + headers: { + // base64 encoded "123:abc" + authorization: 'ApiKey MTIzOmFiYw==', + }, + }) + ); + + const [request] = + customTaskRunnerFactoryInitializerParams.actionsPlugin.getActionsClientWithRequest.mock + .calls[0]; + + expect(customTaskRunnerFactoryInitializerParams.basePathService.set).toHaveBeenCalledWith( + request, + '/' + ); + + expect(enqueueFunction).toHaveBeenCalledTimes(1); + expect((enqueueFunction as jest.Mock).mock.calls[0]).toMatchInlineSnapshot(` Array [ Object { "apiKey": "MTIzOmFiYw==", @@ -1246,10 +1255,10 @@ describe('Task Runner', () => { ] `); - const eventLogger = customTaskRunnerFactoryInitializerParams.eventLogger; - expect(eventLogger.logEvent).toHaveBeenCalledTimes(5); - expect(eventLogger.startTiming).toHaveBeenCalledTimes(1); - expect(eventLogger.logEvent.mock.calls).toMatchInlineSnapshot(` + const eventLogger = customTaskRunnerFactoryInitializerParams.eventLogger; + expect(eventLogger.logEvent).toHaveBeenCalledTimes(5); + expect(eventLogger.startTiming).toHaveBeenCalledTimes(1); + expect(eventLogger.logEvent.mock.calls).toMatchInlineSnapshot(` Array [ Array [ Object { @@ -1439,75 +1448,76 @@ describe('Task Runner', () => { ], ] `); - } + } ); testAgainstEphemeralSupport( 'fire recovered actions for execution for the alertInstances which is in the recovered state', ( - customTaskRunnerFactoryInitializerParams: TaskRunnerFactoryInitializerParamsType, - enqueueFunction: (options: ExecuteOptions) => Promise - ) => async () => { - customTaskRunnerFactoryInitializerParams.actionsPlugin.isActionTypeEnabled.mockReturnValue( - true - ); - customTaskRunnerFactoryInitializerParams.actionsPlugin.isActionExecutable.mockReturnValue( - true - ); - actionsClient.ephemeralEnqueuedExecution.mockResolvedValue(new Promise(() => {})); - - alertType.executor.mockImplementation( - async ({ - services: executorServices, - }: AlertExecutorOptions< - AlertTypeParams, - AlertTypeState, - AlertInstanceState, - AlertInstanceContext, - string - >) => { - executorServices.alertInstanceFactory('1').scheduleActions('default'); - } - ); - const taskRunner = new TaskRunner( - alertType, - { - ...mockedTaskInstance, - state: { - ...mockedTaskInstance.state, - alertInstances: { - '1': { - meta: {}, - state: { - bar: false, - start: '1969-12-31T00:00:00.000Z', - duration: 80000000000, + customTaskRunnerFactoryInitializerParams: TaskRunnerFactoryInitializerParamsType, + enqueueFunction: (options: ExecuteOptions) => Promise + ) => + async () => { + customTaskRunnerFactoryInitializerParams.actionsPlugin.isActionTypeEnabled.mockReturnValue( + true + ); + customTaskRunnerFactoryInitializerParams.actionsPlugin.isActionExecutable.mockReturnValue( + true + ); + actionsClient.ephemeralEnqueuedExecution.mockResolvedValue(new Promise(() => {})); + + alertType.executor.mockImplementation( + async ({ + services: executorServices, + }: AlertExecutorOptions< + AlertTypeParams, + AlertTypeState, + AlertInstanceState, + AlertInstanceContext, + string + >) => { + executorServices.alertInstanceFactory('1').scheduleActions('default'); + } + ); + const taskRunner = new TaskRunner( + alertType, + { + ...mockedTaskInstance, + state: { + ...mockedTaskInstance.state, + alertInstances: { + '1': { + meta: {}, + state: { + bar: false, + start: '1969-12-31T00:00:00.000Z', + duration: 80000000000, + }, }, - }, - '2': { - meta: {}, - state: { - bar: false, - start: '1969-12-31T06:00:00.000Z', - duration: 70000000000, + '2': { + meta: {}, + state: { + bar: false, + start: '1969-12-31T06:00:00.000Z', + duration: 70000000000, + }, }, }, }, }, - }, - customTaskRunnerFactoryInitializerParams - ); - rulesClient.get.mockResolvedValue(mockedAlertTypeSavedObject); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - }, - references: [], - }); - const runnerResult = await taskRunner.run(); - expect(runnerResult.state.alertInstances).toMatchInlineSnapshot(` + customTaskRunnerFactoryInitializerParams + ); + rulesClient.get.mockResolvedValue(mockedAlertTypeSavedObject); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ + id: '1', + type: 'alert', + attributes: { + apiKey: Buffer.from('123:abc').toString('base64'), + }, + references: [], + }); + const runnerResult = await taskRunner.run(); + expect(runnerResult.state.alertInstances).toMatchInlineSnapshot(` Object { "1": Object { "meta": Object { @@ -1526,26 +1536,26 @@ describe('Task Runner', () => { } `); - const logger = customTaskRunnerFactoryInitializerParams.logger; - expect(logger.debug).toHaveBeenCalledTimes(4); - expect(logger.debug).nthCalledWith(1, 'executing alert test:1 at 1970-01-01T00:00:00.000Z'); - expect(logger.debug).nthCalledWith( - 2, - `alert test:1: 'alert-name' has 1 active alert instances: [{\"instanceId\":\"1\",\"actionGroup\":\"default\"}]` - ); - expect(logger.debug).nthCalledWith( - 3, - `alert test:1: 'alert-name' has 1 recovered alert instances: [\"2\"]` - ); - expect(logger.debug).nthCalledWith( - 4, - 'alertExecutionStatus for test:1: {"lastExecutionDate":"1970-01-01T00:00:00.000Z","status":"active"}' - ); - - const eventLogger = customTaskRunnerFactoryInitializerParams.eventLogger; - expect(eventLogger.logEvent).toHaveBeenCalledTimes(6); - expect(eventLogger.startTiming).toHaveBeenCalledTimes(1); - expect(eventLogger.logEvent.mock.calls).toMatchInlineSnapshot(` + const logger = customTaskRunnerFactoryInitializerParams.logger; + expect(logger.debug).toHaveBeenCalledTimes(4); + expect(logger.debug).nthCalledWith(1, 'executing alert test:1 at 1970-01-01T00:00:00.000Z'); + expect(logger.debug).nthCalledWith( + 2, + `alert test:1: 'alert-name' has 1 active alert instances: [{\"instanceId\":\"1\",\"actionGroup\":\"default\"}]` + ); + expect(logger.debug).nthCalledWith( + 3, + `alert test:1: 'alert-name' has 1 recovered alert instances: [\"2\"]` + ); + expect(logger.debug).nthCalledWith( + 4, + 'alertExecutionStatus for test:1: {"lastExecutionDate":"1970-01-01T00:00:00.000Z","status":"active"}' + ); + + const eventLogger = customTaskRunnerFactoryInitializerParams.eventLogger; + expect(eventLogger.logEvent).toHaveBeenCalledTimes(6); + expect(eventLogger.startTiming).toHaveBeenCalledTimes(1); + expect(eventLogger.logEvent.mock.calls).toMatchInlineSnapshot(` Array [ Array [ Object { @@ -1777,8 +1787,8 @@ describe('Task Runner', () => { ] `); - expect(enqueueFunction).toHaveBeenCalledTimes(2); - expect((enqueueFunction as jest.Mock).mock.calls[0]).toMatchInlineSnapshot(` + expect(enqueueFunction).toHaveBeenCalledTimes(2); + expect((enqueueFunction as jest.Mock).mock.calls[0]).toMatchInlineSnapshot(` Array [ Object { "apiKey": "MTIzOmFiYw==", @@ -1805,68 +1815,69 @@ describe('Task Runner', () => { }, ] `); - } + } ); testAgainstEphemeralSupport( 'should skip alertInstances which werent active on the previous execution', ( - customTaskRunnerFactoryInitializerParams: TaskRunnerFactoryInitializerParamsType, - enqueueFunction: (options: ExecuteOptions) => Promise - ) => async () => { - const alertId = 'e558aaad-fd81-46d2-96fc-3bd8fc3dc03f'; - customTaskRunnerFactoryInitializerParams.actionsPlugin.isActionTypeEnabled.mockReturnValue( - true - ); - customTaskRunnerFactoryInitializerParams.actionsPlugin.isActionExecutable.mockReturnValue( - true - ); - actionsClient.ephemeralEnqueuedExecution.mockResolvedValue(new Promise(() => {})); - - alertType.executor.mockImplementation( - async ({ - services: executorServices, - }: AlertExecutorOptions< - AlertTypeParams, - AlertTypeState, - AlertInstanceState, - AlertInstanceContext, - string - >) => { - executorServices.alertInstanceFactory('1').scheduleActions('default'); - - // create an instance, but don't schedule any actions, so it doesn't go active - executorServices.alertInstanceFactory('3'); - } - ); - const taskRunner = new TaskRunner( - alertType, - { - ...mockedTaskInstance, - state: { - ...mockedTaskInstance.state, - alertInstances: { - '1': { meta: {}, state: { bar: false } }, - '2': { meta: {}, state: { bar: false } }, + customTaskRunnerFactoryInitializerParams: TaskRunnerFactoryInitializerParamsType, + enqueueFunction: (options: ExecuteOptions) => Promise + ) => + async () => { + const alertId = 'e558aaad-fd81-46d2-96fc-3bd8fc3dc03f'; + customTaskRunnerFactoryInitializerParams.actionsPlugin.isActionTypeEnabled.mockReturnValue( + true + ); + customTaskRunnerFactoryInitializerParams.actionsPlugin.isActionExecutable.mockReturnValue( + true + ); + actionsClient.ephemeralEnqueuedExecution.mockResolvedValue(new Promise(() => {})); + + alertType.executor.mockImplementation( + async ({ + services: executorServices, + }: AlertExecutorOptions< + AlertTypeParams, + AlertTypeState, + AlertInstanceState, + AlertInstanceContext, + string + >) => { + executorServices.alertInstanceFactory('1').scheduleActions('default'); + + // create an instance, but don't schedule any actions, so it doesn't go active + executorServices.alertInstanceFactory('3'); + } + ); + const taskRunner = new TaskRunner( + alertType, + { + ...mockedTaskInstance, + state: { + ...mockedTaskInstance.state, + alertInstances: { + '1': { meta: {}, state: { bar: false } }, + '2': { meta: {}, state: { bar: false } }, + }, + }, + params: { + alertId, }, }, - params: { - alertId, + customTaskRunnerFactoryInitializerParams + ); + rulesClient.get.mockResolvedValue(mockedAlertTypeSavedObject); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ + id: alertId, + type: 'alert', + attributes: { + apiKey: Buffer.from('123:abc').toString('base64'), }, - }, - customTaskRunnerFactoryInitializerParams - ); - rulesClient.get.mockResolvedValue(mockedAlertTypeSavedObject); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ - id: alertId, - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - }, - references: [], - }); - const runnerResult = await taskRunner.run(); - expect(runnerResult.state.alertInstances).toMatchInlineSnapshot(` + references: [], + }); + const runnerResult = await taskRunner.run(); + expect(runnerResult.state.alertInstances).toMatchInlineSnapshot(` Object { "1": Object { "meta": Object { @@ -1883,111 +1894,112 @@ describe('Task Runner', () => { } `); - const logger = customTaskRunnerFactoryInitializerParams.logger; - expect(logger.debug).toHaveBeenCalledWith( - `alert test:${alertId}: 'alert-name' has 1 active alert instances: [{\"instanceId\":\"1\",\"actionGroup\":\"default\"}]` - ); - - expect(logger.debug).nthCalledWith( - 3, - `alert test:${alertId}: 'alert-name' has 1 recovered alert instances: [\"2\"]` - ); - expect(logger.debug).nthCalledWith( - 4, - `alertExecutionStatus for test:${alertId}: {"lastExecutionDate":"1970-01-01T00:00:00.000Z","status":"active"}` - ); - - const eventLogger = customTaskRunnerFactoryInitializerParams.eventLogger; - expect(eventLogger.logEvent).toHaveBeenCalledTimes(6); - expect(enqueueFunction).toHaveBeenCalledTimes(2); - expect((enqueueFunction as jest.Mock).mock.calls[1][0].id).toEqual('1'); - expect((enqueueFunction as jest.Mock).mock.calls[0][0].id).toEqual('2'); - } + const logger = customTaskRunnerFactoryInitializerParams.logger; + expect(logger.debug).toHaveBeenCalledWith( + `alert test:${alertId}: 'alert-name' has 1 active alert instances: [{\"instanceId\":\"1\",\"actionGroup\":\"default\"}]` + ); + + expect(logger.debug).nthCalledWith( + 3, + `alert test:${alertId}: 'alert-name' has 1 recovered alert instances: [\"2\"]` + ); + expect(logger.debug).nthCalledWith( + 4, + `alertExecutionStatus for test:${alertId}: {"lastExecutionDate":"1970-01-01T00:00:00.000Z","status":"active"}` + ); + + const eventLogger = customTaskRunnerFactoryInitializerParams.eventLogger; + expect(eventLogger.logEvent).toHaveBeenCalledTimes(6); + expect(enqueueFunction).toHaveBeenCalledTimes(2); + expect((enqueueFunction as jest.Mock).mock.calls[1][0].id).toEqual('1'); + expect((enqueueFunction as jest.Mock).mock.calls[0][0].id).toEqual('2'); + } ); testAgainstEphemeralSupport( 'fire actions under a custom recovery group when specified on an alert type for alertInstances which are in the recovered state', ( - customTaskRunnerFactoryInitializerParams: TaskRunnerFactoryInitializerParamsType, - enqueueFunction: (options: ExecuteOptions) => Promise - ) => async () => { - customTaskRunnerFactoryInitializerParams.actionsPlugin.isActionTypeEnabled.mockReturnValue( - true - ); - customTaskRunnerFactoryInitializerParams.actionsPlugin.isActionExecutable.mockReturnValue( - true - ); - - actionsClient.ephemeralEnqueuedExecution.mockResolvedValue(new Promise(() => {})); - - const recoveryActionGroup = { - id: 'customRecovered', - name: 'Custom Recovered', - }; - const alertTypeWithCustomRecovery = { - ...alertType, - recoveryActionGroup, - actionGroups: [{ id: 'default', name: 'Default' }, recoveryActionGroup], - }; - - alertTypeWithCustomRecovery.executor.mockImplementation( - async ({ - services: executorServices, - }: AlertExecutorOptions< - AlertTypeParams, - AlertTypeState, - AlertInstanceState, - AlertInstanceContext, - string - >) => { - executorServices.alertInstanceFactory('1').scheduleActions('default'); - } - ); - const taskRunner = new TaskRunner( - alertTypeWithCustomRecovery, - { - ...mockedTaskInstance, - state: { - ...mockedTaskInstance.state, - alertInstances: { - '1': { meta: {}, state: { bar: false } }, - '2': { meta: {}, state: { bar: false } }, - }, - }, - }, - customTaskRunnerFactoryInitializerParams - ); - rulesClient.get.mockResolvedValue({ - ...mockedAlertTypeSavedObject, - actions: [ + customTaskRunnerFactoryInitializerParams: TaskRunnerFactoryInitializerParamsType, + enqueueFunction: (options: ExecuteOptions) => Promise + ) => + async () => { + customTaskRunnerFactoryInitializerParams.actionsPlugin.isActionTypeEnabled.mockReturnValue( + true + ); + customTaskRunnerFactoryInitializerParams.actionsPlugin.isActionExecutable.mockReturnValue( + true + ); + + actionsClient.ephemeralEnqueuedExecution.mockResolvedValue(new Promise(() => {})); + + const recoveryActionGroup = { + id: 'customRecovered', + name: 'Custom Recovered', + }; + const alertTypeWithCustomRecovery = { + ...alertType, + recoveryActionGroup, + actionGroups: [{ id: 'default', name: 'Default' }, recoveryActionGroup], + }; + + alertTypeWithCustomRecovery.executor.mockImplementation( + async ({ + services: executorServices, + }: AlertExecutorOptions< + AlertTypeParams, + AlertTypeState, + AlertInstanceState, + AlertInstanceContext, + string + >) => { + executorServices.alertInstanceFactory('1').scheduleActions('default'); + } + ); + const taskRunner = new TaskRunner( + alertTypeWithCustomRecovery, { - group: 'default', - id: '1', - actionTypeId: 'action', - params: { - foo: true, + ...mockedTaskInstance, + state: { + ...mockedTaskInstance.state, + alertInstances: { + '1': { meta: {}, state: { bar: false } }, + '2': { meta: {}, state: { bar: false } }, + }, }, }, - { - group: recoveryActionGroup.id, - id: '2', - actionTypeId: 'action', - params: { - isResolved: true, + customTaskRunnerFactoryInitializerParams + ); + rulesClient.get.mockResolvedValue({ + ...mockedAlertTypeSavedObject, + actions: [ + { + group: 'default', + id: '1', + actionTypeId: 'action', + params: { + foo: true, + }, }, + { + group: recoveryActionGroup.id, + id: '2', + actionTypeId: 'action', + params: { + isResolved: true, + }, + }, + ], + }); + encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ + id: '1', + type: 'alert', + attributes: { + apiKey: Buffer.from('123:abc').toString('base64'), }, - ], - }); - encryptedSavedObjectsClient.getDecryptedAsInternalUser.mockResolvedValue({ - id: '1', - type: 'alert', - attributes: { - apiKey: Buffer.from('123:abc').toString('base64'), - }, - references: [], - }); - const runnerResult = await taskRunner.run(); - expect(runnerResult.state.alertInstances).toMatchInlineSnapshot(` + references: [], + }); + const runnerResult = await taskRunner.run(); + expect(runnerResult.state.alertInstances).toMatchInlineSnapshot(` Object { "1": Object { "meta": Object { @@ -2004,10 +2016,10 @@ describe('Task Runner', () => { } `); - const eventLogger = customTaskRunnerFactoryInitializerParams.eventLogger; - expect(eventLogger.logEvent).toHaveBeenCalledTimes(6); - expect(enqueueFunction).toHaveBeenCalledTimes(2); - expect((enqueueFunction as jest.Mock).mock.calls[0]).toMatchInlineSnapshot(` + const eventLogger = customTaskRunnerFactoryInitializerParams.eventLogger; + expect(eventLogger.logEvent).toHaveBeenCalledTimes(6); + expect(enqueueFunction).toHaveBeenCalledTimes(2); + expect((enqueueFunction as jest.Mock).mock.calls[0]).toMatchInlineSnapshot(` Array [ Object { "apiKey": "MTIzOmFiYw==", @@ -2034,7 +2046,7 @@ describe('Task Runner', () => { }, ] `); - } + } ); test('persists alertInstances passed in from state, only if they are scheduled for execution', async () => { diff --git a/x-pack/plugins/alerting/server/task_runner/task_runner.ts b/x-pack/plugins/alerting/server/task_runner/task_runner.ts index 6694146c3e2b9..28cc0f2dba4d0 100644 --- a/x-pack/plugins/alerting/server/task_runner/task_runner.ts +++ b/x-pack/plugins/alerting/server/task_runner/task_runner.ts @@ -135,7 +135,7 @@ export class TaskRunner< const path = addSpaceIdToPath('/', spaceId); - const fakeRequest = KibanaRequest.from(({ + const fakeRequest = KibanaRequest.from({ headers: requestHeaders, path: '/', route: { settings: {} }, @@ -147,7 +147,7 @@ export class TaskRunner< url: '/', }, }, - } as unknown) as Request); + } as unknown as Request); this.context.basePathService.set(fakeRequest, path); @@ -384,7 +384,8 @@ export class TaskRunner< string, AlertInstance ]) => { - const shouldExecuteAction = alertInstance.scheduledActionGroupOrSubgroupHasChanged(); + const shouldExecuteAction = + alertInstance.scheduledActionGroupOrSubgroupHasChanged(); if (!shouldExecuteAction) { this.logger.debug( `skipping scheduling of actions for '${alertInstanceName}' in alert ${alertLabel}: instance is active but action group has not changed` diff --git a/x-pack/plugins/alerting/server/usage/alerts_usage_collector.test.ts b/x-pack/plugins/alerting/server/usage/alerts_usage_collector.test.ts index fcc10d6f0c542..9539f189c4fd6 100644 --- a/x-pack/plugins/alerting/server/usage/alerts_usage_collector.test.ts +++ b/x-pack/plugins/alerting/server/usage/alerts_usage_collector.test.ts @@ -16,10 +16,10 @@ describe('registerAlertsUsageCollector', () => { let usageCollectionMock: jest.Mocked; beforeEach(() => { - usageCollectionMock = ({ + usageCollectionMock = { makeUsageCollector: jest.fn(), registerCollector: jest.fn(), - } as unknown) as jest.Mocked; + } as unknown as jest.Mocked; }); it('should call registerCollector', () => { diff --git a/x-pack/plugins/apm/common/agent_configuration/runtime_types/duration_rt.ts b/x-pack/plugins/apm/common/agent_configuration/runtime_types/duration_rt.ts index 9daf0d50be83b..bfc1d9b26f8fa 100644 --- a/x-pack/plugins/apm/common/agent_configuration/runtime_types/duration_rt.ts +++ b/x-pack/plugins/apm/common/agent_configuration/runtime_types/duration_rt.ts @@ -36,9 +36,8 @@ export function getDurationRt({ min, max }: { min?: string; max?: string }) { return either.chain( t.string.validate(input, context), (inputAsString) => { - const inputAsMilliseconds = amountAndUnitToMilliseconds( - inputAsString - ); + const inputAsMilliseconds = + amountAndUnitToMilliseconds(inputAsString); const isValidAmount = inputAsMilliseconds !== undefined && diff --git a/x-pack/plugins/apm/common/apm_telemetry.ts b/x-pack/plugins/apm/common/apm_telemetry.ts index e633834415b35..562dccdfbef29 100644 --- a/x-pack/plugins/apm/common/apm_telemetry.ts +++ b/x-pack/plugins/apm/common/apm_telemetry.ts @@ -49,7 +49,8 @@ export function mergeApmTelemetryMapping( xpackPhoneHomeMapping: Record ) { return produce(xpackPhoneHomeMapping, (draft: Record) => { - draft.mappings.properties.stack_stats.properties.kibana.properties.plugins.properties.apm = getApmTelemetryMapping(); + draft.mappings.properties.stack_stats.properties.kibana.properties.plugins.properties.apm = + getApmTelemetryMapping(); return draft; }); } diff --git a/x-pack/plugins/apm/common/search_strategies/constants.ts b/x-pack/plugins/apm/common/search_strategies/constants.ts index b1bd321e1c914..58203c93e5a42 100644 --- a/x-pack/plugins/apm/common/search_strategies/constants.ts +++ b/x-pack/plugins/apm/common/search_strategies/constants.ts @@ -9,6 +9,7 @@ export const APM_SEARCH_STRATEGIES = { APM_FAILED_TRANSACTIONS_CORRELATIONS: 'apmFailedTransactionsCorrelations', APM_LATENCY_CORRELATIONS: 'apmLatencyCorrelations', } as const; -export type ApmSearchStrategies = typeof APM_SEARCH_STRATEGIES[keyof typeof APM_SEARCH_STRATEGIES]; +export type ApmSearchStrategies = + typeof APM_SEARCH_STRATEGIES[keyof typeof APM_SEARCH_STRATEGIES]; export const DEFAULT_PERCENTILE_THRESHOLD = 95; diff --git a/x-pack/plugins/apm/common/search_strategies/failed_transactions_correlations/types.ts b/x-pack/plugins/apm/common/search_strategies/failed_transactions_correlations/types.ts index de4c5c396961e..857e1e9dbe95d 100644 --- a/x-pack/plugins/apm/common/search_strategies/failed_transactions_correlations/types.ts +++ b/x-pack/plugins/apm/common/search_strategies/failed_transactions_correlations/types.ts @@ -25,14 +25,15 @@ export interface FailedTransactionsCorrelation extends FieldValuePair { histogram: HistogramItem[]; } -export type FailedTransactionsCorrelationsImpactThreshold = typeof FAILED_TRANSACTIONS_IMPACT_THRESHOLD[keyof typeof FAILED_TRANSACTIONS_IMPACT_THRESHOLD]; +export type FailedTransactionsCorrelationsImpactThreshold = + typeof FAILED_TRANSACTIONS_IMPACT_THRESHOLD[keyof typeof FAILED_TRANSACTIONS_IMPACT_THRESHOLD]; export interface FailedTransactionsCorrelationsParams { percentileThreshold: number; } -export type FailedTransactionsCorrelationsRequestParams = FailedTransactionsCorrelationsParams & - SearchStrategyClientParams; +export type FailedTransactionsCorrelationsRequestParams = + FailedTransactionsCorrelationsParams & SearchStrategyClientParams; export interface FailedTransactionsCorrelationsRawResponse extends RawResponseBase { diff --git a/x-pack/plugins/apm/common/utils/join_by_key/index.ts b/x-pack/plugins/apm/common/utils/join_by_key/index.ts index 7a332cd22bc82..b6da95039815d 100644 --- a/x-pack/plugins/apm/common/utils/join_by_key/index.ts +++ b/x-pack/plugins/apm/common/utils/join_by_key/index.ts @@ -28,10 +28,9 @@ type JoinedReturnType< T extends Record, U extends UnionToIntersection > = Array< - Partial & - { - [k in keyof T]: T[k]; - } + Partial & { + [k in keyof T]: T[k]; + } >; type ArrayOrSingle = T | T[]; diff --git a/x-pack/plugins/apm/public/application/application.test.tsx b/x-pack/plugins/apm/public/application/application.test.tsx index 144da47828bf7..5f66e90e91296 100644 --- a/x-pack/plugins/apm/public/application/application.test.tsx +++ b/x-pack/plugins/apm/public/application/application.test.tsx @@ -41,11 +41,8 @@ describe('renderApp', () => { }); it('renders the app', () => { - const { - core, - config, - observabilityRuleTypeRegistry, - } = mockApmPluginContextValue; + const { core, config, observabilityRuleTypeRegistry } = + mockApmPluginContextValue; const plugins = { licensing: { license$: new Observable() }, @@ -67,7 +64,7 @@ describe('renderApp', () => { const data = dataPluginMock.createStartContract(); const embeddable = embeddablePluginMock.createStartContract(); - const pluginsStart = ({ + const pluginsStart = { data, embeddable, observability: { @@ -91,18 +88,18 @@ describe('renderApp', () => { get: () => `/basepath`, }, } as HttpStart, - docLinks: ({ + docLinks: { DOC_LINK_VERSION: '0', ELASTIC_WEBSITE_URL: 'https://www.elastic.co/', links: { apm: {}, observability: { guide: '' }, }, - } as unknown) as DocLinksStart, - } as unknown) as ApmPluginStartDeps; + } as unknown as DocLinksStart, + } as unknown as ApmPluginStartDeps; jest.spyOn(window, 'scrollTo').mockReturnValueOnce(undefined); - createCallApmApi((core as unknown) as CoreStart); + createCallApmApi(core as unknown as CoreStart); jest .spyOn(window.console, 'warn') diff --git a/x-pack/plugins/apm/public/components/alerting/alerting_flyout/index.tsx b/x-pack/plugins/apm/public/components/alerting/alerting_flyout/index.tsx index fa56c44d8d374..36f96f901f1ff 100644 --- a/x-pack/plugins/apm/public/components/alerting/alerting_flyout/index.tsx +++ b/x-pack/plugins/apm/public/components/alerting/alerting_flyout/index.tsx @@ -44,9 +44,10 @@ export function AlertingFlyout(props: Props) { const { services } = useKibana(); const initialValues = getInitialAlertValues(alertType, serviceName); - const onCloseAddFlyout = useCallback(() => setAddFlyoutVisibility(false), [ - setAddFlyoutVisibility, - ]); + const onCloseAddFlyout = useCallback( + () => setAddFlyoutVisibility(false), + [setAddFlyoutVisibility] + ); const addAlertFlyout = useMemo( () => diff --git a/x-pack/plugins/apm/public/components/alerting/error_count_alert_trigger/index.stories.tsx b/x-pack/plugins/apm/public/components/alerting/error_count_alert_trigger/index.stories.tsx index 0f7e3340eaee0..b6ee1a61cea5a 100644 --- a/x-pack/plugins/apm/public/components/alerting/error_count_alert_trigger/index.stories.tsx +++ b/x-pack/plugins/apm/public/components/alerting/error_count_alert_trigger/index.stories.tsx @@ -10,9 +10,9 @@ import { AlertParams, ErrorCountAlertTrigger } from '.'; import { CoreStart } from '../../../../../../../src/core/public'; import { createKibanaReactContext } from '../../../../../../../src/plugins/kibana_react/public'; -const KibanaReactContext = createKibanaReactContext(({ +const KibanaReactContext = createKibanaReactContext({ notifications: { toasts: { add: () => {} } }, -} as unknown) as Partial); +} as unknown as Partial); export default { title: 'alerting/ErrorCountAlertTrigger', diff --git a/x-pack/plugins/apm/public/components/alerting/get_alerting_capabilities.test.ts b/x-pack/plugins/apm/public/components/alerting/get_alerting_capabilities.test.ts index 3477b7de843de..7fabd1c1ff87a 100644 --- a/x-pack/plugins/apm/public/components/alerting/get_alerting_capabilities.test.ts +++ b/x-pack/plugins/apm/public/components/alerting/get_alerting_capabilities.test.ts @@ -15,7 +15,7 @@ describe('getAlertingCapabilities', () => { expect( getAlertingCapabilities( {} as ApmPluginSetupDeps, - ({ apm: {} } as unknown) as Capabilities + { apm: {} } as unknown as Capabilities ).isAlertingAvailable ).toEqual(false); }); diff --git a/x-pack/plugins/apm/public/components/alerting/register_apm_alerts.ts b/x-pack/plugins/apm/public/components/alerting/register_apm_alerts.ts index 4fc2dcefc9c5f..3d444c1cf7a3a 100644 --- a/x-pack/plugins/apm/public/components/alerting/register_apm_alerts.ts +++ b/x-pack/plugins/apm/public/components/alerting/register_apm_alerts.ts @@ -34,8 +34,10 @@ const SERVICE_ENVIRONMENT = 'service.environment'; const SERVICE_NAME = 'service.name'; const TRANSACTION_TYPE = 'transaction.type'; -const ALERT_EVALUATION_THRESHOLD: typeof ALERT_EVALUATION_THRESHOLD_TYPED = ALERT_EVALUATION_THRESHOLD_NON_TYPED; -const ALERT_EVALUATION_VALUE: typeof ALERT_EVALUATION_VALUE_TYPED = ALERT_EVALUATION_VALUE_NON_TYPED; +const ALERT_EVALUATION_THRESHOLD: typeof ALERT_EVALUATION_THRESHOLD_TYPED = + ALERT_EVALUATION_THRESHOLD_NON_TYPED; +const ALERT_EVALUATION_VALUE: typeof ALERT_EVALUATION_VALUE_TYPED = + ALERT_EVALUATION_VALUE_NON_TYPED; const ALERT_SEVERITY: typeof ALERT_SEVERITY_TYPED = ALERT_SEVERITY_NON_TYPED; const format = ({ diff --git a/x-pack/plugins/apm/public/components/alerting/transaction_duration_alert_trigger/index.stories.tsx b/x-pack/plugins/apm/public/components/alerting/transaction_duration_alert_trigger/index.stories.tsx index 8eb0be8eb4b33..3570630d35eef 100644 --- a/x-pack/plugins/apm/public/components/alerting/transaction_duration_alert_trigger/index.stories.tsx +++ b/x-pack/plugins/apm/public/components/alerting/transaction_duration_alert_trigger/index.stories.tsx @@ -11,9 +11,9 @@ import { AlertParams, TransactionDurationAlertTrigger } from '.'; import { CoreStart } from '../../../../../../../src/core/public'; import { createKibanaReactContext } from '../../../../../../../src/plugins/kibana_react/public'; -const KibanaReactContext = createKibanaReactContext(({ +const KibanaReactContext = createKibanaReactContext({ notifications: { toasts: { add: () => {} } }, -} as unknown) as Partial); +} as unknown as Partial); export default { title: 'alerting/TransactionDurationAlertTrigger', diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/ActionMenu/index.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/ActionMenu/index.tsx index 4e6544a20f301..a3c85b866ed60 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/ActionMenu/index.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/ActionMenu/index.tsx @@ -42,11 +42,11 @@ export function UXActionMenu({ const uxExploratoryViewLink = createExploratoryViewUrl( { - 'ux-series': ({ + 'ux-series': { dataType: 'ux', isNew: true, time: { from: rangeFrom, to: rangeTo }, - } as unknown) as SeriesUrl, + } as unknown as SeriesUrl, }, http?.basePath.get() ); diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx index 0371f7eb669e5..505fd5c1020b3 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/RumHome.tsx @@ -33,29 +33,30 @@ export function RumHome() { const envStyle = isSmall ? {} : { maxWidth: 500 }; - const noDataConfig: KibanaPageTemplateProps['noDataConfig'] = !rumHasData?.hasData - ? { - solution: i18n.translate('xpack.apm.ux.overview.solutionName', { - defaultMessage: 'Observability', - }), - actions: { - beats: { - title: i18n.translate('xpack.apm.ux.overview.beatsCard.title', { - defaultMessage: 'Add RUM data', - }), - description: i18n.translate( - 'xpack.apm.ux.overview.beatsCard.description', - { - defaultMessage: - 'Use the RUM (JS) agent to collect user experience data.', - } - ), - href: core.http.basePath.prepend(`/app/home#/tutorial/apm`), + const noDataConfig: KibanaPageTemplateProps['noDataConfig'] = + !rumHasData?.hasData + ? { + solution: i18n.translate('xpack.apm.ux.overview.solutionName', { + defaultMessage: 'Observability', + }), + actions: { + beats: { + title: i18n.translate('xpack.apm.ux.overview.beatsCard.title', { + defaultMessage: 'Add RUM data', + }), + description: i18n.translate( + 'xpack.apm.ux.overview.beatsCard.description', + { + defaultMessage: + 'Use the RUM (JS) agent to collect user experience data.', + } + ), + href: core.http.basePath.prepend(`/app/home#/tutorial/apm`), + }, }, - }, - docsLink: core.docLinks.links.observability.guide, - } - : undefined; + docsLink: core.docLinks.links.observability.guide, + } + : undefined; return ( diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/URLFilter/URLSearch/SelectableUrlList.test.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/URLFilter/URLSearch/SelectableUrlList.test.tsx index 330cb56b2bbb1..f4f7a179c8131 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/URLFilter/URLSearch/SelectableUrlList.test.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/URLFilter/URLSearch/SelectableUrlList.test.tsx @@ -90,11 +90,10 @@ describe('SelectableUrlList', () => { }); it('hides popover on escape', async () => { - const { - getByText, - getByLabelText, - queryByText, - } = render(, { customHistory }); + const { getByText, getByLabelText, queryByText } = render( + , + { customHistory } + ); const input = getByLabelText(I18LABELS.filterByUrl); fireEvent.click(input); diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/URLFilter/URLSearch/index.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/URLFilter/URLSearch/index.tsx index 4f35cb96dada5..efecf02d25e81 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/URLFilter/URLSearch/index.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/URLFilter/URLSearch/index.tsx @@ -61,11 +61,8 @@ export function URLSearch({ }: Props) { const { uxUiFilters, urlParams } = useUrlParams(); - const { - transactionUrl, - transactionUrlExcluded, - ...restFilters - } = uxUiFilters; + const { transactionUrl, transactionUrlExcluded, ...restFilters } = + uxUiFilters; const { searchTerm, percentile } = urlParams; diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/VisitorBreakdownMap/EmbeddedMap.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/VisitorBreakdownMap/EmbeddedMap.tsx index 1ba1685ca17ab..b468b5c913387 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/VisitorBreakdownMap/EmbeddedMap.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/VisitorBreakdownMap/EmbeddedMap.tsx @@ -63,9 +63,8 @@ export function EmbeddedMapComponent() { MapEmbeddable | ErrorEmbeddable | undefined >(); - const embeddableRoot: React.RefObject = useRef( - null - ); + const embeddableRoot: React.RefObject = + useRef(null); const { services: { embeddable: embeddablePlugin }, diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/VisitorBreakdownMap/__mocks__/regions_layer.mock.ts b/x-pack/plugins/apm/public/components/app/RumDashboard/VisitorBreakdownMap/__mocks__/regions_layer.mock.ts index 94de1c088562a..52bd024d8116b 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/VisitorBreakdownMap/__mocks__/regions_layer.mock.ts +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/VisitorBreakdownMap/__mocks__/regions_layer.mock.ts @@ -51,8 +51,7 @@ export const mockLayerList = [ fieldMetaOptions: { isEnabled: true, sigma: 3 }, type: 'ORDINAL', field: { - name: - '__kbnjoin__avg_of_transaction.duration.us__3657625d-17b0-41ef-99ba-3a2b2938655c', + name: '__kbnjoin__avg_of_transaction.duration.us__3657625d-17b0-41ef-99ba-3a2b2938655c', origin: 'join', }, useCustomColorRamp: false, @@ -121,8 +120,7 @@ export const mockLayerList = [ fieldMetaOptions: { isEnabled: true, sigma: 3 }, type: 'ORDINAL', field: { - name: - '__kbnjoin__avg_of_transaction.duration.us__e62a1b9c-d7ff-4fd4-a0f6-0fdc44bb9e41', + name: '__kbnjoin__avg_of_transaction.duration.us__e62a1b9c-d7ff-4fd4-a0f6-0fdc44bb9e41', origin: 'join', }, useCustomColorRamp: false, diff --git a/x-pack/plugins/apm/public/components/app/RumDashboard/utils/test_helper.tsx b/x-pack/plugins/apm/public/components/app/RumDashboard/utils/test_helper.tsx index 42ea3894ea67e..d8438de4a7e19 100644 --- a/x-pack/plugins/apm/public/components/app/RumDashboard/utils/test_helper.tsx +++ b/x-pack/plugins/apm/public/components/app/RumDashboard/utils/test_helper.tsx @@ -16,7 +16,7 @@ import { EuiThemeProvider } from '../../../../../../../../src/plugins/kibana_rea import { KibanaContextProvider } from '../../../../../../../../src/plugins/kibana_react/public'; import { UrlParamsProvider } from '../../../../context/url_params_context/url_params_context'; -export const core = ({ +export const core = { http: { basePath: { prepend: jest.fn(), @@ -26,7 +26,7 @@ export const core = ({ get: (key: string) => true, get$: (key: string) => of(true), }, -} as unknown) as CoreStart; +} as unknown as CoreStart; export const render = ( component: React.ReactNode, diff --git a/x-pack/plugins/apm/public/components/app/Settings/agent_configurations/AgentConfigurationCreateEdit/index.stories.tsx b/x-pack/plugins/apm/public/components/app/Settings/agent_configurations/AgentConfigurationCreateEdit/index.stories.tsx index 02ecf902f00a3..a779be24b2936 100644 --- a/x-pack/plugins/apm/public/components/app/Settings/agent_configurations/AgentConfigurationCreateEdit/index.stories.tsx +++ b/x-pack/plugins/apm/public/components/app/Settings/agent_configurations/AgentConfigurationCreateEdit/index.stories.tsx @@ -22,7 +22,7 @@ storiesOf( module ) .addDecorator((storyFn) => { - const coreMock = ({} as unknown) as CoreStart; + const coreMock = {} as unknown as CoreStart; // mock createCallApmApi(coreMock); @@ -37,7 +37,7 @@ storiesOf( return ( {storyFn()} diff --git a/x-pack/plugins/apm/public/components/app/Settings/agent_configurations/List/ConfirmDeleteModal.tsx b/x-pack/plugins/apm/public/components/app/Settings/agent_configurations/List/ConfirmDeleteModal.tsx index 3e3bc892e6518..66be766437dee 100644 --- a/x-pack/plugins/apm/public/components/app/Settings/agent_configurations/List/ConfirmDeleteModal.tsx +++ b/x-pack/plugins/apm/public/components/app/Settings/agent_configurations/List/ConfirmDeleteModal.tsx @@ -16,7 +16,8 @@ import { } from '../../../../../services/rest/createCallApmApi'; import { useApmPluginContext } from '../../../../../context/apm_plugin/use_apm_plugin_context'; -type Config = APIReturnType<'GET /api/apm/settings/agent-configuration'>['configurations'][0]; +type Config = + APIReturnType<'GET /api/apm/settings/agent-configuration'>['configurations'][0]; interface Props { config: Config; diff --git a/x-pack/plugins/apm/public/components/app/Settings/agent_configurations/List/index.tsx b/x-pack/plugins/apm/public/components/app/Settings/agent_configurations/List/index.tsx index 3ab5c25ed3dc9..4804e52b16d4f 100644 --- a/x-pack/plugins/apm/public/components/app/Settings/agent_configurations/List/index.tsx +++ b/x-pack/plugins/apm/public/components/app/Settings/agent_configurations/List/index.tsx @@ -28,7 +28,8 @@ import { ITableColumn, ManagedTable } from '../../../../shared/managed_table'; import { TimestampTooltip } from '../../../../shared/TimestampTooltip'; import { ConfirmDeleteModal } from './ConfirmDeleteModal'; -type Config = APIReturnType<'GET /api/apm/settings/agent-configuration'>['configurations'][0]; +type Config = + APIReturnType<'GET /api/apm/settings/agent-configuration'>['configurations'][0]; interface Props { status: FETCH_STATUS; diff --git a/x-pack/plugins/apm/public/components/app/Settings/agent_configurations/index.tsx b/x-pack/plugins/apm/public/components/app/Settings/agent_configurations/index.tsx index f7cfc56bf4eac..f443e9e016cb8 100644 --- a/x-pack/plugins/apm/public/components/app/Settings/agent_configurations/index.tsx +++ b/x-pack/plugins/apm/public/components/app/Settings/agent_configurations/index.tsx @@ -25,7 +25,11 @@ import { AgentConfigurationList } from './List'; const INITIAL_DATA = { configurations: [] }; export function AgentConfigurations() { - const { refetch, data = INITIAL_DATA, status } = useFetcher( + const { + refetch, + data = INITIAL_DATA, + status, + } = useFetcher( (callApmApi) => callApmApi({ endpoint: 'GET /api/apm/settings/agent-configuration' }), [], diff --git a/x-pack/plugins/apm/public/components/app/Settings/anomaly_detection/add_environments.tsx b/x-pack/plugins/apm/public/components/app/Settings/anomaly_detection/add_environments.tsx index 89e5dfcbdadfb..a60e685eacbde 100644 --- a/x-pack/plugins/apm/public/components/app/Settings/anomaly_detection/add_environments.tsx +++ b/x-pack/plugins/apm/public/components/app/Settings/anomaly_detection/add_environments.tsx @@ -34,7 +34,8 @@ interface Props { onCancel: () => void; } -type ApiResponse = APIReturnType<'GET /api/apm/settings/anomaly-detection/environments'>; +type ApiResponse = + APIReturnType<'GET /api/apm/settings/anomaly-detection/environments'>; const INITIAL_DATA: ApiResponse = { environments: [] }; export function AddEnvironments({ diff --git a/x-pack/plugins/apm/public/components/app/Settings/anomaly_detection/index.tsx b/x-pack/plugins/apm/public/components/app/Settings/anomaly_detection/index.tsx index 7293fb81f3303..0fe7f9360de0c 100644 --- a/x-pack/plugins/apm/public/components/app/Settings/anomaly_detection/index.tsx +++ b/x-pack/plugins/apm/public/components/app/Settings/anomaly_detection/index.tsx @@ -16,7 +16,8 @@ import { LicensePrompt } from '../../../shared/license_prompt'; import { useLicenseContext } from '../../../../context/license/use_license_context'; import { APIReturnType } from '../../../../services/rest/createCallApmApi'; -export type AnomalyDetectionApiResponse = APIReturnType<'GET /api/apm/settings/anomaly-detection/jobs'>; +export type AnomalyDetectionApiResponse = + APIReturnType<'GET /api/apm/settings/anomaly-detection/jobs'>; const DEFAULT_VALUE: AnomalyDetectionApiResponse = { jobs: [], @@ -31,7 +32,11 @@ export function AnomalyDetection() { const [viewAddEnvironments, setViewAddEnvironments] = useState(false); - const { refetch, data = DEFAULT_VALUE, status } = useFetcher( + const { + refetch, + data = DEFAULT_VALUE, + status, + } = useFetcher( (callApmApi) => { if (canGetJobs) { return callApmApi({ diff --git a/x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/create_edit_custom_link_flyout/helper.test.ts b/x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/create_edit_custom_link_flyout/helper.test.ts index 449968b82943f..e1a18784559f8 100644 --- a/x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/create_edit_custom_link_flyout/helper.test.ts +++ b/x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/create_edit_custom_link_flyout/helper.test.ts @@ -84,10 +84,10 @@ describe('Custom link helper', () => { }); describe('replaceTemplateVariables', () => { - const transaction = ({ + const transaction = { service: { name: 'foo' }, trace: { id: '123' }, - } as unknown) as Transaction; + } as unknown as Transaction; it('replaces template variables', () => { expect( @@ -115,7 +115,7 @@ describe('Custom link helper', () => { expect( replaceTemplateVariables( 'https://elastic.co?service.name={{service.name}}&trace.id={{trace.id}}', - ({} as unknown) as Transaction + {} as unknown as Transaction ) ).toEqual(expectedResult); }); diff --git a/x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/create_edit_custom_link_flyout/link_preview.stories.tsx b/x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/create_edit_custom_link_flyout/link_preview.stories.tsx index 3bf17a733bf8a..cbab496a188f3 100644 --- a/x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/create_edit_custom_link_flyout/link_preview.stories.tsx +++ b/x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/create_edit_custom_link_flyout/link_preview.stories.tsx @@ -21,12 +21,12 @@ export function Example({ label, url, }: ComponentProps) { - const coreMock = ({ + const coreMock = { http: { get: async () => ({ transaction: { id: '0' } }), }, uiSettings: { get: () => false }, - } as unknown) as CoreStart; + } as unknown as CoreStart; createCallApmApi(coreMock); diff --git a/x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/create_edit_custom_link_flyout/link_preview.test.tsx b/x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/create_edit_custom_link_flyout/link_preview.test.tsx index d88cef0702a87..f44b4d1c1205d 100644 --- a/x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/create_edit_custom_link_flyout/link_preview.test.tsx +++ b/x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/create_edit_custom_link_flyout/link_preview.test.tsx @@ -24,8 +24,10 @@ export const removeExternalLinkText = (str: string) => describe('LinkPreview', () => { const getElementValue = (container: HTMLElement, id: string) => getNodeText( - ((getByTestId(container, id) as HTMLDivElement) - .children as HTMLCollection)[0] as HTMLDivElement + ( + (getByTestId(container, id) as HTMLDivElement) + .children as HTMLCollection + )[0] as HTMLDivElement ); it('shows label and url default values', () => { diff --git a/x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/index.test.tsx b/x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/index.test.tsx index 22fbfb04734ba..c2860c1b69776 100644 --- a/x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/index.test.tsx +++ b/x-pack/plugins/apm/public/components/app/Settings/customize_ui/custom_link/index.test.tsx @@ -32,13 +32,13 @@ const data = { }; function getMockAPMContext({ canSave }: { canSave: boolean }) { - return ({ + return { ...mockApmPluginContextValue, core: { ...mockApmPluginContextValue.core, application: { capabilities: { apm: { save: canSave }, ml: {} } }, }, - } as unknown) as ApmPluginContextValue; + } as unknown as ApmPluginContextValue; } describe('CustomLink', () => { diff --git a/x-pack/plugins/apm/public/components/app/Settings/schema/index.tsx b/x-pack/plugins/apm/public/components/app/Settings/schema/index.tsx index 0c95648a1cefc..6b7538e61c130 100644 --- a/x-pack/plugins/apm/public/components/app/Settings/schema/index.tsx +++ b/x-pack/plugins/apm/public/components/app/Settings/schema/index.tsx @@ -19,7 +19,8 @@ import { } from '../../../../services/rest/createCallApmApi'; import { useApmPluginContext } from '../../../../context/apm_plugin/use_apm_plugin_context'; -type FleetMigrationCheckResponse = APIReturnType<'GET /api/apm/fleet/migration_check'>; +type FleetMigrationCheckResponse = + APIReturnType<'GET /api/apm/fleet/migration_check'>; const APM_DATA_STREAMS_MIGRATION_STATUS_LS = { value: '', @@ -27,13 +28,11 @@ const APM_DATA_STREAMS_MIGRATION_STATUS_LS = { }; export function Schema() { - const [ - apmDataStreamsMigrationStatus, - setApmDataStreamsMigrationStatus, - ] = useLocalStorage( - 'apm.dataStreamsMigrationStatus', - APM_DATA_STREAMS_MIGRATION_STATUS_LS - ); + const [apmDataStreamsMigrationStatus, setApmDataStreamsMigrationStatus] = + useLocalStorage( + 'apm.dataStreamsMigrationStatus', + APM_DATA_STREAMS_MIGRATION_STATUS_LS + ); const { toasts } = useApmPluginContext().core.notifications; const [isSwitchActive, setIsSwitchActive] = useState(false); diff --git a/x-pack/plugins/apm/public/components/app/Settings/schema/schema.stories.tsx b/x-pack/plugins/apm/public/components/app/Settings/schema/schema.stories.tsx index 67eae5376a74e..f546eed14bf94 100644 --- a/x-pack/plugins/apm/public/components/app/Settings/schema/schema.stories.tsx +++ b/x-pack/plugins/apm/public/components/app/Settings/schema/schema.stories.tsx @@ -77,7 +77,7 @@ export default { } else { window.localStorage.removeItem('apm.dataStreamsMigrationStatus'); } - const coreMock = ({ + const coreMock = { http: { basePath: { prepend: () => {} }, get: () => { @@ -90,7 +90,7 @@ export default { }, }, uiSettings: { get: () => '' }, - } as unknown) as CoreStart; + } as unknown as CoreStart; createCallApmApi(coreMock); diff --git a/x-pack/plugins/apm/public/components/app/TraceLink/get_redirect_to_transaction_detail_page_url.test.ts b/x-pack/plugins/apm/public/components/app/TraceLink/get_redirect_to_transaction_detail_page_url.test.ts index 08d216971b5b7..21b2f487fba91 100644 --- a/x-pack/plugins/apm/public/components/app/TraceLink/get_redirect_to_transaction_detail_page_url.test.ts +++ b/x-pack/plugins/apm/public/components/app/TraceLink/get_redirect_to_transaction_detail_page_url.test.ts @@ -9,7 +9,7 @@ import { getRedirectToTransactionDetailPageUrl } from './get_redirect_to_transac import { parse } from 'url'; describe('getRedirectToTransactionDetailPageUrl', () => { - const transaction = ({ + const transaction = { '@timestamp': '2020-01-01T00:01:00.000Z', service: { name: 'opbeans-node' }, trace: { id: 'trace_id' }, @@ -19,7 +19,7 @@ describe('getRedirectToTransactionDetailPageUrl', () => { type: 'request', duration: { us: 5000 }, }, - } as unknown) as any; + } as unknown as any; const url = getRedirectToTransactionDetailPageUrl({ transaction }); diff --git a/x-pack/plugins/apm/public/components/app/TraceLink/trace_link.test.tsx b/x-pack/plugins/apm/public/components/app/TraceLink/trace_link.test.tsx index db08e4f9f02c6..ffeab11e1f276 100644 --- a/x-pack/plugins/apm/public/components/app/TraceLink/trace_link.test.tsx +++ b/x-pack/plugins/apm/public/components/app/TraceLink/trace_link.test.tsx @@ -23,13 +23,13 @@ function Wrapper({ children }: { children?: ReactNode }) { {children} diff --git a/x-pack/plugins/apm/public/components/app/correlations/failed_transactions_correlations.tsx b/x-pack/plugins/apm/public/components/app/correlations/failed_transactions_correlations.tsx index 2c911c9aa962e..c497ce434180b 100644 --- a/x-pack/plugins/apm/public/components/app/correlations/failed_transactions_correlations.tsx +++ b/x-pack/plugins/apm/public/components/app/correlations/failed_transactions_correlations.tsx @@ -84,10 +84,8 @@ export function FailedTransactionsCorrelations({ progress.isRunning ); - const [ - selectedSignificantTerm, - setSelectedSignificantTerm, - ] = useState(null); + const [selectedSignificantTerm, setSelectedSignificantTerm] = + useState(null); const selectedTerm = selectedSignificantTerm ?? response.failedTransactionsCorrelations?.[0]; @@ -334,9 +332,8 @@ export function FailedTransactionsCorrelations({ } }, [progress.error, notifications.toasts]); - const [sortField, setSortField] = useState< - keyof FailedTransactionsCorrelation - >('normalizedScore'); + const [sortField, setSortField] = + useState('normalizedScore'); const [sortDirection, setSortDirection] = useState('desc'); const onTableChange = useCallback(({ sort }) => { @@ -373,7 +370,8 @@ export function FailedTransactionsCorrelations({ const showSummaryBadge = inspectEnabled && (progress.isRunning || correlationTerms.length > 0); - const transactionDistributionChartData: TransactionDistributionChartData[] = []; + const transactionDistributionChartData: TransactionDistributionChartData[] = + []; if (Array.isArray(overallHistogram)) { transactionDistributionChartData.push({ diff --git a/x-pack/plugins/apm/public/components/app/correlations/latency_correlations.test.tsx b/x-pack/plugins/apm/public/components/app/correlations/latency_correlations.test.tsx index c1fb1beb1918e..523d8b1840fc8 100644 --- a/x-pack/plugins/apm/public/components/app/correlations/latency_correlations.test.tsx +++ b/x-pack/plugins/apm/public/components/app/correlations/latency_correlations.test.tsx @@ -61,9 +61,9 @@ function Wrapper({ search: fromQuery({ transactionName: 'the-transaction-name' }), }); - const mockPluginContext = (merge({}, mockApmPluginContextValue, { + const mockPluginContext = merge({}, mockApmPluginContextValue, { core: { http: { get: httpGet } }, - }) as unknown) as ApmPluginContextValue; + }) as unknown as ApmPluginContextValue; return ( diff --git a/x-pack/plugins/apm/public/components/app/correlations/latency_correlations.tsx b/x-pack/plugins/apm/public/components/app/correlations/latency_correlations.tsx index 44a1122298d59..167df0fd10b40 100644 --- a/x-pack/plugins/apm/public/components/app/correlations/latency_correlations.tsx +++ b/x-pack/plugins/apm/public/components/app/correlations/latency_correlations.tsx @@ -88,10 +88,8 @@ export function LatencyCorrelations({ onFilter }: { onFilter: () => void }) { } }, [progress.error, notifications.toasts]); - const [ - selectedSignificantTerm, - setSelectedSignificantTerm, - ] = useState(null); + const [selectedSignificantTerm, setSelectedSignificantTerm] = + useState(null); const selectedHistogram = useMemo( () => @@ -106,119 +104,117 @@ export function LatencyCorrelations({ onFilter }: { onFilter: () => void }) { const history = useHistory(); const trackApmEvent = useUiTracker({ app: 'apm' }); - const mlCorrelationColumns: Array< - EuiBasicTableColumn - > = useMemo( - () => [ - { - width: '116px', - field: 'correlation', - name: ( - - <> - {i18n.translate( - 'xpack.apm.correlations.latencyCorrelations.correlationsTable.correlationLabel', + const mlCorrelationColumns: Array> = + useMemo( + () => [ + { + width: '116px', + field: 'correlation', + name: ( + - - - ), - render: (_, { correlation }) => { - return
{asPreciseDecimal(correlation, 2)}
; + > + <> + {i18n.translate( + 'xpack.apm.correlations.latencyCorrelations.correlationsTable.correlationLabel', + { + defaultMessage: 'Correlation', + } + )} + + +
+ ), + render: (_, { correlation }) => { + return
{asPreciseDecimal(correlation, 2)}
; + }, + sortable: true, }, - sortable: true, - }, - { - field: 'fieldName', - name: i18n.translate( - 'xpack.apm.correlations.latencyCorrelations.correlationsTable.fieldNameLabel', - { defaultMessage: 'Field name' } - ), - sortable: true, - }, - { - field: 'fieldValue', - name: i18n.translate( - 'xpack.apm.correlations.latencyCorrelations.correlationsTable.fieldValueLabel', - { defaultMessage: 'Field value' } - ), - render: (_, { fieldValue }) => String(fieldValue).slice(0, 50), - sortable: true, - }, - { - width: '100px', - actions: [ - { - name: i18n.translate( - 'xpack.apm.correlations.latencyCorrelations.correlationsTable.filterLabel', - { defaultMessage: 'Filter' } - ), - description: i18n.translate( - 'xpack.apm.correlations.latencyCorrelations.correlationsTable.filterDescription', - { defaultMessage: 'Filter by value' } - ), - icon: 'plusInCircle', - type: 'icon', - onClick: (term: LatencyCorrelation) => { - push(history, { - query: { - kuery: `${term.fieldName}:"${term.fieldValue}"`, - }, - }); - onFilter(); - trackApmEvent({ metric: 'correlations_term_include_filter' }); + { + field: 'fieldName', + name: i18n.translate( + 'xpack.apm.correlations.latencyCorrelations.correlationsTable.fieldNameLabel', + { defaultMessage: 'Field name' } + ), + sortable: true, + }, + { + field: 'fieldValue', + name: i18n.translate( + 'xpack.apm.correlations.latencyCorrelations.correlationsTable.fieldValueLabel', + { defaultMessage: 'Field value' } + ), + render: (_, { fieldValue }) => String(fieldValue).slice(0, 50), + sortable: true, + }, + { + width: '100px', + actions: [ + { + name: i18n.translate( + 'xpack.apm.correlations.latencyCorrelations.correlationsTable.filterLabel', + { defaultMessage: 'Filter' } + ), + description: i18n.translate( + 'xpack.apm.correlations.latencyCorrelations.correlationsTable.filterDescription', + { defaultMessage: 'Filter by value' } + ), + icon: 'plusInCircle', + type: 'icon', + onClick: (term: LatencyCorrelation) => { + push(history, { + query: { + kuery: `${term.fieldName}:"${term.fieldValue}"`, + }, + }); + onFilter(); + trackApmEvent({ metric: 'correlations_term_include_filter' }); + }, }, - }, - { - name: i18n.translate( - 'xpack.apm.correlations.latencyCorrelations.correlationsTable.excludeLabel', - { defaultMessage: 'Exclude' } - ), - description: i18n.translate( - 'xpack.apm.correlations.latencyCorrelations.correlationsTable.excludeDescription', - { defaultMessage: 'Filter out value' } - ), - icon: 'minusInCircle', - type: 'icon', - onClick: (term: LatencyCorrelation) => { - push(history, { - query: { - kuery: `not ${term.fieldName}:"${term.fieldValue}"`, - }, - }); - onFilter(); - trackApmEvent({ metric: 'correlations_term_exclude_filter' }); + { + name: i18n.translate( + 'xpack.apm.correlations.latencyCorrelations.correlationsTable.excludeLabel', + { defaultMessage: 'Exclude' } + ), + description: i18n.translate( + 'xpack.apm.correlations.latencyCorrelations.correlationsTable.excludeDescription', + { defaultMessage: 'Filter out value' } + ), + icon: 'minusInCircle', + type: 'icon', + onClick: (term: LatencyCorrelation) => { + push(history, { + query: { + kuery: `not ${term.fieldName}:"${term.fieldValue}"`, + }, + }); + onFilter(); + trackApmEvent({ metric: 'correlations_term_exclude_filter' }); + }, }, - }, - ], - name: i18n.translate( - 'xpack.apm.correlations.latencyCorrelations.correlationsTable.actionsLabel', - { defaultMessage: 'Filter' } - ), - }, - ], - [history, onFilter, trackApmEvent] - ); + ], + name: i18n.translate( + 'xpack.apm.correlations.latencyCorrelations.correlationsTable.actionsLabel', + { defaultMessage: 'Filter' } + ), + }, + ], + [history, onFilter, trackApmEvent] + ); - const [sortField, setSortField] = useState( - 'correlation' - ); + const [sortField, setSortField] = + useState('correlation'); const [sortDirection, setSortDirection] = useState('desc'); const onTableChange = useCallback(({ sort }) => { @@ -242,7 +238,8 @@ export function LatencyCorrelations({ onFilter }: { onFilter: () => void }) { histogramTerms.length < 1 && (progressNormalized === 1 || !progress.isRunning); - const transactionDistributionChartData: TransactionDistributionChartData[] = []; + const transactionDistributionChartData: TransactionDistributionChartData[] = + []; if (Array.isArray(overallHistogram)) { transactionDistributionChartData.push({ diff --git a/x-pack/plugins/apm/public/components/app/error_group_details/Distribution/index.stories.tsx b/x-pack/plugins/apm/public/components/app/error_group_details/Distribution/index.stories.tsx index d434a155c9cf4..4601f1db0277d 100644 --- a/x-pack/plugins/apm/public/components/app/error_group_details/Distribution/index.stories.tsx +++ b/x-pack/plugins/apm/public/components/app/error_group_details/Distribution/index.stories.tsx @@ -18,9 +18,9 @@ export default { component: ErrorDistribution, decorators: [ (Story: ComponentType) => { - const apmPluginContextMock = ({ + const apmPluginContextMock = { observabilityRuleTypeRegistry: { getFormatter: () => undefined }, - } as unknown) as ApmPluginContextValue; + } as unknown as ApmPluginContextValue; const kibanaContextServices = { uiSettings: { get: () => {} }, diff --git a/x-pack/plugins/apm/public/components/app/error_group_details/Distribution/index.tsx b/x-pack/plugins/apm/public/components/app/error_group_details/Distribution/index.tsx index fa458b95d0d80..b6fc0d4fcf65d 100644 --- a/x-pack/plugins/apm/public/components/app/error_group_details/Distribution/index.tsx +++ b/x-pack/plugins/apm/public/components/app/error_group_details/Distribution/index.tsx @@ -31,9 +31,11 @@ import { getAlertAnnotations } from '../../../shared/charts/helper/get_alert_ann import { useApmPluginContext } from '../../../../context/apm_plugin/use_apm_plugin_context'; import { LazyAlertsFlyout } from '../../../../../../observability/public'; -const ALERT_RULE_TYPE_ID: typeof ALERT_RULE_TYPE_ID_TYPED = ALERT_RULE_TYPE_ID_NON_TYPED; +const ALERT_RULE_TYPE_ID: typeof ALERT_RULE_TYPE_ID_TYPED = + ALERT_RULE_TYPE_ID_NON_TYPED; -type ErrorDistributionAPIResponse = APIReturnType<'GET /api/apm/services/{serviceName}/errors/distribution'>; +type ErrorDistributionAPIResponse = + APIReturnType<'GET /api/apm/services/{serviceName}/errors/distribution'>; interface FormattedBucket { x0: number; diff --git a/x-pack/plugins/apm/public/components/app/error_group_details/detail_view/exception_stacktrace.stories.tsx b/x-pack/plugins/apm/public/components/app/error_group_details/detail_view/exception_stacktrace.stories.tsx index 9468202edf4d6..7ce38891d81f8 100644 --- a/x-pack/plugins/apm/public/components/app/error_group_details/detail_view/exception_stacktrace.stories.tsx +++ b/x-pack/plugins/apm/public/components/app/error_group_details/detail_view/exception_stacktrace.stories.tsx @@ -585,8 +585,7 @@ JavaWithLongLines.args = { module: 'org.apache.tomcat.util.threads', }, ], - type: - 'org.springframework.http.converter.HttpMessageNotWritableException', + type: 'org.springframework.http.converter.HttpMessageNotWritableException', message: 'Could not write JSON: Null return value from advice does not match primitive return type for: public abstract double co.elastic.apm.opbeans.repositories.Numbers.getRevenue(); nested exception is com.fasterxml.jackson.databind.JsonMappingException: Null return value from advice does not match primitive return type for: public abstract double co.elastic.apm.opbeans.repositories.Numbers.getRevenue() (through reference chain: co.elastic.apm.opbeans.repositories.Stats["numbers"]->com.sun.proxy.$Proxy128["revenue"])', }, diff --git a/x-pack/plugins/apm/public/components/app/error_group_overview/List/index.tsx b/x-pack/plugins/apm/public/components/app/error_group_overview/List/index.tsx index 81d1208e6cbf5..d42c77c06b0ab 100644 --- a/x-pack/plugins/apm/public/components/app/error_group_overview/List/index.tsx +++ b/x-pack/plugins/apm/public/components/app/error_group_overview/List/index.tsx @@ -47,7 +47,8 @@ const Culprit = euiStyled.div` font-family: ${({ theme }) => theme.eui.euiCodeFontFamily}; `; -type ErrorGroupItem = APIReturnType<'GET /api/apm/services/{serviceName}/errors'>['errorGroups'][0]; +type ErrorGroupItem = + APIReturnType<'GET /api/apm/services/{serviceName}/errors'>['errorGroups'][0]; interface Props { items: ErrorGroupItem[]; diff --git a/x-pack/plugins/apm/public/components/app/service_inventory/index.tsx b/x-pack/plugins/apm/public/components/app/service_inventory/index.tsx index 0b505c4f5ade8..7cd9c7c8e199e 100644 --- a/x-pack/plugins/apm/public/components/app/service_inventory/index.tsx +++ b/x-pack/plugins/apm/public/components/app/service_inventory/index.tsx @@ -159,16 +159,11 @@ function useServicesFetcher() { export function ServiceInventory() { const { core } = useApmPluginContext(); - const { - mainStatisticsData, - mainStatisticsStatus, - comparisonData, - } = useServicesFetcher(); + const { mainStatisticsData, mainStatisticsStatus, comparisonData } = + useServicesFetcher(); - const { - anomalyDetectionJobsData, - anomalyDetectionJobsStatus, - } = useAnomalyDetectionJobsContext(); + const { anomalyDetectionJobsData, anomalyDetectionJobsStatus } = + useAnomalyDetectionJobsContext(); const [userHasDismissedCallout, setUserHasDismissedCallout] = useLocalStorage( 'apm.userHasDismissedServiceInventoryMlCallout', diff --git a/x-pack/plugins/apm/public/components/app/service_inventory/service_inventory.test.tsx b/x-pack/plugins/apm/public/components/app/service_inventory/service_inventory.test.tsx index 2ff3f2702cb53..945d977e30362 100644 --- a/x-pack/plugins/apm/public/components/app/service_inventory/service_inventory.test.tsx +++ b/x-pack/plugins/apm/public/components/app/service_inventory/service_inventory.test.tsx @@ -35,7 +35,7 @@ const addWarning = jest.fn(); const httpGet = jest.fn(); function wrapper({ children }: { children?: ReactNode }) { - const mockPluginContext = (merge({}, mockApmPluginContextValue, { + const mockPluginContext = merge({}, mockApmPluginContextValue, { core: { http: { get: httpGet, @@ -46,7 +46,7 @@ function wrapper({ children }: { children?: ReactNode }) { }, }, }, - }) as unknown) as ApmPluginContextValue; + }) as unknown as ApmPluginContextValue; return ( diff --git a/x-pack/plugins/apm/public/components/app/service_inventory/service_list/index.tsx b/x-pack/plugins/apm/public/components/app/service_inventory/service_list/index.tsx index 17dfee35e221b..9c1893b76f7db 100644 --- a/x-pack/plugins/apm/public/components/app/service_inventory/service_list/index.tsx +++ b/x-pack/plugins/apm/public/components/app/service_inventory/service_list/index.tsx @@ -45,7 +45,8 @@ import { HealthBadge } from './HealthBadge'; type ServiceListAPIResponse = APIReturnType<'GET /api/apm/services'>; type Items = ServiceListAPIResponse['items']; -type ServicesDetailedStatisticsAPIResponse = APIReturnType<'GET /api/apm/services/detailed_statistics'>; +type ServicesDetailedStatisticsAPIResponse = + APIReturnType<'GET /api/apm/services/detailed_statistics'>; type ServiceListItem = ValuesType; diff --git a/x-pack/plugins/apm/public/components/app/service_map/Popover/Popover.stories.tsx b/x-pack/plugins/apm/public/components/app/service_map/Popover/Popover.stories.tsx index 33973956a65bb..d6300b7c80f1c 100644 --- a/x-pack/plugins/apm/public/components/app/service_map/Popover/Popover.stories.tsx +++ b/x-pack/plugins/apm/public/components/app/service_map/Popover/Popover.stories.tsx @@ -28,7 +28,7 @@ const stories: Meta = { component: Popover, decorators: [ (StoryComponent) => { - const coreMock = ({ + const coreMock = { http: { get: () => { return { @@ -44,7 +44,7 @@ const stories: Meta = { }, notifications: { toasts: { add: () => {} } }, uiSettings: { get: () => ({}) }, - } as unknown) as CoreStart; + } as unknown as CoreStart; const KibanaReactContext = createKibanaReactContext(coreMock); diff --git a/x-pack/plugins/apm/public/components/app/service_map/__stories__/cytoscape_example_data.stories.tsx b/x-pack/plugins/apm/public/components/app/service_map/__stories__/cytoscape_example_data.stories.tsx index 109e22240868e..8189668ad6ef2 100644 --- a/x-pack/plugins/apm/public/components/app/service_map/__stories__/cytoscape_example_data.stories.tsx +++ b/x-pack/plugins/apm/public/components/app/service_map/__stories__/cytoscape_example_data.stories.tsx @@ -48,11 +48,11 @@ const stories: Meta<{}> = { component: Cytoscape, decorators: [ (StoryComponent, { globals }) => { - const KibanaReactContext = createKibanaReactContext(({ + const KibanaReactContext = createKibanaReactContext({ uiSettings: { get: () => globals.euiTheme && globals.euiTheme.includes('dark'), }, - } as unknown) as Partial); + } as unknown as Partial); return ( diff --git a/x-pack/plugins/apm/public/components/app/service_map/index.tsx b/x-pack/plugins/apm/public/components/app/service_map/index.tsx index 97b4f548f4bf9..7499eb9cd658c 100644 --- a/x-pack/plugins/apm/public/components/app/service_map/index.tsx +++ b/x-pack/plugins/apm/public/components/app/service_map/index.tsx @@ -111,7 +111,11 @@ export function ServiceMap({ const serviceName = useServiceName(); - const { data = { elements: [] }, status, error } = useFetcher( + const { + data = { elements: [] }, + status, + error, + } = useFetcher( (callApmApi) => { // When we don't have a license or a valid license, don't make the request. if (!license || !isActivePlatinumLicense(license)) { diff --git a/x-pack/plugins/apm/public/components/app/service_map/use_cytoscape_event_handlers.test.tsx b/x-pack/plugins/apm/public/components/app/service_map/use_cytoscape_event_handlers.test.tsx index 775cdd9b09d91..3deb1f49cf188 100644 --- a/x-pack/plugins/apm/public/components/app/service_map/use_cytoscape_event_handlers.test.tsx +++ b/x-pack/plugins/apm/public/components/app/service_map/use_cytoscape_event_handlers.test.tsx @@ -17,9 +17,9 @@ jest.mock('../../../../../observability/public'); cytoscape.use(dagre); -const theme = ({ +const theme = { eui: { avatarSizing: { l: { size: 10 } } }, -} as unknown) as EuiTheme; +} as unknown as EuiTheme; describe('useCytoscapeEventHandlers', () => { describe('when cytoscape is undefined', () => { @@ -38,13 +38,12 @@ describe('useCytoscapeEventHandlers', () => { }); // Mock the chain that leads to layout run - jest.spyOn(cy, 'elements').mockReturnValueOnce(({ + jest.spyOn(cy, 'elements').mockReturnValueOnce({ difference: () => - (({ - layout: () => - (({ run: () => {} } as unknown) as cytoscape.Layouts), - } as unknown) as cytoscape.CollectionReturnValue), - } as unknown) as cytoscape.CollectionReturnValue); + ({ + layout: () => ({ run: () => {} } as unknown as cytoscape.Layouts), + } as unknown as cytoscape.CollectionReturnValue), + } as unknown as cytoscape.CollectionReturnValue); renderHook(() => useCytoscapeEventHandlers({ serviceName: 'test', cy, theme }) @@ -62,12 +61,12 @@ describe('useCytoscapeEventHandlers', () => { const run = jest.fn(); // Mock the chain that leads to layout run - jest.spyOn(cy, 'elements').mockReturnValueOnce(({ + jest.spyOn(cy, 'elements').mockReturnValueOnce({ difference: () => - (({ - layout: () => (({ run } as unknown) as cytoscape.Layouts), - } as unknown) as cytoscape.CollectionReturnValue), - } as unknown) as cytoscape.CollectionReturnValue); + ({ + layout: () => ({ run } as unknown as cytoscape.Layouts), + } as unknown as cytoscape.CollectionReturnValue), + } as unknown as cytoscape.CollectionReturnValue); renderHook(() => useCytoscapeEventHandlers({ cy, theme })); cy.trigger('custom:data'); @@ -124,9 +123,9 @@ describe('useCytoscapeEventHandlers', () => { describe('when a drag ends', () => { it('changes the cursor to pointer', () => { const cy = cytoscape({ elements: [{ data: { id: 'test' } }] }); - const container = ({ + const container = { style: { cursor: 'grabbing' }, - } as unknown) as HTMLElement; + } as unknown as HTMLElement; jest.spyOn(cy, 'container').mockReturnValueOnce(container); renderHook(() => useCytoscapeEventHandlers({ cy, theme })); @@ -151,9 +150,9 @@ describe('useCytoscapeEventHandlers', () => { it('sets the cursor to pointer', () => { const cy = cytoscape({ elements: [{ data: { id: 'test' } }] }); - const container = ({ + const container = { style: { cursor: 'default' }, - } as unknown) as HTMLElement; + } as unknown as HTMLElement; jest.spyOn(cy, 'container').mockReturnValueOnce(container); renderHook(() => useCytoscapeEventHandlers({ cy, theme })); @@ -195,9 +194,9 @@ describe('useCytoscapeEventHandlers', () => { it('sets the cursor to the default', () => { const cy = cytoscape({ elements: [{ data: { id: 'test' } }] }); - const container = ({ + const container = { style: { cursor: 'pointer' }, - } as unknown) as HTMLElement; + } as unknown as HTMLElement; jest.spyOn(cy, 'container').mockReturnValueOnce(container); renderHook(() => useCytoscapeEventHandlers({ cy, theme })); @@ -216,9 +215,9 @@ describe('useCytoscapeEventHandlers', () => { { data: { id: 'b' } }, ], }); - const container = ({ + const container = { style: { cursor: 'default' }, - } as unknown) as HTMLElement; + } as unknown as HTMLElement; jest.spyOn(cy, 'container').mockReturnValueOnce(container); renderHook(() => useCytoscapeEventHandlers({ cy, theme })); @@ -273,9 +272,9 @@ describe('useCytoscapeEventHandlers', () => { describe('when a tap starts', () => { it('sets the cursor to grabbing', () => { const cy = cytoscape({}); - const container = ({ + const container = { style: { cursor: 'grab' }, - } as unknown) as HTMLElement; + } as unknown as HTMLElement; jest.spyOn(cy, 'container').mockReturnValueOnce(container); renderHook(() => useCytoscapeEventHandlers({ cy, theme })); @@ -287,9 +286,9 @@ describe('useCytoscapeEventHandlers', () => { describe('when the target is a node', () => { it('does not change the cursor', () => { const cy = cytoscape({ elements: [{ data: { id: 'test' } }] }); - const container = ({ + const container = { style: { cursor: 'grab' }, - } as unknown) as HTMLElement; + } as unknown as HTMLElement; jest.spyOn(cy, 'container').mockReturnValueOnce(container); renderHook(() => useCytoscapeEventHandlers({ cy, theme })); @@ -303,9 +302,9 @@ describe('useCytoscapeEventHandlers', () => { describe('when a tap ends', () => { it('sets the cursor to the default', () => { const cy = cytoscape({}); - const container = ({ + const container = { style: { cursor: 'grabbing' }, - } as unknown) as HTMLElement; + } as unknown as HTMLElement; jest.spyOn(cy, 'container').mockReturnValueOnce(container); renderHook(() => useCytoscapeEventHandlers({ cy, theme })); @@ -317,9 +316,9 @@ describe('useCytoscapeEventHandlers', () => { describe('when the target is a node', () => { it('does not change the cursor', () => { const cy = cytoscape({ elements: [{ data: { id: 'test' } }] }); - const container = ({ + const container = { style: { cursor: 'pointer' }, - } as unknown) as HTMLElement; + } as unknown as HTMLElement; jest.spyOn(cy, 'container').mockReturnValueOnce(container); renderHook(() => useCytoscapeEventHandlers({ cy, theme })); diff --git a/x-pack/plugins/apm/public/components/app/service_overview/service_overview.test.tsx b/x-pack/plugins/apm/public/components/app/service_overview/service_overview.test.tsx index b3c1afb32b0fd..62cefa5de47fa 100644 --- a/x-pack/plugins/apm/public/components/app/service_overview/service_overview.test.tsx +++ b/x-pack/plugins/apm/public/components/app/service_overview/service_overview.test.tsx @@ -34,11 +34,11 @@ import { uiSettingsServiceMock } from '../../../../../../../src/core/public/mock const uiSettings = uiSettingsServiceMock.create().setup({} as any); -const KibanaReactContext = createKibanaReactContext(({ +const KibanaReactContext = createKibanaReactContext({ notifications: { toasts: { add: () => {} } }, uiSettings, usageCollection: { reportUiCounter: () => {} }, -} as unknown) as Partial); +} as unknown as Partial); const mockParams = { rangeFrom: 'now-15m', @@ -52,7 +52,7 @@ const location = { }; function Wrapper({ children }: { children?: ReactNode }) { - const value = ({ + const value = { ...mockApmPluginContextValue, core: { ...mockApmPluginContextValue.core, @@ -61,7 +61,7 @@ function Wrapper({ children }: { children?: ReactNode }) { get: () => {}, }, }, - } as unknown) as ApmPluginContextValue; + } as unknown as ApmPluginContextValue; return ( @@ -102,15 +102,17 @@ describe('ServiceOverview', () => { 'GET /api/apm/services/{serviceName}/error_groups/main_statistics': { error_groups: [] as any[], }, - 'GET /api/apm/services/{serviceName}/transactions/groups/main_statistics': { - transactionGroups: [] as any[], - totalTransactionGroups: 0, - isAggregationAccurate: true, - }, + 'GET /api/apm/services/{serviceName}/transactions/groups/main_statistics': + { + transactionGroups: [] as any[], + totalTransactionGroups: 0, + isAggregationAccurate: true, + }, 'GET /api/apm/services/{serviceName}/dependencies': { serviceDependencies: [], }, - 'GET /api/apm/services/{serviceName}/service_overview_instances/main_statistics': [], + 'GET /api/apm/services/{serviceName}/service_overview_instances/main_statistics': + [], 'GET /api/apm/services/{serviceName}/transactions/charts/latency': { currentPeriod: { overallAvgDuration: null, diff --git a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_errors_table/get_columns.tsx b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_errors_table/get_columns.tsx index 23c0f49cdafa6..86f1907365bf6 100644 --- a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_errors_table/get_columns.tsx +++ b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_errors_table/get_columns.tsx @@ -15,8 +15,10 @@ import { ErrorDetailLink } from '../../../shared/Links/apm/ErrorDetailLink'; import { TimestampTooltip } from '../../../shared/TimestampTooltip'; import { TruncateWithTooltip } from '../../../shared/truncate_with_tooltip'; -type ErrorGroupMainStatistics = APIReturnType<'GET /api/apm/services/{serviceName}/error_groups/main_statistics'>; -type ErrorGroupDetailedStatistics = APIReturnType<'GET /api/apm/services/{serviceName}/error_groups/detailed_statistics'>; +type ErrorGroupMainStatistics = + APIReturnType<'GET /api/apm/services/{serviceName}/error_groups/main_statistics'>; +type ErrorGroupDetailedStatistics = + APIReturnType<'GET /api/apm/services/{serviceName}/error_groups/detailed_statistics'>; export function getColumns({ serviceName, diff --git a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_errors_table/index.tsx b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_errors_table/index.tsx index bfcd20b22301c..ebf634fd6b186 100644 --- a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_errors_table/index.tsx +++ b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_errors_table/index.tsx @@ -29,8 +29,10 @@ import { useTimeRange } from '../../../../hooks/use_time_range'; interface Props { serviceName: string; } -type ErrorGroupMainStatistics = APIReturnType<'GET /api/apm/services/{serviceName}/error_groups/main_statistics'>; -type ErrorGroupDetailedStatistics = APIReturnType<'GET /api/apm/services/{serviceName}/error_groups/detailed_statistics'>; +type ErrorGroupMainStatistics = + APIReturnType<'GET /api/apm/services/{serviceName}/error_groups/main_statistics'>; +type ErrorGroupDetailedStatistics = + APIReturnType<'GET /api/apm/services/{serviceName}/error_groups/detailed_statistics'>; type SortDirection = 'asc' | 'desc'; type SortField = 'name' | 'lastSeen' | 'occurrences'; diff --git a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_chart_and_table.tsx b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_chart_and_table.tsx index 87a4d4b7b87fb..ab42d9b80634a 100644 --- a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_chart_and_table.tsx +++ b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_chart_and_table.tsx @@ -27,8 +27,10 @@ interface ServiceOverviewInstancesChartAndTableProps { serviceName: string; } -type ApiResponseMainStats = APIReturnType<'GET /api/apm/services/{serviceName}/service_overview_instances/main_statistics'>; -type ApiResponseDetailedStats = APIReturnType<'GET /api/apm/services/{serviceName}/service_overview_instances/detailed_statistics'>; +type ApiResponseMainStats = + APIReturnType<'GET /api/apm/services/{serviceName}/service_overview_instances/main_statistics'>; +type ApiResponseDetailedStats = + APIReturnType<'GET /api/apm/services/{serviceName}/service_overview_instances/detailed_statistics'>; const INITIAL_STATE_MAIN_STATS = { currentPeriodItems: [] as ApiResponseMainStats['currentPeriod'], @@ -164,49 +166,48 @@ export function ServiceOverviewInstancesChartAndTable({ direction ).slice(pageIndex * PAGE_SIZE, (pageIndex + 1) * PAGE_SIZE); - const { - data: detailedStatsData = INITIAL_STATE_DETAILED_STATISTICS, - } = useFetcher( - (callApmApi) => { - if ( - !start || - !end || - !transactionType || - !latencyAggregationType || - !currentPeriodItemsCount - ) { - return; - } - - return callApmApi({ - endpoint: - 'GET /api/apm/services/{serviceName}/service_overview_instances/detailed_statistics', - params: { - path: { - serviceName, - }, - query: { - environment, - kuery, - latencyAggregationType, - start, - end, - numBuckets: 20, - transactionType, - serviceNodeIds: JSON.stringify( - currentPeriodOrderedItems.map((item) => item.serviceNodeName) - ), - comparisonStart, - comparisonEnd, + const { data: detailedStatsData = INITIAL_STATE_DETAILED_STATISTICS } = + useFetcher( + (callApmApi) => { + if ( + !start || + !end || + !transactionType || + !latencyAggregationType || + !currentPeriodItemsCount + ) { + return; + } + + return callApmApi({ + endpoint: + 'GET /api/apm/services/{serviceName}/service_overview_instances/detailed_statistics', + params: { + path: { + serviceName, + }, + query: { + environment, + kuery, + latencyAggregationType, + start, + end, + numBuckets: 20, + transactionType, + serviceNodeIds: JSON.stringify( + currentPeriodOrderedItems.map((item) => item.serviceNodeName) + ), + comparisonStart, + comparisonEnd, + }, }, - }, - }); - }, - // only fetches detailed statistics when requestId is invalidated by main statistics api call - // eslint-disable-next-line react-hooks/exhaustive-deps - [requestId], - { preservePreviousData: false } - ); + }); + }, + // only fetches detailed statistics when requestId is invalidated by main statistics api call + // eslint-disable-next-line react-hooks/exhaustive-deps + [requestId], + { preservePreviousData: false } + ); return ( <> diff --git a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/get_columns.tsx b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/get_columns.tsx index 97a92cb9e0576..3a80e0b075323 100644 --- a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/get_columns.tsx +++ b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/get_columns.tsx @@ -32,9 +32,12 @@ import { getLatencyColumnLabel } from '../../../shared/transactions_table/get_la import { TruncateWithTooltip } from '../../../shared/truncate_with_tooltip'; import { InstanceActionsMenu } from './instance_actions_menu'; -type ServiceInstanceMainStatistics = APIReturnType<'GET /api/apm/services/{serviceName}/service_overview_instances/main_statistics'>; -type MainStatsServiceInstanceItem = ServiceInstanceMainStatistics['currentPeriod'][0]; -type ServiceInstanceDetailedStatistics = APIReturnType<'GET /api/apm/services/{serviceName}/service_overview_instances/detailed_statistics'>; +type ServiceInstanceMainStatistics = + APIReturnType<'GET /api/apm/services/{serviceName}/service_overview_instances/main_statistics'>; +type MainStatsServiceInstanceItem = + ServiceInstanceMainStatistics['currentPeriod'][0]; +type ServiceInstanceDetailedStatistics = + APIReturnType<'GET /api/apm/services/{serviceName}/service_overview_instances/detailed_statistics'>; export function getColumns({ serviceName, diff --git a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/index.tsx b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/index.tsx index 1df6803fdbbb1..a8a93e8d4473e 100644 --- a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/index.tsx +++ b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/index.tsx @@ -28,9 +28,12 @@ import { InstanceDetails } from './intance_details'; import { useApmParams } from '../../../../hooks/use_apm_params'; import { useBreakpoints } from '../../../../hooks/use_breakpoints'; -type ServiceInstanceMainStatistics = APIReturnType<'GET /api/apm/services/{serviceName}/service_overview_instances/main_statistics'>; -type MainStatsServiceInstanceItem = ServiceInstanceMainStatistics['currentPeriod'][0]; -type ServiceInstanceDetailedStatistics = APIReturnType<'GET /api/apm/services/{serviceName}/service_overview_instances/detailed_statistics'>; +type ServiceInstanceMainStatistics = + APIReturnType<'GET /api/apm/services/{serviceName}/service_overview_instances/main_statistics'>; +type MainStatsServiceInstanceItem = + ServiceInstanceMainStatistics['currentPeriod'][0]; +type ServiceInstanceDetailedStatistics = + APIReturnType<'GET /api/apm/services/{serviceName}/service_overview_instances/detailed_statistics'>; export interface TableOptions { pageIndex: number; @@ -75,10 +78,8 @@ export function ServiceOverviewInstancesTable({ urlParams: { latencyAggregationType, comparisonEnabled }, } = useUrlParams(); - const [ - itemIdToOpenActionMenuRowMap, - setItemIdToOpenActionMenuRowMap, - ] = useState>({}); + const [itemIdToOpenActionMenuRowMap, setItemIdToOpenActionMenuRowMap] = + useState>({}); const [itemIdToExpandedRowMap, setItemIdToExpandedRowMap] = useState< Record diff --git a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/instance_actions_menu/menu_sections.ts b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/instance_actions_menu/menu_sections.ts index 0e78e44eedf77..cd7e64ae39668 100644 --- a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/instance_actions_menu/menu_sections.ts +++ b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/instance_actions_menu/menu_sections.ts @@ -16,7 +16,8 @@ import { SectionRecord, } from '../../../../shared/transaction_action_menu/sections_helper'; -type InstaceDetails = APIReturnType<'GET /api/apm/services/{serviceName}/service_overview_instances/details/{serviceNodeName}'>; +type InstaceDetails = + APIReturnType<'GET /api/apm/services/{serviceName}/service_overview_instances/details/{serviceNodeName}'>; function getInfraMetricsQuery(timestamp?: string) { if (!timestamp) { diff --git a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/instance_details.test.tsx b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/instance_details.test.tsx index 219c46ea0a94e..3a0ed21ca9808 100644 --- a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/instance_details.test.tsx +++ b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/instance_details.test.tsx @@ -15,7 +15,8 @@ import { import { InstanceDetails } from './intance_details'; import * as useInstanceDetailsFetcher from './use_instance_details_fetcher'; -type ServiceInstanceDetails = APIReturnType<'GET /api/apm/services/{serviceName}/service_overview_instances/details/{serviceNodeName}'>; +type ServiceInstanceDetails = + APIReturnType<'GET /api/apm/services/{serviceName}/service_overview_instances/details/{serviceNodeName}'>; describe('InstanceDetails', () => { it('renders loading spinner when data is being fetched', () => { diff --git a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/intance_details.tsx b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/intance_details.tsx index 1bfc92f159b52..7a194039e0d4c 100644 --- a/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/intance_details.tsx +++ b/x-pack/plugins/apm/public/components/app/service_overview/service_overview_instances_table/intance_details.tsx @@ -33,7 +33,8 @@ import { pushNewItemToKueryBar } from '../../../shared/kuery_bar/utils'; import { getCloudIcon, getContainerIcon } from '../../../shared/service_icons'; import { useInstanceDetailsFetcher } from './use_instance_details_fetcher'; -type ServiceInstanceDetails = APIReturnType<'GET /api/apm/services/{serviceName}/service_overview_instances/details/{serviceNodeName}'>; +type ServiceInstanceDetails = + APIReturnType<'GET /api/apm/services/{serviceName}/service_overview_instances/details/{serviceNodeName}'>; interface Props { serviceName: string; diff --git a/x-pack/plugins/apm/public/components/app/service_profiling/index.tsx b/x-pack/plugins/apm/public/components/app/service_profiling/index.tsx index 4149b426e0388..15caa833764b9 100644 --- a/x-pack/plugins/apm/public/components/app/service_profiling/index.tsx +++ b/x-pack/plugins/apm/public/components/app/service_profiling/index.tsx @@ -18,7 +18,8 @@ import { APIReturnType } from '../../../services/rest/createCallApmApi'; import { ServiceProfilingFlamegraph } from './service_profiling_flamegraph'; import { ServiceProfilingTimeline } from './service_profiling_timeline'; -type ApiResponse = APIReturnType<'GET /api/apm/services/{serviceName}/profiling/timeline'>; +type ApiResponse = + APIReturnType<'GET /api/apm/services/{serviceName}/profiling/timeline'>; const DEFAULT_DATA: ApiResponse = { profilingTimeline: [] }; export function ServiceProfiling() { @@ -62,9 +63,11 @@ export function ServiceProfiling() { } const availableValueTypes = profilingTimeline.reduce((set, point) => { - (Object.keys(point.valueTypes).filter( - (type) => type !== 'unknown' - ) as ProfilingValueType[]) + ( + Object.keys(point.valueTypes).filter( + (type) => type !== 'unknown' + ) as ProfilingValueType[] + ) .filter((type) => point.valueTypes[type] > 0) .forEach((type) => { set.add(type); diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/distribution/index.test.tsx b/x-pack/plugins/apm/public/components/app/transaction_details/distribution/index.test.tsx index 9a38e0fcf6289..9057d4c6667b8 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_details/distribution/index.test.tsx +++ b/x-pack/plugins/apm/public/components/app/transaction_details/distribution/index.test.tsx @@ -59,9 +59,9 @@ function Wrapper({ search: fromQuery({ transactionName: 'the-transaction-name' }), }); - const mockPluginContext = (merge({}, mockApmPluginContextValue, { + const mockPluginContext = merge({}, mockApmPluginContextValue, { core: { http: { get: httpGet } }, - }) as unknown) as ApmPluginContextValue; + }) as unknown as ApmPluginContextValue; return ( diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/distribution/index.tsx b/x-pack/plugins/apm/public/components/app/transaction_details/distribution/index.tsx index d77d337db2de6..ca162be92cdae 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_details/distribution/index.tsx +++ b/x-pack/plugins/apm/public/components/app/transaction_details/distribution/index.tsx @@ -138,7 +138,8 @@ export function TransactionDistribution({ trackApmEvent({ metric: 'transaction_distribution_chart_clear_selection' }); }; - const transactionDistributionChartData: TransactionDistributionChartData[] = []; + const transactionDistributionChartData: TransactionDistributionChartData[] = + []; if (Array.isArray(overallHistogram)) { transactionDistributionChartData.push({ diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/use_waterfall_fetcher.ts b/x-pack/plugins/apm/public/components/app/transaction_details/use_waterfall_fetcher.ts index 1506580d7b9e3..12bb8dbe12e4b 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_details/use_waterfall_fetcher.ts +++ b/x-pack/plugins/apm/public/components/app/transaction_details/use_waterfall_fetcher.ts @@ -28,7 +28,11 @@ export function useWaterfallFetcher() { const { start, end } = useTimeRange({ rangeFrom, rangeTo }); - const { data = INITIAL_DATA, status, error } = useFetcher( + const { + data = INITIAL_DATA, + status, + error, + } = useFetcher( (callApmApi) => { if (traceId && start && end) { return callApmApi({ @@ -46,10 +50,10 @@ export function useWaterfallFetcher() { [traceId, start, end] ); - const waterfall = useMemo(() => getWaterfall(data, transactionId), [ - data, - transactionId, - ]); + const waterfall = useMemo( + () => getWaterfall(data, transactionId), + [data, transactionId] + ); return { waterfall, status, error }; } diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/span_flyout/span_flyout.stories.tsx b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/span_flyout/span_flyout.stories.tsx index c736f9df214b9..33a0069e19ef1 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/span_flyout/span_flyout.stories.tsx +++ b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/span_flyout/span_flyout.stories.tsx @@ -145,8 +145,7 @@ TransactionSpan.args = { }, service: { node: { - name: - '399a87146c0036592f6ee78553324b10c00757e024143913c97993384751e15e', + name: '399a87146c0036592f6ee78553324b10c00757e024143913c97993384751e15e', }, environment: 'production', framework: { diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/transaction_flyout/transaction_flyout.stories.tsx b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/transaction_flyout/transaction_flyout.stories.tsx index 7e2365ffb8aff..33f1de91b61cc 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/transaction_flyout/transaction_flyout.stories.tsx +++ b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/transaction_flyout/transaction_flyout.stories.tsx @@ -98,8 +98,7 @@ Example.args = { }, service: { node: { - name: - '4810e1f4da909044f1f6f56be41a542dc59784948f059769d6a590952deca405', + name: '4810e1f4da909044f1f6f56be41a542dc59784948f059769d6a590952deca405', }, environment: 'production', framework: { diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/waterfall_helpers/waterfall_helpers.test.ts b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/waterfall_helpers/waterfall_helpers.test.ts index 3e0c5034f37a2..8c96c48f47d7c 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/waterfall_helpers/waterfall_helpers.test.ts +++ b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/Waterfall/waterfall_helpers/waterfall_helpers.test.ts @@ -85,7 +85,7 @@ describe('waterfall_helpers', () => { }, timestamp: { us: 1549324795785760 }, } as Span, - ({ + { parent: { id: 'mySpanIdD' }, processor: { event: 'transaction' }, trace: { id: 'myTraceId' }, @@ -103,10 +103,10 @@ describe('waterfall_helpers', () => { }, }, timestamp: { us: 1549324795823304 }, - } as unknown) as Transaction, + } as unknown as Transaction, ]; const errorDocs = [ - ({ + { processor: { event: 'error' }, parent: { id: 'myTransactionId1' }, timestamp: { us: 1549324795810000 }, @@ -124,7 +124,7 @@ describe('waterfall_helpers', () => { name: 'ruby', version: '2', }, - } as unknown) as APMError, + } as unknown as APMError, ]; it('should return full waterfall', () => { @@ -500,22 +500,22 @@ describe('waterfall_helpers', () => { { docType: 'transaction', id: 'a', - doc: ({ + doc: { transaction: { id: 'a' }, timestamp: { us: 10 }, - } as unknown) as Transaction, + } as unknown as Transaction, } as IWaterfallSpanOrTransaction, { docType: 'span', id: 'b', parentId: 'a', - doc: ({ + doc: { span: { id: 'b', }, parent: { id: 'a' }, timestamp: { us: 20 }, - } as unknown) as Span, + } as unknown as Span, } as IWaterfallSpanOrTransaction, ]; const childrenByParentId = groupBy(items, (hit) => diff --git a/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfallContainer.stories.data.ts b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfallContainer.stories.data.ts index 1e58c1bd00a28..87150cdfc83a8 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfallContainer.stories.data.ts +++ b/x-pack/plugins/apm/public/components/app/transaction_details/waterfall_with_summary/waterfall_container/waterfallContainer.stories.data.ts @@ -86,8 +86,7 @@ export const simpleTrace = { }, service: { node: { - name: - '4cf84d094553201997ddb7fea344b7c6ef18dcb8233eba39278946ee8449794e', + name: '4cf84d094553201997ddb7fea344b7c6ef18dcb8233eba39278946ee8449794e', }, environment: 'production', name: 'opbeans-java', @@ -192,8 +191,7 @@ export const simpleTrace = { '@timestamp': '2020-03-23T15:04:28.787Z', service: { node: { - name: - 'e948a08b8f5efe99b5da01f50da48c7d8aee3bbf4701f3da85ebe760c2ffef29', + name: 'e948a08b8f5efe99b5da01f50da48c7d8aee3bbf4701f3da85ebe760c2ffef29', }, environment: 'production', framework: { @@ -257,8 +255,7 @@ export const simpleTrace = { '@timestamp': '2020-03-23T15:04:28.788Z', service: { node: { - name: - 'a636915f1f6eec81ab44342b13a3ea9597ef03a24391e4e55f34ae2e20b30f51', + name: 'a636915f1f6eec81ab44342b13a3ea9597ef03a24391e4e55f34ae2e20b30f51', }, environment: 'production', framework: { @@ -338,8 +335,7 @@ export const simpleTrace = { }, service: { node: { - name: - '4cf84d094553201997ddb7fea344b7c6ef18dcb8233eba39278946ee8449794e', + name: '4cf84d094553201997ddb7fea344b7c6ef18dcb8233eba39278946ee8449794e', }, environment: 'production', name: 'opbeans-java', @@ -363,8 +359,7 @@ export const simpleTrace = { architecture: 'amd64', }, connection: { - hash: - "{service.environment:'production'}/{service.name:'opbeans-java'}/{span.subtype:'http'}/{destination.address:'opbeans-go'}/{span.type:'external'}", + hash: "{service.environment:'production'}/{service.name:'opbeans-java'}/{span.subtype:'http'}/{destination.address:'opbeans-go'}/{span.type:'external'}", }, transaction: { id: '49809ad3c26adf74', @@ -415,8 +410,7 @@ export const simpleTrace = { '@timestamp': '2020-03-23T15:04:28.787Z', service: { node: { - name: - 'e948a08b8f5efe99b5da01f50da48c7d8aee3bbf4701f3da85ebe760c2ffef29', + name: 'e948a08b8f5efe99b5da01f50da48c7d8aee3bbf4701f3da85ebe760c2ffef29', }, environment: 'production', name: 'opbeans-go', @@ -482,8 +476,7 @@ export const simpleTrace = { '@timestamp': '2020-03-23T15:04:28.790Z', service: { node: { - name: - 'a636915f1f6eec81ab44342b13a3ea9597ef03a24391e4e55f34ae2e20b30f51', + name: 'a636915f1f6eec81ab44342b13a3ea9597ef03a24391e4e55f34ae2e20b30f51', }, environment: 'production', framework: { @@ -536,7 +529,7 @@ export const simpleTrace = { errorDocs: [], } as TraceAPIResponse; -export const traceWithErrors = ({ +export const traceWithErrors = { traceDocs: [ { container: { @@ -588,8 +581,7 @@ export const traceWithErrors = ({ }, service: { node: { - name: - '4cf84d094553201997ddb7fea344b7c6ef18dcb8233eba39278946ee8449794e', + name: '4cf84d094553201997ddb7fea344b7c6ef18dcb8233eba39278946ee8449794e', }, environment: 'production', name: 'opbeans-java', @@ -694,8 +686,7 @@ export const traceWithErrors = ({ '@timestamp': '2020-03-23T15:04:28.787Z', service: { node: { - name: - 'e948a08b8f5efe99b5da01f50da48c7d8aee3bbf4701f3da85ebe760c2ffef29', + name: 'e948a08b8f5efe99b5da01f50da48c7d8aee3bbf4701f3da85ebe760c2ffef29', }, environment: 'production', framework: { @@ -759,8 +750,7 @@ export const traceWithErrors = ({ '@timestamp': '2020-03-23T15:04:28.788Z', service: { node: { - name: - 'a636915f1f6eec81ab44342b13a3ea9597ef03a24391e4e55f34ae2e20b30f51', + name: 'a636915f1f6eec81ab44342b13a3ea9597ef03a24391e4e55f34ae2e20b30f51', }, environment: 'production', framework: { @@ -840,8 +830,7 @@ export const traceWithErrors = ({ }, service: { node: { - name: - '4cf84d094553201997ddb7fea344b7c6ef18dcb8233eba39278946ee8449794e', + name: '4cf84d094553201997ddb7fea344b7c6ef18dcb8233eba39278946ee8449794e', }, environment: 'production', name: 'opbeans-java', @@ -865,8 +854,7 @@ export const traceWithErrors = ({ architecture: 'amd64', }, connection: { - hash: - "{service.environment:'production'}/{service.name:'opbeans-java'}/{span.subtype:'http'}/{destination.address:'opbeans-go'}/{span.type:'external'}", + hash: "{service.environment:'production'}/{service.name:'opbeans-java'}/{span.subtype:'http'}/{destination.address:'opbeans-go'}/{span.type:'external'}", }, transaction: { id: '49809ad3c26adf74', @@ -917,8 +905,7 @@ export const traceWithErrors = ({ '@timestamp': '2020-03-23T15:04:28.787Z', service: { node: { - name: - 'e948a08b8f5efe99b5da01f50da48c7d8aee3bbf4701f3da85ebe760c2ffef29', + name: 'e948a08b8f5efe99b5da01f50da48c7d8aee3bbf4701f3da85ebe760c2ffef29', }, environment: 'production', name: 'opbeans-go', @@ -984,8 +971,7 @@ export const traceWithErrors = ({ '@timestamp': '2020-03-23T15:04:28.790Z', service: { node: { - name: - 'a636915f1f6eec81ab44342b13a3ea9597ef03a24391e4e55f34ae2e20b30f51', + name: 'a636915f1f6eec81ab44342b13a3ea9597ef03a24391e4e55f34ae2e20b30f51', }, environment: 'production', framework: { @@ -1063,8 +1049,7 @@ export const traceWithErrors = ({ '@timestamp': '2020-03-23T16:04:28.787Z', service: { node: { - name: - 'e948a08b8f5efe99b5da01f50da48c7d8aee3bbf4701f3da85ebe760c2ffef29', + name: 'e948a08b8f5efe99b5da01f50da48c7d8aee3bbf4701f3da85ebe760c2ffef29', }, environment: 'production', name: 'opbeans-go', @@ -1113,8 +1098,7 @@ export const traceWithErrors = ({ '@timestamp': '2020-03-23T16:04:28.790Z', service: { node: { - name: - 'e948a08b8f5efe99b5da01f50da48c7d8aee3bbf4701f3da85ebe760c2ffef29', + name: 'e948a08b8f5efe99b5da01f50da48c7d8aee3bbf4701f3da85ebe760c2ffef29', }, environment: 'production', name: 'opbeans-python', @@ -1133,7 +1117,7 @@ export const traceWithErrors = ({ }, }, ], -} as unknown) as TraceAPIResponse; +} as unknown as TraceAPIResponse; export const traceChildStartBeforeParent = { traceDocs: [ @@ -1187,8 +1171,7 @@ export const traceChildStartBeforeParent = { }, service: { node: { - name: - '4cf84d094553201997ddb7fea344b7c6ef18dcb8233eba39278946ee8449794e', + name: '4cf84d094553201997ddb7fea344b7c6ef18dcb8233eba39278946ee8449794e', }, environment: 'production', name: 'opbeans-java', @@ -1293,8 +1276,7 @@ export const traceChildStartBeforeParent = { '@timestamp': '2020-03-23T15:04:28.787Z', service: { node: { - name: - 'e948a08b8f5efe99b5da01f50da48c7d8aee3bbf4701f3da85ebe760c2ffef29', + name: 'e948a08b8f5efe99b5da01f50da48c7d8aee3bbf4701f3da85ebe760c2ffef29', }, environment: 'production', framework: { @@ -1358,8 +1340,7 @@ export const traceChildStartBeforeParent = { '@timestamp': '2020-03-23T15:04:28.788Z', service: { node: { - name: - 'a636915f1f6eec81ab44342b13a3ea9597ef03a24391e4e55f34ae2e20b30f51', + name: 'a636915f1f6eec81ab44342b13a3ea9597ef03a24391e4e55f34ae2e20b30f51', }, environment: 'production', framework: { @@ -1439,8 +1420,7 @@ export const traceChildStartBeforeParent = { }, service: { node: { - name: - '4cf84d094553201997ddb7fea344b7c6ef18dcb8233eba39278946ee8449794e', + name: '4cf84d094553201997ddb7fea344b7c6ef18dcb8233eba39278946ee8449794e', }, environment: 'production', name: 'opbeans-java', @@ -1464,8 +1444,7 @@ export const traceChildStartBeforeParent = { architecture: 'amd64', }, connection: { - hash: - "{service.environment:'production'}/{service.name:'opbeans-java'}/{span.subtype:'http'}/{destination.address:'opbeans-go'}/{span.type:'external'}", + hash: "{service.environment:'production'}/{service.name:'opbeans-java'}/{span.subtype:'http'}/{destination.address:'opbeans-go'}/{span.type:'external'}", }, transaction: { id: '49809ad3c26adf74', @@ -1516,8 +1495,7 @@ export const traceChildStartBeforeParent = { '@timestamp': '2020-03-23T15:04:28.787Z', service: { node: { - name: - 'e948a08b8f5efe99b5da01f50da48c7d8aee3bbf4701f3da85ebe760c2ffef29', + name: 'e948a08b8f5efe99b5da01f50da48c7d8aee3bbf4701f3da85ebe760c2ffef29', }, environment: 'production', name: 'opbeans-go', @@ -1583,8 +1561,7 @@ export const traceChildStartBeforeParent = { '@timestamp': '2020-03-23T15:04:28.790Z', service: { node: { - name: - 'a636915f1f6eec81ab44342b13a3ea9597ef03a24391e4e55f34ae2e20b30f51', + name: 'a636915f1f6eec81ab44342b13a3ea9597ef03a24391e4e55f34ae2e20b30f51', }, environment: 'production', framework: { @@ -1684,8 +1661,7 @@ export const inferredSpans = { }, service: { node: { - name: - 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', + name: 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', }, environment: 'production', name: 'opbeans-java', @@ -1800,8 +1776,7 @@ export const inferredSpans = { }, service: { node: { - name: - 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', + name: 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', }, environment: 'production', name: 'opbeans-java', @@ -1878,8 +1853,7 @@ export const inferredSpans = { }, service: { node: { - name: - 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', + name: 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', }, environment: 'production', name: 'opbeans-java', @@ -1979,8 +1953,7 @@ export const inferredSpans = { }, service: { node: { - name: - 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', + name: 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', }, environment: 'production', name: 'opbeans-java', @@ -2057,8 +2030,7 @@ export const inferredSpans = { }, service: { node: { - name: - 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', + name: 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', }, environment: 'production', name: 'opbeans-java', @@ -2139,8 +2111,7 @@ export const inferredSpans = { }, service: { node: { - name: - 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', + name: 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', }, environment: 'production', name: 'opbeans-java', @@ -2237,8 +2208,7 @@ export const inferredSpans = { }, service: { node: { - name: - 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', + name: 'fc2ae281f56fb84728bc9b5e6c17f3d13bbb7f4efd461158558e5c38e655abad', }, environment: 'production', name: 'opbeans-java', diff --git a/x-pack/plugins/apm/public/components/app/transaction_overview/transaction_overview.test.tsx b/x-pack/plugins/apm/public/components/app/transaction_overview/transaction_overview.test.tsx index 9c145e95dbf14..e031af6464187 100644 --- a/x-pack/plugins/apm/public/components/app/transaction_overview/transaction_overview.test.tsx +++ b/x-pack/plugins/apm/public/components/app/transaction_overview/transaction_overview.test.tsx @@ -24,10 +24,10 @@ import { import { fromQuery } from '../../shared/Links/url_helpers'; import { TransactionOverview } from './'; -const KibanaReactContext = createKibanaReactContext(({ +const KibanaReactContext = createKibanaReactContext({ uiSettings: { get: () => true }, usageCollection: { reportUiCounter: () => {} }, -} as unknown) as Partial); +} as unknown as Partial); const history = createMemoryHistory(); jest.spyOn(history, 'push'); diff --git a/x-pack/plugins/apm/public/components/fleet_integration/apm_policy_form/index.tsx b/x-pack/plugins/apm/public/components/fleet_integration/apm_policy_form/index.tsx index 51944fdbddec0..06e0e958bf698 100644 --- a/x-pack/plugins/apm/public/components/fleet_integration/apm_policy_form/index.tsx +++ b/x-pack/plugins/apm/public/components/fleet_integration/apm_policy_form/index.tsx @@ -32,21 +32,17 @@ export function APMPolicyForm({ isCloudPolicy, updateAPMPolicy, }: Props) { - const { - apmSettings, - rumSettings, - tlsSettings, - agentAuthorizationSettings, - } = useMemo(() => { - return { - apmSettings: getApmSettings({ isCloudPolicy }), - rumSettings: getRUMSettings(), - tlsSettings: getTLSSettings(), - agentAuthorizationSettings: getAgentAuthorizationSettings({ - isCloudPolicy, - }), - }; - }, [isCloudPolicy]); + const { apmSettings, rumSettings, tlsSettings, agentAuthorizationSettings } = + useMemo(() => { + return { + apmSettings: getApmSettings({ isCloudPolicy }), + rumSettings: getRUMSettings(), + tlsSettings: getTLSSettings(), + agentAuthorizationSettings: getAgentAuthorizationSettings({ + isCloudPolicy, + }), + }; + }, [isCloudPolicy]); function handleFormChange(key: string, value: any) { // Merge new key/value with the rest of fields diff --git a/x-pack/plugins/apm/public/components/routing/templates/apm_service_template/analyze_data_button.stories.tsx b/x-pack/plugins/apm/public/components/routing/templates/apm_service_template/analyze_data_button.stories.tsx index d9d3b50e03696..836b31bc5dfdb 100644 --- a/x-pack/plugins/apm/public/components/routing/templates/apm_service_template/analyze_data_button.stories.tsx +++ b/x-pack/plugins/apm/public/components/routing/templates/apm_service_template/analyze_data_button.stories.tsx @@ -29,12 +29,12 @@ export default { (StoryComponent: ComponentType, { args }: StoryContext) => { const { agentName, canShowDashboard, environment, serviceName } = args; - const KibanaContext = createKibanaReactContext(({ + const KibanaContext = createKibanaReactContext({ application: { capabilities: { dashboard: { show: canShowDashboard } }, }, http: { basePath: { get: () => '' } }, - } as unknown) as Partial); + } as unknown as Partial); return ( `/basepath`, }, } as HttpStart, - docLinks: ({ + docLinks: { DOC_LINK_VERSION: '0', ELASTIC_WEBSITE_URL: 'https://www.elastic.co/', links: { apm: {}, observability: { guide: '' }, }, - } as unknown) as DocLinksStart, + } as unknown as DocLinksStart, } as Partial); function Wrapper({ children }: { children?: ReactNode }) { @@ -53,9 +53,9 @@ function Wrapper({ children }: { children?: ReactNode }) { describe('Settings', () => { it('renders', async () => { - const routerProps = ({ + const routerProps = { location, - } as unknown) as RouteComponentProps<{}>; + } as unknown as RouteComponentProps<{}>; expect(() => render( diff --git a/x-pack/plugins/apm/public/components/shared/DatePicker/index.tsx b/x-pack/plugins/apm/public/components/shared/DatePicker/index.tsx index fa59d651061f9..6772438fed01b 100644 --- a/x-pack/plugins/apm/public/components/shared/DatePicker/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/DatePicker/index.tsx @@ -78,7 +78,8 @@ export function DatePicker() { } // read time from state and update the url - const timePickerSharedState = plugins.data.query.timefilter.timefilter.getTime(); + const timePickerSharedState = + plugins.data.query.timefilter.timefilter.getTime(); history.replace({ ...location, diff --git a/x-pack/plugins/apm/public/components/shared/Links/MachineLearningLinks/MLExplorerLink.tsx b/x-pack/plugins/apm/public/components/shared/Links/MachineLearningLinks/MLExplorerLink.tsx index c1247441099ba..11b29f00155fc 100644 --- a/x-pack/plugins/apm/public/components/shared/Links/MachineLearningLinks/MLExplorerLink.tsx +++ b/x-pack/plugins/apm/public/components/shared/Links/MachineLearningLinks/MLExplorerLink.tsx @@ -39,9 +39,10 @@ export function useExplorerHref({ jobId }: { jobId: string }) { } = useApmPluginContext(); const { urlParams } = useUrlParams(); - const timePickerRefreshIntervalDefaults = core.uiSettings.get( - UI_SETTINGS.TIMEPICKER_REFRESH_INTERVAL_DEFAULTS - ); + const timePickerRefreshIntervalDefaults = + core.uiSettings.get( + UI_SETTINGS.TIMEPICKER_REFRESH_INTERVAL_DEFAULTS + ); const { // hardcoding a custom default of 1 hour since the default kibana timerange of 15 minutes is shorter than the ML interval diff --git a/x-pack/plugins/apm/public/components/shared/Links/MachineLearningLinks/MLManageJobsLink.tsx b/x-pack/plugins/apm/public/components/shared/Links/MachineLearningLinks/MLManageJobsLink.tsx index ede1c33a341db..5c8d464204090 100644 --- a/x-pack/plugins/apm/public/components/shared/Links/MachineLearningLinks/MLManageJobsLink.tsx +++ b/x-pack/plugins/apm/public/components/shared/Links/MachineLearningLinks/MLManageJobsLink.tsx @@ -26,9 +26,10 @@ export function MLManageJobsLink({ children, external }: Props) { const { urlParams } = useUrlParams(); - const timePickerRefreshIntervalDefaults = core.uiSettings.get( - UI_SETTINGS.TIMEPICKER_REFRESH_INTERVAL_DEFAULTS - ); + const timePickerRefreshIntervalDefaults = + core.uiSettings.get( + UI_SETTINGS.TIMEPICKER_REFRESH_INTERVAL_DEFAULTS + ); const { // hardcoding a custom default of 1 hour since the default kibana timerange of 15 minutes is shorter than the ML interval diff --git a/x-pack/plugins/apm/public/components/shared/Links/MachineLearningLinks/MLSingleMetricLink.tsx b/x-pack/plugins/apm/public/components/shared/Links/MachineLearningLinks/MLSingleMetricLink.tsx index 24812cf2feae6..a36beccd16be5 100644 --- a/x-pack/plugins/apm/public/components/shared/Links/MachineLearningLinks/MLSingleMetricLink.tsx +++ b/x-pack/plugins/apm/public/components/shared/Links/MachineLearningLinks/MLSingleMetricLink.tsx @@ -55,9 +55,10 @@ export function useSingleMetricHref({ } = useApmPluginContext(); const { urlParams } = useUrlParams(); - const timePickerRefreshIntervalDefaults = core.uiSettings.get( - UI_SETTINGS.TIMEPICKER_REFRESH_INTERVAL_DEFAULTS - ); + const timePickerRefreshIntervalDefaults = + core.uiSettings.get( + UI_SETTINGS.TIMEPICKER_REFRESH_INTERVAL_DEFAULTS + ); const { // hardcoding a custom default of 1 hour since the default kibana timerange of 15 minutes is shorter than the ML interval diff --git a/x-pack/plugins/apm/public/components/shared/MetadataTable/ErrorMetadata/ErrorMetadata.test.tsx b/x-pack/plugins/apm/public/components/shared/MetadataTable/ErrorMetadata/ErrorMetadata.test.tsx index 9be47b7d1083b..f936941923e41 100644 --- a/x-pack/plugins/apm/public/components/shared/MetadataTable/ErrorMetadata/ErrorMetadata.test.tsx +++ b/x-pack/plugins/apm/public/components/shared/MetadataTable/ErrorMetadata/ErrorMetadata.test.tsx @@ -29,7 +29,7 @@ const renderOptions = { }; function getError() { - return ({ + return { labels: { someKey: 'labels value' }, http: { someKey: 'http value' }, host: { someKey: 'host value' }, @@ -47,7 +47,7 @@ function getError() { someKey: 'custom value', }, }, - } as unknown) as APMError; + } as unknown as APMError; } describe('ErrorMetadata', () => { diff --git a/x-pack/plugins/apm/public/components/shared/MetadataTable/MetadataTable.test.tsx b/x-pack/plugins/apm/public/components/shared/MetadataTable/MetadataTable.test.tsx index f21dbf3ae12ed..7ccde6a9a74d6 100644 --- a/x-pack/plugins/apm/public/components/shared/MetadataTable/MetadataTable.test.tsx +++ b/x-pack/plugins/apm/public/components/shared/MetadataTable/MetadataTable.test.tsx @@ -27,7 +27,7 @@ const renderOptions = { describe('MetadataTable', () => { it('shows sections', () => { - const sectionsWithRows = ([ + const sectionsWithRows = [ { key: 'foo', label: 'Foo', required: true }, { key: 'bar', @@ -39,7 +39,7 @@ describe('MetadataTable', () => { { key: 'props.B', value: 'B' }, ], }, - ] as unknown) as SectionsWithRows; + ] as unknown as SectionsWithRows; const output = render( , renderOptions @@ -56,13 +56,13 @@ describe('MetadataTable', () => { }); describe('required sections', () => { it('shows "empty state message" if no data is available', () => { - const sectionsWithRows = ([ + const sectionsWithRows = [ { key: 'foo', label: 'Foo', required: true, }, - ] as unknown) as SectionsWithRows; + ] as unknown as SectionsWithRows; const output = render( , renderOptions diff --git a/x-pack/plugins/apm/public/components/shared/MetadataTable/SpanMetadata/SpanMetadata.test.tsx b/x-pack/plugins/apm/public/components/shared/MetadataTable/SpanMetadata/SpanMetadata.test.tsx index 308d55b2925cc..46eaba1e9e11d 100644 --- a/x-pack/plugins/apm/public/components/shared/MetadataTable/SpanMetadata/SpanMetadata.test.tsx +++ b/x-pack/plugins/apm/public/components/shared/MetadataTable/SpanMetadata/SpanMetadata.test.tsx @@ -31,7 +31,7 @@ const renderOptions = { describe('SpanMetadata', () => { describe('render', () => { it('renders', () => { - const span = ({ + const span = { agent: { ephemeral_id: 'ed8e3a4f-21d2-4a1f-bbc7-fa2064d94225', name: 'java', @@ -47,14 +47,14 @@ describe('SpanMetadata', () => { queue: { name: 'queue name' }, }, }, - } as unknown) as Span; + } as unknown as Span; const output = render(, renderOptions); expectTextsInDocument(output, ['Service', 'Agent', 'Message']); }); }); describe('when a span is presented', () => { it('renders the span', () => { - const span = ({ + const span = { agent: { ephemeral_id: 'ed8e3a4f-21d2-4a1f-bbc7-fa2064d94225', name: 'java', @@ -75,14 +75,14 @@ describe('SpanMetadata', () => { queue: { name: 'queue name' }, }, }, - } as unknown) as Span; + } as unknown as Span; const output = render(, renderOptions); expectTextsInDocument(output, ['Service', 'Agent', 'Span', 'Message']); }); }); describe('when there is no id inside span', () => { it('does not show the section', () => { - const span = ({ + const span = { agent: { ephemeral_id: 'ed8e3a4f-21d2-4a1f-bbc7-fa2064d94225', name: 'java', @@ -98,7 +98,7 @@ describe('SpanMetadata', () => { subtype: 'http', type: 'external', }, - } as unknown) as Span; + } as unknown as Span; const output = render(, renderOptions); expectTextsInDocument(output, ['Service', 'Agent']); expectTextsNotInDocument(output, ['Span', 'Message']); diff --git a/x-pack/plugins/apm/public/components/shared/MetadataTable/TransactionMetadata/TransactionMetadata.test.tsx b/x-pack/plugins/apm/public/components/shared/MetadataTable/TransactionMetadata/TransactionMetadata.test.tsx index fa4e802cc7d66..08253f04777d9 100644 --- a/x-pack/plugins/apm/public/components/shared/MetadataTable/TransactionMetadata/TransactionMetadata.test.tsx +++ b/x-pack/plugins/apm/public/components/shared/MetadataTable/TransactionMetadata/TransactionMetadata.test.tsx @@ -29,7 +29,7 @@ const renderOptions = { }; function getTransaction() { - return ({ + return { labels: { someKey: 'labels value' }, http: { someKey: 'http value' }, host: { someKey: 'host value' }, @@ -51,7 +51,7 @@ function getTransaction() { queue: { name: 'queue name' }, }, }, - } as unknown) as Transaction; + } as unknown as Transaction; } describe('TransactionMetadata', () => { diff --git a/x-pack/plugins/apm/public/components/shared/MetadataTable/helper.test.ts b/x-pack/plugins/apm/public/components/shared/MetadataTable/helper.test.ts index 87a94f48e9472..770b35e7d17f2 100644 --- a/x-pack/plugins/apm/public/components/shared/MetadataTable/helper.test.ts +++ b/x-pack/plugins/apm/public/components/shared/MetadataTable/helper.test.ts @@ -15,7 +15,7 @@ describe('MetadataTable Helper', () => { HTTP, { ...SERVICE, properties: ['environment'] }, ]; - const apmDoc = ({ + const apmDoc = { http: { headers: { Connection: 'close', @@ -27,7 +27,7 @@ describe('MetadataTable Helper', () => { framework: { name: 'express' }, environment: 'production', }, - } as unknown) as Transaction; + } as unknown as Transaction; const metadataItems = getSectionsWithRows(sections, apmDoc); it('returns flattened data and required section', () => { diff --git a/x-pack/plugins/apm/public/components/shared/MetadataTable/helper.ts b/x-pack/plugins/apm/public/components/shared/MetadataTable/helper.ts index 2c487890a0ba1..bd115c1c7c174 100644 --- a/x-pack/plugins/apm/public/components/shared/MetadataTable/helper.ts +++ b/x-pack/plugins/apm/public/components/shared/MetadataTable/helper.ts @@ -21,11 +21,10 @@ export const getSectionsWithRows = ( return sections .map((section) => { const sectionData: Record = get(apmDoc, section.key); - const filteredData: - | Record - | undefined = section.properties - ? pick(sectionData, section.properties) - : sectionData; + const filteredData: Record | undefined = + section.properties + ? pick(sectionData, section.properties) + : sectionData; const rows: KeyValuePair[] = flattenObject(filteredData, section.key); return { ...section, rows }; diff --git a/x-pack/plugins/apm/public/components/shared/apm_header_action_menu/anomaly_detection_setup_link.test.tsx b/x-pack/plugins/apm/public/components/shared/apm_header_action_menu/anomaly_detection_setup_link.test.tsx index 6a6ba3f9529ff..0520cfa39a743 100644 --- a/x-pack/plugins/apm/public/components/shared/apm_header_action_menu/anomaly_detection_setup_link.test.tsx +++ b/x-pack/plugins/apm/public/components/shared/apm_header_action_menu/anomaly_detection_setup_link.test.tsx @@ -36,14 +36,14 @@ async function renderTooltipAnchor({ // wait for tooltip text to be in the DOM await waitFor(() => { - const toolTipText = baseElement.querySelector('.euiToolTipPopover') - ?.textContent; + const toolTipText = + baseElement.querySelector('.euiToolTipPopover')?.textContent; expect(toolTipText).not.toBe(undefined); }); } - const toolTipText = baseElement.querySelector('.euiToolTipPopover') - ?.textContent; + const toolTipText = + baseElement.querySelector('.euiToolTipPopover')?.textContent; return { toolTipText, toolTipAnchor }; } diff --git a/x-pack/plugins/apm/public/components/shared/apm_header_action_menu/anomaly_detection_setup_link.tsx b/x-pack/plugins/apm/public/components/shared/apm_header_action_menu/anomaly_detection_setup_link.tsx index f0c71265b70bb..c84cbc9a4b104 100644 --- a/x-pack/plugins/apm/public/components/shared/apm_header_action_menu/anomaly_detection_setup_link.tsx +++ b/x-pack/plugins/apm/public/components/shared/apm_header_action_menu/anomaly_detection_setup_link.tsx @@ -26,7 +26,8 @@ import { useTheme } from '../../../hooks/use_theme'; import { APIReturnType } from '../../../services/rest/createCallApmApi'; import { getAPMHref } from '../Links/apm/APMLink'; -export type AnomalyDetectionApiResponse = APIReturnType<'GET /api/apm/settings/anomaly-detection/jobs'>; +export type AnomalyDetectionApiResponse = + APIReturnType<'GET /api/apm/settings/anomaly-detection/jobs'>; const DEFAULT_DATA = { jobs: [], hasLegacyJobs: false }; diff --git a/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/error_marker.test.tsx b/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/error_marker.test.tsx index fdb97ea4fadde..cef97c46fd2e2 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/error_marker.test.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/Timeline/Marker/error_marker.test.tsx @@ -26,7 +26,7 @@ function Wrapper({ children }: { children?: ReactNode }) { } describe('ErrorMarker', () => { - const mark = ({ + const mark = { id: 'agent', offset: 10000, type: 'errorMark', @@ -44,7 +44,7 @@ describe('ErrorMarker', () => { service: { name: 'bar' }, }, serviceColor: '#fff', - } as unknown) as ErrorMark; + } as unknown as ErrorMark; function openPopover(errorMark: ErrorMark) { const component = renderWithTheme(, { @@ -114,7 +114,7 @@ describe('ErrorMarker', () => { describe('when the error message is not longer than 240 characters', () => { it('truncates the error message text', () => { - const newMark = ({ + const newMark = { ...mark, error: { ...mark.error, @@ -125,7 +125,7 @@ describe('ErrorMarker', () => { }, }, }, - } as unknown) as ErrorMark; + } as unknown as ErrorMark; const component = openPopover(newMark); const errorLink = component.getByTestId('errorLink') as HTMLAnchorElement; expect(errorLink.innerHTML).toHaveLength(5); diff --git a/x-pack/plugins/apm/public/components/shared/charts/helper/get_alert_annotations.test.tsx b/x-pack/plugins/apm/public/components/shared/charts/helper/get_alert_annotations.test.tsx index 2b463d1cdd064..e63f7fbc79ab2 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/helper/get_alert_annotations.test.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/helper/get_alert_annotations.test.tsx @@ -35,9 +35,9 @@ type Alert = ValuesType< const euiColorDanger = 'red'; const euiColorWarning = 'yellow'; -const theme = ({ +const theme = { eui: { euiColorDanger, euiColorWarning }, -} as unknown) as EuiTheme; +} as unknown as EuiTheme; const alert: Alert = { [ALERT_RULE_TYPE_ID]: ['apm.transaction_duration'], [ALERT_EVALUATION_VALUE]: [2057657.39], @@ -62,10 +62,11 @@ const alert: Alert = { [ALERT_RULE_CATEGORY]: ['Latency threshold'], }; const chartStartTime = new Date(alert[ALERT_START]![0] as string).getTime(); -const getFormatter: ObservabilityRuleTypeRegistry['getFormatter'] = () => () => ({ - link: '/', - reason: 'a good reason', -}); +const getFormatter: ObservabilityRuleTypeRegistry['getFormatter'] = + () => () => ({ + link: '/', + reason: 'a good reason', + }); const selectedAlertId = undefined; const setSelectedAlertId = jest.fn(); @@ -127,8 +128,8 @@ describe('getAlertAnnotations', () => { describe('with no formatter', () => { it('uses the rule type', () => { - const getNoFormatter: ObservabilityRuleTypeRegistry['getFormatter'] = () => - undefined; + const getNoFormatter: ObservabilityRuleTypeRegistry['getFormatter'] = + () => undefined; expect( getAlertAnnotations({ diff --git a/x-pack/plugins/apm/public/components/shared/charts/helper/get_alert_annotations.tsx b/x-pack/plugins/apm/public/components/shared/charts/helper/get_alert_annotations.tsx index 4aef5f6e56b96..39e1ce59de4bc 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/helper/get_alert_annotations.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/helper/get_alert_annotations.tsx @@ -41,7 +41,8 @@ const ALERT_DURATION: typeof ALERT_DURATION_TYPED = ALERT_DURATION_NON_TYPED; const ALERT_SEVERITY: typeof ALERT_SEVERITY_TYPED = ALERT_SEVERITY_NON_TYPED; const ALERT_START: typeof ALERT_START_TYPED = ALERT_START_NON_TYPED; const ALERT_UUID: typeof ALERT_UUID_TYPED = ALERT_UUID_NON_TYPED; -const ALERT_RULE_TYPE_ID: typeof ALERT_RULE_TYPE_ID_TYPED = ALERT_RULE_TYPE_ID_NON_TYPED; +const ALERT_RULE_TYPE_ID: typeof ALERT_RULE_TYPE_ID_TYPED = + ALERT_RULE_TYPE_ID_NON_TYPED; const ALERT_RULE_NAME: typeof ALERT_RULE_NAME_TYPED = ALERT_RULE_NAME_NON_TYPED; type Alert = ValuesType< diff --git a/x-pack/plugins/apm/public/components/shared/charts/helper/helper.test.ts b/x-pack/plugins/apm/public/components/shared/charts/helper/helper.test.ts index b8d67f71a9baa..647064f88b5d1 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/helper/helper.test.ts +++ b/x-pack/plugins/apm/public/components/shared/charts/helper/helper.test.ts @@ -11,12 +11,12 @@ import { Coordinate, TimeSeries } from '../../../../../typings/timeseries'; describe('Chart helper', () => { describe('onBrushEnd', () => { - const history = ({ + const history = { push: jest.fn(), location: { search: '', }, - } as unknown) as History; + } as unknown as History; it("doesn't push a new history when x is not defined", () => { onBrushEnd({ x: undefined, history }); expect(history.push).not.toBeCalled(); diff --git a/x-pack/plugins/apm/public/components/shared/charts/instances_latency_distribution_chart/custom_tooltip.stories.tsx b/x-pack/plugins/apm/public/components/shared/charts/instances_latency_distribution_chart/custom_tooltip.stories.tsx index ae3c871e25a1a..d39770b68d5b6 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/instances_latency_distribution_chart/custom_tooltip.stories.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/instances_latency_distribution_chart/custom_tooltip.stories.tsx @@ -11,13 +11,15 @@ import { APIReturnType } from '../../../../services/rest/createCallApmApi'; import { getDurationFormatter } from '../../../../../common/utils/formatters'; import { CustomTooltip } from './custom_tooltip'; -type ServiceInstanceMainStatistics = APIReturnType<'GET /api/apm/services/{serviceName}/service_overview_instances/main_statistics'>; -type MainStatsServiceInstanceItem = ServiceInstanceMainStatistics['currentPeriod'][0]; +type ServiceInstanceMainStatistics = + APIReturnType<'GET /api/apm/services/{serviceName}/service_overview_instances/main_statistics'>; +type MainStatsServiceInstanceItem = + ServiceInstanceMainStatistics['currentPeriod'][0]; function getLatencyFormatter(props: TooltipInfo) { const maxLatency = Math.max( ...props.values.map((value) => { - const datum = (value.datum as unknown) as MainStatsServiceInstanceItem; + const datum = value.datum as unknown as MainStatsServiceInstanceItem; return datum.latency ?? 0; }) ); @@ -37,8 +39,7 @@ export function Example(props: TooltipInfo) { Example.args = { header: { seriesIdentifier: { - key: - 'groupId{__global__}spec{Instances}yAccessor{(index:0)}splitAccessors{}', + key: 'groupId{__global__}spec{Instances}yAccessor{(index:0)}splitAccessors{}', specId: 'Instances', yAccessor: '(index:0)', splitAccessors: {}, @@ -65,8 +66,7 @@ Example.args = { values: [ { seriesIdentifier: { - key: - 'groupId{__global__}spec{Instances}yAccessor{(index:0)}splitAccessors{}', + key: 'groupId{__global__}spec{Instances}yAccessor{(index:0)}splitAccessors{}', specId: 'Instances', }, valueAccessor: 'y1', @@ -98,8 +98,7 @@ export function MultipleInstances(props: TooltipInfo) { MultipleInstances.args = { header: { seriesIdentifier: { - key: - 'groupId{__global__}spec{Instances}yAccessor{(index:0)}splitAccessors{}', + key: 'groupId{__global__}spec{Instances}yAccessor{(index:0)}splitAccessors{}', specId: 'Instances', yAccessor: '(index:0)', splitAccessors: {}, @@ -126,8 +125,7 @@ MultipleInstances.args = { values: [ { seriesIdentifier: { - key: - 'groupId{__global__}spec{Instances}yAccessor{(index:0)}splitAccessors{}', + key: 'groupId{__global__}spec{Instances}yAccessor{(index:0)}splitAccessors{}', specId: 'Instances', }, valueAccessor: 'y1', @@ -150,8 +148,7 @@ MultipleInstances.args = { }, { seriesIdentifier: { - key: - 'groupId{__global__}spec{Instances}yAccessor{(index:0)}splitAccessors{}', + key: 'groupId{__global__}spec{Instances}yAccessor{(index:0)}splitAccessors{}', specId: 'Instances', }, valueAccessor: 'y1', diff --git a/x-pack/plugins/apm/public/components/shared/charts/instances_latency_distribution_chart/custom_tooltip.tsx b/x-pack/plugins/apm/public/components/shared/charts/instances_latency_distribution_chart/custom_tooltip.tsx index a0197c2f50c96..7289ffddd0eab 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/instances_latency_distribution_chart/custom_tooltip.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/instances_latency_distribution_chart/custom_tooltip.tsx @@ -17,8 +17,10 @@ import { } from '../../../../../common/utils/formatters'; import { useTheme } from '../../../../hooks/use_theme'; -type ServiceInstanceMainStatistics = APIReturnType<'GET /api/apm/services/{serviceName}/service_overview_instances/main_statistics'>; -type MainStatsServiceInstanceItem = ServiceInstanceMainStatistics['currentPeriod'][0]; +type ServiceInstanceMainStatistics = + APIReturnType<'GET /api/apm/services/{serviceName}/service_overview_instances/main_statistics'>; +type MainStatsServiceInstanceItem = + ServiceInstanceMainStatistics['currentPeriod'][0]; const latencyLabel = i18n.translate( 'xpack.apm.instancesLatencyDistributionChartTooltipLatencyLabel', @@ -51,7 +53,7 @@ function SingleInstanceCustomTooltip({ }) { const value = values[0]; const { color } = value; - const datum = (value.datum as unknown) as MainStatsServiceInstanceItem; + const datum = value.datum as unknown as MainStatsServiceInstanceItem; const { latency, serviceNodeName, throughput } = datum; return ( @@ -122,7 +124,7 @@ function MultipleInstanceCustomTooltip({
{values.map((value) => { const { color } = value; - const datum = (value.datum as unknown) as MainStatsServiceInstanceItem; + const datum = value.datum as unknown as MainStatsServiceInstanceItem; const { latency, serviceNodeName, throughput } = datum; return (
diff --git a/x-pack/plugins/apm/public/components/shared/charts/instances_latency_distribution_chart/index.tsx b/x-pack/plugins/apm/public/components/shared/charts/instances_latency_distribution_chart/index.tsx index b7d1d37d2c0d0..5c974664eb1d3 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/instances_latency_distribution_chart/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/instances_latency_distribution_chart/index.tsx @@ -36,7 +36,8 @@ import { ChartContainer } from '../chart_container'; import { getResponseTimeTickFormatter } from '../transaction_charts/helper'; import { CustomTooltip } from './custom_tooltip'; -type ApiResponseMainStats = APIReturnType<'GET /api/apm/services/{serviceName}/service_overview_instances/main_statistics'>; +type ApiResponseMainStats = + APIReturnType<'GET /api/apm/services/{serviceName}/service_overview_instances/main_statistics'>; export interface InstancesLatencyDistributionChartProps { height: number; diff --git a/x-pack/plugins/apm/public/components/shared/charts/latency_chart/index.tsx b/x-pack/plugins/apm/public/components/shared/charts/latency_chart/index.tsx index 20c623d6792e6..3cee9c22174ad 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/latency_chart/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/latency_chart/index.tsx @@ -29,7 +29,8 @@ import { MLHeader } from '../../../shared/charts/transaction_charts/ml_header'; import * as urlHelpers from '../../../shared/Links/url_helpers'; import { getComparisonChartTheme } from '../../time_comparison/get_time_range_comparison'; -const ALERT_RULE_TYPE_ID: typeof ALERT_RULE_TYPE_ID_TYPED = ALERT_RULE_TYPE_ID_NON_TYPED; +const ALERT_RULE_TYPE_ID: typeof ALERT_RULE_TYPE_ID_TYPED = + ALERT_RULE_TYPE_ID_NON_TYPED; interface Props { height?: number; @@ -55,20 +56,14 @@ export function LatencyChart({ height, kuery, environment }: Props) { const { latencyAggregationType, comparisonEnabled } = urlParams; const license = useLicenseContext(); - const { - latencyChartsData, - latencyChartsStatus, - } = useTransactionLatencyChartsFetcher({ - kuery, - environment, - }); + const { latencyChartsData, latencyChartsStatus } = + useTransactionLatencyChartsFetcher({ + kuery, + environment, + }); - const { - currentPeriod, - previousPeriod, - anomalyTimeseries, - mlJobId, - } = latencyChartsData; + const { currentPeriod, previousPeriod, anomalyTimeseries, mlJobId } = + latencyChartsData; const { alerts } = useApmServiceContext(); diff --git a/x-pack/plugins/apm/public/components/shared/charts/latency_chart/latency_chart.stories.tsx b/x-pack/plugins/apm/public/components/shared/charts/latency_chart/latency_chart.stories.tsx index 5afc853beb311..511b605e3c22c 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/latency_chart/latency_chart.stories.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/latency_chart/latency_chart.stories.tsx @@ -61,7 +61,7 @@ export default { const { alertsResponse, latencyChartResponse } = args as Args; const serviceName = 'testService'; - const apmPluginContextMock = ({ + const apmPluginContextMock = { core: { notifications: { toasts: { addWarning: () => {}, addDanger: () => {} }, @@ -81,7 +81,7 @@ export default { }, plugins: { observability: { isAlertingExperienceEnabled: () => true } }, observabilityRuleTypeRegistry: { getFormatter: () => undefined }, - } as unknown) as ApmPluginContextValue; + } as unknown as ApmPluginContextValue; createCallApmApi(apmPluginContextMock.core); diff --git a/x-pack/plugins/apm/public/components/shared/charts/transaction_breakdown_chart/use_transaction_breakdown.ts b/x-pack/plugins/apm/public/components/shared/charts/transaction_breakdown_chart/use_transaction_breakdown.ts index 789461379d044..e814459fbf519 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/transaction_breakdown_chart/use_transaction_breakdown.ts +++ b/x-pack/plugins/apm/public/components/shared/charts/transaction_breakdown_chart/use_transaction_breakdown.ts @@ -30,7 +30,11 @@ export function useTransactionBreakdown({ const { transactionType, serviceName } = useApmServiceContext(); - const { data = { timeseries: undefined }, error, status } = useFetcher( + const { + data = { timeseries: undefined }, + error, + status, + } = useFetcher( (callApmApi) => { if (serviceName && start && end && transactionType) { return callApmApi({ diff --git a/x-pack/plugins/apm/public/components/shared/charts/transaction_charts/helper.test.ts b/x-pack/plugins/apm/public/components/shared/charts/transaction_charts/helper.test.ts index 3c65cce50d167..20d0388b0f331 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/transaction_charts/helper.test.ts +++ b/x-pack/plugins/apm/public/components/shared/charts/transaction_charts/helper.test.ts @@ -36,14 +36,14 @@ describe('transaction chart helper', () => { }); it('returns zero for invalid y coordinate', () => { - const timeSeries = ([ + const timeSeries = [ { data: [{ x: 1 }, { x: 2 }, { x: 3, y: -1 }] }, - ] as unknown) as Array>; + ] as unknown as Array>; expect(getMaxY(timeSeries)).toEqual(0); }); it('returns the max y coordinate', () => { - const timeSeries = ([ + const timeSeries = [ { data: [ { x: 1, y: 10 }, @@ -51,7 +51,7 @@ describe('transaction chart helper', () => { { x: 3, y: 1 }, ], }, - ] as unknown) as Array>; + ] as unknown as Array>; expect(getMaxY(timeSeries)).toEqual(10); }); }); diff --git a/x-pack/plugins/apm/public/components/shared/charts/transaction_error_rate_chart/index.tsx b/x-pack/plugins/apm/public/components/shared/charts/transaction_error_rate_chart/index.tsx index ae24a5e53444e..88788c7c3d39f 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/transaction_error_rate_chart/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/transaction_error_rate_chart/index.tsx @@ -35,7 +35,8 @@ interface Props { environment: string; } -type ErrorRate = APIReturnType<'GET /api/apm/services/{serviceName}/transactions/charts/error_rate'>; +type ErrorRate = + APIReturnType<'GET /api/apm/services/{serviceName}/transactions/charts/error_rate'>; const INITIAL_STATE: ErrorRate = { currentPeriod: { diff --git a/x-pack/plugins/apm/public/components/shared/kuery_bar/Typeahead/index.js b/x-pack/plugins/apm/public/components/shared/kuery_bar/Typeahead/index.js index f441497209c3a..f8f51679a5192 100644 --- a/x-pack/plugins/apm/public/components/shared/kuery_bar/Typeahead/index.js +++ b/x-pack/plugins/apm/public/components/shared/kuery_bar/Typeahead/index.js @@ -157,13 +157,8 @@ export class Typeahead extends Component { }; render() { - const { - disabled, - isLoading, - placeholder, - prepend, - suggestions, - } = this.props; + const { disabled, isLoading, placeholder, prepend, suggestions } = + this.props; return ( {} } } }, -} as unknown) as ApmPluginContextValue; +} as unknown as ApmPluginContextValue; export default { title: 'shared/LicensePrompt', @@ -36,6 +36,5 @@ export function Example({ } Example.args = { showBetaBadge: false, - text: - 'To create Feature name, you must be subscribed to an Elastic X license or above.', + text: 'To create Feature name, you must be subscribed to an Elastic X license or above.', } as ComponentProps; diff --git a/x-pack/plugins/apm/public/components/shared/managed_table/index.tsx b/x-pack/plugins/apm/public/components/shared/managed_table/index.tsx index 54f0aebbe818c..f1776abe83e97 100644 --- a/x-pack/plugins/apm/public/components/shared/managed_table/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/managed_table/index.tsx @@ -149,7 +149,7 @@ function UnoptimizedManagedTable(props: Props) { } noItemsMessage={showNoItemsMessage} items={renderedItems} - columns={(columns as unknown) as Array>} // EuiBasicTableColumn is stricter than ITableColumn + columns={columns as unknown as Array>} // EuiBasicTableColumn is stricter than ITableColumn sorting={sort} onChange={onTableChange} {...(paginationProps ? { pagination: paginationProps } : {})} diff --git a/x-pack/plugins/apm/public/components/shared/service_icons/cloud_details.tsx b/x-pack/plugins/apm/public/components/shared/service_icons/cloud_details.tsx index 2e8fcfa1df672..2c706fa863a93 100644 --- a/x-pack/plugins/apm/public/components/shared/service_icons/cloud_details.tsx +++ b/x-pack/plugins/apm/public/components/shared/service_icons/cloud_details.tsx @@ -11,7 +11,8 @@ import { i18n } from '@kbn/i18n'; import React from 'react'; import { APIReturnType } from '../../../services/rest/createCallApmApi'; -type ServiceDetailsReturnType = APIReturnType<'GET /api/apm/services/{serviceName}/metadata/details'>; +type ServiceDetailsReturnType = + APIReturnType<'GET /api/apm/services/{serviceName}/metadata/details'>; interface Props { cloud: ServiceDetailsReturnType['cloud']; diff --git a/x-pack/plugins/apm/public/components/shared/service_icons/container_details.tsx b/x-pack/plugins/apm/public/components/shared/service_icons/container_details.tsx index b590a67409d9e..75f7c23a78085 100644 --- a/x-pack/plugins/apm/public/components/shared/service_icons/container_details.tsx +++ b/x-pack/plugins/apm/public/components/shared/service_icons/container_details.tsx @@ -12,7 +12,8 @@ import React from 'react'; import { asInteger } from '../../../../common/utils/formatters'; import { APIReturnType } from '../../../services/rest/createCallApmApi'; -type ServiceDetailsReturnType = APIReturnType<'GET /api/apm/services/{serviceName}/metadata/details'>; +type ServiceDetailsReturnType = + APIReturnType<'GET /api/apm/services/{serviceName}/metadata/details'>; interface Props { container: ServiceDetailsReturnType['container']; diff --git a/x-pack/plugins/apm/public/components/shared/service_icons/index.test.tsx b/x-pack/plugins/apm/public/components/shared/service_icons/index.test.tsx index d00a8df6fb0a3..bd90cae0277af 100644 --- a/x-pack/plugins/apm/public/components/shared/service_icons/index.test.tsx +++ b/x-pack/plugins/apm/public/components/shared/service_icons/index.test.tsx @@ -29,9 +29,9 @@ const addWarning = jest.fn(); const httpGet = jest.fn(); function Wrapper({ children }: { children?: ReactNode }) { - const mockPluginContext = (merge({}, mockApmPluginContextValue, { + const mockPluginContext = merge({}, mockApmPluginContextValue, { core: { http: { get: httpGet }, notifications: { toasts: { addWarning } } }, - }) as unknown) as ApmPluginContextValue; + }) as unknown as ApmPluginContextValue; return ( @@ -179,13 +179,11 @@ describe('ServiceIcons', () => { }); describe('details', () => { - const callApmApi = (apisMockData: Record) => ({ - endpoint, - }: { - endpoint: string; - }) => { - return apisMockData[endpoint]; - }; + const callApmApi = + (apisMockData: Record) => + ({ endpoint }: { endpoint: string }) => { + return apisMockData[endpoint]; + }; it('Shows loading spinner while fetching data', () => { const apisMockData = { 'GET /api/apm/services/{serviceName}/metadata/icons': { diff --git a/x-pack/plugins/apm/public/components/shared/service_icons/index.tsx b/x-pack/plugins/apm/public/components/shared/service_icons/index.tsx index 82de85341c471..780c3b0222f13 100644 --- a/x-pack/plugins/apm/public/components/shared/service_icons/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/service_icons/index.tsx @@ -62,10 +62,8 @@ interface PopoverItem { } export function ServiceIcons({ start, end, serviceName }: Props) { - const [ - selectedIconPopover, - setSelectedIconPopover, - ] = useState(); + const [selectedIconPopover, setSelectedIconPopover] = + useState(); const theme = useTheme(); diff --git a/x-pack/plugins/apm/public/components/shared/service_icons/service_details.tsx b/x-pack/plugins/apm/public/components/shared/service_icons/service_details.tsx index 1828465fff450..daf253f6bc0a9 100644 --- a/x-pack/plugins/apm/public/components/shared/service_icons/service_details.tsx +++ b/x-pack/plugins/apm/public/components/shared/service_icons/service_details.tsx @@ -11,7 +11,8 @@ import { i18n } from '@kbn/i18n'; import React from 'react'; import { APIReturnType } from '../../../services/rest/createCallApmApi'; -type ServiceDetailsReturnType = APIReturnType<'GET /api/apm/services/{serviceName}/metadata/details'>; +type ServiceDetailsReturnType = + APIReturnType<'GET /api/apm/services/{serviceName}/metadata/details'>; interface Props { service: ServiceDetailsReturnType['service']; diff --git a/x-pack/plugins/apm/public/components/shared/transaction_action_menu/TransactionActionMenu.test.tsx b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/TransactionActionMenu.test.tsx index 0b0d5c8b1b8a2..fa2d3700eaf8c 100644 --- a/x-pack/plugins/apm/public/components/shared/transaction_action_menu/TransactionActionMenu.test.tsx +++ b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/TransactionActionMenu.test.tsx @@ -26,13 +26,13 @@ import { TransactionActionMenu } from './TransactionActionMenu'; import * as Transactions from './__fixtures__/mockData'; function getMockAPMContext({ canSave }: { canSave: boolean }) { - return ({ + return { ...mockApmPluginContextValue, core: { ...mockApmPluginContextValue.core, application: { capabilities: { apm: { save: canSave }, ml: {} } }, }, - } as unknown) as ApmPluginContextValue; + } as unknown as ApmPluginContextValue; } function Wrapper({ children }: { children?: React.ReactNode }) { @@ -374,10 +374,9 @@ describe('TransactionActionMenu component', () => { expectTextsInDocument(component, ['Create link']); const getFilterKeyValue = (key: string) => { return { - [(component.getAllByText(key)[0] as HTMLOptionElement) - .text]: (component.getAllByTestId( - `${key}.value` - )[0] as HTMLInputElement).value, + [(component.getAllByText(key)[0] as HTMLOptionElement).text]: ( + component.getAllByTestId(`${key}.value`)[0] as HTMLInputElement + ).value, }; }; expect(getFilterKeyValue('service.name')).toEqual({ diff --git a/x-pack/plugins/apm/public/components/shared/transaction_action_menu/custom_link_menu_section/CustomLinkToolbar.test.tsx b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/custom_link_menu_section/CustomLinkToolbar.test.tsx index 89924343df9e7..ecef563e72948 100644 --- a/x-pack/plugins/apm/public/components/shared/transaction_action_menu/custom_link_menu_section/CustomLinkToolbar.test.tsx +++ b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/custom_link_menu_section/CustomLinkToolbar.test.tsx @@ -20,13 +20,13 @@ import { import { CustomLinkToolbar } from './CustomLinkToolbar'; function getMockAPMContext({ canSave }: { canSave: boolean }) { - return ({ + return { ...mockApmPluginContextValue, core: { ...mockApmPluginContextValue.core, application: { capabilities: { apm: { save: canSave }, ml: {} } }, }, - } as unknown) as ApmPluginContextValue; + } as unknown as ApmPluginContextValue; } function Wrapper({ children }: { children?: ReactNode }) { diff --git a/x-pack/plugins/apm/public/components/shared/transaction_action_menu/custom_link_menu_section/custom_link_list.test.tsx b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/custom_link_menu_section/custom_link_list.test.tsx index e063fb36b8e9c..9c1e852223894 100644 --- a/x-pack/plugins/apm/public/components/shared/transaction_action_menu/custom_link_menu_section/custom_link_list.test.tsx +++ b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/custom_link_menu_section/custom_link_list.test.tsx @@ -24,9 +24,9 @@ describe('CustomLinkList', () => { url: 'http://elastic.co?service.name={{service.name}}', }, ] as CustomLink[]; - const transaction = ({ + const transaction = { service: { name: 'foo.bar' }, - } as unknown) as Transaction; + } as unknown as Transaction; it('shows links', () => { const component = render( diff --git a/x-pack/plugins/apm/public/components/shared/transaction_action_menu/custom_link_menu_section/index.test.tsx b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/custom_link_menu_section/index.test.tsx index a624c220a0e4c..a9a57d2247c6c 100644 --- a/x-pack/plugins/apm/public/components/shared/transaction_action_menu/custom_link_menu_section/index.test.tsx +++ b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/custom_link_menu_section/index.test.tsx @@ -25,7 +25,7 @@ function Wrapper({ children }: { children?: ReactNode }) { ); } -const transaction = ({ +const transaction = { service: { name: 'name', environment: 'env', @@ -34,7 +34,7 @@ const transaction = ({ name: 'tx name', type: 'tx type', }, -} as unknown) as Transaction; +} as unknown as Transaction; describe('Custom links', () => { it('shows empty message when no custom link is available', () => { diff --git a/x-pack/plugins/apm/public/components/shared/transaction_action_menu/sections.test.ts b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/sections.test.ts index c2cfeb0461341..bcb52f4721dd5 100644 --- a/x-pack/plugins/apm/public/components/shared/transaction_action_menu/sections.test.ts +++ b/x-pack/plugins/apm/public/components/shared/transaction_action_menu/sections.test.ts @@ -11,11 +11,11 @@ import { Transaction } from '../../../../typings/es_schemas/ui/transaction'; import { getSections } from './sections'; describe('Transaction action menu', () => { - const basePath = ({ + const basePath = { prepend: (url: string) => { return `some-basepath${url}`; }, - } as unknown) as IBasePath; + } as unknown as IBasePath; const date = '2020-02-06T11:00:00.000Z'; const timestamp = { us: new Date(date).getTime() }; @@ -26,18 +26,18 @@ describe('Transaction action menu', () => { refreshInterval: 0, }; - const location = ({ + const location = { search: '?rangeFrom=now-24h&rangeTo=now&refreshPaused=true&refreshInterval=0', - } as unknown) as Location; + } as unknown as Location; it('shows required sections only', () => { - const transaction = ({ + const transaction = { timestamp, trace: { id: '123' }, transaction: { id: '123' }, '@timestamp': date, - } as unknown) as Transaction; + } as unknown as Transaction; expect( getSections({ transaction, @@ -55,8 +55,7 @@ describe('Transaction action menu', () => { { key: 'traceLogs', label: 'Trace logs', - href: - 'some-basepath/app/logs/link-to/logs?time=1580986800&filter=trace.id:%22123%22%20OR%20%22123%22', + href: 'some-basepath/app/logs/link-to/logs?time=1580986800&filter=trace.id:%22123%22%20OR%20%22123%22', condition: true, }, ], @@ -69,8 +68,7 @@ describe('Transaction action menu', () => { { key: 'sampleDocument', label: 'View sample document', - href: - 'some-basepath/app/discover#/?_g=(refreshInterval:(pause:!t,value:0),time:(from:now-24h,to:now))&_a=(index:apm_static_index_pattern_id,interval:auto,query:(language:kuery,query:\'processor.event:"transaction" AND transaction.id:"123" AND trace.id:"123"\'))', + href: 'some-basepath/app/discover#/?_g=(refreshInterval:(pause:!t,value:0),time:(from:now-24h,to:now))&_a=(index:apm_static_index_pattern_id,interval:auto,query:(language:kuery,query:\'processor.event:"transaction" AND transaction.id:"123" AND trace.id:"123"\'))', condition: true, }, ], @@ -80,13 +78,13 @@ describe('Transaction action menu', () => { }); it('shows pod and required sections only', () => { - const transaction = ({ + const transaction = { kubernetes: { pod: { uid: '123' } }, timestamp, trace: { id: '123' }, transaction: { id: '123' }, '@timestamp': date, - } as unknown) as Transaction; + } as unknown as Transaction; expect( getSections({ transaction, @@ -105,15 +103,13 @@ describe('Transaction action menu', () => { { key: 'podLogs', label: 'Pod logs', - href: - 'some-basepath/app/logs/link-to/pod-logs/123?time=1580986800', + href: 'some-basepath/app/logs/link-to/pod-logs/123?time=1580986800', condition: true, }, { key: 'podMetrics', label: 'Pod metrics', - href: - 'some-basepath/app/metrics/link-to/pod-detail/123?from=1580986500000&to=1580987100000', + href: 'some-basepath/app/metrics/link-to/pod-detail/123?from=1580986500000&to=1580987100000', condition: true, }, ], @@ -126,8 +122,7 @@ describe('Transaction action menu', () => { { key: 'traceLogs', label: 'Trace logs', - href: - 'some-basepath/app/logs/link-to/logs?time=1580986800&filter=trace.id:%22123%22%20OR%20%22123%22', + href: 'some-basepath/app/logs/link-to/logs?time=1580986800&filter=trace.id:%22123%22%20OR%20%22123%22', condition: true, }, ], @@ -140,8 +135,7 @@ describe('Transaction action menu', () => { { key: 'sampleDocument', label: 'View sample document', - href: - 'some-basepath/app/discover#/?_g=(refreshInterval:(pause:!t,value:0),time:(from:now-24h,to:now))&_a=(index:apm_static_index_pattern_id,interval:auto,query:(language:kuery,query:\'processor.event:"transaction" AND transaction.id:"123" AND trace.id:"123"\'))', + href: 'some-basepath/app/discover#/?_g=(refreshInterval:(pause:!t,value:0),time:(from:now-24h,to:now))&_a=(index:apm_static_index_pattern_id,interval:auto,query:(language:kuery,query:\'processor.event:"transaction" AND transaction.id:"123" AND trace.id:"123"\'))', condition: true, }, ], @@ -151,13 +145,13 @@ describe('Transaction action menu', () => { }); it('shows host and required sections only', () => { - const transaction = ({ + const transaction = { host: { hostname: 'foo' }, timestamp, trace: { id: '123' }, transaction: { id: '123' }, '@timestamp': date, - } as unknown) as Transaction; + } as unknown as Transaction; expect( getSections({ transaction, @@ -175,15 +169,13 @@ describe('Transaction action menu', () => { { key: 'hostLogs', label: 'Host logs', - href: - 'some-basepath/app/logs/link-to/host-logs/foo?time=1580986800', + href: 'some-basepath/app/logs/link-to/host-logs/foo?time=1580986800', condition: true, }, { key: 'hostMetrics', label: 'Host metrics', - href: - 'some-basepath/app/metrics/link-to/host-detail/foo?from=1580986500000&to=1580987100000', + href: 'some-basepath/app/metrics/link-to/host-detail/foo?from=1580986500000&to=1580987100000', condition: true, }, ], @@ -196,8 +188,7 @@ describe('Transaction action menu', () => { { key: 'traceLogs', label: 'Trace logs', - href: - 'some-basepath/app/logs/link-to/logs?time=1580986800&filter=trace.id:%22123%22%20OR%20%22123%22', + href: 'some-basepath/app/logs/link-to/logs?time=1580986800&filter=trace.id:%22123%22%20OR%20%22123%22', condition: true, }, ], @@ -210,8 +201,7 @@ describe('Transaction action menu', () => { { key: 'sampleDocument', label: 'View sample document', - href: - 'some-basepath/app/discover#/?_g=(refreshInterval:(pause:!t,value:0),time:(from:now-24h,to:now))&_a=(index:apm_static_index_pattern_id,interval:auto,query:(language:kuery,query:\'processor.event:"transaction" AND transaction.id:"123" AND trace.id:"123"\'))', + href: 'some-basepath/app/discover#/?_g=(refreshInterval:(pause:!t,value:0),time:(from:now-24h,to:now))&_a=(index:apm_static_index_pattern_id,interval:auto,query:(language:kuery,query:\'processor.event:"transaction" AND transaction.id:"123" AND trace.id:"123"\'))', condition: true, }, ], diff --git a/x-pack/plugins/apm/public/components/shared/transactions_table/get_columns.tsx b/x-pack/plugins/apm/public/components/shared/transactions_table/get_columns.tsx index 24ad61f80b028..b11a2994f1caa 100644 --- a/x-pack/plugins/apm/public/components/shared/transactions_table/get_columns.tsx +++ b/x-pack/plugins/apm/public/components/shared/transactions_table/get_columns.tsx @@ -27,12 +27,14 @@ import { ListMetric } from '../list_metric'; import { TruncateWithTooltip } from '../truncate_with_tooltip'; import { getLatencyColumnLabel } from './get_latency_column_label'; -type TransactionGroupMainStatistics = APIReturnType<'GET /api/apm/services/{serviceName}/transactions/groups/main_statistics'>; +type TransactionGroupMainStatistics = + APIReturnType<'GET /api/apm/services/{serviceName}/transactions/groups/main_statistics'>; type ServiceTransactionGroupItem = ValuesType< TransactionGroupMainStatistics['transactionGroups'] >; -type TransactionGroupDetailedStatistics = APIReturnType<'GET /api/apm/services/{serviceName}/transactions/groups/detailed_statistics'>; +type TransactionGroupDetailedStatistics = + APIReturnType<'GET /api/apm/services/{serviceName}/transactions/groups/detailed_statistics'>; export function getColumns({ serviceName, diff --git a/x-pack/plugins/apm/public/components/shared/transactions_table/index.tsx b/x-pack/plugins/apm/public/components/shared/transactions_table/index.tsx index 60612b581e1d4..6f91684de0ee5 100644 --- a/x-pack/plugins/apm/public/components/shared/transactions_table/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/transactions_table/index.tsx @@ -29,7 +29,8 @@ import { getColumns } from './get_columns'; import { ElasticDocsLink } from '../Links/ElasticDocsLink'; import { useBreakpoints } from '../../../hooks/use_breakpoints'; -type ApiResponse = APIReturnType<'GET /api/apm/services/{serviceName}/transactions/groups/main_statistics'>; +type ApiResponse = + APIReturnType<'GET /api/apm/services/{serviceName}/transactions/groups/main_statistics'>; interface InitialState { requestId: string; diff --git a/x-pack/plugins/apm/public/context/apm_service/use_service_agent_fetcher.ts b/x-pack/plugins/apm/public/context/apm_service/use_service_agent_fetcher.ts index 3723fcaba2a4f..e30fd962e5a92 100644 --- a/x-pack/plugins/apm/public/context/apm_service/use_service_agent_fetcher.ts +++ b/x-pack/plugins/apm/public/context/apm_service/use_service_agent_fetcher.ts @@ -21,7 +21,11 @@ export function useServiceAgentFetcher({ start: string; end: string; }) { - const { data = INITIAL_STATE, error, status } = useFetcher( + const { + data = INITIAL_STATE, + error, + status, + } = useFetcher( (callApmApi) => { if (serviceName) { return callApmApi({ diff --git a/x-pack/plugins/apm/public/context/url_params_context/url_params_context.test.tsx b/x-pack/plugins/apm/public/context/url_params_context/url_params_context.test.tsx index 1d5c43f7e005a..be4b8f046ac76 100644 --- a/x-pack/plugins/apm/public/context/url_params_context/url_params_context.test.tsx +++ b/x-pack/plugins/apm/public/context/url_params_context/url_params_context.test.tsx @@ -100,12 +100,12 @@ describe('UrlParamsContext', () => { it('should refresh the time range with new values', async () => { const calls = []; - const history = ({ + const history = { location: { pathname: '/test', }, listen: jest.fn(), - } as unknown) as History; + } as unknown as History; const wrapper = mount( @@ -151,12 +151,12 @@ describe('UrlParamsContext', () => { }); it('should refresh the time range with new values if time range is relative', async () => { - const history = ({ + const history = { location: { pathname: '/test', }, listen: jest.fn(), - } as unknown) as History; + } as unknown as History; jest .spyOn(Date, 'now') diff --git a/x-pack/plugins/apm/public/context/url_params_context/url_params_context.tsx b/x-pack/plugins/apm/public/context/url_params_context/url_params_context.tsx index 7a71f8b78d28a..e7a5e072ff80b 100644 --- a/x-pack/plugins/apm/public/context/url_params_context/url_params_context.tsx +++ b/x-pack/plugins/apm/public/context/url_params_context/url_params_context.tsx @@ -55,14 +55,8 @@ const UrlParamsProvider: React.ComponentClass<{}> = withRouter( ({ location, children }) => { const refUrlParams = useRef(resolveUrlParams(location, {})); - const { - start, - end, - rangeFrom, - rangeTo, - exactStart, - exactEnd, - } = refUrlParams.current; + const { start, end, rangeFrom, rangeTo, exactStart, exactEnd } = + refUrlParams.current; // Counter to force an update in useFetcher when the refresh button is clicked. const [rangeId, setRangeId] = useState(0); diff --git a/x-pack/plugins/apm/public/hooks/use_apm_router.ts b/x-pack/plugins/apm/public/hooks/use_apm_router.ts index c0ccc37cc897d..9b2adfbd1c987 100644 --- a/x-pack/plugins/apm/public/hooks/use_apm_router.ts +++ b/x-pack/plugins/apm/public/hooks/use_apm_router.ts @@ -19,8 +19,8 @@ export function useApmRouter() { return core.http.basePath.prepend('/app/apm' + router.link(...args)); }; - return ({ + return { ...router, link, - } as unknown) as ApmRouter; + } as unknown as ApmRouter; } diff --git a/x-pack/plugins/apm/public/hooks/use_fetcher.test.tsx b/x-pack/plugins/apm/public/hooks/use_fetcher.test.tsx index 1007caa3155e6..79eed2b27cd66 100644 --- a/x-pack/plugins/apm/public/hooks/use_fetcher.test.tsx +++ b/x-pack/plugins/apm/public/hooks/use_fetcher.test.tsx @@ -13,9 +13,9 @@ import { delay } from '../utils/testHelpers'; import { FetcherResult, useFetcher } from './use_fetcher'; // Wrap the hook with a provider so it can useKibana -const KibanaReactContext = createKibanaReactContext(({ +const KibanaReactContext = createKibanaReactContext({ notifications: { toasts: { add: () => {}, danger: () => {} } }, -} as unknown) as Partial); +} as unknown as Partial); interface WrapperProps { children?: ReactNode; diff --git a/x-pack/plugins/apm/public/hooks/use_search_strategy.ts b/x-pack/plugins/apm/public/hooks/use_search_strategy.ts index c01196e23c6cd..32fc31ad80fe4 100644 --- a/x-pack/plugins/apm/public/hooks/use_search_strategy.ts +++ b/x-pack/plugins/apm/public/hooks/use_search_strategy.ts @@ -59,10 +59,12 @@ const getInitialProgress = (): SearchStrategyProgress => ({ total: 100, }); -const getReducer = () => (prev: T, update: Partial): T => ({ - ...prev, - ...update, -}); +const getReducer = + () => + (prev: T, update: Partial): T => ({ + ...prev, + ...update, + }); interface SearchStrategyReturnBase { progress: SearchStrategyProgress; @@ -166,7 +168,7 @@ export function useSearchStrategy< } else if (isErrorResponse(response)) { searchSubscription$.current?.unsubscribe(); setFetchState({ - error: (response as unknown) as Error, + error: response as unknown as Error, isRunning: false, }); } diff --git a/x-pack/plugins/apm/public/hooks/use_service_metric_charts_fetcher.ts b/x-pack/plugins/apm/public/hooks/use_service_metric_charts_fetcher.ts index 28e8a4e0396aa..82338d45a4133 100644 --- a/x-pack/plugins/apm/public/hooks/use_service_metric_charts_fetcher.ts +++ b/x-pack/plugins/apm/public/hooks/use_service_metric_charts_fetcher.ts @@ -32,7 +32,11 @@ export function useServiceMetricChartsFetcher({ const { start, end } = useTimeRange({ rangeFrom, rangeTo }); const { agentName, serviceName } = useApmServiceContext(); - const { data = INITIAL_DATA, error, status } = useFetcher( + const { + data = INITIAL_DATA, + error, + status, + } = useFetcher( (callApmApi) => { if (serviceName && start && end && agentName) { return callApmApi({ diff --git a/x-pack/plugins/apm/public/hooks/use_transaction_trace_samples_fetcher.ts b/x-pack/plugins/apm/public/hooks/use_transaction_trace_samples_fetcher.ts index f7a6e6c3a80ad..5279c7ce143fc 100644 --- a/x-pack/plugins/apm/public/hooks/use_transaction_trace_samples_fetcher.ts +++ b/x-pack/plugins/apm/public/hooks/use_transaction_trace_samples_fetcher.ts @@ -42,7 +42,11 @@ export function useTransactionTraceSamplesFetcher({ urlParams: { transactionId, traceId, sampleRangeFrom, sampleRangeTo }, } = useUrlParams(); - const { data = INITIAL_DATA, status, error } = useFetcher( + const { + data = INITIAL_DATA, + status, + error, + } = useFetcher( async (callApmApi) => { if (serviceName && start && end && transactionType && transactionName) { const response = await callApmApi({ diff --git a/x-pack/plugins/apm/public/selectors/latency_chart_selectors.ts b/x-pack/plugins/apm/public/selectors/latency_chart_selectors.ts index a84a4abfe5810..1fb4eb51dd770 100644 --- a/x-pack/plugins/apm/public/selectors/latency_chart_selectors.ts +++ b/x-pack/plugins/apm/public/selectors/latency_chart_selectors.ts @@ -13,7 +13,8 @@ import { asDuration } from '../../common/utils/formatters'; import { APMChartSpec, Coordinate } from '../../typings/timeseries'; import { APIReturnType } from '../services/rest/createCallApmApi'; -export type LatencyChartsResponse = APIReturnType<'GET /api/apm/services/{serviceName}/transactions/charts/latency'>; +export type LatencyChartsResponse = + APIReturnType<'GET /api/apm/services/{serviceName}/transactions/charts/latency'>; export interface LatencyChartData { currentPeriod?: APMChartSpec; diff --git a/x-pack/plugins/apm/public/services/callApi.test.ts b/x-pack/plugins/apm/public/services/callApi.test.ts index 5f0be1b6fadbb..82be0bbf5dfcf 100644 --- a/x-pack/plugins/apm/public/services/callApi.test.ts +++ b/x-pack/plugins/apm/public/services/callApi.test.ts @@ -19,14 +19,14 @@ describe('callApi', () => { let core: CoreMock; beforeEach(() => { - core = ({ + core = { http: { get: jest.fn().mockReturnValue({ my_key: 'hello_world', }), }, uiSettings: { get: () => false }, // disable `observability:enableInspectEsQueries` setting - } as unknown) as CoreMock; + } as unknown as CoreMock; }); afterEach(() => { diff --git a/x-pack/plugins/apm/public/services/rest/callApi.ts b/x-pack/plugins/apm/public/services/rest/callApi.ts index f623872303c5b..53ddbed90413a 100644 --- a/x-pack/plugins/apm/public/services/rest/callApi.ts +++ b/x-pack/plugins/apm/public/services/rest/callApi.ts @@ -53,10 +53,11 @@ export async function callApi( return cacheResponse; } - const { pathname, method = 'get', ...options } = fetchOptionsWithDebug( - fetchOptions, - inspectableEsQueriesEnabled - ); + const { + pathname, + method = 'get', + ...options + } = fetchOptionsWithDebug(fetchOptions, inspectableEsQueriesEnabled); const lowercaseMethod = method.toLowerCase() as | 'get' diff --git a/x-pack/plugins/apm/public/services/rest/callApmApiSpy.ts b/x-pack/plugins/apm/public/services/rest/callApmApiSpy.ts index ba9f740e06d0d..d6ffd330f08bd 100644 --- a/x-pack/plugins/apm/public/services/rest/callApmApiSpy.ts +++ b/x-pack/plugins/apm/public/services/rest/callApmApiSpy.ts @@ -16,9 +16,9 @@ export type CallApmApiSpy = jest.SpyInstance< export type CreateCallApmApiSpy = jest.SpyInstance; export const getCreateCallApmApiSpy = () => - (jest.spyOn( + jest.spyOn( createCallApmApi, 'createCallApmApi' - ) as unknown) as CreateCallApmApiSpy; + ) as unknown as CreateCallApmApiSpy; export const getCallApmApiSpy = () => - (jest.spyOn(createCallApmApi, 'callApmApi') as unknown) as CallApmApiSpy; + jest.spyOn(createCallApmApi, 'callApmApi') as unknown as CallApmApiSpy; diff --git a/x-pack/plugins/apm/public/services/rest/createCallApmApi.ts b/x-pack/plugins/apm/public/services/rest/createCallApmApi.ts index 40713f93d3ee5..0dda1fc56dd27 100644 --- a/x-pack/plugins/apm/public/services/rest/createCallApmApi.ts +++ b/x-pack/plugins/apm/public/services/rest/createCallApmApi.ts @@ -54,9 +54,8 @@ export type APIReturnType = ReturnOf< _inspect?: InspectResponse; }; -export type APIClientRequestParamsOf< - TEndpoint extends APIEndpoint -> = ClientRequestParamsOf; +export type APIClientRequestParamsOf = + ClientRequestParamsOf; export type AbstractAPMRepository = ServerRouteRepository< APMRouteHandlerResources, @@ -81,7 +80,7 @@ export let callApmApi: APMClient = () => { export function createCallApmApi(core: CoreStart | CoreSetup) { callApmApi = ((options) => { const { endpoint, ...opts } = options; - const { params } = (options as unknown) as { + const { params } = options as unknown as { params?: Partial>; }; diff --git a/x-pack/plugins/apm/public/tutorial/config_agent/config_agent.stories.tsx b/x-pack/plugins/apm/public/tutorial/config_agent/config_agent.stories.tsx index 5ac5fa4d1071e..166839390bc22 100644 --- a/x-pack/plugins/apm/public/tutorial/config_agent/config_agent.stories.tsx +++ b/x-pack/plugins/apm/public/tutorial/config_agent/config_agent.stories.tsx @@ -51,7 +51,7 @@ function Wrapper({ hasCloudPolicyWithApmIntegration, isFleetEnabled, }: Args) { - const http = ({ + const http = { get: () => ({ fleetAgents: [ ...(hasFleetPoliciesWithApmIntegration ? fleetAgents : []), @@ -65,7 +65,7 @@ function Wrapper({ secretToken: 'foo', }, }), - } as unknown) as HttpStart; + } as unknown as HttpStart; return ( { { { { { { fleetAgents, isFleetEnabled: true, }), - } as unknown) as HttpStart + } as unknown as HttpStart } basePath="http://localhost:5601" isCloudEnabled @@ -224,7 +224,7 @@ describe('TutorialConfigAgent', () => { { fleetAgents: [...fleetAgents, policyElasticAgentOnCloudAgent], isFleetEnabled: true, }), - } as unknown) as HttpStart + } as unknown as HttpStart } basePath="http://localhost:5601" isCloudEnabled @@ -263,11 +263,11 @@ describe('TutorialConfigAgent', () => { { throw new Error('Boom'); }, - } as unknown) as HttpStart + } as unknown as HttpStart } basePath="http://localhost:5601" isCloudEnabled @@ -296,13 +296,13 @@ describe('TutorialConfigAgent', () => { { { { fleetAgents: [], isFleetEnabled: false, }), - } as unknown) as HttpStart + } as unknown as HttpStart } basePath="http://localhost:5601" isCloudEnabled diff --git a/x-pack/plugins/apm/public/tutorial/tutorial_fleet_instructions/tutorial_fleet_instructions.stories.tsx b/x-pack/plugins/apm/public/tutorial/tutorial_fleet_instructions/tutorial_fleet_instructions.stories.tsx index 40b72f06654ff..d826ca81416ec 100644 --- a/x-pack/plugins/apm/public/tutorial/tutorial_fleet_instructions/tutorial_fleet_instructions.stories.tsx +++ b/x-pack/plugins/apm/public/tutorial/tutorial_fleet_instructions/tutorial_fleet_instructions.stories.tsx @@ -15,9 +15,9 @@ interface Args { } function Wrapper({ hasFleetPoliciesWithApmIntegration }: Args) { - const http = ({ + const http = { get: () => ({ hasData: hasFleetPoliciesWithApmIntegration }), - } as unknown) as HttpStart; + } as unknown as HttpStart; return ( , @@ -50,7 +50,7 @@ export function getEsClient({ // @ts-expect-error client.search = search; - return (client as unknown) as Omit & { + return client as unknown as Omit & { search: typeof search; }; } diff --git a/x-pack/plugins/apm/scripts/upload-telemetry-data/index.ts b/x-pack/plugins/apm/scripts/upload-telemetry-data/index.ts index 25554eeeaf81d..0dab75cfba9c7 100644 --- a/x-pack/plugins/apm/scripts/upload-telemetry-data/index.ts +++ b/x-pack/plugins/apm/scripts/upload-telemetry-data/index.ts @@ -76,7 +76,7 @@ async function uploadData() { const sampleDocuments = await generateSampleDocuments({ collectTelemetryParams: { - logger: (console as unknown) as Logger, + logger: console as unknown as Logger, indices: { ...config, apmCustomLinkIndex: '.apm-custom-links', diff --git a/x-pack/plugins/apm/server/lib/alerts/alerting_es_client.ts b/x-pack/plugins/apm/server/lib/alerts/alerting_es_client.ts index 8b4d3e2186c84..9445a0f0610f6 100644 --- a/x-pack/plugins/apm/server/lib/alerts/alerting_es_client.ts +++ b/x-pack/plugins/apm/server/lib/alerts/alerting_es_client.ts @@ -27,5 +27,5 @@ export async function alertingEsClient({ ignore_unavailable: true, }); - return (response.body as unknown) as ESSearchResponse; + return response.body as unknown as ESSearchResponse; } diff --git a/x-pack/plugins/apm/server/lib/alerts/chart_preview/get_transaction_duration.ts b/x-pack/plugins/apm/server/lib/alerts/chart_preview/get_transaction_duration.ts index 8e3a44d780630..b18d3ac25a930 100644 --- a/x-pack/plugins/apm/server/lib/alerts/chart_preview/get_transaction_duration.ts +++ b/x-pack/plugins/apm/server/lib/alerts/chart_preview/get_transaction_duration.ts @@ -58,9 +58,10 @@ export async function getTransactionDurationChartPreview({ }, }; - const transactionDurationField = getTransactionDurationFieldForAggregatedTransactions( - searchAggregatedTransactions - ); + const transactionDurationField = + getTransactionDurationFieldForAggregatedTransactions( + searchAggregatedTransactions + ); const aggs = { timeseries: { diff --git a/x-pack/plugins/apm/server/lib/alerts/register_error_count_alert_type.test.ts b/x-pack/plugins/apm/server/lib/alerts/register_error_count_alert_type.test.ts index 5758dea1860b2..2d98c09096f5e 100644 --- a/x-pack/plugins/apm/server/lib/alerts/register_error_count_alert_type.test.ts +++ b/x-pack/plugins/apm/server/lib/alerts/register_error_count_alert_type.test.ts @@ -43,12 +43,8 @@ describe('Error count alert', () => { }); it('sends alerts with service name and environment for those that exceeded the threshold', async () => { - const { - services, - dependencies, - executor, - scheduleActions, - } = createRuleTypeMocks(); + const { services, dependencies, executor, scheduleActions } = + createRuleTypeMocks(); registerErrorCountAlertType(dependencies); diff --git a/x-pack/plugins/apm/server/lib/alerts/register_error_count_alert_type.ts b/x-pack/plugins/apm/server/lib/alerts/register_error_count_alert_type.ts index c78c24fba8673..d1026b0b6ca8b 100644 --- a/x-pack/plugins/apm/server/lib/alerts/register_error_count_alert_type.ts +++ b/x-pack/plugins/apm/server/lib/alerts/register_error_count_alert_type.ts @@ -42,8 +42,10 @@ import { apmActionVariables } from './action_variables'; import { alertingEsClient } from './alerting_es_client'; import { RegisterRuleDependencies } from './register_apm_alerts'; -const ALERT_EVALUATION_THRESHOLD: typeof ALERT_EVALUATION_THRESHOLD_TYPED = ALERT_EVALUATION_THRESHOLD_NON_TYPED; -const ALERT_EVALUATION_VALUE: typeof ALERT_EVALUATION_VALUE_TYPED = ALERT_EVALUATION_VALUE_NON_TYPED; +const ALERT_EVALUATION_THRESHOLD: typeof ALERT_EVALUATION_THRESHOLD_TYPED = + ALERT_EVALUATION_THRESHOLD_NON_TYPED; +const ALERT_EVALUATION_VALUE: typeof ALERT_EVALUATION_VALUE_TYPED = + ALERT_EVALUATION_VALUE_NON_TYPED; const ALERT_REASON: typeof ALERT_REASON_TYPED = ALERT_REASON_NON_TYPED; const paramsSchema = schema.object({ diff --git a/x-pack/plugins/apm/server/lib/alerts/register_transaction_duration_alert_type.test.ts b/x-pack/plugins/apm/server/lib/alerts/register_transaction_duration_alert_type.test.ts index 43abe89a47333..956347098d787 100644 --- a/x-pack/plugins/apm/server/lib/alerts/register_transaction_duration_alert_type.test.ts +++ b/x-pack/plugins/apm/server/lib/alerts/register_transaction_duration_alert_type.test.ts @@ -12,12 +12,8 @@ import { elasticsearchClientMock } from 'src/core/server/elasticsearch/client/mo describe('registerTransactionDurationAlertType', () => { it('sends alert when value is greater than threashold', async () => { - const { - services, - dependencies, - executor, - scheduleActions, - } = createRuleTypeMocks(); + const { services, dependencies, executor, scheduleActions } = + createRuleTypeMocks(); registerTransactionDurationAlertType(dependencies); diff --git a/x-pack/plugins/apm/server/lib/alerts/register_transaction_duration_alert_type.ts b/x-pack/plugins/apm/server/lib/alerts/register_transaction_duration_alert_type.ts index a831f94cd6b65..b383b4777eca4 100644 --- a/x-pack/plugins/apm/server/lib/alerts/register_transaction_duration_alert_type.ts +++ b/x-pack/plugins/apm/server/lib/alerts/register_transaction_duration_alert_type.ts @@ -49,8 +49,10 @@ import { apmActionVariables } from './action_variables'; import { alertingEsClient } from './alerting_es_client'; import { RegisterRuleDependencies } from './register_apm_alerts'; -const ALERT_EVALUATION_THRESHOLD: typeof ALERT_EVALUATION_THRESHOLD_TYPED = ALERT_EVALUATION_THRESHOLD_NON_TYPED; -const ALERT_EVALUATION_VALUE: typeof ALERT_EVALUATION_VALUE_TYPED = ALERT_EVALUATION_VALUE_NON_TYPED; +const ALERT_EVALUATION_THRESHOLD: typeof ALERT_EVALUATION_THRESHOLD_TYPED = + ALERT_EVALUATION_THRESHOLD_NON_TYPED; +const ALERT_EVALUATION_VALUE: typeof ALERT_EVALUATION_VALUE_TYPED = + ALERT_EVALUATION_VALUE_NON_TYPED; const ALERT_REASON: typeof ALERT_REASON_TYPED = ALERT_REASON_NON_TYPED; const paramsSchema = schema.object({ @@ -186,9 +188,8 @@ export function registerTransactionDurationAlertType({ if (transactionDuration && transactionDuration > thresholdMicroseconds) { const durationFormatter = getDurationFormatter(transactionDuration); - const transactionDurationFormatted = durationFormatter( - transactionDuration - ).formatted; + const transactionDurationFormatted = + durationFormatter(transactionDuration).formatted; services .alertWithLifecycle({ diff --git a/x-pack/plugins/apm/server/lib/alerts/register_transaction_duration_anomaly_alert_type.test.ts b/x-pack/plugins/apm/server/lib/alerts/register_transaction_duration_anomaly_alert_type.test.ts index ad1a8fcbf6e55..fa4125c54126d 100644 --- a/x-pack/plugins/apm/server/lib/alerts/register_transaction_duration_anomaly_alert_type.test.ts +++ b/x-pack/plugins/apm/server/lib/alerts/register_transaction_duration_anomaly_alert_type.test.ts @@ -41,10 +41,10 @@ describe('Transaction duration anomaly alert', () => { const { services, dependencies, executor } = createRuleTypeMocks(); - const ml = ({ + const ml = { mlSystemProvider: () => ({ mlAnomalySearch: jest.fn() }), anomalyDetectorsProvider: jest.fn(), - } as unknown) as MlPluginSetup; + } as unknown as MlPluginSetup; registerTransactionDurationAnomalyAlertType({ ...dependencies, @@ -63,7 +63,7 @@ describe('Transaction duration anomaly alert', () => { it('anomaly is less than threshold', async () => { jest.spyOn(GetServiceAnomalies, 'getMLJobs').mockReturnValue( - Promise.resolve(([ + Promise.resolve([ { job_id: '1', custom_settings: { job_tags: { environment: 'development' } }, @@ -72,12 +72,12 @@ describe('Transaction duration anomaly alert', () => { job_id: '2', custom_settings: { job_tags: { environment: 'production' } }, }, - ] as unknown) as Job[]) + ] as unknown as Job[]) ); const { services, dependencies, executor } = createRuleTypeMocks(); - const ml = ({ + const ml = { mlSystemProvider: () => ({ mlAnomalySearch: () => ({ aggregations: { @@ -95,7 +95,7 @@ describe('Transaction duration anomaly alert', () => { }), }), anomalyDetectorsProvider: jest.fn(), - } as unknown) as MlPluginSetup; + } as unknown as MlPluginSetup; registerTransactionDurationAnomalyAlertType({ ...dependencies, @@ -116,7 +116,7 @@ describe('Transaction duration anomaly alert', () => { describe('sends alert', () => { it('for all services that exceeded the threshold', async () => { jest.spyOn(GetServiceAnomalies, 'getMLJobs').mockReturnValue( - Promise.resolve(([ + Promise.resolve([ { job_id: '1', custom_settings: { job_tags: { environment: 'development' } }, @@ -125,17 +125,13 @@ describe('Transaction duration anomaly alert', () => { job_id: '2', custom_settings: { job_tags: { environment: 'production' } }, }, - ] as unknown) as Job[]) + ] as unknown as Job[]) ); - const { - services, - dependencies, - executor, - scheduleActions, - } = createRuleTypeMocks(); + const { services, dependencies, executor, scheduleActions } = + createRuleTypeMocks(); - const ml = ({ + const ml = { mlSystemProvider: () => ({ mlAnomalySearch: () => ({ aggregations: { @@ -175,7 +171,7 @@ describe('Transaction duration anomaly alert', () => { }), }), anomalyDetectorsProvider: jest.fn(), - } as unknown) as MlPluginSetup; + } as unknown as MlPluginSetup; registerTransactionDurationAnomalyAlertType({ ...dependencies, diff --git a/x-pack/plugins/apm/server/lib/alerts/register_transaction_duration_anomaly_alert_type.ts b/x-pack/plugins/apm/server/lib/alerts/register_transaction_duration_anomaly_alert_type.ts index 7d49833c01abf..08203646d9004 100644 --- a/x-pack/plugins/apm/server/lib/alerts/register_transaction_duration_anomaly_alert_type.ts +++ b/x-pack/plugins/apm/server/lib/alerts/register_transaction_duration_anomaly_alert_type.ts @@ -47,8 +47,10 @@ import { getEnvironmentLabel, } from '../../../common/environment_filter_values'; -const ALERT_EVALUATION_THRESHOLD: typeof ALERT_EVALUATION_THRESHOLD_TYPED = ALERT_EVALUATION_THRESHOLD_NON_TYPED; -const ALERT_EVALUATION_VALUE: typeof ALERT_EVALUATION_VALUE_TYPED = ALERT_EVALUATION_VALUE_NON_TYPED; +const ALERT_EVALUATION_THRESHOLD: typeof ALERT_EVALUATION_THRESHOLD_TYPED = + ALERT_EVALUATION_THRESHOLD_NON_TYPED; +const ALERT_EVALUATION_VALUE: typeof ALERT_EVALUATION_VALUE_TYPED = + ALERT_EVALUATION_VALUE_NON_TYPED; const ALERT_SEVERITY: typeof ALERT_SEVERITY_TYPED = ALERT_SEVERITY_NON_TYPED; const ALERT_REASON: typeof ALERT_REASON_TYPED = ALERT_REASON_NON_TYPED; @@ -206,10 +208,8 @@ export function registerTransactionDurationAnomalyAlertType({ }, }; - const response: ESSearchResponse< - unknown, - typeof anomalySearchParams - > = (await mlAnomalySearch(anomalySearchParams, [])) as any; + const response: ESSearchResponse = + (await mlAnomalySearch(anomalySearchParams, [])) as any; const anomalies = response.aggregations?.anomaly_groups.buckets diff --git a/x-pack/plugins/apm/server/lib/alerts/register_transaction_error_rate_alert_type.test.ts b/x-pack/plugins/apm/server/lib/alerts/register_transaction_error_rate_alert_type.test.ts index be5f4705482d0..b0a99377c2989 100644 --- a/x-pack/plugins/apm/server/lib/alerts/register_transaction_error_rate_alert_type.test.ts +++ b/x-pack/plugins/apm/server/lib/alerts/register_transaction_error_rate_alert_type.test.ts @@ -50,12 +50,8 @@ describe('Transaction error rate alert', () => { }); it('sends alerts for services that exceeded the threshold', async () => { - const { - services, - dependencies, - executor, - scheduleActions, - } = createRuleTypeMocks(); + const { services, dependencies, executor, scheduleActions } = + createRuleTypeMocks(); registerTransactionErrorRateAlertType({ ...dependencies, diff --git a/x-pack/plugins/apm/server/lib/alerts/register_transaction_error_rate_alert_type.ts b/x-pack/plugins/apm/server/lib/alerts/register_transaction_error_rate_alert_type.ts index 1671b15143bef..6c59bcc4107b0 100644 --- a/x-pack/plugins/apm/server/lib/alerts/register_transaction_error_rate_alert_type.ts +++ b/x-pack/plugins/apm/server/lib/alerts/register_transaction_error_rate_alert_type.ts @@ -49,8 +49,10 @@ import { SearchAggregatedTransactionSetting } from '../../../common/aggregated_t import { getDocumentTypeFilterForAggregatedTransactions } from '../helpers/aggregated_transactions'; import { asPercent } from '../../../../observability/common/utils/formatters'; -const ALERT_EVALUATION_THRESHOLD: typeof ALERT_EVALUATION_THRESHOLD_TYPED = ALERT_EVALUATION_THRESHOLD_NON_TYPED; -const ALERT_EVALUATION_VALUE: typeof ALERT_EVALUATION_VALUE_TYPED = ALERT_EVALUATION_VALUE_NON_TYPED; +const ALERT_EVALUATION_THRESHOLD: typeof ALERT_EVALUATION_THRESHOLD_TYPED = + ALERT_EVALUATION_THRESHOLD_NON_TYPED; +const ALERT_EVALUATION_VALUE: typeof ALERT_EVALUATION_VALUE_TYPED = + ALERT_EVALUATION_VALUE_NON_TYPED; const ALERT_REASON: typeof ALERT_REASON_TYPED = ALERT_REASON_NON_TYPED; const paramsSchema = schema.object({ @@ -213,12 +215,8 @@ export function registerTransactionErrorRateAlertType({ .filter((result) => result.errorRate >= alertParams.threshold); results.forEach((result) => { - const { - serviceName, - environment, - transactionType, - errorRate, - } = result; + const { serviceName, environment, transactionType, errorRate } = + result; services .alertWithLifecycle({ diff --git a/x-pack/plugins/apm/server/lib/alerts/test_utils/index.ts b/x-pack/plugins/apm/server/lib/alerts/test_utils/index.ts index c78e93815bf85..5d5865bdd2289 100644 --- a/x-pack/plugins/apm/server/lib/alerts/test_utils/index.ts +++ b/x-pack/plugins/apm/server/lib/alerts/test_utils/index.ts @@ -23,11 +23,11 @@ export const createRuleTypeMocks = () => { /* eslint-enable @typescript-eslint/naming-convention */ } as APMConfig); - const loggerMock = ({ + const loggerMock = { debug: jest.fn(), warn: jest.fn(), error: jest.fn(), - } as unknown) as Logger; + } as unknown as Logger; const alerting = { registerType: ({ executor }) => { diff --git a/x-pack/plugins/apm/server/lib/apm_telemetry/collect_data_telemetry/tasks.ts b/x-pack/plugins/apm/server/lib/apm_telemetry/collect_data_telemetry/tasks.ts index fd341565c235b..d624c8527df86 100644 --- a/x-pack/plugins/apm/server/lib/apm_telemetry/collect_data_telemetry/tasks.ts +++ b/x-pack/plugins/apm/server/lib/apm_telemetry/collect_data_telemetry/tasks.ts @@ -1094,10 +1094,9 @@ export const tasks: TelemetryTask[] = [ geo: { country_iso_code: { rum: { - '1d': - rumAgentCardinalityResponse.aggregations?.[ - CLIENT_GEO_COUNTRY_ISO_CODE - ].value, + '1d': rumAgentCardinalityResponse.aggregations?.[ + CLIENT_GEO_COUNTRY_ISO_CODE + ].value, }, }, }, @@ -1105,30 +1104,28 @@ export const tasks: TelemetryTask[] = [ transaction: { name: { all_agents: { - '1d': - allAgentsCardinalityResponse.aggregations?.[TRANSACTION_NAME] - .value, + '1d': allAgentsCardinalityResponse.aggregations?.[ + TRANSACTION_NAME + ].value, }, rum: { - '1d': - rumAgentCardinalityResponse.aggregations?.[TRANSACTION_NAME] - .value, + '1d': rumAgentCardinalityResponse.aggregations?.[ + TRANSACTION_NAME + ].value, }, }, }, user_agent: { original: { all_agents: { - '1d': - allAgentsCardinalityResponse.aggregations?.[ - USER_AGENT_ORIGINAL - ].value, + '1d': allAgentsCardinalityResponse.aggregations?.[ + USER_AGENT_ORIGINAL + ].value, }, rum: { - '1d': - rumAgentCardinalityResponse.aggregations?.[ - USER_AGENT_ORIGINAL - ].value, + '1d': rumAgentCardinalityResponse.aggregations?.[ + USER_AGENT_ORIGINAL + ].value, }, }, }, diff --git a/x-pack/plugins/apm/server/lib/apm_telemetry/schema.ts b/x-pack/plugins/apm/server/lib/apm_telemetry/schema.ts index 80be1ecbe13a5..76c897dec5693 100644 --- a/x-pack/plugins/apm/server/lib/apm_telemetry/schema.ts +++ b/x-pack/plugins/apm/server/lib/apm_telemetry/schema.ts @@ -17,10 +17,11 @@ import { ElasticAgentName } from '../../../typings/es_schemas/ui/fields/agent'; const long: { type: 'long' } = { type: 'long' }; -const aggregatedTransactionCountSchema: MakeSchemaFrom = { - expected_metric_document_count: long, - transaction_count: long, -}; +const aggregatedTransactionCountSchema: MakeSchemaFrom = + { + expected_metric_document_count: long, + transaction_count: long, + }; const timeframeMap1dSchema: MakeSchemaFrom = { '1d': long, diff --git a/x-pack/plugins/apm/server/lib/fleet/get_agents.ts b/x-pack/plugins/apm/server/lib/fleet/get_agents.ts index 5ee44bb3ad174..86a6294e96b09 100644 --- a/x-pack/plugins/apm/server/lib/fleet/get_agents.ts +++ b/x-pack/plugins/apm/server/lib/fleet/get_agents.ts @@ -23,9 +23,8 @@ export async function getFleetAgents({ fleetPluginStart: NonNullable; }) { // @ts-ignore - const savedObjectsClient: SavedObjectsClientContract = await getInternalSavedObjectsClient( - core.setup - ); + const savedObjectsClient: SavedObjectsClientContract = + await getInternalSavedObjectsClient(core.setup); return await fleetPluginStart.agentPolicyService.getByIds( savedObjectsClient, diff --git a/x-pack/plugins/apm/server/lib/fleet/get_apm_package_policies.ts b/x-pack/plugins/apm/server/lib/fleet/get_apm_package_policies.ts index 363ed77d56c4d..5128339368f46 100644 --- a/x-pack/plugins/apm/server/lib/fleet/get_apm_package_policies.ts +++ b/x-pack/plugins/apm/server/lib/fleet/get_apm_package_policies.ts @@ -21,9 +21,8 @@ export async function getApmPackgePolicies({ fleetPluginStart: NonNullable; }) { // @ts-ignore - const savedObjectsClient: SavedObjectsClientContract = await getInternalSavedObjectsClient( - core.setup - ); + const savedObjectsClient: SavedObjectsClientContract = + await getInternalSavedObjectsClient(core.setup); return await fleetPluginStart.packagePolicyService.list(savedObjectsClient, { kuery: 'ingest-package-policies.package.name:apm', }); diff --git a/x-pack/plugins/apm/server/lib/fleet/get_apm_package_policy_definition.ts b/x-pack/plugins/apm/server/lib/fleet/get_apm_package_policy_definition.ts index afe3a95d79023..64b071b67d2bd 100644 --- a/x-pack/plugins/apm/server/lib/fleet/get_apm_package_policy_definition.ts +++ b/x-pack/plugins/apm/server/lib/fleet/get_apm_package_policy_definition.ts @@ -72,20 +72,18 @@ function preprocessLegacyFields({ function getApmPackageInputVars(options: GetApmPackagePolicyDefinitionOptions) { const { apmServerSchema } = options; - const apmServerConfigs = Object.entries( - apmConfigMapping - ).map(([key, { name, type, getValue }]) => ({ key, name, type, getValue })); + const apmServerConfigs = Object.entries(apmConfigMapping).map( + ([key, { name, type, getValue }]) => ({ key, name, type, getValue }) + ); - const inputVars: Record< - string, - { type: string; value: any } - > = apmServerConfigs.reduce((acc, { key, name, type, getValue }) => { - const value = (getValue ? getValue(options) : apmServerSchema[key]) ?? ''; // defaults to an empty string to be edited in Fleet UI - return { - ...acc, - [name]: { type, value }, - }; - }, {}); + const inputVars: Record = + apmServerConfigs.reduce((acc, { key, name, type, getValue }) => { + const value = (getValue ? getValue(options) : apmServerSchema[key]) ?? ''; // defaults to an empty string to be edited in Fleet UI + return { + ...acc, + [name]: { type, value }, + }; + }, {}); return inputVars; } diff --git a/x-pack/plugins/apm/server/lib/fleet/sync_agent_configs_to_apm_package_policies.ts b/x-pack/plugins/apm/server/lib/fleet/sync_agent_configs_to_apm_package_policies.ts index 1365ddc28ddb2..5f3a3f74598a1 100644 --- a/x-pack/plugins/apm/server/lib/fleet/sync_agent_configs_to_apm_package_policies.ts +++ b/x-pack/plugins/apm/server/lib/fleet/sync_agent_configs_to_apm_package_policies.ts @@ -37,18 +37,15 @@ export async function syncAgentConfigsToApmPackagePolicies({ } const coreStart = await core.start(); const esClient = coreStart.elasticsearch.client.asInternalUser; - const [ - savedObjectsClient, - agentConfigurations, - packagePolicies, - ] = await Promise.all([ - getInternalSavedObjectsClient(core.setup), - listConfigurations({ setup }), - getApmPackgePolicies({ - core, - fleetPluginStart, - }), - ]); + const [savedObjectsClient, agentConfigurations, packagePolicies] = + await Promise.all([ + getInternalSavedObjectsClient(core.setup), + listConfigurations({ setup }), + getApmPackgePolicies({ + core, + fleetPluginStart, + }), + ]); return Promise.all( packagePolicies.items.map(async (item) => { @@ -58,7 +55,7 @@ export async function syncAgentConfigsToApmPackagePolicies({ agentConfigurations ); return fleetPluginStart.packagePolicyService.update( - (savedObjectsClient as unknown) as SavedObjectsClientContract, + savedObjectsClient as unknown as SavedObjectsClientContract, esClient, id, updatedPackagePolicy diff --git a/x-pack/plugins/apm/server/lib/helpers/create_es_client/create_apm_event_client/index.test.ts b/x-pack/plugins/apm/server/lib/helpers/create_es_client/create_apm_event_client/index.test.ts index f35ba874cf2b6..8f03aceef3348 100644 --- a/x-pack/plugins/apm/server/lib/helpers/create_es_client/create_apm_event_client/index.test.ts +++ b/x-pack/plugins/apm/server/lib/helpers/create_es_client/create_apm_event_client/index.test.ts @@ -29,7 +29,8 @@ describe('createApmEventClient', () => { }); const { server: innerServer, createRouter } = await server.setup({ context: contextServiceMock.createSetupContract(), - executionContext: executionContextServiceMock.createInternalSetupContract(), + executionContext: + executionContextServiceMock.createInternalSetupContract(), }); const router = createRouter('/'); diff --git a/x-pack/plugins/apm/server/lib/helpers/create_es_client/create_apm_event_client/index.ts b/x-pack/plugins/apm/server/lib/helpers/create_es_client/create_apm_event_client/index.ts index 2f2435c21dc17..3fed3c92c440c 100644 --- a/x-pack/plugins/apm/server/lib/helpers/create_es_client/create_apm_event_client/index.ts +++ b/x-pack/plugins/apm/server/lib/helpers/create_es_client/create_apm_event_client/index.ts @@ -54,12 +54,11 @@ type ESSearchRequestOf = Omit< 'apm' > & { index: string[] | string }; -type TypedSearchResponse< - TParams extends APMEventESSearchRequest -> = InferSearchResponseOf< - TypeOfProcessorEvent>, - ESSearchRequestOf ->; +type TypedSearchResponse = + InferSearchResponseOf< + TypeOfProcessorEvent>, + ESSearchRequestOf + >; export type APMEventClient = ReturnType; diff --git a/x-pack/plugins/apm/server/lib/helpers/setup_request.test.ts b/x-pack/plugins/apm/server/lib/helpers/setup_request.test.ts index 00f3f15786ad6..94e88a09ea35c 100644 --- a/x-pack/plugins/apm/server/lib/helpers/setup_request.test.ts +++ b/x-pack/plugins/apm/server/lib/helpers/setup_request.test.ts @@ -41,7 +41,7 @@ function getMockResources() { }, }; - const mockResources = ({ + const mockResources = { config: new Proxy( {}, { @@ -81,7 +81,7 @@ function getMockResources() { }, }, }, - } as unknown) as APMRouteHandlerResources & { + } as unknown as APMRouteHandlerResources & { context: { core: { elasticsearch: { diff --git a/x-pack/plugins/apm/server/lib/index_pattern/create_static_index_pattern.test.ts b/x-pack/plugins/apm/server/lib/index_pattern/create_static_index_pattern.test.ts index 46596d8ac864a..aae707c6e4689 100644 --- a/x-pack/plugins/apm/server/lib/index_pattern/create_static_index_pattern.test.ts +++ b/x-pack/plugins/apm/server/lib/index_pattern/create_static_index_pattern.test.ts @@ -13,24 +13,24 @@ import { InternalSavedObjectsClient } from '../helpers/get_internal_saved_object import { APMConfig } from '../..'; function getMockSavedObjectsClient(existingIndexPatternTitle: string) { - return ({ + return { get: jest.fn(() => ({ attributes: { title: existingIndexPatternTitle, }, })), create: jest.fn(), - } as unknown) as InternalSavedObjectsClient; + } as unknown as InternalSavedObjectsClient; } -const setup = ({ +const setup = { indices: { 'apm_oss.transactionIndices': 'apm-*-transaction-*', 'apm_oss.spanIndices': 'apm-*-span-*', 'apm_oss.errorIndices': 'apm-*-error-*', 'apm_oss.metricsIndices': 'apm-*-metrics-*', }, -} as unknown) as Setup; +} as unknown as Setup; describe('createStaticIndexPattern', () => { it(`should not create index pattern if 'xpack.apm.autocreateApmIndexPattern=false'`, async () => { diff --git a/x-pack/plugins/apm/server/lib/index_pattern/create_static_index_pattern.ts b/x-pack/plugins/apm/server/lib/index_pattern/create_static_index_pattern.ts index 6fa96de0b9413..4f35e7e639151 100644 --- a/x-pack/plugins/apm/server/lib/index_pattern/create_static_index_pattern.ts +++ b/x-pack/plugins/apm/server/lib/index_pattern/create_static_index_pattern.ts @@ -91,10 +91,11 @@ async function getForceOverwrite({ }) { if (!overwrite) { try { - const existingIndexPattern = await savedObjectsClient.get( - 'index-pattern', - APM_STATIC_INDEX_PATTERN_ID - ); + const existingIndexPattern = + await savedObjectsClient.get( + 'index-pattern', + APM_STATIC_INDEX_PATTERN_ID + ); // if the existing index pattern does not matches the new one, force an update return existingIndexPattern.attributes.title !== apmIndexPatternTitle; diff --git a/x-pack/plugins/apm/server/lib/rum_client/get_js_errors.ts b/x-pack/plugins/apm/server/lib/rum_client/get_js_errors.ts index 6967dd3d16608..10e43c478e24a 100644 --- a/x-pack/plugins/apm/server/lib/rum_client/get_js_errors.ts +++ b/x-pack/plugins/apm/server/lib/rum_client/get_js_errors.ts @@ -108,9 +108,11 @@ export async function getJSErrors({ return { count: impactedPages.pageCount.value, errorGroupId: key, - errorMessage: (sample.hits.hits[0]._source as { - error: { exception: Array<{ message: string }> }; - }).error.exception?.[0].message, + errorMessage: ( + sample.hits.hits[0]._source as { + error: { exception: Array<{ message: string }> }; + } + ).error.exception?.[0].message, }; }), }; diff --git a/x-pack/plugins/apm/server/lib/search_strategies/failed_transactions_correlations/failed_transactions_correlations_search_service.ts b/x-pack/plugins/apm/server/lib/search_strategies/failed_transactions_correlations/failed_transactions_correlations_search_service.ts index a089c5043f9a3..02ba0a8514b62 100644 --- a/x-pack/plugins/apm/server/lib/search_strategies/failed_transactions_correlations/failed_transactions_correlations_search_service.ts +++ b/x-pack/plugins/apm/server/lib/search_strategies/failed_transactions_correlations/failed_transactions_correlations_search_service.ts @@ -37,198 +37,201 @@ import { failedTransactionsCorrelationsSearchServiceStateProvider } from './fail import { ERROR_CORRELATION_THRESHOLD } from '../constants'; -export type FailedTransactionsCorrelationsSearchServiceProvider = SearchServiceProvider< - FailedTransactionsCorrelationsRequestParams, - FailedTransactionsCorrelationsRawResponse ->; +export type FailedTransactionsCorrelationsSearchServiceProvider = + SearchServiceProvider< + FailedTransactionsCorrelationsRequestParams, + FailedTransactionsCorrelationsRawResponse + >; export type FailedTransactionsCorrelationsSearchStrategy = ISearchStrategy< IKibanaSearchRequest, IKibanaSearchResponse >; -export const failedTransactionsCorrelationsSearchServiceProvider: FailedTransactionsCorrelationsSearchServiceProvider = ( - esClient: ElasticsearchClient, - getApmIndices: () => Promise, - searchServiceParams: FailedTransactionsCorrelationsRequestParams, - includeFrozen: boolean -) => { - const { addLogMessage, getLogMessages } = searchServiceLogProvider(); - - const state = failedTransactionsCorrelationsSearchServiceStateProvider(); - - async function fetchErrorCorrelations() { - try { - const indices = await getApmIndices(); - const params: FailedTransactionsCorrelationsRequestParams & - SearchStrategyServerParams = { - ...searchServiceParams, - index: indices['apm_oss.transactionIndices'], - includeFrozen, - }; +export const failedTransactionsCorrelationsSearchServiceProvider: FailedTransactionsCorrelationsSearchServiceProvider = + ( + esClient: ElasticsearchClient, + getApmIndices: () => Promise, + searchServiceParams: FailedTransactionsCorrelationsRequestParams, + includeFrozen: boolean + ) => { + const { addLogMessage, getLogMessages } = searchServiceLogProvider(); + + const state = failedTransactionsCorrelationsSearchServiceStateProvider(); + + async function fetchErrorCorrelations() { + try { + const indices = await getApmIndices(); + const params: FailedTransactionsCorrelationsRequestParams & + SearchStrategyServerParams = { + ...searchServiceParams, + index: indices['apm_oss.transactionIndices'], + includeFrozen, + }; + + // 95th percentile to be displayed as a marker in the log log chart + const { totalDocs, percentiles: percentilesResponseThresholds } = + await fetchTransactionDurationPercentiles( + esClient, + params, + params.percentileThreshold + ? [params.percentileThreshold] + : undefined + ); + const percentileThresholdValue = + percentilesResponseThresholds[`${params.percentileThreshold}.0`]; + state.setPercentileThresholdValue(percentileThresholdValue); - // 95th percentile to be displayed as a marker in the log log chart - const { - totalDocs, - percentiles: percentilesResponseThresholds, - } = await fetchTransactionDurationPercentiles( - esClient, - params, - params.percentileThreshold ? [params.percentileThreshold] : undefined - ); - const percentileThresholdValue = - percentilesResponseThresholds[`${params.percentileThreshold}.0`]; - state.setPercentileThresholdValue(percentileThresholdValue); + addLogMessage( + `Fetched ${params.percentileThreshold}th percentile value of ${percentileThresholdValue} based on ${totalDocs} documents.` + ); - addLogMessage( - `Fetched ${params.percentileThreshold}th percentile value of ${percentileThresholdValue} based on ${totalDocs} documents.` - ); + // finish early if we weren't able to identify the percentileThresholdValue. + if (percentileThresholdValue === undefined) { + addLogMessage( + `Abort service since percentileThresholdValue could not be determined.` + ); + state.setProgress({ + loadedFieldCandidates: 1, + loadedErrorCorrelations: 1, + loadedOverallHistogram: 1, + loadedFailedTransactionsCorrelations: 1, + }); + state.setIsRunning(false); + return; + } - // finish early if we weren't able to identify the percentileThresholdValue. - if (percentileThresholdValue === undefined) { - addLogMessage( - `Abort service since percentileThresholdValue could not be determined.` + const histogramRangeSteps = + await fetchTransactionDurationHistogramRangeSteps(esClient, params); + + const overallLogHistogramChartData = + await fetchTransactionDurationRanges( + esClient, + params, + histogramRangeSteps + ); + const errorLogHistogramChartData = await fetchTransactionDurationRanges( + esClient, + params, + histogramRangeSteps, + [{ fieldName: EVENT_OUTCOME, fieldValue: EventOutcome.failure }] ); - state.setProgress({ - loadedFieldCandidates: 1, - loadedErrorCorrelations: 1, - loadedOverallHistogram: 1, - loadedFailedTransactionsCorrelations: 1, - }); - state.setIsRunning(false); - return; - } - const histogramRangeSteps = await fetchTransactionDurationHistogramRangeSteps( - esClient, - params - ); + state.setProgress({ loadedOverallHistogram: 1 }); + state.setErrorHistogram(errorLogHistogramChartData); + state.setOverallHistogram(overallLogHistogramChartData); - const overallLogHistogramChartData = await fetchTransactionDurationRanges( - esClient, - params, - histogramRangeSteps - ); - const errorLogHistogramChartData = await fetchTransactionDurationRanges( - esClient, - params, - histogramRangeSteps, - [{ fieldName: EVENT_OUTCOME, fieldValue: EventOutcome.failure }] - ); + const { fieldCandidates: candidates } = + await fetchTransactionDurationFieldCandidates(esClient, params); - state.setProgress({ loadedOverallHistogram: 1 }); - state.setErrorHistogram(errorLogHistogramChartData); - state.setOverallHistogram(overallLogHistogramChartData); + const fieldCandidates = candidates.filter( + (t) => !(t === EVENT_OUTCOME) + ); - const { - fieldCandidates: candidates, - } = await fetchTransactionDurationFieldCandidates(esClient, params); - - const fieldCandidates = candidates.filter((t) => !(t === EVENT_OUTCOME)); - - addLogMessage(`Identified ${fieldCandidates.length} fieldCandidates.`); - - state.setProgress({ loadedFieldCandidates: 1 }); - - let fieldCandidatesFetchedCount = 0; - if (params !== undefined && fieldCandidates.length > 0) { - const batches = chunk(fieldCandidates, 10); - for (let i = 0; i < batches.length; i++) { - try { - const results = await Promise.allSettled( - batches[i].map((fieldName) => - fetchFailedTransactionsCorrelationPValues( - esClient, - params, - histogramRangeSteps, - fieldName - ) - ) - ); - - results.forEach((result, idx) => { - if (result.status === 'fulfilled') { - state.addFailedTransactionsCorrelations( - result.value.filter( - (record) => - record && - typeof record.pValue === 'number' && - record.pValue < ERROR_CORRELATION_THRESHOLD + addLogMessage(`Identified ${fieldCandidates.length} fieldCandidates.`); + + state.setProgress({ loadedFieldCandidates: 1 }); + + let fieldCandidatesFetchedCount = 0; + if (params !== undefined && fieldCandidates.length > 0) { + const batches = chunk(fieldCandidates, 10); + for (let i = 0; i < batches.length; i++) { + try { + const results = await Promise.allSettled( + batches[i].map((fieldName) => + fetchFailedTransactionsCorrelationPValues( + esClient, + params, + histogramRangeSteps, + fieldName ) - ); - } else { - // If one of the fields in the batch had an error - addLogMessage( - `Error getting error correlation for field ${batches[i][idx]}: ${result.reason}.` - ); + ) + ); + + results.forEach((result, idx) => { + if (result.status === 'fulfilled') { + state.addFailedTransactionsCorrelations( + result.value.filter( + (record) => + record && + typeof record.pValue === 'number' && + record.pValue < ERROR_CORRELATION_THRESHOLD + ) + ); + } else { + // If one of the fields in the batch had an error + addLogMessage( + `Error getting error correlation for field ${batches[i][idx]}: ${result.reason}.` + ); + } + }); + } catch (e) { + state.setError(e); + + if (params?.index.includes(':')) { + state.setCcsWarning(true); } - }); - } catch (e) { - state.setError(e); - - if (params?.index.includes(':')) { - state.setCcsWarning(true); + } finally { + fieldCandidatesFetchedCount += batches[i].length; + state.setProgress({ + loadedFailedTransactionsCorrelations: + fieldCandidatesFetchedCount / fieldCandidates.length, + }); } - } finally { - fieldCandidatesFetchedCount += batches[i].length; - state.setProgress({ - loadedFailedTransactionsCorrelations: - fieldCandidatesFetchedCount / fieldCandidates.length, - }); } - } - addLogMessage( - `Identified correlations for ${fieldCandidatesFetchedCount} fields out of ${fieldCandidates.length} candidates.` - ); + addLogMessage( + `Identified correlations for ${fieldCandidatesFetchedCount} fields out of ${fieldCandidates.length} candidates.` + ); + } + } catch (e) { + state.setError(e); } - } catch (e) { - state.setError(e); + + addLogMessage( + `Identified ${ + state.getState().failedTransactionsCorrelations.length + } significant correlations relating to failed transactions.` + ); + + state.setIsRunning(false); } - addLogMessage( - `Identified ${ - state.getState().failedTransactionsCorrelations.length - } significant correlations relating to failed transactions.` - ); - - state.setIsRunning(false); - } - - fetchErrorCorrelations(); - - return () => { - const { - ccsWarning, - error, - isRunning, - overallHistogram, - errorHistogram, - percentileThresholdValue, - progress, - } = state.getState(); - - return { - cancel: () => { - addLogMessage(`Service cancelled.`); - state.setIsCancelled(true); - }, - error, - meta: { - loaded: Math.round(state.getOverallProgress() * 100), - total: 100, - isRunning, - isPartial: isRunning, - }, - rawResponse: { + fetchErrorCorrelations(); + + return () => { + const { ccsWarning, - log: getLogMessages(), - took: Date.now() - progress.started, - failedTransactionsCorrelations: state.getFailedTransactionsCorrelationsSortedByScore(), + error, + isRunning, overallHistogram, errorHistogram, percentileThresholdValue, - }, + progress, + } = state.getState(); + + return { + cancel: () => { + addLogMessage(`Service cancelled.`); + state.setIsCancelled(true); + }, + error, + meta: { + loaded: Math.round(state.getOverallProgress() * 100), + total: 100, + isRunning, + isPartial: isRunning, + }, + rawResponse: { + ccsWarning, + log: getLogMessages(), + took: Date.now() - progress.started, + failedTransactionsCorrelations: + state.getFailedTransactionsCorrelationsSortedByScore(), + overallHistogram, + errorHistogram, + percentileThresholdValue, + }, + }; }; }; -}; diff --git a/x-pack/plugins/apm/server/lib/search_strategies/latency_correlations/latency_correlations_search_service.ts b/x-pack/plugins/apm/server/lib/search_strategies/latency_correlations/latency_correlations_search_service.ts index 9344b354808be..7e420c821a746 100644 --- a/x-pack/plugins/apm/server/lib/search_strategies/latency_correlations/latency_correlations_search_service.ts +++ b/x-pack/plugins/apm/server/lib/search_strategies/latency_correlations/latency_correlations_search_service.ts @@ -47,233 +47,230 @@ export type LatencyCorrelationsSearchStrategy = ISearchStrategy< IKibanaSearchResponse >; -export const latencyCorrelationsSearchServiceProvider: LatencyCorrelationsSearchServiceProvider = ( - esClient: ElasticsearchClient, - getApmIndices: () => Promise, - searchServiceParams: LatencyCorrelationsRequestParams, - includeFrozen: boolean -) => { - const { addLogMessage, getLogMessages } = searchServiceLogProvider(); - - const state = latencyCorrelationsSearchServiceStateProvider(); - - async function fetchCorrelations() { - let params: - | (LatencyCorrelationsRequestParams & SearchStrategyServerParams) - | undefined; - - try { - const indices = await getApmIndices(); - params = { - ...searchServiceParams, - index: indices['apm_oss.transactionIndices'], - includeFrozen, - }; +export const latencyCorrelationsSearchServiceProvider: LatencyCorrelationsSearchServiceProvider = + ( + esClient: ElasticsearchClient, + getApmIndices: () => Promise, + searchServiceParams: LatencyCorrelationsRequestParams, + includeFrozen: boolean + ) => { + const { addLogMessage, getLogMessages } = searchServiceLogProvider(); + + const state = latencyCorrelationsSearchServiceStateProvider(); + + async function fetchCorrelations() { + let params: + | (LatencyCorrelationsRequestParams & SearchStrategyServerParams) + | undefined; + + try { + const indices = await getApmIndices(); + params = { + ...searchServiceParams, + index: indices['apm_oss.transactionIndices'], + includeFrozen, + }; + + // 95th percentile to be displayed as a marker in the log log chart + const { totalDocs, percentiles: percentilesResponseThresholds } = + await fetchTransactionDurationPercentiles( + esClient, + params, + params.percentileThreshold + ? [params.percentileThreshold] + : undefined + ); + const percentileThresholdValue = + percentilesResponseThresholds[`${params.percentileThreshold}.0`]; + state.setPercentileThresholdValue(percentileThresholdValue); - // 95th percentile to be displayed as a marker in the log log chart - const { - totalDocs, - percentiles: percentilesResponseThresholds, - } = await fetchTransactionDurationPercentiles( - esClient, - params, - params.percentileThreshold ? [params.percentileThreshold] : undefined - ); - const percentileThresholdValue = - percentilesResponseThresholds[`${params.percentileThreshold}.0`]; - state.setPercentileThresholdValue(percentileThresholdValue); - - addLogMessage( - `Fetched ${params.percentileThreshold}th percentile value of ${percentileThresholdValue} based on ${totalDocs} documents.` - ); - - // finish early if we weren't able to identify the percentileThresholdValue. - if (percentileThresholdValue === undefined) { addLogMessage( - `Abort service since percentileThresholdValue could not be determined.` + `Fetched ${params.percentileThreshold}th percentile value of ${percentileThresholdValue} based on ${totalDocs} documents.` ); - state.setProgress({ - loadedHistogramStepsize: 1, - loadedOverallHistogram: 1, - loadedFieldCandidates: 1, - loadedFieldValuePairs: 1, - loadedHistograms: 1, - }); - state.setIsRunning(false); - return; - } - const histogramRangeSteps = await fetchTransactionDurationHistogramRangeSteps( - esClient, - params - ); - state.setProgress({ loadedHistogramStepsize: 1 }); + // finish early if we weren't able to identify the percentileThresholdValue. + if (percentileThresholdValue === undefined) { + addLogMessage( + `Abort service since percentileThresholdValue could not be determined.` + ); + state.setProgress({ + loadedHistogramStepsize: 1, + loadedOverallHistogram: 1, + loadedFieldCandidates: 1, + loadedFieldValuePairs: 1, + loadedHistograms: 1, + }); + state.setIsRunning(false); + return; + } - addLogMessage(`Loaded histogram range steps.`); + const histogramRangeSteps = + await fetchTransactionDurationHistogramRangeSteps(esClient, params); + state.setProgress({ loadedHistogramStepsize: 1 }); - if (state.getIsCancelled()) { - state.setIsRunning(false); - return; - } + addLogMessage(`Loaded histogram range steps.`); - const overallLogHistogramChartData = await fetchTransactionDurationRanges( - esClient, - params, - histogramRangeSteps - ); - state.setProgress({ loadedOverallHistogram: 1 }); - state.setOverallHistogram(overallLogHistogramChartData); + if (state.getIsCancelled()) { + state.setIsRunning(false); + return; + } - addLogMessage(`Loaded overall histogram chart data.`); + const overallLogHistogramChartData = + await fetchTransactionDurationRanges( + esClient, + params, + histogramRangeSteps + ); + state.setProgress({ loadedOverallHistogram: 1 }); + state.setOverallHistogram(overallLogHistogramChartData); - if (state.getIsCancelled()) { - state.setIsRunning(false); - return; - } + addLogMessage(`Loaded overall histogram chart data.`); - // finish early if correlation analysis is not required. - if (params.analyzeCorrelations === false) { - addLogMessage( - `Finish service since correlation analysis wasn't requested.` - ); - state.setProgress({ - loadedHistogramStepsize: 1, - loadedOverallHistogram: 1, - loadedFieldCandidates: 1, - loadedFieldValuePairs: 1, - loadedHistograms: 1, - }); - state.setIsRunning(false); - return; - } + if (state.getIsCancelled()) { + state.setIsRunning(false); + return; + } - // Create an array of ranges [2, 4, 6, ..., 98] - const percentileAggregationPercents = range(2, 100, 2); - const { - percentiles: percentilesRecords, - } = await fetchTransactionDurationPercentiles( - esClient, - params, - percentileAggregationPercents - ); - const percentiles = Object.values(percentilesRecords); - - addLogMessage(`Loaded percentiles.`); - - if (state.getIsCancelled()) { - state.setIsRunning(false); - return; - } + // finish early if correlation analysis is not required. + if (params.analyzeCorrelations === false) { + addLogMessage( + `Finish service since correlation analysis wasn't requested.` + ); + state.setProgress({ + loadedHistogramStepsize: 1, + loadedOverallHistogram: 1, + loadedFieldCandidates: 1, + loadedFieldValuePairs: 1, + loadedHistograms: 1, + }); + state.setIsRunning(false); + return; + } - const { fieldCandidates } = await fetchTransactionDurationFieldCandidates( - esClient, - params - ); + // Create an array of ranges [2, 4, 6, ..., 98] + const percentileAggregationPercents = range(2, 100, 2); + const { percentiles: percentilesRecords } = + await fetchTransactionDurationPercentiles( + esClient, + params, + percentileAggregationPercents + ); + const percentiles = Object.values(percentilesRecords); + + addLogMessage(`Loaded percentiles.`); + + if (state.getIsCancelled()) { + state.setIsRunning(false); + return; + } + + const { fieldCandidates } = + await fetchTransactionDurationFieldCandidates(esClient, params); - addLogMessage(`Identified ${fieldCandidates.length} fieldCandidates.`); + addLogMessage(`Identified ${fieldCandidates.length} fieldCandidates.`); - state.setProgress({ loadedFieldCandidates: 1 }); + state.setProgress({ loadedFieldCandidates: 1 }); - const fieldValuePairs = await fetchTransactionDurationFieldValuePairs( - esClient, - params, - fieldCandidates, - state, - addLogMessage - ); + const fieldValuePairs = await fetchTransactionDurationFieldValuePairs( + esClient, + params, + fieldCandidates, + state, + addLogMessage + ); - addLogMessage(`Identified ${fieldValuePairs.length} fieldValuePairs.`); + addLogMessage(`Identified ${fieldValuePairs.length} fieldValuePairs.`); - if (state.getIsCancelled()) { - state.setIsRunning(false); - return; - } + if (state.getIsCancelled()) { + state.setIsRunning(false); + return; + } - const { expectations, ranges } = computeExpectationsAndRanges( - percentiles - ); + const { expectations, ranges } = + computeExpectationsAndRanges(percentiles); - const { - fractions, - totalDocCount, - } = await fetchTransactionDurationFractions(esClient, params, ranges); - - addLogMessage(`Loaded fractions and totalDocCount of ${totalDocCount}.`); - - let loadedHistograms = 0; - for await (const item of fetchTransactionDurationHistograms( - esClient, - addLogMessage, - params, - state, - expectations, - ranges, - fractions, - histogramRangeSteps, - totalDocCount, - fieldValuePairs - )) { - if (item !== undefined) { - state.addLatencyCorrelation(item); + const { fractions, totalDocCount } = + await fetchTransactionDurationFractions(esClient, params, ranges); + + addLogMessage( + `Loaded fractions and totalDocCount of ${totalDocCount}.` + ); + + let loadedHistograms = 0; + for await (const item of fetchTransactionDurationHistograms( + esClient, + addLogMessage, + params, + state, + expectations, + ranges, + fractions, + histogramRangeSteps, + totalDocCount, + fieldValuePairs + )) { + if (item !== undefined) { + state.addLatencyCorrelation(item); + } + loadedHistograms++; + state.setProgress({ + loadedHistograms: loadedHistograms / fieldValuePairs.length, + }); } - loadedHistograms++; - state.setProgress({ - loadedHistograms: loadedHistograms / fieldValuePairs.length, - }); + + addLogMessage( + `Identified ${ + state.getState().latencyCorrelations.length + } significant correlations out of ${ + fieldValuePairs.length + } field/value pairs.` + ); + } catch (e) { + state.setError(e); } - addLogMessage( - `Identified ${ - state.getState().latencyCorrelations.length - } significant correlations out of ${ - fieldValuePairs.length - } field/value pairs.` - ); - } catch (e) { - state.setError(e); + if (state.getState().error !== undefined && params?.index.includes(':')) { + state.setCcsWarning(true); + } + + state.setIsRunning(false); } - if (state.getState().error !== undefined && params?.index.includes(':')) { - state.setCcsWarning(true); + function cancel() { + addLogMessage(`Service cancelled.`); + state.setIsCancelled(true); } - state.setIsRunning(false); - } - - function cancel() { - addLogMessage(`Service cancelled.`); - state.setIsCancelled(true); - } - - fetchCorrelations(); - - return () => { - const { - ccsWarning, - error, - isRunning, - overallHistogram, - percentileThresholdValue, - progress, - } = state.getState(); - - return { - cancel, - error, - meta: { - loaded: Math.round(state.getOverallProgress() * 100), - total: 100, - isRunning, - isPartial: isRunning, - }, - rawResponse: { + fetchCorrelations(); + + return () => { + const { ccsWarning, - log: getLogMessages(), - took: Date.now() - progress.started, - latencyCorrelations: state.getLatencyCorrelationsSortedByCorrelation(), - percentileThresholdValue, + error, + isRunning, overallHistogram, - }, + percentileThresholdValue, + progress, + } = state.getState(); + + return { + cancel, + error, + meta: { + loaded: Math.round(state.getOverallProgress() * 100), + total: 100, + isRunning, + isPartial: isRunning, + }, + rawResponse: { + ccsWarning, + log: getLogMessages(), + took: Date.now() - progress.started, + latencyCorrelations: + state.getLatencyCorrelationsSortedByCorrelation(), + percentileThresholdValue, + overallHistogram, + }, + }; }; }; -}; diff --git a/x-pack/plugins/apm/server/lib/search_strategies/queries/get_prioritized_field_value_pairs.test.ts b/x-pack/plugins/apm/server/lib/search_strategies/queries/get_prioritized_field_value_pairs.test.ts index cb1500e70babc..227173c317780 100644 --- a/x-pack/plugins/apm/server/lib/search_strategies/queries/get_prioritized_field_value_pairs.test.ts +++ b/x-pack/plugins/apm/server/lib/search_strategies/queries/get_prioritized_field_value_pairs.test.ts @@ -14,9 +14,8 @@ describe('correlations', () => { { fieldName: 'the-field-1', fieldValue: 'the-value-1' }, { fieldName: 'the-field-2', fieldValue: 'the-value-2' }, ]; - const prioritziedFieldValuePairs = getPrioritizedFieldValuePairs( - fieldValuePairs - ); + const prioritziedFieldValuePairs = + getPrioritizedFieldValuePairs(fieldValuePairs); expect(prioritziedFieldValuePairs.map((d) => d.fieldName)).toEqual([ 'the-field-1', 'the-field-2', @@ -28,9 +27,8 @@ describe('correlations', () => { { fieldName: 'service.version', fieldValue: 'the-value-1' }, { fieldName: 'the-field-2', fieldValue: 'the-value-2' }, ]; - const prioritziedFieldValuePairs = getPrioritizedFieldValuePairs( - fieldValuePairs - ); + const prioritziedFieldValuePairs = + getPrioritizedFieldValuePairs(fieldValuePairs); expect(prioritziedFieldValuePairs.map((d) => d.fieldName)).toEqual([ 'service.version', 'the-field-2', @@ -42,9 +40,8 @@ describe('correlations', () => { { fieldName: 'the-field-1', fieldValue: 'the-value-1' }, { fieldName: 'service.version', fieldValue: 'the-value-2' }, ]; - const prioritziedFieldValuePairs = getPrioritizedFieldValuePairs( - fieldValuePairs - ); + const prioritziedFieldValuePairs = + getPrioritizedFieldValuePairs(fieldValuePairs); expect(prioritziedFieldValuePairs.map((d) => d.fieldName)).toEqual([ 'service.version', 'the-field-1', @@ -57,9 +54,8 @@ describe('correlations', () => { { fieldName: 'service.version', fieldValue: 'the-value-2' }, { fieldName: 'cloud.the-field-3', fieldValue: 'the-value-3' }, ]; - const prioritziedFieldValuePairs = getPrioritizedFieldValuePairs( - fieldValuePairs - ); + const prioritziedFieldValuePairs = + getPrioritizedFieldValuePairs(fieldValuePairs); expect(prioritziedFieldValuePairs.map((d) => d.fieldName)).toEqual([ 'service.version', 'cloud.the-field-3', diff --git a/x-pack/plugins/apm/server/lib/search_strategies/queries/query_correlation.test.ts b/x-pack/plugins/apm/server/lib/search_strategies/queries/query_correlation.test.ts index d3d14260df65c..fc2dacce61a73 100644 --- a/x-pack/plugins/apm/server/lib/search_strategies/queries/query_correlation.test.ts +++ b/x-pack/plugins/apm/server/lib/search_strategies/queries/query_correlation.test.ts @@ -48,9 +48,11 @@ describe('query_correlation', () => { expect(query?.body?.aggs?.latency_ranges?.range?.ranges).toEqual(ranges); expect( - (query?.body?.aggs?.transaction_duration_correlation as { - bucket_correlation: BucketCorrelation; - })?.bucket_correlation.function.count_correlation.indicator + ( + query?.body?.aggs?.transaction_duration_correlation as { + bucket_correlation: BucketCorrelation; + } + )?.bucket_correlation.function.count_correlation.indicator ).toEqual({ fractions, expectations, @@ -69,27 +71,31 @@ describe('query_correlation', () => { const transactionDurationCorrelationValue = 0.45; const KsTestLess = 0.01; - const esClientSearchMock = jest.fn((req: estypes.SearchRequest): { - body: estypes.SearchResponse; - } => { - return { - body: ({ - aggregations: { - latency_ranges: { - buckets: latencyRangesBuckets, + const esClientSearchMock = jest.fn( + ( + req: estypes.SearchRequest + ): { + body: estypes.SearchResponse; + } => { + return { + body: { + aggregations: { + latency_ranges: { + buckets: latencyRangesBuckets, + }, + transaction_duration_correlation: { + value: transactionDurationCorrelationValue, + }, + ks_test: { less: KsTestLess }, }, - transaction_duration_correlation: { - value: transactionDurationCorrelationValue, - }, - ks_test: { less: KsTestLess }, - }, - } as unknown) as estypes.SearchResponse, - }; - }); + } as unknown as estypes.SearchResponse, + }; + } + ); - const esClientMock = ({ + const esClientMock = { search: esClientSearchMock, - } as unknown) as ElasticsearchClient; + } as unknown as ElasticsearchClient; const resp = await fetchTransactionDurationCorrelation( esClientMock, diff --git a/x-pack/plugins/apm/server/lib/search_strategies/queries/query_correlation.ts b/x-pack/plugins/apm/server/lib/search_strategies/queries/query_correlation.ts index 82913a91db16f..24db25f8afd89 100644 --- a/x-pack/plugins/apm/server/lib/search_strategies/queries/query_correlation.ts +++ b/x-pack/plugins/apm/server/lib/search_strategies/queries/query_correlation.ts @@ -116,11 +116,14 @@ export const fetchTransactionDurationCorrelation = async ( } const result = { - ranges: (resp.body.aggregations - .latency_ranges as estypes.AggregationsMultiBucketAggregate).buckets, - correlation: (resp.body.aggregations - .transaction_duration_correlation as estypes.AggregationsValueAggregate) - .value, + ranges: ( + resp.body.aggregations + .latency_ranges as estypes.AggregationsMultiBucketAggregate + ).buckets, + correlation: ( + resp.body.aggregations + .transaction_duration_correlation as estypes.AggregationsValueAggregate + ).value, // @ts-ignore ksTest: resp.body.aggregations.ks_test.less, }; diff --git a/x-pack/plugins/apm/server/lib/search_strategies/queries/query_field_candidates.test.ts b/x-pack/plugins/apm/server/lib/search_strategies/queries/query_field_candidates.test.ts index 150348e2a7aa2..6e0521ac1a008 100644 --- a/x-pack/plugins/apm/server/lib/search_strategies/queries/query_field_candidates.test.ts +++ b/x-pack/plugins/apm/server/lib/search_strategies/queries/query_field_candidates.test.ts @@ -106,30 +106,34 @@ describe('query_field_candidates', () => { }, }, })); - const esClientSearchMock = jest.fn((req: estypes.SearchRequest): { - body: estypes.SearchResponse; - } => { - return { - body: ({ - hits: { - hits: [ - { - fields: { - myIpFieldName: '1.1.1.1', - myKeywordFieldName: 'myKeywordFieldValue', - myNumericFieldName: 1234, + const esClientSearchMock = jest.fn( + ( + req: estypes.SearchRequest + ): { + body: estypes.SearchResponse; + } => { + return { + body: { + hits: { + hits: [ + { + fields: { + myIpFieldName: '1.1.1.1', + myKeywordFieldName: 'myKeywordFieldValue', + myNumericFieldName: 1234, + }, }, - }, - ], - }, - } as unknown) as estypes.SearchResponse, - }; - }); + ], + }, + } as unknown as estypes.SearchResponse, + }; + } + ); - const esClientMock = ({ + const esClientMock = { fieldCaps: esClientFieldCapsMock, search: esClientSearchMock, - } as unknown) as ElasticsearchClient; + } as unknown as ElasticsearchClient; const resp = await fetchTransactionDurationFieldCandidates( esClientMock, diff --git a/x-pack/plugins/apm/server/lib/search_strategies/queries/query_field_value_pairs.test.ts b/x-pack/plugins/apm/server/lib/search_strategies/queries/query_field_value_pairs.test.ts index 1fff8cde5bbb3..9ffbf6b2ce18d 100644 --- a/x-pack/plugins/apm/server/lib/search_strategies/queries/query_field_value_pairs.test.ts +++ b/x-pack/plugins/apm/server/lib/search_strategies/queries/query_field_value_pairs.test.ts @@ -44,23 +44,27 @@ describe('query_field_value_pairs', () => { 'myFieldCandidate3', ]; - const esClientSearchMock = jest.fn((req: estypes.SearchRequest): { - body: estypes.SearchResponse; - } => { - return { - body: ({ - aggregations: { - attribute_terms: { - buckets: [{ key: 'myValue1' }, { key: 'myValue2' }], + const esClientSearchMock = jest.fn( + ( + req: estypes.SearchRequest + ): { + body: estypes.SearchResponse; + } => { + return { + body: { + aggregations: { + attribute_terms: { + buckets: [{ key: 'myValue1' }, { key: 'myValue2' }], + }, }, - }, - } as unknown) as estypes.SearchResponse, - }; - }); + } as unknown as estypes.SearchResponse, + }; + } + ); - const esClientMock = ({ + const esClientMock = { search: esClientSearchMock, - } as unknown) as ElasticsearchClient; + } as unknown as ElasticsearchClient; const { addLogMessage, getLogMessages } = searchServiceLogProvider(); const state = latencyCorrelationsSearchServiceStateProvider(); diff --git a/x-pack/plugins/apm/server/lib/search_strategies/queries/query_field_value_pairs.ts b/x-pack/plugins/apm/server/lib/search_strategies/queries/query_field_value_pairs.ts index aa7d9f341a345..296abfd2d8653 100644 --- a/x-pack/plugins/apm/server/lib/search_strategies/queries/query_field_value_pairs.ts +++ b/x-pack/plugins/apm/server/lib/search_strategies/queries/query_field_value_pairs.ts @@ -56,10 +56,12 @@ const fetchTransactionDurationFieldTerms = async ( ); return []; } - const buckets = (resp.body.aggregations - .attribute_terms as estypes.AggregationsMultiBucketAggregate<{ - key: string; - }>)?.buckets; + const buckets = ( + resp.body.aggregations + .attribute_terms as estypes.AggregationsMultiBucketAggregate<{ + key: string; + }> + )?.buckets; if (buckets?.length >= 1) { return buckets.map((d) => ({ fieldName, diff --git a/x-pack/plugins/apm/server/lib/search_strategies/queries/query_fractions.test.ts b/x-pack/plugins/apm/server/lib/search_strategies/queries/query_fractions.test.ts index fdf383453e17f..daf6b368c78b1 100644 --- a/x-pack/plugins/apm/server/lib/search_strategies/queries/query_fractions.test.ts +++ b/x-pack/plugins/apm/server/lib/search_strategies/queries/query_fractions.test.ts @@ -39,23 +39,27 @@ describe('query_fractions', () => { describe('fetchTransactionDurationFractions', () => { it('computes the actual percentile bucket counts and actual fractions', async () => { - const esClientSearchMock = jest.fn((req: estypes.SearchRequest): { - body: estypes.SearchResponse; - } => { - return { - body: ({ - aggregations: { - latency_ranges: { - buckets: [{ doc_count: 1 }, { doc_count: 2 }], + const esClientSearchMock = jest.fn( + ( + req: estypes.SearchRequest + ): { + body: estypes.SearchResponse; + } => { + return { + body: { + aggregations: { + latency_ranges: { + buckets: [{ doc_count: 1 }, { doc_count: 2 }], + }, }, - }, - } as unknown) as estypes.SearchResponse, - }; - }); + } as unknown as estypes.SearchResponse, + }; + } + ); - const esClientMock = ({ + const esClientMock = { search: esClientSearchMock, - } as unknown) as ElasticsearchClient; + } as unknown as ElasticsearchClient; const resp = await fetchTransactionDurationFractions( esClientMock, diff --git a/x-pack/plugins/apm/server/lib/search_strategies/queries/query_fractions.ts b/x-pack/plugins/apm/server/lib/search_strategies/queries/query_fractions.ts index 25e5f62564b04..ccea480052c9b 100644 --- a/x-pack/plugins/apm/server/lib/search_strategies/queries/query_fractions.ts +++ b/x-pack/plugins/apm/server/lib/search_strategies/queries/query_fractions.ts @@ -50,10 +50,12 @@ export const fetchTransactionDurationFractions = async ( ); } - const buckets = (resp.body.aggregations - .latency_ranges as estypes.AggregationsMultiBucketAggregate<{ - doc_count: number; - }>)?.buckets; + const buckets = ( + resp.body.aggregations + .latency_ranges as estypes.AggregationsMultiBucketAggregate<{ + doc_count: number; + }> + )?.buckets; const totalDocCount = buckets.reduce((acc, bucket) => { return acc + bucket.doc_count; diff --git a/x-pack/plugins/apm/server/lib/search_strategies/queries/query_histogram.test.ts b/x-pack/plugins/apm/server/lib/search_strategies/queries/query_histogram.test.ts index e6faeb16247fb..7ecb1d2d8a333 100644 --- a/x-pack/plugins/apm/server/lib/search_strategies/queries/query_histogram.test.ts +++ b/x-pack/plugins/apm/server/lib/search_strategies/queries/query_histogram.test.ts @@ -78,23 +78,27 @@ describe('query_histogram', () => { }, ]; - const esClientSearchMock = jest.fn((req: estypes.SearchRequest): { - body: estypes.SearchResponse; - } => { - return { - body: ({ - aggregations: { - transaction_duration_histogram: { - buckets: histogramBucket, + const esClientSearchMock = jest.fn( + ( + req: estypes.SearchRequest + ): { + body: estypes.SearchResponse; + } => { + return { + body: { + aggregations: { + transaction_duration_histogram: { + buckets: histogramBucket, + }, }, - }, - } as unknown) as estypes.SearchResponse, - }; - }); + } as unknown as estypes.SearchResponse, + }; + } + ); - const esClientMock = ({ + const esClientMock = { search: esClientSearchMock, - } as unknown) as ElasticsearchClient; + } as unknown as ElasticsearchClient; const resp = await fetchTransactionDurationHistogram( esClientMock, diff --git a/x-pack/plugins/apm/server/lib/search_strategies/queries/query_histogram.ts b/x-pack/plugins/apm/server/lib/search_strategies/queries/query_histogram.ts index 2514caf3ff876..5fb7ef76fc728 100644 --- a/x-pack/plugins/apm/server/lib/search_strategies/queries/query_histogram.ts +++ b/x-pack/plugins/apm/server/lib/search_strategies/queries/query_histogram.ts @@ -54,8 +54,9 @@ export const fetchTransactionDurationHistogram = async ( } return ( - (resp.body.aggregations - .transaction_duration_histogram as estypes.AggregationsMultiBucketAggregate) - .buckets ?? [] + ( + resp.body.aggregations + .transaction_duration_histogram as estypes.AggregationsMultiBucketAggregate + ).buckets ?? [] ); }; diff --git a/x-pack/plugins/apm/server/lib/search_strategies/queries/query_histogram_interval.test.ts b/x-pack/plugins/apm/server/lib/search_strategies/queries/query_histogram_interval.test.ts index 7b0d00d0d9b57..e6cf926d20bd7 100644 --- a/x-pack/plugins/apm/server/lib/search_strategies/queries/query_histogram_interval.test.ts +++ b/x-pack/plugins/apm/server/lib/search_strategies/queries/query_histogram_interval.test.ts @@ -74,26 +74,30 @@ describe('query_histogram_interval', () => { describe('fetchTransactionDurationHistogramInterval', () => { it('fetches the interval duration for histograms', async () => { - const esClientSearchMock = jest.fn((req: estypes.SearchRequest): { - body: estypes.SearchResponse; - } => { - return { - body: ({ - aggregations: { - transaction_duration_max: { - value: 10000, - }, - transaction_duration_min: { - value: 10, + const esClientSearchMock = jest.fn( + ( + req: estypes.SearchRequest + ): { + body: estypes.SearchResponse; + } => { + return { + body: { + aggregations: { + transaction_duration_max: { + value: 10000, + }, + transaction_duration_min: { + value: 10, + }, }, - }, - } as unknown) as estypes.SearchResponse, - }; - }); + } as unknown as estypes.SearchResponse, + }; + } + ); - const esClientMock = ({ + const esClientMock = { search: esClientSearchMock, - } as unknown) as ElasticsearchClient; + } as unknown as ElasticsearchClient; const resp = await fetchTransactionDurationHistogramInterval( esClientMock, diff --git a/x-pack/plugins/apm/server/lib/search_strategies/queries/query_histogram_interval.ts b/x-pack/plugins/apm/server/lib/search_strategies/queries/query_histogram_interval.ts index 7a8752e45c6f2..906105003b716 100644 --- a/x-pack/plugins/apm/server/lib/search_strategies/queries/query_histogram_interval.ts +++ b/x-pack/plugins/apm/server/lib/search_strategies/queries/query_histogram_interval.ts @@ -44,10 +44,14 @@ export const fetchTransactionDurationHistogramInterval = async ( } const transactionDurationDelta = - (resp.body.aggregations - .transaction_duration_max as estypes.AggregationsValueAggregate).value - - (resp.body.aggregations - .transaction_duration_min as estypes.AggregationsValueAggregate).value; + ( + resp.body.aggregations + .transaction_duration_max as estypes.AggregationsValueAggregate + ).value - + ( + resp.body.aggregations + .transaction_duration_min as estypes.AggregationsValueAggregate + ).value; return transactionDurationDelta / (HISTOGRAM_INTERVALS - 1); }; diff --git a/x-pack/plugins/apm/server/lib/search_strategies/queries/query_histogram_range_steps.test.ts b/x-pack/plugins/apm/server/lib/search_strategies/queries/query_histogram_range_steps.test.ts index 88d4f1a57adeb..25ce39cbcf17b 100644 --- a/x-pack/plugins/apm/server/lib/search_strategies/queries/query_histogram_range_steps.test.ts +++ b/x-pack/plugins/apm/server/lib/search_strategies/queries/query_histogram_range_steps.test.ts @@ -74,27 +74,31 @@ describe('query_histogram_range_steps', () => { describe('fetchTransactionDurationHistogramRangeSteps', () => { it('fetches the range steps for the log histogram', async () => { - const esClientSearchMock = jest.fn((req: estypes.SearchRequest): { - body: estypes.SearchResponse; - } => { - return { - body: ({ - hits: { total: { value: 10 } }, - aggregations: { - transaction_duration_max: { - value: 10000, - }, - transaction_duration_min: { - value: 10, + const esClientSearchMock = jest.fn( + ( + req: estypes.SearchRequest + ): { + body: estypes.SearchResponse; + } => { + return { + body: { + hits: { total: { value: 10 } }, + aggregations: { + transaction_duration_max: { + value: 10000, + }, + transaction_duration_min: { + value: 10, + }, }, - }, - } as unknown) as estypes.SearchResponse, - }; - }); + } as unknown as estypes.SearchResponse, + }; + } + ); - const esClientMock = ({ + const esClientMock = { search: esClientSearchMock, - } as unknown) as ElasticsearchClient; + } as unknown as ElasticsearchClient; const resp = await fetchTransactionDurationHistogramRangeSteps( esClientMock, diff --git a/x-pack/plugins/apm/server/lib/search_strategies/queries/query_histogram_range_steps.ts b/x-pack/plugins/apm/server/lib/search_strategies/queries/query_histogram_range_steps.ts index 31ab7392155bc..973787833577c 100644 --- a/x-pack/plugins/apm/server/lib/search_strategies/queries/query_histogram_range_steps.ts +++ b/x-pack/plugins/apm/server/lib/search_strategies/queries/query_histogram_range_steps.ts @@ -57,12 +57,15 @@ export const fetchTransactionDurationHistogramRangeSteps = async ( ); } - const min = (resp.body.aggregations - .transaction_duration_min as estypes.AggregationsValueAggregate).value; + const min = ( + resp.body.aggregations + .transaction_duration_min as estypes.AggregationsValueAggregate + ).value; const max = - (resp.body.aggregations - .transaction_duration_max as estypes.AggregationsValueAggregate).value * - 2; + ( + resp.body.aggregations + .transaction_duration_max as estypes.AggregationsValueAggregate + ).value * 2; return getHistogramRangeSteps(min, max, steps); }; diff --git a/x-pack/plugins/apm/server/lib/search_strategies/queries/query_histograms_generator.test.ts b/x-pack/plugins/apm/server/lib/search_strategies/queries/query_histograms_generator.test.ts index c80b2533d7e32..375e32b1472c6 100644 --- a/x-pack/plugins/apm/server/lib/search_strategies/queries/query_histograms_generator.test.ts +++ b/x-pack/plugins/apm/server/lib/search_strategies/queries/query_histograms_generator.test.ts @@ -38,17 +38,21 @@ const fieldValuePairs = [ describe('query_histograms_generator', () => { describe('fetchTransactionDurationHistograms', () => { it(`doesn't break on failing ES queries and adds messages to the log`, async () => { - const esClientSearchMock = jest.fn((req: estypes.SearchRequest): { - body: estypes.SearchResponse; - } => { - return { - body: ({} as unknown) as estypes.SearchResponse, - }; - }); - - const esClientMock = ({ + const esClientSearchMock = jest.fn( + ( + req: estypes.SearchRequest + ): { + body: estypes.SearchResponse; + } => { + return { + body: {} as unknown as estypes.SearchResponse, + }; + } + ); + + const esClientMock = { search: esClientSearchMock, - } as unknown) as ElasticsearchClient; + } as unknown as ElasticsearchClient; const state = latencyCorrelationsSearchServiceStateProvider(); const { addLogMessage, getLogMessages } = searchServiceLogProvider(); @@ -85,24 +89,28 @@ describe('query_histograms_generator', () => { }); it('returns items with correlation and ks-test value', async () => { - const esClientSearchMock = jest.fn((req: estypes.SearchRequest): { - body: estypes.SearchResponse; - } => { - return { - body: ({ - aggregations: { - latency_ranges: { buckets: [] }, - transaction_duration_correlation: { value: 0.6 }, - ks_test: { less: 0.001 }, - logspace_ranges: { buckets: [] }, - }, - } as unknown) as estypes.SearchResponse, - }; - }); - - const esClientMock = ({ + const esClientSearchMock = jest.fn( + ( + req: estypes.SearchRequest + ): { + body: estypes.SearchResponse; + } => { + return { + body: { + aggregations: { + latency_ranges: { buckets: [] }, + transaction_duration_correlation: { value: 0.6 }, + ks_test: { less: 0.001 }, + logspace_ranges: { buckets: [] }, + }, + } as unknown as estypes.SearchResponse, + }; + } + ); + + const esClientMock = { search: esClientSearchMock, - } as unknown) as ElasticsearchClient; + } as unknown as ElasticsearchClient; const state = latencyCorrelationsSearchServiceStateProvider(); const { addLogMessage, getLogMessages } = searchServiceLogProvider(); diff --git a/x-pack/plugins/apm/server/lib/search_strategies/queries/query_histograms_generator.ts b/x-pack/plugins/apm/server/lib/search_strategies/queries/query_histograms_generator.ts index a7f78d62d973f..d526c63c7de34 100644 --- a/x-pack/plugins/apm/server/lib/search_strategies/queries/query_histograms_generator.ts +++ b/x-pack/plugins/apm/server/lib/search_strategies/queries/query_histograms_generator.ts @@ -43,10 +43,7 @@ export async function* fetchTransactionDurationHistograms( // If one of the fields have an error // We don't want to stop the whole process try { - const { - correlation, - ksTest, - } = await fetchTransactionDurationCorrelation( + const { correlation, ksTest } = await fetchTransactionDurationCorrelation( esClient, params, expectations, diff --git a/x-pack/plugins/apm/server/lib/search_strategies/queries/query_percentiles.test.ts b/x-pack/plugins/apm/server/lib/search_strategies/queries/query_percentiles.test.ts index 1a5d518b7e47a..ce86ffd9654e6 100644 --- a/x-pack/plugins/apm/server/lib/search_strategies/queries/query_percentiles.test.ts +++ b/x-pack/plugins/apm/server/lib/search_strategies/queries/query_percentiles.test.ts @@ -84,24 +84,28 @@ describe('query_percentiles', () => { '99.0': 985.0, }; - const esClientSearchMock = jest.fn((req: estypes.SearchRequest): { - body: estypes.SearchResponse; - } => { - return { - body: ({ - hits: { total: { value: totalDocs } }, - aggregations: { - transaction_duration_percentiles: { - values: percentilesValues, + const esClientSearchMock = jest.fn( + ( + req: estypes.SearchRequest + ): { + body: estypes.SearchResponse; + } => { + return { + body: { + hits: { total: { value: totalDocs } }, + aggregations: { + transaction_duration_percentiles: { + values: percentilesValues, + }, }, - }, - } as unknown) as estypes.SearchResponse, - }; - }); + } as unknown as estypes.SearchResponse, + }; + } + ); - const esClientMock = ({ + const esClientMock = { search: esClientSearchMock, - } as unknown) as ElasticsearchClient; + } as unknown as ElasticsearchClient; const resp = await fetchTransactionDurationPercentiles( esClientMock, diff --git a/x-pack/plugins/apm/server/lib/search_strategies/queries/query_percentiles.ts b/x-pack/plugins/apm/server/lib/search_strategies/queries/query_percentiles.ts index afc2487acfbfc..70b5b70ce8912 100644 --- a/x-pack/plugins/apm/server/lib/search_strategies/queries/query_percentiles.ts +++ b/x-pack/plugins/apm/server/lib/search_strategies/queries/query_percentiles.ts @@ -72,8 +72,9 @@ export const fetchTransactionDurationPercentiles = async ( return { totalDocs: (resp.body.hits.total as estypes.SearchTotalHits).value, percentiles: - (resp.body.aggregations - .transaction_duration_percentiles as estypes.AggregationsTDigestPercentilesAggregate) - .values ?? {}, + ( + resp.body.aggregations + .transaction_duration_percentiles as estypes.AggregationsTDigestPercentilesAggregate + ).values ?? {}, }; }; diff --git a/x-pack/plugins/apm/server/lib/search_strategies/queries/query_ranges.test.ts b/x-pack/plugins/apm/server/lib/search_strategies/queries/query_ranges.test.ts index 64b746b72534a..e210eb7d41e78 100644 --- a/x-pack/plugins/apm/server/lib/search_strategies/queries/query_ranges.test.ts +++ b/x-pack/plugins/apm/server/lib/search_strategies/queries/query_ranges.test.ts @@ -109,23 +109,27 @@ describe('query_ranges', () => { }, ]; - const esClientSearchMock = jest.fn((req: estypes.SearchRequest): { - body: estypes.SearchResponse; - } => { - return { - body: ({ - aggregations: { - logspace_ranges: { - buckets: logspaceRangesBuckets, + const esClientSearchMock = jest.fn( + ( + req: estypes.SearchRequest + ): { + body: estypes.SearchResponse; + } => { + return { + body: { + aggregations: { + logspace_ranges: { + buckets: logspaceRangesBuckets, + }, }, - }, - } as unknown) as estypes.SearchResponse, - }; - }); + } as unknown as estypes.SearchResponse, + }; + } + ); - const esClientMock = ({ + const esClientMock = { search: esClientSearchMock, - } as unknown) as ElasticsearchClient; + } as unknown as ElasticsearchClient; const resp = await fetchTransactionDurationRanges( esClientMock, diff --git a/x-pack/plugins/apm/server/lib/search_strategies/queries/query_ranges.ts b/x-pack/plugins/apm/server/lib/search_strategies/queries/query_ranges.ts index 487b23e76a105..a530c997876c4 100644 --- a/x-pack/plugins/apm/server/lib/search_strategies/queries/query_ranges.ts +++ b/x-pack/plugins/apm/server/lib/search_strategies/queries/query_ranges.ts @@ -71,11 +71,13 @@ export const fetchTransactionDurationRanges = async ( ); } - return (resp.body.aggregations - .logspace_ranges as estypes.AggregationsMultiBucketAggregate<{ - from: number; - doc_count: number; - }>).buckets + return ( + resp.body.aggregations + .logspace_ranges as estypes.AggregationsMultiBucketAggregate<{ + from: number; + doc_count: number; + }> + ).buckets .map((d) => ({ key: d.from, doc_count: d.doc_count, diff --git a/x-pack/plugins/apm/server/lib/search_strategies/search_strategy_provider.test.ts b/x-pack/plugins/apm/server/lib/search_strategies/search_strategy_provider.test.ts index f1f4bf637b511..b56ab83f547ff 100644 --- a/x-pack/plugins/apm/server/lib/search_strategies/search_strategy_provider.test.ts +++ b/x-pack/plugins/apm/server/lib/search_strategies/search_strategy_provider.test.ts @@ -134,14 +134,14 @@ describe('APM Correlations search strategy', () => { mockClientFieldCaps = jest.fn(clientFieldCapsMock); mockClientSearch = jest.fn(clientSearchMock); mockGetApmIndicesMock = jest.fn(getApmIndicesMock); - mockDeps = ({ + mockDeps = { esClient: { asCurrentUser: { fieldCaps: mockClientFieldCaps, search: mockClientSearch, }, }, - } as unknown) as SearchStrategyDependencies; + } as unknown as SearchStrategyDependencies; params = { start: '2020', end: '2021', diff --git a/x-pack/plugins/apm/server/lib/search_strategies/search_strategy_provider.ts b/x-pack/plugins/apm/server/lib/search_strategies/search_strategy_provider.ts index c0376852b2505..cec10294460b0 100644 --- a/x-pack/plugins/apm/server/lib/search_strategies/search_strategy_provider.ts +++ b/x-pack/plugins/apm/server/lib/search_strategies/search_strategy_provider.ts @@ -41,9 +41,8 @@ interface SearchServiceState { rawResponse: TRawResponse; } -type GetSearchServiceState< - TRawResponse extends RawResponseBase -> = () => SearchServiceState; +type GetSearchServiceState = + () => SearchServiceState; export type SearchServiceProvider< TSearchStrategyClientParams extends SearchStrategyClientParams, diff --git a/x-pack/plugins/apm/server/lib/search_strategies/utils/compute_expectations_and_ranges.test.ts b/x-pack/plugins/apm/server/lib/search_strategies/utils/compute_expectations_and_ranges.test.ts index 8fb4ecc57e7af..523b40988d52d 100644 --- a/x-pack/plugins/apm/server/lib/search_strategies/utils/compute_expectations_and_ranges.test.ts +++ b/x-pack/plugins/apm/server/lib/search_strategies/utils/compute_expectations_and_ranges.test.ts @@ -28,17 +28,11 @@ describe('aggregation utils', () => { it('returns expectations and ranges with adjusted fractions', async () => { const { expectations, ranges } = computeExpectationsAndRanges([ - 1, - 3, - 3, - 5, + 1, 3, 3, 5, ]); expect(expectations.length).toBe(ranges.length); expect(expectations).toEqual([ - 1, - 2.333333333333333, - 3.666666666666667, - 5, + 1, 2.333333333333333, 3.666666666666667, 5, ]); expect(ranges).toEqual([ { to: 1 }, @@ -50,29 +44,12 @@ describe('aggregation utils', () => { it('returns expectation and ranges adjusted when percentiles have equal values', async () => { const { expectations, ranges } = computeExpectationsAndRanges([ - 5000, - 5000, - 3090428, - 3090428, - 3090428, - 3618812, - 3618812, - 3618812, - 3618812, - 3696636, - 3696636, - 3696636, - 3696636, - 3696636, - 3696636, + 5000, 5000, 3090428, 3090428, 3090428, 3618812, 3618812, 3618812, + 3618812, 3696636, 3696636, 3696636, 3696636, 3696636, 3696636, ]); expect(expectations.length).toBe(ranges.length); expect(expectations).toEqual([ - 5000, - 1856256.7999999998, - 3392361.714285714, - 3665506.4, - 3696636, + 5000, 1856256.7999999998, 3392361.714285714, 3665506.4, 3696636, ]); expect(ranges).toEqual([ { diff --git a/x-pack/plugins/apm/server/lib/service_map/get_service_anomalies.ts b/x-pack/plugins/apm/server/lib/service_map/get_service_anomalies.ts index 98cfc7715d6fe..f6af044582601 100644 --- a/x-pack/plugins/apm/server/lib/service_map/get_service_anomalies.ts +++ b/x-pack/plugins/apm/server/lib/service_map/get_service_anomalies.ts @@ -107,10 +107,8 @@ export async function getServiceAnomalies({ getMLJobIds(ml.anomalyDetectors, environment), ]); - const typedAnomalyResponse: ESSearchResponse< - unknown, - typeof params - > = anomalyResponse as any; + const typedAnomalyResponse: ESSearchResponse = + anomalyResponse as any; const relevantBuckets = uniqBy( sortBy( // make sure we only return data for jobs that are available in this space diff --git a/x-pack/plugins/apm/server/lib/service_map/get_service_map_from_trace_ids.ts b/x-pack/plugins/apm/server/lib/service_map/get_service_map_from_trace_ids.ts index ed99f1909ab07..7915f18922303 100644 --- a/x-pack/plugins/apm/server/lib/service_map/get_service_map_from_trace_ids.ts +++ b/x-pack/plugins/apm/server/lib/service_map/get_service_map_from_trace_ids.ts @@ -46,10 +46,8 @@ export async function getServiceMapFromTraceIds({ setup: Setup & SetupTimeRange; traceIds: string[]; }) { - const serviceMapFromTraceIdsScriptResponse = await fetchServicePathsFromTraceIds( - setup, - traceIds - ); + const serviceMapFromTraceIdsScriptResponse = + await fetchServicePathsFromTraceIds(setup, traceIds); const serviceMapScriptedAggValue = serviceMapFromTraceIdsScriptResponse.aggregations?.service_map.value; diff --git a/x-pack/plugins/apm/server/lib/service_map/get_service_map_service_node_info.test.ts b/x-pack/plugins/apm/server/lib/service_map/get_service_map_service_node_info.test.ts index 542d240b1cd1b..e9d163432ef9a 100644 --- a/x-pack/plugins/apm/server/lib/service_map/get_service_map_service_node_info.test.ts +++ b/x-pack/plugins/apm/server/lib/service_map/get_service_map_service_node_info.test.ts @@ -13,7 +13,7 @@ import { ENVIRONMENT_ALL } from '../../../common/environment_filter_values'; describe('getServiceMapServiceNodeInfo', () => { describe('with no results', () => { it('returns null data', async () => { - const setup = ({ + const setup = { apmEventClient: { search: () => Promise.resolve({ @@ -22,7 +22,7 @@ describe('getServiceMapServiceNodeInfo', () => { }, indices: {}, uiFilters: {}, - } as unknown) as Setup & SetupTimeRange; + } as unknown as Setup & SetupTimeRange; const serviceName = 'test service name'; const result = await getServiceMapServiceNodeInfo({ environment: 'test environment', @@ -51,7 +51,7 @@ describe('getServiceMapServiceNodeInfo', () => { noHits: false, }); - const setup = ({ + const setup = { apmEventClient: { search: () => Promise.resolve({ @@ -72,7 +72,7 @@ describe('getServiceMapServiceNodeInfo', () => { 'xpack.apm.metricsInterval': 30, }, uiFilters: { environment: 'test environment' }, - } as unknown) as Setup & SetupTimeRange; + } as unknown as Setup & SetupTimeRange; const serviceName = 'test service name'; const result = await getServiceMapServiceNodeInfo({ setup, diff --git a/x-pack/plugins/apm/server/lib/service_map/get_service_map_service_node_info.ts b/x-pack/plugins/apm/server/lib/service_map/get_service_map_service_node_info.ts index f74c68be1c8cc..21cea9bfc87fe 100644 --- a/x-pack/plugins/apm/server/lib/service_map/get_service_map_service_node_info.ts +++ b/x-pack/plugins/apm/server/lib/service_map/get_service_map_service_node_info.ts @@ -75,17 +75,13 @@ export function getServiceMapServiceNodeInfo({ setup, }; - const [ - errorStats, - transactionStats, - cpuStats, - memoryStats, - ] = await Promise.all([ - getErrorStats(taskParams), - getTransactionStats(taskParams), - getCpuStats(taskParams), - getMemoryStats(taskParams), - ]); + const [errorStats, transactionStats, cpuStats, memoryStats] = + await Promise.all([ + getErrorStats(taskParams), + getTransactionStats(taskParams), + getCpuStats(taskParams), + getMemoryStats(taskParams), + ]); return { ...errorStats, transactionStats, diff --git a/x-pack/plugins/apm/server/lib/service_map/transform_service_map_responses.ts b/x-pack/plugins/apm/server/lib/service_map/transform_service_map_responses.ts index f29c7c9da97a5..0cdbdc26c69df 100644 --- a/x-pack/plugins/apm/server/lib/service_map/transform_service_map_responses.ts +++ b/x-pack/plugins/apm/server/lib/service_map/transform_service_map_responses.ts @@ -194,11 +194,13 @@ export function transformServiceMapResponses(response: ServiceMapResponse) { // Instead of adding connections in two directions, // we add a `bidirectional` flag to use in styling - const dedupedConnections = (sortBy( - Object.values(connectionsById), - // make sure that order is stable - 'id' - ) as ConnectionWithId[]).reduce< + const dedupedConnections = ( + sortBy( + Object.values(connectionsById), + // make sure that order is stable + 'id' + ) as ConnectionWithId[] + ).reduce< Array< ConnectionWithId & { bidirectional?: boolean; isInverseEdge?: boolean } > diff --git a/x-pack/plugins/apm/server/lib/services/annotations/get_stored_annotations.ts b/x-pack/plugins/apm/server/lib/services/annotations/get_stored_annotations.ts index e811031fdddd8..6a1012a816c76 100644 --- a/x-pack/plugins/apm/server/lib/services/annotations/get_stored_annotations.ts +++ b/x-pack/plugins/apm/server/lib/services/annotations/get_stored_annotations.ts @@ -55,15 +55,13 @@ export function getStoredAnnotations({ }; try { - const response: ESSearchResponse< - ESAnnotation, - { body: typeof body } - > = await (unwrapEsResponse( - client.search({ - index: annotationsClient.index, - body, - }) - ) as any); + const response: ESSearchResponse = + await (unwrapEsResponse( + client.search({ + index: annotationsClient.index, + body, + }) + ) as any); return response.hits.hits.map((hit) => { return { diff --git a/x-pack/plugins/apm/server/lib/services/annotations/index.test.ts b/x-pack/plugins/apm/server/lib/services/annotations/index.test.ts index 6d65c971baa33..8d64e84844d5a 100644 --- a/x-pack/plugins/apm/server/lib/services/annotations/index.test.ts +++ b/x-pack/plugins/apm/server/lib/services/annotations/index.test.ts @@ -95,7 +95,7 @@ describe('getServiceAnnotations', () => { }), { mockResponse: () => - (responses.shift() as unknown) as ESSearchResponse< + responses.shift() as unknown as ESSearchResponse< unknown, ESSearchRequest, { diff --git a/x-pack/plugins/apm/server/lib/services/get_service_error_groups/index.ts b/x-pack/plugins/apm/server/lib/services/get_service_error_groups/index.ts index fc4dc44b259f6..087d0408ebf3e 100644 --- a/x-pack/plugins/apm/server/lib/services/get_service_error_groups/index.ts +++ b/x-pack/plugins/apm/server/lib/services/get_service_error_groups/index.ts @@ -87,11 +87,11 @@ export async function getServiceErrorGroups({ sample: { top_hits: { size: 1, - _source: ([ + _source: [ ERROR_LOG_MESSAGE, ERROR_EXC_MESSAGE, '@timestamp', - ] as any) as string, + ] as any as string, sort: { '@timestamp': 'desc', }, diff --git a/x-pack/plugins/apm/server/lib/services/get_services/get_services_items.ts b/x-pack/plugins/apm/server/lib/services/get_services/get_services_items.ts index 0f8405b241b5a..41f43d4b1499c 100644 --- a/x-pack/plugins/apm/server/lib/services/get_services/get_services_items.ts +++ b/x-pack/plugins/apm/server/lib/services/get_services/get_services_items.ts @@ -39,18 +39,15 @@ export async function getServicesItems({ maxNumServices: MAX_NUMBER_OF_SERVICES, }; - const [ - transactionStats, - servicesFromMetricDocuments, - healthStatuses, - ] = await Promise.all([ - getServiceTransactionStats(params), - getServicesFromMetricDocuments(params), - getHealthStatuses(params).catch((err) => { - logger.error(err); - return []; - }), - ]); + const [transactionStats, servicesFromMetricDocuments, healthStatuses] = + await Promise.all([ + getServiceTransactionStats(params), + getServicesFromMetricDocuments(params), + getHealthStatuses(params).catch((err) => { + logger.error(err); + return []; + }), + ]); return mergeServiceStats({ transactionStats, diff --git a/x-pack/plugins/apm/server/lib/settings/agent_configuration/convert_settings_to_string.ts b/x-pack/plugins/apm/server/lib/settings/agent_configuration/convert_settings_to_string.ts index 3ec10f6bf0c63..e5f6b36789302 100644 --- a/x-pack/plugins/apm/server/lib/settings/agent_configuration/convert_settings_to_string.ts +++ b/x-pack/plugins/apm/server/lib/settings/agent_configuration/convert_settings_to_string.ts @@ -16,11 +16,13 @@ export function convertConfigSettingsToString( const config = hit._source; if (config.settings?.transaction_sample_rate) { - config.settings.transaction_sample_rate = config.settings.transaction_sample_rate.toString(); + config.settings.transaction_sample_rate = + config.settings.transaction_sample_rate.toString(); } if (config.settings?.transaction_max_spans) { - config.settings.transaction_max_spans = config.settings.transaction_max_spans.toString(); + config.settings.transaction_max_spans = + config.settings.transaction_max_spans.toString(); } return hit; diff --git a/x-pack/plugins/apm/server/lib/settings/apm_indices/save_apm_indices.test.ts b/x-pack/plugins/apm/server/lib/settings/apm_indices/save_apm_indices.test.ts index 653794fffd176..bce6857aa4ff2 100644 --- a/x-pack/plugins/apm/server/lib/settings/apm_indices/save_apm_indices.test.ts +++ b/x-pack/plugins/apm/server/lib/settings/apm_indices/save_apm_indices.test.ts @@ -10,9 +10,9 @@ import { SavedObjectsClientContract } from '../../../../../../../src/core/server describe('saveApmIndices', () => { it('should trim and strip empty settings', async () => { - const savedObjectsClient = ({ + const savedObjectsClient = { create: jest.fn(), - } as unknown) as SavedObjectsClientContract; + } as unknown as SavedObjectsClientContract; const apmIndices = { settingA: 'aa', diff --git a/x-pack/plugins/apm/server/lib/settings/custom_link/create_or_update_custom_link.test.ts b/x-pack/plugins/apm/server/lib/settings/custom_link/create_or_update_custom_link.test.ts index 051b9e2809e49..1cec38ad4af69 100644 --- a/x-pack/plugins/apm/server/lib/settings/custom_link/create_or_update_custom_link.test.ts +++ b/x-pack/plugins/apm/server/lib/settings/custom_link/create_or_update_custom_link.test.ts @@ -12,23 +12,23 @@ import { createOrUpdateCustomLink } from './create_or_update_custom_link'; describe('Create or Update Custom link', () => { const internalClientIndexMock = jest.fn(); - const mockedSetup = ({ + const mockedSetup = { internalClient: { index: internalClientIndexMock, }, indices: { apmCustomLinkIndex: 'apmCustomLinkIndex', }, - } as unknown) as Setup; + } as unknown as Setup; - const customLink = ({ + const customLink = { label: 'foo', url: 'http://elastic.com/{{trace.id}}', filters: [ { key: 'service.name', value: 'opbeans-java' }, { key: 'transaction.type', value: 'Request' }, ], - } as unknown) as CustomLink; + } as unknown as CustomLink; afterEach(() => { internalClientIndexMock.mockClear(); }); diff --git a/x-pack/plugins/apm/server/lib/settings/custom_link/get_transaction.test.ts b/x-pack/plugins/apm/server/lib/settings/custom_link/get_transaction.test.ts index dc12ac2852543..03d0120b0043b 100644 --- a/x-pack/plugins/apm/server/lib/settings/custom_link/get_transaction.test.ts +++ b/x-pack/plugins/apm/server/lib/settings/custom_link/get_transaction.test.ts @@ -23,7 +23,7 @@ describe('custom link get transaction', () => { it('fetches without filter', async () => { mock = await inspectSearchParams((setup) => getTransaction({ - setup: (setup as unknown) as Setup, + setup: setup as unknown as Setup, }) ); @@ -32,7 +32,7 @@ describe('custom link get transaction', () => { it('fetches with all filter', async () => { mock = await inspectSearchParams((setup) => getTransaction({ - setup: (setup as unknown) as Setup, + setup: setup as unknown as Setup, filters: { [SERVICE_NAME]: 'foo', [SERVICE_ENVIRONMENT]: 'bar', diff --git a/x-pack/plugins/apm/server/lib/settings/custom_link/list_custom_links.test.ts b/x-pack/plugins/apm/server/lib/settings/custom_link/list_custom_links.test.ts index 2029652d6fbf3..844f886c21a46 100644 --- a/x-pack/plugins/apm/server/lib/settings/custom_link/list_custom_links.test.ts +++ b/x-pack/plugins/apm/server/lib/settings/custom_link/list_custom_links.test.ts @@ -22,7 +22,7 @@ describe('List Custom Links', () => { it('fetches all custom links', async () => { mock = await inspectSearchParams((setup) => listCustomLinks({ - setup: (setup as unknown) as Setup, + setup: setup as unknown as Setup, }) ); @@ -37,7 +37,7 @@ describe('List Custom Links', () => { mock = await inspectSearchParams((setup) => listCustomLinks({ filters, - setup: (setup as unknown) as Setup, + setup: setup as unknown as Setup, }) ); diff --git a/x-pack/plugins/apm/server/lib/transaction_groups/fetcher.ts b/x-pack/plugins/apm/server/lib/transaction_groups/fetcher.ts index 75c14b4ffc503..b7b9355bf9d92 100644 --- a/x-pack/plugins/apm/server/lib/transaction_groups/fetcher.ts +++ b/x-pack/plugins/apm/server/lib/transaction_groups/fetcher.ts @@ -63,12 +63,8 @@ function getRequest( ) { const { start, end } = setup; - const { - searchAggregatedTransactions, - environment, - kuery, - transactionName, - } = topTraceOptions; + const { searchAggregatedTransactions, environment, kuery, transactionName } = + topTraceOptions; const transactionNameFilter = transactionName ? [{ term: { [TRANSACTION_NAME]: transactionName } }] diff --git a/x-pack/plugins/apm/server/lib/transaction_groups/mock_responses/transaction_groups_response.ts b/x-pack/plugins/apm/server/lib/transaction_groups/mock_responses/transaction_groups_response.ts index 25e343c90f83a..1ec8d7cd76ca3 100644 --- a/x-pack/plugins/apm/server/lib/transaction_groups/mock_responses/transaction_groups_response.ts +++ b/x-pack/plugins/apm/server/lib/transaction_groups/mock_responses/transaction_groups_response.ts @@ -7,7 +7,7 @@ import { ESResponse } from '../fetcher'; -export const transactionGroupsResponse = ({ +export const transactionGroupsResponse = { took: 139, timed_out: false, _shards: { total: 44, successful: 44, skipped: 0, failed: 0 }, @@ -1154,8 +1154,7 @@ export const transactionGroupsResponse = ({ url: { port: '3000', pathname: '/api/products/2/customers', - full: - 'http://opbeans-node:3000/api/products/2/customers', + full: 'http://opbeans-node:3000/api/products/2/customers', raw: '/api/products/2/customers', protocol: 'http:', hostname: 'opbeans-node', @@ -2721,4 +2720,4 @@ export const transactionGroupsResponse = ({ ], }, }, -} as unknown) as ESResponse; +} as unknown as ESResponse; diff --git a/x-pack/plugins/apm/server/lib/transactions/get_anomaly_data/fetcher.ts b/x-pack/plugins/apm/server/lib/transactions/get_anomaly_data/fetcher.ts index 95cca0081e5ba..a61e0614f5b1a 100644 --- a/x-pack/plugins/apm/server/lib/transactions/get_anomaly_data/fetcher.ts +++ b/x-pack/plugins/apm/server/lib/transactions/get_anomaly_data/fetcher.ts @@ -82,7 +82,7 @@ export function anomalySeriesFetcher({ }, }; - return (ml.mlSystem.mlAnomalySearch(params, []) as unknown) as Promise< + return ml.mlSystem.mlAnomalySearch(params, []) as unknown as Promise< ESSearchResponse >; }); diff --git a/x-pack/plugins/apm/server/lib/transactions/get_anomaly_data/index.ts b/x-pack/plugins/apm/server/lib/transactions/get_anomaly_data/index.ts index 73294a0bd1233..0b0892febf660 100644 --- a/x-pack/plugins/apm/server/lib/transactions/get_anomaly_data/index.ts +++ b/x-pack/plugins/apm/server/lib/transactions/get_anomaly_data/index.ts @@ -77,50 +77,51 @@ export async function getAnomalySeries({ getMLJobIds(ml.anomalyDetectors, environment), ]); - const scoreSeriesCollection = anomaliesResponse?.aggregations?.job_id.buckets - .filter((bucket) => jobIds.includes(bucket.key as string)) - .map((bucket) => { - const dateBuckets = bucket.ml_avg_response_times.buckets; - - return { - jobId: bucket.key as string, - anomalyScore: compact( - dateBuckets.map((dateBucket) => { - const metrics = maybe(dateBucket.anomaly_score.top[0])?.metrics; - const score = metrics?.record_score; - - if ( - !metrics || - !isFiniteNumber(score) || - score < ANOMALY_THRESHOLD.CRITICAL - ) { - return null; - } - - const anomalyStart = Date.parse(metrics.timestamp as string); - const anomalyEnd = - anomalyStart + (metrics.bucket_span as number) * 1000; - - return { - x0: anomalyStart, - x: anomalyEnd, - y: score, - }; - }) - ), - anomalyBoundaries: dateBuckets - .filter( - (dateBucket) => - dateBucket.lower.value !== null && - dateBucket.upper.value !== null - ) - .map((dateBucket) => ({ - x: dateBucket.key, - y0: dateBucket.lower.value as number, - y: dateBucket.upper.value as number, - })), - }; - }); + const scoreSeriesCollection = + anomaliesResponse?.aggregations?.job_id.buckets + .filter((bucket) => jobIds.includes(bucket.key as string)) + .map((bucket) => { + const dateBuckets = bucket.ml_avg_response_times.buckets; + + return { + jobId: bucket.key as string, + anomalyScore: compact( + dateBuckets.map((dateBucket) => { + const metrics = maybe(dateBucket.anomaly_score.top[0])?.metrics; + const score = metrics?.record_score; + + if ( + !metrics || + !isFiniteNumber(score) || + score < ANOMALY_THRESHOLD.CRITICAL + ) { + return null; + } + + const anomalyStart = Date.parse(metrics.timestamp as string); + const anomalyEnd = + anomalyStart + (metrics.bucket_span as number) * 1000; + + return { + x0: anomalyStart, + x: anomalyEnd, + y: score, + }; + }) + ), + anomalyBoundaries: dateBuckets + .filter( + (dateBucket) => + dateBucket.lower.value !== null && + dateBucket.upper.value !== null + ) + .map((dateBucket) => ({ + x: dateBucket.key, + y0: dateBucket.lower.value as number, + y: dateBucket.upper.value as number, + })), + }; + }); if ((scoreSeriesCollection?.length ?? 0) > 1) { logger.warn( diff --git a/x-pack/plugins/apm/server/lib/transactions/get_latency_charts/index.ts b/x-pack/plugins/apm/server/lib/transactions/get_latency_charts/index.ts index c2fd718fbc95c..e532240f49e21 100644 --- a/x-pack/plugins/apm/server/lib/transactions/get_latency_charts/index.ts +++ b/x-pack/plugins/apm/server/lib/transactions/get_latency_charts/index.ts @@ -79,9 +79,10 @@ function searchLatency({ filter.push({ term: { [TRANSACTION_TYPE]: transactionType } }); } - const transactionDurationField = getTransactionDurationFieldForAggregatedTransactions( - searchAggregatedTransactions - ); + const transactionDurationField = + getTransactionDurationFieldForAggregatedTransactions( + searchAggregatedTransactions + ); const params = { apm: { @@ -219,7 +220,8 @@ export async function getLatencyPeriods({ ...options, start: comparisonStart, end: comparisonEnd, - latencyAggregationType: latencyAggregationType as LatencyAggregationType, + latencyAggregationType: + latencyAggregationType as LatencyAggregationType, }) : { latencyTimeseries: [], overallAvgDuration: null }; diff --git a/x-pack/plugins/apm/server/plugin.ts b/x-pack/plugins/apm/server/plugin.ts index 1c6d1cdef37ca..56185d846562f 100644 --- a/x-pack/plugins/apm/server/plugin.ts +++ b/x-pack/plugins/apm/server/plugin.ts @@ -59,7 +59,8 @@ export class APMPlugin void, APMPluginSetupDependencies, APMPluginStartDependencies - > { + > +{ private currentConfig?: APMConfig; private logger?: Logger; constructor(private readonly initContext: PluginInitializerContext) { @@ -168,9 +169,10 @@ export class APMPlugin ); }); - const telemetryUsageCounter = resourcePlugins.usageCollection?.setup.createUsageCounter( - APM_SERVER_FEATURE_ID - ); + const telemetryUsageCounter = + resourcePlugins.usageCollection?.setup.createUsageCounter( + APM_SERVER_FEATURE_ID + ); registerRoutes({ core: { diff --git a/x-pack/plugins/apm/server/projections/util/merge_projection/index.ts b/x-pack/plugins/apm/server/projections/util/merge_projection/index.ts index fb2d981dd4a1f..992f47c9c1066 100644 --- a/x-pack/plugins/apm/server/projections/util/merge_projection/index.ts +++ b/x-pack/plugins/apm/server/projections/util/merge_projection/index.ts @@ -16,12 +16,11 @@ type SourceProjection = DeepPartial; type DeepMerge = U extends PlainObject ? T extends PlainObject - ? Omit & - { - [key in keyof U]: T extends { [k in key]: any } - ? DeepMerge - : U[key]; - } + ? Omit & { + [key in keyof U]: T extends { [k in key]: any } + ? DeepMerge + : U[key]; + } : U : U; diff --git a/x-pack/plugins/apm/server/routes/alerts/chart_preview.ts b/x-pack/plugins/apm/server/routes/alerts/chart_preview.ts index c28bca5048350..012cf304aa3ce 100644 --- a/x-pack/plugins/apm/server/routes/alerts/chart_preview.ts +++ b/x-pack/plugins/apm/server/routes/alerts/chart_preview.ts @@ -90,8 +90,9 @@ const transactionDurationChartPreview = createApmServerRoute({ }, }); -export const alertsChartPreviewRouteRepository = createApmServerRouteRepository() - .add(transactionErrorRateChartPreview) - .add(transactionDurationChartPreview) - .add(transactionErrorCountChartPreview) - .add(transactionDurationChartPreview); +export const alertsChartPreviewRouteRepository = + createApmServerRouteRepository() + .add(transactionErrorRateChartPreview) + .add(transactionDurationChartPreview) + .add(transactionErrorCountChartPreview) + .add(transactionDurationChartPreview); diff --git a/x-pack/plugins/apm/server/routes/environments.ts b/x-pack/plugins/apm/server/routes/environments.ts index b9d44de681572..f26734db5854c 100644 --- a/x-pack/plugins/apm/server/routes/environments.ts +++ b/x-pack/plugins/apm/server/routes/environments.ts @@ -46,6 +46,5 @@ const environmentsRoute = createApmServerRoute({ }, }); -export const environmentsRouteRepository = createApmServerRouteRepository().add( - environmentsRoute -); +export const environmentsRouteRepository = + createApmServerRouteRepository().add(environmentsRoute); diff --git a/x-pack/plugins/apm/server/routes/fallback_to_transactions.ts b/x-pack/plugins/apm/server/routes/fallback_to_transactions.ts index 2c89893ea87f5..f25b63d792f79 100644 --- a/x-pack/plugins/apm/server/routes/fallback_to_transactions.ts +++ b/x-pack/plugins/apm/server/routes/fallback_to_transactions.ts @@ -34,6 +34,5 @@ const fallbackToTransactionsRoute = createApmServerRoute({ }, }); -export const fallbackToTransactionsRouteRepository = createApmServerRouteRepository().add( - fallbackToTransactionsRoute -); +export const fallbackToTransactionsRouteRepository = + createApmServerRouteRepository().add(fallbackToTransactionsRoute); diff --git a/x-pack/plugins/apm/server/routes/fleet.ts b/x-pack/plugins/apm/server/routes/fleet.ts index afe18b33c4822..5bfbfef5e6800 100644 --- a/x-pack/plugins/apm/server/routes/fleet.ts +++ b/x-pack/plugins/apm/server/routes/fleet.ts @@ -165,8 +165,9 @@ const createCloudApmPackagePolicyRoute = createApmServerRoute({ } const savedObjectsClient = context.core.savedObjects.client; const coreStart = await resources.core.start(); - const esClient = coreStart.elasticsearch.client.asScoped(resources.request) - .asCurrentUser; + const esClient = coreStart.elasticsearch.client.asScoped( + resources.request + ).asCurrentUser; const cloudPluginSetup = plugins.cloud?.setup; const fleetPluginStart = await plugins.fleet.start(); const securityPluginStart = await plugins.security.start(); diff --git a/x-pack/plugins/apm/server/routes/historical_data/index.ts b/x-pack/plugins/apm/server/routes/historical_data/index.ts index 6e574a435bc83..be3fd29d14b9d 100644 --- a/x-pack/plugins/apm/server/routes/historical_data/index.ts +++ b/x-pack/plugins/apm/server/routes/historical_data/index.ts @@ -20,6 +20,5 @@ const hasDataRoute = createApmServerRoute({ }, }); -export const historicalDataRouteRepository = createApmServerRouteRepository().add( - hasDataRoute -); +export const historicalDataRouteRepository = + createApmServerRouteRepository().add(hasDataRoute); diff --git a/x-pack/plugins/apm/server/routes/metrics.ts b/x-pack/plugins/apm/server/routes/metrics.ts index 9fa2346eb72fb..f19b7b0afc4c9 100644 --- a/x-pack/plugins/apm/server/routes/metrics.ts +++ b/x-pack/plugins/apm/server/routes/metrics.ts @@ -47,6 +47,5 @@ const metricsChartsRoute = createApmServerRoute({ }, }); -export const metricsRouteRepository = createApmServerRouteRepository().add( - metricsChartsRoute -); +export const metricsRouteRepository = + createApmServerRouteRepository().add(metricsChartsRoute); diff --git a/x-pack/plugins/apm/server/routes/observability_overview.ts b/x-pack/plugins/apm/server/routes/observability_overview.ts index 838bc3a1f5c68..675d6bebcbefc 100644 --- a/x-pack/plugins/apm/server/routes/observability_overview.ts +++ b/x-pack/plugins/apm/server/routes/observability_overview.ts @@ -60,6 +60,7 @@ const observabilityOverviewRoute = createApmServerRoute({ }, }); -export const observabilityOverviewRouteRepository = createApmServerRouteRepository() - .add(observabilityOverviewRoute) - .add(observabilityOverviewHasDataRoute); +export const observabilityOverviewRouteRepository = + createApmServerRouteRepository() + .add(observabilityOverviewRoute) + .add(observabilityOverviewHasDataRoute); diff --git a/x-pack/plugins/apm/server/routes/register_routes/index.test.ts b/x-pack/plugins/apm/server/routes/register_routes/index.test.ts index b748d187c5e47..6cee6d8cad920 100644 --- a/x-pack/plugins/apm/server/routes/register_routes/index.test.ts +++ b/x-pack/plugins/apm/server/routes/register_routes/index.test.ts @@ -26,15 +26,15 @@ const getRegisterRouteDependencies = () => { put, }); - const coreSetup = ({ + const coreSetup = { http: { createRouter, }, - } as unknown) as CoreSetup; + } as unknown as CoreSetup; - const logger = ({ + const logger = { error: jest.fn(), - } as unknown) as Logger; + } as unknown as Logger; return { mocks: { @@ -45,14 +45,14 @@ const getRegisterRouteDependencies = () => { coreSetup, logger, }, - dependencies: ({ + dependencies: { core: { setup: coreSetup, }, logger, config: {} as APMConfig, plugins: {}, - } as unknown) as RegisterRouteDependencies, + } as unknown as RegisterRouteDependencies, }; }; diff --git a/x-pack/plugins/apm/server/routes/register_routes/index.ts b/x-pack/plugins/apm/server/routes/register_routes/index.ts index c660489485505..fb1d67ad30c2b 100644 --- a/x-pack/plugins/apm/server/routes/register_routes/index.ts +++ b/x-pack/plugins/apm/server/routes/register_routes/index.ts @@ -67,10 +67,12 @@ export function registerRoutes({ const { method, pathname } = parseEndpoint(endpoint); - (router[method] as RouteRegistrar< - typeof method, - ApmPluginRequestHandlerContext - >)( + ( + router[method] as RouteRegistrar< + typeof method, + ApmPluginRequestHandlerContext + > + )( { path: pathname, options, diff --git a/x-pack/plugins/apm/server/routes/service_nodes.ts b/x-pack/plugins/apm/server/routes/service_nodes.ts index af5d8b7591d5f..0a0e8a49908dc 100644 --- a/x-pack/plugins/apm/server/routes/service_nodes.ts +++ b/x-pack/plugins/apm/server/routes/service_nodes.ts @@ -38,6 +38,5 @@ const serviceNodesRoute = createApmServerRoute({ }, }); -export const serviceNodeRouteRepository = createApmServerRouteRepository().add( - serviceNodesRoute -); +export const serviceNodeRouteRepository = + createApmServerRouteRepository().add(serviceNodesRoute); diff --git a/x-pack/plugins/apm/server/routes/services.ts b/x-pack/plugins/apm/server/routes/services.ts index 550781cc1a020..e0b311f2c3dfb 100644 --- a/x-pack/plugins/apm/server/routes/services.ts +++ b/x-pack/plugins/apm/server/routes/services.ts @@ -474,14 +474,12 @@ const serviceThroughputRoute = createApmServerRoute({ }); const { start, end } = setup; - const { - bucketSize, - intervalString, - } = getBucketSizeForAggregatedTransactions({ - start, - end, - searchAggregatedTransactions, - }); + const { bucketSize, intervalString } = + getBucketSizeForAggregatedTransactions({ + start, + end, + searchAggregatedTransactions, + }); const throughputUnit = getThroughputUnit(bucketSize); diff --git a/x-pack/plugins/apm/server/routes/settings/agent_configuration.ts b/x-pack/plugins/apm/server/routes/settings/agent_configuration.ts index 71413cc757538..b23dc88814137 100644 --- a/x-pack/plugins/apm/server/routes/settings/agent_configuration.ts +++ b/x-pack/plugins/apm/server/routes/settings/agent_configuration.ts @@ -301,12 +301,13 @@ const agentConfigurationAgentNameRoute = createApmServerRoute({ }, }); -export const agentConfigurationRouteRepository = createApmServerRouteRepository() - .add(agentConfigurationRoute) - .add(getSingleAgentConfigurationRoute) - .add(deleteAgentConfigurationRoute) - .add(createOrUpdateAgentConfigurationRoute) - .add(agentConfigurationSearchRoute) - .add(listAgentConfigurationServicesRoute) - .add(listAgentConfigurationEnvironmentsRoute) - .add(agentConfigurationAgentNameRoute); +export const agentConfigurationRouteRepository = + createApmServerRouteRepository() + .add(agentConfigurationRoute) + .add(getSingleAgentConfigurationRoute) + .add(deleteAgentConfigurationRoute) + .add(createOrUpdateAgentConfigurationRoute) + .add(agentConfigurationSearchRoute) + .add(listAgentConfigurationServicesRoute) + .add(listAgentConfigurationEnvironmentsRoute) + .add(agentConfigurationAgentNameRoute); diff --git a/x-pack/plugins/apm/server/routes/source_maps.ts b/x-pack/plugins/apm/server/routes/source_maps.ts index 6a455eca1258f..e0f872239b623 100644 --- a/x-pack/plugins/apm/server/routes/source_maps.ts +++ b/x-pack/plugins/apm/server/routes/source_maps.ts @@ -98,7 +98,8 @@ const uploadSourceMapRoute = createApmServerRoute({ await updateSourceMapsOnFleetPolicies({ core, fleetPluginStart, - savedObjectsClient: (savedObjectsClient as unknown) as SavedObjectsClientContract, + savedObjectsClient: + savedObjectsClient as unknown as SavedObjectsClientContract, elasticsearchClient: esClient, }); @@ -133,7 +134,8 @@ const deleteSourceMapRoute = createApmServerRoute({ await updateSourceMapsOnFleetPolicies({ core, fleetPluginStart, - savedObjectsClient: (savedObjectsClient as unknown) as SavedObjectsClientContract, + savedObjectsClient: + savedObjectsClient as unknown as SavedObjectsClientContract, elasticsearchClient: esClient, }); } diff --git a/x-pack/plugins/apm/server/routes/transactions.ts b/x-pack/plugins/apm/server/routes/transactions.ts index c267487cd36b7..ac31caacc920c 100644 --- a/x-pack/plugins/apm/server/routes/transactions.ts +++ b/x-pack/plugins/apm/server/routes/transactions.ts @@ -179,22 +179,21 @@ const transactionLatencyChartsRoute = createApmServerRoute({ logger, }; - const [ - { currentPeriod, previousPeriod }, - anomalyTimeseries, - ] = await Promise.all([ - getLatencyPeriods({ - ...options, - latencyAggregationType: latencyAggregationType as LatencyAggregationType, - comparisonStart, - comparisonEnd, - }), - getAnomalySeries(options).catch((error) => { - logger.warn(`Unable to retrieve anomalies for latency charts.`); - logger.error(error); - return undefined; - }), - ]); + const [{ currentPeriod, previousPeriod }, anomalyTimeseries] = + await Promise.all([ + getLatencyPeriods({ + ...options, + latencyAggregationType: + latencyAggregationType as LatencyAggregationType, + comparisonStart, + comparisonEnd, + }), + getAnomalySeries(options).catch((error) => { + logger.warn(`Unable to retrieve anomalies for latency charts.`); + logger.error(error); + return undefined; + }), + ]); return { currentPeriod, @@ -277,12 +276,8 @@ const transactionChartsBreakdownRoute = createApmServerRoute({ const { params } = resources; const { serviceName } = params.path; - const { - environment, - kuery, - transactionName, - transactionType, - } = params.query; + const { environment, kuery, transactionName, transactionType } = + params.query; return getTransactionBreakdown({ environment, diff --git a/x-pack/plugins/apm/server/tutorial/index.ts b/x-pack/plugins/apm/server/tutorial/index.ts index 78dd1110e7c62..4c99cce241170 100644 --- a/x-pack/plugins/apm/server/tutorial/index.ts +++ b/x-pack/plugins/apm/server/tutorial/index.ts @@ -26,93 +26,95 @@ const apmIntro = i18n.translate('xpack.apm.tutorial.introduction', { }); const moduleName = 'apm'; -export const tutorialProvider = ({ - apmConfig, - apmIndices, - cloud, - isFleetPluginEnabled, -}: { - apmConfig: APMConfig; - apmIndices: ApmIndicesConfig; - cloud?: CloudSetup; - isFleetPluginEnabled: boolean; -}) => () => { - const indexPatternTitle = getApmIndexPatternTitle(apmIndices); +export const tutorialProvider = + ({ + apmConfig, + apmIndices, + cloud, + isFleetPluginEnabled, + }: { + apmConfig: APMConfig; + apmIndices: ApmIndicesConfig; + cloud?: CloudSetup; + isFleetPluginEnabled: boolean; + }) => + () => { + const indexPatternTitle = getApmIndexPatternTitle(apmIndices); - const savedObjects = [ - { - ...apmIndexPattern, - id: APM_STATIC_INDEX_PATTERN_ID, - attributes: { - ...apmIndexPattern.attributes, - title: indexPatternTitle, + const savedObjects = [ + { + ...apmIndexPattern, + id: APM_STATIC_INDEX_PATTERN_ID, + attributes: { + ...apmIndexPattern.attributes, + title: indexPatternTitle, + }, }, - }, - ]; + ]; - const artifacts: ArtifactsSchema = { - dashboards: [ - { - id: '8d3ed660-7828-11e7-8c47-65b845b5cfb3', - linkLabel: i18n.translate( - 'xpack.apm.tutorial.specProvider.artifacts.dashboards.linkLabel', + const artifacts: ArtifactsSchema = { + dashboards: [ + { + id: '8d3ed660-7828-11e7-8c47-65b845b5cfb3', + linkLabel: i18n.translate( + 'xpack.apm.tutorial.specProvider.artifacts.dashboards.linkLabel', + { + defaultMessage: 'APM dashboard', + } + ), + isOverview: true, + }, + ], + }; + + if (apmConfig['xpack.apm.ui.enabled']) { + // @ts-expect-error artifacts.application is readonly + artifacts.application = { + path: '/app/apm', + label: i18n.translate( + 'xpack.apm.tutorial.specProvider.artifacts.application.label', { - defaultMessage: 'APM dashboard', + defaultMessage: 'Launch APM', } ), - isOverview: true, - }, - ], - }; + }; + } - if (apmConfig['xpack.apm.ui.enabled']) { - // @ts-expect-error artifacts.application is readonly - artifacts.application = { - path: '/app/apm', - label: i18n.translate( - 'xpack.apm.tutorial.specProvider.artifacts.application.label', + return { + id: 'apm', + name: i18n.translate('xpack.apm.tutorial.specProvider.name', { + defaultMessage: 'APM', + }), + moduleName, + category: TutorialsCategory.OTHER, + shortDescription: apmIntro, + longDescription: i18n.translate( + 'xpack.apm.tutorial.specProvider.longDescription', { - defaultMessage: 'Launch APM', - } - ), - }; - } - - return { - id: 'apm', - name: i18n.translate('xpack.apm.tutorial.specProvider.name', { - defaultMessage: 'APM', - }), - moduleName, - category: TutorialsCategory.OTHER, - shortDescription: apmIntro, - longDescription: i18n.translate( - 'xpack.apm.tutorial.specProvider.longDescription', - { - defaultMessage: - 'Application Performance Monitoring (APM) collects in-depth \ + defaultMessage: + 'Application Performance Monitoring (APM) collects in-depth \ performance metrics and errors from inside your application. \ It allows you to monitor the performance of thousands of applications in real time. \ [Learn more]({learnMoreLink}).', - values: { - learnMoreLink: - '{config.docs.base_url}guide/en/apm/get-started/{config.docs.version}/index.html', - }, - } - ), - euiIconType: 'apmApp', - artifacts, - customStatusCheckName: 'apm_fleet_server_status_check', - onPrem: onPremInstructions({ apmConfig, isFleetPluginEnabled }), - elasticCloud: createElasticCloudInstructions(cloud), - previewImagePath: '/plugins/apm/assets/apm.png', - savedObjects, - savedObjectsInstallMsg: i18n.translate( - 'xpack.apm.tutorial.specProvider.savedObjectsInstallMsg', - { - defaultMessage: - 'An APM index pattern is required for some features in the APM UI.', - } - ), - } as TutorialSchema; -}; + values: { + learnMoreLink: + '{config.docs.base_url}guide/en/apm/get-started/{config.docs.version}/index.html', + }, + } + ), + euiIconType: 'apmApp', + artifacts, + customStatusCheckName: 'apm_fleet_server_status_check', + onPrem: onPremInstructions({ apmConfig, isFleetPluginEnabled }), + elasticCloud: createElasticCloudInstructions(cloud), + previewImagePath: '/plugins/apm/assets/apm.png', + savedObjects, + savedObjectsInstallMsg: i18n.translate( + 'xpack.apm.tutorial.specProvider.savedObjectsInstallMsg', + { + defaultMessage: + 'An APM index pattern is required for some features in the APM UI.', + } + ), + } as TutorialSchema; + }; diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/__fixtures__/test_styles.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/__fixtures__/test_styles.js index 4f621bdd94b35..9e6729d38259f 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/__fixtures__/test_styles.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/__fixtures__/test_styles.js @@ -19,8 +19,7 @@ export const fontStyle = { fontSize: '14px', lineHeight: '21px', }, - css: - 'font-family:Chalkboard, serif;font-weight:bolder;font-style:normal;text-decoration:underline;color:pink;text-align:center;font-size:14px;line-height:21px', + css: 'font-family:Chalkboard, serif;font-weight:bolder;font-style:normal;text-decoration:underline;color:pink;text-align:center;font-size:14px;line-height:21px', }; export const getContainerStyle = async () => { diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/if.test.js b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/if.test.js index fbfcdef076110..bcf42e850ce28 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/if.test.js +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/if.test.js @@ -62,9 +62,10 @@ describe('if', () => { it('without else', () => { testScheduler.run(({ expectObservable }) => { - expectObservable( - fn('some context', { condition: false, then: () => of('foo') }) - ).toBe('(0|)', ['some context']); + expectObservable(fn('some context', { condition: false, then: () => of('foo') })).toBe( + '(0|)', + ['some context'] + ); }); }); }); @@ -78,9 +79,10 @@ describe('if', () => { ${0} `('for then with $value', ({ value }) => { testScheduler.run(({ expectObservable }) => { - expectObservable( - fn('some context', { condition: true, then: () => of(value) }) - ).toBe('(0|)', [value]); + expectObservable(fn('some context', { condition: true, then: () => of(value) })).toBe( + '(0|)', + [value] + ); }); }); @@ -92,9 +94,10 @@ describe('if', () => { ${0} `('for else with $value', ({ value }) => { testScheduler.run(({ expectObservable }) => { - expectObservable( - fn('some context', { condition: false, else: () => of(value) }) - ).toBe('(0|)', [value]); + expectObservable(fn('some context', { condition: false, else: () => of(value) })).toBe( + '(0|)', + [value] + ); }); }); }); diff --git a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/ply.ts b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/ply.ts index 322bf7fee980c..5ab7b95f0d00b 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/functions/common/ply.ts +++ b/x-pack/plugins/canvas/canvas_plugin_src/functions/common/ply.ts @@ -58,9 +58,9 @@ export function ply(): ExpressionFunctionDefinition<'ply', Datatable, Arguments, }) ?? []; const originalDatatables = args.by - ? Object.values( - groupBy(input.rows, (row) => JSON.stringify(pick(row, args.by!))) - ).map((rows) => ({ ...input, rows })) + ? Object.values(groupBy(input.rows, (row) => JSON.stringify(pick(row, args.by!)))).map( + (rows) => ({ ...input, rows }) + ) : [input]; const datatables$ = originalDatatables.map((originalDatatable) => diff --git a/x-pack/plugins/canvas/canvas_plugin_src/renderers/filters/time_filter/components/time_filter.tsx b/x-pack/plugins/canvas/canvas_plugin_src/renderers/filters/time_filter/components/time_filter.tsx index a04eb11c20921..a8343eed272b5 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/renderers/filters/time_filter/components/time_filter.tsx +++ b/x-pack/plugins/canvas/canvas_plugin_src/renderers/filters/time_filter/components/time_filter.tsx @@ -54,9 +54,11 @@ export interface Props { } export const TimeFilter = ({ filter, commit, dateFormat, commonlyUsedRanges = [] }: Props) => { - const setFilter = (column: string) => ({ start, end }: OnTimeChangeProps) => { - commit(`timefilter from="${start}" to=${end} column=${column}`); - }; + const setFilter = + (column: string) => + ({ start, end }: OnTimeChangeProps) => { + commit(`timefilter from="${start}" to=${end} column=${column}`); + }; const { column, start, end } = getFilterMeta(filter); diff --git a/x-pack/plugins/canvas/canvas_plugin_src/uis/arguments/date_format/index.tsx b/x-pack/plugins/canvas/canvas_plugin_src/uis/arguments/date_format/index.tsx index ef5eb18b44590..8b966b3248ada 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/uis/arguments/date_format/index.tsx +++ b/x-pack/plugins/canvas/canvas_plugin_src/uis/arguments/date_format/index.tsx @@ -17,9 +17,10 @@ import { SetupInitializer } from '../../../plugin'; const { DateFormat: strings } = ArgumentStrings; -const getDateFormatArgInput = (defaultDateFormats: ComponentProps['dateFormats']) => ( - props: Assign -) => ; +const getDateFormatArgInput = + (defaultDateFormats: ComponentProps['dateFormats']) => + (props: Assign) => + ; export const dateFormatInitializer: SetupInitializer> = ( core, diff --git a/x-pack/plugins/canvas/canvas_plugin_src/uis/arguments/number_format/index.tsx b/x-pack/plugins/canvas/canvas_plugin_src/uis/arguments/number_format/index.tsx index e1d86ba3ff9d2..6277f41b89fe5 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/uis/arguments/number_format/index.tsx +++ b/x-pack/plugins/canvas/canvas_plugin_src/uis/arguments/number_format/index.tsx @@ -16,9 +16,10 @@ import { FORMATS_UI_SETTINGS } from '../../../../../../../src/plugins/field_form const { NumberFormat: strings } = ArgumentStrings; -const getNumberFormatArgInput = (defaultNumberFormats: ComponentProps['numberFormats']) => ( - props: Assign -) => ; +const getNumberFormatArgInput = + (defaultNumberFormats: ComponentProps['numberFormats']) => + (props: Assign) => + ; export const numberFormatInitializer: SetupInitializer> = ( core, diff --git a/x-pack/plugins/canvas/canvas_plugin_src/uis/arguments/palette.tsx b/x-pack/plugins/canvas/canvas_plugin_src/uis/arguments/palette.tsx index dcd087f511a00..d01424af3a584 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/uis/arguments/palette.tsx +++ b/x-pack/plugins/canvas/canvas_plugin_src/uis/arguments/palette.tsx @@ -48,12 +48,12 @@ export const PaletteArgInput: FC = ({ onValueChange, argId, argValue, ren return palette; } - return ({ + return { id: 'custom', label: strings.getCustomPaletteLabel(), colors, gradient, - } as any) as ColorPalette; + } as any as ColorPalette; } catch (e) { renderError(); } diff --git a/x-pack/plugins/canvas/common/lib/autocomplete.ts b/x-pack/plugins/canvas/common/lib/autocomplete.ts index d54c929b7d284..88fb6b052b957 100644 --- a/x-pack/plugins/canvas/common/lib/autocomplete.ts +++ b/x-pack/plugins/canvas/common/lib/autocomplete.ts @@ -152,10 +152,14 @@ export function getAutocompleteSuggestions( const text = expression.substr(0, position) + MARKER + expression.substr(position); try { const ast = parse(text, { addMeta: true }) as ExpressionASTWithMeta; - const { ast: newAst, fnIndex, argName, argIndex, parentFn, contextFn } = getFnArgAtPosition( - ast, - position - ); + const { + ast: newAst, + fnIndex, + argName, + argIndex, + parentFn, + contextFn, + } = getFnArgAtPosition(ast, position); const fn = newAst.node.chain[fnIndex].node; if (parentFn && fn.function.includes(MARKER) && argName) { diff --git a/x-pack/plugins/canvas/i18n/functions/dict/replace.ts b/x-pack/plugins/canvas/i18n/functions/dict/replace.ts index 0c12a36ed8254..31993c1f00813 100644 --- a/x-pack/plugins/canvas/i18n/functions/dict/replace.ts +++ b/x-pack/plugins/canvas/i18n/functions/dict/replace.ts @@ -27,8 +27,7 @@ export const help: FunctionHelp> = { flags: i18n.translate('xpack.canvas.functions.replace.args.flagsHelpText', { defaultMessage: 'Specify flags. See {url}.', values: { - url: - 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp', + url: 'https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/RegExp', }, }), replacement: i18n.translate('xpack.canvas.functions.replace.args.replacementHelpText', { diff --git a/x-pack/plugins/canvas/public/components/arg_form/arg_template_form.tsx b/x-pack/plugins/canvas/public/components/arg_form/arg_template_form.tsx index 1d7227d65e536..aec68993df98c 100644 --- a/x-pack/plugins/canvas/public/components/arg_form/arg_template_form.tsx +++ b/x-pack/plugins/canvas/public/components/arg_form/arg_template_form.tsx @@ -49,10 +49,10 @@ export const ArgTemplateForm: React.FunctionComponent = ({ [template, argumentProps, updatedHandlers] ); - const renderErrorTemplate = useCallback(() => React.createElement(errorTemplate, argumentProps), [ - errorTemplate, - argumentProps, - ]); + const renderErrorTemplate = useCallback( + () => React.createElement(errorTemplate, argumentProps), + [errorTemplate, argumentProps] + ); useEffect(() => { setHandlers(mergeWithFormHandlers(handlers)); diff --git a/x-pack/plugins/canvas/public/components/datasource/datasource_component.js b/x-pack/plugins/canvas/public/components/datasource/datasource_component.js index c1df18fc06d55..1526b5f6318f4 100644 --- a/x-pack/plugins/canvas/public/components/datasource/datasource_component.js +++ b/x-pack/plugins/canvas/public/components/datasource/datasource_component.js @@ -87,14 +87,8 @@ export class DatasourceComponent extends PureComponent { }); setSelectedDatasource = (value) => { - const { - datasource, - resetArgs, - updateArgs, - selectDatasource, - datasources, - setSelecting, - } = this.props; + const { datasource, resetArgs, updateArgs, selectDatasource, datasources, setSelecting } = + this.props; if (datasource.name === value) { // if selecting the current datasource, reset the arguments diff --git a/x-pack/plugins/canvas/public/components/datasource/index.js b/x-pack/plugins/canvas/public/components/datasource/index.js index 5a0cbf6d05bd9..06c920937f342 100644 --- a/x-pack/plugins/canvas/public/components/datasource/index.js +++ b/x-pack/plugins/canvas/public/components/datasource/index.js @@ -53,10 +53,12 @@ const mapStateToProps = (state) => ({ const mapDispatchToProps = (dispatch) => ({ dispatchArgumentAtIndex: (props) => (arg) => dispatch(setArgumentAtIndex({ ...props, arg })), - dispatchAstAtIndex: ({ index, element, pageId }) => (ast) => { - dispatch(flushContext(element.id)); - dispatch(setAstAtIndex(index, ast, element, pageId)); - }, + dispatchAstAtIndex: + ({ index, element, pageId }) => + (ast) => { + dispatch(flushContext(element.id)); + dispatch(setAstAtIndex(index, ast, element, pageId)); + }, }); const mergeProps = (stateProps, dispatchProps, ownProps) => { diff --git a/x-pack/plugins/canvas/public/components/enhance/error_boundary.tsx b/x-pack/plugins/canvas/public/components/enhance/error_boundary.tsx index 125e5475241bb..02e8b9560d52d 100644 --- a/x-pack/plugins/canvas/public/components/enhance/error_boundary.tsx +++ b/x-pack/plugins/canvas/public/components/enhance/error_boundary.tsx @@ -38,10 +38,12 @@ export const errorBoundaryHoc = compose, Pick>({ - resetErrorState: ({ setError, setErrorInfo }) => () => { - setError(null); - setErrorInfo(null); - }, + resetErrorState: + ({ setError, setErrorInfo }) => + () => { + setError(null); + setErrorInfo(null); + }, }), lifecycle({ componentDidCatch(error, errorInfo) { diff --git a/x-pack/plugins/canvas/public/components/export_app/export_app.test.tsx b/x-pack/plugins/canvas/public/components/export_app/export_app.test.tsx index 7bd8561629499..8d9ea9e8b4185 100644 --- a/x-pack/plugins/canvas/public/components/export_app/export_app.test.tsx +++ b/x-pack/plugins/canvas/public/components/export_app/export_app.test.tsx @@ -24,7 +24,7 @@ jest.mock('../routing', () => ({ describe('', () => { test('renders as expected', () => { - const sampleWorkpad = ({ + const sampleWorkpad = { id: 'my-workpad-abcd', css: '', pages: [ @@ -35,7 +35,7 @@ describe('', () => { elements: [3, 4, 5, 6], }, ], - } as any) as CanvasWorkpad; + } as any as CanvasWorkpad; const page1 = mount( {}} /> diff --git a/x-pack/plugins/canvas/public/components/expression_input/__stories__/expression_input.stories.tsx b/x-pack/plugins/canvas/public/components/expression_input/__stories__/expression_input.stories.tsx index 1d98aaf177b70..b5f9653aaad29 100644 --- a/x-pack/plugins/canvas/public/components/expression_input/__stories__/expression_input.stories.tsx +++ b/x-pack/plugins/canvas/public/components/expression_input/__stories__/expression_input.stories.tsx @@ -17,14 +17,12 @@ const sampleFunctionDef = { name: 'markdown', type: 'render', aliases: [], - help: - 'Adds an element that renders Markdown text. TIP: Use the `markdown` function for single numbers, metrics, and paragraphs of text.', + help: 'Adds an element that renders Markdown text. TIP: Use the `markdown` function for single numbers, metrics, and paragraphs of text.', args: { content: { name: 'content', required: false, - help: - 'A string of text that contains Markdown. To concatenate, pass the `string` function multiple times.', + help: 'A string of text that contains Markdown. To concatenate, pass the `string` function multiple times.', types: ['string'], default: '""', aliases: ['_', 'expression'], diff --git a/x-pack/plugins/canvas/public/components/function_form/function_form_context_pending.tsx b/x-pack/plugins/canvas/public/components/function_form/function_form_context_pending.tsx index 6cd7b59a2d214..c3855b42ec2fb 100644 --- a/x-pack/plugins/canvas/public/components/function_form/function_form_context_pending.tsx +++ b/x-pack/plugins/canvas/public/components/function_form/function_form_context_pending.tsx @@ -18,30 +18,29 @@ interface FunctionFormContextPendingProps { updateContext: (element?: CanvasElement) => void; } -export const FunctionFormContextPending: React.FunctionComponent = ( - props -) => { - const { contextExpression, expressionType, context, updateContext } = props; - const prevContextExpression = usePrevious(contextExpression); - const fetchContext = useCallback( - (force = false) => { - // dispatch context update if none is provided - if (force || (context == null && expressionType.requiresContext)) { - updateContext(); - } - }, - [context, expressionType.requiresContext, updateContext] - ); +export const FunctionFormContextPending: React.FunctionComponent = + (props) => { + const { contextExpression, expressionType, context, updateContext } = props; + const prevContextExpression = usePrevious(contextExpression); + const fetchContext = useCallback( + (force = false) => { + // dispatch context update if none is provided + if (force || (context == null && expressionType.requiresContext)) { + updateContext(); + } + }, + [context, expressionType.requiresContext, updateContext] + ); - useEffect(() => { - const forceUpdate = - expressionType.requiresContext && prevContextExpression !== contextExpression; - fetchContext(forceUpdate); - }, [contextExpression, expressionType, fetchContext, prevContextExpression]); + useEffect(() => { + const forceUpdate = + expressionType.requiresContext && prevContextExpression !== contextExpression; + fetchContext(forceUpdate); + }, [contextExpression, expressionType, fetchContext, prevContextExpression]); - return ( -
- -
- ); -}; + return ( +
+ +
+ ); + }; diff --git a/x-pack/plugins/canvas/public/components/function_form/index.tsx b/x-pack/plugins/canvas/public/components/function_form/index.tsx index 9caf18e9e8b4e..aff019d1cb69c 100644 --- a/x-pack/plugins/canvas/public/components/function_form/index.tsx +++ b/x-pack/plugins/canvas/public/components/function_form/index.tsx @@ -73,11 +73,10 @@ export const FunctionForm: React.FunctionComponent = (props) [dispatch, element, expressionIndex, pageId] ); - const updateContext = useCallback(() => dispatch(fetchContext(expressionIndex, element)), [ - dispatch, - element, - expressionIndex, - ]); + const updateContext = useCallback( + () => dispatch(fetchContext(expressionIndex, element)), + [dispatch, element, expressionIndex] + ); const setArgument = useCallback( (argName: string, valueIndex: number) => (value: string | Ast | null) => { diff --git a/x-pack/plugins/canvas/public/components/function_reference_generator/function_examples.ts b/x-pack/plugins/canvas/public/components/function_reference_generator/function_examples.ts index 3181ebbb4af8c..a8409270752ad 100644 --- a/x-pack/plugins/canvas/public/components/function_reference_generator/function_examples.ts +++ b/x-pack/plugins/canvas/public/components/function_reference_generator/function_examples.ts @@ -35,8 +35,7 @@ all condition={gt 10} condition={lt 20}`, align="center" lHeight=48 } | render`, - help: - 'This sets the color of the metric text to `"red"` if the context passed into `metric` is greater than or equal to 0 and less than 0.8. Otherwise, the color is set to `"green"`.', + help: 'This sets the color of the metric text to `"red"` if the context passed into `metric` is greater than or equal to 0 and less than 0.8. Otherwise, the color is set to `"green"`.', }, }, alterColumn: { @@ -48,8 +47,7 @@ alterColumn column="@timestamp" name="foo"`, | alterColumn "time" name="time_in_ms" type="number" | table | render`, - help: - 'This renames the `time` column to `time_in_ms` and converts the type of the column’s values from `date` to `number`.', + help: 'This renames the `time` column to `time_in_ms` and converts the type of the column’s values from `date` to `number`.', }, }, any: { @@ -64,8 +62,7 @@ any condition={lte 10} condition={gt 30}`, | pointseries color="project" size="max(price)" | pie | render`, - help: - 'This filters out any rows that don’t contain `"elasticsearch"`, `"kibana"` or `"x-pack"` in the `project` field.', + help: 'This filters out any rows that don’t contain `"elasticsearch"`, `"kibana"` or `"x-pack"` in the `project` field.', }, }, as: { @@ -90,8 +87,7 @@ asset id="asset-498f7429-4d56-42a2-a7e4-8bf08d98d114"`, usage: { expression: `image dataurl={asset "asset-c661a7cc-11be-45a1-a401-d7592ea7917a"} mode="contain" | render`, - help: - 'The image asset stored with the ID `"asset-c661a7cc-11be-45a1-a401-d7592ea7917a"` is passed into the `dataurl` argument of the `image` function to display the stored asset.', + help: 'The image asset stored with the ID `"asset-c661a7cc-11be-45a1-a401-d7592ea7917a"` is passed into the `dataurl` argument of the `image` function to display the stored asset.', }, }, axisConfig: { @@ -106,8 +102,7 @@ axisConfig position="right" min=0 max=10 tickSize=1`, xaxis={axisConfig position="top" min=0 max=400 tickSize=100} yaxis={axisConfig position="right"} | render`, - help: - 'This sets the `x-axis` to display on the top of the chart and sets the range of values to `0-400` with ticks displayed at `100` intervals. The `y-axis` is configured to display on the `right`.', + help: 'This sets the `x-axis` to display on the top of the chart and sets the range of values to `0-400` with ticks displayed at `100` intervals. The `y-axis` is configured to display on the `right`.', }, }, case: { @@ -131,8 +126,7 @@ case if={lte 50} then="green"`, default="red" } | render`, - help: - 'This sets the color of the progress indicator and the color of the label to `"green"` if the value is less than or equal to `0.5`, `"orange"` if the value is greater than `0.5` and less than or equal to `0.75`, and `"red"` if `none` of the case conditions are met.', + help: 'This sets the color of the progress indicator and the color of the label to `"green"` if the value is less than or equal to `0.5`, `"orange"` if the value is greater than `0.5` and less than or equal to `0.75`, and `"red"` if `none` of the case conditions are met.', }, }, columns: { @@ -144,8 +138,7 @@ columns exclude="username, country, age"`, | columns include="price, cost, state, project" | table | render`, - help: - 'This only keeps the `price`, `cost`, `state`, and `project` columns from the `demodata` data source and removes all other columns.', + help: 'This only keeps the `price`, `cost`, `state`, and `project` columns from the `demodata` data source and removes all other columns.', }, }, compare: { @@ -164,8 +157,7 @@ compare op="lte" to=100`, | pointseries size="size(cost)" color="project" | pie | render`, - help: - 'This maps all `project` values that aren’t `"kibana"` and `"elasticsearch"` to `"other"`. Alternatively, you can use the individual comparator functions instead of compare.', + help: 'This maps all `project` values that aren’t `"kibana"` and `"elasticsearch"` to `"other"`. Alternatively, you can use the individual comparator functions instead of compare.', }, }, containerStyle: { @@ -197,8 +189,7 @@ containerStyle backgroundImage={asset id=asset-f40d2292-cf9e-4f2c-8c6f-a504a25e9 | formatdate "LLLL" | markdown "Last updated: " {context} | render`, - help: - 'Using the `context` function allows us to pass the output, or _context_, of the previous function as a value to an argument in the next function. Here we get the formatted date string from the previous function and pass it as `content` for the markdown element.', + help: 'Using the `context` function allows us to pass the output, or _context_, of the previous function as a value to an argument in the next function. Here we get the formatted date string from the previous function and pass it as `content` for the markdown element.', }, }, csv: { @@ -212,8 +203,7 @@ containerStyle backgroundImage={asset id=asset-f40d2292-cf9e-4f2c-8c6f-a504a25e9 | pointseries color=fruit size=stock | pie | render`, - help: - 'This creates a `datatable` with `fruit` and `stock` columns with two rows. This is useful for quickly mocking data.', + help: 'This creates a `datatable` with `fruit` and `stock` columns with two rows. This is useful for quickly mocking data.', }, }, date: { @@ -253,8 +243,7 @@ dropdownControl valueColumn=agent filterColumn=agent.keyword filterGroup=group1` expression: `demodata | dropdownControl valueColumn=project filterColumn=project | render`, - help: - 'This creates a dropdown filter element. It requires a data source and uses the unique values from the given `valueColumn` (i.e. `project`) and applies the filter to the `project` column. Note: `filterColumn` should point to a keyword type field for Elasticsearch data sources.', + help: 'This creates a dropdown filter element. It requires a data source and uses the unique values from the given `valueColumn` (i.e. `project`) and applies the filter to the `project` column. Note: `filterColumn` should point to a keyword type field for Elasticsearch data sources.', }, }, eq: { @@ -275,8 +264,7 @@ eq "foo"`, | pointseries size="size(cost)" color="project" | pie | render`, - help: - 'This changes all values in the project column that don’t equal `"kibana"` or `"elasticsearch"` to `"other"`.', + help: 'This changes all values in the project column that don’t equal `"kibana"` or `"elasticsearch"` to `"other"`.', }, }, escount: { @@ -292,8 +280,7 @@ escount query="response:404" index="kibana_sample_data_logs"`, font={font size=24 family="'Open Sans', Helvetica, Arial, sans-serif" color="#000000" align=center} max={filters | escount index="kibana_sample_data_flights"} | render`, - help: - 'The first `escount` expression retrieves the number of flights that were cancelled. The second `escount` expression retrieves the total number of flights.', + help: 'The first `escount` expression retrieves the number of flights that were cancelled. The second `escount` expression retrieves the total number of flights.', }, }, esdocs: { @@ -315,8 +302,7 @@ esdocs index="kibana_sample_data_flights" sort="AvgTicketPrice, asc"`, | plot defaultStyle={seriesStyle lines=3} palette={palette "#7ECAE3" "#003A4D" gradient=true} | render`, - help: - 'This retrieves the first 10000 documents data from the `kibana_sample_data_ecommerce` index sorted by `order_date` in ascending order, and only requests the `customer_gender`, `taxful_total_price`, and `order_date` fields.', + help: 'This retrieves the first 10000 documents data from the `kibana_sample_data_ecommerce` index sorted by `order_date` in ascending order, and only requests the `customer_gender`, `taxful_total_price`, and `order_date` fields.', }, }, essql: { @@ -327,8 +313,7 @@ essql "SELECT * FROM \"apm*\"" count=10000`, | essql query="SELECT Carrier, FlightDelayMin, AvgTicketPrice FROM \"kibana_sample_data_flights\"" | table | render`, - help: - 'This retrieves the `Carrier`, `FlightDelayMin`, and `AvgTicketPrice` fields from the "kibana_sample_data_flights" index.', + help: 'This retrieves the `Carrier`, `FlightDelayMin`, and `AvgTicketPrice` fields from the "kibana_sample_data_flights" index.', }, }, exactly: { @@ -342,8 +327,7 @@ exactly column="project" value="beats"`, | pointseries x=project y="mean(age)" | plot defaultStyle={seriesStyle bars=1} | render`, - help: - 'The `exactly` filter here is added to existing filters retrieved by the `filters` function and further filters down the data to only have `"elasticsearch"` data. The `exactly` filter only applies to this one specific element and will not affect other elements in the workpad.', + help: 'The `exactly` filter here is added to existing filters retrieved by the `filters` function and further filters down the data to only have `"elasticsearch"` data. The `exactly` filter only applies to this one specific element and will not affect other elements in the workpad.', }, }, filterrows: { @@ -360,8 +344,7 @@ filterrows fn={getCell "age" | gt 50}`, | plot defaultStyle={seriesStyle points="2" lines="1"} palette={palette "#01A4A4" "#CC6666" "#D0D102" "#616161" "#00A1CB" "#32742C" "#F18D05" "#113F8C" "#61AE24" "#D70060" gradient=false} | render`, - help: - 'This uses `filterrows` to only keep data from India (`IN`), the United States (`US`), and China (`CN`).', + help: 'This uses `filterrows` to only keep data from India (`IN`), the United States (`US`), and China (`CN`).', }, }, filters: { @@ -383,8 +366,7 @@ filters group="timefilter2" group="dropdownfilter1" ungrouped=true`, italic=true } | render`, - help: - '`filters` sets the existing filters as context and accepts a `group` parameter to opt into specific filter groups. Setting `ungrouped` to `true` opts out of using global filters.', + help: '`filters` sets the existing filters as context and accepts a `group` parameter to opt into specific filter groups. Setting `ungrouped` to `true` opts out of using global filters.', }, }, font: { @@ -423,8 +405,7 @@ formatdate "MM/DD/YYYY"`, | pointseries x="time" y="sum(price)" color="state" | plot defaultStyle={seriesStyle points=5} | render`, - help: - 'This transforms the dates in the `time` field into strings that look like `"Jan ‘19"`, `"Feb ‘19"`, etc. using a MomentJS format.', + help: 'This transforms the dates in the `time` field into strings that look like `"Jan ‘19"`, `"Feb ‘19"`, etc. using a MomentJS format.', }, }, formatnumber: { @@ -438,8 +419,7 @@ formatnumber "0.0a"`, label={formatnumber "0%"} font={font size=24 family="'Open Sans', Helvetica, Arial, sans-serif" color="#000000" align="center"} | render`, - help: - 'The `formatnumber` subexpression receives the same `context` as the `progress` function, which is the output of the `math` function. It formats the value into a percentage.', + help: 'The `formatnumber` subexpression receives the same `context` as the `progress` function, which is the output of the `math` function. It formats the value into a percentage.', }, }, }); diff --git a/x-pack/plugins/canvas/public/components/keyboard_shortcuts_doc/keyboard_shortcuts_doc.tsx b/x-pack/plugins/canvas/public/components/keyboard_shortcuts_doc/keyboard_shortcuts_doc.tsx index a71976006d51c..fe5428cea203d 100644 --- a/x-pack/plugins/canvas/public/components/keyboard_shortcuts_doc/keyboard_shortcuts_doc.tsx +++ b/x-pack/plugins/canvas/public/components/keyboard_shortcuts_doc/keyboard_shortcuts_doc.tsx @@ -57,31 +57,27 @@ interface Props { const os = getClientPlatform(); const getDescriptionListItems = (shortcuts: ShortcutMap[]): DescriptionListItem[] => - shortcuts.map( - (shortcutKeyMap: ShortcutMap): DescriptionListItem => { - const osShortcuts = shortcutKeyMap[os]; - return { - title: shortcutKeyMap.help, - description: osShortcuts.reduce((acc: JSX.Element[], shortcut, i): JSX.Element[] => { - // replace +'s with spaces so we can display the plus symbol for the plus key - shortcut = shortcut.replace(/\+/g, ' '); - if (i !== 0) { - acc.push( {strings.getShortcutSeparator()} ); - } - acc.push( - - {getPrettyShortcut(shortcut) - .split(/( )/g) - .map((key) => - key === ' ' ? key : {key} - )} - - ); - return acc; - }, []), - }; - } - ); + shortcuts.map((shortcutKeyMap: ShortcutMap): DescriptionListItem => { + const osShortcuts = shortcutKeyMap[os]; + return { + title: shortcutKeyMap.help, + description: osShortcuts.reduce((acc: JSX.Element[], shortcut, i): JSX.Element[] => { + // replace +'s with spaces so we can display the plus symbol for the plus key + shortcut = shortcut.replace(/\+/g, ' '); + if (i !== 0) { + acc.push( {strings.getShortcutSeparator()} ); + } + acc.push( + + {getPrettyShortcut(shortcut) + .split(/( )/g) + .map((key) => (key === ' ' ? key : {key}))} + + ); + return acc; + }, []), + }; + }); export const KeyboardShortcutsDoc: FunctionComponent = ({ onClose }) => ( void }> = ({ onPreviousPage const { gotoPage } = useContext(WorkpadRoutingContext); - const onAddPage = useCallback(() => dispatch(pageActions.addPage({ gotoPage })), [ - dispatch, - gotoPage, - ]); + const onAddPage = useCallback( + () => dispatch(pageActions.addPage({ gotoPage })), + [dispatch, gotoPage] + ); const onMovePage = useCallback( (id: string, position: number) => dispatch(pageActions.movePage(id, position, gotoPage)), diff --git a/x-pack/plugins/canvas/public/components/popover/popover.tsx b/x-pack/plugins/canvas/public/components/popover/popover.tsx index a2793b3759f1e..0bd731476e724 100644 --- a/x-pack/plugins/canvas/public/components/popover/popover.tsx +++ b/x-pack/plugins/canvas/public/components/popover/popover.tsx @@ -86,7 +86,7 @@ export class Popover extends Component { }; const appWrapper = document.querySelector('.kbnAppWrapper'); - const EuiPopoverAny = (EuiPopover as any) as React.FC; + const EuiPopoverAny = EuiPopover as any as React.FC; return ( = ({ children, transformMatrix, width, heig // Throw if there is more than one child const childNode = React.Children.only(children); - const matrix = (transformMatrix.map((n, i) => + const matrix = transformMatrix.map((n, i) => i < 12 ? n : Math.round(n) - ) as any) as TransformMatrix3d; + ) as any as TransformMatrix3d; const newStyle: CSSProperties = { width, diff --git a/x-pack/plugins/canvas/public/components/saved_elements_modal/__stories__/fixtures/test_elements.tsx b/x-pack/plugins/canvas/public/components/saved_elements_modal/__stories__/fixtures/test_elements.tsx index 854bf9c685ad9..29cb1c8d525ce 100644 --- a/x-pack/plugins/canvas/public/components/saved_elements_modal/__stories__/fixtures/test_elements.tsx +++ b/x-pack/plugins/canvas/public/components/saved_elements_modal/__stories__/fixtures/test_elements.tsx @@ -30,8 +30,7 @@ export const getTestCustomElements = async () => { id: 'custom-element-', name: 'customElement3', displayName: 'Custom Element 3', - help: - 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce lobortis aliquet arcu ut turpis duis.', + help: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce lobortis aliquet arcu ut turpis duis.', image: elasticLogo, content: `{\"selectedNodes\":[{\"id\":\"group-dccf4ed7-1593-49a0-9902-caf4d4a4b7f5\",\"position\":{\"left\":250,\"top\":119,\"width\":340,\"height\":517,\"angle\":0,\"parent\":null,\"type\":\"group\"},\"expression\":\"shape fill=\\\"rgba(255,255,255,0)\\\" | render\",\"ast\":{\"type\":\"expression\",\"chain\":[{\"type\":\"function\",\"function\":\"shape\",\"arguments\":{\"fill\":[\"rgba(255,255,255,0)\"]}},{\"type\":\"function\",\"function\":\"render\",\"arguments\":{}}]}},{\"id\":\"element-e2c658ee-7614-4d92-a46e-2b1a81a24485\",\"position\":{\"left\":250,\"top\":405,\"width\":340,\"height\":75,\"angle\":0,\"parent\":\"group-dccf4ed7-1593-49a0-9902-caf4d4a4b7f5\",\"type\":\"element\"},\"expression\":\"filters\\n| demodata\\n| markdown \\\"## Jane Doe\\\" \\n font={font family=\\\"'Open Sans', Helvetica, Arial, sans-serif\\\" size=14 align=\\\"center\\\" color=\\\"#000000\\\" weight=\\\"normal\\\" underline=false italic=false}\\n| render\",\"ast\":{\"type\":\"expression\",\"chain\":[{\"type\":\"function\",\"function\":\"filters\",\"arguments\":{}},{\"type\":\"function\",\"function\":\"demodata\",\"arguments\":{}},{\"type\":\"function\",\"function\":\"markdown\",\"arguments\":{\"_\":[\"## Jane Doe\"],\"font\":[{\"type\":\"expression\",\"chain\":[{\"type\":\"function\",\"function\":\"font\",\"arguments\":{\"family\":[\"'Open Sans', Helvetica, Arial, sans-serif\"],\"size\":[14],\"align\":[\"center\"],\"color\":[\"#000000\"],\"weight\":[\"normal\"],\"underline\":[false],\"italic\":[false]}}]}]}},{\"type\":\"function\",\"function\":\"render\",\"arguments\":{}}]}},{\"id\":\"element-3d16765e-5251-4954-8e2a-6c64ed465b73\",\"position\":{\"left\":250,\"top\":480,\"width\":340,\"height\":75,\"angle\":0,\"parent\":\"group-dccf4ed7-1593-49a0-9902-caf4d4a4b7f5\",\"type\":\"element\"},\"expression\":\"filters\\n| demodata\\n| markdown \\\"### Developer\\\" \\n font={font family=\\\"'Open Sans', Helvetica, Arial, sans-serif\\\" size=14 align=\\\"center\\\" color=\\\"#000000\\\" weight=\\\"normal\\\" underline=false italic=false}\\n| render css=\\\".canvasRenderEl h3 {\\ncolor: #444444;\\n}\\\"\",\"ast\":{\"type\":\"expression\",\"chain\":[{\"type\":\"function\",\"function\":\"filters\",\"arguments\":{}},{\"type\":\"function\",\"function\":\"demodata\",\"arguments\":{}},{\"type\":\"function\",\"function\":\"markdown\",\"arguments\":{\"_\":[\"### Developer\"],\"font\":[{\"type\":\"expression\",\"chain\":[{\"type\":\"function\",\"function\":\"font\",\"arguments\":{\"family\":[\"'Open Sans', Helvetica, Arial, sans-serif\"],\"size\":[14],\"align\":[\"center\"],\"color\":[\"#000000\"],\"weight\":[\"normal\"],\"underline\":[false],\"italic\":[false]}}]}]}},{\"type\":\"function\",\"function\":\"render\",\"arguments\":{\"css\":[\".canvasRenderEl h3 {\\ncolor: #444444;\\n}\"]}}]}},{\"id\":\"element-624675cf-46e9-4545-b86a-5409bbe53ac1\",\"position\":{\"left\":250,\"top\":555,\"width\":340,\"height\":81,\"angle\":0,\"parent\":\"group-dccf4ed7-1593-49a0-9902-caf4d4a4b7f5\",\"type\":\"element\"},\"expression\":\"filters\\n| demodata\\n| markdown \\n \\\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec vel sollicitudin mauris, ut scelerisque urna. \\\" \\n font={font family=\\\"'Open Sans', Helvetica, Arial, sans-serif\\\" size=14 align=\\\"center\\\" color=\\\"#000000\\\" weight=\\\"normal\\\" underline=false italic=false}\\n| render\",\"ast\":{\"type\":\"expression\",\"chain\":[{\"type\":\"function\",\"function\":\"filters\",\"arguments\":{}},{\"type\":\"function\",\"function\":\"demodata\",\"arguments\":{}},{\"type\":\"function\",\"function\":\"markdown\",\"arguments\":{\"_\":[\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec vel sollicitudin mauris, ut scelerisque urna. \"],\"font\":[{\"type\":\"expression\",\"chain\":[{\"type\":\"function\",\"function\":\"font\",\"arguments\":{\"family\":[\"'Open Sans', Helvetica, Arial, sans-serif\"],\"size\":[14],\"align\":[\"center\"],\"color\":[\"#000000\"],\"weight\":[\"normal\"],\"underline\":[false],\"italic\":[false]}}]}]}},{\"type\":\"function\",\"function\":\"render\",\"arguments\":{}}]}},{\"id\":\"element-c2916246-26dd-4c65-91c6-d1ad3f1791ee\",\"position\":{\"left\":293,\"top\":119,\"width\":254,\"height\":252,\"angle\":0,\"parent\":\"group-dccf4ed7-1593-49a0-9902-caf4d4a4b7f5\",\"type\":\"element\"},\"expression\":\"image dataurl={asset \\\"asset-0c6f377f-771e-432e-8e2e-15c3e9142ad6\\\"} mode=\\\"contain\\\"\\n| render\",\"ast\":{\"type\":\"expression\",\"chain\":[{\"type\":\"function\",\"function\":\"image\",\"arguments\":{\"dataurl\":[{\"type\":\"expression\",\"chain\":[{\"type\":\"function\",\"function\":\"asset\",\"arguments\":{\"_\":[\"asset-0c6f377f-771e-432e-8e2e-15c3e9142ad6\"]}}]}],\"mode\":[\"contain\"]}},{\"type\":\"function\",\"function\":\"render\",\"arguments\":{}}]}}]}`, }, diff --git a/x-pack/plugins/canvas/public/components/tool_tip_shortcut/index.tsx b/x-pack/plugins/canvas/public/components/tool_tip_shortcut/index.tsx index 5d739de590574..169b8fc1f59a9 100644 --- a/x-pack/plugins/canvas/public/components/tool_tip_shortcut/index.tsx +++ b/x-pack/plugins/canvas/public/components/tool_tip_shortcut/index.tsx @@ -25,15 +25,13 @@ interface Props { } export const ToolTipShortcut = compose( - mapProps( - ({ namespace, action }: Props): ComponentProps => { - const shortcutMap = keymap[namespace][action]; - if (typeof shortcutMap === 'string') { - return { shortcut: '' }; - } - - const shortcuts = shortcutMap[os] || []; - return { shortcut: getPrettyShortcut(shortcuts[0]) }; + mapProps(({ namespace, action }: Props): ComponentProps => { + const shortcutMap = keymap[namespace][action]; + if (typeof shortcutMap === 'string') { + return { shortcut: '' }; } - ) + + const shortcuts = shortcutMap[os] || []; + return { shortcut: getPrettyShortcut(shortcuts[0]) }; + }) )(Component); diff --git a/x-pack/plugins/canvas/public/components/workpad/index.js b/x-pack/plugins/canvas/public/components/workpad/index.js index ae9b6a1fee22c..6df639a117c4f 100644 --- a/x-pack/plugins/canvas/public/components/workpad/index.js +++ b/x-pack/plugins/canvas/public/components/workpad/index.js @@ -55,9 +55,8 @@ const mergeProps = (stateProps, dispatchProps, ownProps) => { }; const AddContexts = (props) => { - const { isFullscreen, setFullscreen, undo, redo, autoplayInterval } = useContext( - WorkpadRoutingContext - ); + const { isFullscreen, setFullscreen, undo, redo, autoplayInterval } = + useContext(WorkpadRoutingContext); const platformService = usePlatformService(); @@ -131,7 +130,10 @@ export const Workpad = compose( }, }), withHandlers({ - onTransitionEnd: ({ setTransition }) => () => setTransition(null), + onTransitionEnd: + ({ setTransition }) => + () => + setTransition(null), nextPage: (props) => () => { const pageNumber = Math.min(props.selectedPageNumber + 1, props.pages.length); props.onPageChange(pageNumber); diff --git a/x-pack/plugins/canvas/public/components/workpad_header/edit_menu/edit_menu.tsx b/x-pack/plugins/canvas/public/components/workpad_header/edit_menu/edit_menu.tsx index 00f4810be3608..f7373c6e58484 100644 --- a/x-pack/plugins/canvas/public/components/workpad_header/edit_menu/edit_menu.tsx +++ b/x-pack/plugins/canvas/public/components/workpad_header/edit_menu/edit_menu.tsx @@ -46,15 +46,14 @@ interface OwnProps { commit: CommitFn; } -const withGlobalState = ( - commit: CommitFn, - updateGlobalState: (layoutState: LayoutState) => void -) => (type: string, payload: any) => { - const newLayoutState = commit(type, payload); - if (newLayoutState.currentScene.gestureEnd) { - updateGlobalState(newLayoutState); - } -}; +const withGlobalState = + (commit: CommitFn, updateGlobalState: (layoutState: LayoutState) => void) => + (type: string, payload: any) => { + const newLayoutState = commit(type, payload); + if (newLayoutState.currentScene.gestureEnd) { + updateGlobalState(newLayoutState); + } + }; /* * TODO: this is all copied from interactive_workpad_page and workpad_shortcuts diff --git a/x-pack/plugins/canvas/public/components/workpad_header/fullscreen_control/index.js b/x-pack/plugins/canvas/public/components/workpad_header/fullscreen_control/index.js index e428dbba57b9b..14baf1db583a1 100644 --- a/x-pack/plugins/canvas/public/components/workpad_header/fullscreen_control/index.js +++ b/x-pack/plugins/canvas/public/components/workpad_header/fullscreen_control/index.js @@ -106,6 +106,9 @@ export const FullscreenControl = compose( return { getAnimation }; }), withHandlers({ - onTransitionEnd: ({ setTransition }) => () => setTransition(null), + onTransitionEnd: + ({ setTransition }) => + () => + setTransition(null), }) )(FullscreenControlWithContext); diff --git a/x-pack/plugins/canvas/public/components/workpad_header/labs_control/labs_control.tsx b/x-pack/plugins/canvas/public/components/workpad_header/labs_control/labs_control.tsx index fde21c7c85c37..39d29e134cca6 100644 --- a/x-pack/plugins/canvas/public/components/workpad_header/labs_control/labs_control.tsx +++ b/x-pack/plugins/canvas/public/components/workpad_header/labs_control/labs_control.tsx @@ -34,8 +34,9 @@ export const LabsControl = () => { } const projects = getProjects(['canvas']); - const overrideCount = Object.values(projects).filter((project) => project.status.isOverride) - .length; + const overrideCount = Object.values(projects).filter( + (project) => project.status.isOverride + ).length; return ( <> diff --git a/x-pack/plugins/canvas/public/components/workpad_header/share_menu/flyout/flyout.component.tsx b/x-pack/plugins/canvas/public/components/workpad_header/share_menu/flyout/flyout.component.tsx index 52e80c316c1ef..8c94e131b781c 100644 --- a/x-pack/plugins/canvas/public/components/workpad_header/share_menu/flyout/flyout.component.tsx +++ b/x-pack/plugins/canvas/public/components/workpad_header/share_menu/flyout/flyout.component.tsx @@ -108,9 +108,10 @@ export const ShareWebsiteFlyout: FC = ({ }) => { const notifyService = useNotifyService(); - const onCopy = useCallback(() => notifyService.info(strings.getCopyShareConfigMessage()), [ - notifyService, - ]); + const onCopy = useCallback( + () => notifyService.info(strings.getCopyShareConfigMessage()), + [notifyService] + ); const downloadRenderedWorkpad = useDownloadRenderedWorkpad(); const downloadRuntime = useDownloadRuntime(); diff --git a/x-pack/plugins/canvas/public/expression_types/arg_types/container_style/appearance_form.tsx b/x-pack/plugins/canvas/public/expression_types/arg_types/container_style/appearance_form.tsx index 027565e71c27e..b3e458c39f14e 100644 --- a/x-pack/plugins/canvas/public/expression_types/arg_types/container_style/appearance_form.tsx +++ b/x-pack/plugins/canvas/public/expression_types/arg_types/container_style/appearance_form.tsx @@ -49,15 +49,14 @@ export const AppearanceForm: FunctionComponent = ({ padding = padding.replace('px', ''); } - const namedChange = (name: keyof Arguments) => ( - ev: ChangeEvent - ) => { - if (name === 'padding') { - return onChange(name, `${ev.target.value}px`); - } + const namedChange = + (name: keyof Arguments) => (ev: ChangeEvent) => { + if (name === 'padding') { + return onChange(name, `${ev.target.value}px`); + } - onChange(name, ev.target.value); - }; + onChange(name, ev.target.value); + }; return ( diff --git a/x-pack/plugins/canvas/public/expression_types/arg_types/container_style/border_form.tsx b/x-pack/plugins/canvas/public/expression_types/arg_types/container_style/border_form.tsx index 2a67461dc4a7c..fbadcb3efc6d6 100644 --- a/x-pack/plugins/canvas/public/expression_types/arg_types/container_style/border_form.tsx +++ b/x-pack/plugins/canvas/public/expression_types/arg_types/container_style/border_form.tsx @@ -50,25 +50,27 @@ export const BorderForm: FunctionComponent = ({ const borderWidthVal = borderWidth ? borderWidth.replace('px', '') : ''; const radiusVal = typeof radius === 'string' ? radius.replace('px', '') : radius; - const namedChange = (name: T) => (val: Arguments[T]) => { - if (name === 'borderWidth') { - return onChange('border', `${val}px ${borderStyle} ${borderColor}`); - } - if (name === 'borderStyle') { - if (val === '') { - return onChange('border', `0px`); + const namedChange = + (name: T) => + (val: Arguments[T]) => { + if (name === 'borderWidth') { + return onChange('border', `${val}px ${borderStyle} ${borderColor}`); } - return onChange('border', `${borderWidth} ${val} ${borderColor}`); - } - if (name === 'borderRadius') { - if (val === '') { - return onChange('borderRadius', `0px`); + if (name === 'borderStyle') { + if (val === '') { + return onChange('border', `0px`); + } + return onChange('border', `${borderWidth} ${val} ${borderColor}`); + } + if (name === 'borderRadius') { + if (val === '') { + return onChange('borderRadius', `0px`); + } + return onChange('borderRadius', `${val}px`); } - return onChange('borderRadius', `${val}px`); - } - onChange(name, val); - }; + onChange(name, val); + }; const borderColorChange = (color: string) => onChange('border', `${borderWidth} ${borderStyle} ${color}`); diff --git a/x-pack/plugins/canvas/public/expression_types/arg_types/container_style/index.ts b/x-pack/plugins/canvas/public/expression_types/arg_types/container_style/index.ts index d54870922216c..0aaa9a2b5b92e 100644 --- a/x-pack/plugins/canvas/public/expression_types/arg_types/container_style/index.ts +++ b/x-pack/plugins/canvas/public/expression_types/arg_types/container_style/index.ts @@ -34,14 +34,18 @@ interface OuterProps { const wrap = (Component: ComponentType) => // TODO: this should be in a helper withHandlers({ - getArgValue: ({ argValue }) => (name, alt) => { - const args = get(argValue, 'chain.0.arguments', {}); - return get(args, `${name}.0`, alt); - }, - setArgValue: ({ argValue, onValueChange }) => (name, val) => { - const newValue = set(argValue, `chain.0.arguments.${name}.0`, val); - onValueChange(newValue); - }, + getArgValue: + ({ argValue }) => + (name, alt) => { + const args = get(argValue, 'chain.0.arguments', {}); + return get(args, `${name}.0`, alt); + }, + setArgValue: + ({ argValue, onValueChange }) => + (name, val) => { + const newValue = set(argValue, `chain.0.arguments.${name}.0`, val); + onValueChange(newValue); + }, })(Component); export const containerStyle = () => ({ diff --git a/x-pack/plugins/canvas/public/functions/pie.ts b/x-pack/plugins/canvas/public/functions/pie.ts index a91dc16b770c9..11e487273b31c 100644 --- a/x-pack/plugins/canvas/public/functions/pie.ts +++ b/x-pack/plugins/canvas/public/functions/pie.ts @@ -134,17 +134,8 @@ export function pieFunctionFactory( }, }, fn: (input, args) => { - const { - tilt, - radius, - labelRadius, - labels, - hole, - legend, - palette, - font, - seriesStyle, - } = args; + const { tilt, radius, labelRadius, labels, hole, legend, palette, font, seriesStyle } = + args; const seriesStyles = keyBy(seriesStyle || [], 'label') || {}; const data: PieData[] = map(groupBy(input.rows, 'color'), (series, label = '') => { diff --git a/x-pack/plugins/canvas/public/lib/aeroelastic/functional.js b/x-pack/plugins/canvas/public/lib/aeroelastic/functional.js index 828140c8b023c..a817a4c196e7a 100644 --- a/x-pack/plugins/canvas/public/lib/aeroelastic/functional.js +++ b/x-pack/plugins/canvas/public/lib/aeroelastic/functional.js @@ -71,7 +71,10 @@ export const shallowEqual = (a, b) => { return true; }; -export const not = (fun) => (...args) => !fun(...args); +export const not = + (fun) => + (...args) => + !fun(...args); export const removeDuplicates = (idFun, a) => a.filter((d, i) => a.findIndex((s) => idFun(s) === idFun(d)) === i); diff --git a/x-pack/plugins/canvas/public/lib/aeroelastic/geometry.js b/x-pack/plugins/canvas/public/lib/aeroelastic/geometry.js index 92774720d98a9..9fff28142a052 100644 --- a/x-pack/plugins/canvas/public/lib/aeroelastic/geometry.js +++ b/x-pack/plugins/canvas/public/lib/aeroelastic/geometry.js @@ -31,13 +31,15 @@ const cornerScreenPositions = (transformMatrix, a, b) => mvMultiply(transformMatrix, componentProduct(corner, [a, b, 0, 1])) ); -export const insideAABB = ({ x, y, a, b }) => (transformMatrix, aa, bb) => { - const corners = cornerScreenPositions(transformMatrix, aa, bb); - return corners.every(([xx, yy]) => { - const result = x - a <= xx && xx <= x + a && y - b <= yy && yy <= y + b; - return result; - }); -}; +export const insideAABB = + ({ x, y, a, b }) => + (transformMatrix, aa, bb) => { + const corners = cornerScreenPositions(transformMatrix, aa, bb); + return corners.every(([xx, yy]) => { + const result = x - a <= xx && xx <= x + a && y - b <= yy && yy <= y + b; + return result; + }); + }; /** * diff --git a/x-pack/plugins/canvas/public/lib/aeroelastic/layout_functions.js b/x-pack/plugins/canvas/public/lib/aeroelastic/layout_functions.js index a2f212704638a..b4d33627d734a 100644 --- a/x-pack/plugins/canvas/public/lib/aeroelastic/layout_functions.js +++ b/x-pack/plugins/canvas/public/lib/aeroelastic/layout_functions.js @@ -228,34 +228,33 @@ const getContentShapes = (allShapes, shapes) => { const primaryShape = (shape) => (shape.type === 'annotation' ? shape.parent : shape.id); -const rotationManipulation = (config) => ({ - shape, - directShape, - cursorPosition: { x, y }, - alterSnapGesture, -}) => { - // rotate around a Z-parallel line going through the shape center (ie. around the center) - if (!shape || !directShape) { - return { transforms: [], shapes: [] }; - } - const center = shape.transformMatrix; - const centerPosition = mvMultiply(center, ORIGIN); - const vector = mvMultiply(multiply(center, directShape.localTransformMatrix), ORIGIN); - const oldAngle = Math.atan2(centerPosition[1] - vector[1], centerPosition[0] - vector[0]); - const newAngle = Math.atan2(centerPosition[1] - y, centerPosition[0] - x); - const closest45deg = (Math.round(newAngle / (Math.PI / 12)) * Math.PI) / 12; - const radius = Math.sqrt(Math.pow(centerPosition[0] - x, 2) + Math.pow(centerPosition[1] - y, 2)); - const closest45degPosition = [Math.cos(closest45deg) * radius, Math.sin(closest45deg) * radius]; - const pixelDifference = Math.sqrt( - Math.pow(closest45degPosition[0] - (centerPosition[0] - x), 2) + - Math.pow(closest45degPosition[1] - (centerPosition[1] - y), 2) - ); - const relaxed = alterSnapGesture.indexOf('relax') !== -1; - const newSnappedAngle = - pixelDifference < config.rotateSnapInPixels && !relaxed ? closest45deg : newAngle; - const result = rotateZ(oldAngle - newSnappedAngle); - return { transforms: [result], shapes: [shape.id] }; -}; +const rotationManipulation = + (config) => + ({ shape, directShape, cursorPosition: { x, y }, alterSnapGesture }) => { + // rotate around a Z-parallel line going through the shape center (ie. around the center) + if (!shape || !directShape) { + return { transforms: [], shapes: [] }; + } + const center = shape.transformMatrix; + const centerPosition = mvMultiply(center, ORIGIN); + const vector = mvMultiply(multiply(center, directShape.localTransformMatrix), ORIGIN); + const oldAngle = Math.atan2(centerPosition[1] - vector[1], centerPosition[0] - vector[0]); + const newAngle = Math.atan2(centerPosition[1] - y, centerPosition[0] - x); + const closest45deg = (Math.round(newAngle / (Math.PI / 12)) * Math.PI) / 12; + const radius = Math.sqrt( + Math.pow(centerPosition[0] - x, 2) + Math.pow(centerPosition[1] - y, 2) + ); + const closest45degPosition = [Math.cos(closest45deg) * radius, Math.sin(closest45deg) * radius]; + const pixelDifference = Math.sqrt( + Math.pow(closest45degPosition[0] - (centerPosition[0] - x), 2) + + Math.pow(closest45degPosition[1] - (centerPosition[1] - y), 2) + ); + const relaxed = alterSnapGesture.indexOf('relax') !== -1; + const newSnappedAngle = + pixelDifference < config.rotateSnapInPixels && !relaxed ? closest45deg : newAngle; + const result = rotateZ(oldAngle - newSnappedAngle); + return { transforms: [result], shapes: [shape.id] }; + }; const minimumSize = (min, { a, b, baseAB }, vector) => { // don't allow an element size of less than the minimumElementSize @@ -266,71 +265,75 @@ const minimumSize = (min, { a, b, baseAB }, vector) => { ]; }; -const centeredResizeManipulation = (config) => ({ gesture, shape, directShape }) => { - const transform = gesture.cumulativeTransform; - // scaling such that the center remains in place (ie. the other side of the shape can grow/shrink) - if (!shape || !directShape) { - return { transforms: [], shapes: [] }; - } - // transform the incoming `transform` so that resizing is aligned with shape orientation - const vector = mvMultiply( - multiply( - invert(compositeComponent(shape.localTransformMatrix)), // rid the translate component - transform - ), - ORIGIN - ); - const orientationMask = [ - resizeMultiplierHorizontal[directShape.horizontalPosition], - resizeMultiplierVertical[directShape.verticalPosition], - 0, - ]; - const orientedVector = componentProduct2d(vector, orientationMask); - const cappedOrientedVector = minimumSize(config.minimumElementSize, shape, orientedVector); - return { - cumulativeTransforms: [], - cumulativeSizes: [gesture.sizes || translate2d(...cappedOrientedVector)], - shapes: [shape.id], +const centeredResizeManipulation = + (config) => + ({ gesture, shape, directShape }) => { + const transform = gesture.cumulativeTransform; + // scaling such that the center remains in place (ie. the other side of the shape can grow/shrink) + if (!shape || !directShape) { + return { transforms: [], shapes: [] }; + } + // transform the incoming `transform` so that resizing is aligned with shape orientation + const vector = mvMultiply( + multiply( + invert(compositeComponent(shape.localTransformMatrix)), // rid the translate component + transform + ), + ORIGIN + ); + const orientationMask = [ + resizeMultiplierHorizontal[directShape.horizontalPosition], + resizeMultiplierVertical[directShape.verticalPosition], + 0, + ]; + const orientedVector = componentProduct2d(vector, orientationMask); + const cappedOrientedVector = minimumSize(config.minimumElementSize, shape, orientedVector); + return { + cumulativeTransforms: [], + cumulativeSizes: [gesture.sizes || translate2d(...cappedOrientedVector)], + shapes: [shape.id], + }; }; -}; -const asymmetricResizeManipulation = (config) => ({ gesture, shape, directShape }) => { - const transform = gesture.cumulativeTransform; - // scaling such that the center remains in place (ie. the other side of the shape can grow/shrink) - if (!shape || !directShape) { - return { transforms: [], shapes: [] }; - } - // transform the incoming `transform` so that resizing is aligned with shape orientation - const composite = compositeComponent(shape.localTransformMatrix); - const inv = invert(composite); // rid the translate component - const vector = mvMultiply(multiply(inv, transform), ORIGIN); - const orientationMask = [ - resizeMultiplierHorizontal[directShape.horizontalPosition] / 2, - resizeMultiplierVertical[directShape.verticalPosition] / 2, - 0, - ]; - const orientedVector = componentProduct2d(vector, orientationMask); - const cappedOrientedVector = minimumSize(config.minimumElementSize, shape, orientedVector); - - const antiRotatedVector = mvMultiply( - multiply( - composite, - scale( - resizeMultiplierHorizontal[directShape.horizontalPosition], - resizeMultiplierVertical[directShape.verticalPosition], - 1 +const asymmetricResizeManipulation = + (config) => + ({ gesture, shape, directShape }) => { + const transform = gesture.cumulativeTransform; + // scaling such that the center remains in place (ie. the other side of the shape can grow/shrink) + if (!shape || !directShape) { + return { transforms: [], shapes: [] }; + } + // transform the incoming `transform` so that resizing is aligned with shape orientation + const composite = compositeComponent(shape.localTransformMatrix); + const inv = invert(composite); // rid the translate component + const vector = mvMultiply(multiply(inv, transform), ORIGIN); + const orientationMask = [ + resizeMultiplierHorizontal[directShape.horizontalPosition] / 2, + resizeMultiplierVertical[directShape.verticalPosition] / 2, + 0, + ]; + const orientedVector = componentProduct2d(vector, orientationMask); + const cappedOrientedVector = minimumSize(config.minimumElementSize, shape, orientedVector); + + const antiRotatedVector = mvMultiply( + multiply( + composite, + scale( + resizeMultiplierHorizontal[directShape.horizontalPosition], + resizeMultiplierVertical[directShape.verticalPosition], + 1 + ), + translate(cappedOrientedVector[0], cappedOrientedVector[1], 0) ), - translate(cappedOrientedVector[0], cappedOrientedVector[1], 0) - ), - ORIGIN - ); - const sizeMatrix = gesture.sizes || translate2d(...cappedOrientedVector); - return { - cumulativeTransforms: [translate(antiRotatedVector[0], antiRotatedVector[1], 0)], - cumulativeSizes: [sizeMatrix], - shapes: [shape.id], + ORIGIN + ); + const sizeMatrix = gesture.sizes || translate2d(...cappedOrientedVector); + return { + cumulativeTransforms: [translate(antiRotatedVector[0], antiRotatedVector[1], 0)], + cumulativeSizes: [sizeMatrix], + shapes: [shape.id], + }; }; -}; const directShapeTranslateManipulation = (cumulativeTransforms, directShapes) => { const shapes = directShapes @@ -808,55 +811,59 @@ export const getRotationTooltipAnnotation = (config, proper, shape, intents, cur ] : []; -const resizePointAnnotations = (config, parent, a, b) => ([x, y, cursorAngle]) => { - const markerPlace = translate(x * a, y * b, config.resizeAnnotationOffsetZ); - const pixelOffset = translate( - -x * config.resizeAnnotationOffset, - -y * config.resizeAnnotationOffset, - config.atopZ + 10 - ); - const transform = multiply(markerPlace, pixelOffset); - const xName = xNames[x]; - const yName = yNames[y]; - return { - id: [config.resizeHandleName, xName, yName, parent.id].join('_'), - type: 'annotation', - subtype: config.resizeHandleName, - horizontalPosition: xName, - verticalPosition: yName, - cursorAngle, - interactive: true, - parent: parent.id, - localTransformMatrix: transform, - backgroundColor: 'rgb(0,255,0,1)', - a: config.resizeAnnotationSize, - b: config.resizeAnnotationSize, +const resizePointAnnotations = + (config, parent, a, b) => + ([x, y, cursorAngle]) => { + const markerPlace = translate(x * a, y * b, config.resizeAnnotationOffsetZ); + const pixelOffset = translate( + -x * config.resizeAnnotationOffset, + -y * config.resizeAnnotationOffset, + config.atopZ + 10 + ); + const transform = multiply(markerPlace, pixelOffset); + const xName = xNames[x]; + const yName = yNames[y]; + return { + id: [config.resizeHandleName, xName, yName, parent.id].join('_'), + type: 'annotation', + subtype: config.resizeHandleName, + horizontalPosition: xName, + verticalPosition: yName, + cursorAngle, + interactive: true, + parent: parent.id, + localTransformMatrix: transform, + backgroundColor: 'rgb(0,255,0,1)', + a: config.resizeAnnotationSize, + b: config.resizeAnnotationSize, + }; }; -}; -const resizeEdgeAnnotations = (config, parent, a, b) => ([[x0, y0], [x1, y1]]) => { - const x = a * mean(x0, x1); - const y = b * mean(y0, y1); - const markerPlace = translate(x, y, config.atopZ - 10); - const transform = markerPlace; // no offset etc. at the moment - const horizontal = y0 === y1; - const length = horizontal ? a * Math.abs(x1 - x0) : b * Math.abs(y1 - y0); - const sectionHalfLength = Math.max(0, length / 2 - config.resizeAnnotationConnectorOffset); - const width = 0.5; - return { - id: [config.resizeConnectorName, xNames[x0], yNames[y0], xNames[x1], yNames[y1], parent].join( - '_' - ), - type: 'annotation', - subtype: config.resizeConnectorName, - interactive: true, - parent: parent.id, - localTransformMatrix: transform, - backgroundColor: config.devColor, - a: horizontal ? sectionHalfLength : width, - b: horizontal ? width : sectionHalfLength, +const resizeEdgeAnnotations = + (config, parent, a, b) => + ([[x0, y0], [x1, y1]]) => { + const x = a * mean(x0, x1); + const y = b * mean(y0, y1); + const markerPlace = translate(x, y, config.atopZ - 10); + const transform = markerPlace; // no offset etc. at the moment + const horizontal = y0 === y1; + const length = horizontal ? a * Math.abs(x1 - x0) : b * Math.abs(y1 - y0); + const sectionHalfLength = Math.max(0, length / 2 - config.resizeAnnotationConnectorOffset); + const width = 0.5; + return { + id: [config.resizeConnectorName, xNames[x0], yNames[y0], xNames[x1], yNames[y1], parent].join( + '_' + ), + type: 'annotation', + subtype: config.resizeConnectorName, + interactive: true, + parent: parent.id, + localTransformMatrix: transform, + backgroundColor: config.devColor, + a: horizontal ? sectionHalfLength : width, + b: horizontal ? width : sectionHalfLength, + }; }; -}; const groupedShape = (properShape) => (shape) => shape.parent === properShape.id; const magic = (config, shape, shapes) => { @@ -951,79 +958,80 @@ const crystallizeConstraint = (shape) => { return result; }; -const translateShapeSnap = (horizontalConstraint, verticalConstraint, draggedElement) => ( - shape -) => { - const constrainedX = horizontalConstraint && horizontalConstraint.constrained === shape.id; - const constrainedY = verticalConstraint && verticalConstraint.constrained === shape.id; - const snapOffsetX = constrainedX ? -horizontalConstraint.signedDistance : 0; - const snapOffsetY = constrainedY ? -verticalConstraint.signedDistance : 0; - if (constrainedX || constrainedY) { - if (!snapOffsetX && !snapOffsetY) { +const translateShapeSnap = + (horizontalConstraint, verticalConstraint, draggedElement) => (shape) => { + const constrainedX = horizontalConstraint && horizontalConstraint.constrained === shape.id; + const constrainedY = verticalConstraint && verticalConstraint.constrained === shape.id; + const snapOffsetX = constrainedX ? -horizontalConstraint.signedDistance : 0; + const snapOffsetY = constrainedY ? -verticalConstraint.signedDistance : 0; + if (constrainedX || constrainedY) { + if (!snapOffsetX && !snapOffsetY) { + return shape; + } + const snapOffset = translateComponent( + multiply( + rotateZ(matrixToAngle(draggedElement.localTransformMatrix)), + translate(snapOffsetX, snapOffsetY, 0) + ) + ); + return { + ...shape, + snapDeltaMatrix: snapOffset, + }; + } else if (shape.snapDeltaMatrix || shape.snapResizeVector) { + return crystallizeConstraint(shape); + } else { return shape; } - const snapOffset = translateComponent( - multiply( - rotateZ(matrixToAngle(draggedElement.localTransformMatrix)), - translate(snapOffsetX, snapOffsetY, 0) - ) - ); - return { - ...shape, - snapDeltaMatrix: snapOffset, - }; - } else if (shape.snapDeltaMatrix || shape.snapResizeVector) { - return crystallizeConstraint(shape); - } else { - return shape; - } -}; + }; -const resizeShapeSnap = ( - horizontalConstraint, - verticalConstraint, - draggedElement, - symmetric, - horizontalPosition, - verticalPosition -) => (shape) => { - const constrainedShape = draggedElement && shape.id === draggedElement.id; - const constrainedX = horizontalConstraint && horizontalConstraint.constrained === shape.id; - const constrainedY = verticalConstraint && verticalConstraint.constrained === shape.id; - const snapOffsetX = constrainedX ? horizontalConstraint.signedDistance : 0; - const snapOffsetY = constrainedY ? -verticalConstraint.signedDistance : 0; - if (constrainedX || constrainedY) { - const multiplier = symmetric ? 1 : 0.5; - const angle = matrixToAngle(draggedElement.localTransformMatrix); - const horizontalSign = -resizeMultiplierHorizontal[horizontalPosition]; // fixme unify sign - const verticalSign = resizeMultiplierVertical[verticalPosition]; - // todo turn it into matrix algebra via matrix2d.js - const sin = Math.sin(angle); - const cos = Math.cos(angle); - const snapOffsetA = horizontalSign * (cos * snapOffsetX - sin * snapOffsetY); - const snapOffsetB = verticalSign * (sin * snapOffsetX + cos * snapOffsetY); - const snapTranslateOffset = translateComponent( - multiply( - rotateZ(angle), - translate((1 - multiplier) * -snapOffsetX, (1 - multiplier) * snapOffsetY, 0) - ) - ); - const snapSizeOffset = [multiplier * snapOffsetA, multiplier * snapOffsetB]; - return { - ...shape, - snapDeltaMatrix: snapTranslateOffset, - snapResizeVector: snapSizeOffset, - }; - } else if (constrainedShape) { - return { - ...shape, - snapDeltaMatrix: null, - snapResizeVector: null, - }; - } else { - return crystallizeConstraint(shape); - } -}; +const resizeShapeSnap = + ( + horizontalConstraint, + verticalConstraint, + draggedElement, + symmetric, + horizontalPosition, + verticalPosition + ) => + (shape) => { + const constrainedShape = draggedElement && shape.id === draggedElement.id; + const constrainedX = horizontalConstraint && horizontalConstraint.constrained === shape.id; + const constrainedY = verticalConstraint && verticalConstraint.constrained === shape.id; + const snapOffsetX = constrainedX ? horizontalConstraint.signedDistance : 0; + const snapOffsetY = constrainedY ? -verticalConstraint.signedDistance : 0; + if (constrainedX || constrainedY) { + const multiplier = symmetric ? 1 : 0.5; + const angle = matrixToAngle(draggedElement.localTransformMatrix); + const horizontalSign = -resizeMultiplierHorizontal[horizontalPosition]; // fixme unify sign + const verticalSign = resizeMultiplierVertical[verticalPosition]; + // todo turn it into matrix algebra via matrix2d.js + const sin = Math.sin(angle); + const cos = Math.cos(angle); + const snapOffsetA = horizontalSign * (cos * snapOffsetX - sin * snapOffsetY); + const snapOffsetB = verticalSign * (sin * snapOffsetX + cos * snapOffsetY); + const snapTranslateOffset = translateComponent( + multiply( + rotateZ(angle), + translate((1 - multiplier) * -snapOffsetX, (1 - multiplier) * snapOffsetY, 0) + ) + ); + const snapSizeOffset = [multiplier * snapOffsetA, multiplier * snapOffsetB]; + return { + ...shape, + snapDeltaMatrix: snapTranslateOffset, + snapResizeVector: snapSizeOffset, + }; + } else if (constrainedShape) { + return { + ...shape, + snapDeltaMatrix: null, + snapResizeVector: null, + }; + } else { + return crystallizeConstraint(shape); + } + }; const dissolveGroups = (groupsToDissolve, shapes, selectedShapes) => { return { diff --git a/x-pack/plugins/canvas/public/lib/aeroelastic/select.ts b/x-pack/plugins/canvas/public/lib/aeroelastic/select.ts index e84617a3a9fea..bc107ecdd6008 100644 --- a/x-pack/plugins/canvas/public/lib/aeroelastic/select.ts +++ b/x-pack/plugins/canvas/public/lib/aeroelastic/select.ts @@ -7,9 +7,11 @@ import { ActionId, Json, PlainFun, Resolve, Selector, State } from '.'; -export const select = (fun: PlainFun): Selector => (...fns: Resolve[]) => { - let prevId: ActionId = NaN; - let cache: Json = null; - const old = (object: State): boolean => prevId === (prevId = object.primaryUpdate.payload.uid); - return (obj: State) => (old(obj) ? cache : (cache = fun(...fns.map((f) => f(obj))))); -}; +export const select = + (fun: PlainFun): Selector => + (...fns: Resolve[]) => { + let prevId: ActionId = NaN; + let cache: Json = null; + const old = (object: State): boolean => prevId === (prevId = object.primaryUpdate.payload.uid); + return (obj: State) => (old(obj) ? cache : (cache = fun(...fns.map((f) => f(obj))))); + }; diff --git a/x-pack/plugins/canvas/public/lib/app_handler_creators.ts b/x-pack/plugins/canvas/public/lib/app_handler_creators.ts index 87c66cf195830..f678dfeb0b2b4 100644 --- a/x-pack/plugins/canvas/public/lib/app_handler_creators.ts +++ b/x-pack/plugins/canvas/public/lib/app_handler_creators.ts @@ -24,19 +24,25 @@ export interface Props { // handlers for zooming in and out export const zoomHandlerCreators = { - zoomIn: ({ zoomScale, setZoomScale }: Props) => (): void => { - const scaleUp = - ZOOM_LEVELS.find((zoomLevel: number) => zoomScale < zoomLevel) || MAX_ZOOM_LEVEL; - setZoomScale(scaleUp); - }, - zoomOut: ({ zoomScale, setZoomScale }: Props) => (): void => { - const scaleDown = - ZOOM_LEVELS.slice() - .reverse() - .find((zoomLevel: number) => zoomScale > zoomLevel) || MIN_ZOOM_LEVEL; - setZoomScale(scaleDown); - }, - resetZoom: ({ setZoomScale }: Props) => (): void => { - setZoomScale(1); - }, + zoomIn: + ({ zoomScale, setZoomScale }: Props) => + (): void => { + const scaleUp = + ZOOM_LEVELS.find((zoomLevel: number) => zoomScale < zoomLevel) || MAX_ZOOM_LEVEL; + setZoomScale(scaleUp); + }, + zoomOut: + ({ zoomScale, setZoomScale }: Props) => + (): void => { + const scaleDown = + ZOOM_LEVELS.slice() + .reverse() + .find((zoomLevel: number) => zoomScale > zoomLevel) || MIN_ZOOM_LEVEL; + setZoomScale(scaleDown); + }, + resetZoom: + ({ setZoomScale }: Props) => + (): void => { + setZoomScale(1); + }, }; diff --git a/x-pack/plugins/canvas/public/lib/element_handler_creators.ts b/x-pack/plugins/canvas/public/lib/element_handler_creators.ts index 62d405e167f1e..82b9827529040 100644 --- a/x-pack/plugins/canvas/public/lib/element_handler_creators.ts +++ b/x-pack/plugins/canvas/public/lib/element_handler_creators.ts @@ -52,55 +52,57 @@ export interface Props { // handlers for clone, delete, and saving custom elements export const basicHandlerCreators = { - cloneNodes: ({ insertNodes, pageId, selectToplevelNodes, selectedNodes }: Props) => (): void => { - const clonedNodes = selectedNodes && cloneSubgraphs(selectedNodes); - if (clonedNodes) { - insertNodes(clonedNodes, pageId); - selectToplevelNodes(clonedNodes); - } - }, - deleteNodes: ({ pageId, removeNodes, selectedNodes }: Props) => (): void => { - if (selectedNodes.length) { - removeNodes(selectedNodes.map(extractId), pageId); - } - }, - createCustomElement: ({ selectedNodes }: Props) => ( - name = '', - description = '', - image = '' - ): void => { - const notifyService = pluginServices.getServices().notify; - const customElementService = pluginServices.getServices().customElement; + cloneNodes: + ({ insertNodes, pageId, selectToplevelNodes, selectedNodes }: Props) => + (): void => { + const clonedNodes = selectedNodes && cloneSubgraphs(selectedNodes); + if (clonedNodes) { + insertNodes(clonedNodes, pageId); + selectToplevelNodes(clonedNodes); + } + }, + deleteNodes: + ({ pageId, removeNodes, selectedNodes }: Props) => + (): void => { + if (selectedNodes.length) { + removeNodes(selectedNodes.map(extractId), pageId); + } + }, + createCustomElement: + ({ selectedNodes }: Props) => + (name = '', description = '', image = ''): void => { + const notifyService = pluginServices.getServices().notify; + const customElementService = pluginServices.getServices().customElement; - if (selectedNodes.length) { - const content = JSON.stringify({ selectedNodes }); - const customElement = { - id: getId('custom-element'), - name: camelCase(name), - displayName: name, - help: description, - image, - content, - }; - customElementService - .create(customElement) - .then(() => - notifyService.success( - `Custom element '${customElement.displayName || customElement.id}' was saved`, - { - 'data-test-subj': 'canvasCustomElementCreate-success', - } + if (selectedNodes.length) { + const content = JSON.stringify({ selectedNodes }); + const customElement = { + id: getId('custom-element'), + name: camelCase(name), + displayName: name, + help: description, + image, + content, + }; + customElementService + .create(customElement) + .then(() => + notifyService.success( + `Custom element '${customElement.displayName || customElement.id}' was saved`, + { + 'data-test-subj': 'canvasCustomElementCreate-success', + } + ) ) - ) - .catch((error: Error) => - notifyService.warning(error, { - title: `Custom element '${ - customElement.displayName || customElement.id - }' was not saved`, - }) - ); - } - }, + .catch((error: Error) => + notifyService.warning(error, { + title: `Custom element '${ + customElement.displayName || customElement.id + }' was not saved`, + }) + ); + } + }, }; // handlers for alignment and distribution @@ -116,140 +118,176 @@ export const alignmentDistributionHandlerCreators = Object.assign( 'distributeHorizontally', 'distributeVertically', ].map((event: string) => ({ - [event]: ({ commit }: Props) => (): void => { - commit('actionEvent', { event }); - }, + [event]: + ({ commit }: Props) => + (): void => { + commit('actionEvent', { event }); + }, })) ); // handlers for group and ungroup export const groupHandlerCreators = { - groupNodes: ({ commit }: Props) => (): void => { - commit('actionEvent', { event: 'group' }); - }, - ungroupNodes: ({ commit }: Props) => (): void => { - commit('actionEvent', { event: 'ungroup' }); - }, + groupNodes: + ({ commit }: Props) => + (): void => { + commit('actionEvent', { event: 'group' }); + }, + ungroupNodes: + ({ commit }: Props) => + (): void => { + commit('actionEvent', { event: 'ungroup' }); + }, }; // handlers for cut/copy/paste export const clipboardHandlerCreators = { - cutNodes: ({ pageId, removeNodes, selectedNodes }: Props) => (): void => { - const notifyService = pluginServices.getServices().notify; + cutNodes: + ({ pageId, removeNodes, selectedNodes }: Props) => + (): void => { + const notifyService = pluginServices.getServices().notify; - if (selectedNodes.length) { - setClipboardData({ selectedNodes }); - removeNodes(selectedNodes.map(extractId), pageId); - notifyService.success('Cut element to clipboard'); - } - }, - copyNodes: ({ selectedNodes }: Props) => (): void => { - const notifyService = pluginServices.getServices().notify; + if (selectedNodes.length) { + setClipboardData({ selectedNodes }); + removeNodes(selectedNodes.map(extractId), pageId); + notifyService.success('Cut element to clipboard'); + } + }, + copyNodes: + ({ selectedNodes }: Props) => + (): void => { + const notifyService = pluginServices.getServices().notify; - if (selectedNodes.length) { - setClipboardData({ selectedNodes }); - notifyService.success('Copied element to clipboard'); - } - }, - pasteNodes: ({ insertNodes, pageId, selectToplevelNodes }: Props) => (): void => { - const { selectedNodes = [] } = JSON.parse(getClipboardData()) || {}; - const clonedNodes = selectedNodes && cloneSubgraphs(selectedNodes); - if (clonedNodes) { - insertNodes(clonedNodes, pageId); // first clone and persist the new node(s) - selectToplevelNodes(clonedNodes); // then select the cloned node(s) - } - }, + if (selectedNodes.length) { + setClipboardData({ selectedNodes }); + notifyService.success('Copied element to clipboard'); + } + }, + pasteNodes: + ({ insertNodes, pageId, selectToplevelNodes }: Props) => + (): void => { + const { selectedNodes = [] } = JSON.parse(getClipboardData()) || {}; + const clonedNodes = selectedNodes && cloneSubgraphs(selectedNodes); + if (clonedNodes) { + insertNodes(clonedNodes, pageId); // first clone and persist the new node(s) + selectToplevelNodes(clonedNodes); // then select the cloned node(s) + } + }, }; // handlers for changing element layer position // TODO: support relayering multiple elements export const layerHandlerCreators = { - bringToFront: ({ elementLayer, pageId, selectedNodes }: Props) => (): void => { - if (selectedNodes.length === 1) { - elementLayer(pageId, selectedNodes[0].id, Infinity); - } - }, - bringForward: ({ elementLayer, pageId, selectedNodes }: Props) => (): void => { - if (selectedNodes.length === 1) { - elementLayer(pageId, selectedNodes[0].id, 1); - } - }, - sendBackward: ({ elementLayer, pageId, selectedNodes }: Props) => (): void => { - if (selectedNodes.length === 1) { - elementLayer(pageId, selectedNodes[0].id, -1); - } - }, - sendToBack: ({ elementLayer, pageId, selectedNodes }: Props) => (): void => { - if (selectedNodes.length === 1) { - elementLayer(pageId, selectedNodes[0].id, -Infinity); - } - }, + bringToFront: + ({ elementLayer, pageId, selectedNodes }: Props) => + (): void => { + if (selectedNodes.length === 1) { + elementLayer(pageId, selectedNodes[0].id, Infinity); + } + }, + bringForward: + ({ elementLayer, pageId, selectedNodes }: Props) => + (): void => { + if (selectedNodes.length === 1) { + elementLayer(pageId, selectedNodes[0].id, 1); + } + }, + sendBackward: + ({ elementLayer, pageId, selectedNodes }: Props) => + (): void => { + if (selectedNodes.length === 1) { + elementLayer(pageId, selectedNodes[0].id, -1); + } + }, + sendToBack: + ({ elementLayer, pageId, selectedNodes }: Props) => + (): void => { + if (selectedNodes.length === 1) { + elementLayer(pageId, selectedNodes[0].id, -Infinity); + } + }, }; // handlers for shifting elements up, down, left, and right export const positionHandlerCreators = { - shiftUp: ({ selectedNodes, setMultiplePositions }: Props) => (): void => { - setMultiplePositions( - selectedNodes.map((element) => { - element.position.top -= ELEMENT_SHIFT_OFFSET; - return element; - }) - ); - }, - shiftDown: ({ selectedNodes, setMultiplePositions }: Props) => (): void => { - setMultiplePositions( - selectedNodes.map((element) => { - element.position.top += ELEMENT_SHIFT_OFFSET; - return element; - }) - ); - }, - shiftLeft: ({ selectedNodes, setMultiplePositions }: Props) => (): void => { - setMultiplePositions( - selectedNodes.map((element) => { - element.position.left -= ELEMENT_SHIFT_OFFSET; - return element; - }) - ); - }, - shiftRight: ({ selectedNodes, setMultiplePositions }: Props) => (): void => { - setMultiplePositions( - selectedNodes.map((element) => { - element.position.left += ELEMENT_SHIFT_OFFSET; - return element; - }) - ); - }, - nudgeUp: ({ selectedNodes, setMultiplePositions }: Props) => (): void => { - setMultiplePositions( - selectedNodes.map((element) => { - element.position.top -= ELEMENT_NUDGE_OFFSET; - return element; - }) - ); - }, - nudgeDown: ({ selectedNodes, setMultiplePositions }: Props) => (): void => { - setMultiplePositions( - selectedNodes.map((element) => { - element.position.top += ELEMENT_NUDGE_OFFSET; - return element; - }) - ); - }, - nudgeLeft: ({ selectedNodes, setMultiplePositions }: Props) => (): void => { - setMultiplePositions( - selectedNodes.map((element) => { - element.position.left -= ELEMENT_NUDGE_OFFSET; - return element; - }) - ); - }, - nudgeRight: ({ selectedNodes, setMultiplePositions }: Props) => (): void => { - setMultiplePositions( - selectedNodes.map((element) => { - element.position.left += ELEMENT_NUDGE_OFFSET; - return element; - }) - ); - }, + shiftUp: + ({ selectedNodes, setMultiplePositions }: Props) => + (): void => { + setMultiplePositions( + selectedNodes.map((element) => { + element.position.top -= ELEMENT_SHIFT_OFFSET; + return element; + }) + ); + }, + shiftDown: + ({ selectedNodes, setMultiplePositions }: Props) => + (): void => { + setMultiplePositions( + selectedNodes.map((element) => { + element.position.top += ELEMENT_SHIFT_OFFSET; + return element; + }) + ); + }, + shiftLeft: + ({ selectedNodes, setMultiplePositions }: Props) => + (): void => { + setMultiplePositions( + selectedNodes.map((element) => { + element.position.left -= ELEMENT_SHIFT_OFFSET; + return element; + }) + ); + }, + shiftRight: + ({ selectedNodes, setMultiplePositions }: Props) => + (): void => { + setMultiplePositions( + selectedNodes.map((element) => { + element.position.left += ELEMENT_SHIFT_OFFSET; + return element; + }) + ); + }, + nudgeUp: + ({ selectedNodes, setMultiplePositions }: Props) => + (): void => { + setMultiplePositions( + selectedNodes.map((element) => { + element.position.top -= ELEMENT_NUDGE_OFFSET; + return element; + }) + ); + }, + nudgeDown: + ({ selectedNodes, setMultiplePositions }: Props) => + (): void => { + setMultiplePositions( + selectedNodes.map((element) => { + element.position.top += ELEMENT_NUDGE_OFFSET; + return element; + }) + ); + }, + nudgeLeft: + ({ selectedNodes, setMultiplePositions }: Props) => + (): void => { + setMultiplePositions( + selectedNodes.map((element) => { + element.position.left -= ELEMENT_NUDGE_OFFSET; + return element; + }) + ); + }, + nudgeRight: + ({ selectedNodes, setMultiplePositions }: Props) => + (): void => { + setMultiplePositions( + selectedNodes.map((element) => { + element.position.left += ELEMENT_NUDGE_OFFSET; + return element; + }) + ); + }, }; diff --git a/x-pack/plugins/canvas/public/plugin.tsx b/x-pack/plugins/canvas/public/plugin.tsx index 3b4a6b6f1ee4b..555cedb6b16a1 100644 --- a/x-pack/plugins/canvas/public/plugin.tsx +++ b/x-pack/plugins/canvas/public/plugin.tsx @@ -76,7 +76,8 @@ export type CanvasStart = void; /** @internal */ export class CanvasPlugin - implements Plugin { + implements Plugin +{ private appUpdater = new BehaviorSubject(() => ({})); private initContext: PluginInitializerContext; diff --git a/x-pack/plugins/canvas/public/plugin_api.ts b/x-pack/plugins/canvas/public/plugin_api.ts index 55a7390437c2b..aafbc2237a531 100644 --- a/x-pack/plugins/canvas/public/plugin_api.ts +++ b/x-pack/plugins/canvas/public/plugin_api.ts @@ -45,9 +45,10 @@ export interface SetupRegistries extends Record { transitions: any[]; } -export function getPluginApi( - expressionsPluginSetup: ExpressionsSetup -): { api: CanvasApi; registries: SetupRegistries } { +export function getPluginApi(expressionsPluginSetup: ExpressionsSetup): { + api: CanvasApi; + registries: SetupRegistries; +} { const registries: SetupRegistries = { elements: [], transformUIs: [], @@ -86,7 +87,7 @@ export function getPluginApi( // There is an issue of the canvas render definition not matching the expression render definition // due to our handlers needing additional methods. For now, we are going to cast to get to the proper // type, but we should work with AppArch to figure out how the Handlers can be genericized - expressionsPluginSetup.registerRenderer((r as unknown) as AnyExpressionRenderDefinition); + expressionsPluginSetup.registerRenderer(r as unknown as AnyExpressionRenderDefinition); }); }, diff --git a/x-pack/plugins/canvas/public/routes/workpad/hooks/use_autoplay_helper.test.tsx b/x-pack/plugins/canvas/public/routes/workpad/hooks/use_autoplay_helper.test.tsx index 0fa347e8e0605..085a9093e8b8a 100644 --- a/x-pack/plugins/canvas/public/routes/workpad/hooks/use_autoplay_helper.test.tsx +++ b/x-pack/plugins/canvas/public/routes/workpad/hooks/use_autoplay_helper.test.tsx @@ -19,9 +19,10 @@ const getMockedContext = (context: any) => ...context, } as WorkpadRoutingContextType); -const getContextWrapper: (context: WorkpadRoutingContextType) => FC = (context) => ({ - children, -}) => {children}; +const getContextWrapper: (context: WorkpadRoutingContextType) => FC = + (context) => + ({ children }) => + {children}; describe('useAutoplayHelper', () => { beforeEach(() => jest.useFakeTimers()); diff --git a/x-pack/plugins/canvas/public/routes/workpad/hooks/use_autoplay_helper.ts b/x-pack/plugins/canvas/public/routes/workpad/hooks/use_autoplay_helper.ts index 5015da495e47c..8e375d3d5d356 100644 --- a/x-pack/plugins/canvas/public/routes/workpad/hooks/use_autoplay_helper.ts +++ b/x-pack/plugins/canvas/public/routes/workpad/hooks/use_autoplay_helper.ts @@ -8,9 +8,8 @@ import { useContext, useEffect, useRef } from 'react'; import { WorkpadRoutingContext } from '../workpad_routing_context'; export const useAutoplayHelper = () => { - const { nextPage, isFullscreen, autoplayInterval, isAutoplayPaused } = useContext( - WorkpadRoutingContext - ); + const { nextPage, isFullscreen, autoplayInterval, isAutoplayPaused } = + useContext(WorkpadRoutingContext); const timer = useRef(undefined); useEffect(() => { diff --git a/x-pack/plugins/canvas/public/routes/workpad/hooks/use_refresh_helper.test.tsx b/x-pack/plugins/canvas/public/routes/workpad/hooks/use_refresh_helper.test.tsx index 59c4821d82a72..d502e634ede04 100644 --- a/x-pack/plugins/canvas/public/routes/workpad/hooks/use_refresh_helper.test.tsx +++ b/x-pack/plugins/canvas/public/routes/workpad/hooks/use_refresh_helper.test.tsx @@ -29,9 +29,10 @@ const getMockedContext = (context: any) => ...context, } as WorkpadRoutingContextType); -const getContextWrapper: (context: WorkpadRoutingContextType) => FC = (context) => ({ - children, -}) => {children}; +const getContextWrapper: (context: WorkpadRoutingContextType) => FC = + (context) => + ({ children }) => + {children}; describe('useRefreshHelper', () => { beforeEach(() => { diff --git a/x-pack/plugins/canvas/public/services/storybook/index.ts b/x-pack/plugins/canvas/public/services/storybook/index.ts index 86ff52155a0bf..06ac743265f4d 100644 --- a/x-pack/plugins/canvas/public/services/storybook/index.ts +++ b/x-pack/plugins/canvas/public/services/storybook/index.ts @@ -21,14 +21,12 @@ export interface StorybookParams { workpadCount?: number; } -export const pluginServiceProviders: PluginServiceProviders< - CanvasPluginServices, - StorybookParams -> = { - ...stubProviders, - workpad: new PluginServiceProvider(workpadServiceFactory), - notify: new PluginServiceProvider(notifyServiceFactory), -}; +export const pluginServiceProviders: PluginServiceProviders = + { + ...stubProviders, + workpad: new PluginServiceProvider(workpadServiceFactory), + notify: new PluginServiceProvider(notifyServiceFactory), + }; export const argTypes = { hasTemplates: { diff --git a/x-pack/plugins/canvas/public/services/storybook/workpad.ts b/x-pack/plugins/canvas/public/services/storybook/workpad.ts index 3ecac4b49310e..e4d176f490071 100644 --- a/x-pack/plugins/canvas/public/services/storybook/workpad.ts +++ b/x-pack/plugins/canvas/public/services/storybook/workpad.ts @@ -34,9 +34,10 @@ const promiseTimeout = (time: number) => () => new Promise((resolve) => setTimeo const { findNoTemplates, findNoWorkpads, findSomeTemplates } = stubs; const getRandomName = () => { - const lorem = 'Lorem ipsum dolor sit amet consectetur adipiscing elit Fusce lobortis aliquet arcu ut turpis duis'.split( - ' ' - ); + const lorem = + 'Lorem ipsum dolor sit amet consectetur adipiscing elit Fusce lobortis aliquet arcu ut turpis duis'.split( + ' ' + ); return [1, 2, 3].map(() => lorem[Math.floor(Math.random() * lorem.length)]).join(' '); }; @@ -56,16 +57,16 @@ export const getSomeWorkpads = (count = 3) => name: getRandomName(), })); -export const findSomeWorkpads = (count = 3, useStaticData = false, timeout = TIMEOUT) => ( - _term: string -) => { - return Promise.resolve() - .then(promiseTimeout(timeout)) - .then(() => ({ - total: count, - workpads: useStaticData ? stubs.getSomeWorkpads(count) : getSomeWorkpads(count), - })); -}; +export const findSomeWorkpads = + (count = 3, useStaticData = false, timeout = TIMEOUT) => + (_term: string) => { + return Promise.resolve() + .then(promiseTimeout(timeout)) + .then(() => ({ + total: count, + workpads: useStaticData ? stubs.getSomeWorkpads(count) : getSomeWorkpads(count), + })); + }; export const workpadServiceFactory: CanvasWorkpadServiceFactory = ({ workpadCount, diff --git a/x-pack/plugins/canvas/public/services/stubs/expressions.ts b/x-pack/plugins/canvas/public/services/stubs/expressions.ts index 9bd07f76eb44f..6660c1c6efb35 100644 --- a/x-pack/plugins/canvas/public/services/stubs/expressions.ts +++ b/x-pack/plugins/canvas/public/services/stubs/expressions.ts @@ -22,7 +22,7 @@ export const expressionsServiceFactory: CanvasExpressionsServiceFactory = () => functionDefinitions.forEach((fn) => expressionsService.registerFunction(fn)); renderFunctions.forEach((fn) => { - expressionsService.registerRenderer((fn as unknown) as AnyExpressionRenderDefinition); + expressionsService.registerRenderer(fn as unknown as AnyExpressionRenderDefinition); }); return expressionsService; diff --git a/x-pack/plugins/canvas/public/services/stubs/workpad.ts b/x-pack/plugins/canvas/public/services/stubs/workpad.ts index 2f2598563d49b..19979e51b5e46 100644 --- a/x-pack/plugins/canvas/public/services/stubs/workpad.ts +++ b/x-pack/plugins/canvas/public/services/stubs/workpad.ts @@ -39,14 +39,16 @@ const getWorkpads = (count = 3) => { export const getSomeWorkpads = (count = 3) => getWorkpads(count); -export const findSomeWorkpads = (count = 3, timeout = TIMEOUT) => (_term: string) => { - return Promise.resolve() - .then(promiseTimeout(timeout)) - .then(() => ({ - total: count, - workpads: getSomeWorkpads(count), - })); -}; +export const findSomeWorkpads = + (count = 3, timeout = TIMEOUT) => + (_term: string) => { + return Promise.resolve() + .then(promiseTimeout(timeout)) + .then(() => ({ + total: count, + workpads: getSomeWorkpads(count), + })); + }; const templates: CanvasTemplate[] = [ { @@ -65,26 +67,32 @@ const templates: CanvasTemplate[] = [ }, ]; -export const findNoWorkpads = (timeout = TIMEOUT) => (_term: string) => { - return Promise.resolve() - .then(promiseTimeout(timeout)) - .then(() => ({ - total: 0, - workpads: [], - })); -}; +export const findNoWorkpads = + (timeout = TIMEOUT) => + (_term: string) => { + return Promise.resolve() + .then(promiseTimeout(timeout)) + .then(() => ({ + total: 0, + workpads: [], + })); + }; -export const findSomeTemplates = (timeout = TIMEOUT) => () => { - return Promise.resolve() - .then(promiseTimeout(timeout)) - .then(() => getSomeTemplates()); -}; +export const findSomeTemplates = + (timeout = TIMEOUT) => + () => { + return Promise.resolve() + .then(promiseTimeout(timeout)) + .then(() => getSomeTemplates()); + }; -export const findNoTemplates = (timeout = TIMEOUT) => () => { - return Promise.resolve() - .then(promiseTimeout(timeout)) - .then(() => getNoTemplates()); -}; +export const findNoTemplates = + (timeout = TIMEOUT) => + () => { + return Promise.resolve() + .then(promiseTimeout(timeout)) + .then(() => getNoTemplates()); + }; export const getNoTemplates = () => ({ templates: [] }); export const getSomeTemplates = () => ({ templates }); diff --git a/x-pack/plugins/canvas/public/state/middleware/element_stats.ts b/x-pack/plugins/canvas/public/state/middleware/element_stats.ts index b18d13fb6a4c2..5c1398d73109c 100644 --- a/x-pack/plugins/canvas/public/state/middleware/element_stats.ts +++ b/x-pack/plugins/canvas/public/state/middleware/element_stats.ts @@ -12,30 +12,31 @@ import { State } from '../../../types'; import { setElementStats } from '../actions/transient'; import { getAllElements, getElementCounts, getElementStats } from '../selectors/workpad'; -export const elementStats: Middleware<{}, State> = ({ dispatch, getState }) => (next) => ( - action -) => { - // execute the action - next(action); +export const elementStats: Middleware<{}, State> = + ({ dispatch, getState }) => + (next) => + (action) => { + // execute the action + next(action); - // read the new state - const state = getState(); + // read the new state + const state = getState(); - const stats = getElementStats(state); - const total = getAllElements(state).length; - const counts = getElementCounts(state); - const { ready, error } = counts; + const stats = getElementStats(state); + const total = getAllElements(state).length; + const counts = getElementCounts(state); + const { ready, error } = counts; - // TODO: this should come from getElementStats, once we've gotten element status fixed - const pending = total - ready - error; + // TODO: this should come from getElementStats, once we've gotten element status fixed + const pending = total - ready - error; - if ( - (total > 0 || stats.total > 0) && - (ready !== stats.ready || - pending !== stats.pending || - error !== stats.error || - total !== stats.total) - ) { - dispatch(setElementStats({ total, ready, pending, error })); - } -}; + if ( + (total > 0 || stats.total > 0) && + (ready !== stats.ready || + pending !== stats.pending || + error !== stats.error || + total !== stats.total) + ) { + dispatch(setElementStats({ total, ready, pending, error })); + } + }; diff --git a/x-pack/plugins/canvas/public/state/middleware/in_flight.ts b/x-pack/plugins/canvas/public/state/middleware/in_flight.ts index fcfde412192bc..06a71ea062e1c 100644 --- a/x-pack/plugins/canvas/public/state/middleware/in_flight.ts +++ b/x-pack/plugins/canvas/public/state/middleware/in_flight.ts @@ -33,31 +33,32 @@ export const inFlightMiddlewareFactory = ({ loadingIndicator, pendingCache, }: InFlightMiddlewareOptions): Middleware => { - return ({ dispatch }) => (next: Dispatch) => { - return (action: AnyAction) => { - if (action.type === setLoadingActionType) { - const cacheKey = pathToKey(action.payload.path); - pendingCache.push(cacheKey); - dispatch(inFlightActive()); - } else if (action.type === setValueActionType) { - const cacheKey = pathToKey(action.payload.path); - const idx = pendingCache.indexOf(cacheKey); - if (idx >= 0) { - pendingCache.splice(idx, 1); + return ({ dispatch }) => + (next: Dispatch) => { + return (action: AnyAction) => { + if (action.type === setLoadingActionType) { + const cacheKey = pathToKey(action.payload.path); + pendingCache.push(cacheKey); + dispatch(inFlightActive()); + } else if (action.type === setValueActionType) { + const cacheKey = pathToKey(action.payload.path); + const idx = pendingCache.indexOf(cacheKey); + if (idx >= 0) { + pendingCache.splice(idx, 1); + } + if (pendingCache.length === 0) { + dispatch(inFlightComplete()); + } + } else if (action.type === inFlightActiveActionType) { + loadingIndicator.show(); + } else if (action.type === inFlightCompleteActionType) { + loadingIndicator.hide(); } - if (pendingCache.length === 0) { - dispatch(inFlightComplete()); - } - } else if (action.type === inFlightActiveActionType) { - loadingIndicator.show(); - } else if (action.type === inFlightCompleteActionType) { - loadingIndicator.hide(); - } - // execute the action - next(action); + // execute the action + next(action); + }; }; - }; }; export const inFlight = inFlightMiddlewareFactory({ diff --git a/x-pack/plugins/canvas/public/state/middleware/resolved_args.js b/x-pack/plugins/canvas/public/state/middleware/resolved_args.js index 156d02b4564b4..840dcdae93604 100644 --- a/x-pack/plugins/canvas/public/state/middleware/resolved_args.js +++ b/x-pack/plugins/canvas/public/state/middleware/resolved_args.js @@ -12,21 +12,24 @@ import { clearValues } from '../actions/resolved_args'; * This middleware is responsible for keeping the resolved_args collection in transient state * synced with the elements represented by the workpad. */ -export const resolvedArgs = ({ dispatch, getState }) => (next) => (action) => { - // Get the Element IDs that are present before the action. - const startElementIds = getAllElements(getState()).map((element) => element.id); +export const resolvedArgs = + ({ dispatch, getState }) => + (next) => + (action) => { + // Get the Element IDs that are present before the action. + const startElementIds = getAllElements(getState()).map((element) => element.id); - // execute the action - next(action); + // execute the action + next(action); - // Get the Element IDs after the action... - const resolvedElementIds = getAllElements(getState()).map((element) => element.id); - // ...and get a list of IDs that are no longer present. - const deadIds = startElementIds.filter((id) => !resolvedElementIds.includes(id)); + // Get the Element IDs after the action... + const resolvedElementIds = getAllElements(getState()).map((element) => element.id); + // ...and get a list of IDs that are no longer present. + const deadIds = startElementIds.filter((id) => !resolvedElementIds.includes(id)); - // If we have some dead elements, we need to clear them from resolved_args collection - // in transient state. - if (deadIds.length > 0) { - dispatch(clearValues(deadIds)); - } -}; + // If we have some dead elements, we need to clear them from resolved_args collection + // in transient state. + if (deadIds.length > 0) { + dispatch(clearValues(deadIds)); + } + }; diff --git a/x-pack/plugins/canvas/public/state/middleware/workpad_update.js b/x-pack/plugins/canvas/public/state/middleware/workpad_update.js index f2eb47486ff1d..8632d593258e9 100644 --- a/x-pack/plugins/canvas/public/state/middleware/workpad_update.js +++ b/x-pack/plugins/canvas/public/state/middleware/workpad_update.js @@ -12,29 +12,32 @@ import { getWorkpadName, isWriteable } from '../selectors/workpad'; import { getWindow } from '../../lib/get_window'; import { setDocTitle } from '../../lib/doc_title'; -export const workpadUpdate = ({ dispatch, getState }) => (next) => (action) => { - const oldIsWriteable = isWriteable(getState()); - const oldName = getWorkpadName(getState()); +export const workpadUpdate = + ({ dispatch, getState }) => + (next) => + (action) => { + const oldIsWriteable = isWriteable(getState()); + const oldName = getWorkpadName(getState()); - next(action); + next(action); - // This middleware updates the page title when the workpad name changes - if (getWorkpadName(getState()) !== oldName) { - setDocTitle(getWorkpadName(getState())); - } + // This middleware updates the page title when the workpad name changes + if (getWorkpadName(getState()) !== oldName) { + setDocTitle(getWorkpadName(getState())); + } - // This middleware fetches all of the renderable elements on new, duplicate page - if (action.type === duplicatePage.toString()) { - dispatch(fetchAllRenderables()); - } + // This middleware fetches all of the renderable elements on new, duplicate page + if (action.type === duplicatePage.toString()) { + dispatch(fetchAllRenderables()); + } - // This middleware clears any page selection when the writeable mode changes - if (action.type === setWriteable.toString() && oldIsWriteable !== isWriteable(getState())) { - const win = getWindow(); + // This middleware clears any page selection when the writeable mode changes + if (action.type === setWriteable.toString() && oldIsWriteable !== isWriteable(getState())) { + const win = getWindow(); - // check for browser feature before using it - if (typeof win.getSelection === 'function') { - win.getSelection().collapse(document.querySelector('body'), 0); + // check for browser feature before using it + if (typeof win.getSelection === 'function') { + win.getSelection().collapse(document.querySelector('body'), 0); + } } - } -}; + }; diff --git a/x-pack/plugins/canvas/public/state/selectors/workpad.ts b/x-pack/plugins/canvas/public/state/selectors/workpad.ts index 9cfccf3fc5598..c419862e76379 100644 --- a/x-pack/plugins/canvas/public/state/selectors/workpad.ts +++ b/x-pack/plugins/canvas/public/state/selectors/workpad.ts @@ -355,11 +355,13 @@ export function getElements( return elements.map(elementAppendAst); } -const augment = (type: string) => (n: T): T => ({ - ...n, - position: { ...n.position, type }, - ...(type === 'group' && { expression: 'shape fill="rgba(255,255,255,0)" | render' }), // fixme unify with mw/aeroelastic -}); +const augment = + (type: string) => + (n: T): T => ({ + ...n, + position: { ...n.position, type }, + ...(type === 'group' && { expression: 'shape fill="rgba(255,255,255,0)" | render' }), // fixme unify with mw/aeroelastic + }); const getNodesOfPage = (page: CanvasPage): Array => { const elements: Array = get(page, 'elements').map( diff --git a/x-pack/plugins/canvas/server/collectors/workpad_collector.ts b/x-pack/plugins/canvas/server/collectors/workpad_collector.ts index 427c8c8a6571f..d42b8480ed7c7 100644 --- a/x-pack/plugins/canvas/server/collectors/workpad_collector.ts +++ b/x-pack/plugins/canvas/server/collectors/workpad_collector.ts @@ -314,14 +314,8 @@ export function summarizeWorkpads(workpadDocs: CanvasWorkpad[]): WorkpadTelemetr variableCounts: [], } ); - const { - pageCounts, - pageMin, - pageMax, - elementCounts, - functionCounts, - variableCounts, - } = combinedWorkpadsInfo; + const { pageCounts, pageMin, pageMax, elementCounts, functionCounts, variableCounts } = + combinedWorkpadsInfo; const pageTotal = arraySum(pageCounts); const elementsTotal = arraySum(elementCounts); diff --git a/x-pack/plugins/canvas/server/lib/essql_strategy.test.ts b/x-pack/plugins/canvas/server/lib/essql_strategy.test.ts index 7ef543e848add..e343de569b22f 100644 --- a/x-pack/plugins/canvas/server/lib/essql_strategy.test.ts +++ b/x-pack/plugins/canvas/server/lib/essql_strategy.test.ts @@ -57,7 +57,7 @@ describe('ESSQL search strategy', () => { beforeEach(() => { mockQuery = jest.fn().mockResolvedValueOnce(getMockEssqlResponse()); mockClearCursor = jest.fn(); - mockDeps = ({ + mockDeps = { esClient: { asCurrentUser: { sql: { @@ -66,7 +66,7 @@ describe('ESSQL search strategy', () => { }, }, }, - } as unknown) as any; + } as unknown as any; }); describe('query functionality', () => { diff --git a/x-pack/plugins/canvas/server/routes/custom_elements/create.test.ts b/x-pack/plugins/canvas/server/routes/custom_elements/create.test.ts index 179520b7f4617..fe34eeeb6e631 100644 --- a/x-pack/plugins/canvas/server/routes/custom_elements/create.test.ts +++ b/x-pack/plugins/canvas/server/routes/custom_elements/create.test.ts @@ -12,13 +12,13 @@ import { initializeCreateCustomElementRoute } from './create'; import { kibanaResponseFactory, RequestHandlerContext, RequestHandler } from 'src/core/server'; import { getMockedRouterDeps } from '../test_helpers'; -const mockRouteContext = ({ +const mockRouteContext = { core: { savedObjects: { client: savedObjectsClientMock.create(), }, }, -} as unknown) as RequestHandlerContext; +} as unknown as RequestHandlerContext; const mockedUUID = '123abc'; const now = new Date(); diff --git a/x-pack/plugins/canvas/server/routes/custom_elements/delete.test.ts b/x-pack/plugins/canvas/server/routes/custom_elements/delete.test.ts index 123936e58b6d6..5d7321d6943d1 100644 --- a/x-pack/plugins/canvas/server/routes/custom_elements/delete.test.ts +++ b/x-pack/plugins/canvas/server/routes/custom_elements/delete.test.ts @@ -11,13 +11,13 @@ import { kibanaResponseFactory, RequestHandlerContext, RequestHandler } from 'sr import { savedObjectsClientMock, httpServerMock } from 'src/core/server/mocks'; import { getMockedRouterDeps } from '../test_helpers'; -const mockRouteContext = ({ +const mockRouteContext = { core: { savedObjects: { client: savedObjectsClientMock.create(), }, }, -} as unknown) as RequestHandlerContext; +} as unknown as RequestHandlerContext; describe('DELETE custom element', () => { let routeHandler: RequestHandler; diff --git a/x-pack/plugins/canvas/server/routes/custom_elements/find.test.ts b/x-pack/plugins/canvas/server/routes/custom_elements/find.test.ts index 819c699817882..e84eb835ce225 100644 --- a/x-pack/plugins/canvas/server/routes/custom_elements/find.test.ts +++ b/x-pack/plugins/canvas/server/routes/custom_elements/find.test.ts @@ -10,13 +10,13 @@ import { kibanaResponseFactory, RequestHandlerContext, RequestHandler } from 'sr import { savedObjectsClientMock, httpServerMock } from 'src/core/server/mocks'; import { getMockedRouterDeps } from '../test_helpers'; -const mockRouteContext = ({ +const mockRouteContext = { core: { savedObjects: { client: savedObjectsClientMock.create(), }, }, -} as unknown) as RequestHandlerContext; +} as unknown as RequestHandlerContext; describe('Find custom element', () => { let routeHandler: RequestHandler; diff --git a/x-pack/plugins/canvas/server/routes/custom_elements/get.test.ts b/x-pack/plugins/canvas/server/routes/custom_elements/get.test.ts index 859145ad3d1d9..ee1db89bda228 100644 --- a/x-pack/plugins/canvas/server/routes/custom_elements/get.test.ts +++ b/x-pack/plugins/canvas/server/routes/custom_elements/get.test.ts @@ -11,13 +11,13 @@ import { kibanaResponseFactory, RequestHandlerContext, RequestHandler } from 'sr import { savedObjectsClientMock, httpServerMock } from 'src/core/server/mocks'; import { getMockedRouterDeps } from '../test_helpers'; -const mockRouteContext = ({ +const mockRouteContext = { core: { savedObjects: { client: savedObjectsClientMock.create(), }, }, -} as unknown) as RequestHandlerContext; +} as unknown as RequestHandlerContext; describe('GET custom element', () => { let routeHandler: RequestHandler; diff --git a/x-pack/plugins/canvas/server/routes/custom_elements/update.test.ts b/x-pack/plugins/canvas/server/routes/custom_elements/update.test.ts index a6a75928e45d2..d19fb5516bd47 100644 --- a/x-pack/plugins/canvas/server/routes/custom_elements/update.test.ts +++ b/x-pack/plugins/canvas/server/routes/custom_elements/update.test.ts @@ -14,13 +14,13 @@ import { savedObjectsClientMock, httpServerMock } from 'src/core/server/mocks'; import { okResponse } from '../ok_response'; import { getMockedRouterDeps } from '../test_helpers'; -const mockRouteContext = ({ +const mockRouteContext = { core: { savedObjects: { client: savedObjectsClientMock.create(), }, }, -} as unknown) as RequestHandlerContext; +} as unknown as RequestHandlerContext; const now = new Date(); const nowIso = now.toISOString(); diff --git a/x-pack/plugins/canvas/server/routes/custom_elements/update.ts b/x-pack/plugins/canvas/server/routes/custom_elements/update.ts index ea25b917691fd..e38e9467e2854 100644 --- a/x-pack/plugins/canvas/server/routes/custom_elements/update.ts +++ b/x-pack/plugins/canvas/server/routes/custom_elements/update.ts @@ -38,10 +38,11 @@ export function initializeUpdateCustomElementRoute(deps: RouteInitializerDeps) { const now = new Date().toISOString(); - const customElementObject = await context.core.savedObjects.client.get( - CUSTOM_ELEMENT_TYPE, - id - ); + const customElementObject = + await context.core.savedObjects.client.get( + CUSTOM_ELEMENT_TYPE, + id + ); await context.core.savedObjects.client.create( CUSTOM_ELEMENT_TYPE, diff --git a/x-pack/plugins/canvas/server/routes/es_fields/es_fields.test.ts b/x-pack/plugins/canvas/server/routes/es_fields/es_fields.test.ts index 02d7e9ca2e269..977aaacdc2669 100644 --- a/x-pack/plugins/canvas/server/routes/es_fields/es_fields.test.ts +++ b/x-pack/plugins/canvas/server/routes/es_fields/es_fields.test.ts @@ -10,13 +10,13 @@ import { kibanaResponseFactory, RequestHandlerContext, RequestHandler } from 'sr import { httpServerMock, elasticsearchServiceMock } from 'src/core/server/mocks'; import { getMockedRouterDeps } from '../test_helpers'; -const mockRouteContext = ({ +const mockRouteContext = { core: { elasticsearch: { client: elasticsearchServiceMock.createScopedClusterClient(), }, }, -} as unknown) as RequestHandlerContext; +} as unknown as RequestHandlerContext; const path = `api/canvas/workpad/find`; diff --git a/x-pack/plugins/canvas/server/routes/templates/list.test.ts b/x-pack/plugins/canvas/server/routes/templates/list.test.ts index 85fdb09aa81fa..d055692e17191 100644 --- a/x-pack/plugins/canvas/server/routes/templates/list.test.ts +++ b/x-pack/plugins/canvas/server/routes/templates/list.test.ts @@ -11,13 +11,13 @@ import { kibanaResponseFactory, RequestHandlerContext, RequestHandler } from 'sr import { savedObjectsClientMock, httpServerMock } from 'src/core/server/mocks'; import { getMockedRouterDeps } from '../test_helpers'; -const mockRouteContext = ({ +const mockRouteContext = { core: { savedObjects: { client: savedObjectsClientMock.create(), }, }, -} as unknown) as RequestHandlerContext; +} as unknown as RequestHandlerContext; describe('Find workpad', () => { let routeHandler: RequestHandler; diff --git a/x-pack/plugins/canvas/server/routes/workpad/create.test.ts b/x-pack/plugins/canvas/server/routes/workpad/create.test.ts index 158c68f0ea0a0..87ead1bf897f9 100644 --- a/x-pack/plugins/canvas/server/routes/workpad/create.test.ts +++ b/x-pack/plugins/canvas/server/routes/workpad/create.test.ts @@ -11,14 +11,14 @@ import { initializeCreateWorkpadRoute } from './create'; import { kibanaResponseFactory, RequestHandler } from 'src/core/server'; import { getMockedRouterDeps } from '../test_helpers'; -let mockRouteContext = ({ +let mockRouteContext = { core: { savedObjects: { client: savedObjectsClientMock.create(), }, }, canvas: workpadRouteContextMock.create(), -} as unknown) as MockWorkpadRouteContext; +} as unknown as MockWorkpadRouteContext; jest.mock('uuid/v4', () => jest.fn().mockReturnValue('123abc')); @@ -26,14 +26,14 @@ describe('POST workpad', () => { let routeHandler: RequestHandler; beforeEach(() => { - mockRouteContext = ({ + mockRouteContext = { core: { savedObjects: { client: savedObjectsClientMock.create(), }, }, canvas: workpadRouteContextMock.create(), - } as unknown) as MockWorkpadRouteContext; + } as unknown as MockWorkpadRouteContext; const routerDeps = getMockedRouterDeps(); initializeCreateWorkpadRoute(routerDeps); diff --git a/x-pack/plugins/canvas/server/routes/workpad/delete.test.ts b/x-pack/plugins/canvas/server/routes/workpad/delete.test.ts index f07a83e65a970..b3f1ebd4db528 100644 --- a/x-pack/plugins/canvas/server/routes/workpad/delete.test.ts +++ b/x-pack/plugins/canvas/server/routes/workpad/delete.test.ts @@ -11,13 +11,13 @@ import { kibanaResponseFactory, RequestHandlerContext, RequestHandler } from 'sr import { savedObjectsClientMock, httpServerMock } from 'src/core/server/mocks'; import { getMockedRouterDeps } from '../test_helpers'; -const mockRouteContext = ({ +const mockRouteContext = { core: { savedObjects: { client: savedObjectsClientMock.create(), }, }, -} as unknown) as RequestHandlerContext; +} as unknown as RequestHandlerContext; describe('DELETE workpad', () => { let routeHandler: RequestHandler; diff --git a/x-pack/plugins/canvas/server/routes/workpad/find.test.ts b/x-pack/plugins/canvas/server/routes/workpad/find.test.ts index 8bb7d348a291e..6379b6f8258b7 100644 --- a/x-pack/plugins/canvas/server/routes/workpad/find.test.ts +++ b/x-pack/plugins/canvas/server/routes/workpad/find.test.ts @@ -10,13 +10,13 @@ import { kibanaResponseFactory, RequestHandlerContext, RequestHandler } from 'sr import { savedObjectsClientMock, httpServerMock } from 'src/core/server/mocks'; import { getMockedRouterDeps } from '../test_helpers'; -const mockRouteContext = ({ +const mockRouteContext = { core: { savedObjects: { client: savedObjectsClientMock.create(), }, }, -} as unknown) as RequestHandlerContext; +} as unknown as RequestHandlerContext; describe('Find workpad', () => { let routeHandler: RequestHandler; diff --git a/x-pack/plugins/canvas/server/routes/workpad/get.test.ts b/x-pack/plugins/canvas/server/routes/workpad/get.test.ts index e19a20cc3f543..cae485b62f66f 100644 --- a/x-pack/plugins/canvas/server/routes/workpad/get.test.ts +++ b/x-pack/plugins/canvas/server/routes/workpad/get.test.ts @@ -14,9 +14,9 @@ import { CanvasWorkpad } from '../../../types'; import { getMockedRouterDeps } from '../test_helpers'; import { workpadRouteContextMock, MockWorkpadRouteContext } from '../../mocks'; -const mockRouteContext = ({ +const mockRouteContext = { canvas: workpadRouteContextMock.create(), -} as unknown) as MockWorkpadRouteContext; +} as unknown as MockWorkpadRouteContext; describe('GET workpad', () => { let routeHandler: RequestHandler; diff --git a/x-pack/plugins/canvas/server/routes/workpad/update.test.ts b/x-pack/plugins/canvas/server/routes/workpad/update.test.ts index 8feadf433f07f..240298564fdba 100644 --- a/x-pack/plugins/canvas/server/routes/workpad/update.test.ts +++ b/x-pack/plugins/canvas/server/routes/workpad/update.test.ts @@ -15,14 +15,14 @@ import { okResponse } from '../ok_response'; import { getMockedRouterDeps } from '../test_helpers'; import { workpadRouteContextMock, MockWorkpadRouteContext } from '../../mocks'; -const mockRouteContext = ({ +const mockRouteContext = { core: { savedObjects: { client: savedObjectsClientMock.create(), }, }, canvas: workpadRouteContextMock.create(), -} as unknown) as MockWorkpadRouteContext; +} as unknown as MockWorkpadRouteContext; const workpad = workpads[0]; const now = new Date(); diff --git a/x-pack/plugins/canvas/server/templates/pitch_presentation.ts b/x-pack/plugins/canvas/server/templates/pitch_presentation.ts index 98b48db9ff0fa..a9f09ada989c6 100644 --- a/x-pack/plugins/canvas/server/templates/pitch_presentation.ts +++ b/x-pack/plugins/canvas/server/templates/pitch_presentation.ts @@ -1644,8 +1644,7 @@ export const pitch: CanvasTemplate = { 'data:image/jpeg;base64,/9j/4AAQSkZJRgABAQAASABIAAD/4QBMRXhpZgAATU0AKgAAAAgAAYdpAAQAAAABAAAAGgAAAAAAA6ABAAMAAAABAAEAAKACAAQAAAABAAAFAKADAAQAAAABAAADVQAAAAD/7QA4UGhvdG9zaG9wIDMuMAA4QklNBAQAAAAAAAA4QklNBCUAAAAAABDUHYzZjwCyBOmACZjs+EJ+/8AAEQgDVQUAAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/bAEMAAQEBAQEBAgEBAgMCAgIDBAMDAwMEBQQEBAQEBQYFBQUFBQUGBgYGBgYGBgcHBwcHBwgICAgICQkJCQkJCQkJCf/bAEMBAQEBAgICBAICBAkGBQYJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCQkJCf/dAAQAUP/aAAwDAQACEQMRAD8A/HrT2mRczjP16/jz1r0nw3HHeweXFjBfnIx071xVjYy+SDL6fpXoHhmJbGQRqMjI9R/kV/R+IknF23P4Ny6g4zi5bNHaz6PLHbBYsM68A9eP89KrWMklteILnG336e2RV/VdfSxg8q1QEk4zn07Vg3WtR3YTyvlbHOPYelcFByauz2sZhabn9x7vpWowGAJA2xSM+1b1n9pLCfzQMnIBHBrwzSdQLxhAOeOK9p0BYbqJVdvkIOOxBx/jXj4qhyJs+qyvGKclBbLSx1NxqbTwkZ3MAB+IHaua+zOJHMoH73HJ6EDpmtm10rdM3kyADgMD1rpbDR53ieGVCwXnoTXFGtCnsd9fASxF01axymnWxF36HHA6jI/ziulj0q5u7jzZRn1HfP8AnvXVx+GlWMSKmDjPIrV0mxlhOJBkHIrnrY9Nc0THC5POyp1VdPU4OPw6JLgFCducEeg9K7eHRobfSmXYEyMgYHPufetW00uW0vWEmdjnIyM11GpWA+xRxRoRvJz7/wD1q46+ZSbSuY4Th+neUuXXqeBzvLYyb4h+Vdl4cvZnvEu1Xy3PQe//ANeo9S00iQqVK8jn09at6bYCGXM2SEx04+hr1amJjKnqfPyyqrGsoQ2R6vpt/Kt3i4xubj6Cu+imjZFZB0HU/wCPavGbWaN1Yq7BwcAk812OlXUkUO2ZuCec5wK+ZxeHTsz6PLk3za3udzFuaM7scng1yWu2bTrwSvfjjjnpW3bXxuEbBztzjjAqnct9owX7HAIz3/z1rhoNxnzdT1Z4eDppfZPHtUe6gj8pEOD8px/nPeuHvdL+zKqeV8z9T7Yr3C/ssNvZc4z+X86yYNLadyJFBVc8nqD2xX0lHMeRHzc8gVZu8tenl3PGNL0NEuzKo2ue/fPf8K6rRbVo748Ydjt3DjOTXdzeGZI5AQuSfT9aWLRpbW+C7fmP+HT24rpnmind+R50eGZ0opQ6P8/1PYPDFqklqkVwfmGOc+ldlcQy20WXAdOPr+XevOvDzS+cBNnbj26eley6Z9i1CNbWQ7x69xXwWYycJ826P0XLlCUHTe/Q4y4v4djRquD+lY084liYu3Ht2rsfFXhqKys2vYSCgHOBjFfPF94ge3laOMkDPf0/yK7srpKur0jzM7qSw3+87HW3yQyzYQjtyOO1Zls81sSi/j+fHpVS21WCe38yYgMoHXrj8aoNrEUbbV6s3LH0OfyzXv06UkuVo+Nr+ylPni7f5B4i0i1nILgguMg55z+NeZXGnxHzHAA3EgsODn3PNetrPaX0eXwXUfhz2rjNRsIpGlERxu7d8V62CxMo+4z5vMsqjKfto2v0PKbm2ktZVVNu4kHOMe9d5pEsqxLMpycZOep571l3WiuX3ryPQ54PbjpWnpVlcQyhmQr6+gz0r161eMobnzmHwNWFVytZdP8AM6G6snvtpOCo6gD/AOtSf8IvDcKZgAzY6n8x+tdVpNi91MG79+4Pv+PpXY2Wjokvl449fWvnK+YulpF7H2lDIlXi3Uje/c8VutIMdtyGD9x6VQ06ykt3J2gAuWIHBPTmvdNR8PJLF8i8jj6j0rgrvQpo5QrrjnI/L69K2wubRnFps4cZw3OjUhOMdVsY76WtxHsjUYAzkcGqdzo1x5Kl1MqIQfX8T9PWu6jslUq5+cDA4712ENgJINy/MT1z/KoeauCV9TPFcL+2qOUG02eL23hq4TE2whO3rnNV59DdZPMjTBB6Dt9ete5raQlBFGnrkZ5z/OsqXRRDKXjzl/5Y71tRzuV9TyMfwbDlslfuzzvTIbYo6uoJOOB6j6/5FS/2a1s7GAMC3UrxxXYT6FaSE3Uisvpjj+VUb9njG4AEHjOORW8ccpP3ep5r4enT1qpabNb2MaOJpbdYpCfmPGPY/wA6mntjHbFNrYAx8vHbuM+3rRDc2cSgjACnGB7Vo32oi5gKodv8OAO//wBelKtNNJI6aWWUpLmb1sefWxVLzfnJXO73wfrXsOgQW8qL5/7wH+nT9a8viW3jDGHA7Gup0LUmik8sOMA9ORzWuYTlUh7pz5Hl8MPUTetz0GfSLEu11GoyeCR1yfevOPE3hu4Fwstn9w4znPOOmT/WvSoLmWWMsR94dee3eqWol2tyuF9/8/rXi4HE1KdTc+i4hyrD18O4OPnoeX2Fsbb99L9/BJGeM1lataW12kl2RhjgdvmOOATXR3ImiWQRgsOgwM8Z6jpXJ3fnLMIiCDz7Z/zivqKDcpc1z80xcadGn7G1/wDM+f8AxppqxTKcgN34Jwe+fcnNcE1hcRTkgglxg8k8cH/CvadasDcXT+WvLcYY5xkdumK86n0K7lvPMRiA4zjPTPUY5/z9K/Qstxa5FFvY/BuIskm60pqDak+nTuVUtXiZY7eQxrKy5AOR7ZrstCeWe1NlMPlX5T1HIxjGOnFZlpp8+9Yp1BTIHXJrrtGt2t5DCqEdfx9s+vFZY3Ec0Gnqzsy7KHRrxnFNRejX6fqc3qHhu0i3zxBUKsOgwOOnWuGn8GXFzMTbjcME9eB6DPHWvomXThdReecAHBx0z25qt/Yy21sjZ49QOTxxkVzYbPJU1vqdWbcAUa1XmUbQ300Pl+50C7tpACMFhggcnB/nVyXQ7lMsy7SAOo7fWvoceFkuR5k556EDg49c/WszVdCilH7tGXGFCgYzjjPfmvQjxCpSSPB/4hzUhRnU3T2XU+dHsrhhsRSW3dMcgetSRSX1gDaoSnOcdPzr2q00W3RCxTDrjkdTgfic1zWr+Grue6ywJVzuB9Pqe3413wzaFSXLI+fxfB9fC0VVpN3fbon3ODhiaNPtEnVztAz/AD/z+da8mmwQnzIfnx1jxwfqPalj0yfcPtClWWRQM8jHPf8ACu6stMjWI3cgDdjnOPXP+Tini8Xy6phkWURlF+0VrbX6d2ebtpV1OFuV3O/Q53E8f/WrJa0liXey4U8g+tfQ2naNFJGZD8oIAAA4H+Fc54i8MSJbvOAN3OCPcj06VlhM7jz8kjXO+AqyovE07vS//BPGRaO55GCRwaZJbOjk9R0/CuhcEv5U5JK9fY96Vbdp0wy7iBhR6dxX0PtLo/LpzcJ2TOfKgASqvIPP0/z+tEojlfBOcL0HJ4HT2roBaxiIq3GAcn8enFOgs4PMcJzgAZHJOentwawnVS1PZy9zqpwVtTl2i7D5c9qTymjyOx/XvW7JpjiQKo5fv2yaqzWM6OYW69T+P861p1YvqcuKw9SnNxkmR2oKv5yNtZQB15/P/Oa6NUjuI1uC+8kYOSM5z+fQd/yrmkikhB8wEdAOP51Lb3LRzA8jBHXvUVKXNqhLF2j7OWq/XubGs6JYSWIniz5i43E9CT2/CuIbTGh5HA4NejWhWeQxzEspGdo6E+hx+FOns7YDy3XIBJyOmD2qaNVwXK9SK+KXxrRfr/wTyjZJE5960IV81dx4/wDrVpalaBTkDg8dKzwMR7SCc16EZ9jP2vNFNEBGCWI6VMsHnYyB7U6AM2FbmtFIghEnTmqnIzqVbFSPTkQehNLLZon3eB/WpppicFeKswf6Rw4znjHNRztbmV6j1MAzJHmI9KkXyww2dKTUbH7Nd7QQQwyKsWVs91lQMP6Ct7q1zqmoqPMCFgn61VmWZ8MV4FarWFxGcv8AjUrQSBPlU461MZpbHOsQk7ow1WUMBtPWtRFdBll6VftmjOEA6VoSqu3KDJ/WidXU562M1s0YnzGQYOO1DbQ2O47e9W5N7MRjaO9QC3aTLE8+9O6JU1uyNWZiB0x2qbzJI8kcn+n9ab5TwyfMOPWlVssMjj3qeVbg7PY1LS5lD71BBA/OmvLuPAxSxOoXIBJ9KrPIXJaMcDk1nGF2cijdliOQI3XJz0qtJMH/AHSnP8qsWcQnUtjBalk08lRg4z0NDik9QUoqVmUokWOTOAT61cVHYcDk8+tSx2LA5BLAe1a1iyBiHXdu/wA/pWNSXUtTTnZsW20u5kiFyVMn8RA9P/1jmuq0NobeRzPHtjlxleAMgcfl/kiui8PSxPYPayfeQ/Lwc/QV59qF/PG7RABcnOQOnPf8PevD9pOtKVJrY+ySpYGnQxtN6vW3ns/zNLxPFpCxkWwxISBtzwPYDp/+uvMryJZJP3gz3xW/dyy3LFn5Ymqb6bNIMg8162Dpeyik2eHmOaLFYl1opR8kc4Lfa2Yxj1q/BGpOHGAO1X0s3kk8teT0HFbdh4Y1C7cDyygzjLcCumriIxV5MyoqdZ8kFd+RnQ2iscJ0PX2z/OtBdCnvZSIkyS2Ce2fU16ZoHg9osu3JHBIHr6H2r0S10GDR4fn/AHhOevHH17V8vjuIIU21DVn6DkHh3XxKVSt7sOrPlfV/DF1ZzbLlCm4c8HA9ua42/wBKaJmSUfdr6i8VzaVb2qGQeZ5ZzgDBz9frXh+rXv2tsyY5GAPavYyrH1KsU2jx+Isup5difZ0anMtNP+CeTXFvLAhKcf59aqRGUnJ4x+tdxPFEDsbp61nfZkLEDHSvoFUVrHPRx946oqWMkoXDHjuK2YvNbJcEDtTLaOONcYHvitqz0+W7kKxjc2M/WuetJLU4a1TmlaK3M3aQN0fJpIriZG2qxA610TaJexIRsOADnjt3/Ks02wVzGcHHBPpXKpxlsSpShrqiiWAYrjA9KsI+cAgn/DpTHt2SX5uD+dPAYAFOvpVcqM3JXswmLAbOCDgD396ZLG5cyXHP654/wrRt4jcMMDkHPB7D/PWpLm2QKEB7etZppOxftZON3schf26yv5kK5GO/WqCjMhE4/CujkHlIU9K5+WNI2xkZNd1LU7KFZtWLiW8bgsQfrV+3cxjZ+HrxWZFNnAz+taEU6Rn5jwelVUiYVlI6rSRa7meZsE88fT1rF1G+aWSQwkqrDHuQOxqn9tGfJj6H0o+zTXLbYgW+g5rgdBRk5s6KeLq+yjQ6XMScZHy8GsK4Xe2324rqrrT50zG/ysOoNUV09gxI7VtGa3OzDVLPl6nJm3JGDmmfZyveutfT3HzAZX361RnsyF3J0JrWFRX0PQeKadmYAjEdwC/FdppgjbDsduMYwO9c9IhOdw6dKnivPJUDvWso8yMsVepFWPTBPZSRqsx2lc7iRzjt3rjNV1WVZ/Li+7z+XpxWfJqTGPYBk1nJvlm3uegrmpYNJ3Yuac9ai/4PYc13K/JP+faqz7GOW4rYGn+YheIHAxkj8qoS2Ey8gcD1+tbXXQqnOHQypFD/ALuMfnSJZu2Qx5zV1YJFOcZrTsbK4m+YLyCKic0lqdtNyl7sDEOm55j61mahazW0e5hketep6fZCKfE8e5QQCccjP4VW8aaIljYgyEEvzkVzwxq9ooPqd9LC1lD28tk7PyPEp4t8IZOOe1XLK7SzgCkZaq5YJiHBJ+tVJd4yWXg16tux6vJzrllsdC175iAqcD0FOiuAr+a7dPzrkhfKFZUyOPyqpHNJIz7iRgYpqAllmj6Ho667HC3m9R9anGoxzx+cTjdXlrT7PlU81r2P2pxlfujipdJGFbJoRXMdZJM06lOgq3ZRNF8+3PpVSK1nKj0rcW3NrCpY8+lZTtY8nEVIpckWQTCWYYUe1ZzadcvgDnJ4rft54Y5MMu4dMf1q4XhSLJA3ZJ645zXI21sh4eSS3PPLrTJFZlxz3Nc9d6SwUsDya9MupkkYsR9Kx7iJHjwe9axv1PRw+Yyi9NjxK5XyZPLPJqjeBRGGz0Ndb4nVLUExrgk9a8+lmldSCcirZ+i5a3ViqiNSO5iEG7PHauduLxXnO3oKgDucjdgLVFULvlup71lNnvYfBxjds0DfBgCKa07PH+9wFHSqTI6thR1pJ96IM8E1jI6o0Y9CZ7qMKTjiseaQsxxjHvTnIQ81nvMrZxyT6VzTPRoULbE4AyATU7BCuDxWIJ5ACDxzUTXeQQTXNKx2/VZNk10c9Dx0rBnSNicDkVZmvBt681mSTKwyODXFUievhaUon//Q/LO0vrKXGzBxxVtrwMMplT/OuG0q2aNt2CO9aLXJcv5PUHpX9DK1z+L+STpq+h0012qqBIcsR0PT+Vc+sskV+tyHwuSCPUetQrI0imSUlSCSKwyty7mTIwOmOtXSfK2FbDxqRje+56FF4st7YC3dju5xz0xXqfhX4gotusksg3c4GO1fMcthcyx+ewwOn60sFjeW1wphYvxxjtnsKqphYVI8rOeljZUJ88VdH2rH8V9J0do5t6vJj7oxgHpXp/hj4w6Jd2bu7eXs6jrnHavzau7C+S42gkSPj35rr9I0vW0IZmMYx6nrXDiMhw817256OF4sxcW/Zq67dT9MNK+Kel3EqwWpEgK5bcMEfSvZrK2g1GBbmIYD4IGK/MnwnfXdoQ0+SwOCe2Pevvz4f+KYJLBLd28z5VOM8gH1r5HP8nVCPNRPqeGuJ54qpKOL07dD1RIIJCA6ZC8e/WtS+s4hp4DDJHK+lOtYk2ieI/LjPTtipbtZJ4iIz1x2r4r2ruj7meEfK521Z5tdW8N4DE/YdB+dYTaXeROq8/NnGfWuzu9Kv7ctNGM7hwAOPwqqRcPGI58bgDXuU8TZe6z5qeATb9ochKjDErDBOOR/Pitqyv5Nx7g9c1fl0p5Is44A/CorWyaBSP4MnpW8q8ZRszGOBcKjlE3LO4cBkBxng4961LZ2S4XfkAE89axYW+xIZNu4nj8K0bYtJMkpUADrjv8A0rhqtu7R00aUFaM/6RsmJZSBIPbFTR6UBISoGMfrU0IV3Un5j356ittYpASVywHbtj8q4JYhrQ7o4NXvDUyY7YZCOAuOc9s+tYt9GRKMkZHOT1z7Vs32pqJNjZ2gbT05rDnm8z54+uM9f/111UKct2eZia8VBxiyOPUHtnEuCeP/AK34112meJDApfcFPUeue1cJfOBGgRjnPpzk1SljuvOV3z/Q12fVYVI+8eDVx1SlVutT1y98YiWydZTvJU5A4/xr5r1e9sZb97hTx3HUZ711V/es8UkeTwDjnGPxrxnVHV5lbfyucj8etezkeVQg21pc+c4sz+VRRptXsdPDqGGkUng44/TvVyO8SS5CSMXzxg57dx/jXEQtK8YY/iTWhBePHIsYIBr3Z4ddD5WOLkrOdrf1oeladdBpxkHjg449q6FtI+2yF4gdpHHGPr/PiuV0iEXMCyKOvJJFepaVEwVGGNo47kj05NfO4+r7N+6fZZNhlWScvVHCyaS9uCZlI3DAz0Pf+tWrC0ikJL8dAPfn+lej31r9sUwqmV65965ebRJoz5g5HbHX6c1xU8e5L3nZnq4jKobwV0i5o8T2zAQDcD7cY9hXoln5YUKy4IB//VXE6TazEB5pPu45I5Pet17kE5Tp2964MVDndjswlf2UVzK0eh1LWEV3+7kOCOhz61xup6HMLtFHzIep+ldDYXkkkZzjjkeo/wD11q+esswWYZHfJH8q4afPSk2d2JxFKrGKPNho/wA/lgdCcnpwK3bSwaG38s8nrgiu1SwgklaVSACeBjiodQstg2BuAeMHr9RW0sW52icfsfZqU4o4+HaHK4wAMgf/AKqZdRw3OGyBjjANXLq1lgcyuB06+3v61DbRB8mTkFunbmulW+NM8ea932ckCafDMoQZOPX9Oe1Vbnw0JSyPz6ZPHA4rqLSBoVK7cjPUVsLbNu3kckd+tc8sXOD91ndSwVGrTXtEeHap4YdAV+4D6Dj/ACa5ZoJIYWRAQE7HvzxXvWtRNIPlx8owPevPLrS94eZ1x7f4Yr3cFmTlH3z5nNMgp06l6SPNlt1eUuoHXBz3z2x7V0Ol2UMq+bCduOmf51cj0edWaQgsCeMDnFSxR5Hyrgk9h0/CvSqYjmVkzxqOXuElKS76HQ2crfdBwVA+hrYdPNi2EAk8nHb86zbIwCNTIcZ6jjH0wa1UJ3GNOoIOen+NePVet0epS1glU6nE6xYtp837nG2XseDyK5fUES6g3Kq74zgn2+vWvS9RhS8iKykblzwO/v8A/qrzi5tZUUtDnIJwPYfSvZy+tzJXeqPlM8wXJJ8i9yX4f0zh9R0FXuI3j53Kc49z7VlPoKQYkVAXBwT0Ppiu2uI5vL+0PuXHAArm0S4e6ZkBHAKnHQfSvoqVebW58PLDU037l29jnxYt5kkmwbgOuOO/b/PStS0ijjtdswAPP3emR/8AXNSbZZXIC49cfU8e9a9npcm8b+FPGMcVtVrWj7zOKlR56lqcddSWK1le3HGWHB3AevoPamz6dcT2wifIOe/Ixz9K6uxtQsyxH5+n4dq2riwaZBGR8p5ypxgivGnmHJI+qp8PurRab1tax59b2GyNRJkr/h6Zxz+dU7y3ikfbCMqB37V6ydOWe2a229P88cVz8vh9cbcYIzx7/j3rOjmabuz08Vw/OnBQpq6/rQ80fRI3HnQqpyMEAgd+uf8AP0qCfS43QqVznrjA9fpXdXOjz2srx9ASDjHTvj/9VRQwCGbEqgjOSD0zXoU8c7XTPBxGSQXuTja+/Y8um8LRCKR8EiQcnHQn0qrpugSJI0akrEoGOMEH+XWvc4raC8l3AYUjJxx0qq2ixW++Q9DkED/Ct1nc7OLPO/1Hw3Mqmll/X3HlyaVc2bAxZYofzzz1/wAiiexurq3aaFg2OTnAPT06e1eqrpvmIkirsABBz6Y9DWZe6XFb2+y33DP68e1RDNW35nVieFoJci+FL/hrHzhdeCLmaV5ywZc/MFz1PPFVYNOSBBEoCsmQ2Bnr65r3lbK4iP7tMHoQB2981yOr6VHGhuWGJMY6elfUYfiCcnyTZ+UZh4U4WnQdehGz1vf79DyTU9Fne4ZoYiQVzj374rItLBl84TBvMQ59P6c17vpsCTW5UqSTyc49Oh49aztfg06xjyy/MSMn054/H6V6kM6cn7JrU+Dl4bLDt41VLR10e3U88tFtjN5YyxwR69M+v88mupt/DNtMjXfJLfe9hnPPvziudigVlE1n1Qfr2BH0r0vSNg05FcsXx0zjOeO/FY5jVlTV4M9ThanRxU3DEJOyun0Mi88H2ckJi2clDx6Z4J+oFeNeIfDr6ER5bGRG7kEHPevqS4meS1J2AYOMDPOB1Pr9a5y90ePVIjHdLgNxk849MevWuPLM6qUnepsetxZwPhsZHkw0Up20dv6/E+arKVwQVOM+tdwLq2urXDxYUAFsHByOOP1qbxR4MtdHT7dp4fYDzk9Pw5rjred+Uzx6etfbUasMTFVIM/nbPstxOV15Yeqle3qn/wAAZqMNuVCxAnuxznj6VzVxbncQowvauylQPEe2D/k1hXcZUkge2a66b1PHoV5KPqYhRV5HrUyPnv3o8lmONufTFMMDqfStmdbt1IpCzkFe/bvV7SIl84rIcYB575PT3qsF8sAGptmV+Xg+tTUjdNI3w2LjTmpNXQy5gM53L8xStrSbYBt6DJ9qjsmVUYOcY/X1rRjeeGU/Y8qCe3Q+9ZzqOziYuKaV3odJHpAvLvIG5do446n8PrXYJ4Db+yzCOXXlSvOc+vFV7CcW6R7UyzIC3zZ+Y8EY7V6GNWtI9jBwwK4+U8gY7dea+SxuNrpr2Z+t5FlOWypy+spXt6b/AOWh826jo9zpl0bedMEc9Ovv06VS8wrwfXFez+NJrTUmimssyELtBIGc5/T6V5d/ZczvtIAJzt7A4r6TBY11KanU0Z+X59k6w+KlSovmjfR+TGWttHdsWfAVV9fX/PanS6XcrH5vlnavcU02kltPgqRg4z1H+ea6KOWN1MF7t2YIA7ccDmtK1Vx1jqjhweFjUl7Kfuvv/mcJPC6sVI5HNV0YAYI967C80Z7OIzKSySEjIH9a5V4yMq1aUq6mtB4rAzoS9nUWo1Zymfl4xirFukDZDHANVxbuEBIz71LbhCfmOMV0c1kcFS1vdNeCBIcMvKjtUskiYAIGPz/CpPJaNQIzwe/rWTOXiYZH1qV7xwKm3Kz3PS9E0S21TTpJYyFdR1POPXgD+dVZ/DxhVZbUZOQDznH+T9a5TSdZu7N9tvIyKTlgpwD2/lXYR+I7mCIGEAseTuwQGzkH1P8An2rx62Hrwm3F3TPrKWLy6dGMa0eWSVm979mv6/4EbC70kebJJ5RBHy9SOOTiuI1S8FzdySryCeKv61q014xeTr7Af4VyiB5HI6Gu/CYay557nm4jERmnTpN+zTur7mzbqHcFeoPavQ7TRYPI86NsuwHBA6n/AD0rzm3Rk5P6V09hrt3ayqd2Qi7Rn068VGNoTkvcM8txlClNusro7jSfBq30ixsfLPBYjqvGfT1r046FGkcdpBwqZ64OTjr2+tcf4c1JL63QW8xSU8MMjnnr16Y/yK9csgsMAExJfAHXjHoDX57nOJrRn7726H9H8BZZgJYZxox+JJt/jYwLcxW0bkgY5K9Bj2qHUJYbgeUrFdwG5jwAa6ydLbyjsGxs4wcZJ6f5NcFrTIInw+GYHC9M8HjjFeVhkqk72sz7/HVfqmHdLmTVv8zxPxp9i2RwxnJAznnBP5ntivIrxmUERcD2r0m+sFvr826Nz3p9v4Iub+F5oiNienev1TCVqdCmlNn8k4uVbF42U6dO9+i8jxIieRyGBxVqGxYS5kHWvSbjwvLb7XkHBPK45GP8/hWXcW6Qghgc13rGxl8BOInVgvejY59LXLBErrdCC2dytxOpyuMEeh9v61XsgEJlKg7R0PTp34rct7gRhlijzn5V3cfXH8/pXHjKrlFxsVlUnzxrN2s/U7G4ktb+1LQB9p+bHBzz0/A1w2rWCWkQ8qLg4GQD1xjr05rstEsbiOMs+E34wqkcZ6kcmqmuGDSQLafnqeDk5PNeDhanJV9nDU/Qs3wTrYX61ifdut+zv+p5fIC+N45H45qIwOG2nhc/55rWuJbRtpTgnIbI/I1UkeJlIznbwK+li9D8srVJKVr3KL7o+R8uOPzrMmnbfljk85/z6VekkkC7WGBWVcN5i7RWyidOHbasytNN54yexrnrvJfPf19atvJJG5H1FZk8pYfMetdtKNnoe5haNmV/PcybW+taETknJ5rBkbLbjn+laVmWK5zmuqUVY9GtSSjdHU2NrHLiWQ4zXuuk6bBHpsRtSQhJPr19cjr+NeO6UIIwJJxuHpXtnhyaSdYi+1YiNvTPQen+NfKZ83yXXQ7uDqsPrclPVvReWqKL6Bp+oNI8ShmxwQOAPcVzUnguaInkHnHHXH8q9xhbTbYGBAAefTgAdeMetYF3qNjaq3mOAW6ZP3gOM18lSzOtflhc/YMRwxgVBVq7V9b20PJr7w6sWnE5Clscn27+v6mvN7i02E5Ix7c17pqsk00Jjs15IIxnqR0rx67ifYyyfeQ4PA4Ir6XKMRNp8zPz3jLLYQlD2K6b9Dhr5vJDEDp3rlg7lzk+9dBq67x8vB71ypdoM4719XTeh4mXwvC/UsG8MR+vStSC6kRPnXr61hRzrv3bQTWj55dkHODgVdzpr0dNj1XwlBFqWYnBX0POPfP4Zrq5fCrx3CRE7oRgnGM4/SuN0mX7FAvknazAD8K+lvClkuo6as92DlSAMj0HH/16+QzvFzw79qnoe3wVlGFzGq8NNWktb+XZnjzeE7KW2mu5G8vYSAp46d898fhXRWnh+JohwAfunpkjtXpOs6RYXUBtp2CANuJHeuQuYILOUSLJu28HBPI6dvSvno5jOsrX1P1mPC1LAzcnBctrX89buxpwWGlW/wAjorZIU9B9P8+lfP8A8U9T0drlvsDliBgp/CCOuO/X8K1vFutOmprcWr7QuQpXtyRXiWvo96xlL/M2cn+tfTZHlLhJV5yvofBcS8WQxn+wQpqMYy3727f0zmFZnJkYfNmpTyuTzisSeeSL5BzitCG9QqA5xkV9gePUoSS5kWTZWk0bAAbhzmtjT9GhK4kGT6VlRBi24cCt21uHQBW6damXkefiqlRRtGRWfQdP80vt5Pap4oEtiFTpn6GrrskxyDWbI4Vi2d2P1FZ2bOWNWpNWmzrbaeBU+ZQ2akvDHMgC8EdP/r1zFpdDdubgVsgCVAynr3rOVNrU8urh+SVzNVZYmwPWrUbsTtl7etF0VQFB1FcrLqbRv1Iwc5ppXR3UqEqq0OllQAnI/Wsp5djkdazH8RRvIUPJPNZs2opcZ5Gan2Z34fL6i+JHPeKHS6n2g9K47+yncFYxk10lwjXEjOfXin26tBHlj24osup9xha7o0lCL2OKfRrhRuYcZ5FRwaeisxK8A966qe5ZnO7oKzZ5B1hJ5qHFbnr0sZVkrSM+dUCEYH4Vzsy+ZJtIx1rofJaTLtwKkXTkmTYo68k1lUjc7KWIjT3OEurTbGWFYot5c/LzXoF1ojxIfmJPpXNSWFxaD5xnJrknTPoMFj4yjZM5S4hdH9QaynR1bca6m6iymB1rBlUj5T0riqwPocLWujKkYgZHFZ7CTfuUZrZeHb0qKJcy7WrknC56tOqkrn//0fx8h1PavkwHIOM59K6CzhglQysTuP8AOvNreQFj5fAzkZr0bQY5JoFaTjB5Ff0JOPKuY/j2NX2k1CSvuyvPcSqdjJx6j/CtGy0uS6k85FymNo44yf5V1SaLb3EXntyMda0NHtriKNzbHKrnI7YzVKorXRx1HNNQm9PxMhtE82Hy3O0d6kXSnhUrGAMHHHWunE8L3jgjJ2gYFdTpuhQX8uEbk9Mc81CqW1kXVja0Kerehwtloct1KoaPOepI/rXc2nh/fHtuyQg7joT6Cu3k8MyxqPswO4DHTgmuui0t5LNbO6i8oKMkkHr/AI1x1cfs0zohlsleDXqeXWmjyoxiVBtB6+uOn417H4I1mLSrwPdMMcLhRUFv4dVrNo4MiRSSpI4NFp4WuZGEjjY5YcjnH+Ga4q2JhUThNm9LKp0YxqUlqfXOjatDdvEVfg9R0xmvQbWJS5yNydFPTFfN/gyK8jvRa3Cb0B559K+pdAsmMaKQfp7duOa/M86pxov3WfqmRVqmJVmrWKM1os0RkGRgYxjjNYM2moYROVAOeMce3+RXq76RwVA49xWDqmkyW1vlVLAH/OK8XD49bJn0NbL+jWn6nnVzp8sMYQEDPNcxdmSzUEHGeMfjXrEenS3iBhwQOhrnNZ0xliZFU8+3SvWwmMV+Vni5lhYpc8FoeatqUjAKo2jrnr07CrEOoOmxScg9v1/yKnXQZl4A3e/p3qSbTfJxA68+49a+gi6eyPhcVWq/HLQ7nRb22crgfMOx9a7+zSKZtqEccGvIbW3azkDRHjIJx3HpXo2mSNGwcZ3d+9fP5hh1umfTZXjJ25balLxRogK7oSRjOT715gyyQPvdjj6+lfS0UUd1akYyPT8K8w13w1OkrPCmAxyeKrLcxt+7mcmZ5ZOf7ylH5HlE+pR8FsgjnHvmn3euWy6eZGcFs4x39O1XNW0aW2QyP19x0ryfULKQvttzxnr6E89K+twdOnVtqfF5nKtQ5molnVNZuIvnRi6n8RjPTmuCvJGNyZicYP6V28UCxRhM56dev1FVNQ0+CSMM3Bc8HqR/9avosNVjDSx8RmODnVfNJ+duxzlleqJPs8nIA4I9eo5rpbOKJbgP+PrxXOpGyXvydSDknpgCr7XsqYjXGBjGOP8A9ddk4326nziru0lN6Reh6npMqMqpHjb0PpxXpOngoFDNkdeucZrxDTtTeOFckMVxnA/H869BsdWdlWPOR0H+NfN4/CSbPr8jzKEFq3c9jszGIVjIz654znmpr7TEeISRHDHgn+Qrk9M1EEbWb5jwOv6V2lhN5i4kOAD9QPxr5KvRlB3TPv8ACZlGquWKMuz01zhphw3ce1WrjTo4DlDtxyB712VvEip5bfL15rP1CHey4wQOOtcMcZNz8j2KuW0VR97c4kykDywMEnAPPP0rSgfB2NlcAYP8u9SXVsqoABgr2/SmQoG4dTkY4/l/n9K9H2qkj5yWB5ZqNzotPk3xDexXnI9a30AO5Xwc+x61yEd0kYODhsAcDn/PpWxb6ig2t/Cf61wVqcmtDtoYhQny32C+0pJY9ucqGFc+mmi2uQVPyt1ODx7jmurF7Ftz1BxjPWprmKBrczJ0I5x2pU6s46PYrEUqdW87aoqQBmjMkZBXoD+NaagyKPNXr2H9ay7Jy8Swgfd5x17100UZY7iCcen/ANasaztuaYduavHsYl9pkjQlkHzDp71yU2khpN2MeoPT8vxr2q007z48yDIPTjpWBf6I5YkH2/CsaGZJScbnozymVSlztbnmcthZiJsDBX19e/bmuQuNNAH7pcMeh/KvSr3TJ/tHmDnHGPf1rM+wSs2Cpyp7/wAxXs0MXZXT3PCxeCc5cs4WscFFp80b4J5xkDv9a6Ky0yeQGQA89z1rak05B+8AO4du35VcsoyMqRznn1rapjXKN0eZSyuMK1pLTc4q60942YDj9DXPy6QrLtHy59CelesXVqqn94Ac9MHNc/d26FwiD8Bzn6/WtcPjZLYWMyuEnZrQ8nv9NIRkc4XoRjqKzm0OR4zIgzlccdhnP5V3l7ZcFZAQfX/PtWWYH8vIU4UfpXv0MZLlPgcZgIRqt26HKWGjROpllQrnjnjt2/wrcg0cSMX6YHPb6ela8ceF2kYA9f5V01pGHTG3BFZ4nGztc6svy2nzRVv+HMjTdMTYUdd2BjPpn09q6CDSHwcr8qjtx78e9XrOXypOVwfQ/wD162oHzJyMZ59/1rwMViZ3Z9tgMBTnGNt0chJpwE3nqT16f5+lQ3FmZRujAzjOO9dg6qxYD5ieTXPy3DW8YZ1HJwSOlOjXk9ScXTpr3X1MC+ghey2yrlv7w61xmoaNHIfMBHB4JP511t3fxeaRGP8A62feoreOa4Zg68H+tezhpumuY+RzSnCt+736I42CKazPOXz2/GrsJeCT96Dj+f1xXUCwVJDIgyuMHI9v61BPECpTaSGGM+ldLxSk9tzy44OVNJN2sZjNEE2dMZB7/wD6qoXVlbzgyFRx+v8Ahj1rQSKSPKMu0Z4JGPqatIUkXYTjjgevtVfC7o2lUVT35nEX1iCmUG3IxwK4zV7ZngMpOQo/zx9K93h01bmyMZUoSOCe2P8A9VcBquieVv3dOjD/AArvwWMXNZ9DzM1wTdG8NmeLvciFwtqcA8jHy9Opyev0rkfFkkt3A0blVPJ/l3/+tXoOsWRgfMaAIpODjP4e9eaeKEuJVaZBnZgDnkg56+hr7/KOWVSMkfz1x5iJ08FVpVPuX36HP6TObACV22gs2PfH+FehXN8rxJeWb9MZUHg/zry+OCYTlZeCVzj64HevSPDyw3MHlyBV2gDA5HTnHJr3Mypx0qM/KeE61ZReDpuya0fVNHW6FeyXga8mbCsM9Ofw6/0rUklc4dThSf0x74qKy0yBYPvY6NkHOM8Y/wDr/Wte50e4EH+jEE7SBu6cD159K+Przp+00P3XL6Nd4RRlrJK7a3bOZ8RWSyWbrw+8EEE9emfTtXzxd2EljOVblWOQR9a+nvJnkjXzYjjBByeoPfPIrynxDorSWrzgFyOvHvX0HD2O9k/ZyejPy7xPyF46KxVFapflZnnMjqwLHk10mmRW97bbZ0QxjPLDn0H61xpEquYjkEnuK9t8F+Hzc6as1zGcjO3PXPB//VX0ecYiFKlzM/KuBMpq4rG+xj0TevyPJdU02K2us2oYITgD0xVZbWO4dUYYbJz6H8Ogr27UvD8trE7GP5RyR1IHf8ciuZjSKwvPMkhysvIOMjJ64J+ntXDQzVTh7up9LmHCsqOLtVaSb102OY/4Re0e0DRfM5ORxnoPX8q46WxeF3ixjacHPWvbtPkimlZ3Tag3Djt6/wA+lZ3iCx0xIFuo0UEnGSDknsMD3qcJmk4z5J63O7O+EKdXDfWsO1Hk331Xc8eCmMAJ8proYwBYFvbt6j378U3VtOFq/nKQOeQB0zVNWfyti8D6da952qJOJ+U+0+rzlGfoXrPWpgDC+0gjHOc/zrVslF4zxGQ45PXGf8muIaNopxt43D8K6CxmnimSUYO31pVMMknyCnmUpSh7V3SPQW0WARJPDIHDjaF54GP5n2qXTfDMN0u2VtnU4OCenbPpxn8awI7jVtgeNd6DuBmuqsNVnMQs9g3yE7yASV7cgcn9K8TE060Y+7I+syvNMDOt+8p7dOjf/B/rQdfaNHBAI4OkYJ5HGT/d/CuMWC3+0NauSCo5J9R2/wA/jX0lp3h/+2YkMozjJwR3OOf/AK1eUa9oEmk6wy26+YZTxgAnjk8cdfpxXl5dmkZSdJvU+54i4aqRjDFcnuf8Dt+BFBpcL6a8BU4ZdpJwOCPbn8scVwWu6Mlo6pCAQo6qBzn+dep6N55gdGVQ+7Hzeh5IHepb/wAOf2rEDa4jYA4ByOn0/T+dOjjPY1feehti8qWPwNqcPetp33PCZ40bCqp3Ac/41lvbqpyTyea9H1Tw5e6LH9ulIPfOcnjsfzriljkupcDg46ev+elfV4fExnHmg9D8Zx2V1cPU9nVupPo0PhJ8vnkDjk10Efh43ixtbIS0nGCRgf596pado1/c/MB9xh9CO9e6+GNLntdP8+7XLA44ABwO2ehH05rzc0zJUY80HqfQ8KcJSxtVwqppWvc8SbwzGmSQySKxUg5x3weQKzHsnjDKOdpzgc19WXXh2fWECx7SjDqQOPSvHtb8BazZu8n31HcH73A6D/GuTLOIYVXy1JWZ6XF/h/iMLBVcPTco90vx6/eeQyxMVGTnJqJbRQ3miuhNs0L7ZByOvtWeY97ENxivqlPsflUazSKLEg4QUojfOXNakdsJQRH1WtK20qV3CEHJ7kcUpVYx3HCo5e7BEGmX1xp0heA7XPGa9U0rxldXMItppUQoFOSQDkcEjtXmuo6Vc2ZTzOrDPH51UiuPLkwgzk8g9K8rGYOjiI81rnv5RnmNy6pyxk4rqttz6CstasnJSacGQHp1PH5Y7+1ZniWezm0VzK2JdpKepwOR15614vO1zLK8tvuznt1x+FaVk2qCEm7yyOCPm5Pvx2P1rx1kUYSVRSPvX4jVcRRlhqlK901ff5sx9JhF3frC7hVYkZxz06V6fLp8ml6d5kMmAc7m7HAwDx/L9K4WSxWKGO/sm5B+YHAIOCePyxmuoi1w6gFi5XaMdccnj2rtzGMptOG3U8LhqvSw0JxraTduVrzOY1S/t/tbnk7uW546DjHPP41zmoY1AARJgLyG/DsPwr1W88IyanbM4XbvOQwHAxnoB0/WrFl4QiFm0YU7grAZ657HPt9K5IZlQppW3R9XLhzMMVdacjVzyHRNOe7lPouc/h+VdwNCUW320YUqM+pGevNdJ4e8KPpFxIJyWlYAhlBx9B+fWu1/sC2mX98TswCcY5A5xz2J7GuTMM5j7T3Xoevw1wZVeDfPG09dOz6HnGnWl3LJhF/2R34HT/PWm+K7e1Gmn7Tt8z7vPsO3THOK7wW8GkQ7YSvlryMDHLe39RXiniSaW61OeLB2hsn29/SpwKdevzLRI3z7GLBZeqFb3pS08k+55vqQW3jzGOvNY8V1lTkdDXUXFukiZfrXFXsRtpykPQjNfoFGzVmfjeCcZpx6mws0Ui81C0KAHaOv6VRsJVB2mtxF3Hj15xSnGxdVezkc7cacZcugOa5y906ZRuA6V6hDEmfl6U24tI3TcMDHelCu0zfD5rKDseIOvIBFWLR3jkCg4HWun1XSEZzLH8oWucis5kbdjvXpxldH1dLFQqUzqrGeRvlTAz1zXoPhrVbmyuk+che4zwfr9K8shmaPHmHArprTU41AbIxXDi8OpwcWjx5Tq0Ksa1HdO561fWmv6sEnslJik3E4PbPTj8KmvfC+sztDHe8KF5K9Rnrnvmtz4eeJ7G9RdMlRnx3CjoeBzngA969zfS0voTJu2IVAxwa/OMyzWphKns5Rsl1P3LhnhPDZvh5Yn2jbla8b7Nbo8FERtrNY4FYjBHPRfy5rw3XrW5F3JvyCzE4z619e6hp1jptpKwHIzknof/r968N1eCyuGe4ZQD16ckk9fpjtXVkmPvNyS0I46yhww9OkpLmXTolsfPVzaSMMygj3rIOmwuSG7V6XqXkHcQuMZ71w91JgnaORX3lOo2j8nwuKk7pGK1nHDIQoyc8e1VZnjVsNWpI7Fh2qhcWnmc4+lbQn3PWo1G37zOr0jVrdwkcnJTn6175pnjmO2tIrS3IVSCXUZx26da+V7OKW1kD5rrYLiVTlSSfauPH5dTr25iaGOrYGcp4SVrnt2s+NrW/iCopVozkdSD/+quOudfklVcfKenGc4/lXLQgvCSTtJ6ZrKe4aCYq56etctDKKUNIoeK4rx+KlLnnqXPEGpJNEASCema82vrmMrtH8XWunuxFKdwI5ridTtnaQjkd69mjSUVZF5XTi37z1OTvpQjNI3GOc1lWssrybs8Va1K0uGX1Gahi3xMBj/DNdB+gUoxVPQ7OwvhIgixyB/KtCScglH69KwdMXd84/KumMHRu3p1NI+XxajCoyrb3Dg7W6VdEcczhW7U02+75V4zTIFltZj5nzfrUnJJp+9Hc1LOyUzcH5R+NbEtzHB8iDis66uQlszoOe4FcrFfzBzu9elQoX3OSGGnWvN9Dqph544GCeKibQYfs+5jkkdKxm1ObkwjBA71s6fqMk/EvpwfShwdhzpVqcbx2ONvdEaByCuR2Nc3Nps6yAjgZ5FevXIVlAPGazHt41XIXmouerg86mlqeciykGSBimPaDHJrsp7aNju6Z4IrBuINqFuKT1PWo41zOOvoFjBK8+9UrS3LZB/P1rfaHzBtkoBijTy8YqHE92GJajyoq/Y4o1+c9ulKkLEb0AApZIXkG9mxU1vbTY2luKlqxnKppqytPZ+coZeK5y+0qV1yxIFduVktlGOfekkcTRFXHJrNwKw+OnTd1seTXOkwIhGTk1zkuk4bLV6fc2Mfm5fmsbUYFjTjp3zXJOkj63BZrLRX3PNL20jjU7ePSub3iMk112qK7uRjjsK5KaFkc45Argqx10PucvlzR95n//0vxnutMaFgrDaRj65712WhTizKwOcg8Zrodd8OxQv5yscMMiuFhkAvjbrkV/QcHGatc/kGs50btrVns2keU8nkOeHIPt61qzWvkuxt2AQj1rzdJ57MebbZ38fT8q9L8KWV5fyxPqKExk89vasanurmvoP3GlG15E+maObyAm2Hzg9T3resYn065Qs4Izjg9u4r2j/hFLCOwjS2ZVBXJPXn3rzrVdLhjuiwYKV55PFcNDHRqNrodeY5XUowi3a57f4cksJLWK6uF3E9z6dK2tQfTtXuTaW+FYD5SB19q8g0nXzYWIgMikDqvrXT6b4n0q5lAD7Spxk8d/WvHr4GXM5r5HqYXMEoKDstrnqWmaertHaTpt3/KTjqPrjvXoEPg6GRjHuCgDd9P8mvOT4rt/sEMcEglKYxnjn6+1eg+GPEaagNxwSwIHcZ/WvnMaqyi5o+qwHsZ1FDq0W/D2hLHftLI446be/vX0/wCFbbAjVQCNuc9DzXgUDvaMZWwe/p0/CvVvBWuQiQXSsS3Qrn36V8nnntKtNtH2ORUoUavvaNn0BBpFtdReaBhj144NYWp6Pu+XbtUe2R711el3xuUBBBGM4zUupSIYMIuc9R7V+Y08TUjUsz9EqUKc6d0eSvpIhl3R8Kx6dOaxLvQpWlLbQwb+ddjeSornGdvXHTBqDzwUMkVfX4evUVpI+Kx2GjNcnbU4N/DqpEz7OCOc15vf2ywvlgCScr25xXu17eKLUoRwoyQK8l1JobnKpwU6Zr6XKq85Xcj4nOqMINOO5y1hcRSXDRXS4GRzniu1sxJHcbQCU/Dpj+leYXk5Rg3QHv2//VXofhm886L96QCBgf8A169rG0Woc9j5jBYv977OLPSLDYq/uhknvVu5mjcAGMfLkn+vrWZpsqW4JcZHH5VozETBvKBx14/lXytSHv6o+zhUkqV07HBeIrK0vwW2gbcjbXhOt6KiZfOCnPHevbtbY2908fzEnpzXF6jZRTIJOS3J619TllZ00tT5nNcMqjszwS7ia1PmZJUc/wD6qyp71wWiXlABjnI/z/n3ru9WsjKzRqpKrkcf/Wrl7jRCu4IMEfjnntX2+FrRt7x+X5rh6zf7pXRmWttGF3k4yO/9KrzWoLbTkJx2/wAa3ILNFkCjJA6qeBj+dXF0wTOUOVY/l0xXb9Zs7tnzVTLbxUeUwbFmiYiQ5weAfb+Veg6RPHJGCBhj8px2H61zD6Gc5V8MoGMcD361o2czxgRW4JK8YIxWeIqxmtDbC4KdKptp08z0KK7FsQgJJHU/hXZ6Nr6ljHIuJB0P9a8bu57uQ7xw2fSt7Srx9gecbsenavHrYOM4anqRxtejW93ZH0jp16ZyM/d/UVtLbq8HmE7mH8q8o0HUYVIDMMdOvfvXplncO5wp4boK+MxmFcJWR+m4DGxqwvPcuGC3nhBXAJI5rndSZdOUvuPfP+FdWsGDsfjI6+9TXWjw3ceXOfWuOFaMJe89DetSnOL5dGeR3lw5k87bhWHfjFJ/a7rtjiBzjOO4Oa7zU9BhW3BQcg4wBzj6/hXET6LdW8iyIpxkn8a9zDV6VRK58dj6GJouXJu9zctbmeW3AB2v1AxW9ZTyH5SOv6n1qhpkRgt1km+XIxx7etNvpDbuJsnBJ6A/Sueooyk4o2o88IRnLc3lkW2UkAde9b+l6jFcDcBgY+hGPrXGfa3kiEa4J57e1buixxxZJPPH/wBeuOvQTg2zuwuInCsoQeh6jYuyoN54Pp3rYezinhYOucD9a5fT5WmTYp6cV19s4RdjHjH418hiqbi9Nz9Fy7FOUfe2PM9RtDHI429CaworLc5MROT1PXNel6ha5bIOQevvzXPtbmN98f3T7etephq/u2R5uNVtWcomnlG+b72MelTwaY0YaQ4ORnArq3t2lh8zb849eOKzGmfy2EeCo6ke3+FdEK8pbHn1nBJSe5y97ZM2MAbTnOP61zl9YbcSLwD0H0rv7gCZFZwM8449aybi2UJvfkjpjselehRrNHl4mkrtnmWoWrEExgYHXjms6GPMIRhjbwc/yrvbi0cfMMDH4j2/WuJuWnjdgwwDyccf55r28PV5o8qPlMVQjGp7Sez0Iv7PDsWIJwOOR39a0bbbbkMoyRnj/P1rM+1lT5uc5wCMVpLdRvEvcjjPb/PtWk+Z7hGMGmqatY6aGKORVI65P4dzUzwRyDcn4/nWZp8qMQJPlB449K1YpMPsU9SAc/pXl1U1I+iw81Kl6mNLC8dx9o9emM9zVTVEE8e5eARxyOua17mWSOTyl5QHkfUda5zUkKRFskrnaOfT0r0MMrtNnymP5kp8utv6+44q9hmjOVPzgYHuO1LZXFzHkMMjbx+FdRbvHdD98BuP3fcDt+FMa0+YlPlQH8/617Cqq3LJHyuJp1edT5vuK1zeMVD5AULn+tNsXW4zkgtjGP5YrNe4dxKkoKoc/XPpVjTpIkfcDtGevBqJUeWL0NqeK9pVUpO6Zcu4snyRklQcHrisGxLGYxlPuttPf8a6z7QkoVocHJySPy/CqUQjkmWZeuc8Z/GnTq2Ti0aV8EpWnCf/AAxoQGNIjGRyv9KrXmmrc2vmKMsR6fhz2q5bLHJMSh68Y9f8K1btlX9xEVwOn0rllUaa5T1qVFTTc9VsfPPiTw83zSQEKq9h3HXFea3+gCW3KMuWB3cAc45x719Uapp8VzDlh0PPbr6153e6Yo3vDneHx7Y/z9K+syzOpRSR+b8S8E08RzX1UkfLt94ens7gXMqgKy9BwD+P4jv+FTafLdxmWeEAZGCpxgDHpxjI7/lXqF/aTCZ0mBK5OM9vyrixpkjztEzEAgAdsYHGfWvu6GZqrH94fzzmfBn1ao/q19W9Ou3c7TQ5ReQ8jDbQWXA68dK663jg8sbj6Y9vbI4ryTTbae1DK8mACDznt/PNdZFPcWfkoMqCM5JBz34xXm43BpyfKz18iz+dGjFV4a/f1sdx5EEenlpguOvHYdBXHapDp19aSLb4DBeuBjOO/wBQKh1TWHWGOPJjZsbuwbOeueMHnmsuzjVYZVizz0Hfn61nhsDKK9o3qb5lxNCvU+qUYJxSs/uM2bStOZViaFJGOTkjkAn8Oeprp/CAx5ltEQys25T3APBx6CuPu3ms2c3o+8AFOT1Ge2epFdB4O1GKwjKSEMgI3EnOccfgK68ZCboPW5x5TUpLM6fuqOmvdLz9dz1r+zreRC0sYO7IBPQ+/rzXHeKdCMmnBbFN7tyMjOCOnauui1y1lOxcjng9cHrVi1ut6gO/J4yCMgZxx+NfK0alWlJTP1rMcNhMVCWHi1dq11ueSW3gnU7PTzczt8w3EhehyPw/z3rkdV8LX89qGdzwA+CD1xxgf/Xr6ceylnsioy46cD8a4DxHo179kW4hYr5Z3EjsMYxxn6CvXwGezlU95q7Z8RxDwTRjhvZwjJxUdr79z5bujHPNLp8xwAclzjGfpjPSuSaRoZShO4D0rvfFmnG3ne7xhievXOen6V5vKwEh45r9Yy1qdPmR/IGc0HHEypSW1/u6GvB+8nBXFdJiGOJA6BufXr7VyFi5D9Ov410kTq4/eDGDzXRWp6nzleTpvQ7LQLyGP90vVsAAHkkYOOeK9N0ifSbVwBF+9cHcwGD7jPbmvErYpE3mKdoHP4+1eoadqemwWUZh+Vx8oAxggdc9+a+azjCX1V9T7Pg3iBU52nZcu1/Xp5nt2nX8EWxMgNx/LrXnPxCNlZ7Ll2Xzh90DPKg/UdM1VfULcXe61kUzL8rDqBxkge/NcF491hNSnjCHLxjDn39v68187lOTy+sxl06n63xnxxGOWzpRScrpL5/qjKHiB0ujHD9wtg44+h4P8637XxSLfcAS25gWJ/x/D0ryuKYrMQp9TmmSyvvKknnv1/KvssRlFOeh+N5PxpjcPO8Zefoek31zP4hmZgg8qI+h6E98+386gm8MwwYaJS/G3qMhs8f4dKp2d4Lm3W2yVCjt0PXnPX65r0BLC4FotxNgE5Jxzz7dPXg9q8SvOVC0Y6Lsfe4GjRzButU9+Wjb7f1sc3pVslmhhVd4VwMkc4Pr+tez6HLHOhRvmCEAE1xC28EBkWM73YLz7jOcV1/hzRNQmcvbPthPy4xnke+cD6cV4WbVIzhzydj9A4So1cPjFh6autrLtr/wDv4prSK1UxHORk7T/wDqrCvdRhfO5eMe3PXj0JqpeafqFiohZiVGcbe/+e/5Vq2GgS30vmOOP4eODn9a+WVOnD95KR+rzzDEV37GnTtayPk7xPayQ6hK0UZRHPAx09vyrn7KwS7nWOTI3d/rX3TD8PdGu3P2+NXHcY5HryK8k8W/Dzw7oc0l9aSt8+SqHgKTnAGP0zX3+VcYUKlqFnc/mPjHwezDCKWOTjyNttXtb+vI848PaVp9ptnugGyDvABOQeMHpxitq6ubJLmJbfHzbgjZzwMdMev4YxUejabLPJnUo2kj6qoGOOnXp+ldavhW0vblQB5Y44xnp9ePpU4/GRjUbm7m3CuR1q2CjGhTSd1vv/XzODutLnltvKlBwM/NjGMnk/5/KuEvrGOyciN9y+49R/Svou40OeU+UvTngcD3/n0ryDxToOp6fcGMjdncFPX5SePpmtcnzOM5crZjxzwlVo01UUG0tLrocJDc+RINw3dT6c118Vwtxp0jFNjEgbuSW55zzjgVw03mrNhxyvGfSp/t0vlmJjnHTnp7V9JVw3PZo/K8Pj3RjKPdNG+sVyts+R8vDjIxkdOPUVqW89nbwLPEMvG2SBwfrkc4BNcpa6xdWo8tnYx9Me3fFRS3hlG2L5Fz0FTPByk7PY1p5pGnTXJq7W16Py+Z9UaXPod1Z26F1y/3V7gseAee+ao6ibSwvFbGB1YV812esz2VwJBkbePfB9K9Mj8V2T2Bjk3SEDgnHP59xnsOa+QxXDk6c7xbaZ+15P4qUa2G5K0FCUbWfoehalq+nQRrcIcgDPAz2zWbH4gsL/EUMZcAdxx7V4zba9cCye3lLNvJx3P0Ptj/ACKs6Tqc0Z2xDGASM9SfTI5rb/V1Ri77ox/4inKtXThZRktVY67xVrEXlM6kIUXK4PI7Z6dK8UnuzJO0sBYbueTzmtnUry5vm8vdwzZ2jpk9v85qnPot5bQrOyHDZxjJJ/D1r6PL8JChBRe7PzniHPKmYV3Upp2RisVJwepOTzisebR5L1t0Yw388111vomp35EiQOy564xVO7Z7VjE42lT0PavUp11e0XqfPwVWlyzaaT623OAudMudPILD5TSRak0QIPXtXa3F5HPb+VIoIHqK5iSzt5shRjJ7da7adRte+j0YYqM1aoiKLUWJ4OfpUkupTrwo4YYJq5BZW0XEeAfp61WuLCRjuUVneLYoypc17GRLI8xKgA1nz6fLOPl+X+tb3kMkgSrK2xZvRa2jWtsdccVyfCcTPpt1HEdwyVGao2yOZQjgpk969hsLa1Zi11jbjvUmp+GrC++ezcDaOCevFZvMYp8sj1cLiJzp81lr56/cZfhnUjoNwJ7c5JGDnnjvXpk3xXvICCirj7u0/d47ivGJYLuwbyplx2z6VpLYNdOkSfPI/Ix715+My/D1X7SqrlZfn+NwfuYao1d9O53Ot+P5tVh+zxptXOeD1I6Y9q4O+1mVomhAHLbvx9q0I/DerSSGGBSzgc9OOarW3hjUdQmMbIcc9eKzw9HDUotRtZHbi8fmWKrKVdtuWi038tjjpFefJI4rLvdPbdnbn2xXtJ8Lw28HlBd+zJJORjAzWNbaWrnaF2OAeo6/n71os0g03HZHXh8lxMKsYSVmzxZ7bPakWNgMEV2up28cM7RLyUJBPrz/ACrHuEROvQiu6nUujneJtLkZkxxpLgsK1GlVFKqvI/rWVNOsA3561nm9C7i3T0rshBs0lQdTU257zyYiw5Nctc3ssspbvUEuoiVvTHSn26o5357VvGCR6FDCKkryQ0Pdy8opwtU7jLkq4OfzrqkWFYM+vtVD7IjtiM5qVI0p4lXbascxcW0axbnXqOa5G5gWMfKOp4Nd/qIkXMKrkCuaOmySHfIp/pWiZ7+X4rlXNJj9MAjhVgO1annhlwBiqUdu4AjHAHaraAR/KDx1pNmVZqUnIvwTgHaRxV4GIjtWOxikYBuB7VT1/VLXRtPNz95jwB/jWVRpanJHDupNQgtWO1fxNoekr5Ny5LnsB/WvKL3x9CbkpGu0E9e+K8y8Sa3c30rSMSK5SO4MikZ5rw62aSvaJ+u5NwPRhT5qurZ9LaH4htr2QxpKJhgZycEV6RYzRAeYpBU9DXxJb6lLZuTCce4NdnonjDVYZI4IZWIHOCaqhmyV/abEZvwB7VL6u7Pz2/BaH2JFKkg479DTJLV9mY+a4HQ9Uup1jaQ5YjmvVreRfLwBzivSVZOPNE/IM1wNXBVXTnucfcwkD5zzXPXqjGDzXf3VmjybjnmsC4sBtO05zT5rm2ExiT1OBdck4FU3YqfLYe1dNNZEEqO1Zs1qQQV5rU+no4mLKEYV/kHSpXRY0Hlkn0p6wLEcnj3qCRWRtxOSaiZrzXehVn3N1quJOm0mmSy4yMkms6fzgh2fUVmelRo3VmaU5aUfLiufvLdpRhRwP1ppubpVPHSq7XjLhiKxm0z0qGGnB3izkdT06eLMoB964+e0eVyBXs1xGLmEs3BIzXA3kKwTnA6/nXHUpH1mU5lJrle5/9P86bue0u7dEmB45weo+lcZD4ftpdUIOQckg9Pyr2D/AIRuSFsyR4IBA49PSp9O0CGS7BdCeQM455r9zp4mMbtbH8tYrCtwVN2ctDjxpVhFFiRuQMnnkV22ganH9ojQ8YFdJa+C7C4u3lmQ56gEf0qnqeif2VcYSLnrke1Yzrwn7vUX1OrTvJWSO8tteDZcYQHPynpn/CvOfFesyurvEq5JwcdR05/GtSz8u4QyMmzA/i6EetZuu6e2pWoktEIkHPHpWNGnGnPU6cTiZYqF49tzxXWtfuBOix7gD6k/jSWniUywpHcS4bOOOnWpNb0u7izbumXwecdD9a5yHQrlMrGu4sevpX1tKUHBH5PjMPVVZu73Pp/wr4pgn0+OCd90mOcn0OK9i0LW5bWeFImwGYZzzwe3418QeHvtWl6gGySx+X25r6X8L62UaMSYLryRxzj614eY5dG146n0WTZ1W+GbtbReh9rWeq2uuQrwI3C84I/KpdHmuLG+EkEhVN3I+g7/ANK8AtPFclogdOjHJx6Z/pivZfCniWw1hQrZWUAZLDrjpX5zi8tlSi2l7p+xYPOoYiUbv3l8rn1X4U8XC2aMy/NkcivUrvxDayp5i9Dxj2r48tr6W0vDJ91R2xwa9C8P+LjPK0LnKgAfnX59mfDqlL20UfoeXcS8l6Mt+h7DqYt5oBPGOX9ulc8LlbWHJX8/WupssXkC7Rzt49s1l6zoFz9lyRgnuOleRh60YtU5s78VRcl7VI4y61AXNvJEBgtwB6Yry2+EokKMNpAJIz1612F5p2o2MhaQ8bayLq0nuI1lYEv+Pb1r7TAOMPhd0fC5rCVSykrNHm0pc/u5ee/I7CtTT9bS1wgAOf8AOa0NS0qV/wDj3zkjnHt71yF3pt1bt5hbgDBJ+tfS05wqRs2fC16FSjN+zje2p6Pp2rXN0+3zMFeSB2rsNM1OSBxG5OPXrxXlvh6WLdsfKFRgfmetdvagy/NnJJ4PqK87F0I3cT0MHiKnsVVe+uhva1bJe5uo+Tjr7151cI6SMq8c9/WvS8+TD5LDj0PSuS13Rm2/brIEhMEgd8daywbUXys1x0248/XqeYazbOA2xcZ6c8H8ulYdvaTZAcdcjr3rtZ5FdCs3UknHpmnR24n+TA5HB+vvX0VOtywtY+QxMG69lLdHnstg9tPlRlgDkDmt+x0p532sAuO/1966WDSN2Nw+bgDHXituLTYbZlcqeneitmGlkZYfJpe012Zyk/h8RwtOp3fLk9+R+dc4NL8mTzQMYGDx7V66RD5GBg84HpXNS2wm+Rjgdwf8anC4yb3Fj8HCErrQ424sSHDcdOhqq8U1pGD04wc9hXdT6TIVEkZA789Kzr+zhMBIX5eRn/Guylilojhng7yl/VzC06/+zptY5AHH+FeieHvFcmAk77Ru4HpxivI7u3MRZFBA4JH+enWtLSJQrB+N+cY6mumvhoVIttbnhxq1KMkoO1unc+orDVEuRksDjHPtj8K6qFhOihmPHHFeIaLfHgtJkNjOfp6V6Tp+rx7QE5U85z718VjsByv3T9AyXM3NfvNzrLxVdfIXGM9elc7d2KqoklJYN1rehkScgN95ucA1LqMcU1p5athhnHp+leVCTg1E+hrwjUTmcnNHFKqopH4VHJtGbeVeSBz79qpxtcQylW4I6VPHbu5Dk856fXFeha2jZ5NOKcOZLVlRT5JZJBnf09qu20gQ4ViDnrV+1tTJlHGaVLEWs2CCFbnnBI9q0WIjqjzcTllRQjUTOksNQVNqA+nPrXZWd5uYBSCT1rgY1i+Uqdua6mzkigZSnQZwD3x1rycZRi1dHo5ZiKkbqozqpU3HKgkGnfYU8sTFc5xx6VZsS5XcACD+XNbTRxpCmeP/AK1fO1Kri7I+woUfaLnZy8g8slWxtxgH69aoyWdoCcYOeD/9eti9eDzdpHbIxXM3FzJHlR8vUe1ddCLlscGIqRi3Kepz8kMW8kAY56D3/lUSQGQnI471ouE2Hf3HBz6UlviTCjvxkf4V6/tGonkVKEeeOpyd1aAxF8nOePwNcje6U8nzMpBx2HP416hLbzKxEgyD6DFUJogM8fX/AANd1DGuOxxYrKYTtznh2o2yxPuUMAPbGTXPzXhjfgEAHkV69r2lqFJ646ev6V53d6b5YZ26Zx/hX0GCxcZpNnzmbZQ6cnCL3JLDWCwJA9h/9eun0+7dhtkHJ6euPXFedpujbbD1Bx1rsLIyLGrS8dwPetMVRja6OPB4yVOThL/gG7qFyNpBGAMH8+lc7qNxBPbBYuRnP9P51e1EnyuD/n6etYSY8oRqdpGefrU4WmrJnPm9ZtyiuqKM8E0GJU5OePcd6nt9TCsPNU72HJ7VuiyX7IGZiWwSDWLLaLaxedjJJyc9t3avRhWjJWZ8xiMvqp3jppcrXkreSZIxyG6d8/4e9N0+O2ng+UbSPvdetaMGGjUMuVYgkY6HFa1tp5ZGZeuT0wPp+lTPEpRsXSy2Uqkb7WMyCHCgbMjrnnnrQqGEsNpxjIJ4HvmutsNM3xFXHCcDcD+fvVO605Vxn5uc5zx17/hXJ9aTk0exDLJKKqQ2ON8ySM+avK+me59sU5dSlWTa345/+vW7qNiUj+VRt46f59K55LRhcDeAQMqeePbtXdTnCSuzzcTRqUmoRLtxdo8LRqp54yPUd6wbi2zgg5X7uK3zp0xT92uFPfpwacunzTHEg5yOSD24zWSqxjqmd6oTnL31rsjyTWNCuZFZ1HIbIA7e/wCfrXFXGlSWxMnJJznPPPrX0PcadcSMY9mVYHH8iPxrMu/CX2iECQHgHGRgew4r3MFnSgkpPQ+Nzzg11W5Ul7yPn3TNOeK5lcZLEjHpjp0/T3r1TT9BFxGqyoSMZ6cD8Mf4VpXfhCVJQYQY0C4ZRjmtPSxPa3Yhm4UcDOc8mvQxma+1jzU3qfEZRwb9VruliVpf83c53UfDaJbGJlBbOQcfr9a5D+x5LFfkBz275GD1Hevo6CxttRQI33h6jr/nrWPqvhdUVi6B1wOOw9TXmYXiBp+zkfTZn4f05L29KOiWn/BPAH8OtqYRbyI4BOc/wj0+npVebwyLGNpEDYHQY796+gdN0qJJgrg7HJJ47de9M8Q+HIGzcQr8nJ57Z+ldf+sT51TvoeQvD+KoyxFry2f3Hza0z2Y+z3DFd/3PX8663S7T9xE8jMcEHr07fiKqeN9PsYIoHZsYbKtjPTH8v88Vl6Ve3kFq0iSeYOCuR2UY6g96+j5faUVOHU/OK044fHVKFZX5Vffpa+v6HsFtrdla2wWYgDOMnjHpkfyp1+0V1bEQAYfqeOn6YrwrWL/ymOpMGWNXxjkA4x7V0EPxD06e2jhjO+RuSCSBuXqN2PSuKpw9PSpSV+5pQ8VqMZzoYqSjypWv1Wxh+JvB9vcRi3ZeA2d/ZeewHtXh+u+En0xzIPnTOA2Bye469q+s2hh1nT2O/kAfXJ7dq818T2KyWkenMpJ80DGMcjrk5z0NfR5HmlWnJU5PrqfmnHvDOExFL63SjZtaNfdb+tT50WxkgccfL7UslwUO1RyPXmvVda8E3K2pu9LjcquQV7DHfk5rzC5t57W5aK6TB4yK+9wWNhWV4u5+BZrk9fC1LV4NLo+j9H1HJceYmT6dqt2k0yHaeR1q9YaHNcQrcRDcD6eo61opoeoSsI1t24IG4A/l/wDWrSdemrq5408PN6Rg/uM0T3LSHymI/H8cU1obu5YscnA5IHGO1bK6Z9kvVgnUFjg4J/HnpXtGl+D2RY7m5VJIWUMVz0JPsOSR26V5mOzanh0pPqfQ8PcMYrMZyhT6b+XqeW6H4Oka4C3cWUZFcE9QG7/5z9K63VvhpFc/6RbsUiRegXJyPp6816fDFHHOsFvtKpjbgdK7yztImiGwBiRxnqevFfCY/ieupqotD+k+HPCfLp0JUay5n3639V0Pkm18B+IGVpbWNsDGQRt6/Wugm0/WjpqQ3BKSpkEHgEdiMEV9bfYUFqu9Rk8kn8qguNB028tmFyqsx5FcUuM5TknUjsz2KPgbSoQcMLWd5LW+i7/1ufN2iwzPp4eRd0inB/3Qe3rX0D4YsCIMJwCc4z274rlJvAb2c7yWR2hz6ngdsfXFdZp7XelQiMudpIHueBXDm2NjiI/unue3wdkdTLal8VF+6rX+/wDM7afwzb3NuCwAJXv9Pf8AzxWdBpkunt++IJXg5Nb9hqXnbIycEjj3H9MGtC/tjcxn0X1Hceh9q+N9pUg/Zzeh+q1Y0KsHiaS1RzFxdxQINo4PU/hXCeINIstUhYSjaCRg98g8Y/OuwvIwkY8vljhSPpWJPa3CSLHtJyOMfn/kV7WApqm1ODsz4XiLHfWqcoVI80X09TzuO1hFt9is4VYfxE59enuDj860PsUVqqqo2sowM/5xXawaZFLmUKUkVR0A479sVmXml3qzlW25GTgd88Y/T0rvqY5Sly3OTKsnqU6XtGr7WstkZccOF2SqMADDdOvOMmsDVNPgug6yDIOd3fHHTNdfLB/oq/LjHYjP+fwqogJBhkA29iO+etY0ari3NHrZhg4TgqDV00fNWteFIobxpEQFRwV/i9++K4TVNCbTSk8bblb0HA+vPWvr2fwjBdRtcpkcbc9eo571y0/gyxtoJo7kK6uCzBhn3GPb8a+2wHFcY2Unc/AM+8Hqs1KpSioqV2tT5dEM7w8ISo56cVVjZkbj8K6jUI30tmsQCAeQT/dJ4xXJXMjpkgcdq/QKFTnV+h/O2JoKE/Z9Vv6k/lrL2xTxE0Q2jPHvVrQRHc3Cm6+VO9dTrGjWsSj7K4kGBnByckZz9KitiFGagzSnl1SdGVWLVl56/ccPCyC4G/p0OK968J+GtFstJl1LVXUiYY+YjGw9vTJ9RXgpi2SMCvT0rY06/u5p4kuHYxx5VVJIx1xjH14rizfCTrQtTlbufR8HZ3hcDiHVxFLndrK70Tel38juNU8PWunXwu7eP93uyu09DjPHSvU9B020uYd1yBtVM+pHPGelcraWQvrIR3ZLLGud/ccdc+hqpL4ni0jU1sQ+YiNpI64xxwPSvlMWquIh7OLvJH7Dks8Lltd4qtBRpzastOv6I7O9MagRQkRptOM9fX69K+d/Gmmxx6izxNuOSW7j6V7uZ7LWJlVBtQJ3ODjP6DtXNar4YsLqNktTvUnaME8Eeuev1yKWT4hYep7528Z5ZUx+GaoWlrdP07I+aZ7ZwT3xWcypGd68Gvcrv4eajbSFAA6seD0AGCR+n61zereBL63s0udpy4+b0Htn1r7bD5zQlZKW5+P1eGsxoqXtaLVt/I8zUeaMoeR0rSt1dcIRn3q1d6Lc2Mg3Lg9On6H3qSCKTIi4ya9CVVSV0eDWk78nUqtahn3EV0ui6PY305iuH6DIX/6/+fwpiWFz8sqANwDj8cEVsiSKUG8UCIg4IOf0J6civNxFZuNos9HLKPLNTrRvbo+qNu28ArLKySuFGflA9K4fXbK80OZrcyiQNySg/Q+4r1rSfE+k3Ais5pgrFjl2ICqQvXt1rzHxBe2d1qk0to+9Ax+YYwccZHH45rysuqYiVZxrLT0PtOIaOXUsDGrg7XbtdPXa70+ZyGq64b1QLmNV2DCgDHHFQ6bqw0+5jvLVfnTsQCPSsm+TFwWk7nivpX4D/C/R/iXeR6berKxibO2IA5B6Z/xr0s6zDDZfg5Yiv8C3MuCeFsdn+a0cBgHevUfu3dtdPy/Q7TwVaWPifw6b27jWOYHa+BwffitGXwVptk7vASxccnoOfp/Svrmf9nfVfDBj3qttbsAVQYJHHfbwDXG+IPCkem3n2e6GAACM4Ge9fzpQ8QMHi6zeBq3i9bJ/gf6Ky8BM6yvAR/trDWnCycmt3rr8z5X1DQ0IYBB905PByMe/pXh2taTqGgySSjIjZsggYr7kvrWxt1JUDoWOMdfevAviFpMeqaSwGMk/KcdxX3vD2ct1FGS0Z+K+InC0YYd1KMvfim1Y+PdVUG6IDbyep9+/61jzWrupViOOK9DuNB+xs9vEu51yWPXp71nx6ZFJC7yuqlecHqa/WqOIhy3TP5Ir0a0KjvHXU8l1CznjAYglawZYHJz1r07ULeMnaO3rWVb2EMjsW52169OrpqduGzO0LyPNpLKbfzxnrXQ6daqo2n9Ks3+mzCXMR4HY1fsrRYmDtz2FaykrHoYnHc1PRjZVcKAi4AGc1j7ZiT5WcHsK7aRkkjEa460+20+QKZViyF647ZrndZJanmYfFPZRuzmbPS7q7KxqpYn+EDNb9r4RvpYhM8TInGGIwDn0Jr71/ZU+CWg+KrCfx741VWs4pDbwwltu6QYJLAc4546Vt/Ffw5oXh+7e0i2rbq7bRwMH2HpX49mXjBhKWaTyqlFuUN30v1S811P7P4K+h5nma8MUeJsRVVOFbWEPtW+zKXZS6bu3Y/PG/wDBs8ZSEAMz9ADVu2+G1rNb77x2Lt02kAD/ABrqPFOu29ne+VYH1JznjPpXNT+LF0u3W5YfO2TjOMVrmHGmKqWjh9PzP0ngD6M+WYGEq+dVOeWum8Uv1f5fItL4D0JI2tnTDYI81iQQfX/Ir5R+JlxbaTPcaM7edJEcBh09jXp3in44NZ2kkUMYaY/Lk9CMYr5I8R+KZtXnM9xgs3p/KvX4fxWOtOWJlo9r6nzfifkHDqlQpZRTXtIPVxVlbs+7v1OUvp5JHO7is9pRGpKiluJxI27p2ArMkk3Nj8q9SUz5uhQ0SsNFyWmweldZoNjJqN0IoD8/GAPc1wDyEyEAkVt6Xqdzp063Vm5jkU8Ee1c7bcXbc9eEIRnGU1ddfQ+wvC1nJpFikeoMd6HuOo7CvXIjG8YeM5WvlLwn8SPMH2bWckMDlhzn04r33wr4isb3ThH58ZKnAHQ49816+Q1qri6dZarqfkfjXw/gva08flzbUlZrqraX/rfU62RgW+YZqMRbzlhWXqesWdlE/wC8G9RnFea6X8SI49U+zarcKI2OF46fjXtymlufjeCyXE16cp0o7fj6HqF1bI2SAM+1YU1nHncBnHete31rS71/KtZA7Yzj1pLkELu9fTtWtNkU3VpS5Jpp+Zyk1ihbe3SsS9tWXITmuxMDv845o+xK78Dk05PU9iljeTc81Nhcu+584NaUWlxyLh67s6RI0Zm6jp09Kqvp8iLkrwP51lzrY7p5tey2POp9NiUsACQPX1rPawST5U/Wu+ksZJXwBwOtUZLEiX5elRKx6FHM+jZyTafvOzPQ8muU1zS3tl82LnJr1h4liXcRgDvXO6jF5qFSCQazktD08vzKSmmtj//U4Ka00S+LbY/mYcEDHFYs/g7ycyooYHB46/WsfRL9CFQthQM+vT611SeJ1il8ktujPX2NfoDjVpvlg7n4uqdCtBOrFL07szvLnaTykUrjK5PX35qaDwhqOptJNOnCfdGMHH1r0TR1tLk7woZmPG31r06yubGa3EbqrMw+7Xm4nN50tIo9fC8PQrSvJ6I+T77QJ4GMSx9OAdvX2zXFXqLbSi0g/wBbjlRX2H4ms9Nx5jR/Ng9eMH2xXztqPh1JL97+3faw5IIzx6V6+WZr7WPNJHjZvkXspKFN6v8AI8f1GysriF5JFwZBjdjuPWvIb3UJrFzboNnuK+m/EHh6JrdxCxViuVY+4x2r5h8RWEkN9I8zbtowO2a+ty7Exkj4DOcolFOMehqRajYSz/NhSAMZ454/U13mhXYtJvtDkHA6V82XOptevtUFQOoB5qey8Q3dq+wydDjrz7V68aTlE+TxUYU6jUl5n1xpvihklYTD92RgYHceleiWHjqCwAe24BH4Z55r5Q0XXTLCrSEnHU+tdXYa6kduzA5VycE9iR6da4cRlsZ6NBg88lSnzJ2W59meEvHj62pWSTcvdh6+nH5V6/4XFxd6oJIflB7+vtXx58NXuUB+TAZuM8D619d+DdQ/fRjo4xwMcj0r4jPsGqLkqaP0LhfMp4uMfbPW59ZaLqttaQLCG5XHWvU4ryK8s4mXnA5xXyPHfXX275lICnkc8Zr3DwzrC3Fp5G/kDAHp7V+O5xk9kqi3P2vLc6TqvDtF/WbJbrgjO38q5C70R4mzgYI4xXUT3VwkojfoT3roLO3aeEM449+9Z0sRKjFX2Lr4NVpOy1PEZ9OmjlIkXjn8q4jxFarGhZRx1Axz/KvpTV9DgaETRgkjP0968c12wWM4I4zjHavpcrzRVJKR8fmuUezUovqeN2DhJM85J6eteqaLDK8Qk6DrmuFl0xI7rfHnBOfQflXo+lMY7LCnkcYI55r6HHVVypxPlMJh6kqnvbL8See6ET+Wx5Hc/wBO1UWuxko5O0DH+RUFxb3MhMhwOrVBFZvJxu+ue2a5owhbcqq6j2Rh3enw3U4kAx65HrV2GwgjiAxzngn3/H1rei0rzVwj8ge2aryW8qgx7e/ccda7nilJcqZ84stlCftJrXuSwaUYm3yjAP5U+7smkjEnpnOPSrSSzfZ9xOOenasu71AwttdScH/P51xR53I+gjyeya6HPX1rMqBYcjkcVnxiVJsSKHGDz1x6VvtevMM4GciqkNrHtIIwA2eTXr06llaR83iqblJWepKDLIgRBkEc9v8ACqctpM0RjlX5Qc8H1rp7O3Mq+T6cZx09cdKuXOkySyBYxxjnOf61j9ZSdmawwnMudM8rl0c3Ex3jHf3OfpTY9BktW89+QPT1NegyWLrNnG0fyx2rRis0lOybAOM9OOe9dEswktFscv8AZEd2tb7nn0VpKpyufk6/Sus026UsER/qMnNWbu0DSsq8DgA/5+lYYjeyk3scMM4680Kspx1M6uWzpyv956pa3b25V2OOBjvjNdIl2kjKEwRjtXj1hqiztskYjuD0xiumt7oqvy87ef8AHP0rysTgNTuw2apI7TUbS3Li4Rsk4J71nkRq3HNVk1De2f7wz7/jUaz5l8snhvzriVCS0Z6kcbS5LRW50kMiqcqAecc1oSwLcfvVHCjn8KxbYeY4csRjnHvXV2MXmAoOc9Qa467UNTrpv26jBqyOPuYZPM2R5A7VuaePKws3Gfw/Ct6GyiLlZR7CqN5bFThOgGMf/Xqfrqn7jFPJuS897nbaPKoXaTkMPeuhfhOTkV5nYXssW0EfhnNd1BObmMRpxxXh4zDtSue1gar5FDqU7pFIMg6+/wDSualQTKVYZbPNdRKr+W0R79Otcu3mBxlTjPT9a6MO7InFQX2upTW1OGt+Qexx/kVr2WnqIiHUgnpSxSJu5PC9asyapBEwzyOhz1zW9SpKXuo56WGhBc8jPvbaQRGLoeOaxPssoiCsODXQrqUd1KNw69fTir5jjdQAMj2rJ1ZQVmehh6cKj5kzgJdMWSI7gCM4xXD3+lnYQB0JA7/r7V7jJYKyFlAGK5+40VSzSD9a68NmfK3cMRk8Z2dj5pvLF7e6Plp8u4Een4elWI0uE+QcEnGP6flXrV34USS8MuTjqMZ5wKS68NrFGjqMj1Hr6mvpaWcU5JJs+Hx3DNaPO0tLnmQglEK7gOD39agjtiCZT+I/TGOldfdRCMMH7cfj/hWA0sLZDDdzj8a9OjX5k7HyGOwKhNKT0sWow9xFubACnGO/5VUli+2R/Z1Ayv6/StLT4SLVtpyCScj+tRG2nRvOi6nnA5yPSs3PV2CGG238zm0ma1xbMCSBgfjXX6ZeRSRhJcDPAxwaxptM86QtLgNngc569aILO4h3O6ltnQ9ue9VU5Zx3NKVKVOep6xYw27wbx/FxzyPasq/0qIN5kXPpnn9KydKNyV2ZI2jnNdPMS8W1PvL15rxXCVObsz6ScqdWkpctrHn13G5/dyfL6nrj+tZtrbRiXAHQ88DJrtb62DqHIG4jAxWQkCpJ5fHof6CvUpYhcp85isJ76kNgSMJiQZJ71LJHEcbPmJPB/wA/zqZrdcY/hP49aFURsCrE7OtZT11R2YerZKMhlnZpJKA2OO2a2/sUDAMg+UDA+nWsCQy5Eik/T071v2VyLWMb/mJHTt+tc+IjLod+X143fMihLYrGx8xcevrXM6no8cgaZAdwyfQemK9JlaGVfMJwo659c1VSGOZiG6Y4x3B9KmhjZQdxY/J416fJpr/Vzz3QgrkLjg9a72ayWaAkctjkf/rrmUsBpersOqMBzjAFeg2oUqJm4XsD/jW2Y1byU4nn5JDlhKlPdaP/ADOHOmN5gdFxzkj+fbtVi509JbaQEY47c5/Cu7ayWYeZGKy74w2sTptAZ1AA9K5YYuUpJI7p5fQjTbk9zxLXPCmlarF5d7GDs5UleRgda8P1PQ7nR7ryJBvgfoT3x9PTNfSupW8kilxwBggknNeYaxaPdOLeQL8pGOOvqP5V+gZHjpx91u6PwLjrJaNdupThafddfJ+R5vrulLc6KbcjCTEE7umR1/zx+teLajpVlaSN5Uh3IQc4ODkc+nI+tfQ95ps8ha1lU7VOAAeCx6A8dq4i40VYGkd495JbkAkDPOMf1r77J8w9mmmz+ZOPuG/rE1ONO2lrvpb/AIOv9a8npOv3Omwi0mC7GOdx4bH9B9a9C0+2g1LF6cn5Q5VsMA2Oo/CuatvB8erO/mTgADG339O3HSr5E3hMLbNwkjn7udpPbH4V1Y1U6j/cv3zweHcTi8HH/b1ehHZ327fK52iXFrF+6RcKMHpnB9q8f+IOkWUdyJY4sSMSWOMYyenTnjpXs2gXEWoWTW1wgUZwpPUgjP8An3rO8UpoNzp7ToFaSPhGPQkDt79e1eVluJdDErR9mfY8W5f/AGhk8rTjZrmV9Grb2PCfDkoCPp0jMN2Cq889c4+or1vw2kXkqjH50yQc9BngbepwOPwrgLaHbqcN1GCSuAOvHrgE84/L9K9l8OaPJbMLyfaWlPYYxXtZ7iIKLff8z858O8FWqVoU7X5dG/7u6+d/wPKvFXh2++2HV/lKqAWwMHcT1x+tdz4c1CU6EkUsvmPkhSeMDsP07V6/JodtqEDQlFBbnJrmdd0CS1tTFpMKlsjGPb196+c/t6GIhHDzWqP1an4dV8rxNXNKErwkndau7v0MvTrBRdi9ckg49+30xXdwy7SnljJxuPf61ymkW91FsW5BBXjpgZHPT867qyH7oOFKsWxkjBx/WvEzF3l3P0PhOrGNNqKcb667nQRWkskSMec4HToKS70Vx++iYpjr26cj86ktdQnLCFRheMjPP4Y9q6JyLhTtOcHAzXy1SpUhI/VqcsNXp23OFmjZlAmPKn+lcvfzzI3l7eV4GPWvSZLLzptqLyff09qmXQLaWMNJ9/BwP8a7KGYRp2ckeJmeSVMRFqm/mYehahB5BEv3k5I6Hnr710Ud4sq/Lj5+QO2K8+1fSr7Rpzcxk+QAc44OeccelGgXt3q8UbSRtEcYYkYHHTFdtTL4VI+2i9D4hcS1cPWWAqwakr/Naa3+f4HYS2BikeVR977wbtVMwxzFNjcjlh0J5/P8q6a1t0VNhOcn8f1qklvGdRE6/IByeOM/X2riWI0d+h7MsMotOnHR7rtqaA0eOK2BiUDpnPc1xerBIZvLHUH5T79f/wBdehS38hizjPp759TXE6jGxd0Ayo6+v61w4Jy5rzPrMzr0vZJUdGv8jkJ1H3oz8+08Yzz69qpMkBjDSEBxycd/r9K3J9Pie4DZypAyfer39h5LeW2Yznj26V7brxilc+XpUa1WUuVaf1qYvmxRW4jU5JOAef8AOK891+8ns9xgf524DDkDPtjFd1d6VOXSFX8sqc49h/8AW6VSbw6s7GSY7wvAx+HU966sHOnCXPJ3OLNI4jE0HRgrNaXXTufKciQjWFk15DmQ4LEc8cA4HWumn8LaLqNo0aLsVgNrd+B3P867L4l+HLP+xFuLdvJa1ywB/j556814lZeJL+0t/IZyyZ4GTX6dgqk8XSVag7NaWP5LziFLJMXPAZhBTTXMpWTbutb9d7/mVdS0ZdDuoxDlhj5sA4468mvStJ8Ftr1tHJYPtUruKjsT6+2e9cTb65d3MgZoN0eScdQSe56fjXq3hnxLcpcQ2EsRXcAuQD8o7HOOOeK2zStiY01yfEuv/AOHhPLstrYp/WL8krWVn+Zlt8OZ5rSOD7PtlAO/AAGexBJ6nFeUa/pM2iak1k/DIcZx6V9wahqWmmOOKNh5q5DknrxwQenGcV8kfEK6hu9dJikDls5A5wfTpXm8L5xiMRVcai01PpfFjgTL8swsauGl790vlb8+50B1P7N4bFjJLiQxfMM885H5/wAuK8S1K7lubw5+UIOMnPAru9G8Hare3gS6DQxKC25wQDjsODXM634Xv9Pv2jzvAPUd8/rX0eXxw9OpKEZJt6nwOe1cdicPTr1abjBe6vkdJ4U1T5Clz9w8ZPO72Of6V6dEsEEySLzlSDjk47Yz054FeKjS7ywtVmhJQDkZyCcdSPevTvCj3V9Cru5YDAYknPPbP+frXi5zh461YPQ/ROAs0qPlwNaL5tGmd5a2p1BSkrAqUA+Q5I7+tXp/Dkdzb+S3zL6Hkn8PWq0GnvbzJJbjCnBULx+H8z/njTnvZ4IHKEq2Ae+ePpiviajnzr2cj+gcPWoRoSWIp+9163RxniTwPbm185UA24JUdvXA+gr581TTZLG6MhGB1GBwO3evqd9X+025gd8kLtb3PQ8183eLtVja4ltLReAxDE98cf0r7DhitXcnTnqfhni1g8tUYYnDe63+aOdXVktQylvvKy5HBwc8dP61gSX8rAqpOCeff3qxaaRdag+23XeQeBnvXoFn4DvxDm/RkDYCso3AeuR2r7CrXw9B+89T8hw2FxmLilSi5Jdei+Z5LLIXUqgrOlungJ3DIPA+tfT2n/CPT54PNkmcscYHAHJwO1cp4y+G8Wj2IurVmKdyw/LmubD8RYSpUVKL1Z7+K4KzHC0Hia9P3Vq9U9DyLw/4U8S+L7tofDtnLeyKPuxLnFfeP7EFtqlp8Vr74e6yTY/uGnkGB5iyR9BnrxnoK779iKx03w/pc/iQIgZ2MQyAWZycZz2AGa98t/glear8cLf4keGjHYJbxne8X/LUseQ3Ucjg1/OXiv4p0aksfkGIioQUHyzevvrVK3rtuf6efRX+ivicPRyHxBy2rKpVlVTqUdEvYyvFtPe9ndp2utFuj63McUml/YtRlOyD5Q3UkA88+pFfnb8cNUbwz4vms3kMsRQPG3fa3avtnxZ4ps9BSVAfNKY3BunHUL9a/Mv9ojxHb+K/GD3liqqkUaIw52nA4+n+NfgXgJklWeYudSP7uSfpfQ/uD6cPE1LDcMKOGmvbxnGyvq1aV/Jpfoczfa6GjRw+4t0/H3ritci1G7tOQCrNuOeMZxj+WKzLW4YSLM5CKnb6VD4h8Qma1YROPcqfx/8A11/YNDCqE1Gmf5R4ytVqUHPEJ6rRd9DxPxDqcen6lL5WZXHyMCe5+n1rkH1KR4iCgG7qOo/WtjxOgafdDhi3IC8kkdSa85l1KWJ2DcY6j3r9QyyjDkT6n80cWTxU8TKMlaKbt89bX9CO8uHWU55APeqUc6oWc4560yW8Er5foarMoA3A8ete/DY8KFCyszQgia/uFtbdTJJKQqqOpJ7V6ZpPwxna2Fzq29HPIUduOh61yfw5urS28UwLcLvkcERH+63XJ/Dj8a+qvEt9aeHdN+16jIq7Rkgc5PpX5bx9xZicHVhhqGl9b9X6H9xfRZ8Ccoz/AAtbNc0fMoO3L9labvz/AAseNr4L0q3XGxmdsY5PGeOK6vSfDWqQOlnHZmIZA3YAyO2T/jXz14l+NIW4e3teEB+Q8VY0L46atpmZZJPOUDkPzkH+dfnmZ5hnNSnffydz+xeD/DfgLB4l+xgqcv5opXXfVr8j778LXWoeBbd7U3aQq7ZyCCRj3HavlT4qfGM+IfE0lvcyJKsTlNw6H3z05rzO7+NOvaxE2xwqMpAUkAAH0r5k8a+IZre4MicOTncPX1NeXkuRV62KeIxcVztdEfV8TcS5Zk+VRweUzlKlFv43frsrWXU9V8aeNrK0lJkIDKNxxzxjoe9fNXin4uavqchhtiI48FeBnd9c1yuuazeX7vNPIXdgOf0rzq4ZixB61+q5Tk9KlFOSuz+VuOOPMbjarhRlyQfbT0NG61Se5yWPXnNYk8p7NSFnK/NVKQgEYHNe7OZ+aUcMkxrPu471BvcH5uc0Hd6YqF92fmFY3PSjCxCxG808Suq8GjcgYAjIp4j3HBrPns9TpjSckrDo7+ZBhTiut0bxXc6bIpBJHTGfWuMaPaOPzpyROvLCtKWKcXdGGKyqFWLjKNz1vWPGEl/GiqxDY+ZsnkVw01+zE7uQDwetYEhlB45qzbRMzBWrSpi763OPB5HCklThE9M8O+JdQsSk8MzK3Q/T05r6s8NeIYvEOn7kO51+8B1r4lto5EOV/CvZPAGrzabeq5J+YfMAcZHcVhQzmdKXNuj0M48NcNm1BUWuWS2lbb/gPqvnufTiQNj5RwDUjQEMD0HQ1JY6hb3k4jhwAVyAOeR71qzCCVv3WMYAJHTOK+pweZ08RG9I/lbjDgrMcjrqlmELX2fRry/4JNp0enoJBMxMa85PWp7i/wBFNgbNQWYg5PT8R61mMhtSVYq4bp3qO+iit4Ubjcc80p0FKV22Z0c0lClaEFomndX3Zz11Dbqxktjhfesm7a3Ynyxg+9W7+QRg54GK5d7kbuOhPeu1U9Diw1Jz94tzxEpjI21iTQIDlxgev/1qnku0DHBP4VnPc4Ul+hHWnyHs4elJH//V+T9Htb5JElByCueDivS9E0zzgUul3ZweOtami6La3WnfZ4/lfAJ//X3q3bWFzaXOyMEgEAHPHHev0uti1K6WjPwrCYJwipbp6/edLaxf2dGkduhyxwMnoPrXcaDbSwbbm5bdIen9Px+tZunW1ldEC73fKM+nIrUlulkK+XlUJ4XPbPpXzWIbm2vvPr6ElSUbu3Yd4r1dI7I/aMO+3HA7jpXmVo8GpLJdKhUjGQPQV6Bf6BNqsp80k8fd9u1ckljNol1Lp8xKrJ9w+noKvByhGHLF6nRjearJTqLRaXOB8XSwwQK6tjoCPpXzbrdvb60txKPvA/5NeueOtUW3aW2dcr0HPNeUhVlhkniypPDc9/U19vlsHCHMfnmbqFSap73PnnU7OK1uXXvkjiuSuXjSYRjhs/Wu48TKi6izK3AJ6+tcJNFJNcLcIvUj+fFfUYafNZHwOcUY0oybVz0vRLqRYPL7nj617F4asLWfy0ChgTz/AFzXk/hawnvnAuRjHB28DNey6FbvDuW1H3P5d6zr1LXSPNWDjNKp3/4c+g/DUTT3McUJ2rkAAc9DX0FpEa2skDKeT1K9R9eP614j4CaxhkS4zukC859TiveLSWGa5CAbC3P0PbrXwebTbly9D7vJ8LaKqX17fceiwX7FS0ZOe5PX8Peum0PUJoJPOtydp+9XBPeywkQIMk9f8+9dZoDSOmHzjPT2r47EULQd1ofZ0cTzyjyvU9k0vUE1IhZBknoR/n8q9L022CxbSOp5HTjFeU+HrFjKGjGAcY69vSvaLdbiCPDDHbJr89zqSi+SB+g5KpTXtJGZq8aBAFPBFea61oqTxeYgHrjrxXpV9JHIDF/GCD061yrQiRjGCRntRllWUErM1zVRk7JXPBb3TVWUso+vH4VqaU2xDbupwep/yK9JvtAhkAlIAPfH881y32GO2nJQ5J6dxmvsKWOVSNj4Wtg3CfNsTmBE+dlyM81HcwQocjkd/SrsLgwsxGaoPckp5PGD0OO4pwi7nFWrpw1ZSndLU+YTkADpz/8AqqrDdpIwEoznvmnT27+RweV6j0Fcv57w3GATg857A16uHpKR83jcTJO/Q6V7iCMEQrnOSeawrk+axVwCR+vp3pz3cbIFYjJGfaiFoxEI3Hzg4DfWuqFJJHnxxVVTSk/dM1YxGw29B2x3PrV+CFVbcV7dMZ/KpHthuXbwRjgHqO9OgOJCD+noO1dE1dXOGlj71HF9zobBIwQU49a6K1dChAXrnr71zEUDbS0Zz3+ma2tPkk2KH47HHSvLrU731PZw+PcGlYuvapOwiKdOfXntVa50ry1Dgfe6/QV19nCZBlRux3PatybToZoeBg+1ePUxrhKx9Fh8F7anqjwCWzuvtTJtx6Vm3lhcyIXlHJxz3+lezXekxE7ioJPH+etYVxpCIpcA89fr616lHM72Zw4nKW1KzueGRRz21wY26nsenpxXS2urXEcTRbeTxnGceta2qWZGdq9O556VDp1n52GxsBOPfNe99ajOPM0fC1cvlCfsk9TpdFuYWKrORvwMVtz26pOXXO3FYUFgWYLbgbsfT9a2hHLGjRS7jngHsa8us435kzvweHqRjytaIntp5Fck8g9D/kfzrstMvVATjg8n864u3jlhYhhlWH4fnWnZ3RjZYnGMc15+JpKatY9nB1XFqVz0n5LhN8IJf07/AFqulvISY5Ac5zx1IqDTJgE2Iev4V1EEQmIOM4HX1r52q+TQ+woctSalJnJSJJbS/u146YrTsbqQSLE33a0r2zYxmQKP/r1y1xujcKOuOuD+f41pTlzqxhjIqGx3e0f6xSMDp9ax7yIPFuUY6ms/Tb50UecTgnvV7VJI/LBiP3jgD2rNUnGdifbc9Pnl9xziTSEHP+feq97+8g+bqTwexFSXZaALv6dcj+tVDdLcRhGGT2r0qcXfmRwVptpxluUbWeQSYPrwRXaac8rRhGGMcCuUt2NpPiXBXHbtXXWzGTbGfTqPaoxrv0N8p5bu+jNe1jmyVIwpyc1fXTFnyVA4HftU1uwClScHH6VfUvGMAfhivnKtSXQ+yoezXxHAXMRjmZHHArMu4pZYTGgwD3HT2r0ufT3lbeFAY8ZrEn0vyyBt46V2UcXFNXOKrQnKL7HiWoaf5MjrN2/n61xE9tGhfauAOo7V7JrdlhSW5zxmuCu7BhcfKoIJxX1+Bxd4HwWaZcva++royNMgCAjt34/z1q7aKBdcDAPXpnH41ZMDWrbMhi3P4f4VNaKC+9ccDqe2a65173fc8yll1tErNGudJWQ73HJ9qjbThGSjrjB5z0rpbGdWh2k5xwOatyIkq7owMnIBH615DxM07M9p4Om1fr5nFz2aQRl8ED2P4VqQzN9mBRM8D3OPcc1LJAHI8wZUk8dTmp4rUxsBj3rq59NTycRS5m+XRW/Ex7y3cQnafmIz1/SsiK13L+8wDkH8v513t1aGWNWGPwqg9iQc4APrj/PrUwxdkU8r1Xoc8bI5ESgEn8+lYt7a/Y2a4Q9QeODXcSxtBGQOGFcneiWTCye+Qe9dmEqtvyPFzLCwjHlS139DBs7hm+ZiNv68jpW5aJDMAzAZ7HPb3rBlhKzbo1IBOfpVqOYxQj1BJIB/OvRrU+bVHh4PFNS/eLRGuZjGWDNu5x/SrtlI4lQRgEdBn0rl5GVpWLnIYcAH9K1bK8EW0ITnPJrjrUXy6Hs4DFpy1dkd9JpVrfWxyACORXOGUW7m2fqn862rDV4lUxykZPdq4TX9atbLUizNkSDJPYdq58uw1ScnT3J4mx1CjD2zsr7nZ2uoGJi3ZvesXVbgXMxUkqT3FY1nrdrPAH353ZzxjIrW+yLe2rFPlfrjqefrXesKqcryVj5j+0PrEEqcr+RlXFij2wlDZHXFcve6fCk4k2jceTn9K0Ly+ltSEBOd3RuOM8//AFqpXuo28Fs89xJwfujOCT26+pr2MNh5p3XU+TxucUEmno11MSfSopCWlwCT0AHUcdK5i+tLko5jiyo9cdByMfStGw1W5vJjMMKjd+2e5HvW5E8VzDJGOUccmvbvOi/ePho+wxy5qel7/M+b/EWo3dg0ksKMgJz8p49+PXn6VzOoa/d+JIlsY4DuBzg4ycA9M/y619TyaHpcrBSg3cHIAzyawD4N01bkShBkcnHvjk+n9a+pwnEeHilzQ95bM/HOIfCzM6tSUaddeznuref/AAex4FBd3lmqabG/zY5wOuMfLnoB6/Wuq/s8PCYXK4wPl6fXg4r1m58Aw3lurCPDrllxwc9ulYlrpT20jWsy4ZSRkA4PpiqqZ7Sqrmp6NbmOX+HuKwk/Y4z3otWi+ytscTaaFFbzhM79oJAGBjHI6DpXqOjk3mB5edpx+Pc5/nUtj4eto5lukOWAxzyAT3FdZY2aWs2FAJ4ye9eLmGZxqR7s+24e4XnharlFWi3tvp01LqWLy24wMEAH8MVcfSLVgULknjPOea2CVeLKHAAxiooLfYXZSccHr/L8a+OeIle9z9shgYuKhy3T3Obm0eBAz3SjPOMHBJ5wa5Nbw2koRuVHBx0HNd3dWlz5bSO2FPHNeaTW0xu3kjwU7gdjnqff2r3svkpp87PzziSFShOPsYWbOmjv0XDw5GOmOOPX2rqbXWUAT5c+o4xj/PNeXW8kxmbqyqeCeP54zVoS30TiM/ICcqQOp96rEZdGehllvEM6K5rb6HsscllL+9Q9eoB7Un72KcPEdoPXv/npXBaVPcKfNuThWxwCR+Oa72z2y2+5GIJ//XxXzmMw/s3a5+l5RipYpXWj3/r1I7zTjfQSW1wCVkBGfr2zXG6fpT6VfeRGT5YBXaTnpXqkOwfNOcA/0rldSUi6zF07dPSlgMdNXp9GZcS8PUqqjXkvejt3t29CWFZpphtG3HGADzV680u6VVuxyCASB/WjS5wzbWIBA/P6V1kXnXZUKuFxg8VGJxMos5sBksZRfW/bocPJbXj4j2BT7j0Paql/osxUyKCcgAn09+pr057aFWBl5PA21WuQhi2hQFPr+Vcccyelke7U4ah7zm7s8MvrFbeMYG48fiQeuf1psV4sEJ81uFOevvzgV3OpWytBsReQc968o8RrJptmZ0O07gBz15OTivpsBJYi0Hvc/POIKdTLoOvFaKN2X7m7tVkeaQYycjkd/c1zWpeKLLRLaSZ3AwN3rz6YrlLrxTI0QgMZdm6fU9O1ctBp17rs8lxfOd/3VjbgDjGce38q+tw2SRSvX2R+P4/xAqy/dYGN6j202667HE6xquq+OQVvCUSIksw6HPTC5HSuV0/wZq95IYlQhuVXIwOuOfSvpDw9odlp0BF4vmcAfNyPcj0rXjtbOOQtAdyHBXAyMn/P/wCuvflxGqKlSw8bJbHwlDw0ljKlPFZrV5py372/4Y8g0D4farYyh8o7JgqCp6/nXX3SIbhYmjEUqdDjGMDt1+ler2umtCBcxsPLY8j361xfid4I74IxTOME46n0P/16+ejnNTE1ve1P12pwRhMswShQVldXvrftY881vWp7FhESSJGCev3u+R9K8ZtbeWHUje3XJifdgg8kH0r27WYrG7tikLbZBluOOQOMZ/KvKVjl08LeXrCRslQp9uOvv6V9rkk0qbUVqz+fvEmhN4mEqkrxWqfRbb/ge1fbTqWlQ3ECAnHyjHPPUn0x6VzOsW2k6fK1tqG1gMMcg9x2x79e1efReLLuM4icIi/Ls4J568mua8QeJbu/kMs3zYzgnk1eEyCoqlr2RyZv4iUKtFOEeapotdtN/v8A0PoLQ9O8MaiRcQyrJtXG3khc8jI+tSXEvhrQrkpEVQyMSxPqOo/Adq+PIfE+oWszR2sjJu44OM+1Mu/Ed/eyZuJGdj3JzXU+D6jqNyqPl7Hp4XxPdHCxhTwkVUWvN0+XXbzPorV/iFbWO1bMmVevB6e+CPyrGt/ig0yGK5t8k8KQeMEV4R9oebO44rSjvcAIoxjB55r0I8NYaMbON2fJ4nxFzeVX2iqWXayt+R7ZqHijT/sslxH8rspG0Nkj3HpzXm1paSanI7w8sfmPpn3rHDqcq/Oef6VqaTqR0yYuAcMMYPT8q0o5f7CD9lueHjuIZY+tGWK0S7fmeq+A9DislkuLxhhuw6c88H8K9ysLOXVrKSTTojKLcfM6LkKDwMkDueM18uWHi2WxvYpJARAXUyBTyUB5Az3xX7f/AAl8EeB9J8JWNloNgJ2v4UkZpW3ebuXcu/Hb0z0r8I8Y+Mf7ApwxVeDk5vS1kklvd+h/fH0M/COHHtWtl+BqqlCglz3u5Nzvycq66rXa3qz4r8EfDHxT4gjOoXNtJbWKICszxnDFuBj19ucV4l+07pHiXwBBBo3iCyZIromSGXsVGM9OM/Wv3qgs4f7HTT7yJFiChREgwox2Fch43+HvhLx/oT6D4it0lg4wzKCwA7AkHiv5CyL6XSoZxGvjMMnRTtaLu0ujT6u+6tZ9D/T7jb9mthMfwpVyzLMdKOJklaclo3fWMo30i1omndbu+x+Fv7NviCWTwvNptrMFP2lwyM2Ml8bTx27c+9faHwx8SeKbDVJLS7nQW7xusbIfbnAyefevIfjP4I8K/s9+IH1y2hhXSb1/nEAyQ+flXPbAHTiudu9S+zeLINU0+4a2tI4oykQOdzSYOc5zjFf0Nnyw3EVOWPwsf3dZNptX1Vrr1v8AgfivhzTxvAVLD5DmNXmr4SUYSjCVlyS5uWVmvgaTfe6089/9oL4x6X4bvRYW12XZOi/xk4/D1r481rxI+uXUV7YsG87BcA5ODnqOxrnfjGur+N/iXqM+mxmRIWCde+M8V2Pw28B6lpeive65GyPI3yKecL6496/UckybLsiyijNyXtGldaXbl5fifyvxVxHxL4g8ZYzB0aT+qxlK0kpcqVN2vd6a2tYjuA7RkKgD46E+o/X8682vrK5WWaAqTnBPP617/d+HpriRVHy54yc49qxNZ0ZLeEqFOVGT/wDXrPB8UUqclBbs+6zfwTxWNpyrydlTW/fTY+Z9Qje03XNuoZmGMHI9sZ7V5rqOk6jeXJMULO3fHSvoO/so4I5HHGeuD1pNK0+OBzIcqcHOSM47f/XxX32Czj2cXWSufzxxHwTOvXjlt+VWvptfv6s+Vrq1ureTy5k2nrz6VraRoesa9eJo+gW0l5cuMiKJdzEDqcD0r6LvtA0md21K9jyBwfc+uPavYvhd8dvhD8HNOnk0/SxNq7xFWuNgyfYnGcV4nE/ipUwWGlLA4d1auyinZX7t9j9O8NPoY1M4x1N5vj44bC7ubXvNdoLZy9dF+B8fT6Hd/DxftWsr5d4R86twY/8AZ+vrXjvj74s3V+BZXVwWU5xg8DtXcfG74qXHjfWLvWrmNYVnYnanTknFfA+s6mGupJOTuJriybDV8wtjcxX7zt0XkvQ/Z+Lc0y/hWj/q5w4/3Hd/FK28pd3J/wDAsep6trFlKNsLhmPORWJb69JcK1vGx+Q15TFqUwOzJxWtYXzWwZeu6vq3gEoNbn5LHiqpOtGUtF1sdzJrs1sNgkKkZxzisC81gX7lGPKnua5qeaVpC0zZx61jtcjzMjgVVLBxWvUjF57Vm+SXw9jWvFl37geO4rCvNrzfIPT86uPcySx59Kr/AGcv82eeta3a1Z5s1Gb5aa31Mh9/APSmmAMp9a0ZotpG/oKoysY3O3kVE6l1ob0qCpyfOVo0RX2PUTwKzBVOafHHul355qcwFG+vSsKlSzPTweF50tOpRWCLdzzVpLf7S2E4A4qWOFclQM1vWtsFj+QYrjq17H0WDyvnfkc99hwpB61ct7V5IiMdDit17QOcnrWgLYRw5A5rnlitLHsYfI/ecraHP22nA8uM1pR6ZnGF5BrYgjAxuGcd614Xs2+WTqfSuSeMep9BhchiopIwYtPaVhjgDrXZaJZPHKGA5H4Vs6XpVrLGXUgt1FbVpYGKTK8844615dfF6bn2mV5BaSbW52nhqWQ3odc4BH5V6awMUjAn+Injjg81g+FdNjdBJjnOa6zXofst0GAxuUE49f8A9VfRcA45zxE6fdfkfiH0wOFI08lwuLT96Mrb7qSey6vRfK5QlmTYqsenUDrVO5njIPsPrzVJ7pc4bis17lrslIOg71+rOif5/wBKhK1jPvp5ZVZVGRXJOszSYfKjOK7/AOwmKPcx59O1Yd7Z9xkmg97A4qC91GRBGsa7uue5qveSIV2BQPSp2UAFWyG6Vz92X3ht23BxUs9jDw5pXbP/1uK8PTRz2owORw3rXQBlhxtOUHJz6j0rgNF1wwQedtCkjkdzWLrvj1LXdHMNoBwFHFfdewlUqNRPyim44ejHmeltz27TorfUGTyWIDfe9ea9PsfDGmi186VuQAMNz9K8e+Fmv6VfFJLk7EPG4/4V7xqOoWVowFscxuMD1yPSvyjjHjFYLEfVY7n9J+F3gxVzjAxx+I+F/J+T1KEAstKnfceCAe2D3Fat1oGka5Ek8YTzG4+b/P40kfhp9fh3WLeW+c/N0I64rwrxV4u1Hw/q62Uc21IgV46da24czelmqbws/fW6/ruebx1wViOHqqji6V6Mtn38vVHkvxo8C/2XcyPYSBoy3XH+PvXzNcPe2ttJFIhXIxn6V734z8eX3iW9/smZAu04JHcev41xOt2lq0BnB3lQR+nSv23K5VqdFRxGrP5mz76tWxT+p6JfmfLuuQFVLXHTtXMWwJuEckAA4x14/Gum8Y3/AJ5ZIF2hDjH0rzGB5nBZsjnNfTUZ3sz4vH0EouD10PftAuSgCwAcnPpXsfhu5tLFH+18EjqPUmvmvw7dXTBTH1Ucg8V6zot5JNGHdsN1rSrSckfMzrqGi6bH054bs7tTG9mRlhuB9vSvdvDi3UUoNx8zHn3r5/8ABeoSXccUynG0gY9R3r6b0tI3VJlUhsDkDP1r4zOJOLsfXZBTdSHNdnTmQSKodRyQTx0/Suu8PXKAhGGce/vXJpazIwAOFPTH61nzTzWUoFuSK+WlSVVOKZ9PGrUoP2kj668HyR3d/FaBggB3Ek4wPrXvirps8PlwkHsrHmvgzw34tCOnntsKgBufvE+le+WHjOMWaW8Jz33Dn8OtfmnEXD9aVRSR+m8O8RUfYNSsdv4h0z7NdiSB+MZ4rnYreZpMHGRj866fT9Tg1ZVhnPzY5bt9KvyGxiYhAOnXHWvHpYidNKnNXaPaxGEhO9aDsmYBsf3LCXBwCK86u7Mby3XaSMV6Dd6khfyogc8j6CvPJbpzc+W2cMevpX0GVqerZ8vnCgrOJk/ZZ0ZpX44P5fSs2MDzArfMN317V2VzbBrblsAjP/1jXMRFRNh+xxX0NCvdNnyuJwuy7jbnCKTIvbrXnurwyK7yqev613etymGFVAwHyM159ezSyS5kJIHH0xXr5c38R4GZU4t8kehz8VxIJNsn3VPH1rrLd0+WXbyDz6GuIkk+ZnmODn9e3FbMd2z7UnOD3HrXuTpXWh8u8Ra7Z100kUObjbu+XGPfrVEXbGMYOGbv171QilaYspOAMgZqvHE0L7Tk57jt79qiMPsvc8+pe/tILRnXW092z7MgcV1GmPMCY51DdMGua0raZQWb5fWuxsWRCAoBDd/avIxlXdWPpcvwaaTUjas7iSFxGoO08nH8q6uO5Mv7sYweufeuesoheP5cYxWzFpdzG2WOAeB/9evCxPs2/e0Z7uGdeMZKm9CSYQ+SQx5HWq7wQzxFW6gZ/wA9qdL5gby5OMdSKiUyIdjjt+IrBUuqZ20sbrqcRf6blNxX156fSsJLRi2VGxR2Nd9qWpQRqYuGz+ma5jdGrfeHv617VCc+XVHh4nklUXUitVeNwBlfU1vvCr439OME+tZ+6MSpsxuK5FXoWSRii87TyeKzrNvU7MMoK8dzcsdPguYwjZA9vaobzSfIk3joCRz1/StDSpktpB7deldmEgmiwxBB9fevHqY2dOfke1/Z1CpDl2djibRZYsEcc4I9PyrudHvYz83UAYqGa2hVNqjOP8/hVCxHk5Qr37e/vWNWoqsWxUsN9XqJXPQI0iu1IzjPr71zeoaOiElcMD2q1pt2wZt2CBwfyrduFWaH5R7cV5nvU5WWx1qcakL9Tye7gkiA5+7jpWjbxme3BfOcg8+tdJJpyySbnxTIdOMICKM9a9GWLTjbqcccH790cnrNjuiViQFANcYCFfY2dpOc17JfWXm22wqOATzXmV5YyPOyYAIHYV2YHFprlZGPwOvOtzPlPzK3PFdDpd5klQcAmorTSzOcXGM45Aq1HYSWlwCnQGtZ1ISXKc8KM4zUkjvrT5odoznGc+1bMUZkOGP3fWuPsL2dj5XAx0/CuvspUkj3yfKx4r5zFU3G7PqcJWU5WLJjIJA5yKp3Bil/dyDnGRUN3cyQthnIGfwqGU+YPtUPzN7VzQpa3Z3yqJRdjmtV0gzHO3jH48VgHRk5hbjHOQK9B887Ap4L9jRPGs0LMvpgV6UMVKCseTKhGcuZHjWsWEYkDheDgcVkQ2iwguO3Yc12N1GUYoeQOvFZMkEYfc3GB+FfQUa7sonzOIpe857BBGdoQHtV233AHeflHastJ+Ts5PapIr4CdUl6flXQ6badzx6k0pqzNN4xgOBnPJ9eKPkEQkU8dMetIjfMWXIU8/hViOEKpDAEnn8azbtuS3Jr3S3FEzAEdT39qsXFi0a5IznnJ/pWhZ6VO/VwAo4/zitOW1nhO2XkH05rgeIV7Jno+waheSscJc2zLJ04NZd3axMBIRk9/rXZ6hCnDqufQ1yd6xj/AHg6dcH+td+Gk3Y8XHOKTizlb+xSaUKi4Hr6k1z0tjIFZgTj+7+vWu33pPITKcLjPvzUN3biddsQIA9B/nvXsUcRKNkzwa2Bpypt9eh56m9ZGjl45JA6/jWtEyokZxktxgVefRnkHmEN+H+cVELG8tSzsmce2Rg/Su11oz2PGjhJ0dWrruVpmlhl3Y4Jxx2yOO1cr4hsLW+spJ5smUABQDwSPb6+ldlL58kXlxJlx785/TtWdJp5uFxOMDnnjH5CurCVXTalezR4meYP60nSkrxff+uh47oOoahDsW9dtyngEYxz3x9a9X0/XXE6wjIIOM9/SuTvbKC2nAPDjv0xn1NW5M26mWD52T+EYJJ/l15+le7jOSvK9tz8/wAnhUy+hKDnfl67ux3msWFxegyRgcjI4OM14pfWuoyX7nUiSIcAA8L17D3r2/TdQur+3Qv+7IAOG7cVz/2Y32pESgHB554rnyvGSo80ZdDDi3J6WPVOrSbXM/k/VHNDT4VbJJUY+bHqasyQS2cQWHIDYIOOtdt/Z8YkZScuegAz9KR9LIyrLnb90/yrnqZhd6n0GHyNU6bcTmLWK2cFm4buT71oQkSzbV5Hcf1qheWE9qpdPlXOSBg0/Sbe5lfzI8MAQOmP8inJJxcrihWmpqKgd3Z6e1xb74lJ6fKetc7qnhjMXmFMSqfl+n4d67XR7g2yL5nG3AP/AOuujuZLW+TyVGGHUV4H1ypSqabH1sstw+Jw/NN62tY8JtLSWGPddDa4ycH9OtatlpTPIl0xJOcgdulbep2ci3pQLlcA/XNdNp9vClsmcDaPpXq4nHNQ5l1PlMuyeDrey3Ue/Vp7nKzL5KKwDAt+FVL6SSGPCjK5xgV0d3JAJxGSM+nvWXNA16HXHAbGM4PFctGpdpyR7eNw7cZQpvUxYLiSeHEvO3GD34qheQiSM7RjceoA/wAiujs9NMEfmnJ7EH9K0k08Y3SjG36d/wCldM8VGLujy8LllStFRnucIbJoRuGcN14z0qKONj94d+Pf869FOnJJB5XfqB9DSR6RGsUYkUHaMZxxims0VtTOpwzJ1bWtH+v+HPPJEdVVnBwQAOtddpSyxqgjBK7QK6kaXAY/IkG4Ef5+lWY9OtIlEcYwQM8ZH4f/AK65K+YxnHlsexhshqYet7SDT0I0jeTaJlAGO3aoZdIVmBX8a6KN4UjVOv8AMGtmyWweMsTkn2rxvbShqkfTTpU6skpSWqPOk05IkwoAz7YrprTUXAFvGMYGeBz+NJq95EP9QMYGOn61T06UxzBumeM/411zvOnzSR89RqRo13SpSOwhsnZfMf5vX2rC1SIW7EIOn5GuhFxLJHsBGSOKwdWDRoCRlh+NeTRi+a7PrsTiaXLZLbqcfPcr5rZ7cHNcnf6JFqlu9vOAVC8Djn1Ga60eXNIQTt7YpkmRHshwT6jtXuYes6TvHRnyma0aWJpctVXTuvvPn298KWujItywJSPJHOcZPPpkCljt9Llt/tUmEOSFweOeg9a9T1TQjqIHmcKeWz0xXNr4QjDOJFxk5HpnsRX2VLOlOH7yWp+L1+CJ0a3JhaScHtfvb/hjz+/trsWgWxADtgDJ4AHHboRUumPFa5huVwUbBJwcdxj3rs7rTBaLtjfEoAGOvSq/9jQaguLkAkYJIODntXX9fg4WlscH+rdeFfnh8SVrPb/hznrnWprS0YwvwO7D078g9q+e/EviER6mZQxkVuuOm76d+2O9fXNtoGkwwrZly6bcYbk/meteM+MPAOktuuViy5yCwJUnnhsdK9bh3MMLGs1KO58r4m5BnVTBRqUJr3dWr7em55ZI1xrNklzaMrbs7g3Bx7ntXK699raGCCdCDg44zx9f14rW0i4bSNS+yyozoW2kk4+Xk+v413uoTaVDJDeXh8tmTdnOT09OnTj8q+4VV4eooqN1uj+fZ4OOaYWdadTlkrKV9umv9M+aZ4LlGIPBNdTovg288TQBbRcvnB5x75rpfEt1odxZsLaIGTClXHB98+tcrpXinUNGQjT3CN645r6J4itVpXpK0vM/P1hsLQxahiJOVPq4b/5focTqXg+Ww1B4ZtwIOMEY6Vbh8LTyp/oyFhnBbBwD9a64a3c35kmulEkkrbixHIJ6/nmvXPCvhu61HT0fydsZHLEnJzyQPw61GY5tPD01Kpuevw5lM80xf1ehJtK721t0vuj53h8Lzn5mJx0PqOO4qTU9MgsMKv3sc5+vpX2ZD4R0jyQm3bKnOT2H4+9fO3xOgtY7lJbUdVOTyOc15OV8SrE1/ZpH13FvhxWyzBfWqtRPb87P7jy2O4UoM8Gqd3NIMeX3pYILmdsQITk4HFI8dyGFfWRaufmEaSi7s6T4f6JL4w8aaX4UllMC31wkLPx8oY8kA8Zx0r+lr4VeDU8J+E7LTYR+6t7aKGNmwXYKoyzEADn0FfzkfCXw3p/iT4h6RpOr3L2NvNcJ5lxGdrRAc7ge2COtf05+GZdG/wCEetrfR5ftMEcYjWQHO7aMZJ9fWv8ANb9ohxLiMPgcLhaEnaSd0lotd+bu7Wt036n+7n7HThzCywubZs6SVRThBT5tWlG7jydEm783Vu3QdfNvG3vXI+IUu10eXyG8sgctz0/CutuIwXJByKrwwnBOeM9D0r/KDIvEJ4XEwdZcyjbQ/wB0alNToOmna6PgXV/AK+Ndfs7LUNOW/tYZDJKCCQwzn5lPHTP16V5x8WP2dtevfGT+KdM3wRuiqkGPlG0YHHQADH0r9SCywDeFAPsMVy+vSw3ibWG7IxX9a5B9LTEUcRT+q0+VJONm77u7023P54z36L+SZ3CdPH+85SjPmSs7xTUdVrZXejbWr0Pye0z4PWFteedf2yh8kuQereuf6Vv6v4atYoTCFAVeP8+lfWPi+xtbQOYFCnr71826lcF5pFuSETJPPFf0Jw74g4zPqqxM2+VdL/kfF5x4UZRwrgJYPDU0nPd2Sv6ngGsS29td/Z5E+Q9CK8v8TzRRRyGTq/Gfauu8Z36t4iMVsuEHT0P+cV5r4quUmYbiM98c4r+lKeDVKnTqvdo/ivJM9ePxOJwrfuqVr9NDxfVr2VJDAFBGe9XoZRLBHK7Yfng8ZA9OKmt9EOq3TvMzKmeSO/OfWuL8byrpkpVXKOgwB/hX0VHP3BqhDWRx5h4T4bG82Or2jTi+lru3n2NLxj4ntLTRXtoHAk6Y7ivly91F5pnZzxyTW9q2qmW3eS4kJf1PU14trGvFRJGnBx96vXynL370nu3dni8V5/SpRp0IaQgrRX9dTC8XXr3eUDnah9fQ14pf2qmQla7681COUNtIBauBv5GKs6degr73CNxXIfzbndKFao8Q1ds5ubZbP8wz/hVX+0pCx7Y7ipL6QOgY9awWYqSK9eL6nx9WOrituhsTXErnlunFZbzMGJ6U1ZcZ3dqikYM2RVymYU6ZcS5KnngGr8VyFUgmueEjMxwelWFlFZT1OqnJw2L08rSvjsRioxCxOT0ApIgJGy1WbjdGny59q5qs7PlR6eEpc6dWoZqnD7KtxRySfe6ipY7cSplxz2q5FGVUj9a4sRUPosqwe19ugQ27KxIrYgUqAGPWoIIyoOeanZyMN1xXlVp3dj73LcIoR5rGjAiEHPetIQZiyozniqdmSy8jk1sxM0fykdetefUmz6zD4eEkmtjBdZEGxe/FWbWF5GAPH1rXj08unnEcVq2+mrgNXHVxNj6DAZQpNaF/R7aSLDMTXsWl6S1zGknljkYz3NefaXA23afzr3bw5buLSNH+UDkGvDxdZuL1P03KMujTkko3O68JeG40kWV8+WpAYAdT2wa1vGmnoYfOVcqhIBOM8YxXUaBcQQWCiMMxH3uP5GuJ+IWspPZrbWxGVO5j0I4xj881+n8CZcqcY1KfXdn+d/0seL6+OzSpl2IfLGnbkj6218/0PAdVlIlPljvjFXrGRo7cbVAyOcVSkGZA+c85z71ZF4Nwir9YktD+Vpq8FFIke4JbYTWdc3IGT1xV10aQF1GPUmqZsxKxM3bpismkOkorVnMTTuH3H+dYV4nmdBnPau7utNiPJxxXNXEaQZOfasbH0OCxUW7xP//X8EtrSM2cijr04JrgdW8P3d3ekE5J6+5rv9JuoZrEbQQ/Hy+/TNYjNeJqqXGxiobIyfQ/yr2P9YpUabcHdn0T8M6WMxX75NQurJH0V8DfCMMGmSS6i20Rg4Pv+tdzNPK/iiGxB3QEZ+lcj4X1aGHQpPN/duPmIB9araPq88+upes2Y1P146fyr+X87lXxmMr4uq++h/ePC2Dw+W5dQwOHWit/TPqe0tDamO4hJ2seR7e1fLvx902/srr+0lhyswAVwOASTx9cV9Z+HL2y1G3hiDbdx+QH+uelcr8fdAtLbwr9qu5AAp34xngdTXxfhtxlUy3O6dNq7k7fI9vxa4EoZzkNWDdrK6emj76n5YrfLHqb7wAfU81Lqt5H9mfc2EIPT3rz7Vr1LvXprfT3JiMh2vjGQD/hXS3VtJPpjBzltoB75r/R2nJSjGUup/ifjMH7LEVIU3ezevex4nr8Vo8jqqcMc5/nXPxaPD8qQr1PFdrr9h9kVjHgknr9PSuZUTmQGFeV6/n616lP+6eZXvZ83VF+wt3s5xbRxnL16VpuhS27fODuZcj29q5rw+JJNXR5yBnGM/5zX0/oul2LRRSy/OwbnHTHrRXxTpK54n1JV5OB0Xw00pkjjEynaWBGcGvrmysJJFUQqBnqBXhnhazaK9WSKIiMYOOgyK+j/DqMQqyKQzcjNfn2eYpynzH3vDmXwp03H5XFjDQjZKh3enuani0j7WnmDjH+NbEtoRcGcDK5HBrdt4ViXaMjuR6mvmZYtpXifRwy6LvzPQ4KXQyqBYxhmbnHHNdFZ3P9jQCGUEv37YreEUakSyL83X86y9YiS+ZVx0xg+opLEup7stgrYCFOPNBa9Ds/D/isIuxmG3/PFdu+sJKiyLu+bp6YrxO005Y4j5fT9a7TSroLALeYFjwM15ONwFO/PA7Mux9ZPklsdrHe7pmmBJI7dOlZE6JcxNNBywbOB60Rp5MWFG/PeuavtYSzkPl/KQDxWOGo3l7g8wmoxvU2ZrW+pKFa2IwT6+tX301EHnggq4yPavOG1CO+tPMZ9kpyfQZ7f5xWroviySzj8u8+dQM+pr1a2DnvDc+fw+LgmvabP8Dr9R0lZ7MsPmaPnn6c15Hd2xZmVhgZPbI4r2G01iC6g3IwAccjpXP6roiM/mWygbuo4qcBiJU3yzN8yw9OXv0jwm6tybjC9/Xj9KoyXslu2yEg/XjnpXfatph52DlehGf5Vw9xp7m4L7Q2M4yK+0wmIjJan5xmGAmpPkNOzuiVKSnA9T2zXd2DwhDlcngZ/rXndlE5f98pJPT1z+NdxYiZU+Xof61jjUmcmWqak9NDsYYY1UNEAFP61sIg2ZjPGeeKxLcyRxrKTy3+fpVpHnkcpGuQea8KdPm6n1FLFxpW5lueg6ayxplcAjv/APW710MN0fKKyMB3/wD1V59pl986wXC7SO3r71szTAtjPJGOOma8TEYVuWp9FSxUHFOB1VpJaSuXZsgDke1aN3Bp8tozQ4LYrh4pzCgDdfXvirUWosUEUfQ8VlPDSeqY6WIpLaO5yl9bpJKxfrk8isErulZFzgcZHWut1O2LFpEOAfT1rNh09ZiJDXt0sQlG7Pn6mAfO1EySlyCHH8J646Vt6eZXRpGHHXH+e1a8NoAMA49qmmh2xZiPQZIrCri0/dsd+EyqUP3lzOhvd037k4H+e9dzp8hkbbnI65rgool8wmIYJ56dM12mn74NpAOCfSuTGU01odFCvKMlznRPIQoC/h7UkdojHJHbBq5DGspCnHU8/wCNbVrYKGwDxwMV4FWvyKx9RSwXt3cybWyKZfJ2+orXEpPyjjHStMWcaJ169vSqVxEgIYg4Fcn1zneppPJeT3olORW3huc8VPDhmw3Qc/U1C0vykxckYx6/SmRXIZyGHzD9a6EnJHBfkd2bRWFUDnv3NZl5otuw+0KvOcHHerMafaX3A59Bmrlq88qm36459f1rmXNHZnfGak7tehy8+m+Sg2Kc9j6GqxtXK4YDJ7enrXaXVq6AsRgAHIrn920En5h2xXVQruSsFWlyNM5Qq9tPgjCjkn2q5PqMEVrnPH8qm1W3UxDOSCcf5xXDXg8t9vODz6D2zXq0KaqJXPDxM5U3odCNWWeMhwSRgA+9b2k3UwTymGQeua4W0OY9jrgce+DXa2cLywjax3Dn65qMTSilY3wuJlKzRrXMahgV5z3xVS5mEKbR94+hq0IpGt9/8Q9TVC4TA8wj5h9PeuWnFaJmtSbcvdOX1SDL5Ixzn/H/ACa5ptjOFDfifX/PtXW6gjNA5AyBzn1Febz3TROxxg5r3cFG8bI+ZzKq/ae8i+gxMd3r/SgwLMm6EBdp75Jqglwyr5hb09z+Nbtv8xCA4yMmu+TcTynFVHb+tR9sGPyZIx6fzrejCGTB4GOoqlDZBjuA4HUfjW4sDKoZRzj0rzq9VNndSwjV1e7NbTpXVBk5NXmmPmmInjHfmsi2l2v5YwMf14pL5mjdXI4IHB6+1cHs7yO+pViqVuxJf2qOmYzkAdK4G93EkYOD7c/zrvjIogLA9KxrmBXKyYycYH9a7cNUcdzzMVQjPU4lLcIQ3OWxnIq8lqMFYCMfmfp9K2fs8aJuP3m79s1RuVeMeZEcZPUf/Wr0PauT0PMVCnFXkMtEjaNopF+gFTPYGUk4AwOPy4pYmWOT94Cvf/Cp7jVIolKYP1z+FQ3Ny90n93GnyzdrHPzaSIrhpjj5hz9azL+Ly4dycZznjpXRSSSyRtN/drndW/fxgB9pXkgDn8Oa9TDzba5j5fH4d3kqXqchf2VhHHgruLZ5IyfWuXuV+zS7YwGQkDI5yeP8/WuluINyIoBypzz/AI1UubSNyQwyzH/JH+NfQ0K6W7ufDY3KudbWL+nXmIgGymeMk+tP8qGOTzkGCc5x3x/n8awLy18kbWbBz/SrsEgSP524YjvSk1vB7kU8FPn5ai+E6O0KEKRtyPxz9K6SItIhOAME47/WuNt4xGQ7DPHJ4wMfpiul0+eI4UE8nqOleZilf3kfQZWmv3dRWJLnRjNG8kq/JjHBqitrbWziPZ5eTx2xXWPMkcW5B15ByPX+lYUoNypeMc9Ca46VaT+LY9LF4CmnamtRxkjhAY4IPI/OmQ6pH5pCfMVGCO/6Vyt9DdBGTlRnA5JrhIb/AFGzm+zAMTnOcn9PrXs4XLVVi7M+JzfP5YNrmho+vmetXlyt0pkjA3IOh64P/wBbmkW/lEojHAHTHHtiuR03UJ7sBp12shyQfy//AFV1kAWSTfNwo7dOKdXDqC5ZHl4fMZ12qlN2u0FzZtcky5+bGcDnIogjdTtUdBzzmrV5f2ylYLdcswzkdq5S81GaCTaCQG+v8zWFGlOeh7uKxlGhebd31O0DBUOMVpQxRLhQM8DOOQOvXOa43TJhqJAkbBU+/I967DT5RFIYF529ye1ceJoNaHo5fmKk+fvsa76fCgRnGDj9Kz7+CMcwnr19qS91GWQ7FYYHGQcVFKImQmbg9SBXDClJNNns1cVTknGCKTm4hhyOoH1yPSqEslwU8yJstgk8frUjXJ8sumAOuD/jVFbtpHwmO/PX9K9KlBp3seLXrKVopsyorqe3n/fOctz9eev1rtNM1GaKJWl4z6+ntXFXd1bxTYzudODV/wC0SyWiBOqjOQa9DEQU4q6PkMHCeHqNqd7HR3u24/eKScAn61jWl3smAkPPbvirNlvl2sOMDByc5BqV9OD7pCefT/PrXNCpGKcJHoYnCVKklXpHTWNz9oAGflODn6VDfJOsrGP5h2HauetprmyIIGFHJ/8A11sQa4slwnmDII61x1cLJPmiro6cNm0ZRVOs7O5zs1rIkplYHAGRwRVuOIHLfdJFaN3qFsBvfAzngkVzzXKKx5I54P19u1OKnPVo9J1KNNct7mhOYo4w3G7vyP8APFc5PdmTcsI2noDT9SuYmTajfNjis21hYEEjdxXRSoWjzMxljVKqqUNjn7/TLu6maXkMuM+/PTNZTW91aq0knToRnt+lejfYJF+ZRu3c857nFYd9o1wyeWRg9BzXo4bHJ2i3oebmuR6OpTTv+ph4t0iTkkKeT6Vzmpa5o6yOs8qqQMEMQDj6GteeEw200bMdxHHrxXyF45kd9YFsCWC/Lj/aHHFfZcN5NHF1GpStY/BvFbjyrk+DjOnSUru1iPxhPax61NLasrKSCCvUHGK5vUPEFze2vkMSwBySck/QE84HFc3fpNCDkHjk56ishrpmTCEkCv2nD5dFQinrbqfxDVzCrVqValN8qm3ddNdbGhf6oXjEeckcACsu3UuR5hzk8ioYhliW5yM59K0ElAAZfwr0FHlVkYSVlY7TRH0e2uYre+XCFgWY5I6jggc4NfUGk63Yz2Yms3DIARhc8HH518gadFE06tMcgGvdvDTxyxCKMsibiN/QgsOnt+XtXxPFOXxqRUm3ofq3hHxDUwteVCCWvXZvtr2Na81ebzZbcthFy5IJ+79e1c4fDNvrf/Exm3SQ8rtJwAQev06mvQf+ER+1TLJJlon27gCcHGM5HGc13mneGrCCIWka7UHYemefr1718ZXzenQj+6ep++5VwZXx1TlxiTh0T11vp5WPD7DwdEFaFBtiYYGOuPof8msHWfhZfBTPGfMdRnaFIJHYADPI7V9T23h2FwPs6FiW4wOuP6CvoDwn4ftvD2hzT6jtF1OpCKy5wCPU8g4Jr5XNvEWpgf3kNW3a3f8AA/ZuEvo14PiBPDV/3cYpvm6Ly3Sbvsj88fB3wW8UXVs2t3CrB5ZGyNyQ7bjjOPQcZzX7Kfs0ajqkHhz/AIRjVlA8mNHTHUZHzA+vNfKMHhu81LUha6dG0jsxISIZ3fQdq+3vgjpgXSZru6Qx3C4RgRjI7Hmv5i+lXxbHMeG631xJpapLdPp+up/dv0BfCnC8L59KOX865ouMm9p2u30smrxsvK57KYi55zWha2yeXhqREJbp9a2LeDgfSv8AFetRvUuj/YLEYhpHK6tbLFHjOAa801CVlJHvXtOrxRPAXk6KOteQ6uI4laU4A9a9rhzATq46MaZ9BkGKTjeR4J40UNvLDIIOc18keN7nynYJyPT1FfV3i+6SYPjnOcV8Z/Ei6WJC2eoOf8iv9KfB2pLDyhSluj8W8ZsujjsJUd9GfOXiO+W6vpJY8sQcEDt7V5pfC5mnaNchsc55Arf1ee7e7kniA28n61zepXa3Gmsbb5ZMEnH45r+2aGYxcY8x/njLgmeFdVYfS7b16l2XWLSx8OtY2sYE65eWT26AD2xXyF8SPFMeo3BNrhGTgA9eK6fxFq2p6Tbsm7duODuPGO/0r5i8SajNLdPJnBPvXpZDk8frEsQ3u9CeNuKpQy2ngYx6K/T5oh1LU5byM72PH4V5PrFxcmdkB4Oc11U2p7cxOMluvSuUv5SzeZjpX6RhE46WP5mzmdOqruWvU5oEiIqpyQKy7mUGIoetSys6MzKeWPNZhV8t1Iz1r1ozR8LXoyUVppscjcQsG31msGBwa6W8f5QGGMVz864GR0r0Y1r7o+Xq4BL4HdFd8KvPOar7iGyatPGu1eegphjXG/0qfrFjf+zmmVgQ2PepgNnJp52/w8YoLB1UMKtVWYywqSepft3VR83WpLmYs+F6VRGR8xq3Au9evJrOU0veOyhRlJeyj1NK3Y7MmtBRkbe1VYLYqozzWxbphS2K8fE1F0Pv8pwdSyUuxW8uQZ29K0rePK/N2oRckjBq7BFtHHWvNqz0PtcDhmnzJl22gRcbuM1vQqj+/esyCHcc5roLS2Y8sCM45ry61ax9pl+ATVrE0du2AoHHXiug0zT2cgMODVeCNunpxzXU6SvIY889PpXmV6jUbn2GVYan7TlR1ui+G2DrKy5Xg17FpXh1751it8AKOB3qr4IVNR/cSL1xyew719H6X8PWQJfLyqKSAPXHHSvl6OMUq6jVdj9MznBSoZZUr4Va8ravtdLrsc9oemyaZC9vdBehU8ZPTpXz14xVVkljQAHJzg8dfwr6CsLy9lQgZd8DdnjkcV5B4v0W6gu3luh/rOQfX+lf0fwzh1hpeybP8TfFriWpndeOayp8uuttlfTf5feeGyxhEOT+FUIAyH96OWNdFqdp9mIDcnPNVYljPPfpX3jlpc/P6WIThfuS28TmMnsfXtVeSRYh14NPld1U7e1Zs82/5fx9qwYU4Xd2EjmWIluMdM1zVwIA3IyTV2SfA2AZI9a56+dxl88+1ZzVke9gsO72P//Q+S/BWvyRXaRT7TET8wP0r0W61fS5pz9nQIyng9vevOn0CS1i3wgKFPtVmzivJJPIADFgB7V+bVcXCq/aKR/btLK5YdezcdTtL/xI1iixK33xjHr9fyrX8O6veSuqRfN83UdMcfpXnN1oU9xGJtp+U4K4PrXs3gzT7ayEKyjjHOR1/wDrV42ZVqNOheKuz2csoYmpiLS0R9geB7SaXTYXkbGOf/r5rk/jZrlz/Zj6deKzxmJgh9/Umum8D6gkZWCORRv+4MjpWB4/vjdabfIm1mQcHGcZ44r8R4cqKnnarVY3Senldn7HxNhJVcmlSpStdW/A/JywtpItXkEnA3HGeK63Upp1jDRvx1IGM4ritbvtQudduJSvlkOQVGRyPapkubh7UtO56/jz/nFf6Y4e8qUakt7I/wAMM3hGlj6tCitE3r8zl7uQ3LSbfvdv8+1N0mxHmlZiCpXPPrQXUXBdeuee3H+NJbvM03nKpI/QCvRS0sjwazfN761Wx12nWAEyvGenTNfWvw306W4tY/NQ+Wwz0/SvmzwTC97qawsu5QQDn1Nfffw98OST2axwJhY+pJx2FeLnmKVOnZk5Jhp1azmunQ9J8L+Cri7jQW5BRsHaBz1r16DwtcaeAi/eI4GOg9K5Tw7NPp1ysanGTXs9xr9jFZpcSgFyMY96/G84xlf2iSV0z9ryTDUZQfNo0ef/ANjXMjbpAVVTnGOtab6dKuWx+NdPp+o207EsMnuK2p7SGMN5aghv6V5k8wmpWkj0FlUGrxe55Q9s3mqkZyPp3qaOxkG1W5C9DXYPpaLIJc9Pp3/Wn3NuyiPPHHGOa7Y45PRHk18DKHxHKpppC7gO/QZzzWtFY+S6rgkmujsdPSXkHHfNbFulpFN5cvOPWuermG6RpQy77W1zivPmV2Ma7kHBJrk9ftE8p5E4bGa9f1O1jihLW6jcw4H+NeBeMW1KK3YrncSeg4A6V35RU9rNcuh5ueUnSpNS1PPLvUfLl2AgjPPPTsaemoFlYByvGAMg1wl1cXNvN/pAw3WptF1P7Te+WR8qtgn3r9GWE93m7H5G8alPktuem6JNcyyJHDI2VO7GfSvbdG1RZ7VEulKt3zXm3hGytYb77TNlhkEAj3716xJcadIVJXt/+o+tfKZrVjKXLyn1WT0JpOq5W8mZ1/oyyEyxjGeN1cPd6L5L4ZcBh6V66wRo8p0HIyapPp6yvubqvtmvOw2NlDc9XG5fTmrx0Z5xZ6Gpbdtx3rrbfR7Zl8t0GfUDpjvW8bEKQFH3uw4981cezaIKByO9FfHSk9GbYTLqKhy29TlLrTxEivEQO2OlQWyyRSB2BwDnHXr0ro57fzCWAIHFZd9byRRbo+o9K6KFZyXK2eVjcJCMnO2hPemOSWGe2U/KcsenFX12SAoD/n61zFjczrKYrngDv6/WumijeNBIQNvYZ64receWKizy4tSqurDZ7rtYoXcsikIvJxxTIJGT5mJyw6DtitO4thdLvB5HbtmsSZJUJUjgfz70oNNG9SknJSRopK7MIx0JNXmjeBcr0PWsiC4SNlSVTkdP6VrNdwyDA44GAe3tWVRO+iNKMEr6lh5W2AEcg5zj9Knku0kixjBI57ZxUUBjYqW4GOMnNUpYSjgIfv8AT6/jXPyJnX7ecbp7M0baKAsCw79en+RXc2F3bLt3DpivP4LWZCd547dPxrUWC7U/K3y544rlxFNS6ndRqOC+HU9GEMKp51u3BOfXitizbzCN54A71yOmyyJEUY57fjXRW8kmeB/kV5FWjdWZ3RxDU7x+40HlbzCBwG6U6U7owOp6/wCRUbMpGDwwp9vETKFJ46kV504pfI9mjWco+pjyW0scu4gljxRFYO4LEV162qyOGfn0qWW3eM4wCAKl5i1ojSWUxabkzz147yBsRE89cGt7Qrkxho5+G7VtPaRBQ55zz71T8tS26IAn8utbyxqnGzRyxy1wlzRex1Jha4tsvj0rlpNIl81tnC54Jre+0i0t1E33T3FbdnHHNCJBghhnHpXmqu6acl1PRlhozaizzDUbfykMTDpXBXxjLEyLx0468V7NqkULxM2fnFeM61F5M54yrYBr6TLKnPofOZrCMVzIW1g89fMUdxjNd7pcKwqGkA5HX3rjdH8vGFOAOo6V2lvOUIyuQOw608dzXsh5Y6VrPUkvIngdj/Cec1zzzfaLglwcDv6kV2shFyjKG+UjA/Cubl02RWYqO/HpXPh6qt725riMLraGxg3ofc2VyCefTFebX1g4uTJGMg16pqFsrYj6Duff1rlru2MblTyMV7WBr22PmsfhXLfocn/Z29VmQgZ4A6dK0bGF5W+U/KMdcVaYqjbFPTmtPTkjEoLry35D8q9GpVfK2eT7KHtLL5l60icMC2RW0skSIUKknHP+cZpbdrcvgHjpzUl26xEoq9ck/wAvWvIlLmlY9NWjFyicxqDM0o+zsUAPJ701JpOFmfOO/XIpL0sjGfPB49etUY5PMGW55Ir0acPdPIrSvK5qi7COYkXpz+lRSXZ8o/Lu/wA9aggs5FYO2SB+X0qVom27XPJ6A1DjFOxvRblF6FX7Sh4HP1FMaRChA4x7/wAqqXFsYR8h2kis9JZFJEvHoB3rshSVrpnnzna0ZLUl+1qM5OenNVmKXC788/lVK4dpsEf4dPaoSVhJVc+vHPXtXdToroeDiqrslPWxthwsewnIPJOemfeuev5SLvYfuHAGe1WkupRId44HT/Jpl5FJPH5igAg85HYVtTp8ruzzauJ9o2oLYw5bUrPuPKngYpTbMshEnKnv/nmlaUn96/AIAHHSrkDG4AMgyTz1/wAa6JSkkZqnRvzoyptIaWLzohntjp1rGuLGZckrjb09iO1elrEYoBzng4/HpWHceUFL9d3alQxMr6FYvB03H33a5hW0xhHln5sAgeuKtwXIWYMe2Rj3qrPGoBKjBI4b39Oajghby94PcdRXYoRaufP4zETVRQj0R1EMnnN8hLkk8V1+n6W0doZXGST/AJ9q8+0WRftYLkAL1r1eG/jubXbGBjGM14+ZqUPdjsfQ8OVaVW86mj1OR1HT0khJiGP0/rXn2oWltbyMGwJSOncA9fwr2ryoxCS3HGc/SvMNY0Z7zUcp1IwSRWuVYy0uWTsjPifKZVKKnTim3pY5iPyI4BLCAG4yQe/WtGG8k8pXc5xkEHjuMdaJ9EuIX2ISQvX/AD/9aojZGTC8fKeh74NfQOvTl1PzhZZWpKyjZli0MdwzdVboM9PWtK7s7e4gCyctjriuRRXhuzMH2DocDj6HiuugxLECpyQP1rnxKcWpJnr4ClGrGVKpHX+tTB0ho9NnKtnkljnt7V2kF0xfckXXp29q5mCGGO4/eDnOMmvQrCOCRQWIHy9R6+9c2NrL4mtzXLcsk17OErJbGXG6bju+9yfrWVcXW5mh34z0P4+taV3YXIJkiIK+36daxZdPuCXcAqfXHfvU0uT4rlV41I2pxiRy/JBvYfeBJrIlMsSkwHbtxkZ5x3rf06wlDbZunPBPT0ropdGsREUPys3SieLhTlZ6nRQyueIheOh49eRyai6eQ20g+vJxn9K7TQ0KKsch+6O9cbLD9lvn2jCqxC59/euigubiNR7Y5z2717VeHPBRjsfC4et7CvKtPfr8j0e1itgMScbuMDHWtX7FCyDYvXv7/jXGQXglVXc7T2HTBrqbS5mmUGboOn1zXy+IoTg+Zs/Qcvx9GtD2aKs9riNsruPToK5mWNlA8lcHJ6/5/rXoGpSKkDNH94dB/wDWrl7dWdC1ycEE4PpWmFxb5b2PLznI/wB8lF7Iwo4Ea6An6Y6HnvS3ulyXJD25AB/wp1w6i6Ef3cAAc963FkjjhEUeG9cH1rsqynG0keThlQqKVKe34nJW+jNHIfMQ/LwM9Dj3rZjs0RgYlCnHQCp5XkI+Un3FZ0mrrZ27PL0TPftUz9pUOzCzw2GdtktTaVIlQHpt6/h9aybzW9KtbVnmwWzwMdP51yE3ibcGjiIb39/r37Vz+omC5tBO8mN3Bx7+n+FdeGyT3l7U83MeObxf1SzaXU5Txp4i+zQPdDaC5I6kZOOg+teB6JKmpSXF7dQNMp+ZA33tw5z65z0r2K6hOoaktrAweLB3fVcc49RmujfwvazvHIV2Aj5tvB//AFV+i4HG0sHS9m1q+p/POf5NjM5xSxMZpwhpa27e7vtZb7Hyn4gtrW7dpre2Yl85PcsT1OCfy9q86uNFvFUtDA+M46HrjPp6c1903Xw7sYSLyBsSAjo3HTAPPUdz71zdpol/vli1NFJH3HU8HH+fbivqcHxlTVP92r27s/JcV4LY14p/WJ8vM3ayuvnta/p8z4dkBhAhYEMT3qRoABuDcV7r4/8ABFt5smqM/kFic55GccYA9e9eNMsVoWib5jnrX2+X5jDE01Upn5FxBk1bLsS8NV3X4ruOhkMQwoxj+lemeGNXvNQ22hUssR3ttxyOnPGTz715go8zErnAH4VvaNr0lgZBaqPnG05HoQc1OPwvtKbSWpx5Pj/q+IU3Jpdbf13PtfS9RtHsEKAFgOgwMN3FdLpbR3bLkYJPODxjP0rw/wACarLfQgrtJf5sLkBPUH/Ir3bS4gCpzyTkkD+lfg2fYNUJSgz/AED8PM9+u04V/s2R39kr6XMk0AAbHXqM17Po+hav4r0pLyOLc5LHjnIB5NeMJNIhXy1zn9fpX1N8NdQtrXXNMtbVz5kpUMmcAbvb0r8C49xdXD4b6xRjeau/klc/0G8EcBh8ZjXgsTNqlKysnbWTSTXdrsfRXgXwhpfhDQ4RFCq3UiBppCPny3UZ64HTFdYkMYG2FAmeTgDk/hV+88lE3N1PQVnpcxsAsfy5r/H3jTjbGY/E1qmIqP3pa69L6fcf68ZJk2HwWFhhsLBRjBWVkXI4DwO9btvFtXnjFVLFEdgP4a6WeBI4Nyj3r8/oUr3kh4zE2fKcRraAW7LmvDvF5X+zyi9/6fjXqviOeQuxU/LjpXjmtz742jb5sg8HtX1fAuKhhswjXmz7TI8vlUouK6nzN4ouvs9vJEvB5x+NfIvjO8N4XSbqvoK+pfH8rW8Tuq4wTxXyDr1yIJHkkHLHAB96/wBA/DzMIzftV1PheM8oapey8jxvWLRrmQLCMKAeorx7Vi1oJGjfBUk4r2nU9RaG5x/ASffj1+leL+P72zEeYBkseT06V/TGU5hKclBbH8yZ3kMKEZVKnQ+f/F96NRJVVwpH0Oa+adfVYJ2XP0Ne/wCuzuA8+MDB9+teBa8fOlfqa/acjdo2R/J3HsOabZ55dp85YHj+tZEzFkI6itSYP5m3B9Mc1mY270649a+0pyZ+A46ipPRWuc1dIwHPTNVGEaoc+mMVfvc4Lelc+6qWLnrXfGV0eBVpcrRn6jbrg5H0rmZLaXd5g6dK6q4YBDnk+lUMh0x0710qs0rHiyy+MpO6OdeI5A6UoiKr8x4rUlSOQkjjFRCNjgN2o9pqT9TsinJErrlegzzQkAlJA6CtFkG3A45p4VVXj1qVWe50yy6Kdn8zO8kquas26NuyBitAwBkx0qeGIdAPxFTUr6G2Hy73kkS268AHt1raiACdPzrNt0KuDjpWxFHkgCvMrydz7XL42joixFHwPetiO2DLuNJBCdoxXRW9mxQHGa8fE1klY+8ynLZTev3FK2tmwOPet+GBgoHTHUirVrYEjLD/AOtWrHYvGSQOBXkzxCbsz77D5ROKUkQW6ZOcex9s11OnQnAKrnPFZtqhQ7WB5rs9HsPOxxge1cGNxFos+lyjAc9Rc256f4IhumuVFsDx6V7B4w+IGsaJpUemWR8uScZaQcEAenua4jwMHsbkOo6jAr0rxF4Ts9dskafKumSu30PtjmlwWsJLM4zxaulsvM+R+kzUzqnwbXo5K7Sa95p2fL1S9Vfz9Dwuw8T6pavi1mZQeSM8fkavarq8+q2qLczbiCQB6Hjmqmv+F30mRTZEsMdT6jqK5pYbiH5peCeor+pIUaVS1WKP8P69etTjLDSm0v5W3b7tilqdshGMZA/GuPeOWFyFrtrmfI2deOaxZohnevavQinY3wNZxVpGTdZaL0Nc9K2I9kYIY8ZrvILeO6PltkdqzdR0cQK2wfialNI9PDY2EZcj3OLgtXmbZ90+tTtpCRt5rgkDpmtmwtWZwVOMetXr+Py1DOQSfTmsKjO+pjmqnLE//9Hx0aPduRblPmzx711Gl+BL1R53kqT1wPX6fStyxSSe4VpVOc5AHNfVXw+8MDUGjnuSFjx/kGv4x4n45lgKHO3ZH+smScI08VUseGQ/DqcQxuE5fjbj9MYrH1rwtNpt8EiVvl6nGeK/RiDwtpSWe5EBVBg+pr5l+J99pmjCSaRcJuCqFr854L8Va+ZYr2UY3Pq894Kw+Gw7qXtY8x0S+ttEjSWZMyD36Aj614X8bfiLHpOhtcaTOY2mHfJyRXQ6trQuJpOdqryBnnH+e1fEPxp1wX+qw6erf6oE7T1Gelf1N4Z8IQxmawqVlfq/lqfy544cfzynh6vLDu0mrLo7vS6/M5s6z50L3LgEsSxJ7k1z1rdz30zg5H90D27VHawS3Fi0WMAjgE9a7HwvpShlJj3ODkfj3r+14csVZH+R2IlKbvLVu7ZVg0Z3C+aD79uK9M0bwi8lq0wQMpPHXNdNp+jPfSJuGC3GMdhXvGk+HY7ZY41jwFxg9MD61x4jGqOgRwvM+aO5z/gLwBBbQx3MkeGPPH+etfY3hiSPRLZYYxhWAyD9K4bw3pax7pmPfAx6V1U8TJh26d89/fFfEZpinXnyyeh9RleB9hSdSK1O3hu7Zb7zCeOv4muuSW1u4cTN9PQCvFkuXtSvlNyeuf8AOK1k1SRlMTj0PHX/AA6f59PBxOXOVmmevgM19lzKUdT2XTdQs7CRxkFR0Pat99Wt5ArRE4z2/wA/5/l45a3hePAGTx3rpNOmYA7RnHPNeRXyyKd2etSzWSjZdTvdzSYMfNdFaRLNGFbJOcZFctb3kDBYt2Gb19a0LbVFgn8pTgj7wrx69KT0SPYoV4K0pM3x5NspjTjJOMelUHYyXG0Hhe4rCvdSeSQzdAOlQ2t8pw4bGTgn3op4ZpXYV68ZPlidtcTIsISTqK5i+022voSJQBnvUpvTccOehxx7elWEZZYyp+7jIyKqlCUNUZYyUZ7Hy3458MbFkaHGVJweO/pivn6a+1HRbouy9W5/CvuDW9ME8MjOAW5J4r5f8YaOl1e7NuFwMn6Yr9T4fzGM48lQ/I+J8plGXtaKs+h1XhjxvNJZZ289CT6V7D4V1VNQJ3cketfOGiWEdpEEDYCn8Bn3r3DwclnbASFvmUAZ/DkYrLNqNPlk4I4ssnX9pFT2PXA7lQjHAT8ua1rZQYyxPQZ/EVFLbxSW6XSncCAcDrVuyI8rew68D/CviZVbq59tPDbcpYi3tHvxyOnpVyKYSArJ6daaVgkQIh2t+lVZWEBbjLA4PvUq0jGSnTshbm2RH4IKkcN3zWJLAySHkMM9615GWeArHyRg/jWZchYmAbn0x/npXTRbWhz1fejbl0Kxs4HcOTyOTjuf/rmrETrEpEh3YpIFVmYjj2HeqkqKr4x/+o10p3dmzknSSjzIl+1BHZYhgep5okiJw7YHvVaOFmk3KOM569q3AUmhCMMY445z+VXWqqNrGOBw85X5jBS3iSXGSSfcDkGneXtG0t9O9alzA20FUyenFUXjn8znj1604Ym+pq8uktkX7dQuFHPcYrWitIpVBXtnGe1UtLtTKrbm5H3QK2bVWjYxlcEnjHHFctaqujNaVCo5JzWhP5Co6j+6OPSpQyuvl/rWnB8uBJ8yjpUf2ZSC0Yyf5V5zqdz2aVPS6e5JHLJCVbqB17/jXS2FyoALHjP4k1yEodGDYOM4/wDr1atQ2/L559zzWdSkpR1M4zcJprY9Cws+CFBJ4HrU0cU0MjH6DH8qztKuQIlZx8w7VvGSOYhmGQOn1rwqycZONtD6CklNKXU1tNVZVAz+da1xaeXFgYOeDXPWly0bAjAH1rt4ZUniB7dK8LF8ylfofQYVR5XHqcZcWrsOmQR2rFlgRSSvHTrx9PWvSZoF2ELySMZ9K5m601nIfGR7VthsX/MY1cLreJz32h5ojbuenTikt9RksYtvp096rTLPbOYmHBqldI5OEHP6V68KcXp0PPqTm1zLfYrXOtSXF0wk79/WuU1aH7eePvr0x/8AqroprUsvIyR+ZrMmikiyw+mT1FexhZxjZwPmsVh5yTUtTG0vav7tx04z/Wu4hJdVGM/TpXIWwUyltpHPORiu80vT5ZEWcH5DjJB5qsdJLVswy+nJLlS3LEM8YfZtIxjtT7jaGBXpW6um27AyqRkCs82sYJCn6g14arxb0PpeR2Of1Ox8xPMTv29K5K7tmiY9jj616ZKjLui7HuOa5y5shP8AKRhq9HB4prR7Hj5hg4u7hueSyQyRvuI3c/56VYgl2J0Ab0zjtXTX+lYPzZHYbcc56VkNpEqKdpJI7/419FDFxklc+PqZXUpt+zKsN28DDdnOckZroRdrPHsbn69a5Se1mjBJOMjrjmobCe5iuSJRuHf/AOtW06cZq6OKjUlBqEloaV7PGVET/eXjHTj8az0AiA28ZI61Z1WGG6bzosg9xmn2NpiISOfb8quMlGF0W4OpUcJLTozWt9yRgN9cVBcKW/esSCvbjpWnbQjbkZwaqagMLhBzkVyQqpysd08LOEOeLv5GDMplzzzjqehrKkjVssxwVP8An8615JCr7cfL3qWOKOVt2RweSa7FU5TFUFLbc5S8tpC4cdDjI6Y9altrTyid/cd662Kyg3s5G4jr6Uy7soNvmcHHT6VrHHX9w8+vlFm6tjlL1YFgaRhuZeOP51yV5eukisDtRuMf5611+qJvgeKI84PPSvPZEEblp/u5JA/KvdwNmtT4LO6UqU7RXzJzLnhG6Z/HHtWpHJhNxPOPzrkBMrz8Z+TnP0rbt5RKoU8g8HPT8q7atFnk0MWoppnTrqcTx4j69OaXyFMRlUdf6VzkWIJN27p1AI5/zmttJDcRYUYwTjrn86xlQ5dYmazBylaer6Gbcw7g4POF6+/1qtbmZ42z+H+RWrcysiHzB0HPp9a5ya6ukARPlweSBXTRg5aHnYnEU4Pnd/1FS5lhmMhOMkgj/wCt/niu08Oao6yqrnIPTpgV5hfazaxXC2xbdnOfqK0dN1h0utsZHPQ5I6+ldmIwDnTs0fO4HPY0cSmpXSZ7tJeExmMtnd+lUfJV13cAdM9awrC7kuFCk5PTv0611dpbqQGJxz/Wvj6+G9lofr+V5p7fVGRNaqVx2bjPtVGXS12NInJB4xXZz6csiZXp371IlikShHGcnr+FcscXy7M9Orgfap3Wx45PobBjIScnk896y2jnsJPJUkD869kurCFEZ3AP16/jXn+rCKMGMr8w5447/wA693B41z0Z8VmuVwoxcoaP+vzMhJRPGCpGc54rZ02+a3XMpyucHn681ytndQQsYn4JPIOee4qnLfHe8cIOASCK9KWDcm42Pm/7XjCEarlrset6fdW885UH0ODWrJFZFViUgY715XpeoiELg9OCR1rprPUUaTdk4HPNeZicvabt0Pay/P4uEYyS1Ot8rGOAduM/hWZf7ByD154qX7crZjjXJPvzWmqrNEAnJ9fT3ry2pQd5I+phUhWi4we55jqGmC4HmKCAM9evt1/PrVC2tJEJVWzswcHH+fyr0a/QQgqRwOa5uOazjuC/3mzXuYPGSasfD8Q5LGEHOL1KkdvtiCMPLOOvPP8AKtqzkFoMOeuOfpWVqF7JPEUZcYwa519ajt2ZXBJPc9v8/hXdUw0qqPkcrxkMNUavsekXE8UkY8s9DznvXPSzFnKh9nJ/HtXLway8keyJSDnp/n2rqrWSKQL5i8jnPT/GuP6m6T949upmX1mFoP1OP1eV4JvPLsBGpJOM5x+tSQeI/LtNiA4B2kN/Mfz96n1hEXUBDFlS65C9c+4rAFjmU/KBtOc9xmvpaVKlOkuc/HcZicVSxkpYd2vo/wCvQ2YvEHnITINuc5ycdO9czrt7byxRqr4GRnnGT6UtwIl3TXG0xscj8PWsu/No0nkSLgMMnH+efwrShhKcZ80UdWNzGvUw8qc5K7013/pnIeItSk0uLzLUkogyx64xVCLX2NijCQfd/M+3rzWpq+ki6tWit38tG+91bjPI6/r/ADrjL3SVsYUigGGIwWHHTjp9K+mw0KU4KL3ufA4yti8PiZV18Dil6O/T/g2Luh3ZF95khO5+5PGete2+HrqOe3ELuDzgjivksX2pxajNjcUTJOMgEcHPTBP+c1VtPiBq9llPMzj0zz7fSvTzDhieKj+7fY+M4f8AGHD5RU5cTFtXkj7gkSxwACDtz344rlNUubLy2gjQBVxlv8818+WPxQeK0/0ltp3Z5IyR747/AIf1qtd/FrRmXy/LkL4ILHHOf/1V4FDg3FQnZps/RsZ44ZPWoKcJKLa67/kS/EWO9TSWbcrxs3zhgO3TBxmvlO6Yy3pQcAHiu+1vxfqetzssrF05wB0x2Gfas7w74budZ1JYI+GbnntX67k+G+p4d+2a7n8i8TZsszzN1sNF+9ZJPVt36djBS1mlUQoM84HFfQXgb4eQR2G/WoFDEggk+vsPz9q3NO+HNrBM22NpHi2ltg3AZ/ln8a9Sg8Pamtrs2eWmCcD5iRnjr0xXynEPFkJRVOjKx+q+H3hPiZzliMdR5ktklddU76W/E5j+w4fDwS4sQCGO0eQvPPfjOR7V6i099plpBiNh5gGAeDtJxk113wV8DXPiPxhb6ddwP5EnDFwdpAPb/wCtX0/8UPAeh+Ib+O38OWjRQ6UuJJRku/PKjPGBjrX4BxX4jYXDZlTy6subRty0slsr+beh/oT4Q/Rwx+YcPVs8wkvZ+8oQp2d21rJryUdT558MWU85g1W7YeSCWJzyoX2613Hw81Q6949FsZGWJJP3bxL6N6nH6V2fg/wS18l3NqMe2J18qNUPTAwKy9E8AeIvBesJq1vNAiRsNqEncwY9OmPxr83zbiXC4hYijzpT5bR7a/fqtmf1jwv4a5hl0svxCpt0lPmqW30srvayfxJbn3tcSO0is5yB6/SoIpk8/cvfpVTQY57nRkvbptzzLnjkDHAqu7LCwHU9ea/xw8S8mWX42VOLvrr6n+vGWVY4ijGcVa6PS9IBcAnHPFbmpyeVakA9u1eZaf4ha2ASQZxT7/xDPeRsc/LivlMHiOeHJFas82rk1WVbmexg6zeGYsh6nv6V5TqUEibiOjHqa7O5umkkyDwK5+8cOrB+QK+iyzIsRSqKVWJ+l5RT9ikj5w8e6da3ULgcAcHnrXxl4n0ePzHfO7afrnmvrH4paqNOlfyThWPPNfDvjXxHKgc2pxk5b/8AXX9w+FWX13QjbY+R45xdKLdzz34iT22nWX2g8HaB0GQa+NPFOuJcyssbEqRjHt64r2Hxz4rmntWgmbexHFfLV9dS3l9iM7SM/pX9n8G5U4U7z3P4p8R8+jOq6dPYz7y4kkgljkJ4HBPtXjusMys+3oTXp2r3pskaIrk9CfevKtTnWRiFPU1+u5XGyufy1xe4y91PY5K6IR961gXR+bzBx/WugnXaTvXgGubvs4L4wBxX1dGdrH4nj6V73Mu8CSJhsVzk8I2ED1zWvK7MOTWVcZB+XkGu6M3sj5+th4/G1cxLhHXkciq7AHJrRmK9PWqjRZJatHU7nPSw6UrxRmeWXbnpU7DOOx9akjiKk55p7qCu6rcnsZ0aMfitZlY/MOKmjjV+KFRmJLdM0/aVORxWfPbQ65UL++1oaSWw8ok9akWLbyKhiLlME8ir6RMVAP41hUm7WZ30cNBWcUEAw2Mc+ta8KZbFV7eEAnPWte3gy/J5NcdWZ9Dl9G7SaNOyiwgY+vFdppoBi2fpXNW0IRQh7c11+j2xlmQRAkkjA9zXh4uWjufpvD9N+0XKdTp2nF1AYc/TNbz6ONmV/PFdda6JNb2AuJFIBHU1YtLQyIVwFP07etfETxrbuj9xpZSlDkkjzh7CSKUAA4+ld34ZtHkdYWOMnsK9Q0fwcmoQhThieo4wR/8AXr2Lwt8L9OtrlLmVcspzgnPP4V5+P4kpQi4y3PdybgnETmpw2IfDXw/2ww3plySAStenSWcGmQGV0D54Hp0rsLbT2SICNMkAY46j0rc07T7DUJCmoR/KF6dK5OFc7gsQp1T5vxw4Xr4jKJ0MHo1+P9b/ACPkLx9a/abuOW0TChPmPYDrk/hXieviLYDbjJH3jX6N638OfC2radc2wUwvKPXIz24r5B8afC9tFgL2ku5SdoVuCT6j/Cv6n4P4swuIgqSdrbXP8RvGLwjzbKcfLG1YJp6yt0+WnQ+Z55wRtXkk1ZWzeQfuwSQOT7VuzaFJbzlJlw4Pfr+VegeHvBl5qNsHtQWkkbaEI4wBnNfoGJxkKceaT0Px2gqlafssPG8ux5LaxurZY85rRktZbpHJ5zXo9/8ADzVLQyl0AESbyQeM+n4ViWfk2MTQT85B5Xn+tcEswhOPNSdzueV1o1UsSnD1R5rHbeQxDYABqtdhZGGe/wCNbuoCMSu8eeuR9K5a537x83HpXS5Nq5ND3pXuf//S0vBujG8KxznDfw9ga9ug8UwaHbG2eQKytjPtmvlfSPiCs14tkECBCAWB5yOtbninWpIgpcsVbnk4r+EM14Uq4vEqGKWj2R/sJgOIKGHw8p0NWt2fYdp8TxcaZJ9nfcyDAx6V8Y/ErxpFrWuia4kbKk4VeACDXj118Rtd0e6li0uVhG428nIriP7enuWL3bb5DnPrk9/xr7/gbwko5ZVniYJa7d9dz854y8UPrlJYbqnr20PXLmeMW0l4SCuPunP418UeN9LudS8RTXznqwxX0dbarOF8rkowxx1z71xOrW8AvGnaPCyHkt6fiK/eODK88BXlKO70P568T8so51gY0quiTv8APU8QjEiTxoBg5r6J8HaM2oqkduuXA5IHArx/W7KG71FJdPfc2MYHqa+r/hHZPYwK1xw8o5r+hXipSwqqNa9j/OzOcujQzKWGpu8b6M7Xw14KnluYmnwvPOK9wn8OqsSRhcDHUdsf/WrO0WWOG6EYxtbkZPavXdEtv7QO4gAjNfG5hmlRS5nse7gcipTg+Y5jRVaD/RY0G0Y4P8/Susu4IXiHHQdB/Spp9Phgf9yMduB61JPaTRxqeScdxzXkSr88lI3hh40k4LU4e4swkgKDIHPpn2qaNNsyxqM+ufeupFqXjAl+9jtWXcxQwgkZ/wAa7aeJv7p5dbCOM3UQ5H+ySgpkjgj6V0NvfjaXQZz+tYCxLMm5z0xgdKY7TbAoxlT+Y+vtWU6akUqk43b2O9tbtngJA+bHJ9B/jVe61byGySDnnNc/FqJgs5Ij8xPX16VyFxqJmja3LHP1/wA8VjQwV277G1XE+6pp9D1M+IYrhDGuCcfSpLK/j3FRuB/SvILK9kWMIWPBxnPeu+0yRpYyXPQjiqxGAjBNIWHx052ctz03S7pXmWMruDd/r0zXoVpYiddzjCqM9O1eb6FCHnRkHBIB7817OdQis7by2AJ9cV8ZmtRxkowWp9dlVONTWb0PN9chQxyRIBwD+gr5f8U2sJlLL8pA4P49K+n9cZGjM6cZ7HvXgPiOwaedpDnrwPx5wK+r4cq8urPluJ6KkmloeQPA7nyYzx04z/OvTPDN2tsVgmAY459yMc4rGGlIZisWB04OetaNlYtDLuTOenPpX2GIrKceU/PsPhnGXtke2afqMoVBng8Y9q7exYSR7n6DnGemK8LsZ7prpEQkhRjntXpVlfNBtBOT/F+Ar4/GYSx9bg8VqlFaHV4VZGbOMmpvJ80knnPY9azIr6PaSVBOKuJdYI8rJOa4nGSNIxhLRPUsrCyKQg5zVW7sGmx1yD0rVsmeQ/N7g9s1qR+T5ZVgM9BXO68ou6Oqnh04q5ztpYsGCkYOPmBqG+03ylLEZDdT9a6N1VXEkRxjj8ap6hftOjRqOO9XGvUckzKrh6DUl1OZt4vJkCtzzj35rZhtwy7WPXoe2KjtbSS5O514HWrRcWzeR6VtXld26hl9FKN7WRfW1VyIgcnoDipJNFyuY+SDj/JpLbyuG4AbnBrs7byzBkdPQfzryK9eUNUe3SpwmnFnEx6XKkgfj5utXLeAmTGMH3rpzHGXB4APtVOW3Ct8g6H1qIYpt+8a1sNTcLRKpIiUKRn1waQ7lHmL8o64qGbj5m42np7VC00cgEgwOea7Kd3qfP1Uopxj8iS5HmEFBj1/zxVy3jZUG7HPpTrMQ7y0hG2tGRYBhs4/zxTq1Le6kY0IT1m2WrKAOG2csOnsK6myVzBg9/XqK53Tw2/5eQe9dvaWryYYDnNeFjKrTsz6TC0U48yWpWW1dG3KM+ua6jTJpNuw9ulOjsTEwY89vpV2KELzH+NeFicQpqx6+HwsozvfQuBWK5/Kk8tQnH6VJDIxAQjlTTZ87A0f45ry5XvY9qikndHN6nbRSLvx7ZrmjAgJAPHrXX6jGcDA4PJ+tc/KhH16ivVwdR8trnHioRc3oZslsm0Ow+WsK6092cSRDOOCK7aMJJGyuPujn0qq0ahMDmu+ninHQ4Hg4t3R53NaRxDzFHU4wK6HS73yUEafd96W6tWbLYwAeK5y4NzaSFh0PTH8q9iMvax5W9TwcXTdKXMloehRSPNF5yNgDI470SRMw8xevc+9YWg3srfu5eCTn6V20UDyZ3fL6V5eIfs5O524WKnFLqzDKkple/c1QnhduT1b19q6UWpKhCKrSWp7DOKKWISYqmHTRx09qCqqx57VmXFsQPlGetdpNa+ZnCkHOR61SksgFwemO3rXfSxVrHJPBNtnml5b5QllyOgB9az5NP8AMjB5U9OO31r0S4slKhSOn61lLbMGKnkd69Wjj9NDya+UqT5ai0OKawYtuPUCtSxt3yCRwOv/ANYVvS2CLgDjNMjtZEkzjKtg/U1v9c5kcX9lKlLQpFBGCecHv/SuVvHO8nJrubtdoynXt/hXJOHeceaflzzn/Pat8NUOXG4bsYod3bZj15ohDwk4J649q3mii2hlXjoO/FZt3EEjLkdRkGvQjVT0R4tOjKLvJluM712k9enNWJBshOepH+cVz9tctyDyAcf4Vdnu32hm4PTFZzpPmsdNKcZQ1OI125uSWSPgDPPSuQeKSaMebxt6Y6mu/wBRh8w79uc9fyrmJIGRs/xdfoK+iwldKKSPiM1wnPUk6mpyYginm8lAQuN2ev41qWkWIgsjc5OPp1z6VsSafGp8zOS3ANUf7PZT8wGD2z/n616KxSb3Pm6mUWha2pJBGkchmfAAbrWhauFmZTkDH8+35U1bOVrJgBh89D9OKybeW4t2McysGzz0x7VurVE2mfKNzw1RQqR+Zcv5isjRk8Nx15z/AJ7VmSnyrfGOWz19unFaU1wpjJZgG6jHfv8ApWDPP5sPnS/Irc461rSTtoY1av7zXVv8EcXeWguJcbTuB4+uev5elbVjpp+1xzIzEoOQ34dKozpI0wliHzLwPXrXb6P5TReY2OBgjp/+uu/EYqcYXR5mEyTD1KrjJW2f3amvBdSWSKEPGe3Nd7pOoC4iX5c57e9ed3s1sbFjH97v60eHtWeNSJCDjv0wO2a8qthPa0nK2p308zeDxqpuXutHvtqN6BQOff8AxqwYEe2LuCcHn/61cnp2rNKUdGwzDkdSPaujW6kZWRe/pXxeJwk4s/WstzmhV0T0MXUljycMBjJH+TXlmp3DAb5AcgkcV6Le2csrtk49K861GGVWKKcnjk/Wvby1RWlz5zPVOp70VZI5b7G11JujGSD1PH/6qSbSpUw8Z+Y88+9b1hbLFJuJxtHT1q6+GA3qCOmB0r23jJJ2R8jLJKMqfNLRs4k219bxh1HA5IHX/IrQtNRjVQ9zxjHIHr/Wr97M5GxTnHB9MVmQ28DlvtA4bG30/SuqNZSXvo8vEZY6ck6Lu/PY6zSrkM5b16ZPP5V2tlqAWIqDg7cc+hry+wube3JjbgLyDnsB61trcEosivgNj9etedjMGps9HKM3qUEubc39ZvRKv7vo3BrjkKRncwBCknPcZ96t3168cbgAMAO/cnjiuQvjcfYGmi+7IMfl1rbAYK1kjHPs+5oSnJXaV9P67nVyXsflZBXLH65z2/Ouf1BYjGSpBYHJwecZrHguXhgjUAALjJ4wOw/yKfNebwdxxnPA4r2IYVwdj4KpmCrRcrb/AKkcNwlnHuEhwxyBxwT6ZrobfX4oLc5BOcYOeM/X0rm4NLknnMzliMcHPX24pt7Gzo0bZCr7d+taVKVOo7HPh8diaKl06LzMe/1e7udTLIxJPyjHYHoK6W2guBb4mJIf061w7ztplyt4q7ieTnpk/wAq73T9V+122XHzE49cV3Y28aceRaHzOQwpzxNRVJNSfTpb/gjZ4UWHyHUhVJyfYf5/GqUdrAwZiMEjqfb1rpgsMwKMdxbgZ9a0bbQoY137dxPJGfyrw549QWp+j4bh32klGKul+B5xeW5RSQOGxjHTOasyadY3FgYXjA24PIzzXU3ltGmV24AyBxz+Nee6peyWhe2wWj6n26114SvKrZRepw5rldPCc1Sorpqxx9/pCSWs9vbcPg4PccccCvlTXNM1LSr14pEZUzwT1r6+ubu2SRfJXJYgEjscZH8sVwXiO3h1SOdbpVUsOB/dA/kfxr9K4ezSdGTUldM/l7xL4So42KdCVpwv6PrY+YWmkKnPWqMsLPJu3Emta/tjazMoB+U4OeKpxglgXOOO4r9MhPS6P5liuU7bwJ4J1jxtrEPh7QVL3M/C8EgDuTjkCv0A8I/sv6h4Q0d9W1ae3upFAWILkcn72QQO3QVF+wz4q8J6LDf2wthLqjtnJH8BGFwx6d+lfohf27a/o8WnxwGDAG7jOP8AI75r+M/GfxgzXBZs8spQ5KUbXbteXVvul08/y/2c+hN9DjhbOOFKfFmOq+3xVXm5Yq/LTs2lF9HJPV32drLTXxr4PfDrQ9GjZtat1kvrpgSrEkbe30GK+k7z4UeDNYML3VmsZiBAEeFHPXp1rhf+EVaXUovtSFTAUEZLY3+hP0r6LjR441VuSBz+Vfwj4scdY6GJp4+hiJKUr7N6abLXax/sf4U+GuU4LK3lE8JD2cLWvFO/Vt6b31OB0z4aaFpt7G1kGWOAARgnOD37V1Nz4Yjh0e6tYFQvc7izYx948it+NGAz71rxBZosjtX4ZmPiRjp14udRytZ/c7/nqfq8eH8Fh4OFGmorVaLyt+R8i2HgHxDfJdtZSmFrY4APCs3YAe3rW94J+Ht8+pyP4lIuY0Ubhnjf7HrxXvmsWQawkSzwjsc5P1rF0exutNs/KnfeSck98mv1bMfFCvWy6rVhOMXLRaWa7tM+Lyvw0wVLFU5tSko3er91+TQzT7FtNknRXHkuR5aAY2KBjGaydQj864xFyBWreSbV571Rt2EvOAK/lPiR4jN8R7arG9t36H7ZluFjh4e5sYz27xoSK5XWvEK6chTIUn9K9Ou1t47R7i6KxoikkscdK+OvF3jKw1C+kkjOwA4AzwcdxX6B4Y+GssZXdanC8Y9f0MM24twmCh/tEkpPY6K68YTx6gAz/Jnmunn8S6ZYWTy30iglcgGvmvVNWtiVMbZxXB69r91OhhIY46H+Vf0bivDaniuSk48tt9Nz5zA8deyhKqpcye2pzXxu8VPd3jeQ2FbIABzjHY18eXurCYsLk9emf6V9H+JLRNXtyGHz/wAR/wDr18z+MtDubNTJAep7Z6DrX6/wvldHDQWGjpY+SzzNquITr9zwfx1pyTx+fZnPfJ9DXzBqJuLe93+55HpX1H4jhn+xPtOOxr551SyLgspyxOc1/QXDlW0LN3P5a44wsp1eaKsec6tdNKSZDx/9avOdRJU/Ka9B1GzaNiGHsPrXD3dthyzDgV+kYO1tD+dc+g5SvJanMzzF0K45rIuE3p83etm6VOX6GsuZ0CH1r26bvsfnuK0b5tzn5YdvvWDcRnOa6WVsHJ61jTsM8Cu6F7nztdJx3MUxDkkVWlJJ2YrYcLsLVmyBTncOf8K0uclSnZaFYRcg9jSyICNoHHrUnmBevOKkDDPA6inJscIxtfuVFiFOdAAGFDEL92nxgtw3rmod9zohytcpIjjIHete2fsw61TWHuv5VpW8O7rxis5SVjtpRkp2LtuuZPeuv0+w8xN4Hv8ASszSbESy4IruwqQRhVGSfSvIxVfXlR+hZJll4upMprph++e3GK9F8DNouk6gkurL5i5zgV560rBt2fao4r1hIMHIFeViqEqtNwb0Z9lleY0MHWVaMdUffMmpeC7nRY5p/kUjIGM5P5965Syk0C/ulitBt8w8+xNfLVp4ovUthbM+UHY/0rrvBviLbqiSTShVU55PGR618WuFp0YScZNn7J/xErD4urThKKV9NrH25b6G2nXMKQLtaQAkDpX0PoWlIlkmfvcE+ua8w8B+JvCnjCS2sHlBmVQAUHfp1+tfS1posNtCQBhRzyMGvx3NK9Z1I0KkWpH9GZe8JDDyxNKScPJ9kYqaW8HI6YwRVZoA7bEwueSf5811+pWzLGrJ/F0FZ2jmFrtbe4iyCfmJOOB6V9PlGTVoNc5+JcXeIOCnSlUpe9YhjsnmtnMJ3bRtH1rzHWfDX9oWrW94gbb37g5xmvoyyg06N2js1z/9euc8VaI+BLakDP3jxmv07IMweHap7H8P+JeWRzerPEtXi9LeX/APifU/hxYyzb3Lsw/jPHB4ru/CVhb6TCICoG0DB9senqa6HV9M1dLr5SWTGee3euJnTUractKWzKThcZHFfqn9oVMTS9nKeh/K74Vw2WYv61QoWd7N2N/xU2nzWUlpKi+XIvPrkjIOfXiviXxLYxWkzy2uSuSM5yP8a+trldSv1aKZPkXIEhP5DH41zEPw+sri3Y3zYLk7l/8A116OS5rDArlk73PJ4x4ExGfJV6ceXkT1tb0XofGLtIF+cYHv1rMeylucunBr2nxR4FbT9XeCKN/soOFP64z+FcU3hLU3uGjtVO0c59vav0ejmdCcVLmP58lwvmFKTiqb5rtWSvt+h//T8E0/Rr5Na81lKKx7jJ/Ovoi7sLbUtBjjkG5guFBHJP8A+uuNv9F1K0lbauQCCD161n6l4ivdBswtl8044O/kfXiv4/xNepmFSnKi1dH+r9DD08vhUVW9meV+M9Is9OmeGTKyMMge/cYrydZmFz5mMAHn6V6R41uzqEaX8zbpifm9jXnp0u7ZAwGSevp9a/csgi4YdKq9T+feKJqpim6S0LunaqLe43Pja3OPT3qHxz4ktn01be2jHmSZDcdumfrXLaxp9zauoDYLt/k1Vl0jUdonuD+5xgE9f8a/Q8hyOhVrwrTlofjPHXF+Lw2Cq4ajDV6X7XMnQnddYihkI6j73Svrrw/4hjgVAu3co618jxQPHchwobByMelewaBqhmBGDhACCf05wO9fq9WKmlfY/kDGUZwbcVdvU+p9B8RfanMjKQ6HBzzwO9fS3g0iS1EyMSrcfT8a+EvD3icxSgSDgnb6fn619bfDjxNCluI2Ockf54r5HiDBNQcoI9HIsXNy5KrWp9BT6cZsFRwOeM4JplppzS5WYYPTnvS6f4mt2yG4yB0/KtuGaUSbx8wx196/P51KsFaR9R9WpOScTn5dGMYOFypHpXO3+nxtEQ/X3rt73VjKzWwO31qjHZm5j3NgDt3/AFrrw+JnH3pnLi8LF3jHc4i3snI+7kDkD0qCRGMm9Rgjhsj9a7mayCEYP5fyrPmtIJ4jwc46V3wxd3c8yeEajZnD38eyPdGPqawbe0WXc31xnqK7ye3ypLcke3UVjw6WJpvO24API9q9SjXSi2eTi8M3JQS0OfhsDC7M69a6XSZGh4UHg1srpP2kFcH1OPT3pbS1a2YhRnnI4yamti1NNPcWHwPs5c62PQfD9+DbKuBuJz/gaj1LVroShCxB5yKz7OaO1/ePgACsG91EvITnGcn8O1eLDDqVVySPRqV5RopX2NtLt7w5lfAX8q4PW28i6IznJyR2PHStSK8KMC3AGPaodSWK7tGkkG4jkfU17GHpezn5HmTrxnSalucgJUubrbbrgj5mrqraFRbeYRzzz1rAh07DLLjDc9K6a3WUjbg4I5Pau6vU0VmeThcLHX3S3Y+RktGvzY5z1zW5p8h2sG7HPBrGtl2v0xjnPTpWgsywzFn+XjP51wVZKTsdUKE4e+ti2t0RKNw4JIrq7JhLIoyQPp2rgIGSdi6kAcnHeus0uSS32liCT2Fc+KhZaGmDSk2mj060jGwbV49Og+tQ3C4Yg9etWtK/eR5AwG4q5Pajo2MA/nXy7rOM9T6hUFUiclcPKBle/vWjpqiVNhHPTHfvzT2hMjbVGB3/AAq3BF9mU+p6EV2SxKcbHnLA8s3KI+GFYH8qMYPJOeayr+33vuIIPTH+RW2g2L5pOT1rOmdmfzCp/OinVvIVTDSUdSnYxAfPnI6V1FrO2dinAz+nSsaKEyRmQZDA8VLFc+S25s+9a1IKZ58K3J5HQBiZAp4B9qrmRSxUAFuT6VBHdeaQVwS3NRyyOBvbIB/n9RXIqOtmenCs+VSK9+yjIj+8a5a4uXt02q2D0P41s3MhnOH421zd8jc+vtXp4aNrJnlY28lZbGhZamxYbj07D2rsbVvtMeSc4HFeaWyyeZuyQRxjFdvptwzgY4YcH8avGxW8TgwFCcbqeqO/02GRCEx8vbn+deg6c+2Ln6/lXEaMpddvT869CsrbagePDY/rXxOZTvoz7rLouKujWgLSIG9O1WbfJbyyBgCi1t28s+YMd8VYiVYl3Hlu30rwJVFqeyoPmROYVHzYzxVJztPy9CK0dxYEsPpmqwR+WXnPH0rnXmddtNDPmh3KSOR9a5u5tGDAnvxXWHcGLDkVSv4UCk5x6V2UKjizOtaW6ObiiwTtH/16tQ2aMnzHOP8AOKYZCrZA4GOlXLYktxxXRUlKxGHguba5lz6ar/dFYl/pIMRXH0r0dYBtPp0NZ01osh2v0zUUcwalozoxGBTi13PNLWzEBDINoHau90+dnj2MDnGKjexAfOPlHFS21scbFPJPWuvEYlVFdnm0cJyO3QuQRPPcYTj171euLMY3k446iooLV7NwzMGX1qSS5ESks3TpzXE5ttOJ0vD2h+8RhzQqM8A4PWqQtiTjhj/nmrksnm5Ud6Ysbpl26Y9a9JNpWZ46j791sYl1blR8oxWfJEoXeQT3roJ28xPmA9KzZLdiMN09hXVTnpqTJaswJFL8YwOOv+elWViRlCEDNX5rfa2D+VUFjKtjJJFdkZ32OOtTcXeSMq/hREDDv2+n+fWuUukKsc1208nmExc+v4VzWpRRhQy4+vv+dexhJO1mfO4qzu0c60qjBbnFUb+VWwMgjrUVyoYDYc47VkMzJ8xznP4171GknqfK1KsoqwiSKj4TIz1/pWihaYeWwxjmq0Me992PfFasVspG5SQcZ/8A11rVmluc1GjUadmMltHaPOPbA9q5+807f82CAK7Znc4T7ymmywK0J2rgj2rClXcWdGJw/NdM89msihwg79B0qa3spHAwOfXpXSS2SF946DjOOMVPaW0ZBYDAXoa6ZYt20PNpZRBycn1II9PXbtUE+3Fcjr2jyb1lAydpx/hXo8AKqS/061Q1FYpYtr+nfing8ZOFTQ5c6yijUo2loeJzs3kiOThhjcTzzWHLveMIvCnqK7O9iSdyqdQcf4VjzadOSPLBYeor7KlVS1Z+Q1MLKUnFa9DmZWa0Hm/eXntzmmWmoSorJIpTIzyetbl3G0KhG4JP8+M1zmtmOC1SeI7SOTn+tehh5Kp7rW54eaU5UFzxlstjZtLwPgsCCcc9e/Q13Oj6daOu24ONw5J6814Xb6i8kWejck4/z3NemaJqkcPl3FxN8uOn1p4/CTjH3WeXlGOpVpXmrru/xuesWVulpers+6eB6/Wu4gljZhGo5ANcTpU8d7/rHxgZ59K3LQ/Z3L+Zxj/9dfIYxc2+591lNOpQn7q91u5q3lus3zp36g9q4PVtMaQfL/B+FdO1+VkK5H06VFK0MpKo3QY5rip80Gj6+k1Ug1PdnAR6bcRgNKTs/DH51DMQkflxggHqemMV1kjo4MR/D/PeqzWCSAFxnA5x3rup4uz94yrZMpw/dM4e5hYj90AMn06npmpF0iSZVcgHoRg4rrJLdXXaOq9s8/nUyWzRwrITx6/5FavHcq0OWGQqo7TZzDaSsUfnOOMdfrWFMTFPlASAOVFdldF/J2M+7ccY4H4Vx99cx2/zZHI7dfau/A4iT31PnM9yWm3daWM29meeFo2JVd3Y56VyM+r3Ec3kAlovQ/Xr6V008izNkE5bqOxrg9Wxa73jXjnBPp6f54r6bCQT0sfl+Pi4J3e25s29wJefujnbyO3r/kVNHcRSlUTDHgY9Ca4WzmkfM2Cy56j6+hrvNFjEiNtXPOee38q6sVFQVzxcthOtJU1odvYXdqsflyfeBHufSrdwIJrc3EIyp6/SuKaGUXoRDw2M9uK7ux8sQ+W3Ixjk9v8A9deBiaShaae59tl+KlXvTcbKJ5hqumS3IXsmWwBkZ49e2Kh0q2ubU+WOMd89Fxj0rvdUtIDGpjz3IxXHM09reHcgAK4Bz37jHTrXsYfFOdPlPjcxyanRrqf2r7o9E0u2Qqs8pGU649R7V0DXqxwFk5Of0/OuAtrqZIV55bp1x9K7GzgglgAfoQM5/wA+tfKY6jZ80z9eyHE80XGjo7GPcWVzeNsUFQf1zXI+IfDN3BpE9+BzCCzDvwex/wATXtNtHsGxBj37c1xXj+Jb3wvdafC5jaRGAYH2PFLLMwmq8ILRXR08V5BReXVarV5crt620/E+LbvxTavdxSxOSVw23pzznqOcA1r3+rwSW5mDFWcYGcEbieh789K4u78D31raMxcB8/Kx9AOfpXnk9xf2MhtZmbKnqcj8s81/QuHy2hWt7GWx/mtmXE2ZYLn+u0rc/wCDPVL7wzYywm5YB1Zc5HJ9T/nivJ9QsJLeTywTke1bmn+ML2yyJD5i8nknqRjjHT+tcrqWtS3shaTlmPJr2suw2IhJxm7o+Ez/AB+ExSjUw0OWXVW/Xrc+/P2DNL03UfFOo6VqxVXnETwFgedm7dsPY4NftDqGlvDYx2Gnt5Ue3G4jLD/Gv56f2Yfig3gD4paVJdui2dxOiTtJ/CAchh+PBHfNf0T6VrVrr2nx6lb4aKQZUjofcV/mV9NTD47Lc/pZlJXozjfyutP0v/w5/wBFf7KHivLsz8OpZVTsq2HqSjPo7SfOn5r3mk9NrdLleXQ4LuGBp8CaEABwOuPUVuqhkwTzgdhVYOXmqK61LyYiFGD296/zh4o4vr4qKpy+FN/0vI/1PpYJRf7tassyv5OIweScVailWIkLwT2rjJ9QuQ4J7c8VHHrEm/aeTXzmW1Z1qnKle56jyybib13fgv5TjjJxVH7bE6bGPT3rOupQy+aTwa4u+8V2FpBIswLMOBjvX6XkuQYzFxVKKuiq0qNClz1HY2tRuxOdsTgc1y194nsbSIgOQ69T6YrxrU/G0ttK8m3O7OBmvLde8W3Uquvrye3T8a/o3h7wgqzcYtadz8j4i8Z8Bg6cmparofSPjnxHpWo+D5Xmu1iKfMFLfe9sD1r4wk1Fb69SIfdZulZl5e3l8pjdyw7D61SivDYqFPDevev3nhvgWhkOBlShLmbbaXY/mjG+I+I4qziMoU+SlFWb35tfw9D0zWhaRXi2sUaBcAcAcmsW+0u0kk8yWEbRwDzt47VgwXf2mVHRvmUg5/8Ar11up3Il0aSJSQ3BH/1q/LM4xmIp1FBvXY/sDhzKcJ7HmjFJbpHg/iW9jhuZFiAAzyB614D4svPtJePy/wAM9PevVPE63EETk+vNfNPiDXzEXjmPJyBg9K/ROHMLOo01qz53P8VSoQaeh514ntW2NkAJjJ/+tXzrrEcizSbOMcfjXuGqa7BLARe8DPQda8b8RvavvmtM7Onzdea/csjpOK5ZH82cWV4SvOLPK9SvNo2SgcnJridSmgZSVwDXQaqZHkJbvXF3xwCOuK/R8HTUUfz3n2KlNvQ5i6ycntWDcE8lhXRzHAJbvWBd7FQjHSvfoPsfmGPhZXMO5Q9qywgIOB061sXDZj/SswZQHjrXcnZHz1SCc9FoUnjwMYzWZLGxHFasrHsDWdLuAAHWtKbe5xV4ws/IpBQOtOxzinyLlen40iJu61V+4oQeyIxGHkGOlXAqoOemeKjKBWwOlT4zipkzopws33J4Sqkk9617eRcDisVVZTkdKtq+35aynC+x30J8vxHeac+Gzmt+KcMuFP1rh7GchRkcVrQ3pj6V5Nehd6H3WV5hyRjfqbs7of8APWqHCnj86gM5l5FOlPy8Gs1Cx1yr86uTNIwXI/Gp7e8aNgyHpxmsWW8ONp4qul0YznP51006N0eVXzCMZqx9G/DfxzdeG9bg1GGTGxulfo7o/wC0H4YuoEuNQuEiwvzBu5x9fWvxfXVZosSIa6fStXu7hcSyE56Anr714WP4Uw+IqKvUXvI+yy7xPxFHCyy6D92R+yHhP426X4nuJbebG5Tldv3Sv59a9htde01UN2pwT90Eckn+lfkd8KLrUW1+FI5QoY4J7AdD+lfohFJm3jQSBgg4I44r5fP8RHBzUIxvc+j4c8P6ObUXiXNw1to73+895tvEcTxBEAVye44J+tQ3GrzOXlcbs15hYTNFCDIST/nmukh1Lz7RzPIFUfMSxAGB6mvFwGcRqycOWzFxX4UfUqSrwqNwX3kWsXP2g5YAcdP/AK1eY69r2lWMgF/hQi5Y54A9/etzxL4i8PWyqGvIvOflArA5A/SvkP4ueMdNspWgJR9xD5DZJIHQ1+jZRhHyqqmfzxnteFWu8vqU/d3T8+36no998S/CnmGMTvGX4APAJHfmks/GUUkpTzfMzwMH1r4A17xPJdSmeI4GePYH2qDTPHOowOqSOcZ5xXvVV9qKNsDw1h40/q85tX6n3XrfiGKPKXqZB+ZSCOvtXDQeJbSS5McHy84ryWHxKdYto5VkLbVxz0qWCXbIG5XNeLm+bVOR04aH6J4eeE+X4ausTX/eNO+u34WP/9T3jxJ4SR1aeBcEZPT1r5P8QWUQv5rGQE4yPy/wr9FvGVtHZ2u6ZMD2r4/8UaBaXmqG7jGC3+eK/wA1fCDjF1aftZv3ej9D/ajjzI4yivZnyDc6dMlw32wYX+HPet/TdAnvyBbY2kZOfT2r2nW/ArC0aaJA5GcgAnA+nFT+BfCdwytcWvJUkEN6gdq/puvxpR+qOtB6o/n2hwXU+teymtGeYXPgCzukji1KPLHnI6fhXW2Hwui1Kza2tIg7hdo3ckf59a+n/Dvw5bXLNpLiLbInQfyrrtF+GU+kAspKljXxFbxpjhm4Rq2kul9D6qp4P0cRaU6V0+ulz4Mt/wBnu5cxyXCYJYiVc8hfoOtepfDr4DKtpcW93Hujk+6W4244BH4V95aP8M1mmF3c43HBIxWlqOjL4cuPPtkUQdw3Y1xL6SuMxlR4LD1LzfbQ8iP0c8jwr+sVKSst767qx+UXxa8ERfDnV7eGG4EsUylgOjKQf1rqvhTrVxOc7w2Dzzisj9pWQa1rreILRlEaDYsQOeMnn8/rXivgLW7nTpt6gnceR0wK/vLg+riMbktKpiZXqNa+p/lv4vZdhMs4kr0cFBRpX91La1t1876H6J29/cR3qSKpEb9+wNeq6Z4jY/6PHySPl9vY183aL4thuNMjSQY+UBR6n1r0bwxqETJ++P3jx65NeRmGAdm5rY8TDY6La5HuemXF2HbzHPJHT/Cug0e7imXypSAwPT/PavNLm9V2CoQRkqT3H/662dCl824CscEYya8yrhL09TRYnkqd0envYCToTxWUbQICCeSD1rpdOKSxEOBu6VzmqTGCUkcgcn0rxcPOTk4HpYlXipRWhxcq/vmV+B659KqQ3tlDcC3D8nPpzVq4mVh5suCp549K5Wb7KboSRc8jb6/5NfSUlzXueFWjZJI9b0pIpI8YIOOvtTHtVhlDrxu7nFZ2k38YMduG3HvV+8v0WRsn5RznFeY6cuc7ZVn7O3Ybe2+whY888niue1WLCqIcAnt/Ota712AxiODDMOg55rkr3UWchAvTnjt7dq9LCUpXTseNja8dY33Iblcocgcc1li8aMbC2FOAB0xWhGxnVj0VuOPSse9gwBgY2988nivYppXszw6kmoKUdjpYJY5EXecYINb1g6EHsvTmvNLW9kBBHykda77SBI6BnbJc/lXPiaVlc6cJWaaSLtwgAyo/GoZyk9sbeMfN05HQ+tdjHppuIsKBwKyZbZrUNHKufevMp4lN+aPYq4dqK7M5vT447BhI7HjqetdhaXBu+Yfu4zn1rk4rdr5nRFxgEEdvWu18M2EZsycEsD3549Ofb3rfFySXM9zzcNTlpTjseg+G7plRYGOT7+9dddJvTAOOO3vXBWZETZQYOO/1rsbeWSRd3UY5r5bF07y5kfR4SpyQ5dyNI0AJA+7xxStGq5OOc9KvW8HmymRV4ParcNo3mfvBz1rlckjWFa+qRzLJsiaPoM8etVMiNsHqOp6c1u3cDeYwHGD2FZ5tMkl+QT1/pXRTq3WoeyTlZElhcJ5TxryeuQMUy6txzITx6dKv2diI181ux6VLcFDG27sccehzVKrafunNXw0ZQtM563Z4nG7kAEc+9akjHydz468elUbh44QQSM9geaq/aWz5ZGSf85r0Euf3jxJNUpcsdQnik3ZxyeDj3p62BmBBH0Iq7HKXChl+hNdBZW6xsCvIPvWFas4o7aFCMnzLqc5DoyoQMcjmtS0tdjBWGB0xXT/ZMMQR0qU2mDviFeXUxzbsz36OXJLYvaVmMCLbnbz+Neg6cD5I3KRj+X0rjLK3kjUMATnrntXf6fHI3B4zXzWYV+qPewWGWiaL0b7JGVhweM1f+UKMLx2qGeFtmQOQOKWK4Votkhx2zXkKpzK53YjDcrJJeGCevSntIqJtWs6acKRnoMjPWq1xdxxxhg3XpWkaTdkc86mtyzJcp5e1PvdD9MVjXMruoZ6pnUFJBKgZqH7WZyFJ6GvRp4do8yWIixHhO0KBj1q/arImF6gUxGEQDMcZ61pRT2rPheC2PalVqNq1jpwlPlfOnqX0UFee1JKmG4FNV41YRp82fetJYjJwa8ip7rPcw790w3IXK4xz9ap+aEBfsOtaN3bFct2zzWI0hjGMZ/nXdRalsYyTi/eRNJJKB8hOBzUNy4nGwjG3+tW4f3kJA6elV5AwjZSMccewrqptJnm4ik2ncwEmxchCDz37V0DyRyRBXHQVzwfZIBH1zzxmrsk6DBzjtgetehVjzNWPOpKNmOn2lCvb1FNgicLj2xUqbZItx7dxWjBbyHD4+X6VnOpyqw40le5kzWhx05PesWaFt2Md8dcivRJLeMRc/n6Vx+pDym5OBjj/APVTwVdt2ReYUUo8zOZmjHml3UHIzxXD6sjljH25/Wu1eZWb5mz3PpWBqkZKu5IwK+twjcWrn55j5QnGUUrHns7mL5VGTjPTJ61kS7mG9l4Ge/Sti6hJUmM9eM1UEDEevfBzX0lFpK58jWlra2g62nSQL5IwR+lbWGmYdFXFZtragDeic1uR2kwUuOBjHSsakopnUlJpOK3GwgK2Bjao5NbKRK8LBOex/wD1VnLG33wMZq1bSFFxgjj8a5pq+xpH3ZcrKklu8fyjk+/41AqiP7o/WugaS2fAYZPvx+lZdzFFAhOcnn8B/wDqojJvQqUowsxQImTbgEnOB0rn9Ts5vLLHIz14p0upRg7ey9etWEvkuYvKHQ4z/L867cNSnB3seFm2Lo1kop62OPXRFUG6YfLyPxHesyNJd5jI2ofQ16k9iohHl896wp9MEZMiLXdTzDmbUjwKmQuEYumrdzynVLWKX5Jl6j6Y981wl5pc0kn7zBQdQefy9q9W1yIJIZME54Pp+Fcz9nclY0yMg44689819Jl+McVdHw2e5HCbcZq556mnpCSluCBnnB7/AOfpXQ2VhPIUWQnCdBjpmujh0iI7ih2v0Gef8Oa6KwsbeMlpRkj/AOvXZiM00PGwHC0paS0Rn6dK8T85+XgehFdlbXwcfvXyemKzNQt7UxllGcdh61hWt+kMht5mP1/z715kkqy5kj0pwlh5ezbO/EMF7lM4HXOM81QksmgbJPGc8Zqtp186ykRfP/ielVNZu3QFT94j8j71ycklLlPTw804cz6FyOWLdvQ962vNj8jCc5+9n61wOms7KRL3PB+n61MNRaDETEjDYOf1PvU1cJzOyex6mCzb2dNTqqykdu8au25RjHFUL11t7bDfgOT+tU4LyaWFgp6fWqcsjTfu3/TNc1PDWevQ762OvG8eph3Nz5yFOuOee+a5XUACu9uQBwOvJ7+1ddJYS7iME465H41j6lZOSSU2qAcZ6ZH8817OHnGMkkz53HRqSpuVrs4a5+1mMvCwCgYwDzz/AJxXK6h9plwt0Ccgjg9+P1r0lYHhRmXAB5xjpXOXlos8u+Qbgex/z3r6LDYxLQ/Psfkqleprd9Oh5/YSXEJlNxgYckA+mOc12Wi6x8o8n5lyQd2efzzSXOl/Z4NwIyR0xjB/xrAMkenxIegTII9j0PPTJ/WvSnUhXWiPj4YGpgLOUun6/odK2uMbxnbGATn156ev6V1VnqDSKFTB9cE9+9eXG8tgSy98HufxPoK6HSdVT7NujYEIT6gnn178dKK2CTimkcEM2dOv7OU+7PVLKVZzsusqWPTpj2+hpJtLjMxbbuCnPPHQVgaRqcF4qzF8NyAc9Dk5z6V29sYZCRw3T5iexzXzeKhKlJ9D73Ka9HFUoyevmcveokaeZHGMA5Hr61h3PiO40tcbSQeh/SvVJtKt5rcrbn5yOvfk15zrWgXBfGwPg568cVtga9Go+Woc2f0cXQg6mH0fSw+38axSRkMTwTzx2/lXC+K/iFZvKbZSxOAW2kZA7V534z1HUdBuW0qPapkXII5HH9cjvXg02q6g924uWLOxwee/TtxyK/QMl4No1P3/AE6H818deO2OwqeBV3K9pO21uh6vrnit4SESMeXjOT945P8An2rxzXLqHVLw3EhyenHA49OTXsFt4FvtRskur2UJHIo+Tgk8foK4DxF4a07RLlIVlLEjdg8YGT3H069K+tyivhac+Sm7y8j8k42y/OMTQWIxMeWm7btX8rHCwaReXk/lWcTSP6AZrcufh34niKgQeYznIVDk+vtXep4l020McWnkK0hwzHByehB9+9dL4e1nUNYbaU4RsEjjg9D2rTH57iaa54xSS7nTwr4c5fiX7CvWcqktuW3r5nh+l+FPEtn4r0+CWzkLvcR4HqN4zz/9ev6VfhRYXmn+E4NIljZILZFWDd97YRnBz1IOea/Mj4W/Dm6v549Y1wBbcuqnAy+3ruX0Ffrd4eglFlBcaa4ktWhQIGGGAUYzX+fP0x+N6Oa4ahgWl7t7vpzade9r/if7sfsz/AzE8J0MfmNdu1fk5U0k+Vc2/k20/u00uakUWZdhOAKlFpFMdpHA7mqMsxDiQ9/rWhLuhjJLdK/yVzqnOFZwkrWP9ZZ82jT3Od1OERzBY8Vz99buq74uuK2ri6iuXO08r1qJ496BhyK9fgzEOnik7X1PZpOShys8znvLlA4ZjjB4J4rw7V9aeaRlcY6/Wvd/E0VtYWEk9z0bgY9PevmjV5fMunkAAycjGK/0A8NMvw9ZurKJ/LfjZneNwlFU8POxzt/L5shJ5zzXC6s6qxDtzjPQ9K6uaWNNyk8gYHfk1x+pLz5rckfniv6SyrCwXuRP4M4kzjF64iot3qYJdnbauc9z0/nWPdqJgzPnKVcuJ5VfPYdzVZLldpmbknOR/wDWryOIqNS/Ouh+5+EONw8aXsZby1KcF3PYttTOTzz/AIV0x1mS6tvIVQM8cVxtxqKNMCPy71fjvo7WJjLgKo7V+VZhgXWmny3Z/YGVZhGjS5XKyPP/ABuxSBpQcYOCO+ea+RfF6pIS7EhuTj3NfQ/jS5udRkaaPIX+7mvnvWNKupy5kBwSR+Xev0XhrAexinLc+B4nzRYhWi9D511YytKxByeoA6/lXnurSyCMoc5617prHhyYgNjJ968s1vR5IyW6levrX6ll2Ji2j8VzzLp8krnjWoGTcc5559a465zk5r0e/spNxz1J7etcXeWjRHYRznmvt8LUVj8VzbByvfzOKugSPk6etc9dJ3auzu7cqTx9M1zN1DgkfrXuYap2PzrNcIzm36Db2qnMFWtSWIjkd6zZBuBGea7lI+cnCUI2e5mSAHkGqjLhgTWg0Y256CqRJY4FbRkcE4233K5UHmoyhGBVj5fumnhcDjnNHMX7K+pXYA0i8uMU8hi3zdBUgA3DtiquQ0m7olTgYqaBNx+bsajAydxq/EgYfLxWTlZHfThzMvxblOFPFWVfy+fyqKOJiM461P5fOcVzM9mnz20NC3YkDn8KZcXDr8v/AOuljULyP0omtt6nnmsW1zanqQpydOyMt5N/K9hUBkb7pHXvVryjETuzmkZVOWxXTGVjxK1KciKM5XHWr8F1PbkEdFrPyA3PQc1Cb5XGxuO1dUDysTaKs9Ge9+DvEIsdl1HKqEdc9fwrvr341a9YyAWV4+FXbkdK+R0u5Yh8hOM1oiZgnmE++DXHVyejVnzVEme9g+OsZh6HssPJx+bPu/wt+1Jrlnppt9WiW4A6MfvfnXn9/wDG7xLqOrSvDdkLdHDRjJXHoRXyFcajciNljYj296zINcktp8FiD60YHhfCUpyq0oJNnBnnixmeJpww2IqNxX4/15n19qOu3pIubmf94PevJde1oXFy3nSl89MmvJH8Q3Mkm95Cfrmni9N2/ms2TXpSwyimj5uOZ+0kpQ3N65vZJG2oeKmtJZZZQq9R6VgiYlht5NdJpy7W3H/Oa82s+VXR9jldJ1XZs9V8PyPHEoJ49q7eKSST95EScd815vpcyrDgEgjpmur0vU1JaGQEDue9fKZhTeskft3DuLi4qD0R/9X9HfEWgrqsJ8wnHI6V4HqfgOSO9IjUkZ4wOn519fXMSfZ9ueetYqWcUj5YAn1r/AHw/wDFGtgMvhKo9LenzP8Ad+oqdeH7xbHzTb/D9mt/LnGOOT/LNXtJ+HkEL77JBjuPX1r3+fTA4yOM1sabpEUabu561+gV/GmSw7qe036GE8BhIJSaOO8PaA9hFh4gPSu3TTIZkUMgBBrcitVj4UcVdht8JuHWvwbiDxMxOIrOpR38r3/MwrY+ytDQxYrRY5SvbHauU8dWxHh+5MShz5bYX3xXoUuxAexA614v8Q9H1PXFFvYymJFJZmzgCv1zwQWKxOa0sTi5csVrdnk5lVnLDVLK7tsfij46+3w63d2F2hSSN2G0nOATn05rgNOY290HXpnn6/jXrvxT1O01DxpfpEVlSKUosgPDBeMg/UV5i0EzS4XgDkfhX/Q3w5VcsFSlJWbin+B/gf4h00s2xMIS5lGckn82ewaH4iMXlwzHqcjvx/SvZtO8SsbUDgDOOtfOej6fc/YzNglsDH+TWt/aMvmCEqwB449a2xODjN2ifHYXFTp29psz6e0rxD58vlrzk5znPSvVvDmoG5kDA9Dyen4CvlTwxqEtoxWEYUjn1r2LwrrJSX5Tzuzg9+K+bx+C918p7lGs1K8l1PqSx89UBJOB2zWBq98yXW+TLfLjjP096j0DXEvl2sCuF+grM1Jw0zS535OAfb618bSw7VR859NPEfu/cJJbZWg88DHHCn9OK8a1kanp2oO8OWy2eh4xzXtdjOHt1ifGBnr/ACPpWHqtgG3E5AJ4546V6uCrckmpHm4ilzJST9Tl/D3iEXLrJI/lSL1zwBXS6vdG4hEUEuZMEkA46j0968q1XR72G5N3CPlXqRWPZ6/cjVTbyNxjHPBBHT3r1Y4GM5e0gzhqYhwh7Nrc6281250QfaLkMygdM8j061lL4ujv1WXdwT82O1ee+PfEU0MElq7YLdz0ry/wb4jiXVh57/IXw+favfwmVKdN1Gj5XNsx9lNUV/wx9uaZcrcWavDnGM9f5ZqO5xL+7kPuag0iW3/s+JrXGxhnOe31qzJDtkLvn2Jr55q02ek1JwSexnRWKzXACHB79816hocLNAscgBIxzzXD2UbeeGUjiu90TzGlI6Y/P8q4swm3Hc7ModpbHottAUTDHBHGKyb6BXXzrjoDjmt9JQLVR2HUUyf7PKrRSheBnH8q+Wp1GpXsfVVaK5dWcCtolrI3kH73J4rS0pJbWUueMk59BW7JYwDsc8ccZxVqOGzVR2btj3rqqYu6tuc8MLzWs7WNC1kjuJQ553HnPUV2dkqSARDge1cPDF5CkJjnp9BW9p94Ubb3GK8zFRbV4nTQavaaOyh+RgD64xW8Y4dvDc469elcT9ow3r/jWrBcqyfOSR0AryauHbV7nfRrxhLltoPljQyFOvvxTHtEERYjGakJjaQSLzVm5VRCGABbrVwbViZS3MEOwjIPOOme+azJZovIKk4Y9x9a0LiLDbwcHFc3erK5CkZ+hr1aNmeS4vRMzC4mk++eSB+lXxAoJUc96qWMHlzBn5PbmukEAVdyc121q6i0kcGHwjd2uolpCSoj6811lpaKmwseBVKxtVHOOv8AkV0EIWNAFA6142KxF3ZHt4bC2jc0I4H+4QAO561ct7fEmHH0qSzkV1A28mtv7MZgOee5r5+vOzsz3cMk9S5Y2StgqAMcV3Nlp3RwK5vSn2zCNxXokM8YxGF6ivlcyqzTsfXYCnGS5mZV5DEIgCvHauE1ATWoJiwV56eteh6lCWTAOOM5rkbyCEqVbI/TmtMvqW16HNmELq3U437a0iYc9M1kapqRWEKpya1L+3eIMPTuK4m+ZwQ3p1r7HA0YSfMfC5hVlFciZNHqHmPuz+dbFnNuYba45VZZc/3jnOeK37UiJQ2eTXpVqStocGGk27M6iKQT53HGOlWAjpjByO1c5DdbVYK2efyroLS7MxXGCK8ivRlHXoezha6eknqdJZDfhj16811cEDHBBrEtTGQAOO1dFZk5wRj1FfJ46o73PtssoIr3dhmL3IrFk0tXA45runQMuMcGsy4tii788Vw4fFS7ntVsNGzbVziFs/LkHYd6maFZCQwGSPSt1bNJW8wZJ71Ktio5UY457V6Txeup4ssMnHmsefz2S+aNg4Oay9QtGibKduc/WvQLqJElOAOhxXLXQ3SYb5s9a9nCYmTszwsbh6aT01Mm0gb5S5/Cu20yOMW/lnp79fWuaj2rgcj29q3re4SJsOeD096eLnKaMcJRUW2ybVZykfSuG1N1uFIjByOvaupv7sXXyoMCuPuTJFIUIyfbvXZllLlWu55Wa4m8tdjzbULlo5evBO39ayrq5aSL5uc5+ta2qWbmYrJxnpXOTME3Keo96+7wyUkj81zJ8rcloECoI845/nWa1wquUHUkYPQU175lcheFC8Cs2VlaRpl7Dpn+derToatyPCqYl8qUDrtMjE/CsD34rqoLIrGUc4PUV5XpuqCG5DB9obtnOa9Ki1L7QQV4GMc/5FceNw84u/Q7Mtx9OScOqES1LuQCD6cVRuoGVvk9Mlq27Y/vCGbJxz68961otOSdSDgbuTkc1wutyO7PQUXOFkjzdoriOPzFNV5n3giTg4IPtXd6jpxtkCgZB54rz/Uy0km4Dbg8etelhcQpnz+OwDgrI5tpBHK0ecn1PvWvDJC0YA+8tYzRJcOfKxz0/rWiLQaeSGf0Jr2JyW19T5ilhvdcpLQ7SzvYQjBvm29P/rUqNDI7YXI6VyZ1KKDdGOM9TVu11BVfDHAzXn1MG9Wj2KWPatcr61p1u0TKvUYriv7Lni4kHJPX2xXos7C6YzKMj0rJ1GLK+cvB6HvXXg60o+6zhzHCUqyckjjltl2jg4x1x1+tWppDA2PbIP4VqCURlUkH9aoXPklyCeTnb7V6EanM9TwauGUKa5GZrOkyec5KsRjB64H+NctNMwnVXOcHPTOQPWug+ZVbeeg6detcrdGOZztBDLwcjk16GFau7bHkZjhG4RdRas3dP1QW97nHBPJ9q6K7EWpynacBhzXH6FZmadfNX5M9c56V6NDpKrteBix5zXBmGOo06lm7M+n4c4Sxlah7elHmg3t1OdhtJ7ZSgGVHpnAx61lGAvMGfdz6e316V6xp9o4kLrzt7DnNYms2Fu9w0m7BY9MdOK8ajxFH2rg18z9AxPhJOeEVeM9vs2/W5zVlxE4ZsEdDj0rqPDHh661+/FtD0zyxGce/5VykipDOUUg/if6V9W+DL6w0HSLR5YPKa8i2yEjG339cdDXPxNnk8NhfaUI3lLb7jk8PuAKeOzb6tj58tOlrLz1slf1seZeKdD07RFjtLflgoLOR1OP5V5dqEMLfMuMsQOK9M8RyreyyKpLcnDZzxntXm0tnMJsjkHrx0/Go4fc/Yp1pe95nf4g06Cxrhg6aUOiXTp/TOf8A7PR42jUYJGMf/r7VzV1YyxyfKny9F9Otehz26LGO5P58VRl0/wAyMiM4OeCen419PQxVmfm2Py6EobapHA6hpbPbBiMqM9f8OteWalo0txcl2+6oGcHOCAea+jxprTRm3ddwI/A1k3Phwtbloo+WB+n0PevZwWdeyvqfC5rwisUtVpv9x8oTs9lFOwDLk8AZ6dj/AF/GsmLWtRSwYSK0AWQK3qV9+OM+xr27xJ4ZZbSRo12ueuB6143qun3EytCykZxkZPPbmv0PKszp1Vqj+c+M+C8VRk5U5Ne67W87/wBWNrTteMc8dzE37sdw3BIPI711MfxMQyJbsfLBJUNnjOOnX9K8c1meLQrMhRzjHy9QSe9cPbauWlWS4IYA5x6kdulfT4fh+li4Oo16H8+Z54i5hkVdYOnLXRy7H3Zo/i11RC+MMOvQ4PT/AAruA412NWmXYgA4B6jr1rwDwV4lsdX0eO7kRUaL5R6ZH+Hb867eXxfawhopJFTceeRn8B+NfmeZ5LKNVxpxs0f1NwvxtSq4ONfEVVKnJJr+meM/EvwrqGpX+paujfuYSFTbk5weTjtjrkV83z2D2EaXAbd5mev1Ir73uJrPULL7IDvacHGOScjBrz3xF8MbUOJLuHgAcKemOQOlfb5DxUqEVQr6dvRKx+B+IXg3Wx9eeOy2XNfWW9k27/lpYZ4Illu/D0Es5YoyArk5xwB+QPas3W/C/h03DPcr5jsc9ORkngfia62wsEtbJYbUZSJdoUDAwD1A9q0Lews7+XfLFu2929R369c183Ux/LVnVg2lfoftVHhlVcvo4SvFSkktXqttWeQ2fw+sXuftUEeWJGAQcoc8YHrnr1FfZ/7P/wACZReLrms2KyQtJ8ysDhRzjGfXmvK0gjiTEaHOOMDHSvt39nb4hH+x5dFv2RBbsqqWOWfjjjtivyLxi4rzWnlE5YLXo9dbPsf199ELwt4afElKnmcVzJOUNFZyWut/K/8Aw9j3Fvhppcd7E0VusdqdsflL0x7/ANMV7fpdla6dAlnCmxEXCqOgArg9Y8SPY6U91awGR49vynuT1xj0rQ8LeKrfxRZLOg8uUdV9D3r/ADP44wub47AqtUbcYPXX8X/mf7VYOlgaFZ4ehaMpK+itp5f5HS6tFaBN8fJ7Aetef6lqF55ZHOOldBqt7FZMFmJG4/hWU3lXMe9G3D2r8QxfC2KclWrRvF9ejPusscYaPU5mykYPlurHkGtuS6ihHlisfVEFjCJ/yNeeeJfFkdnal1PK9eea+n4Z4Wr1sRGdKJ72Kq0+X2s3oc98QdWjub028WQFGOv514sYDcTGMnqeuaZ4k8TG9kN3G2BXNJrhWMP37Ec1/fvBWFlhsNCMFqfxB4r5fHGYibrN8qu1bqP1Bfs0u1SSw7Cuc1G1kmX5+APX1rqJdQiu2V24bgHPSsDUrxdoiTgDkHiv2fLVKybR/C/FFWNOcqUZfI4a8hJLL3GeTWJceYo2oB2/+vXSXkwZ27Bjkkdcelcu8ytKdw4PFVnUVKmz9B8J6044iHNum/uMCa1kWfzpDyxrOvGuLiLyAxwe9dTcYkOxTnFZH2JXZmU7cCvkqORVElUitz+k6/iLhJTlh6s7OPfr6HFTeHZ5CJZydhPf+tQS+EdPuNzuQB1ya9IMhSEK3YDn/wCtVK9tLa6gCR9f1zX1eEymbp+8tT8vzjxQo0sVyRqWh2/U+c/EfhmyjtSLeP73cjsa+a/EPh0K0iEkd8nuK+6dR0e4k3JCobbzz6V83+PdOeO4kQRlMjnjufStsNTqUZe8fb4PPcNmFFKnNSfkfHWp2itLsZeB6CvPdYt4YwVx+XSvonxB4I1WC1N6qgR4x179+OtfO+tLJFO0ZHTjmvucpqRqP3Hc/OOJ6MqUWqsLXPPtQTC8DvXK3cRzurt74gLksDXFXsu8Hbx1r6/DxfQ/GM1rRbab1MCXBBP6VgzIAT2rceTBOfesefOwtXowVnY+XxElOKe9jOm6YNUHKngd6mkbtnIFU3OWGOa6OWx5cqzeqQwumcGgNIccVWZQG5qRZMHaavl00OVVXrzaE8kuAOPyoD7scfnTnBJHap0X5cFeT2qVax0py5rXEVywxV6BZEHzdO1V0j2vuWteOPcAx4xWc5WR34alKUrt7E8MjBRV0ckkVVgjyeeRitaGNceXXHVlbY+gwdFy+LYjRCBg1ZSJzk47Zq75AVBxgnmp4goGOtck6p71HC2nqYc8XR8VjTF0JYc12NwN6Ejg1yt4AeMYNb4adzys1w7jrc56SeXO3pUBRjg960AiqcEZqTyo9of0r1oVOx8TXwc205MjgVh9/nFJcXjDCRngdajd8nOcCqEvDEDnNdMJX1Z5eLpSirRY6SZ5FO05zWBdNMcleDW3EoC7Se1ZVwjgsvatqVSz0PGxmFcoalGOc7fmPStzT3IwRWKbcA726mtO2ZUYZOBRWmmtDTLsPOEryWy0N/zCJMJzXS6dO2B2INcpA4Db1+ldXbRsVEif414eISP0fJ5tO53lrehhg4zXSwFSnmLn5q86tJFEg3n25NdxZXMQi8qRtvavGxlJ20P0rI8UpSakz//W/VuTYmVDZJ6560ttZmTiraWjSPtb867Xw/ZxwzFZ0yMcZ9a/5K8NnuJrOGEjK3TXZH+5mMx6pU20cktlj5ZRn6VcS1ZBtXoK9Jn06yCbtgx+tYN8IU+WP72a92GXY2E4wnK7v0ueJTzj2rskc/FBISVkyM1pBViTDcAUyKRg3zc45qvr2uaPo2kT3mryLFEqMSzcDAFf0j4feHFXGYuNKpTbctNtfkY43FqnF1JuyX3HlvxJ8faX4TtjG11HHO6Ex7iMf/Xr8zfiX8cPHOuaqUstU8m0K7WjhI9CDk47jkjNL+0b4wsvFviOI6FO89sEBXPQMTzhe36V85WyrExjkOd3bvX+4/gZ9HvK8owFKvXpqVRraUVdff1P81vHz6SmPq4mpluWzcacX8UZP3tu3+epg6xpsMahrctzz65z1P51d0OWwyqaiQOwJq9dwkwGIkAAYBJ6/jXn0/mSXBjAyidz7V/V8Ka5eS5/EeJxU3UdRLU+inawt7FTCQy45CiuXtxGt15h+bbzjGMj9a8+8M67NBF5NyCVz8u4Z4/GvQbe6tHTzzKFx25BxWM8O6ba3ObCYlVUpWsdjZyxwYdQSG4J9K7Lw9qMNtO1wHBAOACc8d+a8j/tW1sRueU5fjrxWtpmqQyoGjOfXtXLVoOUX2NVUVN3k9UfS2i6wFuRPG23J5HXNd3rt6iWSSJyG+brnpXybb+KZ7OZbcjKZ6nuK7nUviJC+kC0jYGVhjHpXiYnJ5c0ZJHp4XNea6j/AF6Hsml6nEWUZO0/Ma6WWRri33Q8jnqPxr528O+N7eSP7LPIAY1BI7j1r3jQtZ0+/sN1v83pjrmvNx2ClTfM0dVDHOp7qK2osYLXzCmSOueh9a+YfHguBcNf6S3kupwVH16ivoHxRrN2ls1naIA7HPJ5/CvA/Fq/aNLlY5D8FvX0zXrZJS5XzM8vN6znH2aXS54x4k8XXt/afZbrJcjHTnivPNNvpIb3yZHwGOc/571Fr+qrbXTmIEHOMj2rmTrqvOLjb1PFfolCgox5Yo/McxrPm55f16n3P8OvGs6iHTpW7/KWPrX0yXje0ClgDjjH+Nfmj4a8TXaAKQCV5JPseK9VsviRcxzRzyysFQ4xnqK+XzTIpVKnNDQ93Js+VKly1NtkfbFk8LwhnbDZ5/Cux0q6WWM+WcFe4r4nX4p3d3fomnyFI8Zz3z6Gve/BHi6fULYzTH5vyz36V81j8lqRp87Peo51B1VSiz6b0ud5ISjjcpP8quyRJIxaI4A46c57Vx+j6tFPD5BJLA5xnNdbaTZYDGcHFfE4im4SbPtcM3VhFR1LSQXE0QDj5h6VE9tKhDHkDqfTvWzAJJnRx16H/PepdQg8pRtGCTnFcCr2dj0p4SUtitGqyYLgnA45q9bRBCH6D+VLYGORNoBPqa07lViUYOQf8msnO75RzpNLmGRtk5U/KPSpWfcw8s46Zz/kVErCVTGgIp7ArlG+bA61MZa2MalK8d/UsW85jlGc9M9a3Tdq6ZB7f/qrlHbb8+eRVr7YZEC4PAxUVaSdmb05JaItNIrsUHcVnzWR8sTEc98mpYX2HPTbV37SChO0H36/jV6x2MpauzOceBk5GDnrWrbowXK9OlE0QkBde/bH9K1bWEGIA/eHB5p1a2hrSwy6lm2bawxzxk//AK66FI0kj4GCD+VULa13twP6VsxILYAkdu1ePWrK56kaEnoQQSmOX29O1dPaX52mNuCP8iuQeRfM8xuBxVmK8XOe4461Fehzq5NKpyScWz060ViytnFdtaCUpuXpjvzXkNpqxjAyeB+tdnY6+HjVGYDHb2r5nGYKo9T6LD4umtDory+VQY5TwK5O6u1Y/Kfu84/rVTVr0bi+eMYzXEzam0eWYnj0/KunAZZdXOXHZpaVjodSnMkYMQ4Arhr5wXCryevrxVyLUmkUqwzmqU6cb1HJ6V9FhaXs9GfO4yTq6pkDwgJv7cjmmh5YsEDdVDdNG53cjPAqdZXVAN2eef8A9VelbTU8+UW17uhNLMIjlDweTXR6VcxEDYOf1rlo4vMyrcE1u2MCxuWI9B+lc+JiuWx04JJPmaPSbGV3IPXtnNdzZncg7jHNedaWzjG3B9K7uzYbQy9RxXwuZU9T7/K6z3R08SZT1702e2d4ioGMetWLYkL0rRO50PFfNuTi9D6NVFKNpM4eKKaOTZg4q8u502EZPrWy1sScIOarz2Txxu3TH510e2Utznkko2Rwt9thds88fhXMHdMxz9OPeug1OKZwWPBPGD2rn1ilBKnGTX0mEaUT5nFx5mtCo8AJ44xTUZoSWOflOK0gjHBftxTJbcN0HHH513Rq62Zx4jD+7eJjxXANyQx+lQ30RlmEhOMcnFSvARLu6E1YuwBGNwzxXqU5JNcp8zi9Yvm0OM1OGLGFOT0zXnd7aRq/PU9/eu+1F9xI7n+tcXdiTzCAp9K+pwMmlufKZhhlUaujjLuNfuocnoc1zsss8IPl47jgeldvcRLu+YAcnNZl5Aud/GDwD/OvoaGJWzR8riMrkrzb+484iuHiuRvJIU9/5V6Fo+pSXLeVz8vOf5d65G/tT5rJHjnt/WtLTfNtYwHwOeoHpXpV5xnBPqfP4fCVKNRrdHrlnKCFOdrDjnqcV0y3PlruU5YjpXmEeoSSqEIz7/y6V0thcz5yefSvncVherPpMuxjeyNW/wBSM0BQH7vY155dO73GCcjGPyrq7kRspKDr1/nWOLR5MPjBHQ9f51phFGCJxvtZ2a1OSeGeCd2UEAnPp+tVX1UR71z25rqLqB0ibcM44HvXG3dsY42faDn+v5V7OHqxlueBjMDKK90pJqoa4aPHXvitKz1D96VmAAHA/wDrVynktG5IJCk/T8M1rqfLiwT165r05whsj5yn7fWUmdja3yyAKRtrS8pZI2z3GR9a4/T7kFfkxkc11ttiZNrnkV5GJhys+jy6o6kU3qY1zZzOjRpnjr/TvXM3EFxGpdgfb3Ga9RWEGHKrnPPNYd/bEnyVAJ7k9AKmnjH8J3wyunz87VzzURrI5iyQR1zURslhYsQOucV0t3CtsuQCxPUdzULwSTBDt2D6Z/lV0cZO/K3oe3j8mw8qarQj7yWhRim6JAu3HHbrXW6RfvE370nGBjPOK49t0D5yME8n/Cte1JVmc9gOKMfhYzpuKRycO51WpYuM5S+XRH1L4TvfDh0hm1GNN543dz6cV85+LdqapOkOF2uWAHp2rS0/VzaKZF/hBbB7+tcT4o8WWnlyXshCsV6e+cD8q/KspyDE4fHVakJNqXf9D+yM24ry3G5ThqdeCUl20durfc6bwl4SbX9VH2txHbxkGTtkdcD616f4w1qE3yWtnnyYlVMHnJHGevFfNHhrx48UwUPk8564revPFRug27jLDB9DX2bweIrYyMq3wxVkvXd+p+G47DYTBZVWWC/iTleT3dl8K9NT06S4t2ZUU4/WklslgUybcE/59etcemu2VugaQ7nxx6ZNS3PiL7ZITC3bv617Cwk/s7H4/Vxiuva7mjdWSoPODYz2xmkt22RtG6ZIOBnvisR9bNu0ZuDgHr/n0pl1r0UJVQdqucZHpXZTw85Kx4uOxVOEvd+43rqaGORdq4P9DUtvGk6urH5R/X2riJ9Qn8zzBgp/ET29xWrBrAghzEwI/Q+5NdM8A+XQ+aoZ7GNR+02MbXdMLh1GNp4AA7GvE/EnhqK2Yy+WAxHfrz717Zq+uW0hEmcbRn3P/wBbvXE63qdvc27AAE5AHPNfQ5R7eDR8jxNiMFVhKLa0Vz5A8V6RHOzW5cqwzuwcDk5HXmvLZbK5sATIQ0YbYDmvofxXoUsEc9xPgpsOMH/EGvl/W7pnuSUPAJ4x05xya/fOGMVKceWL0P8APXxeyOjCXtKsLTd7eh2Gn+K9U0q2NrbykRtnjr1/CoLLX757xbkSEsp3Akk59j9a4VZZo+HGMZBFTw3jRtjpn9TX2EcJTabSWp+CVpYi0YOb93bV6ei6H6RfDa2tL/SLTVrllEmwM2MYzzj8vSvW7ia0KGR1Df4nvX55+BfiRd6KYrOfc8e4AfMdoyeuOentX2NY6sl/ZJdQkMkn93n8MfWv564t4crUMQ6k37rbsf6J+DXifgcflyw9CNqkEuZPe9rX+ZNe2totxIAMKxAGOgrKae2sSIwQOw/P0re8m+aA3Gzr0wPSuavNJnvmwoAJGDk+vavEw04t2m9D9LzCjV5E6Mfeeyt3L1xeXEsLLGwwBx+VVbFr63mC2Erq0nzEKSMgew61X0/TbuC4WKQg7hzg8emOa+x/gp8JtP8AE+h3d1chUuNybCeyfxfQntXzXF3EuEyjCPEYjWGn4n6h4VeH+Z8TZjHCYNuFRJu97bK/3vY9P8E+ONbvdAs7I27PM6KGPUAY55qS48QXvgS+SdnDyyglkH3Qf8BXp2mWWj+GLiL7OCqImzDDI4zzmvnD4q+LNJ17WFt9KVlwCrFsD5j1xjmv5LyvDUMyzCdKjQtRldy/HR/8A/1PznHYnJcnhUxeJUsRC0Y/he3f5/cZ/iv9odg81jMqPc+XlXibKq3uD0rM+Gfxwj0nV8+I5Cba4XBIycHsa+YvEumRaPqkk0UYVWH51z8N4Z5gWAXj16cV+1PwryWeBlh4U/dktX1+XY/mzDePnEccxVSvUXNCTSj0t57XufpPrnxT8Lajp8iRvkdUJ/i75FfLPibxkZJnAbI9z6+teV2WolFCKduBx/hWZdXKyRMg+8cmvzPC+FmEy2s1h78vmf1TkvjDXzPBxddJT8jdn12XJQ5IA/CqllqZm+dvlPTPpXmz6rJDIwZtwBwRXW21xFPbb4sbnGcf5Ffc5dlyi1GJ8xxPm96EqtTY6gXhRAxbLA89q2LiKKa13jngHg1wkErXNwilclT39K9Nso3ezdQo9h0NfoUq7pxUEfxbmmT0qleeMe7e3Y8+vV58vg85bnHHasCUKw8tDksfyrsNRt2jLSoNpXOQR1rjrVhKzM6ncM8is6l5xsfVZFONJ85YTT3tYzITyf09KryShWDOvHTNdhbp50Pl3EX3eMjj+tUrjTGLAwrjPY124NxS5WfJZ/jK0sQ6lvmchc3CqcgcEY9arRTqAwh55HPeugvtKnVCdmK5+K1kYExr7fT3r6fAuChofkvEc69WsnbXuQX8qW8CTMck5yM8kV4N40vori5LSJg5Jz1z6V6nru+O33LlmHp05PWvHdYjE7mRzgg4w39K4sxjRd1J2ufunhFhswpTjOEXJR3MfxDLoD+Fm835dwB5GOQOn1r89fGrQy3srRKFxkV9T/EvxIttarZ23QDoeQcdfavjTxVqhmLAYLMc1twllDpOU73ufp3ipxTCtCnStZrc851KfblVrj7i5PIYVsahcfMd1cpdXKM5x0r9KpU7I/mfHYpOTdyMyEkk1l3D4yDUjXIUGs6aYuSTxW0Yu9zgqV48qSepTdzkmqLzbegyKnmYAYFZ78jJ6V0RV9Tz683HSLJWYFQx6UiMpwfSqrPkccCljOOV7VdrKxl7W8zXjc4wRVreDgLxWYkhI+lSiXB3CspQOunXS0ZrqwB65qzHORxmsgTHrmrcDhmwDWTj3PUjW1XKb8LZwV5q9bvh+ehrKgfyxzxV+2PmPkVzSS1Pbw9RtJX1OujIeMEUqJjoOKfp65bBHXpWvPamNDivFqSs7I/QsJh+enzvSxhXTKsZAGMiuSuF+bPWusuoi/AFZj2xOVA57110J2R8/mlJVJ2OVkhxweM0wgDCit+a1Criqohzwa7qdXqfO4jB6rlMWSBeSOKx7hCrkj1rtJLUgZxgGufuIMyc8ZrqoVrniZpl/L01M1FBjy3Ws6YDPp1xWq6bTjHFU3hV8D8a6oSR4VelJuy3KW0lfYVLBEJOD1q/b2nnDZ1xWrb6Xt+Z+MVnVqdDrw+Fd+ZmdCu1trLXT29w0KhevrzVLylK7TwRViNSgCEdP1rjnNPQ+iw1GdPVsttMT0ODVqymmaQBnIAptxZtKgkj9BniptOjljlxJwAfpXPUqx5dD2cBhqntkp9T/9f9nrPTUJBPtjitW6U286BCFHv0rpIdHMYAHI9TReaVkfvACMZr/lgwfCjpUnyR10P9kZ5nGU9Wc5LdSLCY2y3vXzd8YfidY+HtButO0W6Mep8KpAI2gnk5IxX0bcQbCVPzDoea+d/jV4Hs20C68VRIkkkXzusg4wByc8dK/tD6LXDPD1bOaFTNVzVLrlXTm7O6en3a9TweM6+KpZXVngXaVnd9UrPVW6o+SY/jZ8V/7FaKG8V3QkrKFAbjnB7EfhmvLfG/7QXjLxLpp0DXoogcbTPjLHnJPt+VUYPFEVyptYlAGTwBgceleceKoJZbguMFQ3pzX+2WReHeU0KyqvCQjJO6aSTv8v8Ahj/NXiLxYzevTlRpYybi1Z3d1b5/nucqxjlBV23AdCOODVExRTybUyBj8a7ew0oTWwmZNwxnpk5rC1HRZbV96gqD1x0Jr9bo1rSsj+dsdRjUinLVXOOvv9GjYuR9CevauSeaC6kz5mwqeR/9eui18qE2y/Mfb+deeT2M4BkztGfl969CktbnJUhF02lp/XU0bm+S1/eYBYHg9/8AP4VU/wCEjkIzOOemRxXPXaXc5wh5QDmrEdpL5AGfmP8AXrXoqOmp8zWmlJ2NSTWLi8InLY29B7VftPE82nxhVYMWPf8AWuethGCROMAZ6Dg+lc3qE4hlGOnb3quVXsiI0nVTl11PXIPE02rP5k7BNnp34qzNcpctFJDL80ZzgH0/OvBV8QS2khcfdrWsPEk4YEcIT1Pb8av2V3dHPGnyRa3fme/LZ6ilwurabJjj51PUg9eDXsngfxZe6XGQ0gVWPIPFfP3h3xFDcoscjYK8Ak8H1zXptnJHfwrGx4DHGO5rz8VS5lyzQJaJxk1/nsetXfiiTULpZTgZ4JrG1dorjTnPV8ZrINsvlAA844/xrH1RJ7Swk8mQlucjvXnQw8U1Y9WOMlJPme58neNric3sr9CrYwOOOa53T7hGKbxwDz7dzWz4gu1ur1/O+YluMViRxwpISO/TmvtqcUkfnVatKonG17M7Cy1iS1lYKDtcEGtS2vZLtgd2ABgYrlIZ4BGF2kY4FXdOkMlyIlPTv/Srgr6nl5hFwskzo7W8vdOuGuIyzY6n/wDXX0r8MPGVw8qw3X3XH/j1eU6dpa3enhIgM5ye3FeleEtGgspBHCwWRhznODmvJx8oSg4tHfg1O8aiZ9n+FNUjMhkWTIAB2+n+Ne46DcxzAKGHODjPNfInhaVLWVlmZvxx1/nX0B4dvVn8uWBscjBr8kz3Ab8p+y8N432avN69j6Dt7NdoweT2pZ7d2k2ycgg9ecVHZTsyKCc+9bG/fhzjjvX51NyT1P0mnZw0MaG1kjc7RgY4q46K67iAPrVvzdwVFxn19Kq3NuZIjtJGPfFL2subUuMEqbjvcZCsJGxDz/8AXp8iBTsfvyPrXNSWk0BDIx47Ec1bGpxBP3jbnXjk813xotu8Xc8rFOEVZqzNR28r5TznqajhgaRvNGeD0x+tZsN0lwDghSPyqeK98l9uc54rd0pLTqea62ifQvlNsigHkcVcjUyKAgwF6+xqi935coYDn/PStvS3WYlDkgY/zisKt1HmN6STkrkKR7AFI78jHQ10OmRAg85B6+gpRZbx8/yn/JrQs4BCQq+teXiK6lHQ9bDUHCVzetIIhhlI6f54pt/CGj5yQTn6VBG+6YBhjH4frWw6Jt68+npXjSundnrxXOm0cXJE/wB0j29qrwqsL/vOvqa6OW1SSUvHjBqo1rJgEr+NejSxS2OHEYBv3iMkMnyDr+mKi+3SQyEdMcDt+VOa3kjCyPnA9qkkjilCk/n61o3H1Ryxcr2ehox3v2mMhzjHFZM8YKtj+KqZL2x4HXt3rQt9kpyR8315qWuTVbHTGlGd77mDhoHK9TnNXgTKm7rkY+hrc/stXj3HvTXsJEUHHFDxsZGqwPKjnUgJY7+hP6U8WgkYFDx71uCzbeWPpipY7N0bkfQn6VTxvUl5bZWS1MTasGBgcnqK1oF24KnLdetOlspGKqAMYzUaW80Ex5xxxVe3jJbnPPBSjLRHbaOIyfmwp6j3r0LT1V12dRjFeRadPJHIFc8e1eiaJqBDgH86+azOhLWSPewNdK0Wj0yGIRKGYdvxq3GBnDGqaTLJDvXk1jtey7sDgg18kqTk2fTOUYq+52sAtlYZAqhrYigUsvRhxXPpfP5gJNXLi/NzAYpPvL0yKyVCUZJnQ66nFnG36qzBwDkViPbZy+NtbVxMonCsMdjVxY45UDcCvfU3GJ4zV5HJEJEc47dKhVAXLg4HBAro7uxBG7GKyprYRxbmPSu6hWTR5laPK/I5qeEu/mEDHJrF1bcoyxwfSupMm9AvOV9utc3qMySHEgwe/wDjXvYSb5kfN4+nzR1OJvM7fM/GuUkkG4RsOa7uVoZFJXk+h7Vy9zboBvxyegr6fD1dLHzVXDrmTuc7LbOCcg4xx61Skt9y7eg9f89K6UJsHzE7ai+yBiWznNdyxT6nAsuTbt1OIm05DMXPTt/+vvUL2mWcOPlBx+NdsbNPulcZPHNV7rT3QESHOfyrqpYzzODG5XpZI4aG6W1kGcFQccdhXaQXQjkGWznniuI1iz252HHHNWNOvXcou3BQAZ9q9WdOM4cyPk3UnRq8tj0RmEq4PGOR64pzbTwcde1ZNrc+Zzgkgf5/WrW5YyM5wTwK8qdOzse5SrOSuyK9iXYXHJ5z+Fcg0LSz9Mgnp2runZHUxZxu9ea5t4gmV6HsOv41rQq20N8Vh1LVI5290xXiIQc56/1rEmsLtfm2ngYz/WvSYoBKwY9DTrqwxBtthu3n8K7aWZOLSZ5OPyJTTkjyawleLURHtzxknOK9EtASwkUkKAQe2cVTj0CWCYXDLzkc98HriumW1PlbIwcnFa4zHRlax5uXZFOCbehEiOYwrZxn8ayL6R4zvHXgV3UNg0UBZuw5rh9QcRSGJyN56Z6V50cQnex9Bh8uq80Y9Dmpo5bo5OVbJ4NLsKrtl6+ppupTMh3pw/8Ae/xrNe+ARHfGcnPp9a1pu7PfrYVwhHl1VyO4iXk7eg/rUMDxq24Hke9aVxNBJDhBycHPr/k1hvFJNIVztC9fwrthXk9GeWspoN8zQ2bWgjO0C7jjBAxxXnmrJJeh5JF3BTwK9Eh0i3ET+YwXHU15J4w1ltGV0tn3I46jtj3rbA4TmbaPbx/EMIzjQpfZSRxV1etp16fspMZbjHp6/XNdJpHiVtWBg53dPqfb61866r4kuW1Eu/zAjHT/AD/Su58OaheQRpcxBgSeSeeO3pX0/wDZVoqR8ti+I2+anY+gNPubi4KrcrgDuT6VrzTkRExN908Hrx6VwOlatLf7ZZh5YHXJ5zXQ3MuFBfuOO351m6aTtY+HxFGckpSld7HQzX1tLaCSSQPtGB7etYtxcR/ZwrSHrkHPOawRqEDM28AY6Z5FYGq38kcqCN8bjuwfy6V00KN1yo8DHYJ06yn1R2T6hcxgxj51ODwcjNadtfOy+Qp2qew9ufwri7K+8y1SHOWyTnnvjpUOq6qVAZDhgeexroVJXPDxeBl7N0Yx1f8ATO9ZJZlczA4QcDpxjNcsTdQhsYwxwDj05Gal07VL68g2qVC56ngY/GtWVF+xb9mdw/zz/Wt41nB6nzk8luuW2quef6hb3c8QkbnJIJ4II968E8VeD7G5IaKIlwGZmQd89T/Pmvpq6VpYNjqpOcfgc9K4PVbaW0BZVLNwMAc4/wA8V9NlGazpTvHQ/NOLeBsNi6Eo1ldW3etvQ+UxoECPmR8cZIPUEj37Zq1deE7mKNJY/n3jII/PP+f1r3l9KsUuA80YBIJJx19uat31rYfY2jUrnb0Hc/yBHbv/AE+3pcVzuuU/Asd4IxcZubtZaW0Z82wRvbzeWxKsnXOQePrg19v/AASvLPWtMS2Z8tACNufXvjNfO2oeHW1aMXduFcqSM88nGccVZ+HviTUvBmtxmRgsEpIdTn8SPcdvWtc/isywMo0naa1Pj+CKcuEuI6VbFrmoT0craatW+52ufoultG0RSLqO1YE2l+XJtGMdT71S8P8Ai6w1iFZLWTAIycjk/T05ru4o7a6TcuM8fpX86V4VMPNqasf6S5fiMLmFGNShJPzTMDS9Bg1O5jiyF3HGevXFfpN4H8I2fhbSYrPTSp2wgKe7HuW+hr4j8C6cj+Io/NUSIM/KO/0r9FNOsoba2iuivljYDtJ+7x61/Lv0gs+qJUsKpe67u3d9P68z/RD6IHDdCGFr5hKC520r9Ul+Gv36Hz18Rry/sNOlvSoQKpBxk8g9Qa+ZrCzsNRnNxfzFJm+YHrz2zX2J8RLTQrvSpL3ULphCjn5VAOCe1fIOuajpP9tmCzBEJXAxnk+prv8ADfFe1wThCDUurS7W013PU8ZMJ7PMqdWtUTjolFvdu+tlttY8n8d3CRs9vOqu78AjPAHTvXh6StBOyberY9OO1ex+IoE86bEm5AeH6ZNedjT5Ml0UOzcn2zX9E5VKEKCiz+PM7oVq2LdZPW9vx/EhklZAPLPfB/8A1VnahdvHCR/L09aW7iuY2KNjdnvWJdl1kVHHI/rXymatNtxP6k4Dw04U4xl2MoyTMcOfrXb6M7xwfNxxjjtXIoUdgZOp/nmtuK7W2VRyMnoOtcWXU26iSPqeLZL6nJy1SPQdKiRWebfhsdO5rrNNvGKAxsSp5wfeuX0VEuVLnjocHtXVWM2nwHZMdpI4r6p07uzWx/J2cVlBXjLe5W1eKS72xJ9/9KyLfS7iCUxEDLDrWpcMZr/dBMNqnp25FbKMZCu9QzoMZA9KJJxjY8bD4+Td5MksrOQ2oMwxjv71TlUwkt6HjFdbolhqetXcVhpyGSSVgFUf54Ar7j0PwV4ebwenh7Xbe2mZotk21QCWPGQ2N2R61+O+Jfi9gOFY0ni1zOcrcqaul1lZ7pfL1P2Pw88HMdxZGrVoz5IwWjcW05dI36ee9l0PzR1DdMhjQcda56bybVAZ+T1x/n+VfQ/xL+GEnhPXxaaSryWdyN0BOWIHQqTx0rzHxB4Cvo7IzSKAqjc3TIr7/B8cZficHSxWFqrlqK8e/wB34ep5eUeEmaRzKrhMfQb9k7Sa29U+qe/oeDaxqNjEjyum1tuA3bnpXxn4+8RTafNJFFN94kjHofSvffiPq4s7VrIsBnPJxxivg7xlrouLhkXBCHAPOfxr6XJ8NPF1+aeyP1DF/V8ly7lo7yd/+B9xj+LtXF5BmRsuMkmvm3xDMVYsOnSvR9b1MNE3TvmvEdavC8jPz19a/XcowTpxsfzPxrn8K9VzTMC+lLZJOTmuVuZCUJXrU8995jNWLLdFea95U2tD83niqc9SN5MHGc1UllCcHvVaSVuapyT5yG6961dM5IV0lqTyTA8VBIy7eKplgp3ZzURlIPPOabpW2COOuveQ/eQak8zaKiBBYkGoXb5uauKvoZTk4LQ0opOM1YhmBOP51npJkAYqRcBsiocVrc6qdSzXKaYkzxVyGQquR1rLHB5PXmrCsDwOtZtaHXCfvG9HOD1NbunSkMK5aDDc/lXSWBwwK9K4a0Vax9NltWbmrnpFmygBc/U10Jli8r5j9K5jTAr43njFbknkbcbvlr5ytFOWp+wYGtaldFeUxu5eQY44rEYAsdo696t3G8fKWzzxVUlhyeMVtT0R5OIiqjRQeHcfQ1V8uMS7T3q5NIu4dRWXJJ8+V9a6qc2eFiqUI6RRpi2iKEnoaxbmwTlsda2oJ/LGG6Gsq+kDJ8mcfpV0pNOxnjKMHFNnPS2vykN+FZ32DdGW71ueYMYxViJoAcOOa6nXkloeHDLqUpXkYNlZ3aThlU5YjqO3rXZrp8zxenr3rRhgaRQzcY6GtuOPyu+Riuari22ergcljE4I6VMWDDjJ4rch0JppF3gggc11otI3IlbnBzXXafaxMAu04YV5+Jx7jqfWZTw3CrOzZk6X4UBgSeP7uMHdWFr2ieTaExkAnvXu+lWlusJgIBU/nVW/0bTry2e3I27ehr5WOdyjVvLY/V8TwZSqYXkppJ2P/9D99t6mPI79Kx7+7IhMfWuon00lSyAbevFFroMbRlpcYPPJr/m3lgakmkkf610sXSj70jyrMh+b1PFfLH7SFrqmqRW1lpiyFYMtNk4jORwMDrX21rNhaWWXjKhulfM37QOqDTPhzdCKJWmnwisSBgA5JH5dq/pT6KeZfVOLKMPZc05tRT6Lu36I8vxEccVkGJlflSi356a2+ex+WX9iyWlx5qqq5Y5H41PcWkJi/eLwR09c1r2F5DM7G4zJxzn1pdTv7PyP3oIXn0/Kv90I1ndKR/kJPC1pSlKls9DD0eEKxhAKrjv0I9vSl1zTBLHvXhQMnByPSse/8QwWUG+0ZSVzwen4iuUsfHhuN1tM4w3K56DHvXZ7OblzxIoUH7O1Qw9V0gOS4TcB39e9ec6lFG4ZNvzLx0/WvcZby2MJkC4B7jmuAvrG380zIPlYHI49a9zCV0/iPncbhXC/K7nlRhWJTgct+FY4u5IpNir25967HVlEY2xgk8gmvONUaaLJQH6V7EZLc8SnQ5/cta3UmvL2J1C9GJ49PSuT1BzcHDv904x/WqcrXEwC46H8ar3ULRsGUk44NaK5p7OEZNof9iDnLDAx35+lM2SW1udw4Hao/Pl2jnI6+mP/ANdTm3luIiT3rZPU4qusfdLOk6lKJ18snGc/rX1B4Jv/ADLZRPjjPXufWvlTTLBluSqkk8LnFfRPgt/s0SwyH7nzZPfNaYiKlDlPma6dKftY7vQ+kNJgXdGXO4Ecqf8A69P1CxguIpRtX17E1T0a5huIQikK5H06VLc3IGR1zwf/ANVfNShLmPdpVqS96R8aeO9Kt7PUnij6sc5xXHQR7iHYZI49q+hfHvhySfN6vKsOcd8V4Lf2U2nv8gyoyfwFfUUK6lBWPBxGDaqyktiWExtJ5bdP/r02H/RrsOP8/WsO2vyJmLg/X9a3LpoZgJkGemeetdqueLUhBw7rofRHgu/tb+yVFOGUcjjivRtLnFqcgYk3Y9vzr480PX59OvFt4SVTPJFfUmkTu1pb3CEOWUEnPf8ArXm42hbXozLA1He1tYo9oGtSRw+cfvLgEDr9a9F8H+MJopVhnGee3p2rwpL2Hyxk/MvBXHUVq6Hq5tbgYAIBBXJr5fE4CM4OLR9dQzSUaiakfo14a1mO4s9ztyMYx6EcV3kTZgCg4zn0r5T8Ia7czLE0J2+ozzXufh/WnuQ6yNyOgPrX5Pm2UOE20frOTZ4qsEmdBKrRzKS2Mcc1eS9jhQK7cn+lcNrN7d2zeYvIbAFXtOuYbxSGPzDHeuCWC91SZ6sczXM4pGzqV/EgzxjofTpXk+qajcWcxnjPyng8811WustucO2VfoM+nt3rzPWbhWbDY6dT2HrXsZZh4pWPOzGcpq73R0Gm+KEkPkr8jDnJ713GnXLXaCVid2a+ebFxDdozsWyRjPpXu+izQzWySREDPH1rrzLDRgrxPLwOJnOfLU6HXhnOM4Oa39K/dOeR0/pWFbIr/I3IHPpg1sxmGP5U5NfN4hacqPoMLUsr3Omtb11bDc+tdNbNHKPkI4/z/k150+4j0HQ461ds9SezOxTkDqa8qvhOZe7uejRxMU7vY7q5/wBHdA7HHbnrSXF9HEhUnJPcc/SuZu72W5VXDZx2qsplmI2n865oYLbmZ2PEpX5EdZbXO8ZJxnpmtUttYA1ztosnAGCfT/61dFCjs3zfe6D1rkrwUWb0Z8y5UXZbVZ7bdgBsdK5425tlOfmTPHauxtrdv9W2Me9Rz2wY7SMd/WuKGMs+U75YGLXMznLmxV4RMBgjmq2noqvtHPrzXQujOhiboB6+lUI4hCPO/h6Yrpp4jmi0zmrYf2bXLsa6xE4U9KuNAsgxgD3qvbhpCvYEc1uC1IjEfSvMrVLHpUYXV2YMlnGQ2BjNSraKFwOo5zWuYgPu8emajaL5gGPJ9Ky9szojFIpR2KSJuboKpXFgAchSRXV2ylYTuH1qpMinp1qIYmSkdDw8HG63ORktWiYDtj+ddBpvmIVdcgH+tNaAv8p7etaFmVbIIwF4P+NdlWreJ5HIud30OmttUfcF7Dg1tgxvmRhyOtcrBCssmB3/AErrbKxcAM+QK8LFRitUengpS5uV6lG5SSOUBOh9KTfMMA8471vzWmYfpWJKjLnC/nXNCamrHXyOF3Iz3gd5N5PGfTtVlFCoFY4JpEd04x1qCaYxYA5A/rXZG70OKcrO5NPIApiB49TWJMyjOTin/b97FZOAelU5mVkKqcmuqFJx3MJSU1czpwEkLqMZH41yeqws6HA3E966yWJm+U9eprNmVSuJByOP/wBdezhZ8jueTiqTnotjzp4pYxgjBIqhcIXwG612t7Zq6kryQMfn3rLisgykt17/AIV79LFJq7PErYF3cY7HJPaScbelV0Dxv7Dj612/2LegGOvQ44rKaxUMVxyK3hi73TM5Ze1G6KkEUci7cAjvWVqNtLDkjleK6i3gMancOtR3ETSZVuhHBrSlXtK62MMThbxSktTyXUbLz1IUdevSseDT5IlL/wB7t7161JpsLMcAdOeKoS6bGq7MDHXj1r3sPmNo2Pk8bk8XLme5xOlNLbncTk9MVrTStMolAwM9BUf2HO5FXAzk9uveoVSdCUYcDp2rrc1J3R4bw7i1CZchcO+1jg4okRRyTnP8vxFUkZo2MnqfypxnWVPLI5wfwpSpts0jiVa66Gnaqofjj/69dnHpm+NWjAbPXHvXAwyNEquvQdR9Pau40zV0jXymzk8ivPxlOW8T18DiIv3ZE5skMn2Z/wAOKyruwntJFdDjtmtia+M8vmQncBk9e9Y91q5P7uYHcOx45rlowqcyN69en7NqRoXN3aLZ7ZGyw9f51434gvUWYyW43FeBx19a7DUr1ZoiuBG23I7Vwd1Fcy/vMYAHb+lehHDuEeY0ySvGpX5HsYKTeY6mZsg84Pb0rmdZv4rNmDYCggjvgmpNcuG08q8nAPGRXCaj5t25k5I7ccUQk3NX2P1WhllNYeU11OwsNXW5cZzxnaBWjqV2thEk4y7tgDvjNeW29xcWQcSAbsAgCsKXWb28vT9pyFHUE+vSvo8LS5nofnOd5XTjLmbsj0DUvE8kyeWSpY8YB4xXivjHUGeKSKEkORkgngY61r+cXdljyIu5PY1zOtWMckfmF8lhyPTFe5hqbpnzFWFCrVvDc8PvrgSzZk5YnHA5969A0S+u30/ybU4XgAk8gj9a4i+08C8wBlN3T6V2Giz2qWzW2GLA5x3FfQQblFWPBzSFKDlznptjdtaIjXhBfI5/WtuPWbq9iZSSq5IPqPxryXzNSe4VYAdrcnPP+eK0INXnt5lt23EkYIJyOvSlWw6tc+Tw1WUqq5U/62PQftYSNlz+89MZ61CgnuHExUFiBtHpWQJSw80gh+gJ/nV3SLhxcGK5JULkjjg/T8a5IuybR6GLwk3JOS32Na5klhiYYAZB+tczc3TStuuCACMdasaldb5CzfMncnPWuevLyG5+ROCeOO1ccKzTufWzyGMocklrb5nZaXrfkWbRMMgttA9s17Lb3MEuliJm/dkA4Y85HvXzTbt+4+zoNozwfWu3tNUljt0sy/3SCfXOOn4V2U4+12Pz/irKPqUVK9kzrJ5AXLDGzPyn6VyWtSKm6VPnb0z/AJ6VZkuma2b94GbkEe/WuZ1BTKcAg/jwPwr38LQs0z8RzPHp3glo+pmzSPdlWYgMRjOOMYrH1bEsDW4ZizY6Z4/I/WtyG1iSMOrYIHc8fhms/wAppSEj6MOM5z9e4r1cPJRqcy6HgZth54nBPDzWr6nL+HLrUo9yxh3wejcdOvT8/wCdd0tgb8LdSJ5cinAOO3rwMiq0GmvZtuP7rf1HT8frXW2eoWFmphuOoU5P+ea9GpmLlU5qSPzfEcJ+ywKoYqW3fbfQi8LXOp6LqrQqN8WcZ5BGfwr6K0PxGZQYnbyyjc7ueD6e1eCa1qNppvh8atA24k5OOoDcAj6fXFeWaJ8StUt9S2y4aGTgj0z0x+PWoxvDs8xpyqxjqtPuPkOHvFKhwxioYCvNtS1XVJPbXsfpv4Qnk+2JqVuS4j44B6n1Ffb3gDxL/adr9ivn3mQDbnpgDpg1+X/w5+I1xo13FMvMcqAOo6e2Qa+t/C3xB8NSqPtE7W8qkGN1+7jvX8beMfBNfEJxdNtLaS1a+Xk/wP8AZz6LfijlsMOrV1GUnrGTsvk3pqvxPdfiPpOm/ZnluQPKcYCA459a+KfEB020nKQozbyQCeMAete5+JPilpN7GULi4KjjsK+dNY1WLUmLY8vJJCk5ryPDTh/HYWgqeLTt/XTc+98auM8rxVTmwE4yl97+/b5XOC1ZJGkLEfKTwMdK5yRLm2Y4HUYP+Nd7cCKaPDjHH/6yK5x7Gdka4djyTtHUAdq/YpT05WfguVzslKVm2cBfXAaYocAnNc9dxPNII5Onr3rvmsv3q70+Q9z1JrOvNOlFyEVc54AHevGxmFlJ2gfuHDPEdClH9+7W0OGOm7G3p71Zt4Nsg3Ddzz6V0M9oYQA4AI7Vky3CQEMANvQn6V35XlTv7R9Dg4s8QKSjLDQs7o7LSbmGJCgbBzgnijVdQikUoG2NjdkHtXlOveJ4NPs3mtpFWTnGeBx2rzq7+K1lLBsuAfOAxweM/wCFfb5dk8py52j+Z+L82nKm40LOP+Z6HqOq6naXqzRz5BH8ua7TRfHSxWcYVlMjnBUn5s98V8iX3xFieZeRkn5dvT3zmli8eWxnjNyDGueGHPevo8ZksHBJo+C4ezHHV7ur00T9O5+tPwD1+3l1ye+umEcaQlV3cHeSOPyzX1Tc6tGkHnRNnNfizZ/HaPwlHavp8od5CFbJ/h9cetfRekfHeCaQTrf/AOtwSScqpPb2r/Pb6Rngpic2zaOPi9LJJeh/rx9FPi7L6XDkMFW0nGTb21uz7K+IPxEtbO0toLgb3ycHsp/+vXxB8ZfiNr9raGSw2o4BJYkhcEHGcV02t+MtL1hhItwJFA3bt3UjrXyt8Rfij4SmSa3ml/fqCFQ/d46f5Nev4R8IywKpUXTcuU+/8Ucww9ShU9nNQ5lbfofJni7xZeas8l9fttY5B56fh1r5o8S38e55Im3Duc9a7jxhr8LSylDkMTxnn2rwDWdQjlDANya/urIcr5UpJWP83vEDiaL/AHPNdx6mZqeotNk5wAOleW6vcF5sDt3rYvNRcKw6iuQ1K7jK8V95RpNan88YzExq3u/M528mUnA4wf5VitPnNOnn3O2Bis9yRx2611uFjwIVnJ3Q4yluKpTnbz61IZNvK81VkO45Jqet0bOV42luROcSbRTCwUcmo8gc55qu7MSGJ4qn2MlNq7LZmKjbTd/GWHHSq0pDAEHrUkZJG1+gNOytccqspScWasbAqCf1qVWOeeoqiZOeDVhOeWrCUdLnp0692opFrcWB5q5bhu/4VmrhuBV1euD2qZbWNaDvPmZrxNyM8Ct23kb+CudiO3BHNb1m4ZeK4qqPp8veu50dpqMqfKDV8apLtx+R/pXLhtr8VIJWHGcmuKVBXufSUc0nGNmzr7W9MpAfnipp7gO3lgdq52zDHLCtiE7X8xzXHVpJO57eEx05xSuMdWLFCTxVKRQuQOcitKZlLbgc1SkAzk06crGeKpK7vuUtxJwOlNlJK7BU5jz1NWIYVA29z61bklqY08M2rSM23hUsM9fetxbCGTDAc9ePWoSgVyQcGp4rjZ8oODWcqjeqOijh4Rdpo1LZzF+7x+dacZLtk1hb5G45xW1YjJHFYVFZXPRwl5NRNyyjycL0rqbG3dY97njtisnToYzICe9dzb2xMKqgPHFfOY/E2dj9R4ewF4tmvp90kUXyg/NVx5FmIiGFI79+Oh/CorLTHIDORx0BrG1GV4rotGcFRivmZJSk7H6RCcqdJc2x/9H+g2e7iicjIIrm9W1me3tWeAnCgnj0H1rwT4wfGub4eFRLZMWnX93Kw/dkgcgc8kcV8E+Jf2hPHuu3Nxbx3jraz4JhJO0cc9CM59DxX+P3hL9E/OeJKFPM5zjChKzTbvzK+u23zP8ARjjDxZyfIav1fE3nUW8Utu172X3X3PpLxx+1LY2DTWWkwNNcROV/ecA46888V8deNvif4w8cI58S3rNEzb0twMRpj0A56ev/ANauUS8mlmZ7tgzuSWJ4PP8AntVbVUWaLcnDbcAjnPrX+oPAXg5kHD6jLBYeKn/Na7+V9vkfxxx14w5znTnh51GqWvurRW87b/MEMdsobuwrzHxJrskLNFEu4A53Ht9a1JNVurJwsoJUkYyc/wBcVm6zbsQZnwEYc46gmv11e7JX6n5hl2HSUpR6HkmpavJKjxY27ucj1xXI28jzyBGfy2PIPb0r0zUrCa5sGAQeqnjOR+HWvOXsLiOQRniQHr1r38JVV7Hi5nh7wTe3U9Q0aRJ7NY5pDhfvc9atMA+63k5Ut97n8q83+2XOlAYBOMYrp9L1jzW+dSfaut0m3eOp8xWXLG03Yo6nGjzvxjHPrXneqIlwSgQqc9a9d1AQ+UXGASemOR71wmoeWoLYHzHGDXbRqXseFXhyXkzzc2O0GQjOeOaxrmCMqWGRj1rt7oyvCWI5Hp3rNRI3hDTcMR0rvVzzoYmKirrzOENkqDeT8x7VahmlgQiTIX1rqRpyswYAHjoKtJpKiI7+SexrRLqclXF05Kz0ZS0yC3kYP0f1r0qxWW3dQh7Y9e3avJ7u4ks7jCduTxXW6Zr0ixDcM7fWtbN6nj4uKt7r0Pb9GunMoLEhhxwcAZ9a72N/NUqzZCevrXhWj6ydwuIyNzdQ1en2urrcqI4hghfpkiuPE0GmcWGxMXu7s7WK0tNUge0u1ALDGa8X8Z+C4UysXRePf8q9L0i7MK7sncSSQ3WtyXT4L8eZt+c/41xQk6Ur9D13N1Ek9z421PwcEUPAuMA89c1zjaff2hKbCQBmvru/8PP5hWJVAbkDr+tcRq3hgPAVkIRhkE4NevSxqZ5uJwDjFRt5nza0ZF35gXgdeep9q908DapOkSWzMCvp/nvXB6joy2AJPPJ469+9WfD8ypdBcjaW5+tdM5KVOyPKq4e1RVL6n0VbXCT3OVPBYf0rsI7Rwqm3PIOdv0ryzT7rzm8qM9OmK9X0W+XyUjkALY5B55rw8TdaHq4GjHWZ6v4L197OZPtLDgfkfSvoGy1uOFRdQnqQT/8AXr5Q0kxRXAiYbe/P+fWvULTUrhbY2r8jrwa+UzPBRnLmPqMtxUow93c+iLi5k1m0C7sbcNlff9aq2FzPaagpKllYYyO3pnFec6JrS2BID5yox616Tol49xhjwGPf8+K+VxGHdJNW0PrMHW9u43fvEevuHXY7ksecE+lee3UcqxmS8BVTwM9ea9I8QWKXTieEk7MEjPJ5rj/E19ayaV5Sna4Gcd+O1XgtopdTqrSs5S6JHnZbbcbofuj3716j4Z1+OG2SKbhhxk+teJXLz2W1tx8sn/P1rUfWljRZFyM4wT0Jr3q+C54pHycca4yck9T65sNThmUeYy7j+VdRaxxTDeMepr5AsPHjoqCQjd3xXuvhbxI15GJAwyRwCeOP/wBVfIZjlNSmrs+sy7MYSsonr/lRInlk7hxUMUaGfHbvmsiG4aUBh09+1XLSQrLul7EZ5r5x0mru59dCUdE1ubpgkwGBwOmM+la+nbCQu3NZxvVeNiPXAFWtNZlkEznBH6GuKonyXkTHljUtA7O3sNsuT1xV+BMsdxqna3D4+TkHvW3FGpOVNfOV5y+0fQYaCvcuJDtXBOcVaa2DqHHPbFRB2HL9P6VowhQMAA14tST3PoqVNW2IHtYfKxgEj9aypdPUrtx9B/jXRTFEQtwAO1VN0U53A8/yqqNWS1RGIpxktUY9mskMnlv0/pXWvbmSBZE74NYciCNgWHXjHWpbrU3toU8nBz1+ta1G5tOJxUocq97Ys27bpCkg49TSFFMox3rLF8CoYnBPPNatk8TIS54FKpSa1KVa8kh6oFBX+8aikRiSQPlFPLhvuH3/ACpEUvwfxrJprVnUpWS5TImkKdefSsFbqVJcoehGfwrb1COSFyOncE+lc1khjnrnpXsYRJrU8bGQbaaO1sdajiwnevRNP1Lz4RuPBrw63DvIA3HY12NhqQhj+zp16cVxY/Lote6Xg8dJSbk9D0u41RUiMa/w1zU2objtbp2rKEsk5CxHhj19qne0YuWU9Oceprz4YWFPc654ypUeg97opJ8zYBzn8KqXU7Fcg/rSXVs5bc3FUpkaOLBHHYV1UoRumjOo5a3Mh5WkkKr0J49q0IC5+Zh05xiqDR5cOM5HSte3cNxxnv613VnpsYUI3buyN1JcsRjFVJoTNGSo9OfWt+W2VlAByTyapSwMi4Xr61yxxOp3Swy5bdDlXiRCAeTyM1EIP4cZNbMsOWzjJPtTHhYH5RzmvRjiDkWEetjKWBVGBVC8tUJJTjNb4QlthGKimtTkjqDVwxFnqZywjtY56CxVyDnmprmzY7X25x1/Ct+xsGc7lXkcVNeWzQkhx1rWOM98yrYK8Ndjhp4Uj4UYOM+tc1eSrtPHeu8nsnlQhR0B+teaa7cPZfJ3H5V9Jl8ud2Pi8yi6d59Cq0gdwCevXis27kggVgefUVz8+pkN85NUdR1Iy2+4/Qj2r6ajhZHx9fGQbu+hFcawqzmPqMnntUi6kofDc571wF9eiY+XnDCufuNXlV/LGXX9eK+ho5epJWPisbnLg2r6HtQu42k+Qjnng4/T3qwNVC52N/tceleHW2usrZJPpmumt9UPBVuFPHelWyzlWpGCzuc5PlR6tbayg53YJPFXLmWS6USKACvQg153DIh2Kc46k10UGpWsMnlbuM4ODXmVMKlK8T2IY6couE9iW4bzXCOc/jnAqOXHlFTycYFXr2TT0xImAT1PGTmudmvPOLd9nXtxWc5pxtY9XLcunzKo3t2POPEXl3E7eYwA/mPQ1w8x3JtVuR0A9fr6Vra/MLi6aJRgt0zUOl2DGYtJjPXFRCiubzP2Oni508Im5aJGEto7FnY5PUnngfWuM8Qbyjyxgh8Z/AV7RItupkTgHOAP6H8/xrhNa0wtcBCmMjtX0GBp+zPz/Ns6+tT5JqyPAZ/EU9rJJCWO1sE565qez1Nb6NpI2wRnJP8ASuh8Q+FraW+doVwV5AHrj+lcvb6Q0EZZTyrEHFfQ0rTjqfO42rToz/dqxk3q7GM0OGB/X/P1qexe1iX7UwG7GceprK1aWWCERKuB1wOv8q45dRkjYPkk5yRkfjXs0YKMT4/FU6mJqv3tj3GG7tEijlHUDPXmrVqdIuYfMgiDyqxyc89yK8fTXNybpFJCjgfjXUeHddJkJQYTAJGe4qcRT0ZxYLD1otPue06dZ211D5qxlyOemMdq2f7KAZsIFJHy85478+1Y2geJ9MjiYk84OT9Kv3GoNeO0sTeWCO/1rwa8pX5Uj28uwFR/v6ruclrdmIgVBG4njHbFc1DpbSRmd8qGz+HatfXru3hjFxKMx9OOuT3xXDxeM7Y38lqZslOin/CtaOAqSi5I+i/1noUpRot6+Z3lvZpDD8hGV5Oe9cxPczSXhkkGCeBg96v2lyJPnZsFujf/AKqlmspPMyDkDn1P5VGGVSM/cRWeVsFPDNYyScexXSWbfulbIWq17cZxcxPhTx3z6fiaZLvl8yJeWGcenArnNYkm06yE7DcByQOO3PFffYD35crep/InGGCp0KEq9KNoav8AE622UBN+/duORnpXS2kdu90NoznjOOcD1HrXg9h4luPNjgx8jDv+Yx147V61puq20hw2AR0zx9SeldWYZbUg9T5Lh3ivDV4pQtpbc7TUxGQE4yw4BPOBjNYOp2oCea5YsF7celV4VWa7e43FztJxngHPb+tcZ4k8QnSpmsh951zgn/69RleCnKqoU3qcPHPEFChgJ4rFq0dl+n3mNfeLJkmfTp1DQjAC5z05PXvn6VattAjuLqK/hGEfJVRyQc5GO5xxXHOksjpOUA3AcY/p9K+i/AnhqaLTRc6gQ+MlBnO1SB0x3r77NsRDB0FKOj29T+N+CsuqZ5m06dWPMk7p2+FXv91uh2fh5JLCHM3zdDnvkdK9U0/UGkg3K2CevPpXm9rFZ2MI8wHBY4J6c/yrqLFhOqyIcAke4+lfjmaxjWbkz+7eEPa4RKnHZLa/6noMOpLLnnJH4/pTZY5JmDxg889a520ZI5DvOCT1reM4Iyvrj6c18disMofCj9vyPNKlaUVUeo26IZNqkg8A4zTy1xEwAj3MV5z7e30qK2vohdedJjGPxyPSuli8ja074G7BHb614FaTT1R+w4ScYxThLU8+vtYs5ZzZzqN6HAHvUNzLDKqTtwehA7VdvIdNn1E3c5UBDkE4xn61h6he2kkfmOwCN247VtRp3tZHoYvFqK5XLfoZ+p3VvlVbqQevtXivjDUfskTiNskchR712viO+cbUUhVXoVwOOlfL3iW4kWaWUuzFSQDnrX1mS4NNXbPkM/xTjOEoLXX5HCeL/Gd20QlkYFGyAOpArxmfXJQ7XPLF+lRePmhsJdxkLROd5X0PevMbnxVZPBGls20Jxjr+tfoFDAKylHY+P/tr2cZU5fFa7N/UvEbxn94xDdevSjw943uNSuvLuHLeX93HIryHWp5Naj22fznJ3tnpn2rqvClnbaPAJIhvOMFj616WPw0adJ33Z4fCuZ1MXjUo/DHr3PbLrXP3YkWU7xggntipIfH2raeoaGTzE64J4FeTahqIYlQMLn6/Sufe9mjQsh+o9a+MqZVTq/xFc/oXB8XVsJ7uHlb0PsHRvjfLFH5d2WZmXHB46dea8J8X+JZr3UprwOQr9BnNeSjxE0EipO3TkY7GsHW/GFvuYp8zCscr4To0arqUo2udvFHixicTg1SxFS9mX9U1KYhzK/Le/SvOb+9dshjwKzdS8RyzglzgHsK4e61/aSoOfavusLg2tD+f86z5VHz33NLUr0GMxk4Nchc3bDBzkY6VHd6i8pGD65rMM29eeTXe4cqPlo4j2s9GEk4Cn1NZzOQcseKe7hQfeqLsWbB6VCR1yqbXJ5JP7lUJXZ+VNWN3btUDMqDFQmkdEqTmrvYgdiAfWmkkpkUr/M2B2pjMMbewppmai1dXIw5I56CrUYfbk81VcpwVqeOT5MHvRJ6aCowSlaTJw3I571eSQbtq1n7dq8nrUoHl/NUSs9GdNFyjqacWFbIq/EVb6VkQlhya07Z/lyeKxqI9XBz1tbQ0olOBWtA4VsZrKjl2EZqdZU4Irjmrnv4eSi7m95gP1oSVe3rWWkoJHcd6nDYAZaytY9Dmb2NiO8MfANXlvXZSp7dK55Xy3I//AF1o28gPDisZwW534WvO7jc1EmZvlNa8UDSAL1HWsuFF8zJGRXT2bRpGzEYJ6VwV522Pp8upc8rVGZ32NwMg4HNSxwqDx1q8ZFIJbuf5VSmukgfpk9651JvQ9idOnTkqgy4UjJrOIXzML1Bq815DcIY87XHI9KznBjbzeoBzitaex5eKacuZPQ3EBKgqea6KxhLc/wB6svSYFuk3iussLQ+YIzmvOxVZK6PrcnwEpNStua2m2vmzLGxr1uCEQ2qkDqPpXIafDBauC3B9fauut763lhYA7cDivjMyrOpL3T9k4ewUaFNqW5I95GsDcEA1yOoqjn7SjZHp6e1UNS8QFJGt2+8SduAOtcBd6vcxsy5LdiB1p4TLpvXYnMs/pwtfU//S9t+PHxUufH3ji5uLS6+0abbsEtlQnywAoBYBu7HrXiEGnS3aMysQW7jrVi/0/wCz3DBc7Aufy60aZJ5VwoRjnd+Hpiufhzh7C5Tl9LAYCNqdOKS06JddtXu/M9TP+IsRmuLqYrFS9+pK7s9Frol5LZeRWvIrtW8sg/Lxn1qitzPakrcNvVug9Pf867LUpCkYUqNx7iuJ1CBZ+WOzaMHI/wDr19FQfOrM+UqVFRqNp7GLqd0l6wXb8q8A9xUUjreQi2IxjA4/ixWCiGG+aM8gnIP8vauutrOIJmVMN147Z9K7XRiml2OmWPcY3j1Ks2jWj25MXDY4+n0NcdbeGfLvvNuBlmJIPTFejxbxcDz/AJVYcDH+cVJMrTKzBeV4we4/pSp1ZRfKZV6inFz/AK0PGfEOgsr+arHGc4xxWHbW/lyZZc4PX0r1fVdMluQrAcZGR39KwXsT5hDL0OTXt4Ss0tT5XOaftIqzMC5u43jMWwHPeuLvYS58gjKDgZHPPNd/d2aQ5KL78fWsBvLMnlsuMAkn046V6mHS3R8vi68lFqprc87lPkboVGefTFRQ28UxLsOnJrrbnS4XkXyx3xjNY93ZiEeZHmu1S2SPGU7p3Wwttp8IDuWwpGD/AEqw1lAw2rntWat3NDEAv3T1pftjqOo6YPp610WaR5a5ZzOe1/T4whKDk1y9sZopsD5R1rs57vzAAev65rnJ4mOGC5+law21LqaStFnWaPcpF8uTmvVdKvI4owzDlh1Pt9K8g0i1ZmMkfH/1q7uGXy02q2COnp+NFeNzzadNpuSZ6VDcShBNHz/n/JrrtB1CRgYW+8xH4D8K820q8mkjVEBzXW6ddNaynJzxxXl4ii7anoYbE3laB2jxq7hQduTj8utcd4stmjtwIRySOR0q7ca1JFJsHCnkH8a57UdfkvF8uTAb1zXNSpTUlM76mIpyj7GR5rqOnJOmJQSfvfT6157IVsLoiFduDzjpXtM1lvYSsee/0/nXlup2jNcsyKNpJ/nXr4eTvY8nEqHK7nY+FrkOctyWORzXq8IlJ8yPopBzivGvD1lPEyzKABxgd8/lXuejW9y8O1859fXvXLjZq/MaZbRkoqlFbm7bai0p3sQSvXsfavRNK1Q3ShAeAME+n8q8uNlJ5o2gbM9OvNXne5imCKSMdV7V4tSkqisme1C9BqVrnqclzPHhoX+cc+n51674c8RebHGE+VgoyB/nivGLFs2atLyxAFXFF5DiS2YqB3zXh4qgprlZ9Hg5Si+bufSs0rvF5zufm615trcKwy+ZMSRnqam0TxBcyQrFeLuPQ4P61uanaQXmktJI/KjIz1H4fSvFpQdKWp2Vm6vuWseV6s5ldfJ+ZQcnpgZ9DXJ3935KG1mfJbnb6e9Ur3VLiC8aJs7ASRjvjoaz5IpdXvhPI5VF6Gvq8PSSSufI42rPmcYrUv6Ejy3oEhJO7p1HrX1P4Hs5YiCDj1+teUeEfDH+kLMAC2QTn6V9GaHYLZoAuFZu3p9K+ez7GRleET1cjwk4RU33O0spV2jeO9b1oI2IZK4ma8WHG3POR7+tdHo+rW/kbc/Mex9vavicRQfLzI+3w2NvLlb1OstoFY464OcVpImJVIUYH61iQ3sKsWVs96sRX32hgenqK8udOV/I9Pnjy67nc6ROpuAh716CtsUjDdz6V5hp9xHFIHHJJzz0r07TdSS5h2noP0r5PNYyUrpH1OVVY8vLJ6k6x5IJ+771dUfL0piyJu2g5HY+9XxGyr8xzurwJ+Z9LCbtoYFykjJsPQ1Rid4WC9cmuivbMoNzDkjOfWskxuQvHOeDXTSndabEyVmXZ/3ygjp6f/rrEuEd4/L9uK3YwQBntUDxRlmLnp3+tKnVcdDTFUk7Hn9691HNiNsY9PSrFlq08Sne27PB5roJ7HdkAdDkVRi01VU7Bw3PvXrwxcHGzR41bL573HadqUhfYx7110OJlAj4NczBYAEgde1dDao0RDKK4cXUg9Ym+Ew80ncW+tZJFwBuwK5yS1MDFm6gg16KjCUKrjpXPazZ7GLiubC4mz5WduJwrlC6OaiUICzD3rPF40dzuznPT8anu5Zov9XnHTisGWN/mZhyD2r6ChFS3Pl66kuh3CX7BVZeMe1dVpUj3Lhedp5+leQ2V5Kh2yc57V2/hrVZUvEik5jb09K48wwbUG47nRgcQ+ZRkdtrBaGMlVxzXISXRO4ycewr0bWPKmhRomBwOK4L7J5kxEh4HXNeRl9RKF5HtZhQbn7uxFayF5BAwB4zWq9oIJA+Pp70/TI7Q3Th+3vUur6zY6ZIPtBXB55OMVpVqydTlggwtC8PeZt2NqJh84yfWm3Gm7jjivMbr4lxRkjT2Vjk/wAJx+Fb+k+M/t1u5nQrMoLDAwDxnJrKpl+Ij77Vj0IV6Nkr3Zt3VisbckDHrVYWq/wkE/yrwTWfE+raneCKCYtNcPhFU54zXeafa6vYQxtds2/PLbs/pXpVconTgnOer6HBSzaM5uMIaHaTWoTJPNZ5RnXy8D3reh8y4tt7/wAVYLyBZNq1y0Lu8exVZqLv0Ol0uFE+WQYGM5qDWrffGdnT19qZYz71245FX23zMYSMj1/xrlV41OY3qOMqfs2eb3E5gUjr6/1rxzxNIJ5SAckV7L4l08wSPsPH1rxLVYGWRkYj1r7/ACGUZPnPzniKEorkS0PMNQ3oxbseBjrWMTJHGQzEvnn6V1d3ZyFt4GexrAkWG1lAfGAOT9K++o14qOp+dV8uqVp2prc5me2YMWlY8/d+lc1KoNzt2+4NdVqV1A0eFfA6+nFciJ0DEbsY7nFethsZdXR4mL4VnBpVVYtSW8Ea7toGemKwr3WDZqwjIXH86s3OpIwOCPl5zn+vpXjnjTWWuXQQkfy5q6CnUnZs+nhldCjSsoanq+j+OpPtItZXJGOx5r0NLwTsrQnKggjsefWvk/Q2kwJZXwRyCfavoew1SNdNin3Ddt3H2x+Nb4uEaep4f9j+1lyUtD0l23xbSTn8jXOPcS21y+G+8AAT7VxaeNWvCLWMBZAcHJqykt9qA4/E+9fO4mLjK8tEfo3DmU1Hh1TjZtakN3bPc327dkdq0DbfOiKegzn19a2dP08BVWTGR2PvUFxbQQTslu3Q/wAXritcHDnkHEuZRoU3Tg9jHcrLeHzCOFB+vvWRez7H8xj0HHHcVduFJldw3OPbGK5zUZ1jyxwT/Wvo40Grcp+R0syjUqXruxzepXMe8zk4fPGevSuJklheacjj1xWnqT7rlnl+6BnPbpzXn2rXUliXMfCycHjNetRkkuXqaVMBKpUVVaopeJbqFoSLc52jn3NeF319cwSmE8AtivSJ45LqMkt90En6V53q8Pn5aP73OPwruo1buzPap4GFOm+VWb3D7ZMPuMcEdK19O1mW3BRTtIGfrXnMV60Fz5Vw3OeB2xXTQSW00YcsAPWt50pXs+paqUfZNwdrHsmieILe2hAmGVbJJHHWrp+IgONPt871z6/zNeOSao8UWy1wccZ7H3/Krsd0kjoUTcz9fY+1dVHLIyd5I+GzfiF0I3onoviLxJealbx21iDFt+8c5z79K8atbpbPxQ73B811PPr/AJ5r0K9E8ViGiO7p0zn8am0XwrDeJ/as0YLEgjdkZNfRYPB06UHfbY/EM/4qxFeso0nee/ax0+ga75k6C4i2AH5T+vIr0qGOZ1WUKW3Dv1rhrHSU1ASR3ZwFwvy8dOmTWoLu+simnRkgL0ck8j0rgqUI/YWpz1sXVr1F7WXu+vX0+R08FsiMZCQTnuOQB7Vg6vZw3im1kTer+nof8a7OxiWSyaaU7i3zc+pNU1iDEuVAySM+3bj+tcWEn7N83U9bPZvFr2V/dtt5HkL+EJY5fMVcx5yO/T+EDr/OtDTc3C7JGwUPP9fw7V3M0M32ryVP3sdP89afLoTgC9SMDsR6/wBK9t5s2rVD86fBdGm+fDqy1uv8vQyluVQLHauTtxnbweev+c1a1fwnDrtotzHEftAAw3TOM8H2qUWYhjMhULg5z6/jmt6DXRYRLJLgDABA6fj7cU6OLnCSqYfdHjZ1w3QxFCpg8z1Ul93muxzeg+H7eAhNTiEjE5Kv0Uj0969p0y6ZEWC0UEIMD6AdvavP7bXdN1Uu82AIiF3Zzn/64NdVYarGImmszkL1z15NY55ialTWotfwPL8OOGsLhVJYNq3e2rSvv8/+AW72+ILed/CAQM8Z7d6uWWuCO1VokKheDgjqe/SuVlhuLlfPyDk56+vYd6rX8V1HAtvCwRvrjPFeZ7KnJKLPsYvFRcqsFp27nZt4jaSbC5IUg5PT9BXZQeIFmASFwSOfpnv0r59N1cxsbaTnsfUULqd7Zho4lx6ke3T9ajEZTTqLlR2ZZnOKwzdeprrbrf0Pcbi7ZpFlWTGegJrY1HxBdpp4VV3e6jFfPtjrd1CwN3nnJ+Y8DHpXpFl4lilttkx3AjPTgV89jsj9k1K1z9d4e45+ur2NnBkNzqcs9xhZDk9uy1z+pQzMqzPIVVAeM/qBVqW6RE3lgh5IHTmsG6luZoX+brx16isVQ5E7I+1wteGIqxbk9zm9U1B5ISkmTgdc+nrXhvi5W8h5T82ATn39fwr2i4S4kg+wumA2TnufbNeT+MdNSCEQq5JccjP9K68vdpJH12bQgov+tT5N8W4nsppbo5VVJH418s291PaXTbl+Rjn8c19meJdIF3EbeQZUfex6Z718z+K9BFrfkoMRnoO9fpGVT5otM/D+K6TpVozW225zVlqBaSWKEFQeSR616JovmR25jRvrmsXS9OgitAqgfNznvmqeqah9iUeQxBz0HascdW9r7iPo+GctWC/fva2xe1jVGsWMOPn68/4VwN94jniXG4DdVLVdca4cl2+duc159qV2zSctnH8qWGwKt7xpmnEUm70rnSTa5JOcu3I6elY13eBcndndXMx3okBwfrUbzGUAE8Cu+FBJnzuKzOdWKZLfXHyYTvXM3J8sb+ua3ZcS/KazbmAspHU1pGfK7GeIoKcW2jGJdjuToarl2EmV9K047aWM7ZOKpTwyR5btVSnujCnhdIySs+pWXDvluaZMNi89amhCx5Ymsy5Z2fJNYRd2elUjGMVZaiLOpDVBvLHb6VGsZDZBrQjiABYjqKzm0ndG9KM5pKXQq7tvLHFNbj3pZFbdhu1LtG75uazckjd03K6KygbytSYZH4qIsFkz3oWR2citU+pyqKXu9blktvAz1FBZto7U0HacmpVI49DUqVjo9ipdTRhcbQW61chkbdnHFY8Z2tWjEccjpWMrLc9ClNyaRrpLkZJqSJgTk1mhsnjgVKNwGc4rJvoeiubSRtiQCrKzdutY6Hoe9XYi275qwkkehCtJmgkjAjNaEMuGy3FY4kGOegq7DKo4HX1qJo6MNNN7nT29wAQGOAK2I7hVUKO3FcikowMVpRSHgeleZVgfZ4TFuOiN6e4CgKDisW4lZ87u9Sli33uveqs6kCijFJ6hjcTNrXYgglIk6nFbUcyzL+86VzIZlbdVgXRjjwnrWtSld6HBRxbSuz0/w2ytJ5cPOeDXoqxCCAv0OM+teJeHrm4t5PMiJ3elejXGpXBsjklTivmsxwrdTQ/WuGM2jDCuUlsbtxrarBjJ3ZFQtrz7f3XfvmuDs7ua4z5jfhXTxWaz2xMZ+YZrgqYKnT3PosJnVevFuBnvfLFd7piSSc/lVuRrOZ8xHOcZJ4rNuLRw+GGT71LZ2MxmG8Z3dga3qKKSaZwYSdVz5JR6n//T7fV7VozkDIBxxya5GS0VV3Rk/N1+hr1HUrCMNsBJA6Z/X3rkrm3VX+XuMf8A160wWLvEeZYCz91GDHFMkf8AeVhwM1nOouW8uVflPXvj/P1rqHt1AJYZIGM4rJngErmW1A4zkE9DXq0Kiep8/iqbSUb3R55q9h5E/nQfNt4x3NZsetyQx8sflPQ1300K3JMTcNnPtxXG6loEhkJABHX3r1KNVS0mZV4unG8Vf9C7a6ys4xLgNjg/5/WtfT7kXcrRhwdvP4V5pdW11bAMSQB0x096hs9eFk5LH5gR078+2K6nglJNwPIrZlytRloey31lHaRmRcdOfxrg7nULQylVOMZDHvnpTbrxgLuAAkDjBzx+NcovmXkzsOMnII/wp4Og18ZGZYm0F7NbiandKOhLL+gNcZPdMAz5Az1Bro7y48ndbr8xGeo5/DNYV5bwumRwOpFezScY6Hg1qVSpHmZkmV2yAxye3Wobpyw2z9enT+dVpWMEh2Hr2+lZ1zdgjYeGHrXfGTseNPCQjUbvoyaS1SeICI8jPH4Vk3qso2KTnpkVehul84Z6Dvnp17Vbe1jJAyGBGfauinV7nmVsv5XeH/DHH+dKGEcmPyq7tWdAu0KVPOPSrFzGZn2HjsAOlU/KZGY8cegxXWkr3OKpUlyPlN21MNvApiBDY5q88paPzM8+npWFbyq3yvnaOB9DXQCKBn8oEFqjbVnK4865Ujq7G+AjRl4IwCcV0BvJXYeWBnjnOMg1wccqw4T36V0dtcQxYRuvUY9656i0vY1pNp8t7BqN/O8OYvlccH2FUEuGKqzA7h7VoH7NcylX6d/c+1NNkqSB1ODnoc/zqLroattR7oljuPPhcZ2nHQ+v9K4zUUa2kcKRkZyMcc+ld3BDCZ8Efe446+n+ea5zxFbRx7pFIJHXp6cU4VPet0EsPen7r1LPhidbggDPOByO4r3CBXgiHlOMKMnPpXzroV6Lefdn7vPHevWo9egmRY0cZPXFc2MptysjowTTg6kmenJcxywYVfmXnPGar+csXLjl/u8cf5J5rkU1ZYzlJOo65HIrT+3m5jEjHIBB445ryZYdrU9qFaN0r6o7S11Dy+JmPBAGP0/Stga0JpTGrA4A/KvJBqLxTt5r/KehPH0q7BeSMFmIyCeMelYzwaerNI4ypeyPetD1O3WZJJDyMdeK73UNURY9jdJFAOK+eLa8bcsjHA9OmK6a21aS7xA/O0+vb+leXWwN5XPUeP5YvQy/FETpOZI8jd/nirugwJdzxpgH19/Sp9dW3cnY3y+n/wBf/wDVVLw1N9kujDu3An5WzzXYpfutDz5026iutz6j8ORQQyxyjpjnp1r0u8uI4xuUEEDivGPCF5Hefut2G4xz7+/evWrqN/LyxOepyK+Cx1NKraR9Ph60lD3DEkvyk5ikPJzgelaVtehYi2ckccVgajaR3Epcc/p9Kz4Q9rOCj4X3rZU4zjYyqylTldq56Hb3U0RxnJbHWuosdTxtw2CMccV55aXhDIG5z7etayf63evrXnV8Otmehg8ZdpxPWrW+ym4E9v8A9VddpesyQjY2Np4968bstRw5UsCB6cc121pdLMmAByB/kV87jcErWkj6TB4luXNA9bsrx+uTzXVQa4uP3gyQeteUWV6TGvmH2Pviuit3EsYHcnivk8Zgk3dn1eCxb5dD0ubUbSeBQeprORFb6DvXMW8j8bATj1roLGfd8oPzGvInQ5Foe1Cu5ayRqJAR845FMeBgCCOK0bUkKO49OtackKtH0Arz6lZp2Z6dNcyRy/2U4C4x9abHaLvxjg10CoRwRmlaMK+7A5o+sNaGzw6lEyjYAkHH0qWK3dPkbkitaN0QAEYB4q6IE5aPtWU8RJbl08PFq0THjxD+feorlkmGWXNaLRA7vWqixBmye/WqU18Rz1G37q2OUm0pGb5QTnp+FZV3pxQ8jBr0pbUBqp3dijqSRux0rspZk09Tnq5YpKzZ5nNYhCDt5HU+vardmpibI4I5FdBd2RHCjA9Kp29oWcgdzXorFqUbs4FgrVLItxagzt5ec46VauWcRHyxg9zVe301o7gMPXmtqWyib5nOCK4p1YJ3R3Rw856LqcO2pnSkklmOSM182az48TUtflhd9kY+8zEHOOor0rx/qon06b7A+5z8u1Tzj61+dfjzxBd6bPJvcLICRgHrX6RwvlMarcpbvQ+MzuUqcLXsk/6R9jv8R9BKm308pI6YwR27Vd1v4p22k6fLBPMpl27WbPPPbivyP1rxjq+ngtBcMpfJBzz7/rXMw/EHXb+YRy3DMCcMCTz9ea/R4eH9OSUm7o/McT4gShJpxs+h+vHgz4j6Beayl1H8vlqAF9+5r6x0rxBZahbrM7fJxjJ9a/E34eeIrpb2EpNsk352seCPzr9JPh7rOqavYJFfMoZjxsHBz3POa+N4x4YhTtOLPreEuI6lZe+fWMt9ZW9uREcjrxWKd0w81OQeRn0q9pFkWskgv0DFR0GcCtyPTINo2jgV+TOpCm2j9PVOU1d6GVbMlvyeD3+lWJ9VhtQ10TyemP5mkvVjtzwdpFcPqt15luY0OAx610YagqruzzcViHT93qUNU1Wa8JLHAYkCvLtaUHcSMnOPeurZowp3scD1NcxqUkO1nyNxBP0r7XAU1T0R8hjr14tHnepXkcaFW471wWtX5NszZ+YE8f1q9q15HJdsEJ2x55PSvMfFetoy+VA+T93nvXv4Oo5z5Ue1PIadCgqs3Z2uV1v5p7hlOQpz09K8+8Y65NaxiKHKbOcjjNbH9pwW1sCGO5jjNcF4lKSW7zFsnHB/z3r7LLcLZp2PgOIMXGUmpHL6n4y1CJNlq3DjBP0rh4dfF1P+/YsT74H61jajf79yqxUgHg9OKx9KurfzSj8MPTpz2r7GOCjGGqPhI5jOdVcrv2PV/wC3Y4o8AjAA/Our03xfexbIozlAOD1GDzXlm2CaEFM7+cjtj/P+fR2mtc6bdCXcTzn6ZryqmHU0z6mnNQspR0fU9o0/U5J9V3Pwh4/H3r3vw9KJPlJwu3OR16V80aZ5jP5gYAOwOfavojTJ7OHTo7hWV2Axxx/+uvl80pXko2PtcomqdCdRO3/BNbVb6SzGyDoMktnp7Vwl54hdsbB0ByR3Na+qXIniPzcPyMdM15hfahbWy+WXAbOQK7cqw8j4ri3FUetrs2ptbIYtK53HjGcfTisK51NwxOd2Tz/nNcbqd+xkyhI5BGOc/Sqa6q0sTBzlwK+hirWZ8VHK6TTVt/zOwuLi334U+/X9a848QX0N6TbRJkEDn0IqtqmriKEPv59K5O11E3ExmGGB4zUzpP4kfWZNBRXJPoNEDRRMk+TkEAn/AD+lcfeRPG5B5HNdzqDXN2wjjJUd+KxbqySCMx4yBx1rtw0Lq7JzSvyVOWK06Hk+vW0aFbmEcjrmsFryZUMY6e1dNrYR5gGPB6YrFjCBD5gxjmvpqFL3Vc/N8fjZKpJQN7Twktq2T8yAZXPNdNp1zbxKh3DBOOucGvKxqJSTfAB83XPXHp3rW0+4dUMjIVXHGee9epQw9rSPz3O8wdSEqEtme6X+rQfZozax79pw3p+p7V2ugXMFxbokoPltkADOB0rwWz8QQ+V5hbnPA9cda9E8L67biPy/QljxxzW+LopU7dT86wNCf1lcivH9D3jStBVxvRcZ5APfNdhe6FZBA2xcnsfwPWuS0bV7hlHzZB49OvrXd2V4TGWlwy5wMmvjMViKqlufomHyfDSg7RMuOytLe2WCYdunSucVp55vKtwuxXI49up711N7pct1uRATK46jOMd8kV0Nlob2UCkBVfGMe49ayeKjBXbu2Xh8ulUq8sVZLcwLTSY1VZZMlsfMT/QY4q/fWqTW6JHyAOa07h3gKSTEYzzVK9v7ZY8bsc5GK89V5uSkfTf2dRjH2b0RwWq2aRBYxxwcgdcY/wDr1k3trHAgv9m9EBO0HnP0rU166CgFHByeMenpWOdSgjhdQBsYZIPc172Crz01PleIeH8NKm6ijrb7jldLvlu5ZQiFVyc5P8geldHBqY0yEwKp2EjOfU/U8Vzmj2cElwb5vlUEg4BOcnsKn1aaOVRbxsRz90jHTjNfT14wlOz2PxHC/WY0P3bXMr280dzB4iwUSIYXHzHsMVOdVjdxcN8wJyM+3P8AWuOsrWyFp5c4OeCSDj8Ko6hrkVmFjhGFUeo6DpXkzpU72ij6vCUMTJ80n2/qx6NLc27yecw4I7dazbueLaMIfm+6fUn+tchpviMXMYaMBs9McZIrrormG8IiU7ZAoJXFcE1ySV+h9ZTwk6lKXK1r5FU6bcXqhiSUX/I+lbWn2MkEJ8zJwDitSxubC2iFu7AOexwM1HcXIKt9nHbGMVx43Hz5GmtD1uFOGqEsXGVN+899SncMHUI3zZH+elVbnZb22RyQOvSqpnKD5B8y/lXmPjrx7BoMDR7v3p55547nFeDLFVKrVOmj+hsu4Nw+G5q1eeg/xV4507RVPmShZR0XHrxz2r5qvPF934juh9ruAQjnBXjK9q4nxPr02tam92JjKsjZ29DivJ7nxFNYzSGGPGzowPT0/Gvv8myyMYXe5+TcYY+brOMH7vbue967eW2jaM11cnd5nKn6V8o654o/tPVjCDxu7dMYq5448bX2qaLFE07MI1yAOD759a8Si1GZCLiNRnqdw4r6jB4JUlzN6s/N8wzOeKkqSjorPzZ7jJcR2sO2I/PjlenHtXn+u3ayudxwR1rn5dcvLucXLnnGMDpXN6vqUjM6E5J6muerRXPdH1WXYyTw7U1a2xBf3PmShc4we1cteyDecn6fjUzXjY2t+dc7dXBaRkz9K3pRSZwYyq+VO17ioRGxGamjvivC1klm5LHmoTKFatU7nm+9FJJWOjW/RjhuKUuv3yc1zCzh+narMDsTgGsJR6nr0avMkjf37uTWfdjzE2qPemebKh2t0I7U0zgptPWsE7anqKCl7mxRnibZx6VlqjtuJ9a2nLEZJrPllRPkHWpU30FVw8eZXegWtmsh+c8AZ4rcKRtEI1HI6VkWr/xe1akQPc1i2ehSpq1kZ01jIvzgden1rLhtZpN2eOcV3UWwr+8GRWHfgJJujxg1lGo9mdWJwcVGM09Oxzj2bISxOTUYHy76vuxDfMeD2qBlz93pW7l3PNVGxBtBGB6VNtCioCSPalAd+D3ptDg49FqWEO9cHpmrUblV61U3bcKKnjDs2fSolrqzam7NRW5oxPuA3dqtjqOazk3BM+lTK5yBWMlqepSqpRtY0E4Gc1oo6smM1mxEHjvVpCMECspM66MdNCzn0/yavxdM1mJzyelX4m+YCs6kjpwlJJ7bmjE+eOtadu5znPNZSoOuavI2Olck2nsfQYWLi7yNITZbJNLNISoqkGYsD0NEztgA1koHR9Ybi7kErg5Yd/SqqsxP41adcjdVeMkNkjrW8ZHnVYpyTOq0acwOC43Z7V3Nw5nj27goOCa4LTS28YHNdgd8iqOuOua8PF6Sufp2R8zocvQrxWUsE4fd8rdMV6HpIjFqHB9s1zKIZVG3jA5rpNHtHkRVBIArw8fXutT9A4fy9020XbezjluC2Bzmti30gxPwM7Rxnsa6nTdCimhExG04/wAmus0+zWORVkGSg6np/jXymKzTlbSP0/LuG/aJOSsf/9T2Oa7V2ZHHbjP6c1yF48kshVOABx6k+1bxliki+UAbsc1mSlRMsZGTn68VxYF8uh7GbwSalF6HKzXE0SsJgQT1xnGaybm5kydp+ZR1+teianp8EkJCjhhyff8Az2rzjU4TasY4+vOOnJ9a+iweIjN6HxOKw01Dl6FJ7qNoSJTtZhw3b/8AXUPnOIlIw45+YdcYxVH7TO2UTGPy6U5ElGATtx0we9ewqa2PL+sTsmtSrqVgksIIXK45PpXl2qaa9oeOW6j0Oa9YaSdwVIwqZJGetcVrKNIA7qVHXdXZhajj1ObFUVUmotHl0ks8TMs/AHpV7TdbaKREQkZOP8mtRLaKZHMmMnnsP8a5i9toYJtqjA6161Jcy1R5mK5YNJM7i+8u6DXULZY88Vw901yuRI/yng+v61sQXLpGNp6DHyj1rM1OJ5YPMjGcjr6/lRSg4s3xdW8LLdamF5g3BUAyePXOarTRHIKgVfhs0Iwp59fpSxRSRAhgNufxz9K9GnY+SxtRq+nmV5rMW6Byv3ueKghnMK4YZFal7dMpEeN3HaufnlMr7EPAPP8AjWsXpY5a0m5uS0NJAkkgkIP40x9PErkx5IHJ71ZhmVEG/wBcj6VpW00U6kj5cc4Gf89q0ctDh9leVm9THtrFwC208/zqMWk6NuYnJ7/410ROOFHAPORj8abbozrtbJ9c1pTmcuIopQtJ6spyJhMqMsefTp3q3aSycyOucYH+FRTMkTeWccetX7cKYw8fT0/wpv4bHJNLn5yfTS7XZkmOFXGPxroLqZNwCHJxyOvGawk3R/Mh5P44Iq1aqzuWJyen+Pb8a55R9651U3+6SS3Hq7W8vnHjPr71y+vPPcYWIgbupNdZISMBcfL6VzOpOzsF6n+VEW7nRClGV2mc9bIUIH3TzkZq9Y3d2kx3/dBJx6VBNbyk+crYUc1JHPDGAxHX9K1Um1sY16EU1yuyR1g1NpCG6Kv+ea6SHWJIogkR3eteYy3cSLvJyDxj0/WrFlqbNIFjPA7VnOhpsUsQoybT1Z6Peao10pHQgY6dPcV2ulXcYsIstljXlayySZdyAf0/KtHT9TkgnEDHCuea46mH5o2XQ7KWNjTnzy2eh7NDKJE2RE9fr09a6SeVY7dGV8s3UjvXD6bqFvGNh+VAPvD1q7NLJO7eUx2JjJ7GvMnQfNc6njb0+VrfoXrnUY1DLnO31P8ASs601OQOPIPLcj2FZd4TJEVQgHPXPPTiqOlxzRzmRz8g/CuhUY8rOJ4qbnFP7z6t+H5nd4LpMjHzMfxr6c3Ga3EpHUbuDXyz4HvfKtoQGwgw2ehweK+ntIle5gEx6H16V+c8QKXtL2PuuH4w9nyrVmJdWzuzOw+oNVZbALHwMNjPJzXcTRYQnb+HrXF37vDM7D7vOM9RivLoVm7I9WtSs+YqW1yd5gPHGBXTRXJUAe2PTFeVwatcW+qBpeQx/CvRVLXCrcDgnt/WuzF0bWvscWFqK8uTc6O1kZGycknmuo0+eRZAzHC+/wDSuJSdocNJyeKs22ogyh2Pv17V5VWjzHr05OFlfzPdtKljni+XqP1/CuwsSpIAOCPWvCLDXzAuzPfrXdaZr/msAxx69K+azDK5K7R7mX5rHmSkely3i28e0n5jTbG+VZctXOT3UbQeYCAc555NQWtw6PvPNeJ9SXKz6ani+Zpntenys4U9c+9b0rtsC9M8V5VpN/OlwHzxnvXpkNxbywAscsOwr5bHUOWSPo8vrtJpMvpH8oLDjt+NRTLtGeuajN2EwB6UxpDIMJ1rznTaZ68K8WrXERDuAbOD/wDqrRldYIwq81kq3O3H/wBamXk5ABRsfWqdJtq5SqOKtEikvT5hJ6HtVy3lT7y454zXJXEjrIEibJPNWYZGbGw9OvtXbPDrlPKlWlGW2h20bI2B3qVo0Y8d65e0u3btW2ku4/NxXnVaLiz16c4zSsUb6353Af8A6qx40Pm5j55rq54mYfL3rHe2Ctg+ua2oVdLE4yivisW4ovMYbhz+tR6qkdtYyXLLwgOR7Vr6UuWw/JzxkV0w0yO+geGYZ3DGPWuKeKUJanpUsK5xPz01q4it7W81O4zGFLFB/jX54fFfWrO71JhymWbJB446V+nvx+8MWPhzR7jzH2bQTsOCSO34V+OPjOcXNyXmIznA+hr+juAXTrL28dj8W43jUppUVurnmHimfz5Fj6qBx+dcbHaytcF4SfXiux1aKKKNV6k9/aqunPbwl2l6AcD+lfsWGrWgrH4VmWXSqVZcxpaH4ilsrtZrnJ2YAA45zkGv0O+BHxZgvDbx78yBwACehHavzeaG1uHJjbbuwR+degfD/wAUXvhXU45oZDiJ1cA8jg1x51lNPF0HFrU87Jc6rZfXTTvG+p/QVovj+xvIktbgbZsDIUc4ruIbshN4OSRkD27V+XHw4+JGta5rBlLFQRkoMc4Hp1r7i8MeKJbpI5Lpy0rIFAXgDHav5s4h4QeFl7p/SfD3GEMVBXPQdY1bcxV0+fGQRXlGtajMWaPeQo7A1319dxyuHJ5wcj615F4ska2gku4+oBOK5cnw8U7WOzNKrl8J574s8S3kWIoGHy9R04+tc5Frk2oW7NIccYJzXCar4gMkxR8Luxkn+lczqfi6006DyeWBGCy9Pwr7ilgpO0UEYUadO9tSzq2sCK6kiVuRng/SvHdZ1CWQgrkkNjirkusxT3jTTTYUnGTzxXNeI9Us7YieMrtIJHTFfR5dl/JK1jzM7zZ1qXM9loUr/Wktrf8A0jqx4HNcbqXidJ4CoJyRyO1cpr3ipbttnYcZrgbjW4ERl8wbx19xX3GCwDik2j8kzjMYz91Ow/UNQR532cjp19azrd4wwlUncGG0D3rmL2+RJAVOCepzxUum3DbxIcZGSD717/sNNz5H630tqfSXg6Nbu2kkIBKjGBya6aHTIrq0fkK4GAO/9P1rzbwXq62BN0QGJPT3+ldjFrgkvXuFXgnPHAzXzeLpuM3yn2mWR9qo85FJa6hCVjiJVh9TgZr0zRdbkWzS1dwQgyTnnP8A9evO21OPzjdyH5n4wT/n9K5tvEKPdyIoI2/3en+fwrClQdR2aPUzKap07c3ke1654vtNK01ppn+YdB3+lfMi+J7vVNRbe5LFsjBwAPSuU8W+OJ9QvWspFMcWBgH72a5PTNSMeo/aUPyoQ3FfU4DK1Si31Z+VZrmUq00uiPpi8v0gsPPuJBHx1Jxjj3rkP+Ek0tMl51YkEnafSvFPH/iy8u4CHXCnBGOw968Ui8S30SiGN889+v41vhsm543kyMTxOsNPlpx2PqzWfEFo0AIkGH59qr6XrVrEiiNw49M184y63dzRRrM27FdLba/FbQhJGHynPHWnWylJWR6eA4rlUk5tW0PopdaZlEm4eoz6Vh6trG+3YlsMTgc9j6V46PEguMurgBeBg9qyn8TxyylZiRgkAmt8JlS6HjZ9xPJXuz0B5I2Us/5/1rm9SvPJidR9PwrBbxhEFKufl6DP5VgalqEbxmQtuL16awUk9T5qnn1OcWofMqf24sd0UjY4DZxXpmlanaPYFnbLdlr54u52t33r39ans/FDWSlnPP16163IrHx1Tnk7PVP8D6Fg8pSZZOFJz+NdLo2u25vxbow649fqa+Ubj4gTNb4ds7Se9UtO8b3pkZreUqT+B96xeClNvmZ01Mwo0IctGGp+o2i6/pZVIFul3nHGe39BXqmiPGjM8cgbPO3tx14r8j9N8Z3kV/Hfea3mrwRngn1NfT3g74qXlm6Xt3uYjAHJII7j8Otefjsji1eL1Z5uFzvFQqcqh7q6X2Xf/geR+jWnXscM6xsxYsOMD9KuX+swWs6rMQqg5IPfP514f4Z+JlhqsZnm2r5K5Ujp71d1ifVNWX7REAUblHPp9K+CrZc1PlqaH6jgcWmlWp66HU67rrXszC1cRKgJ444xxjNedpr8TwPA8nI4z1OT9KrmKe7ie1lk/eAZHf8ASvMdUhutO1Hyom8s8sR2PfNexgcvg1yXPLzHN60F7dQ30+89Cn1EXBWMHlRt6c1QmVWG3PIGT7/hXGx+JbdpShcLtyCB2Per9pqokuRubORwOxx3rs+quMtDjeOU6UnJbm5a3YtVEMvQgkfU1kSa3E9yBdFRJHgYGOR78VW1/VRFDHLCMO3txxXnkLvPrUmrTkeXs2hDxj3z719FTwylDnkz8d9vJ4j2dKLfvJPppa/4Hs11rEksaxJx8ucjFcDqEjyybfMLM3JUHOPxrBh1q3kuPIkmyRx1/lWlDJbsrSxjP9c157/d6H6LhMsjWaqRVmb+mTPZW5Vgdq8knr7AVha94x1jSNS/tXTH8uJU+cnk8D0rLvdWkVGjibBC56V5p4ovt+iSRuTiXAbnAwOtb4GEZVLzW5nn2AqwoctOTutdPLY9Z0n4u+HtZtLWF7jNxMBkEElT6e/Ne2aLr8csYheTIxuyeCc9u9fn34chW/y8DxxshyhP3uPQ9q9r1Hxwmg6aL2Nx5iIBjPoO1c2e4CHPyQPZ4AhV9g8Q9+9u259E3niq2gvJrZSoIBJGcke9fDfxQ8bQavrcqrOCAcbl5zjqPpXAeIPHGr6jNPJHI2ZiTjcehryB9RurV3SYb2fuexqcFk8afvLc+txXEVSbVKV7fn2PcbJY54RN5gChcZ+teceMLJDKmneHyzSkAyHOTk9TisWLX9RtIXUzjLrjB7fSt3wNc2s2tSXh4kKYw54JPevYweHcHzNni5/mca8FThGz/E5Gfw9Ja2yyyfO3TPbiuW16Nba1QhVyx9OoFfQWvR21vE0ku0KuR2HFfNnjO9tri4K2zfKgzgetetzrZHw6o1G3OTs9Dlbu9MSGRB+Fc7e6gj5k9ayNR1GRUChuh5rnJrme4OCcAVzzp23PepYtS1ijUuLlmcBDkd6zpZS0hz3qGPjB9aWcMIwe1Z3s7HQ6V4873ELsThelOBQ5B4NRhfLAOc1FOx2blHenGV9BVKfKuaepIAuAq1YAKMF6Z5qirNGuTTgzA7yePSoqStudOEoqasjYMhzzVfJDE9jVNbneMUizN92sHc9WEVZFmR2I2jp61muhL5PXmpvOYZX0pVO/5sVHMW4XRNb5RQD3NasbnPPINUFbOB+VWAGHzGspSO+hTfNoXmcr8o71Su3ZgKcZhtwfSqEs/wAm0etYpO521ErPXcqysM9KgUHBPSmMWYlm60jOQlbJ2PNmk9WLxuGenepflD4Aqosh71OXyQQOlVK/UyhJbosRqGOTUygDoeKrq5BwOf0p4IU465qEn1OmVk1Ys7uOKlU55quCenSnLuLYoNHM0UOBxVyMkjC96zkQjgHpzV2MjGR1rCdnoejh01q0XQdnC81fgPG7FZiuQvzdavQvx9K5pxdj18NKPOakW4jHSrkZGPfrVSI5HPNWyOARzmuWUtT26dPqWY3PYVHI2fcmlUMqiomVt23v71EXqa1IvlVhyDt61Mtuzv8Aux+ApkSMDjpXRWtsSA2Kzq1bHbhMC6jtYl0uExn5q7qO2VkBXp1rAt4NqhunpW9alwmM5/CvBxlbmd0fpmQ4NU48s0bFjDC6eXNxu9PSvStK0y0hiTaSVIzXnFqJA4I9ucV6LoTmRfJIOBjn0+or5bMpu2h+p8P0o83vI7mzjaNcI3GOPSugtIgYwz4z0x6Vzun4yPMJ4GK6y1QeXtyMY618TjZNH6vlCg2rH//V9GkjeWP5ScqP85rHlSWKQyP9Qf5/rXQ+fBO+E+QDrjjOfSsvUQyzZQk7e1eVhazUj7bNsF7jRzs+r3NuDHIOCMpmuSvtUFwu+VBn1zx1rtL20FxGVi+8g6E9zXG6lp6Qxs7n/PtX0OArQb21PkMdgZwdl0+4wrSaBz87H5m9at3bDYUUccHPsBWLJZvuEkg2nsR/Op5bho1y3U8f/Xr3oyTeh8tXoTjFp7sbZ3TCcsPl47/Sma5a29zZvcE4wM5rNnuREVZAR6nHWrGo30TaYVQgDH+f1rp6qSMaOFdnGTsjxKe8vItRMMOQoP6GpJYmdQGBKqeDn/PNWSZJLveuDk1vrDGy5i5yOc9B7/hXt8zSVj52bhKo20YthHHIA2SW9DUs9rJJGUU4yMjvj8KWG2EdwWTjPbHX+taJfD4JyCcdf6Vpezsjmq1G2pNbnGTQS2hM3JA6mqj3GRmNvYnGa6i7gS4YsWwO/euSvraS3VmHyjJ/ziumnO61OTE4ZRleOtzLvQYxv3lz2HpmqsMhLZTkA8+vFWC/mNkgZPX/AApqwgYMQxnOcetdMJpHDWwreiejLshSdArErn8eangmjj+Q5APHB70RWys/X8Pr9Kgu7N1mDYwDycelXGa2ODEZfrfsdNZKJk2knIOc1v20MeCqDnHp1FcLazvEMt06810mmapGXZJOgwPb0q2nZtHkzhGElF7dC/Pp6Kf3oyDz61WRRD8gYYHFaE92rx7F4zjpWW7BRulPDciiNTTU55YdJ6IsKwyrMQD6jqTWvaPE6444PYVi2f7+UYP09q6SOGONRKpBPOc8Disqs47HTRw9W6l2MzUbkqxBUjPSuSuW3sWTO4966S/kWQ9OvP5VzcjeVMrAcMazhNpWPSlh6bkm2U0S5hXDfdYYA461I1u3ljyxuz071ueRFK+/dgY4/HtVV2ML7UbHPTPrWsaj2RjiKMX7zOSnTMnkEEY5Of8AP4UtpJJu3x9eevoK1tStsAszEMwwDWJFbTWzBZDhjk+oreM7rc5alJxeiO1sLksnzewrpLaJZn28k8duRXIWcuYwCOcZroNM1OGGfZJzxwT0rGdvsmbhNNc3wnbrKbaHbESdw6enalXW7uOy8t85OcH27fpWBNqCwZ3DI4465/wqncXryxgxgqSM+tc/J3QON7yi9Ui9ba1I16omJBJwe9etWFjHMFMLAggZHTnv+NfPDGWCQS85yPrXq3hbXGZ0MxO4AkgdM/jRi6V0uU8/C1akJPnV0z3vQbia2tzbocqGz16EdvpX1z4f1G3l0uPZzhQMd818U6VrdurOGkyrDuMYNeveDvGMKTCCWQbScV8PnWAlUjoj7TJ8VGElUb0eh9QfaY/K80kZPWuW1Ronhdxz+n1qnLqtu1qJomDDH16VFIq3FsZpG4I/nXyFOhyu59x7RSThvocTfxsjLOx+Uk4H/wCqu90SR1tttx06g9a4a7uFin8k5KDqVHeu+05TbxRKvII4/GvQxbfs0rHHhMOlWbuauoQExKyHI9KpwLMYwvT261tJbs6NxnAyPpUKW8yDptB9f1ry6dTSx6NWi+bRFywZgvlHqAPfmuu01/LdYV/IVyMA8uM7xgirtjI4kG3dk/nXPW95MunSUbXPYLe5OzDEZ4rYVUeLKkAHv3ya4e083YM8k810drK4Cs+eOxr5rFU9dD6bByXLby0OqtnngQHI5x+dddDqDxMsin5umK46NWKq74Iq/HIPL3k5z6V4WIoqerPWo4pxdkegxXhkO9zgNzV+CbccDt0rz5b9oE5OCePpzXSaVdrPJu3YBrxMRhGlfoe7hsTF77nWOpGT0x6VRbl8NkY49a240z8p5GOtVIrfLktggmvJVS2568qWl0UpbRGUttyfUfWqMVsV+Qda6rbx5RHHrSfZ1EeQPm75rNYmx006HOtWc3DH5c2F5GecmutgsS4Eq8gdaz7fT3+0byPlrt7OFREFj7d65cZi9rHThcMkzKWPOF7+/wDKqUsAL4fscit24Ybs/rVK5kjC4Xg+1ctOR31VK7v0KVlbusnmNwvU16Voi27RPdSsAic59BXm9+jtpLXMB4jyzgdSAOlfP/iz48aXH4cm0yzHktJlWBzweh6GumjlNfGvkpLrZ+RqsbTwidSpt0Pmb9sXXrm+1+5itGIt2Yg4OM7fWvy616ylk/0gA5yccjt9a+2PizqbalZ+ZO+5mJIyeee5FfEV5eu+oLGPmQMeRjpnrX9TcGYJ0cLGnH7KPwjjHEU54iUp/a1OElsLu6Rp5wQR1ArM/wBQxjxhcdfUV9CXOjKuleeygGXnHrXjOsRxvO8LrsUDr0/Gvu8DW9pfQ/NM9w7w9o3vc5Fb21S54cgg49q7zSJtPikF0wEjZ6E5rzxvDN1cTM0DfL7mmyrc6dKsUbZ2HnkdK+hjRjJWT1PyrE4qrG6nHQ+7/gX4lhj8TILoZgcYDf3T0AB9K/UTwmmjq6SRMGUr1HvX4S+EvEy2EO8yMkqNuA6Aj619zfC340Tx2CRMzTlXAPbaMZ5zX5lxrwxUr3qU2fo3A3FtKmlSq7P8D7m1zVo4754Ld8be3/1gK8n8b+MGt9JkEwCkgge9YGr+Mbed01FHHzJlh6Dr7188+NPF39pGSQycLnC+1fnuBytxkoyWx+90KUK9NVIvR/hY5PU/EENxqm24bjB4HYjt+Nc/q+tx3KtFDHkZ7nuK5bzFkvPNueVyTiq15eJFMxV8BelfeU6EdEjx6saiblffqdZb2ltcQN55GB1z+leF+N9RSKSa0hc7VOMZqbX/ABRJbwiOByrHnPrXjWqajPPvd2J3HnP+TX0GWYCfNzyPkM9zSlGm6Mde/wAyS7unFuXjPWuPuZSWZn//AF1YkukmyrnpWXIqvJljhc5I7/nX1lLTc/L8TTcryWxSkllnkHmdOnWulshLHENgLVzUmNrMBgjoetb2h3hmASfsOOcVdaWl0LCYZKfI3qzs7HUJrbDyt0PPqOlasni/ymEkTcD05zXF3dxsj2HvXKz3DxZOcDGcVzwoxqP3kd+LrVaEOWDPdbTWrm8lAz8vXPei48Y6VpCXFtKu+Zk/dsv8J96+bZPiDd2dsbGBQrHueoxXMSa+ZHZmclmOc55+ld1DJE5Xex8zmPGbVNQp7nosk0t7evczvuZznJPbtT5LwWshaMZ29R06Vx8eq5twYvmJ75rOn1RlRiT+tetGhqfL18ZGyitS3r2vNqB8nGBjuc1wJYwyEtn2qxcXsYclRVMeZckuOldUVyqyPMlF1J88nqaMN4zDbk0MzBtxJ20+28iAAsASRUVyHwGP4CsXLXQ9OGHvH3nsR/bnhzKv3eRVO8uz/rGPB9Ky7268r5BWZcXwC4yeldNN9bHmYqim+VvYvvqIHQ8Zz9Klk1gCPbI2TjPvXHvOc5Y1i3eoOOFPQ11qfU8SeDu+V7I6afWmkbDHHvnmsK61ESMSDjrXPPfNkH1qu03mjjrScrmtKioaGhJcMWPPHpSW94ElCqcE96xvPZuvahGYNux0pqp0CWBhyuSZ6Fp96hUktnB//VXu/hbX7MSRw3L/ACKnTOPrXynZXMkc+ByjHn8K9Z0S7inmi83AGfmJ7V3UlFvVHyWb0qyg3Tlb+uvkfevhe6gZIriB/wB2QCoJ/UivdrXxlcApDZkyheq9QK+NPDnjDSbYJZiQ/KoAOPlx617r4K8SaVDdGW0cSxy9SPug+nNfL5rlTd5SjofWcP8AE9P2apQmr9dddOx6lqOp3OmbdUELFm4x6e/XvXlHijULi8laSbMblc89fxr1ufVrTUpDKrgL/COuK4rX9FhlsZr0tlwMAn+nrXkYWahNKS1Ppq2FjWoe1UtN7fmfM/8AadwNRPzk4B57HmvVfDd5LcxrJn5Yx1/GvPrvTVhvnzzgenrXVeH5760tlt1A6dSOw7V9NiUmk0fDYSesoz2Z1F093M+5yTt6ntj2ri/EEs0cDMQUXG7JI5NekRzwT2o3NtcAZyOvrXKeLYxc2whjXPmDCkcgVxwxNpao9TC5NGcOVSuvzPENE1a6l13y5HG7kntXryalJaRoSeGAzjHWvFb/AEDUNL1Vbu3O/I5P9K6KLWclYrzquOP8K0xkubWB7uS5by+5iHaz+/5nfanq8MduVQHfIMj/APXXk3jq+ZPD0uHx7e2K7e68mSz+0Z+Tr6GvAPiH4nhGlz2Odu8HjOT0rz8C5SmuXufcZ5hKNDCSlV6rQ8h8N/EeTTr1oLjG0ZXdnoR7Vq+IPiHq2q4jhl/d57elfNuozSRTkxHAzkmrWn60Y5PMlyR9a+urUIyfPbU/F8vzOpSisPKWn9fgfQGk6m8pZCeeDyf5V1vnaNJCWJCkcnpnIrwS81y1h01bmIkMQPrXODxbdiPyl59GPpXHLBOpsfSQ4hp4b3ZRue6arbWc4823cEd+ORx0ribjxFLoc/8AoxKO3IPpiufsvFTCJp5fnYcAZwPrXKa3qR1CTdnB6gV1U8O1ozx8RmCd5Qvfc7TVPH2pXsP2O8k3AYOck153qOp+fMfLb2JrHncjDNzWckzAbiM1pVtF3OTCSnW91P5sdffOT6YqEbGjG3v1pZJEKgMKSPbniuNzufQ0sPJSQrkIoxUbTfL/ALvemysFB5qkZVMLqx69KyTO6UdLIs7g4Azz2qB3YL5bclaoRysenapN7ckGpdToOnhlL3u5O84J2mmyXG35RzVEyZfdSNLjrWcpanXRTSaehObpQ21KsRzZPXmshiN21KsxKzHk1kn1Ot3Wieprplh7mpkRqqxSEZStCBCy7icc1MtNTrw3vNJbksY5wasB8cMelV+CTioHck4PFYyjc9KnNRYs0oTnNUXkJ6d6dIm/5T0phARDTVkjnm5uTfQqmXk5pjyELQ4ydw65oIycEVqrHDUc2midBnAqVTu61ErAtjrStwRg9am99DRysrosAFOtPBzwBTFJZcEVIBkkCkmbuF9ESgknBqwq55FVxnGCKtRgbMis29LmtODb5SdSThTVrBBx+dVI1JIJ61fTIXJrKbsz08PByWpYUDGSOlXoRgY61RTJPNWkchunFYS2PSpRtqzTiI6da0IlZue3pWZCQeRWtC3Ga4qztse/gmpJXLcK057fdISeKSJiHxWhFGWbJFcsp2dz3KVHnjy2CCAcHuOea2baMq238aktLMuoOcLWilriTJ59K4qta+h9Dg8DKNpJDxnyx2rYsCUcMw+WqiRA/ePetW1Tnjn/APXXl15XR9jlsGp8x2dlbxOu4dGFdRZMttF5anrzxXH2shBCHg5roraXcoiA59e9fLYqDe5+oZfVikrbnYWlwruM8AGutt7oOvH07/lXn0KkEBM59fWu409MggnGcV8/jaatc+zy6vJ3SP/W6+GR5osA8gVai+SRXkHBPT6d65LTtVDBQuMe4rp4pvN564HfAFebVoyi2pKx+hQxEGlyu5r/AGKCViRwSOTXM6pp/wA+xlD9BjpXRJKqgY/P/PrQ+x0Lf3vX/PNYUK7i7k4jBxn7vfU8p1HSw0R2r06eoxWEgBTyrjjAIyf0r1bULQyxsETDetclLp0mTHKnOckHkV9Jh8epRsz5SWVuM/aJXPObyCM5MTAE8HIrLuNKaS2Zcl2YcDPeu61TQts+6Fcgj8iKpx2jQkCcHjg/n0r26GISinFnz+Mw0pzftI26Hh95ZT2spVFIcHp1FXLCOXGTjOMA13mr2is7EDhuc+g7Vy0ULI5TAZSOa92nibq58tWwMb8lxuxfvYzjk89h0rGuZhGrtwvHrWmzvASxUkZOeO1czqsry9V/i6dMZrojLXQ56FBuLT0auWra43HLg1BqMGTtUcMMmqVhcvE4EowOmf8A61bMyLKm48dvcmt3JJnJ7GaTscbJYFOIhgg9fepIrYImGGOOD7+9dAbJgfM/lVO4jWR9pPXvzzW8atzlq0Wmr6MyYOZdyHHH8q1imSSwB59fzrOj3RTFeprbjljZMZxWvNoeZVwzjKzehgXX7uQ7h15wKiJaFxtHXvWpdx+eM4GVquBKPlZc8cHrW8atjy55ffRuw9L54WBI4A+lWJZWusBc49KyXiyQzAAZrQt5kRdrY2ntTlLW5nGiuTliyzaGSxn3cn/H0rql1ATxZXvwB2zXEzXQUHGOD2NTwX7Rx7T3+6TWM/Q7aFFW3OguVVAZX69PwrEVkuJ9gwG7e1SxzvOg8wj/AD7VP5FujrKhAI60o36mFeUYt8gsjSQMF+9x/kVTtkSe4Pmnaf8ACrs7tNJs6ADg/rUDQFGUjqfWrirLzOeV5v0Kur7SAU5AOQRWHDOLxggOXHX2/WtPUXMce373f1rnoIpFuPNjJBbOa0g1YKtKo/h67nVQW6+QTCd23AJ+n/1qoiUh96nODUUkjxxggfMM8Dv602Eq3yov5DpVJ21ZyTi7KPY6+1b7UhYclR0qFr0QMVfp6DoKztNk8jKrwpzn6ionLtN5ZIYk8ZpXXNrscs6UlSXLua11PJcKoPWo7O/lsJjIflI6++c1UlLBfLXhTVe6BdNo9e1QmlodLwTmudbo7k+Jp5PlU5DD16f/AK69M8C6tJeTCKcngdQe9eC6b5bHr97HGe9eneH42SMeW2x85HpWOIprkaOGlQ5qq5emp9K6V4nvrWeOLO+Md+SP0r2CO+kmtAmSA56c85r5z0LVIokLXJDEctXp1n4n89hFCcrjH5V8dj8JeV4o+2yrFQgv3j1PQmR5DElsOVG4nNep6VGJbVGIG9QMn615FpF6pZSTnPp6nt+FeoW95LbgCMjaefr9a+Yx8JfCfS4GpGMrvqd3pyxzKUXGT1A65qdrAqAFPAPHFcz4cvHuL0JHnIJPHSvSZI85xXzeIbpzsz6LDuNVcyObex4245PNWrezwwB69QfatQoGJC4+op0Vthyx6f57Vh7d2sdNTDxeqOo0yNWQI3Qde9dDNaJAFkPK455rk4bsQnCHitK/1WP7IY/XnrXl1KU5T0OmnUildrYvXOrBE8uMjA6fT/8AVVm11qIrtXls/ofSvLRcSA8kbs9R6fjWhb3ojYMM8cde1dEsuio8pzxx7k1LY9Oa9RjyMnius0S8ijI38AnpXkltfPNlk4PQda6/T2l+8wznn3zXj47CJRsz18FiW5qUNj6IhuYGtRtb9OajQlxkjGTwK8wsNWdJQshIGeleqaai30IlUgYHavhMbhfZas+5wGJ9r7i6GhHEWw/etaDT1mw/r2/nVZI2QKowcnrW5EFiA+bBwOK8HEVGlofRYSnC1mVrizWNv3YzVVZ3iyq9T+lastw4UqyfSseZ/KXcyhc8DPesKTb0ZvWik/dYjO27L9KqyBWkytWWbzU+X9KyS7KTg1100clSb+RhaxfPFZzWyPgMCOOK/MX4k6vHpXiGY3ODGXJJHY+vpX358QNbeygKwjc5zX5y/EMW+sX8nm9Wyc9i1fq/AuGtJya0Z8rnk5Omk3bex8/fELxgt9Zv5BJA4znnHtXhenKLw+byE+nf/P8AkV6L46tbXTUe3YgkDI9Oev5V4VPrp0+2a3iYjqSO2K/fMroJUuWmfjvEFVuqpTeyPc/+EjaLTBbXX30BVT7V88eJ/EMYlfyn3lm/lWDqHi27EZViW+vWvNbm8aedixyWbOa+ly7LlTbb6n5zxDnsq8VFdD0pvFc0aLbBfmf0HXNZ1zrG6AWrH58/jn61xV1dkv8ANw3qK5y8v5IblZS2T1r36NCKWh+c43FVXL94vdbPZbbUZbK3S7ZiR6D1+tew+CvHVxZOt3b4TfgMpPavmmz8Ri7jhtEUMucnPPNezafbQWkUUibdzAnB7is8ZRThyzW5GBrWqqdN6L8z65h8bGfREukYiJv09Qa831zxUtxIdkgG7gdq42HU0i0Q2qcJnJAPAzXkus63iQsGOATgjpXxkcng6jZ+0YLiadHCxpp2T3PXb3xfFpzBA45Gc56e2K4XV/iC0qtIr5bGAPxrx7U9YlnbduyOa5Wa/kOQrdepr18NktNatanl5lxliZtxg9GdNq/iq5upS2/dyfxPrWONYmuyFzgdM965XzefmOf5VGJ2XOz/ACK932MErRR8TTxFaUnUqPRnT/ayQUU89K0Y7sGIB/xrklmQkMvWr0UzJwo/OuapBNHuYBSvpqjs7IrIduBzxn0q2IBbuxTgj0zXP2szAg/jW693bRDO4A9x71wzv0PosPSik5SWxTlvZppdk/XPINUdTjGN68Ketc9qGuwC6LRMApbGc1harr8lzmMNhBjBFd+HwzumfM5lmVOzi3d9DHv1USuSB149KoxxrIcRmst7155TuatC3kjjiyhy4Oa92nJrc/O8RThLWJu2/mwEbv8AP/66q30iu7eV1qr/AGwvlEN94etVbW7ErFJSAarW7bMlGFoxiMniCgHPJGaEuJIMqvT86ZdzbpQuQfSrMqpHCMd6bbskyowi6kpxYyG5aWQNjH0qa+uC0Z7e1ZUD4k8wfLnsarardFDhTn3qLa2OlbXZlXU65LP2rn7m6BUkdKZf3bNuyelYcsrEjJ4NdMYtaHFXcGr9yxNdfKV6Vk3FzgjFR3EnXb2qnM3yjPWolLsaUY6u41pyJh6VaYbenes8AqQTVzzVGC/HFOlU6E4ug0nIkWBnXdTEhZjsPrVtbjanuav2ao827FdNOF9zxsXXUdIbklpp+QAeTXfaXaXMaKev1rMtIV89So4HtXbae4jjOwcZ6VqpOL0OKvThWXvq5rCw1G9gEkAwFwoPbPHWus0C/wBc06cWDSfxc7TwKfayobdYmbYo9OlXpLZriISw/K6HHHerjjnNKm9jx8VwvHDyni09Wv8Ahz1NvG13Z24KygLHkkd/fmup0zxvc6rYqyEBGGSGHNfNd5HMyZkkAK8hPX1FT6fr1yt0ERiNmM88VGIwUOTmtqcuAxdWdVUuZqPY9V1LUXS7bkgk5Oa3tC1fMAik5Oef/wBdeYz3JncXspznr711+jJGLUTp1Pp/hXl4p7I+0yjLUouUn3PSJJ1dVZTgLyfrV5LnTxpjSXEnOCQK4meWWK1V3JIYHp/Md65O/wBVhSNoVkIQg5BODmsnhOZJs2jilTm4QepQ8V+IrWynEKdWHQ9vSvL49Yga6LysE28fMetZfirU55VmuSS6KpC56ivFzrMrHEzEnPJr0fqKUdDLBZ9KU7zV0tv8z3rxB458i0aGLn5eADxmvlPxdrl5qN080jHArT1vW737y9O4rzzUruWdH38GtMJhFDVGue5zOuuWT218jCuZmYms2JjG/IGP6UjTEn0qMZbnvXpc3KrHx6i6klJFiXVGnXyGPHpVCWdGbiqM4KSfIOetZ7vKzbvSlJ9UXSvrGSu7m8J2RSd+Mc1A16zHJPQdaxTPufYfSqzz7crmsJ1nI9CjhoU/esb/ANpL8Mcg0jTBTjFZUUwZevI7095lx83GOtTN33NqMeWT5CSe5D8VT8+TOQald0bGDUW0Fs1z81kerKlKpJXZNLMcCoGaNU+Y9abIAw4qEgNgNXMm9j15xitmIJRFz60GZlXA70NGpX6U1MA4xmoqLW5rh5WtEiDFKHbPTvTjjdkihsEbhXPz2PUlRT0Q+JQGy34VbidWbiqQ5YVbiQK2VrSKTjdnPOU41OVbF8Ebtwq4shRQKzg+04xTvPO/aw4xSa0OqM+WVzQDkncfyqEyAvkjrVYzHPHSmK+45NZWOqNRaJF1cnpULPhsd6QPnkc1XkcsRUo0nKy0IJWIbAqTORUMu4HJ6GnBlzmtU7q6PNTam1JkoVi31qdQWHNNU5qeMcfUVLqM6oYdLbYnAUYp43enFR44xUkZwMViegvediaNxtqdeO/9KhVcsNtW0wWNTKR0UqN9yZV6N0xVrO0YHFQBT2NW0jBwe9YSZ6lKnLVRJ4gCMZqyU4GaijwrgEVbDDFYynZnoUqXuajlG3jsK1bYhlBYcVmR/f5Fa8Q24C/h7VzVHc9TCQtrE1LRlVuRkV0EMKsRg4xWFbx5HArftgqjnrXnVpdj67BQvFRkjcgQKBGPT8anXIbc3HaqsDcg9KvAO3A69a82po7n1eEp80UTRMGXaowa0rTA4xyay4bd8bh17V0NnGJMEcEda4a00kfSYDDt2VjSUKzA45HXPrXYabb7oxIw5rlhBP5g7g9q7a0bZGOMDivncZUdrXPvMupe83Y1bWF2cHr7dq7OBlwNwJ9fwrmYHIUBeo61v2LKCp6ivm8XJs+7y2ko7H//1+W0u/jhiCsc55/EfnXfWl8HkAB+gH1rxHTbxXOxuwr0PSrsGYh+oAII/lXo5lhE/ePSybFyjaJ6vC28gEZ9Per626Z3KenQVytleTMnzYHHQdev61vQzyFsk5Lf0r4yvFxZ+i4elzpMsPCrNh+ufSsq5hwCgTIJ547A1rghyCB6c9qkMBnUg/j61lTr2d2drwK5OVHI+R9oUxqNuDjH+RWLc2SwyESDGT3/AMK7t7HD+ZEv61n6jaq8OFHz/SvVw+Ns9D57G5ZzrbY8xv8ASkkXzNuYwCMdhxXn9/ZxwyFlj2qOOvb/AOtXsk1tJGu0jtz/AJ6ZrjtQslcFhwAP09RX1eX5gvtM+GzjI22nBas84vIIXtS0ZKnHP+eK4CeCaRiADgd/6V6he25OcEY6c8GqI0y1ywXr9etfQUsSo63PAqYCUkoqNrHncNtIp3uMkDgV0Aty1uC3THArWexiUCVVwccDFEBZITCVHTtXTOvfY82ng4wsm+5hi1k2AOeT29qxri1MeWcjnp+Fd0LdCGDcEd+eo9qpXVkhJ3DOO31op4mzsaVcrU0py3R5y0TnLpzxjJ61bthIiZXP09a6ZtOhIKnJ9vp0qrJZNnYOPw/pXbHE9Dwa+Bi1pq0Z4jaVcZwT6cGrMdgYzuZcqeBn3q2lv5XCDn8v51s2cQnRc+/eq+s22POeA9pdS0ZyV5Z7v3bDAHPNYU9nLtJGQR6f1r0y403zlxGvPtWLdaU0cW5OccnI64raGLOSpkivc4BrR/J8x85+lET73CtnCg//AK66iSFcbSOnIqiYI4m45z1HetFiL6MKuWpSXL8zMiu5vtXlwg4PJPtXQQx5beTjPt0rMxHFNv4HUVe+bAK9+PYfjWvNfqeZLDSjFpRui4SFfYi5/wDrdxUUjBGO7HHp3ph2hNzH5sc9OlZxgYyfKxAPrUqVnY3WHVSLfVEdyVkfnovSmRJDOhZRh8U4fMCGOMHHT9aeCYZFdDz/AJ6VurPRHmVpOCvNlWWIhFjPfpUab0cr26fjWrh5U8xlxt9KrvBukCnk+gol5hRqRdu4tuZGT5gP6VbtlcyFQSR1OP0qoNqsd2cqeKniuvL69qJJmCagryLt0hbK4yF71XWAqmG5qxBdqWwTwcH/AD9KsEoVHcHOOayemjOhVNLrYZZRQKd5wO2MVu289xbNm3fofWsCMtGuM+wp0LymXbzjHNDfQ5Z0W/e6s9Rtb243maI8MBXrHhNLm5ZFuCPx4yK8I0q+IKoR8pIFe5+G7grAsufQdxivKxl1Cx6cIJ1FL7z6A0O32t5bDKjGPavSE3JGAuAAPxrxLRdUdMAkkDp1zXpWlXxnjLNxnjnjr7V8TjaTbufW4ZRsmtjsNA1H7PquE6fy9a9YGopNjB5AyM+/WvGYoQJRMDzjt6eldpperxRpsbP3cZPWvncfQ5nzJHv5fPkXI9nc9KtV5zng1pCE5Z26gVmWEfnQqQcZHb37VpOk6DYB+PSvmqstbH0dOLsm9iPCbArH6Z7VnajKpgCx8k8H2FOuGeJhu6Y6VVcLIvz8Z9q2pK2rMqsObRGXE0qnYVyD+FXF4/eHOR2+tOhgKuWPPXH+FaUVsCxVsDjHTrW9Sujko4PqyezZkkGc+vr1r0PSp/MjCsOfbpXCR27RSJuyT6Cuz0UNJOEbg14+PknG57eCpa2OvhXcBk8+1eqeDpWBWJyMHt7CvOoraUjKA8ccV2/hm1nEm6QHgcA9RXw2aVFKm0fXZZSSkmtz1qezXb5kQBx6VRiVyQ/WtiynjW32S4yec4xmopY3jxMFAXrXw6ru7iz7R4ZtKSJhasy+Zz9DWBqyJu2vwAOPauwt9QsbiMJ0YYFc5rFkZJS+N6kcVGGqNTtPQ0rRjKF4nGwSv5uyQ5xn16VaC+eD+Xpmrb2flQEop3dMVVcvp9qZGGBgk5r1vapv3Thhh5PSWh558StM07/hGpp7rHmoMKe+TX5165YbyYsZYEg8cZr7T+J3iPz9P+yxEFy4LBh2zjIr51urO0tWS6dhJukyFHbB4/AV+p8IOVGleXU+a4iipWgtGfFXjbwE880nmAq4B2gjNfIXjLRJrK4kSZcMnB9K/Tj4ia1bvzbqrFxgfXp9a+BviqA7uZD8/XB65r9p4dx9SVuZH5ZxJgIVINw1PlrUmSENHKMnHB71ynnmJy7n6YrT1253yFScbepribm6whA6DnNfpOHatdn4bmdL33GPQ6WcR+QbiN8t1ri7yd3fdiqU+qEqVBrCm1ViCD3r0qa0PmsUpN2todPDq72mGgYA57dc16HovxDu/KSOchvLG0HvivCILpJJAnQD9c12mkWiMRIxxntXTJrl1PHWEk53joe9QeNp5LUwg5Q9s96zJdSF8SoO3PVa5K0iDMfJB2jBpb1mtgHXKmvMlThfQ+noTqx+PVD7+d45fKfjFZgzzx361DNfRZ3SDLHvTbS8huJWgU84qm2lsdEYRnLfVksiBcI/BPeqcsMisr+9adtavNP+9yoHT/P/ANatG4hjA4PSsZYjldj06WXSqa2sY9vA8uWxirYkaMEIOV4496cxwgHeqypIGBbO3NQpXV2dXsHBpJ6ltbq4EW2Feev5Vy2qXl80jE5AIArsY1iB3K3OD+Fcf4gljt28zgcfrWlCactEc2PoT9kuaWlzlJWuASp/WopZ9kJDMMis+fVAEcg8+9cpLqEglbfyOa9eEW9j4qrJQvfY0577ypd56VowaorDcD1rhZZ3mQsM1RF08eI9x/Ou5076HgQxKi3Kx3FzfkSYzwTnNV/7XaNyWHQ1zkV6JExJ1WoJruIoSD/kVqoeRxTrLWzOxj1gSuJCMEVP/bgbBLc5ryeTUJI8+WefeoW1CVlBkOCemOK09mrHE8bJPQ9kh1OGUnLc/XrWbqt0Bh4mzXmUN6xO4tg1qrfb127skVlOko6o9HC42dVcjRee48zdk9KzZZNvFQvMA3yc+tUpZcHFJmt2rJ7ltjgbvWqz5c5pPtKHg1A7HPB47Vyzg92etTqR0SHu3PFIGLYJqCR8sAPSkLnArCMnE9WpQhUTuaJOGyDWnaTbRluPasSNwfnY5rUjkQxYXtXdTr6WPncRlaU3NI7bTNRjjBYjOOOa67StYhWQ+Yfl615DDf8AlZWtCyvmjfcTwOorT2l9GckcFy2cX5nvQ8Q2hi3RDLDr9a17HWfIQTEhg3bOQK+dv7ZdgQOPSpodduIW2Ak5/rSVFbIf1mTXNNXR9AalqUUgVkILY/CuSe6kgvA0RwD0rh/7azGGHUVJb6qly2wtyOf/ANVdFKXKr3PKxeDVRu+nmj3+z1JZrZVYkcDA/wD11t2Opixi8osdo5HPrXidjf8A2bidtyn1Pauvi1WznQCFuT/nNROmpPyJo1alNcvV9z1x9VAsC87kheUx6n1rgtevDBEjOT8+R17++axJtUeG1lRn528A+orzm98XS3REc7cDg/WtopclmeX9VqLEqole6JfEd2yW+2P5sjmvJLqRYSWI4bpW7rfiPK4C/L0JFcVfajDIobsBRO+lj0sDho++n0KWo6n5cZTbnNcZeyGSPzunqK27yZXTPXJ6e1c9cMufL7H9K2hIwr0m29dOhiMu9zjjPNTCVUzH3XrUzBI2ycY71XkKAmT1qZ1Ob0Lo4R09mrlVxkh2FZbffPvWpJKssfyjpWaRvBboQaI6qzHU9yScHcyJfM3s2PyqF1JIDjFaasnI6kZqtdK8gB6YrGas9DqopSjrqVHA+6lOlD7MdzSFNvOeTTWlLpt71hOpJrQ9ChhacLuWjYltG4GWOauIQ5I9KbAoVc55PanqdrfLWLq3bPRoYNRirFb5y+DUzbeg7UnMj0kgHBrRz6GUMPZN7iOWkzt7URlASo6mp0QCMAdT1qqV2Esa5ua+jPT9nyJSjuRyY35qtJKN21asMAB+tV0QZLVmrLc6Z88rchYgO88itSLaOetZynZ8oq5HIqpg9TWfMraHVCm1JNj5JBklutRNKDzimu4bPvVTPG4GqRFS/QuJ3zUw5IXPaqavgVZzk0SKw1uhZztHFRHB+b0pcZAzQeR8oFZXO6VO6GPINuSKj2gKCDzSkZJHrQFOQBVp21TOOVNy3RLE3OanEp3cVAFqUfIOB1pSkjop03Fal6Mb+aU4XioUkYHAqUZfnpisetzuSi42W5LGx/h5zV6MEtu/WqsfyjNXQ3z4H5VEpHXh6drXLUYJ61ZU7BzzUS5IxUgG3HPWuZzue3Tpcr5rlpHYjIqdWyfpVeMjbtyasxjA9a53I9GnG9mX4VHfpWnE21hms2IgcscitCMqcfpXNOR7OGoJ2sbcBbo3Wt5HAGSe1c1C5J5/GttWwoz0rz6yPqcFpqzXt51BwfxrWEiqw965VJBgHPetm2mDgZPSuKvF2ue7ltZc3Jc6S3fa3X35rdss5yoBBrm7dhgMG5rp7GeOP73pxXj4l2Wh9zgIqTV3Y3oCFXzK1YpmBUdv896w4btWbaBgH+dasZUNuPbgYrwaqvufX4V21RuQ3oTDDjnntiumsrnzRkjkDjNcrbRxvhgPrmultVxhI+vfFeJiuWx9blk5N+R//9DwG2d4iWhx8o4x7dK7PTNZCYjb73AwR2x/jXDWsgjGDhffpx/+qtazlS4nwowFx+XrX1uKoxmnzIzwdSdKS5d2z2yw1NZR8zcDpiuysbgNnPTp06V4fbXXzYjbGOSB3rv9M1ONMQs2DjmvjsfgbLQ/RMsx95Wb0XU9ShMUZBzjrj1q2k0eSWPUdq5GC6jk4jbJrUhnx2z618xUp23Pr6TbXMjbKqw2k55xTbiwVovbnn19qoLLtG1flxnIFTx3BQkOeDxWKbRrKlfUy7q1HlNtGCTXA6xbM64I5Hp3r024aORNjcHt71zd/aqYyx5HrXpYHFOMrnnY3BJqx5Nc6fuj3g8jHWuUuLeaFVEYPp/jXq15ZI6hMfN3P1rlp7FCpjC8fnjFfW4LMNLyPhczybmd47nHBd3Evp+JrJuo9kpKgnjNdXNEsUeBww61jXcDld4OSTmvbhibu589Wy2MYLTUxTctGw55yPxzRJMrfcOf85ptwrBBgbSOaxg0q5aXr1P+feu1Svqec6Nnc3IJEmULIOOe9RlAxcqB+Hp/+queFyIZAVOMcHNa9ncK6Fl6nGV+tVPTU5KFKL1S11NCFEkXnn0/Cte3s9qllHB59+ap2sHnMrngHniuqs7PC+a7A/15rlrYpR0R30Mm9om5Iy5LdseVgkgDpwOKq3em7UBHI7/0rthZJ09ecY7jpU9xbFo845rCGY6pGtXIFGDsjyG802EjeRgH/PFcpeadJGf3bZz7dq9du9IZ1aZ1yOO2T+VctdadMGKbevPAzj8a9ehjFsj5rE5NyvnZ555MjDuAPWnRnb8hrq5bQxHY47ZzisK4hAOFGSD36V6NGopHgYqlVg7RRXkHJ3dBUTSIQdvOO1PfK/NIenGKiWKJsuQcn9K690eG5tT97QzZWCnZ0zUyyvIAHGCPrU80eSrBee3bFVR8mQCNw4zXTTeiZ4+JheTTZoJJtYLg7cc1MQpbeP4jx2NZ32tANqjJzWlvDEMwwDWkkcULqTSd/wBCI26lS3TI7fSqxXHAPPtzW4FjkO3oD1xVRolQgL/n3qXc05orfYwzcsi4Jxj+f5VKl0yxAI3zZ570+aIO4K8kmqb74sx8KevA4pOQqMJKVm9DWW4BKbm7dK0YXjYZU8j0rk492VLHPrxWvEsixksxxgDrj/PFYSO50nzX6HTWGoCOUwtyB0xzXrXhrVHZtjHK8YBrwq2cLKH9P513uk6qtqFkYck4rKvT5loYUtPidj6T0+5lRf3I3bvfjNeqeHvOA3l+eoGR+tfMWm+KFwojkx656Zz2Fe1eE9XaeNfMI56V85jcJJRuenhMTZ8t7r8j3Wxu4ZW3Egg8Yz+tddp8kW4GMDg8nt715HHOYv3x4UD+ddFpuvCKIM/zDo3418piMI3G8T6TD4uVOoo1D6c0uWN7USKcHpit0zJlYpPqf5CvC9D8QRu8awyAHoVNel2WpC5P708jv2r4vG5c4yuz7fBY9SgrdSxrUixYz1rAi1BTiOQ/Tp/KtDWXSRRjJHTNcfJbuUyCRitcLTjyWYsXWlFrlPQLTybhVXoSK6C2tV3gk59v5V5jZ3b2Y3Fst79fpXZaRrSTlUnbax4ycYrnxOFkldFU8bzSS7nZWlvvY7xkCt+wskhnD5wCR+ftVbTIknPXIA5+lddDZKIQy4GeOa+VxddpuNz6PB0r2djqdFnt1GzOc16RYJGP3qgZxjjtXj9oY7SRZJG5Jr0HSdSmcbk5xz+FfHZnQb95H1mW19eQ6m5u2t3AHQGty2vTdQGJSOhK15/rOrnyDEV+b3qPTNUnjtw79R0rx6mCcqd0j3KWJ5anK2dHPOsKMjHDY4xTYPEqraeQ3zbOMnuK53fc3kpzzxkfhWDdNJHlC+3B6V1U8HCfuyOKtWqQkpQ2PVdL1OyvJiJSNo55rM8Qa5p0A8uGMsCSBn261xFlevHay/Zx84jPJ68+leE+P/iVfQ6B9lt0KTgFH3DBBJwetdGByF1a6UTueYWovmR5V4+8TyT6vcW6qNgbcn+6a83v/EENxprykhZWBBx/DjOK5XxPaeIPtYmsnLk4A2nJx/k1zd2ZrWBvtcbJJt2yL9TwcV+14HCU4wjGB8hiKNSc+eqjyXVvGd3Y3ri5G+Pkbj1H0/OvmT4nX7zpLeSrtQ8gjvX0T4s0oljPICd3X0wK+X/iNfNJp8mnyKflzj6D+lfpGTxi5JpH57nfNTpOMT5Q1zUN0ru3JPNcDc3bM2CeOuK6HXVZZmL9/WuTkALHJzX6JSaSPw/E03ObRm3EzAk9fSsqSU4x3rVutpG4ViTNxkcZrtp1DycThXzXGJdmLkda6a219hAI8jHpXAzyBWJznFJA/wA3Jz7V1RkmjxJ4dp3R71onje3EItXGGPRq7TzILuyLzHk5wPr3r5rtlZGEsbZxjr2r1LS9SH2AW5bccd/8a5sTTW8T1MprSd41VoQ313slMIbpxVSwlWC9WZT3pl5btK5eLljUFvC6zgSZGD2qlJNFexkmm0eoWN+plUgEk9fTNa99NF0Aw2PT1rg0vDEw28Ad60YdVLqwkwRjrXmOjrc+tp4m1JwZfO9TljwO5rQtZlmi2SjCr1NcNc62keYydq981TbxaI4iseOOpx1ro9g2jzKeYwg27HbanqEdplIwMAdupzXkOu6y92WB456UmqeI7iZGbdjNcDd3PmPuBz3rtw2H5dTxc1zJ1PdS0NOWcOnoPWsKacStweKZJNuUZOKyJpxG3yt+NehSZ8zjKbmrPYvfaDFuFUvPjkPH/wBesq4uN3AqmkxU5zXVGVzyZ01FWsdDLPHCPlPJ7VitfPuwOAapzSZBAPNUBIA21z1rWLOCrFaI0xJ8oJ5xUEjlxkH8KqPIQAo70xbhFypNXGaRjUw91y2sXPtBC8cEVFbagEYrnnNZ8s6lTsPWqgGDjPNEprZjhRmmnE6+O855PWo5CdwYdDWAkrkYNaEEjbck1lz21PRhSc1Zo3dqNGGzzSMyheRWULhtoBPFL9oL4K1hN3PRpJReiLnGc4oYjOKhSYDpyajaTsvU1ydT2Iq0LxLYcAYq1HOUAI71mZzyamDY4FXHc5505NN9i40uSG/SllnkK5jqANkY7CnFeM9q2pVrPU58TgFODsSRXTDK+nrVg3bEjJ5rPkIVSR1qks2CS3SutST1PEVGcHytm/HfKo+ZsZq5FqhtFDJycYzXIs+eB0pFndjtz09auE1uY18PJrkO7PiG6n/dsxIxW3o2uPBn5iSOcV5ZHfKuUPUd6qnVJrUM0L/Me9dkKXNufP18X7NafM911DUWuE8xGOcdM/nXBXN0xJccc1ykGt3DwESvknvVdbqUgndx/WsMQmt2ellCjJpxT1X3FrUL15mKdMVz9xLIcxseKJpm3Ek1ULjbljmslU6noywikuVofvdvkHQVUlGG3N2qWOTyxiq7ZlG40e3a0I/syNlLqQPGsuVNZ9zEwGFNaLARybjVKQsQ2fwqlUMKuD5rqUdSj5bpwe/NVZSc4XpV5X3Lk9RVCRsuV7Uvau5TwMeVWKhATJHWnCRmUjHWmThT89RqSo3VM53Rph8O6c7dBWh3LmqVxD5bAr+NaG/kAcipJVUrlvwrmUrM9h0FOLRlOrjpU0Rwc5okzjApoYFgDxUSlZGtKleZYC4JkBqN3BPzdKRm29Kphs8Gs1N2udjw6T5TQDhSADVSSYs5VjxSFsAH3pjxlnyD0qFJLc2nTbdkOXaflFN2Y596jCheaeJO2KzcrnRGFt0SMrKQR1NNSN1bexqUEHk+lPxmp57HS8O5O7EfdtBqmWwe/wBa0sAriqTxq42t1pwmrkYjCya90bE2ee4q4p7VSA2cVZQbxgdaqU0ZUqEkrW1LAJxxQHOPrUOSBgg4o3g8dKzZ1Rk90T9QMcVKuOuarnG3inpgGk2aKNpaFtcHqKkAU81UMnGKlRs/LUnRza8pKx9PSp1dt3TpUJ4PNSDd1o5k0FpXui/EQTV2Md81mxnI47VaRj0Nc02e1QgrbGpGQanVgT8vQ1mJJVxJFI4NYS0PUpcrRoIB2qzGeeRWdEfXj3qyHCnGOnWsJO7O6hGyNOPpx+FXoB2NZMUvTnmtWI7V4rnnserhld37Gnb55rZiyVweAaxIeQMcHNbluCyeXnn+lcVaXVn0uAot6k0AEZIB4rZjCgDt/OqsUYx07VNGABhTmvPq1L6n0eCocjsbMUgRR3H1q1HdOjbQcg1lJkqAOKmGARivPnY+jpNtKx2FjMz8n5fTNdDbyOZAmetc1p3lFAM8nr610tnIpkAUe3P1rwsVLXQ+0yvm5VzHT2agLkDFdHp0rISW79a56yUMCvcc8DHSujhj+UBT16fWvnMXNPRn2+ApvRo//9H5Wg1DywIz8ynjBrprBsv+7G3cMdTmvKrS63su4gn6Yrr4J5EKkc44z61+g4ikrcp4GDxK5pVJa66HpUBa12vk8nPtXVw3EM/zxHkc815zZX/nRhZyMDgZPSuttZF2LJGec888EGvncVTe73PuMNWjblilynpGn3/kvgcZ4B6111reqSvPLeteXWMxlU+avPXIroLed0kCtyo6djXyuMwybdz7fLcZZc19D0hZMgK5GKn3ZIJ6g5//AFmuUtrxzxxxxXRxSFh82M9M4rwqtPlPoac+fZluQKy47n+dZ8sZPKjIxV8tGvyMOp61ARGn3/wI6VinY3Suzn7m2TmSQHp0PtXJ31uokznaCe/Suz1ArMpMZx3wa5q/XKrv7dvavVwlSSWrPNxVODb0OKvLN03NI3fFYMgAZlYEdveu0vFZ1GwYHpjNYd3AIUBxndwa+iw+IdrHzGKwyfvHNbLcqQ6g4HbNc3d2ccmVJ4I6V0sr7VK8Bf5D6Vz99JtXjt0HevZozdz56vSp220OTniMbHb09M+/er2mOBIw7NjGPr61NeeV5ZRwARyaz4pYYRtPIGcCvRjJyjZnhVVGMlbQ7ezfdL5bNkH/AD/9euzs3WJQEwW9+3/1q80sLyGNi4PPXn6V1VnejjJAxg4PSvIxKaPo8JyyirM9Et5EkhLHqef8+1WBbrIASOMkD246VzNlevs+UY29OM11NrJgqxGMkd/evArzlHqfXYbDwkldEJgUDJGSPes6+soZl2YwV+YD/PpXWmKIoGTk9SaY1om47vw4qaeYNPmM6+TxknGSPH7/AEt3BcKQDk//AKu1cdcabtbc4IPv/npX0Te2KSRBVUe/HSuB1fS1kYqgx3FfRYDO03Y+DzzhDTmvqeOTWwdQetZxgZNoK9euMf8A1q9Gm0dUXbt59h+lYV3ZGLO0Ek84x2xX1GHx6b0PzXMcilGP7zojkZIzIcqMEevrVX7OwcbRnmtaZCjH1oaNSfmPOP8A6/6V61OrpofIVcP77uc60BRySMBucdKek8n3SRjtU0/mcjrg/wA/WsuWOdSdxyM5z/OuzdanhuLUrrY247mMKCe1Ty30bD5h04yOAK5eKQglSMBelWRNkFGBz0z9PSs2rM6VDmVkb6IoPGQTwAfz9KbJCjdM9cf571VgkXaqvzjpVyaVdwIyeepqGw1StbRFOSBI1JQdeCO+Kjhm+cKxx2q40aMcAckVTNurNn/P9azVup3zrcysjWSErgIeT3ro7WITR5A5A4+vtXOQZKCMdQetdFZttG6PBJH4VT2seM4SlO7NyyTyMMST2zXqfhnVmt40GclTgZ9PavG4ZGicBznPzHH/ANeursLyWKRJFPHXnt61hXheOpmqmt10PpqDVhNa+YrHg4xn+lQrq3kvuhO4H8/yrzKy18KPKH3WH5elXm1EuQDk4PUV4M8NY+jw+Kbd92erWXiKa2IVCVJOete0eGfHqJAq3LElmwR6HPevkeLUAEILYxn5hz+HPStm11iRdqjPynPB7V5GNy2NRao+iwWI5ZWvZH29N4ntb9lS3wMc/XNXrYGRivJHXH1r5v0TWCYlkJIPXj9a9r8O6m8sRZjkAY+vvXyGKwPsVZH1FGoqtpLc6W5VEDfLgjH5VnR3LQyZc4x04/GnHU43uGhYAqaw9RvooY29O2Tz+PFY0YN+7YjFpqXNJ7HtfhHxXBaMz3R5HYnrmu6s/EcepThYmCg8Dnj6V8KyeJrizuSPMPB9etdho/xAdyo3bWHA59O9YYzhXnbqR3Zx4XitQn7OT0PuWK7tAUheUbic9c/rXeRa1ZWUey0bc3fHfFfDI+IaltqH5jjk+tdVpnjgqwiaTPrg8/SvkcZwhVkrs+0wPF9JX5fvPq6fWGusSOudxGM10NlPFIo2457V4ToOuNfbQW+UcjNd1Z6pIjBQcY/nXymMypw93sfWYTOFKzTvc9ft5beK1O3qO+Olea6vqQ85owQMn+Vaq6rOLAsmeeua86v7nzZTKCO5wP8A9VceXYJ+0bkehmGPTpxjEvXXihNOUGDnnrXK6jpui+JoWvXUrMeue/v+FYGoS+fIVfIX196jtJ54wsKZU9P8819XDL4RgpR0Z4lLNqsalk9Cpf8Ag+zjVLqM/vEGBx6jGcd68g8ceHITbi4jjy0fylj1J9T619BIZZGK4OVHc15/4skgS3P2jhcc16eW1Jc6TZpicynFqZ8LeONNmSzlvlz5cAJ2Hjp6V8T+ONfSeaWKOHCkEbvWv0E+IVof7OmltQz2zg/KOOv86/OTx3ZTAyQR8AA4/PtX6/w/JOPvHxOe1ZTSlT2/pnzb4hTdIzAcZOK4K4UJlc13etyNbkhx9D6ivOtQuFJODX6DTqXVj8mxeGUZNlS52LETnn3rlpyXHy/nWrPMGGCc4rHuPlBPQV105tbnj1qKvYyJ5MHaT0ogY544qGdgTxVZZWB5rup1DwK9Fxdjr7NnbAzwetdbZ8EAN1rzyw1JY2G7p0rYOsfvlMZxQ430RUJxi+ZrQ9NimSOPY45HekjUTyE8DvXHxatJdjym4PqK0YZnSQHPBrmnBo9WlWjPfY7CC18xODzV+aBILbDHB75qKzmijsvk5z3PY1Vu7lZEwegHJ5rCL1ud01GK06nE6xdDd5S8gda4q4uymcHgc12Wp+QrE8c96871SRQxVeh6V6NGZ81j6LTbvoULi9kPQngf571jrcTbsE9TUc02W9qFALhhXbz2PBjh1KS1LVxctEBntxWTLNv+bPFXLrDR9azeAoX0qPaJLU2lhpc1lsQtKoPFM38cHHFNcKDyKCCFJ9K29ojieGna/QrzSYxis1px5heQHjtWhK24AEVkXGFJrSNa2hw1sE5PmHPdE/N2qnNKZAG6VDM+4bKULmMD0q41VHUwq4KU20idZDvyauQsGy/Xmsg4z8tWreXYdq9KbqK1xUcP7yi0acLAS4rQEgVaoIFVN1TxEEZH5Vk5q9z0KNCSjyssnHlmmQ54xUhKkY6VEpKnaorJ1NNDrhhVzK5bPbFN3OMClLEcGoBksSaiM+50VcNJaxNFWwQhqXfzxVONsjmnMQPeo8jphL3bsuB8EH1p7S/LgGqaup4709GBye1a02uphiXOySYkk42nB5NZ0jchamkxk7aq5B+f0rq5ktjyZxctJ7j1mJGOwqm07BsDpT2YkHHes59wPy8+9bQaPOxN7KxHeTyKpK1Ud5RCN55PNSmVSrBu1VXZmXFd1Ou7WPm8TgYOTm9bontrgsmxT0rWiuCE2isO2VIwQpqXzRuGyssRU5mzvyyl7OKk3qX2cZwR3qOR1xtz0qlvJHuKSMsVz1rkm+p7dGTbskWS2V2iqwmC8UpfD4qsy5bPtUJ9zqqN2TiJ5xkbJ6GiUgLlec1X8rAPPvTjuOV9aU5roThqEmveWrKj5CdME1mvlQa2XywwRWVNgAikqwVcHZqxQV1Lg96s/wAOaqCJVkDVKSytkjiqqT7EYak1dSFEmHwRSyvnAWos7mprLtPP4VySnqevSopxaTAglgO1OWLg4phfjjrVlD8n6Vm6jOylhItmeykjFUGJSQnPFakiKDhTWe8RX5m5zV06vc58bgm0klsSmYbQQal3cEjp3rN+bfg9BV1WBj2nilUkrGuDg5PUUkEZHSkDYPAzTVwB161G0gVjj8qwcrM9JQ0uydmPDU9ZS2VHWqpMnl5NOtctICKJS6kwpu/qakWQeTSBFZyaTzQBhRnFMjdi4PSs1Ludvs1siwtpuPHerkdukIweoHWpEAIB61UuJfLBJrN1eh2RwsUuaxVvZFB+TmqKy5bBqNnMhyTjNOVRjIrri9D5+pBym2i6DkBjUn+1VaMZqzuB49eKmTOqnFC5yNvvVyMYOfSq2wqAR2qwjcYNTKV1obwhaXvFgHzOPSnc8ZqEAhjt49am5bFS3Y2pxutdybcAdw4qQTZ4qEg4GO9QrjJNYXvud9+XRI1EYZwauow4x2rCVjnP44q6shZvas5o6aVbo0bUcuOKsCTawNZMblm5+tXAxHHWsG7M9SlO6NiNgfm61qwnHPr2rnY3ORWzAxJBJ965ah7+Clc6G3YZDAVtw9vb8PxrnIHUgetbUEu1K4KrPpMJLRJm/E4AweamBAway7eXkFen6VfLc4Tt/KvOqI+lwtbZl4ScZ7+1TIAcFs5rOWQcE9atowA5Ncsu561KaOitblVGO9dDYXgziuIR1C5P+RW5p82XCjg15mKpJps+ny/FyTSPTdNulbAzjnvXYWzMSHTkEdR615vZSqpAHWurguysQavk8dC+x+jZRirKzeh//9L4GsrtCodcgHnn/Guu068KvuQ5UcnJrytHVgO+PaunsLvYFJGPxr9QrU7pnyFCpDmUorsevW91DcwZXqpHGfWuqtZzsWI4B68f/Xryawu1Egdc+p9a7e1v8IARkHIH1rwsTRd7I+rwcoP3pnpWlXhXIlYehFdJb3Y2788evavO7Wdmt/MXkk/5xitiyumjYLnHfB55/lXhYnB812fVYTMFFxpHottd8hu/TFdVbag6jBx9OvavOba+iyvzew//AF1u292rMUB79K8DE4S/Q+owuL/vHocV0kg3xgZ4696ZI4x8/HH61x63bISwOCen/wBarq3sxUO3XGceorx3hbM+ihiVy+ZqXTmNecZxmuankYsf7x61sfaElByccdT/APrrInTedwOSfSuijFLRmM3rczZpFwZCO9c9eopQTKc44B/xrZuY2QZfnnOO9Y0qtInONo7GvTw76pnj4yCs00cTdSsjEN9e3NYckjTKegx69xXTanDG7h1wD1A+lc3dRpkqvU5ya+koTTjtqfGYmjJT916HNXjMVwuck9+mKwriV0k3SN06YP4V115D5aiZm6DgVymoQlwMDLde3b/PtXqYarr5Hi5hhrp9yzaXRCiQDp68V01nqDhFcnBPr6CuCiZlG1OK07eWTCnJ9Cf8mniKXNcnBVXSh5nq9nq6rgdD7etd7pl95kY755968PtmePaWPUc12+m37xxqM4HX3/nXzWYYRPY+9yjHv7R7HaXCgAEZGe45rQJ5DDOO30rg7DVSzAM3156e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', }, }, - css: - ".canvasPage h1, .canvasPage h2, .canvasPage h3, .canvasPage h4, .canvasPage h5 {\nfont-family: 'Futura';\ncolor: #444444;\n}\n\n.canvasPage h1 {\nfont-size: 112px;\nfont-weight: bold;\ncolor: #FFFFFF;\n}\n\n.canvasPage h2 {\nfont-size: 48px;\nfont-weight: bold;\n}\n\n.canvasPage h3 {\nfont-size: 30px;\nfont-weight: 300;\ntext-transform: uppercase;\ncolor: #FFFFFF;\n}\n\n.canvasPage h5 {\nfont-size: 24px;\nfont-style: italic;\n}", + css: ".canvasPage h1, .canvasPage h2, .canvasPage h3, .canvasPage h4, .canvasPage h5 {\nfont-family: 'Futura';\ncolor: #444444;\n}\n\n.canvasPage h1 {\nfont-size: 112px;\nfont-weight: bold;\ncolor: #FFFFFF;\n}\n\n.canvasPage h2 {\nfont-size: 48px;\nfont-weight: bold;\n}\n\n.canvasPage h3 {\nfont-size: 30px;\nfont-weight: 300;\ntext-transform: uppercase;\ncolor: #FFFFFF;\n}\n\n.canvasPage h5 {\nfont-size: 24px;\nfont-style: italic;\n}", variables: [], }, }; diff --git a/x-pack/plugins/canvas/server/templates/status_report.ts b/x-pack/plugins/canvas/server/templates/status_report.ts index 49af400f4511c..94f05c371ff98 100644 --- a/x-pack/plugins/canvas/server/templates/status_report.ts +++ b/x-pack/plugins/canvas/server/templates/status_report.ts @@ -17,8 +17,7 @@ export const status: CanvasTemplate = { name: 'Status', width: 612, height: 792, - css: - '.canvasPage h1, .canvasPage h2, .canvasPage h3, .canvasPage h4, .canvasPage h5, .canvasPage h6, .canvasPage li, .canvasPage p, .canvasPage th, .canvasPage td {\nfont-family: "Gill Sans" !important;\ncolor: #333333;\n}\n\n.canvasPage h1, .canvasPage h2 {\nfont-weight: 400;\n}\n\n.canvasPage h2 {\ntext-transform: uppercase;\ncolor: #1785B0;\n}\n\n.canvasMarkdown p,\n.canvasMarkdown li {\nfont-size: 18px;\n}\n\n.canvasMarkdown li {\nmargin-bottom: .75em;\n}\n\n.canvasMarkdown h3:not(:first-child) {\nmargin-top: 2em;\n}\n\n.canvasMarkdown a {\ncolor: #1785B0;\n}\n\n.canvasMarkdown th,\n.canvasMarkdown td {\npadding: .5em 1em;\n}\n\n.canvasMarkdown th {\nbackground-color: #FAFBFD;\n}\n\n.canvasMarkdown table,\n.canvasMarkdown th,\n.canvasMarkdown td {\nborder: 1px solid #e4e9f2;\n}', + css: '.canvasPage h1, .canvasPage h2, .canvasPage h3, .canvasPage h4, .canvasPage h5, .canvasPage h6, .canvasPage li, .canvasPage p, .canvasPage th, .canvasPage td {\nfont-family: "Gill Sans" !important;\ncolor: #333333;\n}\n\n.canvasPage h1, .canvasPage h2 {\nfont-weight: 400;\n}\n\n.canvasPage h2 {\ntext-transform: uppercase;\ncolor: #1785B0;\n}\n\n.canvasMarkdown p,\n.canvasMarkdown li {\nfont-size: 18px;\n}\n\n.canvasMarkdown li {\nmargin-bottom: .75em;\n}\n\n.canvasMarkdown h3:not(:first-child) {\nmargin-top: 2em;\n}\n\n.canvasMarkdown a {\ncolor: #1785B0;\n}\n\n.canvasMarkdown th,\n.canvasMarkdown td {\npadding: .5em 1em;\n}\n\n.canvasMarkdown th {\nbackground-color: #FAFBFD;\n}\n\n.canvasMarkdown table,\n.canvasMarkdown th,\n.canvasMarkdown td {\nborder: 1px solid #e4e9f2;\n}', variables: [], page: 0, pages: [ diff --git a/x-pack/plugins/canvas/server/workpad_route_context.test.ts b/x-pack/plugins/canvas/server/workpad_route_context.test.ts index ec09a364b594a..d13b8aa9eb634 100644 --- a/x-pack/plugins/canvas/server/workpad_route_context.test.ts +++ b/x-pack/plugins/canvas/server/workpad_route_context.test.ts @@ -20,13 +20,13 @@ const mockedExpressionService = { const savedObjectsClient = savedObjectsClientMock.create(); -const mockContext = ({ +const mockContext = { core: { savedObjects: { client: savedObjectsClient, }, }, -} as unknown) as RequestHandlerContext; +} as unknown as RequestHandlerContext; const workpadRouteContext = createWorkpadRouteContext({ expressions: mockedExpressionService as any, diff --git a/x-pack/plugins/canvas/shareable_runtime/components/footer/__stories__/scrubber.stories.tsx b/x-pack/plugins/canvas/shareable_runtime/components/footer/__stories__/scrubber.stories.tsx index d92b550779d01..fc30e301ae8aa 100644 --- a/x-pack/plugins/canvas/shareable_runtime/components/footer/__stories__/scrubber.stories.tsx +++ b/x-pack/plugins/canvas/shareable_runtime/components/footer/__stories__/scrubber.stories.tsx @@ -28,7 +28,7 @@ storiesOf('shareables/Footer/Scrubber', module) )); diff --git a/x-pack/plugins/canvas/storybook/addon/src/state.ts b/x-pack/plugins/canvas/storybook/addon/src/state.ts index 1aafd67595f93..b0032fbfc461e 100644 --- a/x-pack/plugins/canvas/storybook/addon/src/state.ts +++ b/x-pack/plugins/canvas/storybook/addon/src/state.ts @@ -32,22 +32,21 @@ export const getInitialState: () => State = () => getState(); export const getMiddleware = () => applyMiddleware(thunkMiddleware); export const getReducer = () => getRootReducer(getInitialState()); -export const patchDispatch: (store: Store, dispatch: Dispatch) => Dispatch = (store, dispatch) => ( - action -) => { - const channel = addons.getChannel(); - - const previousState = store.getState(); - const returnValue = dispatch(action); - const newState = store.getState(); - const change = diff(previousState, newState) || {}; - - channel.emit(EVENTS.ACTION, { - previousState, - newState, - change, - action: isFunction(action) ? { type: '(thunk)' } : action, - }); - - return returnValue; -}; +export const patchDispatch: (store: Store, dispatch: Dispatch) => Dispatch = + (store, dispatch) => (action) => { + const channel = addons.getChannel(); + + const previousState = store.getState(); + const returnValue = dispatch(action); + const newState = store.getState(); + const change = diff(previousState, newState) || {}; + + channel.emit(EVENTS.ACTION, { + previousState, + newState, + change, + action: isFunction(action) ? { type: '(thunk)' } : action, + }); + + return returnValue; + }; diff --git a/x-pack/plugins/canvas/tasks/mocks/customElementService.js b/x-pack/plugins/canvas/tasks/mocks/customElementService.js index 596d57af97d1e..a0c8d3c6f262e 100644 --- a/x-pack/plugins/canvas/tasks/mocks/customElementService.js +++ b/x-pack/plugins/canvas/tasks/mocks/customElementService.js @@ -27,8 +27,7 @@ export const getTestCustomElements = () => { id: 'custom-element-', name: 'customElement3', displayName: 'Custom Element 3', - help: - 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce lobortis aliquet arcu ut turpis duis.', + help: 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Fusce lobortis aliquet arcu ut turpis duis.', image: '', content: `{\"selectedNodes\":[{\"id\":\"group-dccf4ed7-1593-49a0-9902-caf4d4a4b7f5\",\"position\":{\"left\":250,\"top\":119,\"width\":340,\"height\":517,\"angle\":0,\"parent\":null,\"type\":\"group\"},\"expression\":\"shape fill=\\\"rgba(255,255,255,0)\\\" | render\",\"ast\":{\"type\":\"expression\",\"chain\":[{\"type\":\"function\",\"function\":\"shape\",\"arguments\":{\"fill\":[\"rgba(255,255,255,0)\"]}},{\"type\":\"function\",\"function\":\"render\",\"arguments\":{}}]}},{\"id\":\"element-e2c658ee-7614-4d92-a46e-2b1a81a24485\",\"position\":{\"left\":250,\"top\":405,\"width\":340,\"height\":75,\"angle\":0,\"parent\":\"group-dccf4ed7-1593-49a0-9902-caf4d4a4b7f5\",\"type\":\"element\"},\"expression\":\"filters\\n| demodata\\n| markdown \\\"## Jane Doe\\\" \\n font={font family=\\\"'Open Sans', Helvetica, Arial, sans-serif\\\" size=14 align=\\\"center\\\" color=\\\"#000000\\\" weight=\\\"normal\\\" underline=false italic=false}\\n| render\",\"ast\":{\"type\":\"expression\",\"chain\":[{\"type\":\"function\",\"function\":\"filters\",\"arguments\":{}},{\"type\":\"function\",\"function\":\"demodata\",\"arguments\":{}},{\"type\":\"function\",\"function\":\"markdown\",\"arguments\":{\"_\":[\"## Jane Doe\"],\"font\":[{\"type\":\"expression\",\"chain\":[{\"type\":\"function\",\"function\":\"font\",\"arguments\":{\"family\":[\"'Open Sans', Helvetica, Arial, sans-serif\"],\"size\":[14],\"align\":[\"center\"],\"color\":[\"#000000\"],\"weight\":[\"normal\"],\"underline\":[false],\"italic\":[false]}}]}]}},{\"type\":\"function\",\"function\":\"render\",\"arguments\":{}}]}},{\"id\":\"element-3d16765e-5251-4954-8e2a-6c64ed465b73\",\"position\":{\"left\":250,\"top\":480,\"width\":340,\"height\":75,\"angle\":0,\"parent\":\"group-dccf4ed7-1593-49a0-9902-caf4d4a4b7f5\",\"type\":\"element\"},\"expression\":\"filters\\n| demodata\\n| markdown \\\"### Developer\\\" \\n font={font family=\\\"'Open Sans', Helvetica, Arial, sans-serif\\\" size=14 align=\\\"center\\\" color=\\\"#000000\\\" weight=\\\"normal\\\" underline=false italic=false}\\n| render css=\\\".canvasRenderEl h3 {\\ncolor: #444444;\\n}\\\"\",\"ast\":{\"type\":\"expression\",\"chain\":[{\"type\":\"function\",\"function\":\"filters\",\"arguments\":{}},{\"type\":\"function\",\"function\":\"demodata\",\"arguments\":{}},{\"type\":\"function\",\"function\":\"markdown\",\"arguments\":{\"_\":[\"### Developer\"],\"font\":[{\"type\":\"expression\",\"chain\":[{\"type\":\"function\",\"function\":\"font\",\"arguments\":{\"family\":[\"'Open Sans', Helvetica, Arial, sans-serif\"],\"size\":[14],\"align\":[\"center\"],\"color\":[\"#000000\"],\"weight\":[\"normal\"],\"underline\":[false],\"italic\":[false]}}]}]}},{\"type\":\"function\",\"function\":\"render\",\"arguments\":{\"css\":[\".canvasRenderEl h3 {\\ncolor: #444444;\\n}\"]}}]}},{\"id\":\"element-624675cf-46e9-4545-b86a-5409bbe53ac1\",\"position\":{\"left\":250,\"top\":555,\"width\":340,\"height\":81,\"angle\":0,\"parent\":\"group-dccf4ed7-1593-49a0-9902-caf4d4a4b7f5\",\"type\":\"element\"},\"expression\":\"filters\\n| demodata\\n| markdown \\n \\\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec vel sollicitudin mauris, ut scelerisque urna. \\\" \\n font={font family=\\\"'Open Sans', Helvetica, Arial, sans-serif\\\" size=14 align=\\\"center\\\" color=\\\"#000000\\\" weight=\\\"normal\\\" underline=false italic=false}\\n| render\",\"ast\":{\"type\":\"expression\",\"chain\":[{\"type\":\"function\",\"function\":\"filters\",\"arguments\":{}},{\"type\":\"function\",\"function\":\"demodata\",\"arguments\":{}},{\"type\":\"function\",\"function\":\"markdown\",\"arguments\":{\"_\":[\"Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec vel sollicitudin mauris, ut scelerisque urna. \"],\"font\":[{\"type\":\"expression\",\"chain\":[{\"type\":\"function\",\"function\":\"font\",\"arguments\":{\"family\":[\"'Open Sans', Helvetica, Arial, sans-serif\"],\"size\":[14],\"align\":[\"center\"],\"color\":[\"#000000\"],\"weight\":[\"normal\"],\"underline\":[false],\"italic\":[false]}}]}]}},{\"type\":\"function\",\"function\":\"render\",\"arguments\":{}}]}},{\"id\":\"element-c2916246-26dd-4c65-91c6-d1ad3f1791ee\",\"position\":{\"left\":293,\"top\":119,\"width\":254,\"height\":252,\"angle\":0,\"parent\":\"group-dccf4ed7-1593-49a0-9902-caf4d4a4b7f5\",\"type\":\"element\"},\"expression\":\"image dataurl={asset \\\"asset-0c6f377f-771e-432e-8e2e-15c3e9142ad6\\\"} mode=\\\"contain\\\"\\n| render\",\"ast\":{\"type\":\"expression\",\"chain\":[{\"type\":\"function\",\"function\":\"image\",\"arguments\":{\"dataurl\":[{\"type\":\"expression\",\"chain\":[{\"type\":\"function\",\"function\":\"asset\",\"arguments\":{\"_\":[\"asset-0c6f377f-771e-432e-8e2e-15c3e9142ad6\"]}}]}],\"mode\":[\"contain\"]}},{\"type\":\"function\",\"function\":\"render\",\"arguments\":{}}]}}]}`, }, diff --git a/x-pack/plugins/cases/common/api/runtime_types.ts b/x-pack/plugins/cases/common/api/runtime_types.ts index 8817764e261d9..7edc1162c0e81 100644 --- a/x-pack/plugins/cases/common/api/runtime_types.ts +++ b/x-pack/plugins/cases/common/api/runtime_types.ts @@ -52,11 +52,10 @@ export const throwErrors = (createError: ErrorFactory) => (errors: rt.Errors) => throw createError(formatErrors(errors).join()); }; -export const decodeOrThrow = ( - runtimeType: rt.Type, - createError: ErrorFactory = createPlainError -) => (inputValue: I) => - pipe(runtimeType.decode(inputValue), fold(throwErrors(createError), identity)); +export const decodeOrThrow = + (runtimeType: rt.Type, createError: ErrorFactory = createPlainError) => + (inputValue: I) => + pipe(runtimeType.decode(inputValue), fold(throwErrors(createError), identity)); const getExcessProps = (props: rt.Props, r: Record): string[] => { const ex: string[] = []; diff --git a/x-pack/plugins/cases/public/common/lib/kibana/kibana_react.mock.ts b/x-pack/plugins/cases/public/common/lib/kibana/kibana_react.mock.ts index 066121d2c5bf4..18370be61bdf1 100644 --- a/x-pack/plugins/cases/public/common/lib/kibana/kibana_react.mock.ts +++ b/x-pack/plugins/cases/public/common/lib/kibana/kibana_react.mock.ts @@ -16,7 +16,7 @@ import { securityMock } from '../../../../../security/public/mocks'; import { triggersActionsUiMock } from '../../../../../triggers_actions_ui/public/mocks'; export const createStartServicesMock = (): StartServices => - (({ + ({ ...coreMock.createStart(), storage: { ...coreMock.createStorage(), remove: jest.fn() }, lens: { @@ -25,7 +25,7 @@ export const createStartServicesMock = (): StartServices => }, security: securityMock.createStart(), triggersActionsUi: triggersActionsUiMock.createStart(), - } as unknown) as StartServices); + } as unknown as StartServices); export const createWithKibanaMock = () => { const services = createStartServicesMock(); diff --git a/x-pack/plugins/cases/public/common/mock/test_providers.tsx b/x-pack/plugins/cases/public/common/mock/test_providers.tsx index 98304808224c7..b31e9e4e1b19d 100644 --- a/x-pack/plugins/cases/public/common/mock/test_providers.tsx +++ b/x-pack/plugins/cases/public/common/mock/test_providers.tsx @@ -43,7 +43,7 @@ export const TestProviders = React.memo(TestProvidersComponent); export const useFormFieldMock = (options?: Partial>): FieldHook => ({ path: 'path', type: 'type', - value: ('mockedValue' as unknown) as T, + value: 'mockedValue' as unknown as T, isPristine: false, isDirty: false, isModified: false, diff --git a/x-pack/plugins/cases/public/components/case_action_bar/actions.tsx b/x-pack/plugins/cases/public/components/case_action_bar/actions.tsx index 6816575d649f7..f6d52583d436f 100644 --- a/x-pack/plugins/cases/public/components/case_action_bar/actions.tsx +++ b/x-pack/plugins/cases/public/components/case_action_bar/actions.tsx @@ -27,12 +27,8 @@ const ActionsComponent: React.FC = ({ currentExternalIncident, }) => { // Delete case - const { - handleToggleModal, - handleOnDeleteConfirm, - isDeleted, - isDisplayConfirmDeleteModal, - } = useDeleteCases(); + const { handleToggleModal, handleOnDeleteConfirm, isDeleted, isDisplayConfirmDeleteModal } = + useDeleteCases(); const propertyActions = useMemo( () => [ diff --git a/x-pack/plugins/cases/public/components/case_view/index.tsx b/x-pack/plugins/cases/public/components/case_view/index.tsx index a12a3a5bb869c..bb0b894238b9d 100644 --- a/x-pack/plugins/cases/public/components/case_view/index.tsx +++ b/x-pack/plugins/cases/public/components/case_view/index.tsx @@ -270,7 +270,11 @@ export const CaseComponent = React.memo( [updateCase, fetchCaseUserActions, caseId, subCaseId] ); - const { loading: isLoadingConnectors, connectors, permissionsError } = useConnectors({ + const { + loading: isLoadingConnectors, + connectors, + permissionsError, + } = useConnectors({ toastPermissionsErrors: false, }); @@ -304,9 +308,10 @@ export const CaseComponent = React.memo( [onUpdateField, connectors] ); - const onSubmitTags = useCallback((newTags) => onUpdateField({ key: 'tags', value: newTags }), [ - onUpdateField, - ]); + const onSubmitTags = useCallback( + (newTags) => onUpdateField({ key: 'tags', value: newTags }), + [onUpdateField] + ); const onSubmitTitle = useCallback( (newTitle) => onUpdateField({ key: 'title', value: newTitle }), diff --git a/x-pack/plugins/cases/public/components/configure_cases/field_mapping_row_static.tsx b/x-pack/plugins/cases/public/components/configure_cases/field_mapping_row_static.tsx index 2509c56dda71e..09e3546b2e2e3 100644 --- a/x-pack/plugins/cases/public/components/configure_cases/field_mapping_row_static.tsx +++ b/x-pack/plugins/cases/public/components/configure_cases/field_mapping_row_static.tsx @@ -24,9 +24,10 @@ const FieldMappingRowComponent: React.FC = ({ selectedActionType, selectedThirdParty, }) => { - const selectedActionTypeCapitalized = useMemo(() => capitalize(selectedActionType), [ - selectedActionType, - ]); + const selectedActionTypeCapitalized = useMemo( + () => capitalize(selectedActionType), + [selectedActionType] + ); return ( diff --git a/x-pack/plugins/cases/public/components/configure_cases/index.tsx b/x-pack/plugins/cases/public/components/configure_cases/index.tsx index c792990a2882d..788c6eeb61b32 100644 --- a/x-pack/plugins/cases/public/components/configure_cases/index.tsx +++ b/x-pack/plugins/cases/public/components/configure_cases/index.tsx @@ -95,9 +95,10 @@ const ConfigureCasesComponent: React.FC> = ({ setEditFlyoutVisibility(true); }, []); - const onCloseAddFlyout = useCallback(() => setAddFlyoutVisibility(false), [ - setAddFlyoutVisibility, - ]); + const onCloseAddFlyout = useCallback( + () => setAddFlyoutVisibility(false), + [setAddFlyoutVisibility] + ); const onCloseEditFlyout = useCallback(() => setEditFlyoutVisibility(false), []); diff --git a/x-pack/plugins/cases/public/components/connector_selector/form.test.tsx b/x-pack/plugins/cases/public/components/connector_selector/form.test.tsx index ea25fce2d4f7c..b914b4c7edab2 100644 --- a/x-pack/plugins/cases/public/components/connector_selector/form.test.tsx +++ b/x-pack/plugins/cases/public/components/connector_selector/form.test.tsx @@ -32,7 +32,7 @@ describe('ConnectorSelector', () => { it('it should render', async () => { const wrapper = mount( -
+ { it('it should not render when is not in edit mode', async () => { const wrapper = mount( - + = ({ onCaseChanged, selectedCase }) => { - const { data: cases, loading: isLoadingCases, refetchCases } = useGetCases({ + const { + data: cases, + loading: isLoadingCases, + refetchCases, + } = useGetCases({ initialQueryParams: DEFAULT_QUERY_PARAMS, initialFilterOptions: { ...DEFAULT_FILTER_OPTIONS, diff --git a/x-pack/plugins/cases/public/components/connectors/jira/case_fields.test.tsx b/x-pack/plugins/cases/public/components/connectors/jira/case_fields.test.tsx index ae9245534c78a..591dbf15d35a8 100644 --- a/x-pack/plugins/cases/public/components/connectors/jira/case_fields.test.tsx +++ b/x-pack/plugins/cases/public/components/connectors/jira/case_fields.test.tsx @@ -139,9 +139,11 @@ describe('Jira Fields', () => { const wrapper = mount(); await waitFor(() => - ((wrapper.find(EuiComboBox).props() as unknown) as { - onChange: (a: EuiComboBoxOptionOption[]) => void; - }).onChange([{ label: 'parentId', value: 'parentId' }]) + ( + wrapper.find(EuiComboBox).props() as unknown as { + onChange: (a: EuiComboBoxOptionOption[]) => void; + } + ).onChange([{ label: 'parentId', value: 'parentId' }]) ); wrapper.update(); expect(onChange).toHaveBeenCalledWith({ @@ -164,9 +166,11 @@ describe('Jira Fields', () => { const wrapper = mount(); await waitFor(() => - ((wrapper.find(EuiComboBox).props() as unknown) as { - onSearchChange: (a: string) => void; - }).onSearchChange('womanId') + ( + wrapper.find(EuiComboBox).props() as unknown as { + onSearchChange: (a: string) => void; + } + ).onSearchChange('womanId') ); wrapper.update(); expect(useGetIssuesMock.mock.calls[2][0].query).toEqual('womanId'); diff --git a/x-pack/plugins/cases/public/components/connectors/jira/search_issues.tsx b/x-pack/plugins/cases/public/components/connectors/jira/search_issues.tsx index 79ac42e034c6a..61866d126dfd7 100644 --- a/x-pack/plugins/cases/public/components/connectors/jira/search_issues.tsx +++ b/x-pack/plugins/cases/public/components/connectors/jira/search_issues.tsx @@ -42,9 +42,10 @@ const SearchIssuesComponent: React.FC = ({ selectedValue, actionConnector id: selectedValue, }); - useEffect(() => setOptions(issues.map((issue) => ({ label: issue.title, value: issue.key }))), [ - issues, - ]); + useEffect( + () => setOptions(issues.map((issue) => ({ label: issue.title, value: issue.key }))), + [issues] + ); useEffect(() => { if (isLoadingSingleIssue || singleIssue == null) { diff --git a/x-pack/plugins/cases/public/components/connectors/resilient/case_fields.test.tsx b/x-pack/plugins/cases/public/components/connectors/resilient/case_fields.test.tsx index dda6ba5de95cc..814c73537b1f4 100644 --- a/x-pack/plugins/cases/public/components/connectors/resilient/case_fields.test.tsx +++ b/x-pack/plugins/cases/public/components/connectors/resilient/case_fields.test.tsx @@ -111,9 +111,11 @@ describe('ResilientParamsFields renders', () => { const wrapper = mount(); await waitFor(() => { - ((wrapper.find(EuiComboBox).props() as unknown) as { - onChange: (a: EuiComboBoxOptionOption[]) => void; - }).onChange([{ value: '19', label: 'Denial of Service' }]); + ( + wrapper.find(EuiComboBox).props() as unknown as { + onChange: (a: EuiComboBoxOptionOption[]) => void; + } + ).onChange([{ value: '19', label: 'Denial of Service' }]); }); expect(onChange).toHaveBeenCalledWith({ incidentTypes: ['19'], severityCode: '6' }); diff --git a/x-pack/plugins/cases/public/components/connectors/resilient/case_fields.tsx b/x-pack/plugins/cases/public/components/connectors/resilient/case_fields.tsx index e1eeb13bf684c..44f06f92093dd 100644 --- a/x-pack/plugins/cases/public/components/connectors/resilient/case_fields.tsx +++ b/x-pack/plugins/cases/public/components/connectors/resilient/case_fields.tsx @@ -24,166 +24,163 @@ import * as i18n from './translations'; import { ConnectorTypes, ResilientFieldsType } from '../../../../common'; import { ConnectorCard } from '../card'; -const ResilientFieldsComponent: React.FunctionComponent< - ConnectorFieldsProps -> = ({ isEdit = true, fields, connector, onChange }) => { - const init = useRef(true); - const { incidentTypes = null, severityCode = null } = fields ?? {}; - - const { http, notifications } = useKibana().services; - - const { - isLoading: isLoadingIncidentTypes, - incidentTypes: allIncidentTypes, - } = useGetIncidentTypes({ - http, - toastNotifications: notifications.toasts, - connector, - }); - - const { isLoading: isLoadingSeverity, severity } = useGetSeverity({ - http, - toastNotifications: notifications.toasts, - connector, - }); - - const severitySelectOptions: EuiSelectOption[] = useMemo( - () => - severity.map((s) => ({ - value: s.id.toString(), - text: s.name, - })), - [severity] - ); - - const incidentTypesComboBoxOptions: Array> = useMemo( - () => - allIncidentTypes - ? allIncidentTypes.map((type: { id: number; name: string }) => ({ - label: type.name, - value: type.id.toString(), - })) - : [], - [allIncidentTypes] - ); - const listItems = useMemo( - () => [ - ...(incidentTypes != null && incidentTypes.length > 0 - ? [ - { - title: i18n.INCIDENT_TYPES_LABEL, - description: allIncidentTypes - .filter((type) => incidentTypes.includes(type.id.toString())) - .map((type) => type.name) - .join(', '), - }, - ] - : []), - ...(severityCode != null && severityCode.length > 0 - ? [ - { - title: i18n.SEVERITY_LABEL, - description: - severity.find((severityObj) => severityObj.id.toString() === severityCode)?.name ?? - '', - }, - ] - : []), - ], - [incidentTypes, severityCode, allIncidentTypes, severity] - ); - - const onFieldChange = useCallback( - (key, value) => { - onChange({ - ...fields, - incidentTypes, - severityCode, - [key]: value, +const ResilientFieldsComponent: React.FunctionComponent> = + ({ isEdit = true, fields, connector, onChange }) => { + const init = useRef(true); + const { incidentTypes = null, severityCode = null } = fields ?? {}; + + const { http, notifications } = useKibana().services; + + const { isLoading: isLoadingIncidentTypes, incidentTypes: allIncidentTypes } = + useGetIncidentTypes({ + http, + toastNotifications: notifications.toasts, + connector, }); - }, - [incidentTypes, severityCode, onChange, fields] - ); - - const selectedIncidentTypesComboBoxOptionsMemo = useMemo(() => { - const allIncidentTypesAsObject = allIncidentTypes.reduce( - (acc, type) => ({ ...acc, [type.id.toString()]: type.name }), - {} as Record + + const { isLoading: isLoadingSeverity, severity } = useGetSeverity({ + http, + toastNotifications: notifications.toasts, + connector, + }); + + const severitySelectOptions: EuiSelectOption[] = useMemo( + () => + severity.map((s) => ({ + value: s.id.toString(), + text: s.name, + })), + [severity] + ); + + const incidentTypesComboBoxOptions: Array> = useMemo( + () => + allIncidentTypes + ? allIncidentTypes.map((type: { id: number; name: string }) => ({ + label: type.name, + value: type.id.toString(), + })) + : [], + [allIncidentTypes] + ); + const listItems = useMemo( + () => [ + ...(incidentTypes != null && incidentTypes.length > 0 + ? [ + { + title: i18n.INCIDENT_TYPES_LABEL, + description: allIncidentTypes + .filter((type) => incidentTypes.includes(type.id.toString())) + .map((type) => type.name) + .join(', '), + }, + ] + : []), + ...(severityCode != null && severityCode.length > 0 + ? [ + { + title: i18n.SEVERITY_LABEL, + description: + severity.find((severityObj) => severityObj.id.toString() === severityCode) + ?.name ?? '', + }, + ] + : []), + ], + [incidentTypes, severityCode, allIncidentTypes, severity] + ); + + const onFieldChange = useCallback( + (key, value) => { + onChange({ + ...fields, + incidentTypes, + severityCode, + [key]: value, + }); + }, + [incidentTypes, severityCode, onChange, fields] ); - return incidentTypes - ? incidentTypes - .map((type) => ({ - label: allIncidentTypesAsObject[type.toString()], - value: type.toString(), - })) - .filter((type) => type.label != null) - : []; - }, [allIncidentTypes, incidentTypes]); - - const onIncidentChange = useCallback( - (selectedOptions: Array<{ label: string; value?: string }>) => { - onFieldChange( - 'incidentTypes', - selectedOptions.map((selectedOption) => selectedOption.value ?? selectedOption.label) + + const selectedIncidentTypesComboBoxOptionsMemo = useMemo(() => { + const allIncidentTypesAsObject = allIncidentTypes.reduce( + (acc, type) => ({ ...acc, [type.id.toString()]: type.name }), + {} as Record ); - }, - [onFieldChange] - ); - - const onIncidentBlur = useCallback(() => { - if (!incidentTypes) { - onFieldChange('incidentTypes', []); - } - }, [incidentTypes, onFieldChange]); - - // Set field at initialization - useEffect(() => { - if (init.current) { - init.current = false; - onChange({ incidentTypes, severityCode }); - } - }, [incidentTypes, onChange, severityCode]); - - return isEdit ? ( - - - - - - - onFieldChange('severityCode', e.target.value)} - options={severitySelectOptions} - value={severityCode ?? undefined} - /> - - - - ) : ( - - ); -}; + return incidentTypes + ? incidentTypes + .map((type) => ({ + label: allIncidentTypesAsObject[type.toString()], + value: type.toString(), + })) + .filter((type) => type.label != null) + : []; + }, [allIncidentTypes, incidentTypes]); + + const onIncidentChange = useCallback( + (selectedOptions: Array<{ label: string; value?: string }>) => { + onFieldChange( + 'incidentTypes', + selectedOptions.map((selectedOption) => selectedOption.value ?? selectedOption.label) + ); + }, + [onFieldChange] + ); + + const onIncidentBlur = useCallback(() => { + if (!incidentTypes) { + onFieldChange('incidentTypes', []); + } + }, [incidentTypes, onFieldChange]); + + // Set field at initialization + useEffect(() => { + if (init.current) { + init.current = false; + onChange({ incidentTypes, severityCode }); + } + }, [incidentTypes, onChange, severityCode]); + + return isEdit ? ( + + + + + + + onFieldChange('severityCode', e.target.value)} + options={severitySelectOptions} + value={severityCode ?? undefined} + /> + + + + ) : ( + + ); + }; // eslint-disable-next-line import/no-default-export export { ResilientFieldsComponent as default }; diff --git a/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_itsm_case_fields.tsx b/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_itsm_case_fields.tsx index 710e230958354..53c0d32dea1a5 100644 --- a/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_itsm_case_fields.tsx +++ b/x-pack/plugins/cases/public/components/connectors/servicenow/servicenow_itsm_case_fields.tsx @@ -30,8 +30,13 @@ const ServiceNowITSMFieldsComponent: React.FunctionComponent< ConnectorFieldsProps > = ({ isEdit = true, fields, connector, onChange }) => { const init = useRef(true); - const { severity = null, urgency = null, impact = null, category = null, subcategory = null } = - fields ?? {}; + const { + severity = null, + urgency = null, + impact = null, + category = null, + subcategory = null, + } = fields ?? {}; const { http, notifications } = useKibana().services; const [choices, setChoices] = useState(defaultFields); diff --git a/x-pack/plugins/cases/public/components/create/connector.test.tsx b/x-pack/plugins/cases/public/components/create/connector.test.tsx index 1b480c3f5d78a..a2ffd42f2660b 100644 --- a/x-pack/plugins/cases/public/components/create/connector.test.tsx +++ b/x-pack/plugins/cases/public/components/create/connector.test.tsx @@ -172,9 +172,11 @@ describe('Connector', () => { }); act(() => { - ((wrapper.find(EuiComboBox).props() as unknown) as { - onChange: (a: EuiComboBoxOptionOption[]) => void; - }).onChange([{ value: '19', label: 'Denial of Service' }]); + ( + wrapper.find(EuiComboBox).props() as unknown as { + onChange: (a: EuiComboBoxOptionOption[]) => void; + } + ).onChange([{ value: '19', label: 'Denial of Service' }]); }); act(() => { diff --git a/x-pack/plugins/cases/public/components/create/connector.tsx b/x-pack/plugins/cases/public/components/create/connector.tsx index 2ec6d1ffef23d..84695d4011f55 100644 --- a/x-pack/plugins/cases/public/components/create/connector.tsx +++ b/x-pack/plugins/cases/public/components/create/connector.tsx @@ -96,10 +96,10 @@ const ConnectorComponent: React.FC = ({ hideConnectorServiceNowSir, ]); - useEffect(() => setFieldValue('connectorId', defaultConnectorId), [ - defaultConnectorId, - setFieldValue, - ]); + useEffect( + () => setFieldValue('connectorId', defaultConnectorId), + [defaultConnectorId, setFieldValue] + ); const connectorIdConfig = getConnectorsFormValidators({ config: schema.connectorId as FieldConfig, diff --git a/x-pack/plugins/cases/public/components/create/description.tsx b/x-pack/plugins/cases/public/components/create/description.tsx index d831470ea1d54..e1bd563a3d798 100644 --- a/x-pack/plugins/cases/public/components/create/description.tsx +++ b/x-pack/plugins/cases/public/components/create/description.tsx @@ -17,12 +17,8 @@ interface Props { export const fieldName = 'description'; const DescriptionComponent: React.FC = ({ isLoading }) => { - const { - draftComment, - hasIncomingLensState, - openLensModal, - clearDraftComment, - } = useLensDraftComment(); + const { draftComment, hasIncomingLensState, openLensModal, clearDraftComment } = + useLensDraftComment(); const { setFieldValue } = useFormContext(); const [{ title, tags }] = useFormData({ watch: ['title', 'tags'] }); const editorRef = useRef>(); diff --git a/x-pack/plugins/cases/public/components/create/form_context.test.tsx b/x-pack/plugins/cases/public/components/create/form_context.test.tsx index 0ddab55c621d3..b988f13ee34ce 100644 --- a/x-pack/plugins/cases/public/components/create/form_context.test.tsx +++ b/x-pack/plugins/cases/public/components/create/form_context.test.tsx @@ -101,9 +101,11 @@ const fillForm = (wrapper: ReactWrapper) => { .simulate('change', { target: { value: sampleData.description } }); act(() => { - ((wrapper.find(EuiComboBox).props() as unknown) as { - onChange: (a: EuiComboBoxOptionOption[]) => void; - }).onChange(sampleTags.map((tag) => ({ label: tag }))); + ( + wrapper.find(EuiComboBox).props() as unknown as { + onChange: (a: EuiComboBoxOptionOption[]) => void; + } + ).onChange(sampleTags.map((tag) => ({ label: tag }))); }); }; @@ -416,9 +418,11 @@ describe('Create case', () => { }); act(() => { - ((wrapper.find(EuiComboBox).at(1).props() as unknown) as { - onChange: (a: EuiComboBoxOptionOption[]) => void; - }).onChange([{ value: '19', label: 'Denial of Service' }]); + ( + wrapper.find(EuiComboBox).at(1).props() as unknown as { + onChange: (a: EuiComboBoxOptionOption[]) => void; + } + ).onChange([{ value: '19', label: 'Denial of Service' }]); }); wrapper diff --git a/x-pack/plugins/cases/public/components/create/index.test.tsx b/x-pack/plugins/cases/public/components/create/index.test.tsx index 350b971bb05fc..ac405673fb9c9 100644 --- a/x-pack/plugins/cases/public/components/create/index.test.tsx +++ b/x-pack/plugins/cases/public/components/create/index.test.tsx @@ -63,9 +63,11 @@ const fillForm = (wrapper: ReactWrapper) => { .simulate('change', { target: { value: sampleData.description } }); act(() => { - ((wrapper.find(EuiComboBox).props() as unknown) as { - onChange: (a: EuiComboBoxOptionOption[]) => void; - }).onChange(sampleTags.map((tag) => ({ label: tag }))); + ( + wrapper.find(EuiComboBox).props() as unknown as { + onChange: (a: EuiComboBoxOptionOption[]) => void; + } + ).onChange(sampleTags.map((tag) => ({ label: tag }))); }); }; diff --git a/x-pack/plugins/cases/public/components/create/tags.test.tsx b/x-pack/plugins/cases/public/components/create/tags.test.tsx index 6efbf1b8c7107..b138a5e651f1a 100644 --- a/x-pack/plugins/cases/public/components/create/tags.test.tsx +++ b/x-pack/plugins/cases/public/components/create/tags.test.tsx @@ -75,9 +75,11 @@ describe('Tags', () => { ); await waitFor(() => { - ((wrapper.find(EuiComboBox).props() as unknown) as { - onChange: (a: EuiComboBoxOptionOption[]) => void; - }).onChange(['test', 'case'].map((tag) => ({ label: tag }))); + ( + wrapper.find(EuiComboBox).props() as unknown as { + onChange: (a: EuiComboBoxOptionOption[]) => void; + } + ).onChange(['test', 'case'].map((tag) => ({ label: tag }))); }); expect(globalForm.getFormData()).toEqual({ tags: ['test', 'case'] }); diff --git a/x-pack/plugins/cases/public/components/formatted_date/index.tsx b/x-pack/plugins/cases/public/components/formatted_date/index.tsx index 5bb90bfbff797..caaf63a1add4c 100644 --- a/x-pack/plugins/cases/public/components/formatted_date/index.tsx +++ b/x-pack/plugins/cases/public/components/formatted_date/index.tsx @@ -96,21 +96,19 @@ export const FormattedDate = React.memo<{ fieldName: string; value?: string | number | null; className?: string; -}>( - ({ value, fieldName, className = '' }): JSX.Element => { - if (value == null) { - return getOrEmptyTagFromValue(value); - } - const maybeDate = getMaybeDate(value); - return maybeDate.isValid() ? ( - - - - ) : ( - getOrEmptyTagFromValue(value) - ); +}>(({ value, fieldName, className = '' }): JSX.Element => { + if (value == null) { + return getOrEmptyTagFromValue(value); } -); + const maybeDate = getMaybeDate(value); + return maybeDate.isValid() ? ( + + + + ) : ( + getOrEmptyTagFromValue(value) + ); +}); FormattedDate.displayName = 'FormattedDate'; diff --git a/x-pack/plugins/cases/public/components/header_page/index.tsx b/x-pack/plugins/cases/public/components/header_page/index.tsx index d6daf1b57d332..c1c463321d86d 100644 --- a/x-pack/plugins/cases/public/components/header_page/index.tsx +++ b/x-pack/plugins/cases/public/components/header_page/index.tsx @@ -52,9 +52,9 @@ const LinkBack = styled.div.attrs({ `; LinkBack.displayName = 'LinkBack'; -const Badge = (styled(EuiBadge)` +const Badge = styled(EuiBadge)` letter-spacing: 0; -` as unknown) as typeof EuiBadge; +` as unknown as typeof EuiBadge; Badge.displayName = 'Badge'; interface BackOptions { diff --git a/x-pack/plugins/cases/public/components/header_page/title.tsx b/x-pack/plugins/cases/public/components/header_page/title.tsx index 629aa612610ee..18b10c4f7bbcb 100644 --- a/x-pack/plugins/cases/public/components/header_page/title.tsx +++ b/x-pack/plugins/cases/public/components/header_page/title.tsx @@ -19,9 +19,9 @@ const StyledEuiBetaBadge = styled(EuiBetaBadge)` StyledEuiBetaBadge.displayName = 'StyledEuiBetaBadge'; -const Badge = (styled(EuiBadge)` +const Badge = styled(EuiBadge)` letter-spacing: 0; -` as unknown) as typeof EuiBadge; +` as unknown as typeof EuiBadge; Badge.displayName = 'Badge'; interface Props { diff --git a/x-pack/plugins/cases/public/components/insert_timeline/index.test.tsx b/x-pack/plugins/cases/public/components/insert_timeline/index.test.tsx index 84a19578c80de..5b396acc95389 100644 --- a/x-pack/plugins/cases/public/components/insert_timeline/index.test.tsx +++ b/x-pack/plugins/cases/public/components/insert_timeline/index.test.tsx @@ -37,7 +37,7 @@ describe('InsertTimeline ', () => { mount( - + @@ -59,7 +59,7 @@ describe('InsertTimeline ', () => { mount( -
+
diff --git a/x-pack/plugins/cases/public/components/insert_timeline/index.tsx b/x-pack/plugins/cases/public/components/insert_timeline/index.tsx index 473bf5485782f..62b8ad7155581 100644 --- a/x-pack/plugins/cases/public/components/insert_timeline/index.tsx +++ b/x-pack/plugins/cases/public/components/insert_timeline/index.tsx @@ -15,10 +15,10 @@ export const InsertTimeline = ({ fieldName }: { fieldName: InsertFields }) => { const { setFieldValue, getFormData } = useFormContext(); const timelineHooks = useTimelineContext()?.hooks; const formData = getFormData(); - const onTimelineAttached = useCallback((newValue: string) => setFieldValue(fieldName, newValue), [ - fieldName, - setFieldValue, - ]); + const onTimelineAttached = useCallback( + (newValue: string) => setFieldValue(fieldName, newValue), + [fieldName, setFieldValue] + ); timelineHooks?.useInsertTimeline(formData[fieldName] ?? '', onTimelineAttached); return null; }; diff --git a/x-pack/plugins/cases/public/components/links/index.tsx b/x-pack/plugins/cases/public/components/links/index.tsx index d53d5c973e7d8..63032c6d76a29 100644 --- a/x-pack/plugins/cases/public/components/links/index.tsx +++ b/x-pack/plugins/cases/public/components/links/index.tsx @@ -23,9 +23,8 @@ export interface CasesNavigation Promise | void; } -export const LinkButton: React.FC< - PropsForButton | PropsForAnchor -> = ({ children, ...props }) => {children}; +export const LinkButton: React.FC | PropsForAnchor> = + ({ children, ...props }) => {children}; export const LinkAnchor: React.FC = ({ children, ...props }) => ( {children} diff --git a/x-pack/plugins/cases/public/components/markdown_editor/plugins/lens/plugin.tsx b/x-pack/plugins/cases/public/components/markdown_editor/plugins/lens/plugin.tsx index f840b1ea5bb50..4766719b43946 100644 --- a/x-pack/plugins/cases/public/components/markdown_editor/plugins/lens/plugin.tsx +++ b/x-pack/plugins/cases/public/components/markdown_editor/plugins/lens/plugin.tsx @@ -125,10 +125,10 @@ const LensEditorComponent: LensEuiMarkdownEditorUiPlugin['editor'] = ({ [handleClose, markdownContext] ); - const originatingPath = useMemo(() => `${location.pathname}${location.search}`, [ - location.pathname, - location.search, - ]); + const originatingPath = useMemo( + () => `${location.pathname}${location.search}`, + [location.pathname, location.search] + ); const handleCreateInLensClick = useCallback(() => { storage.set(DRAFT_COMMENT_STORAGE_ID, { diff --git a/x-pack/plugins/cases/public/components/markdown_editor/plugins/lens/use_lens_open_visualization.tsx b/x-pack/plugins/cases/public/components/markdown_editor/plugins/lens/use_lens_open_visualization.tsx index 2e6d3634f66b7..8060b53831279 100644 --- a/x-pack/plugins/cases/public/components/markdown_editor/plugins/lens/use_lens_open_visualization.tsx +++ b/x-pack/plugins/cases/public/components/markdown_editor/plugins/lens/use_lens_open_visualization.tsx @@ -28,8 +28,8 @@ export const useLensOpenVisualization = ({ comment }: { comment: string }) => { { id: '', timeRange: lensVisualization[0].timeRange, - attributes: (lensVisualization[0] - .attributes as unknown) as TypedLensByValueInput['attributes'], + attributes: lensVisualization[0] + .attributes as unknown as TypedLensByValueInput['attributes'], }, { openInNewTab: true, diff --git a/x-pack/plugins/cases/public/components/markdown_editor/use_plugins.ts b/x-pack/plugins/cases/public/components/markdown_editor/use_plugins.ts index b87b9ae6ad09a..c68baf083c12f 100644 --- a/x-pack/plugins/cases/public/components/markdown_editor/use_plugins.ts +++ b/x-pack/plugins/cases/public/components/markdown_editor/use_plugins.ts @@ -23,7 +23,8 @@ export const usePlugins = () => { return useMemo(() => { const uiPlugins = getDefaultEuiMarkdownUiPlugins(); const parsingPlugins = getDefaultEuiMarkdownParsingPlugins(); - const processingPlugins = getDefaultEuiMarkdownProcessingPlugins() as TemporaryProcessingPluginsType; + const processingPlugins = + getDefaultEuiMarkdownProcessingPlugins() as TemporaryProcessingPluginsType; if (timelinePlugins) { uiPlugins.push(timelinePlugins.uiPlugin); diff --git a/x-pack/plugins/cases/public/components/recent_cases/index.tsx b/x-pack/plugins/cases/public/components/recent_cases/index.tsx index 607583ff8cf8a..2f53fde6980be 100644 --- a/x-pack/plugins/cases/public/components/recent_cases/index.tsx +++ b/x-pack/plugins/cases/public/components/recent_cases/index.tsx @@ -33,9 +33,8 @@ const RecentCasesComponent = ({ hasWritePermissions, }: Omit) => { const currentUser = useCurrentUser(); - const [recentCasesFilterBy, setRecentCasesFilterBy] = useState( - 'recentlyCreated' - ); + const [recentCasesFilterBy, setRecentCasesFilterBy] = + useState('recentlyCreated'); const recentCasesFilterOptions = useMemo( () => diff --git a/x-pack/plugins/cases/public/components/use_push_to_service/callout/callout.tsx b/x-pack/plugins/cases/public/components/use_push_to_service/callout/callout.tsx index bddc066d5f2ee..ce96d2e1024fa 100644 --- a/x-pack/plugins/cases/public/components/use_push_to_service/callout/callout.tsx +++ b/x-pack/plugins/cases/public/components/use_push_to_service/callout/callout.tsx @@ -31,11 +31,10 @@ const CallOutComponent = ({ type, hasLicenseError, }: CallOutProps) => { - const handleCallOut = useCallback((e) => handleButtonClick(e, id, type), [ - handleButtonClick, - id, - type, - ]); + const handleCallOut = useCallback( + (e) => handleButtonClick(e, id, type), + [handleButtonClick, id, type] + ); const isCaseClosed = useMemo( () => messages.map((m) => m.id).includes(CLOSED_CASE_PUSH_ERROR_ID), diff --git a/x-pack/plugins/cases/public/components/user_action_tree/index.tsx b/x-pack/plugins/cases/public/components/user_action_tree/index.tsx index a8c270ef4d555..784817229caf9 100644 --- a/x-pack/plugins/cases/public/components/user_action_tree/index.tsx +++ b/x-pack/plugins/cases/public/components/user_action_tree/index.tsx @@ -150,7 +150,11 @@ export const UserActionTree = React.memo( useFetchAlertData, userCanCrud, }: UserActionTreeProps) => { - const { detailName: caseId, commentId, subCaseId } = useParams<{ + const { + detailName: caseId, + commentId, + subCaseId, + } = useParams<{ detailName: string; commentId?: string; subCaseId?: string; @@ -162,12 +166,8 @@ export const UserActionTree = React.memo( const currentUser = useCurrentUser(); const [manageMarkdownEditIds, setManageMarkdownEditIds] = useState([]); const commentRefs = useRef>({}); - const { - clearDraftComment, - draftComment, - hasIncomingLensState, - openLensModal, - } = useLensDraftComment(); + const { clearDraftComment, draftComment, hasIncomingLensState, openLensModal } = + useLensDraftComment(); const [loadingAlertData, manualAlertsData] = useFetchAlertData( getManualAlertIdsWithNoRuleId(caseData.comments) diff --git a/x-pack/plugins/cases/public/components/user_action_tree/user_action_show_alert.tsx b/x-pack/plugins/cases/public/components/user_action_tree/user_action_show_alert.tsx index 4f5ce00806417..c16382a96bb98 100644 --- a/x-pack/plugins/cases/public/components/user_action_tree/user_action_show_alert.tsx +++ b/x-pack/plugins/cases/public/components/user_action_tree/user_action_show_alert.tsx @@ -22,11 +22,10 @@ const UserActionShowAlertComponent = ({ index, onShowAlertDetails, }: UserActionShowAlertProps) => { - const onClick = useCallback(() => onShowAlertDetails(alertId, index), [ - alertId, - index, - onShowAlertDetails, - ]); + const onClick = useCallback( + () => onShowAlertDetails(alertId, index), + [alertId, index, onShowAlertDetails] + ); return ( {i18n.SHOW_ALERT_TOOLTIP}

}> { test('check url, body, method, signal', async () => { await postCaseConfigure(caseConfigurationMock, abortCtrl.signal); expect(fetchMock).toHaveBeenCalledWith('/api/cases/configure', { - body: - '{"connector":{"id":"123","name":"My connector","type":".jira","fields":null},"owner":"securitySolution","closure_type":"close-by-user"}', + body: '{"connector":{"id":"123","name":"My connector","type":".jira","fields":null},"owner":"securitySolution","closure_type":"close-by-user"}', method: 'POST', signal: abortCtrl.signal, }); @@ -123,8 +122,7 @@ describe('Case Configuration API', () => { abortCtrl.signal ); expect(fetchMock).toHaveBeenCalledWith('/api/cases/configure/123', { - body: - '{"connector":{"id":"456","name":"My Connector 2","type":".none","fields":null},"version":"WzHJ12"}', + body: '{"connector":{"id":"456","name":"My Connector 2","type":".none","fields":null},"version":"WzHJ12"}', method: 'PATCH', signal: abortCtrl.signal, }); diff --git a/x-pack/plugins/cases/public/containers/use_get_case_user_actions.tsx b/x-pack/plugins/cases/public/containers/use_get_case_user_actions.tsx index edafa1b9a10a9..e481519ba19a3 100644 --- a/x-pack/plugins/cases/public/containers/use_get_case_user_actions.tsx +++ b/x-pack/plugins/cases/public/containers/use_get_case_user_actions.tsx @@ -250,9 +250,8 @@ export const useGetCaseUserActions = ( caseConnectorId: string, subCaseId?: string ): UseGetCaseUserActions => { - const [caseUserActionsState, setCaseUserActionsState] = useState( - initialData - ); + const [caseUserActionsState, setCaseUserActionsState] = + useState(initialData); const abortCtrlRef = useRef(new AbortController()); const isCancelledRef = useRef(false); const toasts = useToasts(); diff --git a/x-pack/plugins/cases/server/authorization/authorization.test.ts b/x-pack/plugins/cases/server/authorization/authorization.test.ts index e602de565f294..f644f7366100b 100644 --- a/x-pack/plugins/cases/server/authorization/authorization.test.ts +++ b/x-pack/plugins/cases/server/authorization/authorization.test.ts @@ -34,9 +34,9 @@ describe('authorization', () => { beforeEach(() => { securityStart = securityMock.createStart(); featuresStart = featuresPluginMock.createStart(); - featuresStart.getKibanaFeatures.mockReturnValue(([ + featuresStart.getKibanaFeatures.mockReturnValue([ { id: '1', cases: ['a'] }, - ] as unknown) as KibanaFeature[]); + ] as unknown as KibanaFeature[]); }); it('creates an Authorization object', async () => { @@ -91,7 +91,7 @@ describe('authorization', () => { ); featuresStart = featuresPluginMock.createStart(); - featuresStart.getKibanaFeatures.mockReturnValue(([feature] as unknown) as KibanaFeature[]); + featuresStart.getKibanaFeatures.mockReturnValue([feature] as unknown as KibanaFeature[]); auth = await Authorization.create({ request, @@ -265,10 +265,10 @@ describe('authorization', () => { it('does not throw an error when the user has the privileges needed', async () => { expect.assertions(1); - featuresStart.getKibanaFeatures.mockReturnValue(([ + featuresStart.getKibanaFeatures.mockReturnValue([ feature, { id: '2', cases: ['other-owner'] }, - ] as unknown) as KibanaFeature[]); + ] as unknown as KibanaFeature[]); auth = await Authorization.create({ request, @@ -293,9 +293,9 @@ describe('authorization', () => { it('does not throw an error when the user has the privileges needed with a feature specifying multiple owners', async () => { expect.assertions(1); - featuresStart.getKibanaFeatures.mockReturnValue(([ + featuresStart.getKibanaFeatures.mockReturnValue([ { id: '2', cases: ['a', 'other-owner'] }, - ] as unknown) as KibanaFeature[]); + ] as unknown as KibanaFeature[]); auth = await Authorization.create({ request, @@ -320,9 +320,9 @@ describe('authorization', () => { it('logs a successful authorization when the user has the privileges needed with a feature specifying multiple owners', async () => { expect.assertions(2); - featuresStart.getKibanaFeatures.mockReturnValue(([ + featuresStart.getKibanaFeatures.mockReturnValue([ { id: '2', cases: ['a', 'other-owner'] }, - ] as unknown) as KibanaFeature[]); + ] as unknown as KibanaFeature[]); auth = await Authorization.create({ request, @@ -411,7 +411,7 @@ describe('authorization', () => { ); featuresStart = featuresPluginMock.createStart(); - featuresStart.getKibanaFeatures.mockReturnValue(([feature] as unknown) as KibanaFeature[]); + featuresStart.getKibanaFeatures.mockReturnValue([feature] as unknown as KibanaFeature[]); auth = await Authorization.create({ request, @@ -736,15 +736,17 @@ describe('authorization', () => { })) ); - (securityStart.authz.actions.cases.get as jest.MockedFunction< - typeof securityStart.authz.actions.cases.get - >).mockImplementation((owner, opName) => { + ( + securityStart.authz.actions.cases.get as jest.MockedFunction< + typeof securityStart.authz.actions.cases.get + > + ).mockImplementation((owner, opName) => { return `${owner}:${opName}`; }); - featuresStart.getKibanaFeatures.mockReturnValue(([ + featuresStart.getKibanaFeatures.mockReturnValue([ { id: 'a', cases: ['a', 'b', 'c'] }, - ] as unknown) as KibanaFeature[]); + ] as unknown as KibanaFeature[]); auth = await Authorization.create({ request, diff --git a/x-pack/plugins/cases/server/authorization/authorization.ts b/x-pack/plugins/cases/server/authorization/authorization.ts index 71cd38363778f..3598c5b8956fa 100644 --- a/x-pack/plugins/cases/server/authorization/authorization.ts +++ b/x-pack/plugins/cases/server/authorization/authorization.ts @@ -204,9 +204,7 @@ export class Authorization { }; } - private async getAuthorizedOwners( - operations: OperationDetails[] - ): Promise<{ + private async getAuthorizedOwners(operations: OperationDetails[]): Promise<{ username?: string; hasAllRequested: boolean; authorizedOwners: string[]; diff --git a/x-pack/plugins/cases/server/client/attachments/add.ts b/x-pack/plugins/cases/server/client/attachments/add.ts index 166ae2ae65012..507405d58cef1 100644 --- a/x-pack/plugins/cases/server/client/attachments/add.ts +++ b/x-pack/plugins/cases/server/client/attachments/add.ts @@ -187,15 +187,13 @@ const addGeneratedAlerts = async ( lensEmbeddableFactory, }); - const { - comment: newComment, - commentableCase: updatedCase, - } = await commentableCase.createComment({ - createdDate, - user: userDetails, - commentReq: query, - id: savedObjectID, - }); + const { comment: newComment, commentableCase: updatedCase } = + await commentableCase.createComment({ + createdDate, + user: userDetails, + commentReq: query, + id: savedObjectID, + }); if ( (newComment.attributes.type === CommentType.alert || diff --git a/x-pack/plugins/cases/server/client/attachments/get.ts b/x-pack/plugins/cases/server/client/attachments/get.ts index 4f4ade51f9a59..9a06c5142600a 100644 --- a/x-pack/plugins/cases/server/client/attachments/get.ts +++ b/x-pack/plugins/cases/server/client/attachments/get.ts @@ -124,10 +124,8 @@ export const getAllAlertsAttachToCase = async ( includeSubCaseComments: false, }); - const { - filter: authorizationFilter, - ensureSavedObjectsAreAuthorized, - } = await authorization.getAuthorizationFilter(Operations.getAlertsAttachedToCase); + const { filter: authorizationFilter, ensureSavedObjectsAreAuthorized } = + await authorization.getAuthorizationFilter(Operations.getAlertsAttachedToCase); const alerts = await attachmentService.getAllAlertsAttachToCase({ unsecuredSavedObjectsClient, @@ -159,10 +157,8 @@ export async function find( try { checkEnabledCaseConnectorOrThrow(queryParams?.subCaseId); - const { - filter: authorizationFilter, - ensureSavedObjectsAreAuthorized, - } = await authorization.getAuthorizationFilter(Operations.findComments); + const { filter: authorizationFilter, ensureSavedObjectsAreAuthorized } = + await authorization.getAuthorizationFilter(Operations.findComments); const id = queryParams?.subCaseId ?? caseID; const associationType = queryParams?.subCaseId ? AssociationType.subCase : AssociationType.case; diff --git a/x-pack/plugins/cases/server/client/attachments/update.ts b/x-pack/plugins/cases/server/client/attachments/update.ts index da505ed55313c..9816efd9a8452 100644 --- a/x-pack/plugins/cases/server/client/attachments/update.ts +++ b/x-pack/plugins/cases/server/client/attachments/update.ts @@ -175,14 +175,12 @@ export async function update( } const updatedDate = new Date().toISOString(); - const { - comment: updatedComment, - commentableCase: updatedCase, - } = await commentableCase.updateComment({ - updateRequest: queryParams, - updatedAt: updatedDate, - user, - }); + const { comment: updatedComment, commentableCase: updatedCase } = + await commentableCase.updateComment({ + updateRequest: queryParams, + updatedAt: updatedDate, + user, + }); await userActionService.bulkCreate({ unsecuredSavedObjectsClient, diff --git a/x-pack/plugins/cases/server/client/cases/find.ts b/x-pack/plugins/cases/server/client/cases/find.ts index 4b8f82b939a4c..282ff956b7a6f 100644 --- a/x-pack/plugins/cases/server/client/cases/find.ts +++ b/x-pack/plugins/cases/server/client/cases/find.ts @@ -43,10 +43,8 @@ export const find = async ( fold(throwErrors(Boom.badRequest), identity) ); - const { - filter: authorizationFilter, - ensureSavedObjectsAreAuthorized, - } = await authorization.getAuthorizationFilter(Operations.findCases); + const { filter: authorizationFilter, ensureSavedObjectsAreAuthorized } = + await authorization.getAuthorizationFilter(Operations.findCases); const queryArgs = { tags: queryParams.tags, diff --git a/x-pack/plugins/cases/server/client/cases/get.ts b/x-pack/plugins/cases/server/client/cases/get.ts index d440cecd27e9b..6b0015d4ffb14 100644 --- a/x-pack/plugins/cases/server/client/cases/get.ts +++ b/x-pack/plugins/cases/server/client/cases/get.ts @@ -66,10 +66,8 @@ export const getCasesByAlertID = async ( fold(throwErrors(Boom.badRequest), identity) ); - const { - filter: authorizationFilter, - ensureSavedObjectsAreAuthorized, - } = await authorization.getAuthorizationFilter(Operations.getCaseIDsByAlertID); + const { filter: authorizationFilter, ensureSavedObjectsAreAuthorized } = + await authorization.getAuthorizationFilter(Operations.getCaseIDsByAlertID); const filter = combineAuthorizedAndOwnerFilter( queryParams.owner, @@ -248,10 +246,8 @@ export async function getTags( fold(throwErrors(Boom.badRequest), identity) ); - const { - filter: authorizationFilter, - ensureSavedObjectsAreAuthorized, - } = await authorization.getAuthorizationFilter(Operations.findCases); + const { filter: authorizationFilter, ensureSavedObjectsAreAuthorized } = + await authorization.getAuthorizationFilter(Operations.findCases); const filter = combineAuthorizedAndOwnerFilter(queryParams.owner, authorizationFilter); @@ -298,10 +294,8 @@ export async function getReporters( fold(throwErrors(Boom.badRequest), identity) ); - const { - filter: authorizationFilter, - ensureSavedObjectsAreAuthorized, - } = await authorization.getAuthorizationFilter(Operations.getReporters); + const { filter: authorizationFilter, ensureSavedObjectsAreAuthorized } = + await authorization.getAuthorizationFilter(Operations.getReporters); const filter = combineAuthorizedAndOwnerFilter(queryParams.owner, authorizationFilter); diff --git a/x-pack/plugins/cases/server/client/cases/utils.ts b/x-pack/plugins/cases/server/client/cases/utils.ts index 617191462c556..359ad4b41ead0 100644 --- a/x-pack/plugins/cases/server/client/cases/utils.ts +++ b/x-pack/plugins/cases/server/client/cases/utils.ts @@ -173,13 +173,13 @@ export const createIncident = async ({ if (externalId) { try { - currentIncident = ((await actionsClient.execute({ + currentIncident = (await actionsClient.execute({ actionId: connector.id, params: { subAction: 'getIncident', subActionParams: { externalId }, }, - })) as unknown) as ExternalServiceParams | undefined; + })) as unknown as ExternalServiceParams | undefined; } catch (ex) { throw new Error( `Retrieving Incident by id ${externalId} from ${connector.actionTypeId} failed with exception: ${ex}` diff --git a/x-pack/plugins/cases/server/client/configure/client.ts b/x-pack/plugins/cases/server/client/configure/client.ts index ad7e1322c9e06..791fcc70947db 100644 --- a/x-pack/plugins/cases/server/client/configure/client.ts +++ b/x-pack/plugins/cases/server/client/configure/client.ts @@ -144,10 +144,8 @@ async function get( fold(throwErrors(Boom.badRequest), identity) ); - const { - filter: authorizationFilter, - ensureSavedObjectsAreAuthorized, - } = await authorization.getAuthorizationFilter(Operations.findConfigurations); + const { filter: authorizationFilter, ensureSavedObjectsAreAuthorized } = + await authorization.getAuthorizationFilter(Operations.findConfigurations); const filter = combineAuthorizedAndOwnerFilter( queryParams.owner, @@ -237,13 +235,8 @@ async function update( clientArgs: CasesClientArgs, casesClientInternal: CasesClientInternal ): Promise { - const { - caseConfigureService, - logger, - unsecuredSavedObjectsClient, - user, - authorization, - } = clientArgs; + const { caseConfigureService, logger, unsecuredSavedObjectsClient, user, authorization } = + clientArgs; try { const request = pipe( @@ -349,27 +342,20 @@ async function create( clientArgs: CasesClientArgs, casesClientInternal: CasesClientInternal ): Promise { - const { - unsecuredSavedObjectsClient, - caseConfigureService, - logger, - user, - authorization, - } = clientArgs; + const { unsecuredSavedObjectsClient, caseConfigureService, logger, user, authorization } = + clientArgs; try { let error = null; - const { - filter: authorizationFilter, - ensureSavedObjectsAreAuthorized, - } = await authorization.getAuthorizationFilter( - /** - * The operation is createConfiguration because the procedure is part of - * the create route. The user should have all - * permissions to delete the results. - */ - Operations.createConfiguration - ); + const { filter: authorizationFilter, ensureSavedObjectsAreAuthorized } = + await authorization.getAuthorizationFilter( + /** + * The operation is createConfiguration because the procedure is part of + * the create route. The user should have all + * permissions to delete the results. + */ + Operations.createConfiguration + ); const filter = combineAuthorizedAndOwnerFilter( configuration.owner, diff --git a/x-pack/plugins/cases/server/client/mocks.ts b/x-pack/plugins/cases/server/client/mocks.ts index f7c27166ee910..05b7d055656b1 100644 --- a/x-pack/plugins/cases/server/client/mocks.ts +++ b/x-pack/plugins/cases/server/client/mocks.ts @@ -101,7 +101,7 @@ export const createCasesClientMock = (): CasesClientMock => { configure: createConfigureSubClientMock(), stats: createStatsSubClientMock(), }; - return (client as unknown) as CasesClientMock; + return client as unknown as CasesClientMock; }; export type CasesClientFactoryMock = jest.Mocked; @@ -112,5 +112,5 @@ export const createCasesClientFactory = (): CasesClientFactoryMock => { create: jest.fn(), }; - return (factory as unknown) as CasesClientFactoryMock; + return factory as unknown as CasesClientFactoryMock; }; diff --git a/x-pack/plugins/cases/server/client/stats/client.ts b/x-pack/plugins/cases/server/client/stats/client.ts index 4cdb11ad15e5f..b13a15c799f9d 100644 --- a/x-pack/plugins/cases/server/client/stats/client.ts +++ b/x-pack/plugins/cases/server/client/stats/client.ts @@ -58,10 +58,8 @@ async function getStatusTotalsByType( fold(throwErrors(Boom.badRequest), identity) ); - const { - filter: authorizationFilter, - ensureSavedObjectsAreAuthorized, - } = await authorization.getAuthorizationFilter(Operations.getCaseStatuses); + const { filter: authorizationFilter, ensureSavedObjectsAreAuthorized } = + await authorization.getAuthorizationFilter(Operations.getCaseStatuses); // casesStatuses are bounded by us. No need to limit concurrent calls. const [openCases, inProgressCases, closedCases] = await Promise.all([ diff --git a/x-pack/plugins/cases/server/client/sub_cases/client.ts b/x-pack/plugins/cases/server/client/sub_cases/client.ts index 6ca5a80565a71..52aa8431e2975 100644 --- a/x-pack/plugins/cases/server/client/sub_cases/client.ts +++ b/x-pack/plugins/cases/server/client/sub_cases/client.ts @@ -100,13 +100,8 @@ export function createSubCasesClient( async function deleteSubCase(ids: string[], clientArgs: CasesClientArgs): Promise { try { - const { - unsecuredSavedObjectsClient, - user, - userActionService, - caseService, - attachmentService, - } = clientArgs; + const { unsecuredSavedObjectsClient, user, userActionService, caseService, attachmentService } = + clientArgs; const [comments, subCases] = await Promise.all([ caseService.getAllSubCaseComments({ unsecuredSavedObjectsClient, id: ids }), diff --git a/x-pack/plugins/cases/server/common/utils.test.ts b/x-pack/plugins/cases/server/common/utils.test.ts index e45b91a28ceb3..51d787a0334a2 100644 --- a/x-pack/plugins/cases/server/common/utils.test.ts +++ b/x-pack/plugins/cases/server/common/utils.test.ts @@ -769,9 +769,7 @@ describe('common utils', () => { }, ]), }) - ).toEqual( - new Map([['1', 2]]) - ); + ).toEqual(new Map([['1', 2]])); }); it('returns a map with two entry, 2 alerts, and 0 alerts', () => { diff --git a/x-pack/plugins/cases/server/connectors/jira/format.ts b/x-pack/plugins/cases/server/connectors/jira/format.ts index 3dadd9a107d5e..b281d94062f4d 100644 --- a/x-pack/plugins/cases/server/connectors/jira/format.ts +++ b/x-pack/plugins/cases/server/connectors/jira/format.ts @@ -9,8 +9,11 @@ import { ConnectorJiraTypeFields } from '../../../common'; import { Format } from './types'; export const format: Format = (theCase, alerts) => { - const { priority = null, issueType = null, parent = null } = - (theCase.connector.fields as ConnectorJiraTypeFields['fields']) ?? {}; + const { + priority = null, + issueType = null, + parent = null, + } = (theCase.connector.fields as ConnectorJiraTypeFields['fields']) ?? {}; return { priority, // Jira do not allows empty spaces on labels. We replace white spaces with hyphens diff --git a/x-pack/plugins/cases/server/connectors/servicenow/itsm_format.ts b/x-pack/plugins/cases/server/connectors/servicenow/itsm_format.ts index 22bd84df66303..bc9d50026d1f8 100644 --- a/x-pack/plugins/cases/server/connectors/servicenow/itsm_format.ts +++ b/x-pack/plugins/cases/server/connectors/servicenow/itsm_format.ts @@ -9,7 +9,12 @@ import { ConnectorServiceNowITSMTypeFields } from '../../../common'; import { ServiceNowITSMFormat } from './types'; export const format: ServiceNowITSMFormat = (theCase, alerts) => { - const { severity = null, urgency = null, impact = null, category = null, subcategory = null } = - (theCase.connector.fields as ConnectorServiceNowITSMTypeFields['fields']) ?? {}; + const { + severity = null, + urgency = null, + impact = null, + category = null, + subcategory = null, + } = (theCase.connector.fields as ConnectorServiceNowITSMTypeFields['fields']) ?? {}; return { severity, urgency, impact, category, subcategory }; }; diff --git a/x-pack/plugins/cases/server/saved_object_types/migrations/cases.ts b/x-pack/plugins/cases/server/saved_object_types/migrations/cases.ts index 8296de57b37a9..bffd4171270ef 100644 --- a/x-pack/plugins/cases/server/saved_object_types/migrations/cases.ts +++ b/x-pack/plugins/cases/server/saved_object_types/migrations/cases.ts @@ -50,14 +50,11 @@ export const caseConnectorIdMigration = ( // removing the id field since it will be stored in the references instead const { connector, external_service, ...restAttributes } = doc.attributes; - const { transformedConnector, references: connectorReferences } = transformConnectorIdToReference( - connector - ); + const { transformedConnector, references: connectorReferences } = + transformConnectorIdToReference(connector); - const { - transformedPushConnector, - references: pushConnectorReferences, - } = transformPushConnectorIdToReference(external_service); + const { transformedPushConnector, references: pushConnectorReferences } = + transformPushConnectorIdToReference(external_service); const { references = [] } = doc; diff --git a/x-pack/plugins/cases/server/saved_object_types/migrations/comments.test.ts b/x-pack/plugins/cases/server/saved_object_types/migrations/comments.test.ts index d1bfe7257c01c..9e8ff1a334686 100644 --- a/x-pack/plugins/cases/server/saved_object_types/migrations/comments.test.ts +++ b/x-pack/plugins/cases/server/saved_object_types/migrations/comments.test.ts @@ -220,9 +220,9 @@ describe('index migrations', () => { const result = migrations['7.14.0'](caseComment, contextMock); const parsedComment = parseCommentString(result.attributes.comment); - const lensVisualizations = (getLensVisualizations( + const lensVisualizations = getLensVisualizations( parsedComment.children - ) as unknown) as Array<{ + ) as unknown as Array<{ attributes: LensDocShape715 & { references: SavedObjectReference[] }; }>; diff --git a/x-pack/plugins/cases/server/saved_object_types/migrations/comments.ts b/x-pack/plugins/cases/server/saved_object_types/migrations/comments.ts index 03188d8e75e88..d754aec636693 100644 --- a/x-pack/plugins/cases/server/saved_object_types/migrations/comments.ts +++ b/x-pack/plugins/cases/server/saved_object_types/migrations/comments.ts @@ -103,37 +103,34 @@ export const createCommentsMigrations = ( return mergeMigrationFunctionMaps(commentsMigrations, embeddableMigrations); }; -const migrateByValueLensVisualizations = ( - migrate: MigrateFunction, - version: string -): SavedObjectMigrationFn<{ comment?: string }> => ( - doc: SavedObjectUnsanitizedDoc<{ comment?: string }> -) => { - if (doc.attributes.comment == null) { - return doc; - } - - const parsedComment = parseCommentString(doc.attributes.comment); - const migratedComment = parsedComment.children.map((comment) => { - if (isLensMarkdownNode(comment)) { - // casting here because ts complains that comment isn't serializable because LensMarkdownNode - // extends Node which has fields that conflict with SerializableRecord even though it is serializable - return migrate(comment as SerializableRecord) as LensMarkdownNode; +const migrateByValueLensVisualizations = + (migrate: MigrateFunction, version: string): SavedObjectMigrationFn<{ comment?: string }> => + (doc: SavedObjectUnsanitizedDoc<{ comment?: string }>) => { + if (doc.attributes.comment == null) { + return doc; } - return comment; - }); + const parsedComment = parseCommentString(doc.attributes.comment); + const migratedComment = parsedComment.children.map((comment) => { + if (isLensMarkdownNode(comment)) { + // casting here because ts complains that comment isn't serializable because LensMarkdownNode + // extends Node which has fields that conflict with SerializableRecord even though it is serializable + return migrate(comment as SerializableRecord) as LensMarkdownNode; + } + + return comment; + }); - const migratedMarkdown = { ...parsedComment, children: migratedComment }; + const migratedMarkdown = { ...parsedComment, children: migratedComment }; - return { - ...doc, - attributes: { - ...doc.attributes, - comment: stringifyCommentWithoutTrailingNewline(doc.attributes.comment, migratedMarkdown), - }, + return { + ...doc, + attributes: { + ...doc.attributes, + comment: stringifyCommentWithoutTrailingNewline(doc.attributes.comment, migratedMarkdown), + }, + }; }; -}; export const stringifyCommentWithoutTrailingNewline = ( originalComment: string, diff --git a/x-pack/plugins/cases/server/saved_object_types/migrations/configuration.ts b/x-pack/plugins/cases/server/saved_object_types/migrations/configuration.ts index 3209feb2a9a9b..527d40fca2e35 100644 --- a/x-pack/plugins/cases/server/saved_object_types/migrations/configuration.ts +++ b/x-pack/plugins/cases/server/saved_object_types/migrations/configuration.ts @@ -34,9 +34,8 @@ export const configureConnectorIdMigration = ( ): SavedObjectSanitizedDoc => { // removing the id field since it will be stored in the references instead const { connector, ...restAttributes } = doc.attributes; - const { transformedConnector, references: connectorReferences } = transformConnectorIdToReference( - connector - ); + const { transformedConnector, references: connectorReferences } = + transformConnectorIdToReference(connector); const { references = [] } = doc; return { diff --git a/x-pack/plugins/cases/server/services/cases/index.test.ts b/x-pack/plugins/cases/server/services/cases/index.test.ts index aec188037f095..18f4ff867cfa9 100644 --- a/x-pack/plugins/cases/server/services/cases/index.test.ts +++ b/x-pack/plugins/cases/server/services/cases/index.test.ts @@ -1119,7 +1119,7 @@ describe('CasesService', () => { it('defaults to the none connector and null external_services when attributes is undefined', async () => { unsecuredSavedObjectsClient.get.mockReturnValue( - Promise.resolve(({ + Promise.resolve({ references: [ { id: '1', @@ -1127,7 +1127,7 @@ describe('CasesService', () => { type: ACTION_SAVED_OBJECT_TYPE, }, ], - } as unknown) as SavedObject) + } as unknown as SavedObject) ); const res = await service.getCase({ unsecuredSavedObjectsClient, id: 'a' }); diff --git a/x-pack/plugins/cases/server/services/cases/transform.ts b/x-pack/plugins/cases/server/services/cases/transform.ts index 00b20a6290860..e3609689871d2 100644 --- a/x-pack/plugins/cases/server/services/cases/transform.ts +++ b/x-pack/plugins/cases/server/services/cases/transform.ts @@ -70,21 +70,15 @@ export function transformUpdateResponseToExternalModel( }; } -export function transformAttributesToESModel( - caseAttributes: CaseAttributes -): { +export function transformAttributesToESModel(caseAttributes: CaseAttributes): { attributes: ESCaseAttributes; referenceHandler: ConnectorReferenceHandler; }; -export function transformAttributesToESModel( - caseAttributes: Partial -): { +export function transformAttributesToESModel(caseAttributes: Partial): { attributes: Partial; referenceHandler: ConnectorReferenceHandler; }; -export function transformAttributesToESModel( - caseAttributes: Partial -): { +export function transformAttributesToESModel(caseAttributes: Partial): { attributes: Partial; referenceHandler: ConnectorReferenceHandler; } { diff --git a/x-pack/plugins/cases/server/services/configure/index.test.ts b/x-pack/plugins/cases/server/services/configure/index.test.ts index 045142ea13e11..876cb7b21f81a 100644 --- a/x-pack/plugins/cases/server/services/configure/index.test.ts +++ b/x-pack/plugins/cases/server/services/configure/index.test.ts @@ -696,7 +696,7 @@ describe('CaseConfigureService', () => { it('defaults to the none connector when attributes is undefined', async () => { unsecuredSavedObjectsClient.get.mockReturnValue( - Promise.resolve(({ + Promise.resolve({ references: [ { id: '1', @@ -704,7 +704,7 @@ describe('CaseConfigureService', () => { type: ACTION_SAVED_OBJECT_TYPE, }, ], - } as unknown) as SavedObject) + } as unknown as SavedObject) ); const res = await service.get({ unsecuredSavedObjectsClient, configurationId: '1' }); diff --git a/x-pack/plugins/cases/server/services/configure/index.ts b/x-pack/plugins/cases/server/services/configure/index.ts index a25818f4ff593..db6d033f23ca8 100644 --- a/x-pack/plugins/cases/server/services/configure/index.ts +++ b/x-pack/plugins/cases/server/services/configure/index.ts @@ -134,16 +134,17 @@ export class CaseConfigureService { this.log.debug(`Attempting to UPDATE case configuration ${configurationId}`); const esUpdateInfo = transformAttributesToESModel(updatedAttributes); - const updatedConfiguration = await unsecuredSavedObjectsClient.update( - CASE_CONFIGURE_SAVED_OBJECT, - configurationId, - { - ...esUpdateInfo.attributes, - }, - { - references: esUpdateInfo.referenceHandler.build(originalConfiguration.references), - } - ); + const updatedConfiguration = + await unsecuredSavedObjectsClient.update( + CASE_CONFIGURE_SAVED_OBJECT, + configurationId, + { + ...esUpdateInfo.attributes, + }, + { + references: esUpdateInfo.referenceHandler.build(originalConfiguration.references), + } + ); return transformUpdateResponseToExternalModel(updatedConfiguration); } catch (error) { @@ -205,21 +206,15 @@ function transformFindResponseToExternalModel( }; } -function transformAttributesToESModel( - configuration: CasesConfigureAttributes -): { +function transformAttributesToESModel(configuration: CasesConfigureAttributes): { attributes: ESCasesConfigureAttributes; referenceHandler: ConnectorReferenceHandler; }; -function transformAttributesToESModel( - configuration: Partial -): { +function transformAttributesToESModel(configuration: Partial): { attributes: Partial; referenceHandler: ConnectorReferenceHandler; }; -function transformAttributesToESModel( - configuration: Partial -): { +function transformAttributesToESModel(configuration: Partial): { attributes: Partial; referenceHandler: ConnectorReferenceHandler; } { diff --git a/x-pack/plugins/cases/server/services/mocks.ts b/x-pack/plugins/cases/server/services/mocks.ts index c82624cd50ab6..a29d227cfbb0f 100644 --- a/x-pack/plugins/cases/server/services/mocks.ts +++ b/x-pack/plugins/cases/server/services/mocks.ts @@ -55,7 +55,7 @@ export const createCaseServiceMock = (): CaseServiceMock => { }; // the cast here is required because jest.Mocked tries to include private members and would throw an error - return (service as unknown) as CaseServiceMock; + return service as unknown as CaseServiceMock; }; export const createConfigureServiceMock = (): CaseConfigureServiceMock => { @@ -68,7 +68,7 @@ export const createConfigureServiceMock = (): CaseConfigureServiceMock => { }; // the cast here is required because jest.Mocked tries to include private members and would throw an error - return (service as unknown) as CaseConfigureServiceMock; + return service as unknown as CaseConfigureServiceMock; }; export const connectorMappingsServiceMock = (): ConnectorMappingsServiceMock => { @@ -79,7 +79,7 @@ export const connectorMappingsServiceMock = (): ConnectorMappingsServiceMock => }; // the cast here is required because jest.Mocked tries to include private members and would throw an error - return (service as unknown) as ConnectorMappingsServiceMock; + return service as unknown as ConnectorMappingsServiceMock; }; export const createUserActionServiceMock = (): CaseUserActionServiceMock => { @@ -89,7 +89,7 @@ export const createUserActionServiceMock = (): CaseUserActionServiceMock => { }; // the cast here is required because jest.Mocked tries to include private members and would throw an error - return (service as unknown) as CaseUserActionServiceMock; + return service as unknown as CaseUserActionServiceMock; }; export const createAlertServiceMock = (): AlertServiceMock => ({ @@ -108,5 +108,5 @@ export const createAttachmentServiceMock = (): AttachmentServiceMock => { }; // the cast here is required because jest.Mocked tries to include private members and would throw an error - return (service as unknown) as AttachmentServiceMock; + return service as unknown as AttachmentServiceMock; }; diff --git a/x-pack/plugins/cross_cluster_replication/common/services/utils.ts b/x-pack/plugins/cross_cluster_replication/common/services/utils.ts index f5f6615f9dcd3..900d8c9046efd 100644 --- a/x-pack/plugins/cross_cluster_replication/common/services/utils.ts +++ b/x-pack/plugins/cross_cluster_replication/common/services/utils.ts @@ -12,22 +12,24 @@ export const arrify = (val: any): any[] => (Array.isArray(val) ? val : [val]); * * @param {number} time Time in millisecond to wait */ -export const wait = (time = 1000) => (data: any): Promise => { - return new Promise((resolve) => { - setTimeout(() => resolve(data), time); - }); -}; +export const wait = + (time = 1000) => + (data: any): Promise => { + return new Promise((resolve) => { + setTimeout(() => resolve(data), time); + }); + }; /** * Utility to remove empty fields ("") from a request body */ export const removeEmptyFields = (body: Record): Record => - Object.entries(body).reduce((acc: Record, [key, value]: [string, any]): Record< - string, - any - > => { - if (value !== '') { - acc[key] = value; - } - return acc; - }, {}); + Object.entries(body).reduce( + (acc: Record, [key, value]: [string, any]): Record => { + if (value !== '') { + acc[key] = value; + } + return acc; + }, + {} + ); diff --git a/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/follower_index_add.test.js b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/follower_index_add.test.js index 6d54444df4273..10e41a8b18d5b 100644 --- a/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/follower_index_add.test.js +++ b/x-pack/plugins/cross_cluster_replication/public/__jest__/client_integration/follower_index_add.test.js @@ -102,9 +102,8 @@ describe('Create Follower index', () => { autoFollowPatternAddComponent.update(); const remoteClusterFormFieldFollowerIndex = component.find(RemoteClustersFormField); - const remoteClusterFormFieldAutoFollowPattern = autoFollowPatternAddComponent.find( - RemoteClustersFormField - ); + const remoteClusterFormFieldAutoFollowPattern = + autoFollowPatternAddComponent.find(RemoteClustersFormField); expect(remoteClusterFormFieldFollowerIndex.length).toBe(1); expect(remoteClusterFormFieldAutoFollowPattern.length).toBe(1); diff --git a/x-pack/plugins/cross_cluster_replication/public/app/app.tsx b/x-pack/plugins/cross_cluster_replication/public/app/app.tsx index c6144143e1849..dba5db9df5b8b 100644 --- a/x-pack/plugins/cross_cluster_replication/public/app/app.tsx +++ b/x-pack/plugins/cross_cluster_replication/public/app/app.tsx @@ -102,12 +102,8 @@ class AppComponent extends Component { } render() { - const { - isFetchingPermissions, - fetchPermissionError, - hasPermission, - missingClusterPrivileges, - } = this.state; + const { isFetchingPermissions, fetchPermissionError, hasPermission, missingClusterPrivileges } = + this.state; if (isFetchingPermissions) { return ( diff --git a/x-pack/plugins/cross_cluster_replication/public/app/components/follower_index_form/follower_index_form.js b/x-pack/plugins/cross_cluster_replication/public/app/components/follower_index_form/follower_index_form.js index dc117a9cd4581..451f2a94fe91f 100644 --- a/x-pack/plugins/cross_cluster_replication/public/app/components/follower_index_form/follower_index_form.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/components/follower_index_form/follower_index_form.js @@ -73,22 +73,26 @@ const getEmptyFollowerIndex = (remoteClusterName = '') => ({ /** * State transitions: fields update */ -export const updateFields = (fields) => ({ followerIndex }) => ({ - followerIndex: { - ...followerIndex, - ...fields, - }, -}); +export const updateFields = + (fields) => + ({ followerIndex }) => ({ + followerIndex: { + ...followerIndex, + ...fields, + }, + }); /** * State transitions: errors update */ -export const updateFormErrors = (errors) => ({ fieldsErrors }) => ({ - fieldsErrors: { - ...fieldsErrors, - ...errors, - }, -}); +export const updateFormErrors = + (errors) => + ({ fieldsErrors }) => ({ + fieldsErrors: { + ...fieldsErrors, + ...errors, + }, + }); export class FollowerIndexForm extends PureComponent { static propTypes = { diff --git a/x-pack/plugins/cross_cluster_replication/public/app/components/form_entry_row.js b/x-pack/plugins/cross_cluster_replication/public/app/components/form_entry_row.js index 5a671b29be492..69fb1a54bec1e 100644 --- a/x-pack/plugins/cross_cluster_replication/public/app/components/form_entry_row.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/components/form_entry_row.js @@ -20,12 +20,14 @@ import { /** * State transitions: fields update */ -export const updateFields = (newValues) => ({ fields }) => ({ - fields: { - ...fields, - ...newValues, - }, -}); +export const updateFields = + (newValues) => + ({ fields }) => ({ + fields: { + ...fields, + ...newValues, + }, + }); export class FormEntryRow extends PureComponent { static propTypes = { diff --git a/x-pack/plugins/cross_cluster_replication/public/app/components/remote_clusters_form_field.js b/x-pack/plugins/cross_cluster_replication/public/app/components/remote_clusters_form_field.js index 09af1071f0082..4e173618b1192 100644 --- a/x-pack/plugins/cross_cluster_replication/public/app/components/remote_clusters_form_field.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/components/remote_clusters_form_field.js @@ -213,10 +213,8 @@ export class RemoteClustersFormField extends PureComponent { renderCurrentRemoteClusterNotConnected = (name, fatal) => { const { isEditable, currentUrl } = this.props; - const { - remoteClusterNotConnectedEditable, - remoteClusterNotConnectedNotEditable, - } = this.errorMessages; + const { remoteClusterNotConnectedEditable, remoteClusterNotConnectedNotEditable } = + this.errorMessages; const { title, description } = isEditable ? remoteClusterNotConnectedEditable(name) diff --git a/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/auto_follow_pattern_list.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/auto_follow_pattern_list.js index 3a4273c1ed0e3..4d7eb107ea24b 100644 --- a/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/auto_follow_pattern_list.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/auto_follow_pattern_list.js @@ -50,12 +50,8 @@ export class AutoFollowPatternList extends PureComponent { }; componentDidMount() { - const { - loadAutoFollowPatterns, - loadAutoFollowStats, - selectAutoFollowPattern, - history, - } = this.props; + const { loadAutoFollowPatterns, loadAutoFollowStats, selectAutoFollowPattern, history } = + this.props; trackUiMetric(METRIC_TYPE.LOADED, UIM_AUTO_FOLLOW_PATTERN_LIST_LOAD); loadAutoFollowPatterns(); diff --git a/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/components/detail_panel/detail_panel.js b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/components/detail_panel/detail_panel.js index b32af06807e22..a83da7e08cdfd 100644 --- a/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/components/detail_panel/detail_panel.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/sections/home/auto_follow_pattern_list/components/detail_panel/detail_panel.js @@ -268,11 +268,8 @@ export class DetailPanel extends Component { return this.renderAutoFollowPatternNotFound(); } - const { - followIndexPatternPrefix, - followIndexPatternSuffix, - leaderIndexPatterns, - } = autoFollowPattern; + const { followIndexPatternPrefix, followIndexPatternSuffix, leaderIndexPatterns } = + autoFollowPattern; let indexManagementFilter; diff --git a/x-pack/plugins/cross_cluster_replication/public/app/services/auto_follow_pattern_validators.js b/x-pack/plugins/cross_cluster_replication/public/app/services/auto_follow_pattern_validators.js index cd09742b1c558..a876e231e8615 100644 --- a/x-pack/plugins/cross_cluster_replication/public/app/services/auto_follow_pattern_validators.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/services/auto_follow_pattern_validators.js @@ -12,11 +12,8 @@ import { FormattedMessage } from '@kbn/i18n/react'; import { indexPatterns } from '../../../../../../src/plugins/data/public'; import { indices } from '../../shared_imports'; -const { - indexNameBeginsWithPeriod, - findIllegalCharactersInIndexName, - indexNameContainsSpaces, -} = indices; +const { indexNameBeginsWithPeriod, findIllegalCharactersInIndexName, indexNameContainsSpaces } = + indices; export const validateName = (name = '') => { let errorMsg = null; diff --git a/x-pack/plugins/cross_cluster_replication/public/app/store/actions/api.js b/x-pack/plugins/cross_cluster_replication/public/app/store/actions/api.js index 6945d9e37fa21..32379cb9a2cc8 100644 --- a/x-pack/plugins/cross_cluster_replication/public/app/store/actions/api.js +++ b/x-pack/plugins/cross_cluster_replication/public/app/store/actions/api.js @@ -28,29 +28,24 @@ export const clearApiError = (scope) => ({ payload: { error: null, scope }, }); -export const sendApiRequest = ({ - label, - scope, - status, - handler, - onSuccess = () => undefined, - onError = () => undefined, -}) => async (dispatch, getState) => { - dispatch(clearApiError(scope)); - dispatch(apiRequestStart({ label, scope, status })); - - try { - const response = await handler(dispatch); - - dispatch(apiRequestEnd({ label, scope })); - dispatch({ type: `${label}_SUCCESS`, payload: response }); - - onSuccess(response, dispatch, getState); - } catch (error) { - dispatch(apiRequestEnd({ label, scope })); - dispatch(setApiError({ error, scope })); - dispatch({ type: `${label}_FAILURE`, payload: error }); - - onError(error, dispatch, getState); - } -}; +export const sendApiRequest = + ({ label, scope, status, handler, onSuccess = () => undefined, onError = () => undefined }) => + async (dispatch, getState) => { + dispatch(clearApiError(scope)); + dispatch(apiRequestStart({ label, scope, status })); + + try { + const response = await handler(dispatch); + + dispatch(apiRequestEnd({ label, scope })); + dispatch({ type: `${label}_SUCCESS`, payload: response }); + + onSuccess(response, dispatch, getState); + } catch (error) { + dispatch(apiRequestEnd({ label, scope })); + dispatch(setApiError({ error, scope })); + dispatch({ type: `${label}_FAILURE`, payload: error }); + + onError(error, dispatch, getState); + } + }; diff --git a/x-pack/plugins/cross_cluster_replication/server/routes/api/test_lib.ts b/x-pack/plugins/cross_cluster_replication/server/routes/api/test_lib.ts index 3a5a317797933..c125d6b4552fd 100644 --- a/x-pack/plugins/cross_cluster_replication/server/routes/api/test_lib.ts +++ b/x-pack/plugins/cross_cluster_replication/server/routes/api/test_lib.ts @@ -9,7 +9,7 @@ import { RequestHandlerContext } from 'src/core/server'; import { License } from '../../shared_imports'; export function mockRouteContext(mockedFunctions: unknown): RequestHandlerContext { - const routeContextMock = ({ + const routeContextMock = { core: { elasticsearch: { client: { @@ -17,7 +17,7 @@ export function mockRouteContext(mockedFunctions: unknown): RequestHandlerContex }, }, }, - } as unknown) as RequestHandlerContext; + } as unknown as RequestHandlerContext; return routeContextMock; } diff --git a/x-pack/plugins/dashboard_enhanced/common/drilldowns/dashboard_drilldown/dashboard_drilldown_persistable_state.ts b/x-pack/plugins/dashboard_enhanced/common/drilldowns/dashboard_drilldown/dashboard_drilldown_persistable_state.ts index bb06bf41a31d6..04ee451c91c75 100644 --- a/x-pack/plugins/dashboard_enhanced/common/drilldowns/dashboard_drilldown/dashboard_drilldown_persistable_state.ts +++ b/x-pack/plugins/dashboard_enhanced/common/drilldowns/dashboard_drilldown/dashboard_drilldown_persistable_state.ts @@ -65,10 +65,10 @@ export const createExtract = ({ return { state: { ...state, - action: ({ + action: { ...state.action, config: restOfConfig, - } as unknown) as SerializedAction, + } as unknown as SerializedAction, }, references, }; diff --git a/x-pack/plugins/dashboard_enhanced/public/plugin.ts b/x-pack/plugins/dashboard_enhanced/public/plugin.ts index f739287663d11..339269f95e51e 100644 --- a/x-pack/plugins/dashboard_enhanced/public/plugin.ts +++ b/x-pack/plugins/dashboard_enhanced/public/plugin.ts @@ -34,7 +34,8 @@ export interface SetupContract {} export interface StartContract {} export class DashboardEnhancedPlugin - implements Plugin { + implements Plugin +{ public readonly drilldowns = new DashboardDrilldownsService(); constructor(protected readonly context: PluginInitializerContext) {} diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/abstract_dashboard_drilldown.tsx b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/abstract_dashboard_drilldown.tsx index 6f02946596a87..96a17bd894391 100644 --- a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/abstract_dashboard_drilldown.tsx +++ b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/abstract_dashboard_drilldown/abstract_dashboard_drilldown.tsx @@ -32,7 +32,8 @@ export interface Params { } export abstract class AbstractDashboardDrilldown - implements Drilldown { + implements Drilldown +{ constructor(protected readonly params: Params) {} public abstract readonly id: string; diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_create_drilldown/flyout_create_drilldown.test.tsx b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_create_drilldown/flyout_create_drilldown.test.tsx index bd46724a77934..572eca97d611b 100644 --- a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_create_drilldown/flyout_create_drilldown.test.tsx +++ b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_create_drilldown/flyout_create_drilldown.test.tsx @@ -72,9 +72,9 @@ describe('isCompatible', () => { expectedResult: boolean = true ): Promise { uiActionsEnhanced.getActionFactories.mockImplementation(() => [ - ({ + { supportedTriggers: () => actionFactoriesTriggers, - } as unknown) as UiActionsEnhancedActionFactory, + } as unknown as UiActionsEnhancedActionFactory, ]); let embeddable = new MockEmbeddable( diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_edit_drilldown/menu_item.test.tsx b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_edit_drilldown/menu_item.test.tsx index 11c2364980800..5c03d90212ff2 100644 --- a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_edit_drilldown/menu_item.test.tsx +++ b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/actions/flyout_edit_drilldown/menu_item.test.tsx @@ -17,11 +17,11 @@ test('', () => { const { getByText, queryByText } = render( diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.test.tsx b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.test.tsx index 3272a6e27de23..d24ed9b35242f 100644 --- a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.test.tsx +++ b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.test.tsx @@ -90,7 +90,7 @@ describe('.execute() & getHref', () => { }); const getLocationSpy = jest.spyOn(definition, 'getLocation'); const drilldown = new EmbeddableToDashboardDrilldown({ - start: ((() => ({ + start: (() => ({ core: { application: { navigateToApp, @@ -111,7 +111,7 @@ describe('.execute() & getHref', () => { }, }, self: {}, - })) as unknown) as StartServicesGetter< + })) as unknown as StartServicesGetter< Pick >, }); @@ -123,7 +123,7 @@ describe('.execute() & getHref', () => { ...config, }; - const context = ({ + const context = { filters: filtersFromEvent, embeddable: { getInput: () => ({ @@ -134,7 +134,7 @@ describe('.execute() & getHref', () => { }), }, timeFieldName, - } as unknown) as ApplyGlobalFilterActionContext & EnhancedEmbeddableContext; + } as unknown as ApplyGlobalFilterActionContext & EnhancedEmbeddableContext; await drilldown.execute(completeConfig, context); diff --git a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx index 97355d9eb435e..97b66e1b7de39 100644 --- a/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx +++ b/x-pack/plugins/dashboard_enhanced/public/services/drilldowns/embeddable_to_dashboard_drilldown/embeddable_to_dashboard_drilldown.tsx @@ -73,10 +73,8 @@ export class EmbeddableToDashboardDrilldown extends AbstractDashboardDrilldown esFilters.isFilterPinned(f)); } - const { - restOfFilters: filtersFromEvent, - timeRange: timeRangeFromEvent, - } = esFilters.extractTimeRange(context.filters, context.timeFieldName); + const { restOfFilters: filtersFromEvent, timeRange: timeRangeFromEvent } = + esFilters.extractTimeRange(context.filters, context.timeFieldName); if (filtersFromEvent) { params.filters = [...(params.filters ?? []), ...filtersFromEvent]; diff --git a/x-pack/plugins/dashboard_enhanced/server/plugin.ts b/x-pack/plugins/dashboard_enhanced/server/plugin.ts index 10f128fc9bffa..89d4d70a1f6f4 100644 --- a/x-pack/plugins/dashboard_enhanced/server/plugin.ts +++ b/x-pack/plugins/dashboard_enhanced/server/plugin.ts @@ -24,7 +24,8 @@ export interface SetupContract {} export interface StartContract {} export class DashboardEnhancedPlugin - implements Plugin { + implements Plugin +{ constructor(protected readonly context: PluginInitializerContext) {} public setup(core: CoreSetup, plugins: SetupDependencies): SetupContract { diff --git a/x-pack/plugins/data_enhanced/public/plugin.ts b/x-pack/plugins/data_enhanced/public/plugin.ts index a222f7c734a1e..f26c1e8d0b62b 100644 --- a/x-pack/plugins/data_enhanced/public/plugin.ts +++ b/x-pack/plugins/data_enhanced/public/plugin.ts @@ -37,7 +37,8 @@ export type DataEnhancedSetup = ReturnType; export type DataEnhancedStart = ReturnType; export class DataEnhancedPlugin - implements Plugin { + implements Plugin +{ private config!: ConfigSchema; private readonly storage = new Storage(window.localStorage); private usageCollector?: SearchUsageCollector; diff --git a/x-pack/plugins/data_enhanced/public/search/sessions_mgmt/__mocks__/index.tsx b/x-pack/plugins/data_enhanced/public/search/sessions_mgmt/__mocks__/index.tsx index d52ca5b45613a..af0a1a583e447 100644 --- a/x-pack/plugins/data_enhanced/public/search/sessions_mgmt/__mocks__/index.tsx +++ b/x-pack/plugins/data_enhanced/public/search/sessions_mgmt/__mocks__/index.tsx @@ -14,6 +14,6 @@ export function LocaleWrapper({ children }: { children?: ReactNode }) { return {children}; } -export const mockUrls = ({ +export const mockUrls = { getUrlGenerator: (id: string) => ({ createUrl: () => `hello-cool-${id}-url` }), -} as unknown) as UrlGeneratorsStart; +} as unknown as UrlGeneratorsStart; diff --git a/x-pack/plugins/data_enhanced/public/search/sessions_mgmt/lib/api.ts b/x-pack/plugins/data_enhanced/public/search/sessions_mgmt/lib/api.ts index eb38d47c26ffb..01b64dcaf8a85 100644 --- a/x-pack/plugins/data_enhanced/public/search/sessions_mgmt/lib/api.ts +++ b/x-pack/plugins/data_enhanced/public/search/sessions_mgmt/lib/api.ts @@ -79,46 +79,48 @@ async function getUrlFromState( } // Helper: factory for a function to map server objects to UI objects -const mapToUISession = (urls: UrlGeneratorsStart, config: SessionsConfigSchema) => async ( - savedObject: SavedObject -): Promise => { - const { - name, - appId, - created, - expires, - urlGeneratorId, - initialState, - restoreState, - idMapping, - version, - } = savedObject.attributes; +const mapToUISession = + (urls: UrlGeneratorsStart, config: SessionsConfigSchema) => + async ( + savedObject: SavedObject + ): Promise => { + const { + name, + appId, + created, + expires, + urlGeneratorId, + initialState, + restoreState, + idMapping, + version, + } = savedObject.attributes; - const status = getUIStatus(savedObject.attributes); - const actions = getActions(status); + const status = getUIStatus(savedObject.attributes); + const actions = getActions(status); - // TODO: initialState should be saved without the searchSessionID - if (initialState) delete initialState.searchSessionId; - // derive the URL and add it in - const reloadUrl = await getUrlFromState(urls, urlGeneratorId, initialState); - const restoreUrl = await getUrlFromState(urls, urlGeneratorId, restoreState); + // TODO: initialState should be saved without the searchSessionID + if (initialState) delete initialState.searchSessionId; + // derive the URL and add it in + const reloadUrl = await getUrlFromState(urls, urlGeneratorId, initialState); + const restoreUrl = await getUrlFromState(urls, urlGeneratorId, restoreState); - return { - id: savedObject.id, - name, - appId, - created, - expires, - status, - actions, - restoreUrl, - reloadUrl, - initialState, - restoreState, - numSearches: Object.keys(idMapping).length, - version, + return { + id: savedObject.id, + name, + appId, + created, + expires, + status, + actions, + restoreUrl, + reloadUrl, + initialState, + restoreState, + numSearches: Object.keys(idMapping).length, + version, + }; }; -}; interface SearchSessionManagementDeps { urls: UrlGeneratorsStart; diff --git a/x-pack/plugins/data_enhanced/public/search/ui/connected_search_session_indicator/connected_search_session_indicator.tsx b/x-pack/plugins/data_enhanced/public/search/ui/connected_search_session_indicator/connected_search_session_indicator.tsx index 603df09e1c4c6..eed85a9d84ba8 100644 --- a/x-pack/plugins/data_enhanced/public/search/ui/connected_search_session_indicator/connected_search_session_indicator.tsx +++ b/x-pack/plugins/data_enhanced/public/search/ui/connected_search_session_indicator/connected_search_session_indicator.tsx @@ -67,10 +67,8 @@ export const createConnectedSearchSessionIndicator = ({ disableSaveAfterSessionCompleteTimedOut$, false ); - const [ - searchSessionIndicator, - setSearchSessionIndicator, - ] = useState(null); + const [searchSessionIndicator, setSearchSessionIndicator] = + useState(null); const searchSessionIndicatorRef = useCallback((ref: SearchSessionIndicatorRef) => { if (ref !== null) { setSearchSessionIndicator(ref); diff --git a/x-pack/plugins/data_enhanced/server/plugin.ts b/x-pack/plugins/data_enhanced/server/plugin.ts index ce98cf06a9dfe..60a5de6323f50 100644 --- a/x-pack/plugins/data_enhanced/server/plugin.ts +++ b/x-pack/plugins/data_enhanced/server/plugin.ts @@ -18,7 +18,8 @@ import { registerUsageCollector } from './collectors'; import { SearchSessionService } from './search'; export class EnhancedDataServerPlugin - implements Plugin { + implements Plugin +{ private readonly logger: Logger; private sessionService!: SearchSessionService; private config: ConfigSchema; diff --git a/x-pack/plugins/data_enhanced/server/routes/session.ts b/x-pack/plugins/data_enhanced/server/routes/session.ts index 0b786f44454a9..3e293aa82dc83 100644 --- a/x-pack/plugins/data_enhanced/server/routes/session.ts +++ b/x-pack/plugins/data_enhanced/server/routes/session.ts @@ -32,15 +32,8 @@ export function registerSessionRoutes(router: DataEnhancedPluginRouter, logger: }, }, async (context, request, res) => { - const { - sessionId, - name, - expires, - initialState, - restoreState, - appId, - urlGeneratorId, - } = request.body; + const { sessionId, name, expires, initialState, restoreState, appId, urlGeneratorId } = + request.body; try { const response = await context.search!.saveSession(sessionId, { diff --git a/x-pack/plugins/data_enhanced/server/saved_objects/search_session_migration.test.ts b/x-pack/plugins/data_enhanced/server/saved_objects/search_session_migration.test.ts index a04a7a4d3302f..cdb86772482fe 100644 --- a/x-pack/plugins/data_enhanced/server/saved_objects/search_session_migration.test.ts +++ b/x-pack/plugins/data_enhanced/server/saved_objects/search_session_migration.test.ts @@ -15,51 +15,53 @@ import { SEARCH_SESSION_TYPE, SearchSessionStatus } from '../../../../../src/plu import { SavedObjectMigrationContext } from 'kibana/server'; describe('7.12.0 -> 7.13.0', () => { - const mockCompletedSessionSavedObject: SavedObject = { - id: 'id', - type: SEARCH_SESSION_TYPE, - attributes: { - name: 'my_name', - appId: 'my_app_id', - sessionId: 'sessionId', - urlGeneratorId: 'my_url_generator_id', - initialState: {}, - restoreState: {}, - persisted: true, - idMapping: {}, - realmType: 'realmType', - realmName: 'realmName', - username: 'username', - created: '2021-03-26T00:00:00.000Z', - expires: '2021-03-30T00:00:00.000Z', - touched: '2021-03-29T00:00:00.000Z', - status: SearchSessionStatus.COMPLETE, - }, - references: [], - }; + const mockCompletedSessionSavedObject: SavedObject = + { + id: 'id', + type: SEARCH_SESSION_TYPE, + attributes: { + name: 'my_name', + appId: 'my_app_id', + sessionId: 'sessionId', + urlGeneratorId: 'my_url_generator_id', + initialState: {}, + restoreState: {}, + persisted: true, + idMapping: {}, + realmType: 'realmType', + realmName: 'realmName', + username: 'username', + created: '2021-03-26T00:00:00.000Z', + expires: '2021-03-30T00:00:00.000Z', + touched: '2021-03-29T00:00:00.000Z', + status: SearchSessionStatus.COMPLETE, + }, + references: [], + }; - const mockInProgressSessionSavedObject: SavedObject = { - id: 'id', - type: SEARCH_SESSION_TYPE, - attributes: { - name: 'my_name', - appId: 'my_app_id', - sessionId: 'sessionId', - urlGeneratorId: 'my_url_generator_id', - initialState: {}, - restoreState: {}, - persisted: true, - idMapping: {}, - realmType: 'realmType', - realmName: 'realmName', - username: 'username', - created: '2021-03-26T00:00:00.000Z', - expires: '2021-03-30T00:00:00.000Z', - touched: '2021-03-29T00:00:00.000Z', - status: SearchSessionStatus.IN_PROGRESS, - }, - references: [], - }; + const mockInProgressSessionSavedObject: SavedObject = + { + id: 'id', + type: SEARCH_SESSION_TYPE, + attributes: { + name: 'my_name', + appId: 'my_app_id', + sessionId: 'sessionId', + urlGeneratorId: 'my_url_generator_id', + initialState: {}, + restoreState: {}, + persisted: true, + idMapping: {}, + realmType: 'realmType', + realmName: 'realmName', + username: 'username', + created: '2021-03-26T00:00:00.000Z', + expires: '2021-03-30T00:00:00.000Z', + touched: '2021-03-29T00:00:00.000Z', + status: SearchSessionStatus.IN_PROGRESS, + }, + references: [], + }; const migration = searchSessionSavedObjectMigrations['7.13.0']; test('"completed" is populated from "touched" for completed session', () => { diff --git a/x-pack/plugins/data_enhanced/server/search/session/get_session_status.test.ts b/x-pack/plugins/data_enhanced/server/search/session/get_session_status.test.ts index c3946e5af16fa..336bc890268ce 100644 --- a/x-pack/plugins/data_enhanced/server/search/session/get_session_status.test.ts +++ b/x-pack/plugins/data_enhanced/server/search/session/get_session_status.test.ts @@ -11,9 +11,9 @@ import { SearchSessionStatus } from '../../../../../../src/plugins/data/common'; import moment from 'moment'; describe('getSessionStatus', () => { - const mockConfig = ({ + const mockConfig = { notTouchedInProgressTimeout: moment.duration(1, 'm'), - } as unknown) as SearchSessionsConfig; + } as unknown as SearchSessionsConfig; test("returns an in_progress status if there's nothing inside the session", () => { const session: any = { idMapping: {}, diff --git a/x-pack/plugins/data_enhanced/server/search/session/session_service.ts b/x-pack/plugins/data_enhanced/server/search/session/session_service.ts index 9aff99d6f9a3f..75f404d0f8790 100644 --- a/x-pack/plugins/data_enhanced/server/search/session/session_service.ts +++ b/x-pack/plugins/data_enhanced/server/search/session/session_service.ts @@ -90,7 +90,8 @@ function sleep(ms: number) { return new Promise((r) => setTimeout(r, ms)); } export class SearchSessionService - implements ISearchSessionService { + implements ISearchSessionService +{ private sessionConfig: SearchSessionsConfig; private readonly updateOrCreateBatchQueue: UpdateOrCreateQueueEntry[] = []; diff --git a/x-pack/plugins/data_visualizer/public/application/common/components/fields_stats_grid/fields_stats_grid.tsx b/x-pack/plugins/data_visualizer/public/application/common/components/fields_stats_grid/fields_stats_grid.tsx index f1c164768d6e7..8e59345c9bd63 100644 --- a/x-pack/plugins/data_visualizer/public/application/common/components/fields_stats_grid/fields_stats_grid.tsx +++ b/x-pack/plugins/data_visualizer/public/application/common/components/fields_stats_grid/fields_stats_grid.tsx @@ -49,9 +49,8 @@ function getItemIdToExpandedRowMap( export const FieldsStatsGrid: FC = ({ results }) => { const restorableDefaults = getDefaultDataVisualizerListState(); - const [dataVisualizerListState, setDataVisualizerListState] = useState( - restorableDefaults - ); + const [dataVisualizerListState, setDataVisualizerListState] = + useState(restorableDefaults); const visibleFieldTypes = dataVisualizerListState.visibleFieldTypes ?? restorableDefaults.visibleFieldTypes; diff --git a/x-pack/plugins/data_visualizer/public/application/common/components/top_values/top_values.tsx b/x-pack/plugins/data_visualizer/public/application/common/components/top_values/top_values.tsx index 7a20b054462a6..a019f7fb0976c 100644 --- a/x-pack/plugins/data_visualizer/public/application/common/components/top_values/top_values.tsx +++ b/x-pack/plugins/data_visualizer/public/application/common/components/top_values/top_values.tsx @@ -40,13 +40,8 @@ function getPercentLabel(docCount: number, topValuesSampleSize: number): string export const TopValues: FC = ({ stats, fieldFormat, barColor, compressed }) => { if (stats === undefined) return null; - const { - topValues, - topValuesSampleSize, - topValuesSamplerShardSize, - count, - isTopValuesSampled, - } = stats; + const { topValues, topValuesSampleSize, topValuesSamplerShardSize, count, isTopValuesSampled } = + stats; const progressBarMax = isTopValuesSampled === true ? topValuesSampleSize : count; return ( diff --git a/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/components/edit_flyout/edit_flyout.js b/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/components/edit_flyout/edit_flyout.js index cc6f5c45b3105..7ffaf7a4e216e 100644 --- a/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/components/edit_flyout/edit_flyout.js +++ b/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/components/edit_flyout/edit_flyout.js @@ -48,14 +48,8 @@ export class EditFlyout extends Component { }; render() { - const { - isFlyoutVisible, - closeEditFlyout, - setOverrides, - overrides, - originalSettings, - fields, - } = this.props; + const { isFlyoutVisible, closeEditFlyout, setOverrides, overrides, originalSettings, fields } = + this.props; return ( diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/index_data_visualizer_view/index_data_visualizer_view.tsx b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/index_data_visualizer_view/index_data_visualizer_view.tsx index a8adbfad3d44d..0eb8e6363d607 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/index_data_visualizer_view/index_data_visualizer_view.tsx +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/index_data_visualizer_view/index_data_visualizer_view.tsx @@ -103,21 +103,22 @@ function getDefaultPageState(): DataVisualizerPageState { documentCountStats: undefined, }; } -export const getDefaultDataVisualizerListState = (): Required => ({ - pageIndex: 0, - pageSize: 10, - sortField: 'fieldName', - sortDirection: 'asc', - visibleFieldTypes: [], - visibleFieldNames: [], - samplerShardSize: 5000, - searchString: '', - searchQuery: defaultSearchQuery, - searchQueryLanguage: SEARCH_QUERY_LANGUAGE.KUERY, - showDistributions: true, - showAllFields: false, - showEmptyFields: false, -}); +export const getDefaultDataVisualizerListState = + (): Required => ({ + pageIndex: 0, + pageSize: 10, + sortField: 'fieldName', + sortDirection: 'asc', + visibleFieldTypes: [], + visibleFieldNames: [], + samplerShardSize: 5000, + searchString: '', + searchQuery: defaultSearchQuery, + searchQueryLanguage: SEARCH_QUERY_LANGUAGE.KUERY, + showDistributions: true, + showAllFields: false, + showEmptyFields: false, + }); export interface IndexDataVisualizerViewProps { currentIndexPattern: IndexPattern; @@ -163,10 +164,10 @@ export const IndexDataVisualizerView: FC = (dataVi autoRefreshSelector: true, }); - const dataLoader = useMemo(() => new DataLoader(currentIndexPattern, toasts), [ - currentIndexPattern, - toasts, - ]); + const dataLoader = useMemo( + () => new DataLoader(currentIndexPattern, toasts), + [currentIndexPattern, toasts] + ); useEffect(() => { if (globalState?.time !== undefined) { diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/index_pattern_management/index_pattern_management.tsx b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/index_pattern_management/index_pattern_management.tsx index 3cec1141a4d35..38f6a66a5ef29 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/index_pattern_management/index_pattern_management.tsx +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/index_pattern_management/index_pattern_management.tsx @@ -31,7 +31,8 @@ export function DataVisualizerIndexPatternManagement( } = useDataVisualizerKibana(); const { useNewFieldsApi, currentIndexPattern } = props; - const indexPatternFieldEditPermission = indexPatternFieldEditor?.userPermissions.editIndexPattern(); + const indexPatternFieldEditPermission = + indexPatternFieldEditor?.userPermissions.editIndexPattern(); const canEditIndexPatternField = !!indexPatternFieldEditPermission && useNewFieldsApi; const [isAddIndexPatternFieldPopoverOpen, setIsAddIndexPatternFieldPopoverOpen] = useState(false); diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/index_data_visualizer.tsx b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/index_data_visualizer.tsx index 9a8987967fe69..f9748da51a22d 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/index_data_visualizer.tsx +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/index_data_visualizer.tsx @@ -39,159 +39,150 @@ export interface DataVisualizerUrlStateContextProviderProps { additionalLinks: ResultLink[]; } -export const DataVisualizerUrlStateContextProvider: FC = ({ - IndexDataVisualizerComponent, - additionalLinks, -}) => { - const { - services: { - data: { indexPatterns }, - savedObjects: { client: savedObjectsClient }, - notifications: { toasts }, - }, - } = useDataVisualizerKibana(); - const history = useHistory(); - - const [currentIndexPattern, setCurrentIndexPattern] = useState( - undefined - ); - const [currentSavedSearch, setCurrentSavedSearch] = useState | null>( - null - ); - const { search: searchString } = useLocation(); - - useEffect(() => { - const prevSearchString = searchString; - const parsedQueryString = parse(prevSearchString, { sort: false }); +export const DataVisualizerUrlStateContextProvider: FC = + ({ IndexDataVisualizerComponent, additionalLinks }) => { + const { + services: { + data: { indexPatterns }, + savedObjects: { client: savedObjectsClient }, + notifications: { toasts }, + }, + } = useDataVisualizerKibana(); + const history = useHistory(); + + const [currentIndexPattern, setCurrentIndexPattern] = useState( + undefined + ); + const [currentSavedSearch, setCurrentSavedSearch] = useState | null>( + null + ); + const { search: searchString } = useLocation(); + + useEffect(() => { + const prevSearchString = searchString; + const parsedQueryString = parse(prevSearchString, { sort: false }); - const getIndexPattern = async () => { - if (typeof parsedQueryString?.savedSearchId === 'string') { - const savedSearchId = parsedQueryString.savedSearchId; - try { - const savedSearch = await savedObjectsClient.get('search', savedSearchId); - const indexPatternId = savedSearch.references.find((ref) => ref.type === 'index-pattern') - ?.id; - if (indexPatternId !== undefined && savedSearch) { - try { - const indexPattern = await indexPatterns.get(indexPatternId); - setCurrentSavedSearch(savedSearch); - setCurrentIndexPattern(indexPattern); - } catch (e) { - toasts.addError(e, { - title: i18n.translate('xpack.dataVisualizer.index.indexPatternErrorMessage', { - defaultMessage: 'Error finding index pattern', - }), - }); + const getIndexPattern = async () => { + if (typeof parsedQueryString?.savedSearchId === 'string') { + const savedSearchId = parsedQueryString.savedSearchId; + try { + const savedSearch = await savedObjectsClient.get('search', savedSearchId); + const indexPatternId = savedSearch.references.find( + (ref) => ref.type === 'index-pattern' + )?.id; + if (indexPatternId !== undefined && savedSearch) { + try { + const indexPattern = await indexPatterns.get(indexPatternId); + setCurrentSavedSearch(savedSearch); + setCurrentIndexPattern(indexPattern); + } catch (e) { + toasts.addError(e, { + title: i18n.translate('xpack.dataVisualizer.index.indexPatternErrorMessage', { + defaultMessage: 'Error finding index pattern', + }), + }); + } } + } catch (e) { + toasts.addError(e, { + title: i18n.translate('xpack.dataVisualizer.index.savedSearchErrorMessage', { + defaultMessage: 'Error retrieving saved search {savedSearchId}', + values: { savedSearchId }, + }), + }); } - } catch (e) { - toasts.addError(e, { - title: i18n.translate('xpack.dataVisualizer.index.savedSearchErrorMessage', { - defaultMessage: 'Error retrieving saved search {savedSearchId}', - values: { savedSearchId }, - }), - }); } - } - - if (typeof parsedQueryString?.index === 'string') { - const indexPattern = await indexPatterns.get(parsedQueryString.index); - setCurrentIndexPattern(indexPattern); - } - }; - getIndexPattern(); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [savedObjectsClient, toasts, indexPatterns]); - - const setUrlState: SetUrlState = useCallback( - ( - accessor: Accessor, - attribute: string | Dictionary, - value?: any, - replaceState?: boolean - ) => { - const prevSearchString = searchString; - const urlState = parseUrlState(prevSearchString); - const parsedQueryString = parse(prevSearchString, { sort: false }); - - if (!Object.prototype.hasOwnProperty.call(urlState, accessor)) { - urlState[accessor] = {}; - } - if (typeof attribute === 'string') { - if (isEqual(getNestedProperty(urlState, `${accessor}.${attribute}`), value)) { - return prevSearchString; + if (typeof parsedQueryString?.index === 'string') { + const indexPattern = await indexPatterns.get(parsedQueryString.index); + setCurrentIndexPattern(indexPattern); + } + }; + getIndexPattern(); + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [savedObjectsClient, toasts, indexPatterns]); + + const setUrlState: SetUrlState = useCallback( + ( + accessor: Accessor, + attribute: string | Dictionary, + value?: any, + replaceState?: boolean + ) => { + const prevSearchString = searchString; + const urlState = parseUrlState(prevSearchString); + const parsedQueryString = parse(prevSearchString, { sort: false }); + + if (!Object.prototype.hasOwnProperty.call(urlState, accessor)) { + urlState[accessor] = {}; } - urlState[accessor][attribute] = value; - } else { - const attributes = attribute; - Object.keys(attributes).forEach((a) => { - urlState[accessor][a] = attributes[a]; - }); - } - - try { - const oldLocationSearchString = stringify(parsedQueryString, { - sort: false, - encode: false, - }); - - Object.keys(urlState).forEach((a) => { - if (isRisonSerializationRequired(a)) { - parsedQueryString[a] = encode(urlState[a]); - } else { - parsedQueryString[a] = urlState[a]; - } - }); - const newLocationSearchString = stringify(parsedQueryString, { - sort: false, - encode: false, - }); - - if (oldLocationSearchString !== newLocationSearchString) { - const newSearchString = stringify(parsedQueryString, { sort: false }); - if (replaceState) { - history.replace({ search: newSearchString }); - } else { - history.push({ search: newSearchString }); + if (typeof attribute === 'string') { + if (isEqual(getNestedProperty(urlState, `${accessor}.${attribute}`), value)) { + return prevSearchString; } + + urlState[accessor][attribute] = value; + } else { + const attributes = attribute; + Object.keys(attributes).forEach((a) => { + urlState[accessor][a] = attributes[a]; + }); } - } catch (error) { - // eslint-disable-next-line no-console - console.error('Could not save url state', error); - } - }, - [history, searchString] - ); - return ( - - {currentIndexPattern ? ( - - ) : ( -
- )} - - ); -}; + try { + const oldLocationSearchString = stringify(parsedQueryString, { + sort: false, + encode: false, + }); + + Object.keys(urlState).forEach((a) => { + if (isRisonSerializationRequired(a)) { + parsedQueryString[a] = encode(urlState[a]); + } else { + parsedQueryString[a] = urlState[a]; + } + }); + const newLocationSearchString = stringify(parsedQueryString, { + sort: false, + encode: false, + }); + + if (oldLocationSearchString !== newLocationSearchString) { + const newSearchString = stringify(parsedQueryString, { sort: false }); + if (replaceState) { + history.replace({ search: newSearchString }); + } else { + history.push({ search: newSearchString }); + } + } + } catch (error) { + // eslint-disable-next-line no-console + console.error('Could not save url state', error); + } + }, + [history, searchString] + ); + + return ( + + {currentIndexPattern ? ( + + ) : ( +
+ )} + + ); + }; export const IndexDataVisualizer: FC<{ additionalLinks: ResultLink[] }> = ({ additionalLinks }) => { const coreStart = getCoreStart(); - const { - data, - maps, - embeddable, - share, - security, - fileUpload, - lens, - indexPatternFieldEditor, - } = getPluginsStart(); + const { data, maps, embeddable, share, security, fileUpload, lens, indexPatternFieldEditor } = + getPluginsStart(); const services = { data, maps, diff --git a/x-pack/plugins/data_visualizer/public/plugin.ts b/x-pack/plugins/data_visualizer/public/plugin.ts index 4b71b08e9cf27..54f27a2e9d72e 100644 --- a/x-pack/plugins/data_visualizer/public/plugin.ts +++ b/x-pack/plugins/data_visualizer/public/plugin.ts @@ -46,7 +46,8 @@ export class DataVisualizerPlugin DataVisualizerPluginStart, DataVisualizerSetupDependencies, DataVisualizerStartDependencies - > { + > +{ public setup(core: CoreSetup, plugins: DataVisualizerSetupDependencies) { if (plugins.home) { registerHomeAddData(plugins.home); diff --git a/x-pack/plugins/data_visualizer/server/models/data_visualizer/get_histogram_for_fields.ts b/x-pack/plugins/data_visualizer/server/models/data_visualizer/get_histogram_for_fields.ts index b8f6e2f538180..6621c793c0017 100644 --- a/x-pack/plugins/data_visualizer/server/models/data_visualizer/get_histogram_for_fields.ts +++ b/x-pack/plugins/data_visualizer/server/models/data_visualizer/get_histogram_for_fields.ts @@ -143,46 +143,44 @@ export const getHistogramsForFields = async ( const aggsPath = getSamplerAggregationsResponsePath(samplerShardSize); const aggregations = aggsPath.length > 0 ? get(body.aggregations, aggsPath) : body.aggregations; - const chartsData: ChartData[] = fields.map( - (field): ChartData => { - const fieldName = field.fieldName; - const fieldType = field.type; - const id = stringHash(field.fieldName); - - if (fieldType === KBN_FIELD_TYPES.NUMBER || fieldType === KBN_FIELD_TYPES.DATE) { - if (aggIntervals[id] === undefined) { - return { - type: 'numeric', - data: [], - interval: 0, - stats: [0, 0], - id: fieldName, - }; - } + const chartsData: ChartData[] = fields.map((field): ChartData => { + const fieldName = field.fieldName; + const fieldType = field.type; + const id = stringHash(field.fieldName); + if (fieldType === KBN_FIELD_TYPES.NUMBER || fieldType === KBN_FIELD_TYPES.DATE) { + if (aggIntervals[id] === undefined) { return { - data: aggregations[`${id}_histogram`].buckets, - interval: aggIntervals[id].interval, - stats: [aggIntervals[id].min, aggIntervals[id].max], type: 'numeric', - id: fieldName, - }; - } else if (fieldType === KBN_FIELD_TYPES.STRING || fieldType === KBN_FIELD_TYPES.BOOLEAN) { - return { - type: fieldType === KBN_FIELD_TYPES.STRING ? 'ordinal' : 'boolean', - cardinality: - fieldType === KBN_FIELD_TYPES.STRING ? aggregations[`${id}_cardinality`].value : 2, - data: aggregations[`${id}_terms`].buckets, + data: [], + interval: 0, + stats: [0, 0], id: fieldName, }; } return { - type: 'unsupported', + data: aggregations[`${id}_histogram`].buckets, + interval: aggIntervals[id].interval, + stats: [aggIntervals[id].min, aggIntervals[id].max], + type: 'numeric', + id: fieldName, + }; + } else if (fieldType === KBN_FIELD_TYPES.STRING || fieldType === KBN_FIELD_TYPES.BOOLEAN) { + return { + type: fieldType === KBN_FIELD_TYPES.STRING ? 'ordinal' : 'boolean', + cardinality: + fieldType === KBN_FIELD_TYPES.STRING ? aggregations[`${id}_cardinality`].value : 2, + data: aggregations[`${id}_terms`].buckets, id: fieldName, }; } - ); + + return { + type: 'unsupported', + id: fieldName, + }; + }); return chartsData; }; diff --git a/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.test.ts b/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.test.ts index 1401c8882b04e..e1e25c284b4aa 100644 --- a/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.test.ts +++ b/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.test.ts @@ -19,7 +19,7 @@ import { Filter, RangeFilter } from '../../../../../../src/plugins/data/public'; import { DiscoverAppLocator } from '../../../../../../src/plugins/discover/public'; import { sharePluginMock } from '../../../../../../src/plugins/share/public/mocks'; -const i18nTranslateSpy = (i18n.translate as unknown) as jest.SpyInstance; +const i18nTranslateSpy = i18n.translate as unknown as jest.SpyInstance; jest.mock('@kbn/i18n', () => ({ i18n: { @@ -81,11 +81,11 @@ const setup = ( ], }; - const embeddable: VisualizeEmbeddableContract = ({ + const embeddable: VisualizeEmbeddableContract = { type: VISUALIZE_EMBEDDABLE_TYPE, getInput: () => input, getOutput: () => output, - } as unknown) as VisualizeEmbeddableContract; + } as unknown as VisualizeEmbeddableContract; const context = { filters, diff --git a/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.ts b/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.ts index 7b59a4e51d042..4ab9146a06c55 100644 --- a/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.ts +++ b/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_chart_action.ts @@ -31,7 +31,8 @@ export const ACTION_EXPLORE_DATA_CHART = 'ACTION_EXPLORE_DATA_CHART'; */ export class ExploreDataChartAction extends AbstractExploreDataAction - implements Action { + implements Action +{ public readonly id = ACTION_EXPLORE_DATA_CHART; public readonly type = ACTION_EXPLORE_DATA_CHART; diff --git a/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_context_menu_action.test.ts b/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_context_menu_action.test.ts index afb058ed112ad..7008800e9c9f4 100644 --- a/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_context_menu_action.test.ts +++ b/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_context_menu_action.test.ts @@ -17,7 +17,7 @@ import { ViewMode } from '../../../../../../src/plugins/embeddable/public'; import { DiscoverAppLocator } from '../../../../../../src/plugins/discover/public'; import { sharePluginMock } from '../../../../../../src/plugins/share/public/mocks'; -const i18nTranslateSpy = (i18n.translate as unknown) as jest.SpyInstance; +const i18nTranslateSpy = i18n.translate as unknown as jest.SpyInstance; jest.mock('@kbn/i18n', () => ({ i18n: { @@ -69,11 +69,11 @@ const setup = () => { ], }; - const embeddable: VisualizeEmbeddableContract = ({ + const embeddable: VisualizeEmbeddableContract = { type: VISUALIZE_EMBEDDABLE_TYPE, getInput: () => input, getOutput: () => output, - } as unknown) as VisualizeEmbeddableContract; + } as unknown as VisualizeEmbeddableContract; const context = { embeddable, diff --git a/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_context_menu_action.ts b/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_context_menu_action.ts index 88c093a299cb9..3580a3f191e6c 100644 --- a/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_context_menu_action.ts +++ b/x-pack/plugins/discover_enhanced/public/actions/explore_data/explore_data_context_menu_action.ts @@ -33,7 +33,8 @@ export const ACTION_EXPLORE_DATA = 'ACTION_EXPLORE_DATA'; */ export class ExploreDataContextMenuAction extends AbstractExploreDataAction - implements Action { + implements Action +{ public readonly id = ACTION_EXPLORE_DATA; public readonly type = ACTION_EXPLORE_DATA; diff --git a/x-pack/plugins/discover_enhanced/public/plugin.ts b/x-pack/plugins/discover_enhanced/public/plugin.ts index 60f242d682ffc..3b437ead81d78 100644 --- a/x-pack/plugins/discover_enhanced/public/plugin.ts +++ b/x-pack/plugins/discover_enhanced/public/plugin.ts @@ -39,7 +39,8 @@ export interface DiscoverEnhancedStartDependencies { export class DiscoverEnhancedPlugin implements - Plugin { + Plugin +{ public readonly config: Config; constructor(protected readonly context: PluginInitializerContext) { diff --git a/x-pack/plugins/discover_enhanced/server/plugin.ts b/x-pack/plugins/discover_enhanced/server/plugin.ts index 81b6295234830..d5dd32791dcd5 100644 --- a/x-pack/plugins/discover_enhanced/server/plugin.ts +++ b/x-pack/plugins/discover_enhanced/server/plugin.ts @@ -25,7 +25,8 @@ interface StartDependencies { } export class DiscoverEnhancedPlugin - implements Plugin { + implements Plugin +{ private config$: Observable; constructor(protected readonly context: PluginInitializerContext) { diff --git a/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown.test.ts b/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown.test.ts index a6896367bd613..bff507836d175 100644 --- a/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown.test.ts +++ b/x-pack/plugins/drilldowns/url_drilldown/public/lib/url_drilldown.test.ts @@ -49,14 +49,14 @@ const mockDataPoints = [ }, ]; -const mockEmbeddable = ({ +const mockEmbeddable = { getInput: () => ({ filters: [], timeRange: { from: 'now-15m', to: 'now' }, query: { query: 'test', language: 'kuery' }, }), getOutput: () => ({}), -} as unknown) as IEmbeddable; +} as unknown as IEmbeddable; const mockNavigateToUrl = jest.fn(() => Promise.resolve()); diff --git a/x-pack/plugins/drilldowns/url_drilldown/public/lib/variables/event_variables.test.ts b/x-pack/plugins/drilldowns/url_drilldown/public/lib/variables/event_variables.test.ts index 2a56a5fa0e102..d66d998d7440c 100644 --- a/x-pack/plugins/drilldowns/url_drilldown/public/lib/variables/event_variables.test.ts +++ b/x-pack/plugins/drilldowns/url_drilldown/public/lib/variables/event_variables.test.ts @@ -53,7 +53,7 @@ describe('VALUE_CLICK_TRIGGER', () => { describe('handles undefined, null or missing values', () => { test('undefined or missing values are removed from the result scope', () => { - const point = createPoint(({ field: undefined } as unknown) as { + const point = createPoint({ field: undefined } as unknown as { field: string; value: string | null | number | boolean; }); @@ -90,10 +90,10 @@ describe('ROW_CLICK_TRIGGER', () => { }); test('getEventScopeValues() returns correct variables for row click trigger', () => { - const context = ({ + const context = { embeddable: {}, data: rowClickData as any, - } as unknown) as RowClickContext; + } as unknown as RowClickContext; const res = getEventScopeValues(context); expect(res).toEqual({ diff --git a/x-pack/plugins/drilldowns/url_drilldown/public/plugin.ts b/x-pack/plugins/drilldowns/url_drilldown/public/plugin.ts index b733691c639b6..053803d69a3e6 100644 --- a/x-pack/plugins/drilldowns/url_drilldown/public/plugin.ts +++ b/x-pack/plugins/drilldowns/url_drilldown/public/plugin.ts @@ -32,7 +32,8 @@ export interface SetupContract {} export interface StartContract {} export class UrlDrilldownPlugin - implements Plugin { + implements Plugin +{ constructor(protected readonly context: PluginInitializerContext) {} public setup(core: CoreSetup, plugins: SetupDependencies): SetupContract { diff --git a/x-pack/plugins/embeddable_enhanced/public/plugin.ts b/x-pack/plugins/embeddable_enhanced/public/plugin.ts index 4b27b31ad3e0e..4e83b5b0ffcd2 100644 --- a/x-pack/plugins/embeddable_enhanced/public/plugin.ts +++ b/x-pack/plugins/embeddable_enhanced/public/plugin.ts @@ -48,7 +48,8 @@ export interface SetupContract {} export interface StartContract {} export class EmbeddableEnhancedPlugin - implements Plugin { + implements Plugin +{ constructor(protected readonly context: PluginInitializerContext) {} private uiActions?: StartDependencies['uiActionsEnhanced']; diff --git a/x-pack/plugins/encrypted_saved_objects/server/audit/index.mock.ts b/x-pack/plugins/encrypted_saved_objects/server/audit/index.mock.ts index 4b8f183e4928c..a74ef1cb4fd2d 100644 --- a/x-pack/plugins/encrypted_saved_objects/server/audit/index.mock.ts +++ b/x-pack/plugins/encrypted_saved_objects/server/audit/index.mock.ts @@ -9,11 +9,11 @@ import type { EncryptedSavedObjectsAuditLogger } from './audit_logger'; export const encryptedSavedObjectsAuditLoggerMock = { create() { - return ({ + return { encryptAttributesSuccess: jest.fn(), encryptAttributeFailure: jest.fn(), decryptAttributesSuccess: jest.fn(), decryptAttributeFailure: jest.fn(), - } as unknown) as jest.Mocked; + } as unknown as jest.Mocked; }, }; diff --git a/x-pack/plugins/encrypted_saved_objects/server/create_migration.ts b/x-pack/plugins/encrypted_saved_objects/server/create_migration.ts index 18786e0f9d1c6..f166e018d9c9d 100644 --- a/x-pack/plugins/encrypted_saved_objects/server/create_migration.ts +++ b/x-pack/plugins/encrypted_saved_objects/server/create_migration.ts @@ -46,109 +46,117 @@ export type CreateEncryptedSavedObjectsMigrationFn = < opts: CreateEncryptedSavedObjectsMigrationFnOpts ) => SavedObjectOptionalMigrationFn; -export const getCreateMigration = ( - encryptedSavedObjectsService: Readonly, - instantiateServiceWithLegacyType: ( - typeRegistration: EncryptedSavedObjectTypeRegistration - ) => EncryptedSavedObjectsService -): CreateEncryptedSavedObjectsMigrationFn => (opts) => { - const { - isMigrationNeededPredicate, - migration, - shouldMigrateIfDecryptionFails, - inputType, - migratedType, - } = opts; - - if (inputType && migratedType && inputType.type !== migratedType.type) { - throw new Error( - `An Invalid Encrypted Saved Objects migration is trying to migrate across types ("${inputType.type}" => "${migratedType.type}"), which isn't permitted` - ); - } - - const inputService = inputType - ? instantiateServiceWithLegacyType(inputType) - : encryptedSavedObjectsService; - - const migratedService = migratedType - ? instantiateServiceWithLegacyType(migratedType) - : encryptedSavedObjectsService; - - return (encryptedDoc, context) => { - if (!isMigrationNeededPredicate(encryptedDoc)) { - return encryptedDoc; +export const getCreateMigration = + ( + encryptedSavedObjectsService: Readonly, + instantiateServiceWithLegacyType: ( + typeRegistration: EncryptedSavedObjectTypeRegistration + ) => EncryptedSavedObjectsService + ): CreateEncryptedSavedObjectsMigrationFn => + (opts) => { + const { + isMigrationNeededPredicate, + migration, + shouldMigrateIfDecryptionFails, + inputType, + migratedType, + } = opts; + + if (inputType && migratedType && inputType.type !== migratedType.type) { + throw new Error( + `An Invalid Encrypted Saved Objects migration is trying to migrate across types ("${inputType.type}" => "${migratedType.type}"), which isn't permitted` + ); } - // After it is converted, the object's old ID is stored in the `originId` field. In addition, objects that are imported a certain way - // may have this field set, but it would not be necessary to use this to decrypt saved object attributes. - const { type, id, originId } = encryptedDoc; - - // If an object is slated to be converted, it should be decrypted flexibly: - // * If this is an index migration: - // a. If there is one or more pending migration _before_ the conversion, the object will be decrypted and re-encrypted with its - // namespace in the descriptor. Then, after the conversion, the object will be decrypted with its namespace and old ID in the - // descriptor and re-encrypted with its new ID (without a namespace) in the descriptor. - // b. If there are no pending migrations before the conversion, then after the conversion the object will be decrypted with its - // namespace and old ID in the descriptor and re-encrypted with its new ID (without a namespace) in the descriptor. - // * If this is *not* an index migration, then it is a single document migration. In that case, the object will be decrypted and - // re-encrypted without a namespace in the descriptor. - // To account for these different scenarios, when this field is set, the ESO service will attempt several different permutations of - // the descriptor when decrypting the object. - const isTypeBeingConverted = - !!context.convertToMultiNamespaceTypeVersion && - semver.lte(context.migrationVersion, context.convertToMultiNamespaceTypeVersion); - - // This approximates the behavior of getDescriptorNamespace(); the intent is that if there is ever a case where a multi-namespace object - // has the `namespace` field, it will not be encrypted with that field in its descriptor. It would be preferable to rely on - // getDescriptorNamespace() here, but that requires the SO type registry which can only be retrieved from a promise, and this is not an - // async function - const descriptorNamespace = context.isSingleNamespaceType ? encryptedDoc.namespace : undefined; - let decryptDescriptorNamespace = descriptorNamespace; - - // If an object has been converted right before this migration function is called, it will no longer have a `namespace` field, but it - // will have a `namespaces` field; in that case, the first/only element in that array should be used as the namespace in the descriptor - // during decryption. - if (isTypeBeingConverted) { - decryptDescriptorNamespace = encryptedDoc.namespaces?.length - ? normalizeNamespace(encryptedDoc.namespaces[0]) // `namespaces` contains string values, but we need to normalize this to the namespace ID representation - : encryptedDoc.namespace; - } + const inputService = inputType + ? instantiateServiceWithLegacyType(inputType) + : encryptedSavedObjectsService; - // These descriptors might have a `namespace` that is undefined. That is expected for multi-namespace and namespace-agnostic types. - const decryptDescriptor = { id, type, namespace: decryptDescriptorNamespace }; - const encryptDescriptor = { id, type, namespace: descriptorNamespace }; - - // decrypt the attributes using the input type definition - // if an error occurs during decryption, use the shouldMigrateIfDecryptionFails flag - // to determine whether to throw the error or continue the migration - // if we are continuing the migration, strip encrypted attributes from the document using stripOrDecryptAttributesSync - const documentToMigrate = mapAttributes(encryptedDoc, (inputAttributes) => { - try { - return inputService.decryptAttributesSync(decryptDescriptor, inputAttributes, { - isTypeBeingConverted, - originId, - }); - } catch (err) { - if (!shouldMigrateIfDecryptionFails || !(err instanceof EncryptionError)) { - throw err; - } + const migratedService = migratedType + ? instantiateServiceWithLegacyType(migratedType) + : encryptedSavedObjectsService; + + return (encryptedDoc, context) => { + if (!isMigrationNeededPredicate(encryptedDoc)) { + return encryptedDoc; + } - context.log.warn( - `Decryption failed for encrypted Saved Object "${encryptedDoc.id}" of type "${encryptedDoc.type}" with error: ${err.message}. Encrypted attributes have been stripped from the original document and migration will be applied but this may cause errors later on.` - ); - return inputService.stripOrDecryptAttributesSync(decryptDescriptor, inputAttributes, { - isTypeBeingConverted, - originId, - }).attributes; + // After it is converted, the object's old ID is stored in the `originId` field. In addition, objects that are imported a certain way + // may have this field set, but it would not be necessary to use this to decrypt saved object attributes. + const { type, id, originId } = encryptedDoc; + + // If an object is slated to be converted, it should be decrypted flexibly: + // * If this is an index migration: + // a. If there is one or more pending migration _before_ the conversion, the object will be decrypted and re-encrypted with its + // namespace in the descriptor. Then, after the conversion, the object will be decrypted with its namespace and old ID in the + // descriptor and re-encrypted with its new ID (without a namespace) in the descriptor. + // b. If there are no pending migrations before the conversion, then after the conversion the object will be decrypted with its + // namespace and old ID in the descriptor and re-encrypted with its new ID (without a namespace) in the descriptor. + // * If this is *not* an index migration, then it is a single document migration. In that case, the object will be decrypted and + // re-encrypted without a namespace in the descriptor. + // To account for these different scenarios, when this field is set, the ESO service will attempt several different permutations of + // the descriptor when decrypting the object. + const isTypeBeingConverted = + !!context.convertToMultiNamespaceTypeVersion && + semver.lte(context.migrationVersion, context.convertToMultiNamespaceTypeVersion); + + // This approximates the behavior of getDescriptorNamespace(); the intent is that if there is ever a case where a multi-namespace object + // has the `namespace` field, it will not be encrypted with that field in its descriptor. It would be preferable to rely on + // getDescriptorNamespace() here, but that requires the SO type registry which can only be retrieved from a promise, and this is not an + // async function + const descriptorNamespace = context.isSingleNamespaceType + ? encryptedDoc.namespace + : undefined; + let decryptDescriptorNamespace = descriptorNamespace; + + // If an object has been converted right before this migration function is called, it will no longer have a `namespace` field, but it + // will have a `namespaces` field; in that case, the first/only element in that array should be used as the namespace in the descriptor + // during decryption. + if (isTypeBeingConverted) { + decryptDescriptorNamespace = encryptedDoc.namespaces?.length + ? normalizeNamespace(encryptedDoc.namespaces[0]) // `namespaces` contains string values, but we need to normalize this to the namespace ID representation + : encryptedDoc.namespace; } - }); - // migrate and encrypt the document - return mapAttributes(migration(documentToMigrate, context), (migratedAttributes) => { - return migratedService.encryptAttributesSync(encryptDescriptor, migratedAttributes); - }); + // These descriptors might have a `namespace` that is undefined. That is expected for multi-namespace and namespace-agnostic types. + const decryptDescriptor = { id, type, namespace: decryptDescriptorNamespace }; + const encryptDescriptor = { id, type, namespace: descriptorNamespace }; + + // decrypt the attributes using the input type definition + // if an error occurs during decryption, use the shouldMigrateIfDecryptionFails flag + // to determine whether to throw the error or continue the migration + // if we are continuing the migration, strip encrypted attributes from the document using stripOrDecryptAttributesSync + const documentToMigrate = mapAttributes(encryptedDoc, (inputAttributes) => { + try { + return inputService.decryptAttributesSync(decryptDescriptor, inputAttributes, { + isTypeBeingConverted, + originId, + }); + } catch (err) { + if (!shouldMigrateIfDecryptionFails || !(err instanceof EncryptionError)) { + throw err; + } + + context.log.warn( + `Decryption failed for encrypted Saved Object "${encryptedDoc.id}" of type "${encryptedDoc.type}" with error: ${err.message}. Encrypted attributes have been stripped from the original document and migration will be applied but this may cause errors later on.` + ); + return inputService.stripOrDecryptAttributesSync( + decryptDescriptor, + inputAttributes, + { + isTypeBeingConverted, + originId, + } + ).attributes; + } + }); + + // migrate and encrypt the document + return mapAttributes(migration(documentToMigrate, context), (migratedAttributes) => { + return migratedService.encryptAttributesSync(encryptDescriptor, migratedAttributes); + }); + }; }; -}; function mapAttributes(obj: SavedObjectUnsanitizedDoc, mapper: (attributes: T) => T) { return Object.assign(obj, { diff --git a/x-pack/plugins/encrypted_saved_objects/server/crypto/encrypted_saved_objects_service.mocks.ts b/x-pack/plugins/encrypted_saved_objects/server/crypto/encrypted_saved_objects_service.mocks.ts index 2e8e37e61deed..18df968502b11 100644 --- a/x-pack/plugins/encrypted_saved_objects/server/crypto/encrypted_saved_objects_service.mocks.ts +++ b/x-pack/plugins/encrypted_saved_objects/server/crypto/encrypted_saved_objects_service.mocks.ts @@ -12,7 +12,7 @@ import type { } from './encrypted_saved_objects_service'; function createEncryptedSavedObjectsServiceMock() { - return ({ + return { isRegistered: jest.fn(), stripOrDecryptAttributes: jest.fn(), encryptAttributes: jest.fn(), @@ -20,7 +20,7 @@ function createEncryptedSavedObjectsServiceMock() { encryptAttributesSync: jest.fn(), decryptAttributesSync: jest.fn(), stripOrDecryptAttributesSync: jest.fn(), - } as unknown) as jest.Mocked; + } as unknown as jest.Mocked; } export const encryptedSavedObjectsServiceMock = { diff --git a/x-pack/plugins/encrypted_saved_objects/server/crypto/encrypted_saved_objects_service.ts b/x-pack/plugins/encrypted_saved_objects/server/crypto/encrypted_saved_objects_service.ts index 0cf775b88e7d5..4980817393c5f 100644 --- a/x-pack/plugins/encrypted_saved_objects/server/crypto/encrypted_saved_objects_service.ts +++ b/x-pack/plugins/encrypted_saved_objects/server/crypto/encrypted_saved_objects_service.ts @@ -122,10 +122,8 @@ export class EncryptedSavedObjectsService { * Map of all registered saved object types where the `key` is saved object type and the `value` * is the definition (names of attributes that need to be encrypted etc.). */ - private readonly typeDefinitions: Map< - string, - EncryptedSavedObjectAttributesDefinition - > = new Map(); + private readonly typeDefinitions: Map = + new Map(); constructor(private readonly options: EncryptedSavedObjectsServiceOptions) {} diff --git a/x-pack/plugins/encrypted_saved_objects/server/crypto/encryption_key_rotation_service.mocks.ts b/x-pack/plugins/encrypted_saved_objects/server/crypto/encryption_key_rotation_service.mocks.ts index a69154c0e7be3..9580cb85f5246 100644 --- a/x-pack/plugins/encrypted_saved_objects/server/crypto/encryption_key_rotation_service.mocks.ts +++ b/x-pack/plugins/encrypted_saved_objects/server/crypto/encryption_key_rotation_service.mocks.ts @@ -8,7 +8,7 @@ import type { EncryptionKeyRotationService } from './encryption_key_rotation_service'; function createEncryptionKeyRotationServiceMock() { - return ({ rotate: jest.fn() } as unknown) as jest.Mocked; + return { rotate: jest.fn() } as unknown as jest.Mocked; } export const encryptionKeyRotationServiceMock = { diff --git a/x-pack/plugins/encrypted_saved_objects/server/plugin.ts b/x-pack/plugins/encrypted_saved_objects/server/plugin.ts index fa1b6415d206e..565d4379014cc 100644 --- a/x-pack/plugins/encrypted_saved_objects/server/plugin.ts +++ b/x-pack/plugins/encrypted_saved_objects/server/plugin.ts @@ -47,7 +47,8 @@ export interface EncryptedSavedObjectsPluginStart { */ export class EncryptedSavedObjectsPlugin implements - Plugin { + Plugin +{ private readonly logger: Logger; private savedObjectsSetup!: ClientInstanciator; diff --git a/x-pack/plugins/encrypted_saved_objects/server/routes/key_rotation.test.ts b/x-pack/plugins/encrypted_saved_objects/server/routes/key_rotation.test.ts index 138d111cb8f9d..a052b847a50f7 100644 --- a/x-pack/plugins/encrypted_saved_objects/server/routes/key_rotation.test.ts +++ b/x-pack/plugins/encrypted_saved_objects/server/routes/key_rotation.test.ts @@ -25,7 +25,7 @@ describe('Key rotation routes', () => { router = routeParamsMock.router; mockEncryptionKeyRotationService = routeParamsMock.encryptionKeyRotationService; - mockContext = ({} as unknown) as RequestHandlerContext; + mockContext = {} as unknown as RequestHandlerContext; defineKeyRotationRoutes(routeParamsMock); }); @@ -92,8 +92,7 @@ describe('Key rotation routes', () => { payload: 'Kibana is not configured to support encryption key rotation. Update `kibana.yml` to include `xpack.encryptedSavedObjects.keyRotation.decryptionOnlyKeys` to rotate your encryption keys.', options: { - body: - 'Kibana is not configured to support encryption key rotation. Update `kibana.yml` to include `xpack.encryptedSavedObjects.keyRotation.decryptionOnlyKeys` to rotate your encryption keys.', + body: 'Kibana is not configured to support encryption key rotation. Update `kibana.yml` to include `xpack.encryptedSavedObjects.keyRotation.decryptionOnlyKeys` to rotate your encryption keys.', }, }); }); @@ -145,8 +144,7 @@ describe('Key rotation routes', () => { 'Encryption key rotation is in progress already. Please wait until it is completed and try again.', options: { statusCode: 429, - body: - 'Encryption key rotation is in progress already. Please wait until it is completed and try again.', + body: 'Encryption key rotation is in progress already. Please wait until it is completed and try again.', }, }); diff --git a/x-pack/plugins/encrypted_saved_objects/server/routes/key_rotation.ts b/x-pack/plugins/encrypted_saved_objects/server/routes/key_rotation.ts index 2a8076d537eb4..f59c4fa61f4aa 100644 --- a/x-pack/plugins/encrypted_saved_objects/server/routes/key_rotation.ts +++ b/x-pack/plugins/encrypted_saved_objects/server/routes/key_rotation.ts @@ -45,15 +45,13 @@ export function defineKeyRotationRoutes({ async (context, request, response) => { if (config.keyRotation.decryptionOnlyKeys.length === 0) { return response.badRequest({ - body: - 'Kibana is not configured to support encryption key rotation. Update `kibana.yml` to include `xpack.encryptedSavedObjects.keyRotation.decryptionOnlyKeys` to rotate your encryption keys.', + body: 'Kibana is not configured to support encryption key rotation. Update `kibana.yml` to include `xpack.encryptedSavedObjects.keyRotation.decryptionOnlyKeys` to rotate your encryption keys.', }); } if (rotationInProgress) { return response.customError({ - body: - 'Encryption key rotation is in progress already. Please wait until it is completed and try again.', + body: 'Encryption key rotation is in progress already. Please wait until it is completed and try again.', statusCode: 429, }); } diff --git a/x-pack/plugins/encrypted_saved_objects/server/saved_objects/encrypted_saved_objects_client_wrapper.test.ts b/x-pack/plugins/encrypted_saved_objects/server/saved_objects/encrypted_saved_objects_client_wrapper.test.ts index 0d958d29b2150..116a112fa1652 100644 --- a/x-pack/plugins/encrypted_saved_objects/server/saved_objects/encrypted_saved_objects_client_wrapper.test.ts +++ b/x-pack/plugins/encrypted_saved_objects/server/saved_objects/encrypted_saved_objects_client_wrapper.test.ts @@ -1478,7 +1478,7 @@ describe('#bulkResolve', () => { }; mockBaseClient.bulkResolve.mockResolvedValue( - (mockedResponse as unknown) as SavedObjectsBulkResolveResponse + mockedResponse as unknown as SavedObjectsBulkResolveResponse ); const bulkResolveParams = [ @@ -1527,7 +1527,7 @@ describe('#bulkResolve', () => { }; mockBaseClient.bulkResolve.mockResolvedValue( - (mockedResponse as unknown) as SavedObjectsBulkResolveResponse + mockedResponse as unknown as SavedObjectsBulkResolveResponse ); const bulkResolveParams = [ @@ -1601,7 +1601,7 @@ describe('#bulkResolve', () => { }; mockBaseClient.bulkResolve.mockResolvedValue( - (mockedResponse as unknown) as SavedObjectsBulkResolveResponse + mockedResponse as unknown as SavedObjectsBulkResolveResponse ); const decryptionError = new EncryptionError( @@ -1679,7 +1679,7 @@ describe('#bulkResolve', () => { ], }; mockBaseClient.bulkResolve.mockResolvedValue( - (mockedResponse as unknown) as SavedObjectsBulkResolveResponse + mockedResponse as unknown as SavedObjectsBulkResolveResponse ); const bulkGetParams = [{ type: 'known-type', id: 'bad' }]; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/analytics/views/query_detail.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/analytics/views/query_detail.tsx index e68984459cf10..814173744249f 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/analytics/views/query_detail.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/analytics/views/query_detail.tsx @@ -27,9 +27,8 @@ export const QueryDetail: React.FC = () => { const { query } = useDecodedParams(); const queryTitle = query === '""' ? query : `"${query}"`; - const { totalQueriesForQuery, queriesPerDayForQuery, startDate, topClicksForQuery } = useValues( - AnalyticsLogic - ); + const { totalQueriesForQuery, queriesPerDayForQuery, startDate, topClicksForQuery } = + useValues(AnalyticsLogic); return ( diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/add_domain/add_domain_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/add_domain/add_domain_logic.test.ts index 4dd699a733b8c..3f913d76f475d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/add_domain/add_domain_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/add_domain/add_domain_logic.test.ts @@ -395,9 +395,10 @@ describe('AddDomainLogic', () => { AddDomainLogic.actions.validateDomainInitialVerification('https://elastic.co', '/'); await nextTick(); - expect( - AddDomainLogic.actions.performDomainValidationStep - ).toHaveBeenCalledWith('initialValidation', ['url']); + expect(AddDomainLogic.actions.performDomainValidationStep).toHaveBeenCalledWith( + 'initialValidation', + ['url'] + ); }); }); @@ -408,9 +409,10 @@ describe('AddDomainLogic', () => { AddDomainLogic.actions.validateDomainContentVerification(); await nextTick(); - expect( - AddDomainLogic.actions.performDomainValidationStep - ).toHaveBeenCalledWith('contentVerification', ['url_request', 'url_content']); + expect(AddDomainLogic.actions.performDomainValidationStep).toHaveBeenCalledWith( + 'contentVerification', + ['url_request', 'url_content'] + ); }); }); @@ -421,9 +423,10 @@ describe('AddDomainLogic', () => { AddDomainLogic.actions.validateDomainIndexingRestrictions(); await nextTick(); - expect( - AddDomainLogic.actions.performDomainValidationStep - ).toHaveBeenCalledWith('indexingRestrictions', ['robots_txt']); + expect(AddDomainLogic.actions.performDomainValidationStep).toHaveBeenCalledWith( + 'indexingRestrictions', + ['robots_txt'] + ); }); }); @@ -434,9 +437,10 @@ describe('AddDomainLogic', () => { AddDomainLogic.actions.validateDomainNetworkConnectivity(); await nextTick(); - expect( - AddDomainLogic.actions.performDomainValidationStep - ).toHaveBeenCalledWith('networkConnectivity', ['dns', 'tcp']); + expect(AddDomainLogic.actions.performDomainValidationStep).toHaveBeenCalledWith( + 'networkConnectivity', + ['dns', 'tcp'] + ); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/add_domain/add_domain_logic.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/add_domain/add_domain_logic.ts index 020515b2cad87..ab85f8a585d1a 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/add_domain/add_domain_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/add_domain/add_domain_logic.ts @@ -57,9 +57,9 @@ export interface AddDomainLogicActions { checks: string[]; }; setAddDomainFormInputValue(newValue: string): string; - setDomainValidationResult( - change: CrawlerDomainValidationResultChange - ): { change: CrawlerDomainValidationResultChange }; + setDomainValidationResult(change: CrawlerDomainValidationResultChange): { + change: CrawlerDomainValidationResultChange; + }; startDomainValidation(): void; submitNewDomain(): void; validateDomainInitialVerification( diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/manage_crawls_popover/automatic_crawl_scheduler_logic.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/manage_crawls_popover/automatic_crawl_scheduler_logic.ts index 432aa9f139dd0..126d9d0f10762 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/manage_crawls_popover/automatic_crawl_scheduler_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/crawler/components/manage_crawls_popover/automatic_crawl_scheduler_logic.ts @@ -36,9 +36,9 @@ export interface AutomaticCrawlSchedulerLogicActions { enableCrawlAutomatically(): void; fetchCrawlSchedule(): void; saveChanges(): void; - setCrawlFrequency( - crawlFrequency: CrawlSchedule['frequency'] - ): { crawlFrequency: CrawlSchedule['frequency'] }; + setCrawlFrequency(crawlFrequency: CrawlSchedule['frequency']): { + crawlFrequency: CrawlSchedule['frequency']; + }; setCrawlSchedule(crawlSchedule: CrawlSchedule): { crawlSchedule: CrawlSchedule }; setCrawlUnit(crawlUnit: CrawlSchedule['unit']): { crawlUnit: CrawlSchedule['unit'] }; submitCrawlSchedule(): void; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/credentials/credentials.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/credentials/credentials.tsx index f777278190db2..77a66fbc76ad5 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/credentials/credentials.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/credentials/credentials.tsx @@ -31,9 +31,8 @@ import { CredentialsList } from './credentials_list'; import { CredentialsLogic } from './credentials_logic'; export const Credentials: React.FC = () => { - const { fetchCredentials, fetchDetails, resetCredentials, showCredentialsForm } = useActions( - CredentialsLogic - ); + const { fetchCredentials, fetchDetails, resetCredentials, showCredentialsForm } = + useActions(CredentialsLogic); const { meta, dataLoading, shouldShowCredentialsForm } = useValues(CredentialsLogic); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/results/add_result_flyout.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/results/add_result_flyout.tsx index a20e4e137f899..9d341cc2f5520 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/results/add_result_flyout.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/curations/curation/results/add_result_flyout.tsx @@ -43,9 +43,8 @@ export const AddResultFlyout: React.FC = () => { const { search } = useActions(searchLogic); const { promotedIds, hiddenIds } = useValues(CurationLogic); - const { addPromotedId, removePromotedId, addHiddenId, removeHiddenId } = useActions( - CurationLogic - ); + const { addPromotedId, removePromotedId, addHiddenId, removeHiddenId } = + useActions(CurationLogic); return ( diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/document_creation/document_creation_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/document_creation/document_creation_logic.test.ts index a75cb78536783..cf1b45d468260 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/document_creation/document_creation_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/document_creation/document_creation_logic.test.ts @@ -516,7 +516,7 @@ describe('DocumentCreationLogic', () => { describe('chunks large uploads', () => { // Using an array of #s for speed, it doesn't really matter what the contents of the documents are for this test - const largeDocumentsArray = ([...Array(200).keys()] as unknown) as object[]; + const largeDocumentsArray = [...Array(200).keys()] as unknown as object[]; const mockFirstResponse = { validDocuments: { total: 99, examples: largeDocumentsArray.slice(0, 98) }, diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/document_creation/utils.test.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/document_creation/utils.test.ts index 88cde227d38ad..3a5bb36477f53 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/document_creation/utils.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/document_creation/utils.test.ts @@ -15,7 +15,7 @@ describe('readUploadedFileAsText', () => { }); it('throws an error if the file cannot be read', async () => { - const badFile = ('causes an error' as unknown) as File; + const badFile = 'causes an error' as unknown as File; await expect(readUploadedFileAsText(badFile)).rejects.toThrow(); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_router.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_router.tsx index 8b0e6428babf5..669a729000744 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_router.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engine/engine_router.tsx @@ -67,9 +67,8 @@ export const EngineRouter: React.FC = () => { const { engineName: engineNameFromUrl } = useParams() as { engineName: string }; const { engineName, dataLoading, engineNotFound, isMetaEngine } = useValues(EngineLogic); - const { setEngineName, initializeEngine, pollEmptyEngine, stopPolling, clearEngine } = useActions( - EngineLogic - ); + const { setEngineName, initializeEngine, pollEmptyEngine, stopPolling, clearEngine } = + useActions(EngineLogic); useEffect(() => { setEngineName(engineNameFromUrl); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engines/components/tables/meta_engines_table_logic.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engines/components/tables/meta_engines_table_logic.ts index 94205a5392b63..63d4fe99ff62a 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engines/components/tables/meta_engines_table_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engines/components/tables/meta_engines_table_logic.ts @@ -17,9 +17,9 @@ interface MetaEnginesTableValues { } interface MetaEnginesTableActions { - addSourceEngines( - sourceEngines: MetaEnginesTableValues['sourceEngines'] - ): { sourceEngines: MetaEnginesTableValues['sourceEngines'] }; + addSourceEngines(sourceEngines: MetaEnginesTableValues['sourceEngines']): { + sourceEngines: MetaEnginesTableValues['sourceEngines']; + }; displayRow(itemId: string): { itemId: string }; fetchOrDisplayRow(itemId: string): { itemId: string }; fetchSourceEngines(engineName: string): { engineName: string }; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engines/engines_overview.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engines/engines_overview.tsx index d1dd5514757d7..4a08c592fdb64 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/engines/engines_overview.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/engines/engines_overview.tsx @@ -49,9 +49,8 @@ export const EnginesOverview: React.FC = () => { metaEnginesLoading, } = useValues(EnginesLogic); - const { loadEngines, loadMetaEngines, onEnginesPagination, onMetaEnginesPagination } = useActions( - EnginesLogic - ); + const { loadEngines, loadMetaEngines, onEnginesPagination, onMetaEnginesPagination } = + useActions(EnginesLogic); useEffect(() => { loadEngines(); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/library/library.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/library/library.tsx index 9b5d6090f2f8a..55c9cc7958346 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/library/library.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/library/library.tsx @@ -268,10 +268,10 @@ export const Library: React.FC = () => { isMetaEngine: true, result: { ...props.result, - 'this-description-is-a-really-really-really-really-really-really-really-really-really-really-really-really-really-really-really-really-really-really-really-really-really-really-really-really-long-key': { - raw: - 'Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?', - }, + 'this-description-is-a-really-really-really-really-really-really-really-really-really-really-really-really-really-really-really-really-really-really-really-really-really-really-really-really-long-key': + { + raw: 'Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim ad minima veniam, quis nostrum exercitationem ullam corporis suscipit laboriosam, nisi ut aliquid ex ea commodi consequatur? Quis autem vel eum iure reprehenderit qui in ea voluptate velit esse quam nihil molestiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?', + }, _meta: { id: 'my-id-is-a-really-long-id-yes-it-is', score: 100, diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/meta_engine_creation/meta_engine_creation.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/meta_engine_creation/meta_engine_creation.tsx index 1455444ab2b4b..d83379fb7a2a4 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/meta_engine_creation/meta_engine_creation.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/meta_engine_creation/meta_engine_creation.tsx @@ -57,16 +57,11 @@ export const MetaEngineCreation: React.FC = () => { }, } = useValues(AppLogic); - const { - fetchIndexedEngineNames, - setRawName, - setSelectedIndexedEngineNames, - submitEngine, - } = useActions(MetaEngineCreationLogic); + const { fetchIndexedEngineNames, setRawName, setSelectedIndexedEngineNames, submitEngine } = + useActions(MetaEngineCreationLogic); - const { rawName, name, indexedEngineNames, selectedIndexedEngineNames, isLoading } = useValues( - MetaEngineCreationLogic - ); + const { rawName, name, indexedEngineNames, selectedIndexedEngineNames, isLoading } = + useValues(MetaEngineCreationLogic); useEffect(() => { fetchIndexedEngineNames(); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/meta_engine_creation/meta_engine_creation_logic.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/meta_engine_creation/meta_engine_creation_logic.ts index 95ef53d82cc47..5296676a38b36 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/meta_engine_creation/meta_engine_creation_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/meta_engine_creation/meta_engine_creation_logic.ts @@ -31,9 +31,9 @@ interface MetaEngineCreationValues { interface MetaEngineCreationActions { fetchIndexedEngineNames(page?: number): { page: number }; onEngineCreationSuccess(): void; - setIndexedEngineNames( - indexedEngineNames: MetaEngineCreationValues['indexedEngineNames'] - ): { indexedEngineNames: MetaEngineCreationValues['indexedEngineNames'] }; + setIndexedEngineNames(indexedEngineNames: MetaEngineCreationValues['indexedEngineNames']): { + indexedEngineNames: MetaEngineCreationValues['indexedEngineNames']; + }; setRawName(rawName: string): { rawName: string }; setSelectedIndexedEngineNames( selectedIndexedEngineNames: MetaEngineCreationValues['selectedIndexedEngineNames'] diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/relevance_tuning/relevance_tuning.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/relevance_tuning/relevance_tuning.tsx index 87fcf91718b57..b36ab2f12892d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/relevance_tuning/relevance_tuning.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/relevance_tuning/relevance_tuning.tsx @@ -29,9 +29,8 @@ import { RelevanceTuningLogic } from '.'; export const RelevanceTuning: React.FC = () => { const { dataLoading, engineHasSchemaFields, unsavedChanges } = useValues(RelevanceTuningLogic); - const { initializeRelevanceTuning, resetSearchSettings, updateSearchSettings } = useActions( - RelevanceTuningLogic - ); + const { initializeRelevanceTuning, resetSearchSettings, updateSearchSettings } = + useActions(RelevanceTuningLogic); useEffect(() => { initializeRelevanceTuning(); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/result/result.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/result/result.test.tsx index 1e361f113d883..dfb01a1a793c4 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/result/result.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/result/result.test.tsx @@ -124,9 +124,9 @@ describe('Result', () => { describe('dragging', () => { // In the real world, the drag library sets data attributes, role, tabIndex, etc. - const mockDragHandleProps = ({ + const mockDragHandleProps = { someMockProp: true, - } as unknown) as DraggableProvidedDragHandleProps; + } as unknown as DraggableProvidedDragHandleProps; it('will render a drag handle with the passed props', () => { const wrapper = shallow(); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/result_settings/result_settings.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/result_settings/result_settings.tsx index c315927433a0a..1b9b5670af359 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/result_settings/result_settings.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/result_settings/result_settings.tsx @@ -37,13 +37,8 @@ const UNSAVED_MESSAGE = i18n.translate( ); export const ResultSettings: React.FC = () => { - const { - dataLoading, - schema, - stagedUpdates, - resultFieldsAtDefaultSettings, - resultFieldsEmpty, - } = useValues(ResultSettingsLogic); + const { dataLoading, schema, stagedUpdates, resultFieldsAtDefaultSettings, resultFieldsEmpty } = + useValues(ResultSettingsLogic); const { initializeResultSettingsData, saveResultSettings, diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/result_settings/sample_response/sample_response_logic.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/result_settings/sample_response/sample_response_logic.ts index dfa39367b67cc..d4c5a842daac9 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/result_settings/sample_response/sample_response_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/result_settings/sample_response/sample_response_logic.ts @@ -33,9 +33,9 @@ interface SampleResponseValues { interface SampleResponseActions { queryChanged: (query: string) => { query: string }; - getSearchResultsSuccess: ( - response: SampleSearchResponse | string - ) => { response: SampleSearchResponse | string }; + getSearchResultsSuccess: (response: SampleSearchResponse | string) => { + response: SampleSearchResponse | string; + }; getSearchResultsFailure: (response: string) => { response: string }; getSearchResults: ( query: string, diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/engine_assignment_selector.test.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/engine_assignment_selector.test.tsx index 01c46e6423d70..9e2d708e20e7a 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/engine_assignment_selector.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/engine_assignment_selector.test.tsx @@ -90,9 +90,11 @@ describe('EngineAssignmentSelector', () => { it('handles engine checkbox click', async () => { const wrapper = shallow(); await waitFor(() => - ((wrapper.find(EuiComboBox).props() as unknown) as { - onChange: (a: EuiComboBoxOptionOption[]) => void; - }).onChange([{ label: engines[0].name, value: engines[0].name }]) + ( + wrapper.find(EuiComboBox).props() as unknown as { + onChange: (a: EuiComboBoxOptionOption[]) => void; + } + ).onChange([{ label: engines[0].name, value: engines[0].name }]) ); wrapper.update(); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/engine_assignment_selector.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/engine_assignment_selector.tsx index bb40a1a4fa279..09ee0940cee9d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/engine_assignment_selector.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/engine_assignment_selector.tsx @@ -26,17 +26,11 @@ import { import { RoleMappingsLogic } from './role_mappings_logic'; export const EngineAssignmentSelector: React.FC = () => { - const { handleAccessAllEnginesChange, handleEngineSelectionChange } = useActions( - RoleMappingsLogic - ); + const { handleAccessAllEnginesChange, handleEngineSelectionChange } = + useActions(RoleMappingsLogic); - const { - accessAllEngines, - availableEngines, - roleType, - selectedEngines, - selectedOptions, - } = useValues(RoleMappingsLogic); + const { accessAllEngines, availableEngines, roleType, selectedEngines, selectedOptions } = + useValues(RoleMappingsLogic); const hasEngineAssignment = selectedEngines.size > 0 || accessAllEngines; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/role_mappings_logic.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/role_mappings_logic.ts index 7b7bcd864ebd0..2cee0b58e703a 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/role_mappings_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/role_mappings_logic.ts @@ -48,11 +48,9 @@ const emptyUser = { username: '', email: '' } as ElasticsearchUser; interface RoleMappingsActions extends RoleMappingsBaseActions { setRoleMapping(roleMapping: ASRoleMapping): { roleMapping: ASRoleMapping }; setSingleUserRoleMapping(data?: UserMapping): { singleUserRoleMapping: UserMapping }; - setRoleMappings({ - roleMappings, - }: { + setRoleMappings({ roleMappings }: { roleMappings: ASRoleMapping[] }): { roleMappings: ASRoleMapping[]; - }): { roleMappings: ASRoleMapping[] }; + }; setRoleMappingsData(data: RoleMappingsServerDetails): RoleMappingsServerDetails; handleAccessAllEnginesChange(selected: boolean): { selected: boolean }; handleEngineSelectionChange(engineNames: string[]): { engineNames: string[] }; diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/user.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/user.tsx index 018d29706b05f..57f08c22220f7 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/user.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/role_mappings/user.tsx @@ -24,8 +24,8 @@ import { RoleTypes } from '../../types'; import { EngineAssignmentSelector } from './engine_assignment_selector'; import { RoleMappingsLogic } from './role_mappings_logic'; -const standardRoles = (['owner', 'admin'] as unknown) as RoleTypes[]; -const advancedRoles = (['dev', 'editor', 'analyst'] as unknown) as RoleTypes[]; +const standardRoles = ['owner', 'admin'] as unknown as RoleTypes[]; +const advancedRoles = ['dev', 'editor', 'analyst'] as unknown as RoleTypes[]; export const User: React.FC = () => { const { diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/schema/views/schema.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/schema/views/schema.tsx index d2a760e8accff..f8273edd5dfcb 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/schema/views/schema.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/schema/views/schema.tsx @@ -21,12 +21,10 @@ import { SCHEMA_TITLE } from '../constants'; import { SchemaLogic } from '../schema_logic'; export const Schema: React.FC = () => { - const { loadSchema, updateSchema, addSchemaField, openModal, closeModal } = useActions( - SchemaLogic - ); - const { dataLoading, isUpdating, hasSchema, hasSchemaChanged, isModalOpen } = useValues( - SchemaLogic - ); + const { loadSchema, updateSchema, addSchemaField, openModal, closeModal } = + useActions(SchemaLogic); + const { dataLoading, isUpdating, hasSchema, hasSchemaChanged, isModalOpen } = + useValues(SchemaLogic); useEffect(() => { loadSchema(); diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/source_engines/components/add_source_engines_modal.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/source_engines/components/add_source_engines_modal.tsx index 24e27e03818ad..44dd550d952d9 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/source_engines/components/add_source_engines_modal.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/source_engines/components/add_source_engines_modal.tsx @@ -33,9 +33,8 @@ import { SourceEnginesLogic } from '../source_engines_logic'; export const AddSourceEnginesModal: React.FC = () => { const { addSourceEngines, closeModal, onAddEnginesSelection } = useActions(SourceEnginesLogic); - const { selectableEngineNames, selectedEngineNamesToAdd, modalLoading } = useValues( - SourceEnginesLogic - ); + const { selectableEngineNames, selectedEngineNamesToAdd, modalLoading } = + useValues(SourceEnginesLogic); return ( diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/source_engines/source_engines_logic.ts b/x-pack/plugins/enterprise_search/public/applications/app_search/components/source_engines/source_engines_logic.ts index af3c955258cf8..bae87f9370a34 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/source_engines/source_engines_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/source_engines/source_engines_logic.ts @@ -32,19 +32,19 @@ interface SourceEnginesLogicActions { fetchIndexedEngines: () => void; fetchSourceEngines: () => void; onSourceEngineRemove: (sourceEngineNameToRemove: string) => { sourceEngineNameToRemove: string }; - onSourceEnginesAdd: ( - sourceEnginesToAdd: EngineDetails[] - ) => { sourceEnginesToAdd: EngineDetails[] }; - onSourceEnginesFetch: ( - sourceEngines: SourceEnginesLogicValues['sourceEngines'] - ) => { sourceEngines: SourceEnginesLogicValues['sourceEngines'] }; + onSourceEnginesAdd: (sourceEnginesToAdd: EngineDetails[]) => { + sourceEnginesToAdd: EngineDetails[]; + }; + onSourceEnginesFetch: (sourceEngines: SourceEnginesLogicValues['sourceEngines']) => { + sourceEngines: SourceEnginesLogicValues['sourceEngines']; + }; removeSourceEngine: (sourceEngineName: string) => { sourceEngineName: string }; setIndexedEngines: (indexedEngines: EngineDetails[]) => { indexedEngines: EngineDetails[] }; openModal: () => void; closeModal: () => void; - onAddEnginesSelection: ( - selectedEngineNamesToAdd: string[] - ) => { selectedEngineNamesToAdd: string[] }; + onAddEnginesSelection: (selectedEngineNamesToAdd: string[]) => { + selectedEngineNamesToAdd: string[]; + }; } export const SourceEnginesLogic = kea< diff --git a/x-pack/plugins/enterprise_search/public/applications/app_search/components/synonyms/components/synonym_modal.tsx b/x-pack/plugins/enterprise_search/public/applications/app_search/components/synonyms/components/synonym_modal.tsx index 64832c193854f..3db4f4b732675 100644 --- a/x-pack/plugins/enterprise_search/public/applications/app_search/components/synonyms/components/synonym_modal.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/app_search/components/synonyms/components/synonym_modal.tsx @@ -35,9 +35,8 @@ import { SynonymsLogic } from '../index'; export const SynonymModal: React.FC = () => { const { isModalOpen, modalLoading, activeSynonymSet } = useValues(SynonymsLogic); - const { closeModal, createSynonymSet, updateSynonymSet, deleteSynonymSet } = useActions( - SynonymsLogic - ); + const { closeModal, createSynonymSet, updateSynonymSet, deleteSynonymSet } = + useActions(SynonymsLogic); const modalTitle = activeSynonymSet ? SYNONYM_UPDATE_TITLE : SYNONYM_CREATE_TITLE; const id = activeSynonymSet?.id || 'createNewSynonymSet'; diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/flash_messages/handle_api_errors.ts b/x-pack/plugins/enterprise_search/public/applications/shared/flash_messages/handle_api_errors.ts index 7c82dfb971a1d..4fe8ad1cb851d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/flash_messages/handle_api_errors.ts +++ b/x-pack/plugins/enterprise_search/public/applications/shared/flash_messages/handle_api_errors.ts @@ -53,9 +53,9 @@ export const flashAPIErrors = ( response: HttpResponse, { isQueued }: Options = {} ) => { - const errorFlashMessages: IFlashMessage[] = getErrorsFromHttpResponse( - response - ).map((message) => ({ type: 'error', message })); + const errorFlashMessages: IFlashMessage[] = getErrorsFromHttpResponse(response).map( + (message) => ({ type: 'error', message }) + ); if (isQueued) { FlashMessagesLogic.actions.setQueuedMessages(errorFlashMessages); diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/role_mapping/types.ts b/x-pack/plugins/enterprise_search/public/applications/shared/role_mapping/types.ts index 2eba171c270f6..6b65cdad55d74 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/role_mapping/types.ts +++ b/x-pack/plugins/enterprise_search/public/applications/shared/role_mapping/types.ts @@ -33,9 +33,9 @@ export interface RoleMappingsBaseActions { initializeSingleUserRoleMapping(roleMappingId?: string): { roleMappingId?: string }; initializeRoleMappings(): void; resetState(): void; - setElasticsearchUser( - elasticsearchUser?: ElasticsearchUser - ): { elasticsearchUser: ElasticsearchUser }; + setElasticsearchUser(elasticsearchUser?: ElasticsearchUser): { + elasticsearchUser: ElasticsearchUser; + }; openRoleMappingFlyout(): void; openSingleUserRoleMappingFlyout(): void; closeUsersAndRolesFlyout(): void; diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/role_mapping/user_selector.test.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/role_mapping/user_selector.test.tsx index 0aea55a51040c..bc700268d46fc 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/role_mapping/user_selector.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/role_mapping/user_selector.test.tsx @@ -30,7 +30,7 @@ describe('UserSelector', () => { const handleRoleChange = jest.fn(); const handleUsernameSelectChange = jest.fn(); - const roleType = ('user' as unknown) as ASRole; + const roleType = 'user' as unknown as ASRole; const props = { isNewUser: true, diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/role_mapping/users_table.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/role_mapping/users_table.tsx index 3dc5560a9eaba..3d29c0b7f9a71 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/role_mapping/users_table.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/role_mapping/users_table.tsx @@ -66,7 +66,7 @@ export const UsersTable: React.FC = ({ handleDeleteMapping, }) => { // 'accessItems' is needed because App Search has `engines` and Workplace Search has `groups`. - const users = ((singleUserRoleMappings as SharedUser[]).map((user) => ({ + const users = (singleUserRoleMappings as SharedUser[]).map((user) => ({ username: user.elasticsearchUser.username, email: user.elasticsearchUser.email, enabled: user.elasticsearchUser.enabled, @@ -74,7 +74,7 @@ export const UsersTable: React.FC = ({ id: user.roleMapping.id, accessItems: (user.roleMapping as SharedRoleMapping)[accessItemKey], invitation: user.invitation, - })) as unknown) as Users; + })) as unknown as Users; const [items, setItems] = useState([] as Users); diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/table_pagination/index.ts b/x-pack/plugins/enterprise_search/public/applications/shared/table_pagination/index.ts index fb94a88fd0ce7..ce6bb29c96019 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/table_pagination/index.ts +++ b/x-pack/plugins/enterprise_search/public/applications/shared/table_pagination/index.ts @@ -22,11 +22,11 @@ export const convertMetaToPagination = (meta: Meta) => ({ interface EuiBasicTableOnChange { page: { index: number }; } -export const handlePageChange = (paginationCallback: Function) => ({ - page: { index }, -}: EuiBasicTableOnChange) => { - paginationCallback(index + 1); -}; +export const handlePageChange = + (paginationCallback: Function) => + ({ page: { index } }: EuiBasicTableOnChange) => { + paginationCallback(index + 1); + }; /** * Helper for updating Kea `meta` state without mutating nested objs diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/tables/inline_editable_table/action_column.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/tables/inline_editable_table/action_column.tsx index 1ba84a2fa43af..ec52b18adf648 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/tables/inline_editable_table/action_column.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/tables/inline_editable_table/action_column.tsx @@ -41,12 +41,10 @@ export const ActionColumn = ({ lastItemWarning, uneditableItems, }: ActionColumnProps) => { - const { doesEditingItemValueContainEmptyProperty, formErrors, isEditingUnsavedItem } = useValues( - InlineEditableTableLogic - ); - const { editExistingItem, deleteItem, doneEditing, saveExistingItem, saveNewItem } = useActions( - InlineEditableTableLogic - ); + const { doesEditingItemValueContainEmptyProperty, formErrors, isEditingUnsavedItem } = + useValues(InlineEditableTableLogic); + const { editExistingItem, deleteItem, doneEditing, saveExistingItem, saveNewItem } = + useActions(InlineEditableTableLogic); if (uneditableItems?.includes(item)) { return null; diff --git a/x-pack/plugins/enterprise_search/public/applications/test_helpers/shallow_with_i18n.tsx b/x-pack/plugins/enterprise_search/public/applications/test_helpers/shallow_with_i18n.tsx index 0127804374163..7eb10c710a34a 100644 --- a/x-pack/plugins/enterprise_search/public/applications/test_helpers/shallow_with_i18n.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/test_helpers/shallow_with_i18n.tsx @@ -12,11 +12,13 @@ import { shallow, mount, ReactWrapper } from 'enzyme'; import { I18nProvider, __IntlProvider } from '@kbn/i18n/react'; // Use fake component to extract `intl` property to use in tests. -const { intl } = (mount( - -
-
-).find('IntlProvider') as ReactWrapper<{}, {}, __IntlProvider>) +const { intl } = ( + mount( + +
+
+ ).find('IntlProvider') as ReactWrapper<{}, {}, __IntlProvider> +) .instance() .getChildContext(); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/utils/read_uploaded_file_as_base64.test.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/utils/read_uploaded_file_as_base64.test.ts index 9f612a7432ec5..2aedbbb798f58 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/utils/read_uploaded_file_as_base64.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/utils/read_uploaded_file_as_base64.test.ts @@ -15,7 +15,7 @@ describe('readUploadedFileAsBase64', () => { }); it('throws an error if the file cannot be read', async () => { - const badFile = ('causes an error' as unknown) as File; + const badFile = 'causes an error' as unknown as File; await expect(readUploadedFileAsBase64(badFile)).rejects.toThrow(); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/account_settings/account_settings.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/account_settings/account_settings.tsx index 2e92a00e3aa12..fb5a3e34a9db7 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/account_settings/account_settings.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/account_settings/account_settings.tsx @@ -24,9 +24,10 @@ export const AccountSettings: React.FC = () => { }, [security.authc]); const PersonalInfo = useMemo(() => security.uiApi.components.getPersonalInfo, [security.uiApi]); - const ChangePassword = useMemo(() => security.uiApi.components.getChangePassword, [ - security.uiApi, - ]); + const ChangePassword = useMemo( + () => security.uiApi.components.getChangePassword, + [security.uiApi] + ); if (!currentUser) { return null; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source_list.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source_list.tsx index 32161046bdd51..08e002ee432a9 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source_list.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source_list.tsx @@ -46,9 +46,8 @@ import { } from './constants'; export const AddSourceList: React.FC = () => { - const { contentSources, dataLoading, availableSources, configuredSources } = useValues( - SourcesLogic - ); + const { contentSources, dataLoading, availableSources, configuredSources } = + useValues(SourcesLogic); const { initializeSources, resetSourcesState } = useActions(SourcesLogic); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source_logic.test.ts index 93cbbef07f7d7..5ff3964b8f83a 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source_logic.test.ts @@ -569,9 +569,7 @@ describe('AddSourceLogic', () => { expect(clearFlashMessages).toHaveBeenCalled(); expect(AddSourceLogic.values.buttonLoading).toEqual(true); - expect( - http.put - ).toHaveBeenCalledWith( + expect(http.put).toHaveBeenCalledWith( `/internal/workplace_search/org/settings/connectors/${sourceConfigData.serviceType}`, { body: JSON.stringify(params) } ); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source_logic.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source_logic.ts index 300b2aa6a10ac..6f09cbb15c7db 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/add_source_logic.ts @@ -62,11 +62,7 @@ export interface OauthParams { export interface AddSourceActions { initializeAddSource: (addSourceProps: AddSourceProps) => { addSourceProps: AddSourceProps }; - setAddSourceProps: ({ - addSourceProps, - }: { - addSourceProps: AddSourceProps; - }) => { + setAddSourceProps: ({ addSourceProps }: { addSourceProps: AddSourceProps }) => { addSourceProps: AddSourceProps; }; setAddSourceStep(addSourceCurrentStep: AddSourceSteps): AddSourceSteps; @@ -532,13 +528,8 @@ export const AddSourceLogic = kea = ({ name, onFormCreated, header }) => { const [formLoading, setFormLoading] = useState(false); - const { - getPreContentSourceConfigData, - setSelectedGithubOrganizations, - createContentSource, - } = useActions(AddSourceLogic); + const { getPreContentSourceConfigData, setSelectedGithubOrganizations, createContentSource } = + useActions(AddSourceLogic); const { currentServiceType, githubOrganizations, diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/connect_instance.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/connect_instance.tsx index 8a632dfe12959..5428e63a101b4 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/connect_instance.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/connect_instance.tsx @@ -82,9 +82,8 @@ export const ConnectInstance: React.FC = ({ setSourceIndexPermissionsValue, } = useActions(AddSourceLogic); - const { loginValue, passwordValue, indexPermissionsValue, subdomainValue } = useValues( - AddSourceLogic - ); + const { loginValue, passwordValue, indexPermissionsValue, subdomainValue } = + useValues(AddSourceLogic); const { isOrganization } = useValues(AppLogic); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/reauthenticate.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/reauthenticate.tsx index fa604ef758a44..f6c34a3eec4ca 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/reauthenticate.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/reauthenticate.tsx @@ -30,7 +30,7 @@ interface ReauthenticateProps { export const Reauthenticate: React.FC = ({ name, header }) => { const { search } = useLocation() as Location; - const { sourceId } = (parseQueryParams(search) as unknown) as SourceQueryParams; + const { sourceId } = parseQueryParams(search) as unknown as SourceQueryParams; const [formLoading, setFormLoading] = useState(false); const { getSourceReConnectData } = useActions(AddSourceLogic); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/save_config.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/save_config.tsx index 053a3b6b0e6bb..3320f43ed771a 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/save_config.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/add_source/save_config.tsx @@ -67,13 +67,8 @@ export const SaveConfig: React.FC = ({ const { setClientIdValue, setClientSecretValue, setBaseUrlValue } = useActions(AddSourceLogic); - const { - sourceConfigData, - buttonLoading, - clientIdValue, - clientSecretValue, - baseUrlValue, - } = useValues(AddSourceLogic); + const { sourceConfigData, buttonLoading, clientIdValue, clientSecretValue, baseUrlValue } = + useValues(AddSourceLogic); const { accountContextOnly, diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/display_settings/display_settings.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/display_settings/display_settings.tsx index ae47e20026b68..c5836dc939f2a 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/display_settings/display_settings.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/display_settings/display_settings.tsx @@ -44,9 +44,8 @@ interface DisplaySettingsProps { } export const DisplaySettings: React.FC = ({ tabId }) => { - const { initializeDisplaySettings, setServerData, handleSelectedTabChanged } = useActions( - DisplaySettingsLogic - ); + const { initializeDisplaySettings, setServerData, handleSelectedTabChanged } = + useActions(DisplaySettingsLogic); const { dataLoading, diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/display_settings/field_editor_modal.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/display_settings/field_editor_modal.tsx index 132adedb829ac..794b54eb59f36 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/display_settings/field_editor_modal.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/display_settings/field_editor_modal.tsx @@ -36,9 +36,8 @@ import { DisplaySettingsLogic } from './display_settings_logic'; const emptyField = { fieldName: '', label: '' }; export const FieldEditorModal: React.FC = () => { - const { toggleFieldEditorModal, addDetailField, updateDetailField } = useActions( - DisplaySettingsLogic - ); + const { toggleFieldEditorModal, addDetailField, updateDetailField } = + useActions(DisplaySettingsLogic); const { searchResultConfig: { detailFields }, diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/display_settings/result_detail.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/display_settings/result_detail.tsx index 6832f075476e7..df80a454cc6f7 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/display_settings/result_detail.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/display_settings/result_detail.tsx @@ -34,12 +34,8 @@ import { DisplaySettingsLogic } from './display_settings_logic'; import { ExampleResultDetailCard } from './example_result_detail_card'; export const ResultDetail: React.FC = () => { - const { - toggleFieldEditorModal, - setDetailFields, - openEditDetailField, - removeDetailField, - } = useActions(DisplaySettingsLogic); + const { toggleFieldEditorModal, setDetailFields, openEditDetailField, removeDetailField } = + useActions(DisplaySettingsLogic); const { searchResultConfig: { detailFields }, diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/schema/schema_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/schema/schema_logic.test.ts index 549ffe0546d7c..af9d85237335c 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/schema/schema_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/schema/schema_logic.test.ts @@ -40,12 +40,8 @@ import { SchemaLogic, dataTypeOptions } from './schema_logic'; describe('SchemaLogic', () => { const { http } = mockHttpValues; - const { - clearFlashMessages, - flashAPIErrors, - flashSuccessToast, - setErrorMessage, - } = mockFlashMessageHelpers; + const { clearFlashMessages, flashAPIErrors, flashSuccessToast, setErrorMessage } = + mockFlashMessageHelpers; const { mount } = new LogicMounter(SchemaLogic); const defaultValues = { diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/schema/schema_logic.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/schema/schema_logic.ts index 173f5df162caa..d664197afaa26 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/schema/schema_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/schema/schema_logic.ts @@ -44,13 +44,10 @@ interface SchemaActions { onSchemaSetSuccess(schemaProps: SchemaResponseProps): SchemaResponseProps; onSchemaSetFormErrors(errors: string[]): string[]; updateNewFieldType(newFieldType: SchemaType): SchemaType; - onFieldUpdate({ - schema, - formUnchanged, - }: { + onFieldUpdate({ schema, formUnchanged }: { schema: Schema; formUnchanged: boolean }): { schema: Schema; formUnchanged: boolean; - }): { schema: Schema; formUnchanged: boolean }; + }; onIndexingComplete(numDocumentsWithErrors: number): number; resetMostRecentIndexJob(emptyReindexJob: IndexJob): IndexJob; setFieldName(rawFieldName: string): string; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/source_added.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/source_added.tsx index 77b3931050483..c4f97eb718452 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/source_added.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/source_added.tsx @@ -26,7 +26,7 @@ import { AddSourceLogic, OauthParams } from './add_source/add_source_logic'; */ export const SourceAdded: React.FC = () => { const { search } = useLocation() as Location; - const params = (parseQueryParams(search) as unknown) as OauthParams; + const params = parseQueryParams(search) as unknown as OauthParams; const state = JSON.parse(params.state); const isOrganization = state.context !== 'account'; const { setChromeIsVisible } = useValues(KibanaLogic); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/source_content.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/source_content.tsx index 78d4d36cf0995..fdeb325730470 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/source_content.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/components/source_content.tsx @@ -59,9 +59,8 @@ const MAX_LENGTH = 28; export const SourceContent: React.FC = () => { const [searchTerm, setSearchTerm] = useState(''); - const { setActivePage, searchContentSourceDocuments, setContentFilterValue } = useActions( - SourceLogic - ); + const { setActivePage, searchContentSourceDocuments, setContentFilterValue } = + useActions(SourceLogic); const { contentSource: { id, serviceType, urlField, titleField, urlFieldIsLinkable, isFederatedSource }, diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/private_sources.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/private_sources.tsx index 83e690fdb2a95..c9f55ff656561 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/private_sources.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/private_sources.tsx @@ -46,9 +46,8 @@ export const PrivateSources: React.FC = () => { return resetSourcesState; }, []); - const { dataLoading, contentSources, serviceTypes, privateContentSources } = useValues( - SourcesLogic - ); + const { dataLoading, contentSources, serviceTypes, privateContentSources } = + useValues(SourcesLogic); const { account: { canCreatePrivateSources, groups }, diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/source_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/source_logic.test.ts index 3c926e13fe52f..0d8d5684c4a4c 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/source_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/content_sources/source_logic.test.ts @@ -26,12 +26,8 @@ import { SourceLogic } from './source_logic'; describe('SourceLogic', () => { const { http } = mockHttpValues; - const { - clearFlashMessages, - flashAPIErrors, - flashSuccessToast, - setErrorMessage, - } = mockFlashMessageHelpers; + const { clearFlashMessages, flashAPIErrors, flashSuccessToast, setErrorMessage } = + mockFlashMessageHelpers; const { navigateToUrl } = mockKibanaValues; const { mount, getListeners } = new LogicMounter(SourceLogic); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_source_prioritization.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_source_prioritization.tsx index 76549ba1e96dc..615e7b22b343f 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_source_prioritization.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/components/group_source_prioritization.tsx @@ -71,9 +71,8 @@ const PRIORITY_TABLE_HEADER = i18n.translate( ); export const GroupSourcePrioritization: React.FC = () => { - const { updatePriority, saveGroupSourcePrioritization, showOrgSourcesModal } = useActions( - GroupLogic - ); + const { updatePriority, saveGroupSourcePrioritization, showOrgSourcesModal } = + useActions(GroupLogic); const { group: { contentSources = [], name: groupName }, diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/group_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/group_logic.test.ts index 79b253dd64301..6f811ce364290 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/group_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/groups/group_logic.test.ts @@ -24,12 +24,8 @@ describe('GroupLogic', () => { const { mount } = new LogicMounter(GroupLogic); const { http } = mockHttpValues; const { navigateToUrl } = mockKibanaValues; - const { - clearFlashMessages, - flashAPIErrors, - flashSuccessToast, - setQueuedErrorMessage, - } = mockFlashMessageHelpers; + const { clearFlashMessages, flashAPIErrors, flashSuccessToast, setQueuedErrorMessage } = + mockFlashMessageHelpers; const group = groups[0]; const sourceIds = ['123', '124']; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/oauth_authorize/oauth_authorize.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/oauth_authorize/oauth_authorize.tsx index 972f1951d47b8..5c3114ae3199e 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/oauth_authorize/oauth_authorize.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/oauth_authorize/oauth_authorize.tsx @@ -48,9 +48,8 @@ import { OAuthAuthorizeLogic } from './oauth_authorize_logic'; export const OAuthAuthorize: React.FC = () => { const { search } = useLocation() as Location; - const { initializeOAuthPreAuth, allowOAuthAuthorization, denyOAuthAuthorization } = useActions( - OAuthAuthorizeLogic - ); + const { initializeOAuthPreAuth, allowOAuthAuthorization, denyOAuthAuthorization } = + useActions(OAuthAuthorizeLogic); const { buttonLoading, dataLoading, cachedPreAuth, hasError } = useValues(OAuthAuthorizeLogic); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/overview/organization_stats.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/overview/organization_stats.tsx index 676ae99b02d18..00ad69fbdf372 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/overview/organization_stats.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/overview/organization_stats.tsx @@ -20,9 +20,8 @@ import { OverviewLogic } from './overview_logic'; import { StatisticCard } from './statistic_card'; export const OrganizationStats: React.FC = () => { - const { sourcesCount, pendingInvitationsCount, accountsCount, privateSourcesCount } = useValues( - OverviewLogic - ); + const { sourcesCount, pendingInvitationsCount, accountsCount, privateSourcesCount } = + useValues(OverviewLogic); return ( { it('handles group checkbox click', async () => { const wrapper = shallow(); await waitFor(() => - ((wrapper.find(EuiComboBox).props() as unknown) as { - onChange: (a: EuiComboBoxOptionOption[]) => void; - }).onChange([{ label: groups[0].name, value: groups[0].name }]) + ( + wrapper.find(EuiComboBox).props() as unknown as { + onChange: (a: EuiComboBoxOptionOption[]) => void; + } + ).onChange([{ label: groups[0].name, value: groups[0].name }]) ); wrapper.update(); diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/role_mappings/group_assignment_selector.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/role_mappings/group_assignment_selector.tsx index b53b092eced2d..5d8ef7ababc8c 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/role_mappings/group_assignment_selector.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/role_mappings/group_assignment_selector.tsx @@ -25,13 +25,11 @@ import { import { RoleMappingsLogic } from './role_mappings_logic'; export const GroupAssignmentSelector: React.FC = () => { - const { handleAllGroupsSelectionChange, handleGroupSelectionChange } = useActions( - RoleMappingsLogic - ); + const { handleAllGroupsSelectionChange, handleGroupSelectionChange } = + useActions(RoleMappingsLogic); - const { includeInAllGroups, availableGroups, selectedGroups, selectedOptions } = useValues( - RoleMappingsLogic - ); + const { includeInAllGroups, availableGroups, selectedGroups, selectedOptions } = + useValues(RoleMappingsLogic); const hasGroupAssignment = selectedGroups.size > 0 || includeInAllGroups; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/role_mappings/role_mappings_logic.ts b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/role_mappings/role_mappings_logic.ts index 55f82a07bf405..29103aa0c39af 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/role_mappings/role_mappings_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/role_mappings/role_mappings_logic.ts @@ -47,11 +47,9 @@ interface RoleMappingsActions extends RoleMappingsBaseActions { setDefaultGroup(availableGroups: RoleGroup[]): { availableGroups: RoleGroup[] }; setRoleMapping(roleMapping: WSRoleMapping): { roleMapping: WSRoleMapping }; setSingleUserRoleMapping(data?: UserMapping): { singleUserRoleMapping: UserMapping }; - setRoleMappings({ - roleMappings, - }: { + setRoleMappings({ roleMappings }: { roleMappings: WSRoleMapping[] }): { roleMappings: WSRoleMapping[]; - }): { roleMappings: WSRoleMapping[] }; + }; setRoleMappingsData(data: RoleMappingsServerDetails): RoleMappingsServerDetails; handleAllGroupsSelectionChange(selected: boolean): { selected: boolean }; handleGroupSelectionChange(groupIds: string[]): { groupIds: string[] }; diff --git a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/role_mappings/user.tsx b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/role_mappings/user.tsx index 6447f43e6ed4d..33785b4a4ce0e 100644 --- a/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/role_mappings/user.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/workplace_search/views/role_mappings/user.tsx @@ -24,7 +24,7 @@ import { Role } from '../../types'; import { GroupAssignmentSelector } from './group_assignment_selector'; import { RoleMappingsLogic } from './role_mappings_logic'; -const roleTypes = (['admin', 'user'] as unknown) as Role[]; +const roleTypes = ['admin', 'user'] as unknown as Role[]; export const User: React.FC = () => { const { diff --git a/x-pack/plugins/enterprise_search/server/lib/enterprise_search_config_api.test.ts b/x-pack/plugins/enterprise_search/server/lib/enterprise_search_config_api.test.ts index b5a8e205e5e1c..3f2a038d8bff3 100644 --- a/x-pack/plugins/enterprise_search/server/lib/enterprise_search_config_api.test.ts +++ b/x-pack/plugins/enterprise_search/server/lib/enterprise_search_config_api.test.ts @@ -114,7 +114,7 @@ describe('callEnterpriseSearchConfigAPI', () => { }); it('calls the config API endpoint', async () => { - ((fetch as unknown) as jest.Mock).mockImplementationOnce((url: string) => { + (fetch as unknown as jest.Mock).mockImplementationOnce((url: string) => { expect(url).toEqual('http://localhost:3002/api/ent/v2/internal/client_config'); return Promise.resolve(new Response(JSON.stringify(mockResponse))); }); @@ -130,7 +130,7 @@ describe('callEnterpriseSearchConfigAPI', () => { }); it('falls back without error when data is unavailable', async () => { - ((fetch as unknown) as jest.Mock).mockReturnValueOnce(Promise.resolve(new Response('{}'))); + (fetch as unknown as jest.Mock).mockReturnValueOnce(Promise.resolve(new Response('{}'))); expect(await callEnterpriseSearchConfigAPI(mockDependencies)).toEqual({ access: { @@ -198,13 +198,13 @@ describe('callEnterpriseSearchConfigAPI', () => { }); it('handles server errors', async () => { - ((fetch as unknown) as jest.Mock).mockReturnValueOnce(Promise.reject('500')); + (fetch as unknown as jest.Mock).mockReturnValueOnce(Promise.reject('500')); expect(await callEnterpriseSearchConfigAPI(mockDependencies)).toEqual({}); expect(mockDependencies.log.error).toHaveBeenCalledWith( 'Could not perform access check to Enterprise Search: 500' ); - ((fetch as unknown) as jest.Mock).mockReturnValueOnce(Promise.resolve('Bad Data')); + (fetch as unknown as jest.Mock).mockReturnValueOnce(Promise.resolve('Bad Data')); expect(await callEnterpriseSearchConfigAPI(mockDependencies)).toEqual({}); expect(mockDependencies.log.error).toHaveBeenCalledWith( 'Could not perform access check to Enterprise Search: TypeError: response.json is not a function' @@ -222,7 +222,7 @@ describe('callEnterpriseSearchConfigAPI', () => { ); // Timeout - ((fetch as unknown) as jest.Mock).mockImplementationOnce(async () => { + (fetch as unknown as jest.Mock).mockImplementationOnce(async () => { jest.advanceTimersByTime(250); return Promise.reject({ name: 'AbortError' }); }); diff --git a/x-pack/plugins/enterprise_search/server/lib/enterprise_search_config_api.ts b/x-pack/plugins/enterprise_search/server/lib/enterprise_search_config_api.ts index ba3a2e6a6480e..146b06e4d9a4c 100644 --- a/x-pack/plugins/enterprise_search/server/lib/enterprise_search_config_api.ts +++ b/x-pack/plugins/enterprise_search/server/lib/enterprise_search_config_api.ts @@ -124,10 +124,10 @@ export const callEnterpriseSearchConfigAPI = async ({ id: data?.current_user?.workplace_search?.account?.id, groups: data?.current_user?.workplace_search?.account?.groups || [], isAdmin: !!data?.current_user?.workplace_search?.account?.is_admin, - canCreatePrivateSources: !!data?.current_user?.workplace_search?.account - ?.can_create_private_sources, - viewedOnboardingPage: !!data?.current_user?.workplace_search?.account - ?.viewed_onboarding_page, + canCreatePrivateSources: + !!data?.current_user?.workplace_search?.account?.can_create_private_sources, + viewedOnboardingPage: + !!data?.current_user?.workplace_search?.account?.viewed_onboarding_page, }, }, }; diff --git a/x-pack/plugins/enterprise_search/server/routes/app_search/crawler_crawl_rules.test.ts b/x-pack/plugins/enterprise_search/server/routes/app_search/crawler_crawl_rules.test.ts index db554d1cec93f..018ab433536b2 100644 --- a/x-pack/plugins/enterprise_search/server/routes/app_search/crawler_crawl_rules.test.ts +++ b/x-pack/plugins/enterprise_search/server/routes/app_search/crawler_crawl_rules.test.ts @@ -60,8 +60,7 @@ describe('crawler crawl rules routes', () => { jest.clearAllMocks(); mockRouter = new MockRouter({ method: 'put', - path: - '/internal/app_search/engines/{engineName}/crawler/domains/{domainId}/crawl_rules/{crawlRuleId}', + path: '/internal/app_search/engines/{engineName}/crawler/domains/{domainId}/crawl_rules/{crawlRuleId}', }); registerCrawlerCrawlRulesRoutes({ @@ -105,8 +104,7 @@ describe('crawler crawl rules routes', () => { jest.clearAllMocks(); mockRouter = new MockRouter({ method: 'delete', - path: - '/internal/app_search/engines/{engineName}/crawler/domains/{domainId}/crawl_rules/{crawlRuleId}', + path: '/internal/app_search/engines/{engineName}/crawler/domains/{domainId}/crawl_rules/{crawlRuleId}', }); registerCrawlerCrawlRulesRoutes({ diff --git a/x-pack/plugins/enterprise_search/server/routes/app_search/crawler_crawl_rules.ts b/x-pack/plugins/enterprise_search/server/routes/app_search/crawler_crawl_rules.ts index a360129b07523..7c82c73db7263 100644 --- a/x-pack/plugins/enterprise_search/server/routes/app_search/crawler_crawl_rules.ts +++ b/x-pack/plugins/enterprise_search/server/routes/app_search/crawler_crawl_rules.ts @@ -38,8 +38,7 @@ export function registerCrawlerCrawlRulesRoutes({ router.put( { - path: - '/internal/app_search/engines/{engineName}/crawler/domains/{domainId}/crawl_rules/{crawlRuleId}', + path: '/internal/app_search/engines/{engineName}/crawler/domains/{domainId}/crawl_rules/{crawlRuleId}', validate: { params: schema.object({ engineName: schema.string(), @@ -64,8 +63,7 @@ export function registerCrawlerCrawlRulesRoutes({ router.delete( { - path: - '/internal/app_search/engines/{engineName}/crawler/domains/{domainId}/crawl_rules/{crawlRuleId}', + path: '/internal/app_search/engines/{engineName}/crawler/domains/{domainId}/crawl_rules/{crawlRuleId}', validate: { params: schema.object({ engineName: schema.string(), diff --git a/x-pack/plugins/enterprise_search/server/routes/app_search/crawler_entry_points.test.ts b/x-pack/plugins/enterprise_search/server/routes/app_search/crawler_entry_points.test.ts index d59a8e32045ec..6fb7e99400877 100644 --- a/x-pack/plugins/enterprise_search/server/routes/app_search/crawler_entry_points.test.ts +++ b/x-pack/plugins/enterprise_search/server/routes/app_search/crawler_entry_points.test.ts @@ -58,8 +58,7 @@ describe('crawler entry point routes', () => { jest.clearAllMocks(); mockRouter = new MockRouter({ method: 'put', - path: - '/internal/app_search/engines/{engineName}/crawler/domains/{domainId}/entry_points/{entryPointId}', + path: '/internal/app_search/engines/{engineName}/crawler/domains/{domainId}/entry_points/{entryPointId}', }); registerCrawlerEntryPointRoutes({ @@ -100,8 +99,7 @@ describe('crawler entry point routes', () => { jest.clearAllMocks(); mockRouter = new MockRouter({ method: 'delete', - path: - '/internal/app_search/engines/{engineName}/crawler/domains/{domainId}/entry_points/{entryPointId}', + path: '/internal/app_search/engines/{engineName}/crawler/domains/{domainId}/entry_points/{entryPointId}', }); registerCrawlerEntryPointRoutes({ diff --git a/x-pack/plugins/enterprise_search/server/routes/app_search/crawler_entry_points.ts b/x-pack/plugins/enterprise_search/server/routes/app_search/crawler_entry_points.ts index 224a79bbf6cb8..a6d6fdb24b41f 100644 --- a/x-pack/plugins/enterprise_search/server/routes/app_search/crawler_entry_points.ts +++ b/x-pack/plugins/enterprise_search/server/routes/app_search/crawler_entry_points.ts @@ -36,8 +36,7 @@ export function registerCrawlerEntryPointRoutes({ router.put( { - path: - '/internal/app_search/engines/{engineName}/crawler/domains/{domainId}/entry_points/{entryPointId}', + path: '/internal/app_search/engines/{engineName}/crawler/domains/{domainId}/entry_points/{entryPointId}', validate: { params: schema.object({ engineName: schema.string(), @@ -59,8 +58,7 @@ export function registerCrawlerEntryPointRoutes({ router.delete( { - path: - '/internal/app_search/engines/{engineName}/crawler/domains/{domainId}/entry_points/{entryPointId}', + path: '/internal/app_search/engines/{engineName}/crawler/domains/{domainId}/entry_points/{entryPointId}', validate: { params: schema.object({ engineName: schema.string(), diff --git a/x-pack/plugins/enterprise_search/server/routes/app_search/crawler_sitemaps.test.ts b/x-pack/plugins/enterprise_search/server/routes/app_search/crawler_sitemaps.test.ts index 88fef87e60470..a37a8311093c7 100644 --- a/x-pack/plugins/enterprise_search/server/routes/app_search/crawler_sitemaps.test.ts +++ b/x-pack/plugins/enterprise_search/server/routes/app_search/crawler_sitemaps.test.ts @@ -58,8 +58,7 @@ describe('crawler sitemap routes', () => { jest.clearAllMocks(); mockRouter = new MockRouter({ method: 'put', - path: - '/internal/app_search/engines/{engineName}/crawler/domains/{domainId}/sitemaps/{sitemapId}', + path: '/internal/app_search/engines/{engineName}/crawler/domains/{domainId}/sitemaps/{sitemapId}', }); registerCrawlerSitemapRoutes({ @@ -100,8 +99,7 @@ describe('crawler sitemap routes', () => { jest.clearAllMocks(); mockRouter = new MockRouter({ method: 'delete', - path: - '/internal/app_search/engines/{engineName}/crawler/domains/{domainId}/sitemaps/{sitemapId}', + path: '/internal/app_search/engines/{engineName}/crawler/domains/{domainId}/sitemaps/{sitemapId}', }); registerCrawlerSitemapRoutes({ diff --git a/x-pack/plugins/enterprise_search/server/routes/app_search/crawler_sitemaps.ts b/x-pack/plugins/enterprise_search/server/routes/app_search/crawler_sitemaps.ts index c3ae90349b95a..b63473888eecc 100644 --- a/x-pack/plugins/enterprise_search/server/routes/app_search/crawler_sitemaps.ts +++ b/x-pack/plugins/enterprise_search/server/routes/app_search/crawler_sitemaps.ts @@ -36,8 +36,7 @@ export function registerCrawlerSitemapRoutes({ router.put( { - path: - '/internal/app_search/engines/{engineName}/crawler/domains/{domainId}/sitemaps/{sitemapId}', + path: '/internal/app_search/engines/{engineName}/crawler/domains/{domainId}/sitemaps/{sitemapId}', validate: { params: schema.object({ engineName: schema.string(), @@ -59,8 +58,7 @@ export function registerCrawlerSitemapRoutes({ router.delete( { - path: - '/internal/app_search/engines/{engineName}/crawler/domains/{domainId}/sitemaps/{sitemapId}', + path: '/internal/app_search/engines/{engineName}/crawler/domains/{domainId}/sitemaps/{sitemapId}', validate: { params: schema.object({ engineName: schema.string(), diff --git a/x-pack/plugins/event_log/server/es/init.ts b/x-pack/plugins/event_log/server/es/init.ts index bc1b36ab3e375..f15b9f89887c5 100644 --- a/x-pack/plugins/event_log/server/es/init.ts +++ b/x-pack/plugins/event_log/server/es/init.ts @@ -96,8 +96,9 @@ class EsInitializationSteps { } asyncForEach(Object.keys(indices), async (indexName: string) => { try { - const hidden: string | boolean | undefined = (indices[indexName] - ?.settings as IndicesIndexStatePrefixedSettings)?.index?.hidden; + const hidden: string | boolean | undefined = ( + indices[indexName]?.settings as IndicesIndexStatePrefixedSettings + )?.index?.hidden; // Check to see if this index template is hidden if (hidden !== true && hidden !== 'true') { diff --git a/x-pack/plugins/event_log/server/event_log_client.test.ts b/x-pack/plugins/event_log/server/event_log_client.test.ts index 6babfef9bd8a8..0acb53e93b81a 100644 --- a/x-pack/plugins/event_log/server/event_log_client.test.ts +++ b/x-pack/plugins/event_log/server/event_log_client.test.ts @@ -322,7 +322,7 @@ function fakeEvent(overrides = {}) { function FakeRequest(): KibanaRequest { const savedObjectGetter = jest.fn(); - return ({ + return { headers: {}, getBasePath: () => '', path: '/', @@ -336,5 +336,5 @@ function FakeRequest(): KibanaRequest { }, }, getSavedObjectsClient: () => savedObjectGetter, - } as unknown) as KibanaRequest; + } as unknown as KibanaRequest; } diff --git a/x-pack/plugins/event_log/server/event_log_start_service.test.ts b/x-pack/plugins/event_log/server/event_log_start_service.test.ts index 0815673d546b2..1534623100f5d 100644 --- a/x-pack/plugins/event_log/server/event_log_start_service.test.ts +++ b/x-pack/plugins/event_log/server/event_log_start_service.test.ts @@ -44,7 +44,7 @@ describe('EventLogClientService', () => { function fakeRequest(): KibanaRequest { const savedObjectsClient = savedObjectsClientMock.create(); - return ({ + return { headers: {}, getBasePath: () => '', path: '/', @@ -58,5 +58,5 @@ function fakeRequest(): KibanaRequest { }, }, getSavedObjectsClient: () => savedObjectsClient, - } as unknown) as KibanaRequest; + } as unknown as KibanaRequest; } diff --git a/x-pack/plugins/event_log/server/event_logger.test.ts b/x-pack/plugins/event_log/server/event_logger.test.ts index 9dcfa37ae76b1..d90fd93c60043 100644 --- a/x-pack/plugins/event_log/server/event_logger.test.ts +++ b/x-pack/plugins/event_log/server/event_logger.test.ts @@ -188,7 +188,7 @@ describe('EventLogger', () => { service.registerProviderActions('provider', ['action-a']); eventLogger = service.getLogger({}); - eventLogger.logEvent(({ event: { PROVIDER: 'provider' } } as unknown) as IEvent); + eventLogger.logEvent({ event: { PROVIDER: 'provider' } } as unknown as IEvent); let message = await waitForLogMessage(systemLogger); expect(message).toMatch(/invalid event logged.*provider.*undefined.*/); diff --git a/x-pack/plugins/event_log/server/routes/_mock_handler_arguments.ts b/x-pack/plugins/event_log/server/routes/_mock_handler_arguments.ts index 7563359e2dd16..3cd8e5eaae2ba 100644 --- a/x-pack/plugins/event_log/server/routes/_mock_handler_arguments.ts +++ b/x-pack/plugins/event_log/server/routes/_mock_handler_arguments.ts @@ -18,13 +18,13 @@ export function mockHandlerArguments( res?: Array> ): [RequestHandlerContext, KibanaRequest, KibanaResponseFactory] { return [ - ({ + { eventLog: { getEventLogClient() { return eventLogClient; }, }, - } as unknown) as RequestHandlerContext, + } as unknown as RequestHandlerContext, req as KibanaRequest, mockResponseFactory(res), ]; @@ -39,7 +39,7 @@ export const mockResponseFactory = (resToMock: Array { - return ({ + return { registerProvider: jest.fn(), registerDefaultProvider: jest.fn(), getProvidersClient: jest.fn(), - } as unknown) as jest.Mocked; + } as unknown as jest.Mocked; }; export const savedObjectProviderRegistryMock = { diff --git a/x-pack/plugins/event_log/server/saved_object_provider_registry.test.ts b/x-pack/plugins/event_log/server/saved_object_provider_registry.test.ts index c9a7d4f855153..d3b4ec4648b9f 100644 --- a/x-pack/plugins/event_log/server/saved_object_provider_registry.test.ts +++ b/x-pack/plugins/event_log/server/saved_object_provider_registry.test.ts @@ -83,7 +83,7 @@ describe('SavedObjectProviderRegistry', () => { function fakeRequest(): KibanaRequest { const savedObjectsClient = savedObjectsClientMock.create(); - return ({ + return { headers: {}, getBasePath: () => '', path: '/', @@ -97,5 +97,5 @@ function fakeRequest(): KibanaRequest { }, }, getSavedObjectsClient: () => savedObjectsClient, - } as unknown) as KibanaRequest; + } as unknown as KibanaRequest; } diff --git a/x-pack/plugins/features/server/feature_privilege_iterator/sub_feature_privilege_iterator.ts b/x-pack/plugins/features/server/feature_privilege_iterator/sub_feature_privilege_iterator.ts index 4e43643338830..8dffd553bfe14 100644 --- a/x-pack/plugins/features/server/feature_privilege_iterator/sub_feature_privilege_iterator.ts +++ b/x-pack/plugins/features/server/feature_privilege_iterator/sub_feature_privilege_iterator.ts @@ -19,17 +19,18 @@ export type SubFeaturePrivilegeIterator = ( licenseHasAtLeast: (licenseType: LicenseType) => boolean | undefined ) => IterableIterator; -const subFeaturePrivilegeIterator: SubFeaturePrivilegeIterator = function* subFeaturePrivilegeIterator( - feature: KibanaFeature, - licenseHasAtLeast: (licenseType: LicenseType) => boolean | undefined -): IterableIterator { - for (const subFeature of feature.subFeatures) { - for (const group of subFeature.privilegeGroups) { - yield* group.privileges.filter( - (privilege) => !privilege.minimumLicense || licenseHasAtLeast(privilege.minimumLicense) - ); +const subFeaturePrivilegeIterator: SubFeaturePrivilegeIterator = + function* subFeaturePrivilegeIterator( + feature: KibanaFeature, + licenseHasAtLeast: (licenseType: LicenseType) => boolean | undefined + ): IterableIterator { + for (const subFeature of feature.subFeatures) { + for (const group of subFeature.privilegeGroups) { + yield* group.privileges.filter( + (privilege) => !privilege.minimumLicense || licenseHasAtLeast(privilege.minimumLicense) + ); + } } - } -}; + }; export { subFeaturePrivilegeIterator }; diff --git a/x-pack/plugins/features/server/feature_schema.ts b/x-pack/plugins/features/server/feature_schema.ts index 96d79982afcf1..2694620c62d3f 100644 --- a/x-pack/plugins/features/server/feature_schema.ts +++ b/x-pack/plugins/features/server/feature_schema.ts @@ -152,11 +152,10 @@ const kibanaIndependentSubFeaturePrivilegeSchema = schema.object({ ui: listOfCapabilitiesSchema, }); -const kibanaMutuallyExclusiveSubFeaturePrivilegeSchema = kibanaIndependentSubFeaturePrivilegeSchema.extends( - { +const kibanaMutuallyExclusiveSubFeaturePrivilegeSchema = + kibanaIndependentSubFeaturePrivilegeSchema.extends({ minimumLicense: schema.never(), - } -); + }); const kibanaSubFeatureSchema = schema.object({ name: schema.string(), diff --git a/x-pack/plugins/features/server/plugin.ts b/x-pack/plugins/features/server/plugin.ts index c1fbc4b8a5edb..b11c77b60e66d 100644 --- a/x-pack/plugins/features/server/plugin.ts +++ b/x-pack/plugins/features/server/plugin.ts @@ -85,8 +85,8 @@ export interface PluginStartContract { * Represents Features Plugin instance that will be managed by the Kibana plugin system. */ export class FeaturesPlugin - implements - Plugin, RecursiveReadonly> { + implements Plugin, RecursiveReadonly> +{ private readonly logger: Logger; private readonly featureRegistry: FeatureRegistry = new FeatureRegistry(); private isReportingEnabled: boolean = false; diff --git a/x-pack/plugins/file_upload/public/components/json_upload_and_parse.tsx b/x-pack/plugins/file_upload/public/components/json_upload_and_parse.tsx index 28e99e7ffb18b..1fd96544918c8 100644 --- a/x-pack/plugins/file_upload/public/components/json_upload_and_parse.tsx +++ b/x-pack/plugins/file_upload/public/components/json_upload_and_parse.tsx @@ -100,9 +100,9 @@ export class JsonUploadAndParse extends Component { + > +{ public setup() {} public start(core: CoreStart, plugins: FileUploadStartDependencies): FileUploadStartApi { diff --git a/x-pack/plugins/file_upload/server/capabilities.test.ts b/x-pack/plugins/file_upload/server/capabilities.test.ts index 2fc666c837961..53f9da26060af 100644 --- a/x-pack/plugins/file_upload/server/capabilities.test.ts +++ b/x-pack/plugins/file_upload/server/capabilities.test.ts @@ -61,7 +61,7 @@ describe('setupCapabilities', () => { const security = securityMock.createStart(); security.authz.mode.useRbacForRequest.mockReturnValue(true); coreSetup.getStartServices.mockResolvedValue([ - (undefined as unknown) as CoreStart, + undefined as unknown as CoreStart, { security }, undefined, ]); @@ -104,7 +104,7 @@ describe('setupCapabilities', () => { const mockCheckPrivileges = jest.fn().mockResolvedValue({ hasAllRequested: false }); security.authz.checkPrivilegesDynamicallyWithRequest.mockReturnValue(mockCheckPrivileges); coreSetup.getStartServices.mockResolvedValue([ - (undefined as unknown) as CoreStart, + undefined as unknown as CoreStart, { security }, undefined, ]); @@ -146,7 +146,7 @@ describe('setupCapabilities', () => { const mockCheckPrivileges = jest.fn().mockResolvedValue({ hasAllRequested: true }); security.authz.checkPrivilegesDynamicallyWithRequest.mockReturnValue(mockCheckPrivileges); coreSetup.getStartServices.mockResolvedValue([ - (undefined as unknown) as CoreStart, + undefined as unknown as CoreStart, { security }, undefined, ]); @@ -192,7 +192,7 @@ describe('setupCapabilities', () => { .mockRejectedValue(new Error('this should not have been called')); security.authz.checkPrivilegesDynamicallyWithRequest.mockReturnValue(mockCheckPrivileges); coreSetup.getStartServices.mockResolvedValue([ - (undefined as unknown) as CoreStart, + undefined as unknown as CoreStart, { security }, undefined, ]); @@ -229,7 +229,7 @@ describe('setupCapabilities', () => { const security = securityMock.createStart(); security.authz.mode.useRbacForRequest.mockReturnValue(false); coreSetup.getStartServices.mockResolvedValue([ - (undefined as unknown) as CoreStart, + undefined as unknown as CoreStart, { security }, undefined, ]); diff --git a/x-pack/plugins/file_upload/server/routes.ts b/x-pack/plugins/file_upload/server/routes.ts index c957916e7f321..cb7c37a586b64 100644 --- a/x-pack/plugins/file_upload/server/routes.ts +++ b/x-pack/plugins/file_upload/server/routes.ts @@ -187,9 +187,8 @@ export function fileUploadRoutes(coreSetup: CoreSetup, logge }, async (context, request, response) => { try { - const { - body: indexExists, - } = await context.core.elasticsearch.client.asCurrentUser.indices.exists(request.body); + const { body: indexExists } = + await context.core.elasticsearch.client.asCurrentUser.indices.exists(request.body); return response.ok({ body: { exists: indexExists } }); } catch (e) { return response.customError(wrapError(e)); diff --git a/x-pack/plugins/fleet/common/services/decode_cloud_id.ts b/x-pack/plugins/fleet/common/services/decode_cloud_id.ts index e4952e6b22356..2afc15e8f71b5 100644 --- a/x-pack/plugins/fleet/common/services/decode_cloud_id.ts +++ b/x-pack/plugins/fleet/common/services/decode_cloud_id.ts @@ -6,9 +6,7 @@ */ // decodeCloudId decodes the c.id into c.esURL and c.kibURL -export function decodeCloudId( - cid: string -): +export function decodeCloudId(cid: string): | { host: string; defaultPort: string; diff --git a/x-pack/plugins/fleet/common/services/package_to_package_policy.test.ts b/x-pack/plugins/fleet/common/services/package_to_package_policy.test.ts index 0e5cab08edfb7..275cf237a9621 100644 --- a/x-pack/plugins/fleet/common/services/package_to_package_policy.test.ts +++ b/x-pack/plugins/fleet/common/services/package_to_package_policy.test.ts @@ -58,25 +58,25 @@ describe('Fleet - packageToPackagePolicy', () => { it('returns empty array for packages with a config template but no inputs', () => { expect( - packageToPackagePolicyInputs(({ + packageToPackagePolicyInputs({ ...mockPackage, policy_templates: [{ name: 'test_template', inputs: [] }], - } as unknown) as PackageInfo) + } as unknown as PackageInfo) ).toEqual([]); }); it('returns inputs with no streams for packages with no streams', () => { expect( - packageToPackagePolicyInputs(({ + packageToPackagePolicyInputs({ ...mockPackage, policy_templates: [{ name: 'test_template', inputs: [{ type: 'foo' }] }], - } as unknown) as PackageInfo) + } as unknown as PackageInfo) ).toEqual([{ type: 'foo', enabled: true, policy_template: 'test_template', streams: [] }]); expect( - packageToPackagePolicyInputs(({ + packageToPackagePolicyInputs({ ...mockPackage, policy_templates: [{ name: 'test_template', inputs: [{ type: 'foo' }, { type: 'bar' }] }], - } as unknown) as PackageInfo) + } as unknown as PackageInfo) ).toEqual([ { type: 'foo', enabled: true, policy_template: 'test_template', streams: [] }, { type: 'bar', enabled: true, policy_template: 'test_template', streams: [] }, @@ -85,7 +85,7 @@ describe('Fleet - packageToPackagePolicy', () => { it('returns inputs with streams for packages with streams', () => { expect( - packageToPackagePolicyInputs(({ + packageToPackagePolicyInputs({ ...mockPackage, data_streams: [ { type: 'logs', dataset: 'foo', streams: [{ input: 'foo' }] }, @@ -93,7 +93,7 @@ describe('Fleet - packageToPackagePolicy', () => { { type: 'logs', dataset: 'bar2', streams: [{ input: 'bar' }] }, ], policy_templates: [{ name: 'test_template', inputs: [{ type: 'foo' }, { type: 'bar' }] }], - } as unknown) as PackageInfo) + } as unknown as PackageInfo) ).toEqual([ { type: 'foo', @@ -127,7 +127,7 @@ describe('Fleet - packageToPackagePolicy', () => { it('returns inputs with streams configurations for packages with stream vars', () => { expect( - packageToPackagePolicyInputs(({ + packageToPackagePolicyInputs({ ...mockPackage, data_streams: [ { @@ -157,7 +157,7 @@ describe('Fleet - packageToPackagePolicy', () => { }, ], policy_templates: [{ name: 'test_template', inputs: [{ type: 'foo' }, { type: 'bar' }] }], - } as unknown) as PackageInfo) + } as unknown as PackageInfo) ).toEqual([ { type: 'foo', @@ -193,7 +193,7 @@ describe('Fleet - packageToPackagePolicy', () => { it('returns inputs with streams configurations for packages with stream and input vars', () => { expect( - packageToPackagePolicyInputs(({ + packageToPackagePolicyInputs({ ...mockPackage, data_streams: [ { @@ -268,7 +268,7 @@ describe('Fleet - packageToPackagePolicy', () => { ], }, ], - } as unknown) as PackageInfo) + } as unknown as PackageInfo) ).toEqual([ { type: 'foo', @@ -399,10 +399,10 @@ describe('Fleet - packageToPackagePolicy', () => { }); it('returns package policy with inputs', () => { - const mockPackageWithPolicyTemplates = ({ + const mockPackageWithPolicyTemplates = { ...mockPackage, policy_templates: [{ inputs: [{ type: 'foo' }] }], - } as unknown) as PackageInfo; + } as unknown as PackageInfo; expect( packageToPackagePolicy(mockPackageWithPolicyTemplates, '1', '2', 'default', 'pkgPolicy-1') @@ -424,7 +424,7 @@ describe('Fleet - packageToPackagePolicy', () => { it('returns package policy with multiple policy templates (aka has integrations', () => { expect( packageToPackagePolicy( - (AWS_PACKAGE as unknown) as PackageInfo, + AWS_PACKAGE as unknown as PackageInfo, 'some-agent-policy-id', 'some-output-id', 'default', diff --git a/x-pack/plugins/fleet/common/services/validate_package_policy.test.ts b/x-pack/plugins/fleet/common/services/validate_package_policy.test.ts index 30bd9f071feb8..306d31879e0c6 100644 --- a/x-pack/plugins/fleet/common/services/validate_package_policy.test.ts +++ b/x-pack/plugins/fleet/common/services/validate_package_policy.test.ts @@ -15,7 +15,7 @@ import { AWS_PACKAGE, INVALID_AWS_POLICY, VALID_AWS_POLICY } from './fixtures/aw describe('Fleet - validatePackagePolicy()', () => { describe('works for packages with single policy template (aka no integrations)', () => { - const mockPackage = ({ + const mockPackage = { name: 'mock-package', title: 'Mock package', version: '0.0.0', @@ -152,7 +152,7 @@ describe('Fleet - validatePackagePolicy()', () => { ], }, ], - } as unknown) as PackageInfo; + } as unknown as PackageInfo; const validPackagePolicy: NewPackagePolicy = { name: 'pkgPolicy1-1', @@ -544,7 +544,7 @@ describe('Fleet - validatePackagePolicy()', () => { validPackagePolicy, { ...mockPackage, - policy_templates: [({ inputs: [] } as unknown) as RegistryPolicyTemplate], + policy_templates: [{ inputs: [] } as unknown as RegistryPolicyTemplate], }, safeLoad ) @@ -562,7 +562,7 @@ describe('Fleet - validatePackagePolicy()', () => { expect( validatePackagePolicy( INVALID_AWS_POLICY as NewPackagePolicy, - (AWS_PACKAGE as unknown) as PackageInfo, + AWS_PACKAGE as unknown as PackageInfo, safeLoad ) ).toMatchSnapshot(); @@ -573,7 +573,7 @@ describe('Fleet - validatePackagePolicy()', () => { validationHasErrors( validatePackagePolicy( VALID_AWS_POLICY as NewPackagePolicy, - (AWS_PACKAGE as unknown) as PackageInfo, + AWS_PACKAGE as unknown as PackageInfo, safeLoad ) ) diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/package_policy_input_panel.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/package_policy_input_panel.tsx index bce48d3108aa7..050177850818a 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/package_policy_input_panel.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/components/package_policy_input_panel.tsx @@ -86,9 +86,10 @@ export const PackagePolicyInputPanel: React.FunctionComponent<{ const errorCount = countValidationErrors(inputValidationResults); const hasErrors = forceShowErrors && errorCount; - const hasInputStreams = useMemo(() => packageInputStreams.length > 0, [ - packageInputStreams.length, - ]); + const hasInputStreams = useMemo( + () => packageInputStreams.length > 0, + [packageInputStreams.length] + ); const inputStreams = useMemo( () => packageInputStreams diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/index.tsx index 5e00bce5d6c69..a83f6902ed056 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/index.tsx @@ -91,9 +91,10 @@ export const CreatePackagePolicyPage: React.FunctionComponent = () => { const { search } = useLocation(); const queryParams = useMemo(() => new URLSearchParams(search), [search]); - const queryParamsPolicyId = useMemo(() => queryParams.get('policyId') ?? undefined, [ - queryParams, - ]); + const queryParamsPolicyId = useMemo( + () => queryParams.get('policyId') ?? undefined, + [queryParams] + ); /** * Please note: policyId can come from one of two sources. The URL param (in the URL path) or diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/step_select_agent_policy.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/step_select_agent_policy.tsx index e2f5a7249ff0a..63cf1a0c87b29 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/step_select_agent_policy.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/create_package_policy_page/step_select_agent_policy.tsx @@ -65,9 +65,8 @@ export const StepSelectAgentPolicy: React.FunctionComponent<{ // Create new agent policy flyout state const hasWriteCapabilites = useCapabilities().write; - const [isCreateAgentPolicyFlyoutOpen, setIsCreateAgentPolicyFlyoutOpen] = useState( - false - ); + const [isCreateAgentPolicyFlyoutOpen, setIsCreateAgentPolicyFlyoutOpen] = + useState(false); // Fetch package info const { diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/details_page/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/details_page/index.tsx index 9d3fe64b6639d..eec7d80b75c4b 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/details_page/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/details_page/index.tsx @@ -312,7 +312,7 @@ export const AgentPolicyDetailsPage: React.FunctionComponent = () => { {content} diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.tsx index 040070bcff7c4..d887076568a68 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/edit_package_policy_page/index.tsx @@ -97,9 +97,8 @@ export const EditPackagePolicyForm = memo<{ inputs: [], version: '', }); - const [originalPackagePolicy, setOriginalPackagePolicy] = useState< - GetOnePackagePolicyResponse['item'] - >(); + const [originalPackagePolicy, setOriginalPackagePolicy] = + useState(); const [dryRunData, setDryRunData] = useState(); const policyId = agentPolicy?.id ?? ''; @@ -110,10 +109,8 @@ export const EditPackagePolicyForm = memo<{ setIsLoadingData(true); setLoadingError(undefined); try { - const { - data: packagePolicyData, - error: packagePolicyError, - } = await sendGetOnePackagePolicy(packagePolicyId); + const { data: packagePolicyData, error: packagePolicyError } = + await sendGetOnePackagePolicy(packagePolicyId); if (packagePolicyError) { throw packagePolicyError; diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/list_page/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/list_page/index.tsx index 10859e32f0080..b940086effeaa 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/list_page/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agent_policy/list_page/index.tsx @@ -78,7 +78,11 @@ export const AgentPolicyListPage: React.FunctionComponent<{}> = () => { ); // Fetch agent policies - const { isLoading, data: agentPolicyData, resendRequest } = useGetAgentPolicies({ + const { + isLoading, + data: agentPolicyData, + resendRequest, + } = useGetAgentPolicies({ page: pagination.currentPage, perPage: pagination.pageSize, sortField: sorting?.field, diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/agent_logs.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/agent_logs.tsx index f927bdcc2e518..783a960aff120 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/agent_logs.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/agent_logs.tsx @@ -245,9 +245,10 @@ export const AgentLogsUI: React.FunctionComponent = memo( // Set absolute height on logs component (needed to render correctly in Safari) // based on available height, or 600px, whichever is greater const [logsPanelRef, { height: measuredlogPanelHeight }] = useMeasure(); - const logPanelHeight = useMemo(() => Math.max(measuredlogPanelHeight, 600), [ - measuredlogPanelHeight, - ]); + const logPanelHeight = useMemo( + () => Math.max(measuredlogPanelHeight, 600), + [measuredlogPanelHeight] + ); if (!isLogFeatureAvailable) { return ( diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/index.tsx index c138d23cce93b..5411e6313ebb7 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/components/agent_logs/index.tsx @@ -22,59 +22,58 @@ import { DEFAULT_LOGS_STATE, STATE_STORAGE_KEY } from './constants'; import type { AgentLogsProps, AgentLogsState } from './agent_logs'; import { AgentLogsUI, AgentLogsUrlStateHelper } from './agent_logs'; -export const AgentLogs: React.FunctionComponent< - Pick -> = memo(({ agent, agentPolicy }) => { - const stateContainer = useMemo( - () => - createStateContainer< - AgentLogsState, - { - update: PureTransition]>; - } - >( - { - ...DEFAULT_LOGS_STATE, - ...getStateFromKbnUrl(STATE_STORAGE_KEY, window.location.href, { - getFromHashQuery: false, - }), - }, - { - update: (state) => (updatedState) => ({ ...state, ...updatedState }), - } - ), - [] - ); +export const AgentLogs: React.FunctionComponent> = + memo(({ agent, agentPolicy }) => { + const stateContainer = useMemo( + () => + createStateContainer< + AgentLogsState, + { + update: PureTransition]>; + } + >( + { + ...DEFAULT_LOGS_STATE, + ...getStateFromKbnUrl(STATE_STORAGE_KEY, window.location.href, { + getFromHashQuery: false, + }), + }, + { + update: (state) => (updatedState) => ({ ...state, ...updatedState }), + } + ), + [] + ); - const AgentLogsConnected = useMemo( - () => - AgentLogsUrlStateHelper.connect((state) => ({ - state: state || DEFAULT_LOGS_STATE, - }))(AgentLogsUI), - [] - ); + const AgentLogsConnected = useMemo( + () => + AgentLogsUrlStateHelper.connect((state) => ({ + state: state || DEFAULT_LOGS_STATE, + }))(AgentLogsUI), + [] + ); - const [isSyncReady, setIsSyncReady] = useState(false); + const [isSyncReady, setIsSyncReady] = useState(false); - useEffect(() => { - const stateStorage = createKbnUrlStateStorage(); - const { start, stop } = syncState({ - storageKey: STATE_STORAGE_KEY, - stateContainer: stateContainer as INullableBaseStateContainer, - stateStorage, - }); - start(); - setIsSyncReady(true); + useEffect(() => { + const stateStorage = createKbnUrlStateStorage(); + const { start, stop } = syncState({ + storageKey: STATE_STORAGE_KEY, + stateContainer: stateContainer as INullableBaseStateContainer, + stateStorage, + }); + start(); + setIsSyncReady(true); - return () => { - stop(); - stateContainer.set(DEFAULT_LOGS_STATE); - }; - }, [stateContainer]); + return () => { + stop(); + stateContainer.set(DEFAULT_LOGS_STATE); + }; + }, [stateContainer]); - return ( - - {isSyncReady ? : null} - - ); -}); + return ( + + {isSyncReady ? : null} + + ); + }); diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/index.tsx index d2342dafca2eb..f3430110ba283 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/agent_details_page/index.tsx @@ -254,7 +254,7 @@ export const AgentDetailsPage: React.FunctionComponent = () => { {isLoading && isInitialRequest ? ( diff --git a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/index.tsx b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/index.tsx index 494541a00fc0a..18a684baad60d 100644 --- a/x-pack/plugins/fleet/public/applications/fleet/sections/agents/index.tsx +++ b/x-pack/plugins/fleet/public/applications/fleet/sections/agents/index.tsx @@ -39,9 +39,10 @@ export const AgentsApp: React.FunctionComponent = () => { perPage: 1000, }); - const agentPolicies = useMemo(() => agentPoliciesRequest.data?.items || [], [ - agentPoliciesRequest.data, - ]); + const agentPolicies = useMemo( + () => agentPoliciesRequest.data?.items || [], + [agentPoliciesRequest.data] + ); const fleetStatus = useFleetStatus(); diff --git a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/index.tsx b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/index.tsx index f0630f89c8984..fadcbdd70c28d 100644 --- a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/index.tsx +++ b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/index.tsx @@ -124,9 +124,11 @@ export function Detail() { semverLt(packageInfo.savedObject.attributes.version, packageInfo.latestVersion); // Fetch package info - const { data: packageInfoData, error: packageInfoError, isLoading } = useGetPackageInfoByKey( - pkgkey - ); + const { + data: packageInfoData, + error: packageInfoError, + isLoading, + } = useGetPackageInfoByKey(pkgkey); const showCustomTab = useUIExtension(packageInfoData?.response.name ?? '', 'package-detail-custom') !== undefined; diff --git a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/overview/overview.tsx b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/overview/overview.tsx index 945859ac81ffd..0b477fee2ba77 100644 --- a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/overview/overview.tsx +++ b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/overview/overview.tsx @@ -27,10 +27,10 @@ const LeftColumn = styled(EuiFlexItem)` `; export const OverviewPage: React.FC = memo(({ packageInfo, integrationInfo }) => { - const screenshots = useMemo(() => integrationInfo?.screenshots || packageInfo.screenshots || [], [ - integrationInfo, - packageInfo.screenshots, - ]); + const screenshots = useMemo( + () => integrationInfo?.screenshots || packageInfo.screenshots || [], + [integrationInfo, packageInfo.screenshots] + ); return ( diff --git a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/policies/package_policies.tsx b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/policies/package_policies.tsx index 07a61410e9a6b..92b4012011fc8 100644 --- a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/policies/package_policies.tsx +++ b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/policies/package_policies.tsx @@ -84,9 +84,10 @@ export const PackagePoliciesPage = ({ name, version }: PackagePoliciesPanelProps const { search } = useLocation(); const history = useHistory(); const queryParams = useMemo(() => new URLSearchParams(search), [search]); - const agentPolicyIdFromParams = useMemo(() => queryParams.get('addAgentToPolicyId'), [ - queryParams, - ]); + const agentPolicyIdFromParams = useMemo( + () => queryParams.get('addAgentToPolicyId'), + [queryParams] + ); const [flyoutOpenForPolicyId, setFlyoutOpenForPolicyId] = useState( agentPolicyIdFromParams ); @@ -94,7 +95,11 @@ export const PackagePoliciesPage = ({ name, version }: PackagePoliciesPanelProps const getPackageInstallStatus = useGetPackageInstallStatus(); const packageInstallStatus = getPackageInstallStatus(name); const { pagination, pageSizeOptions, setPagination } = useUrlPagination(); - const { data, isLoading, resendRequest: refreshPolicies } = usePackagePoliciesWithAgentPolicy({ + const { + data, + isLoading, + resendRequest: refreshPolicies, + } = usePackagePoliciesWithAgentPolicy({ page: pagination.currentPage, perPage: pagination.pageSize, kuery: `${PACKAGE_POLICY_SAVED_OBJECT_TYPE}.package.name: ${name}`, diff --git a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/policies/use_package_policies_with_agent_policy.ts b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/policies/use_package_policies_with_agent_policy.ts index 33c1d3ff77302..4f6f456bf82cd 100644 --- a/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/policies/use_package_policies_with_agent_policy.ts +++ b/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/policies/use_package_policies_with_agent_policy.ts @@ -74,18 +74,16 @@ export const usePackagePoliciesWithAgentPolicy = ( .join(' or ')}) `; }, [packagePoliciesData]); - const { - data: agentPoliciesData, - isLoading: isLoadingAgentPolicies, - } = useConditionalRequest({ - path: agentPolicyRouteService.getListPath(), - method: 'get', - query: { - perPage: 100, - kuery: agentPoliciesFilter, - }, - shouldSendRequest: !!packagePoliciesData?.items.length, - } as SendConditionalRequestConfig); + const { data: agentPoliciesData, isLoading: isLoadingAgentPolicies } = + useConditionalRequest({ + path: agentPolicyRouteService.getListPath(), + method: 'get', + query: { + perPage: 100, + kuery: agentPoliciesFilter, + }, + shouldSendRequest: !!packagePoliciesData?.items.length, + } as SendConditionalRequestConfig); const [enrichedData, setEnrichedData] = useState(); diff --git a/x-pack/plugins/fleet/public/components/package_icon.tsx b/x-pack/plugins/fleet/public/components/package_icon.tsx index bb84a79056978..df0bd9864b60f 100644 --- a/x-pack/plugins/fleet/public/components/package_icon.tsx +++ b/x-pack/plugins/fleet/public/components/package_icon.tsx @@ -12,9 +12,8 @@ import { EuiIcon } from '@elastic/eui'; import type { UsePackageIconType } from '../hooks'; import { usePackageIconType } from '../hooks'; -export const PackageIcon: React.FunctionComponent< - UsePackageIconType & Omit -> = ({ packageName, integrationName, version, icons, tryApi, ...euiIconProps }) => { - const iconType = usePackageIconType({ packageName, integrationName, version, icons, tryApi }); - return ; -}; +export const PackageIcon: React.FunctionComponent> = + ({ packageName, integrationName, version, icons, tryApi, ...euiIconProps }) => { + const iconType = usePackageIconType({ packageName, integrationName, version, icons, tryApi }); + return ; + }; diff --git a/x-pack/plugins/fleet/public/components/package_policy_delete_provider.tsx b/x-pack/plugins/fleet/public/components/package_policy_delete_provider.tsx index 86f064405497b..e2522f40ef966 100644 --- a/x-pack/plugins/fleet/public/components/package_policy_delete_provider.tsx +++ b/x-pack/plugins/fleet/public/components/package_policy_delete_provider.tsx @@ -63,15 +63,16 @@ export const PackagePolicyDeleteProvider: React.FunctionComponent = ({ ); const deletePackagePoliciesPrompt = useMemo( - (): DeletePackagePoliciesPrompt => (packagePoliciesToDelete, onSuccess = () => undefined) => { - if (!Array.isArray(packagePoliciesToDelete) || packagePoliciesToDelete.length === 0) { - throw new Error('No package policies specified for deletion'); - } - setIsModalOpen(true); - setPackagePolicies(packagePoliciesToDelete); - fetchAgentsCount(); - onSuccessCallback.current = onSuccess; - }, + (): DeletePackagePoliciesPrompt => + (packagePoliciesToDelete, onSuccess = () => undefined) => { + if (!Array.isArray(packagePoliciesToDelete) || packagePoliciesToDelete.length === 0) { + throw new Error('No package policies specified for deletion'); + } + setIsModalOpen(true); + setPackagePolicies(packagePoliciesToDelete); + fetchAgentsCount(); + onSuccessCallback.current = onSuccess; + }, [fetchAgentsCount] ); diff --git a/x-pack/plugins/fleet/public/constants/page_paths.ts b/x-pack/plugins/fleet/public/constants/page_paths.ts index 93ef0d56b17a6..e430e58d297f9 100644 --- a/x-pack/plugins/fleet/public/constants/page_paths.ts +++ b/x-pack/plugins/fleet/public/constants/page_paths.ts @@ -81,10 +81,9 @@ export const INTEGRATIONS_ROUTING_PATHS = { export const pagePathGetters: { [key in StaticPage]: () => [string, string]; -} & - { - [key in DynamicPage]: (values: DynamicPagePathValues) => [string, string]; - } = { +} & { + [key in DynamicPage]: (values: DynamicPagePathValues) => [string, string]; +} = { base: () => [FLEET_BASE_PATH, '/'], overview: () => [FLEET_BASE_PATH, '/'], integrations: () => [INTEGRATIONS_BASE_PATH, '/'], diff --git a/x-pack/plugins/fleet/public/services/ui_extensions.test.ts b/x-pack/plugins/fleet/public/services/ui_extensions.test.ts index d23219c1f653b..779fd28ebcd18 100644 --- a/x-pack/plugins/fleet/public/services/ui_extensions.test.ts +++ b/x-pack/plugins/fleet/public/services/ui_extensions.test.ts @@ -31,7 +31,7 @@ describe('UI Extension services', () => { it('should store an extension points', () => { const LazyCustomView = lazy(async () => { - return { default: ((() => {}) as unknown) as PackagePolicyEditExtensionComponent }; + return { default: (() => {}) as unknown as PackagePolicyEditExtensionComponent }; }); register({ view: 'package-policy-edit', @@ -48,10 +48,10 @@ describe('UI Extension services', () => { it('should throw if extension point has already registered', () => { const LazyCustomView = lazy(async () => { - return { default: ((() => {}) as unknown) as PackagePolicyEditExtensionComponent }; + return { default: (() => {}) as unknown as PackagePolicyEditExtensionComponent }; }); const LazyCustomView2 = lazy(async () => { - return { default: ((() => {}) as unknown) as PackagePolicyEditExtensionComponent }; + return { default: (() => {}) as unknown as PackagePolicyEditExtensionComponent }; }); register({ diff --git a/x-pack/plugins/fleet/public/types/ui_extensions.ts b/x-pack/plugins/fleet/public/types/ui_extensions.ts index 40e92fe86555d..d365b798fe83e 100644 --- a/x-pack/plugins/fleet/public/types/ui_extensions.ts +++ b/x-pack/plugins/fleet/public/types/ui_extensions.ts @@ -22,7 +22,8 @@ export interface UIExtensionsStorage { * UI Component Extension is used on the pages displaying the ability to edit an * Integration Policy */ -export type PackagePolicyEditExtensionComponent = ComponentType; +export type PackagePolicyEditExtensionComponent = + ComponentType; export interface PackagePolicyEditExtensionComponentProps { /** The current integration policy being edited */ @@ -66,7 +67,8 @@ export interface PackagePolicyEditTabsExtension { * UI Component Extension is used on the pages displaying the ability to Create an * Integration Policy */ -export type PackagePolicyCreateExtensionComponent = ComponentType; +export type PackagePolicyCreateExtensionComponent = + ComponentType; export interface PackagePolicyCreateExtensionComponentProps { /** The integration policy being created */ diff --git a/x-pack/plugins/fleet/server/collectors/agent_collectors.ts b/x-pack/plugins/fleet/server/collectors/agent_collectors.ts index 716c81573e85a..43c15e603a87a 100644 --- a/x-pack/plugins/fleet/server/collectors/agent_collectors.ts +++ b/x-pack/plugins/fleet/server/collectors/agent_collectors.ts @@ -37,14 +37,8 @@ export const getAgentUsage = async ( }; } - const { - total, - inactive, - online, - error, - offline, - updating, - } = await AgentService.getAgentStatusForAgentPolicy(esClient); + const { total, inactive, online, error, offline, updating } = + await AgentService.getAgentStatusForAgentPolicy(esClient); return { total_enrolled: total, healthy: online, diff --git a/x-pack/plugins/fleet/server/index.test.ts b/x-pack/plugins/fleet/server/index.test.ts index 924fecc311073..659c7d2761d02 100644 --- a/x-pack/plugins/fleet/server/index.test.ts +++ b/x-pack/plugins/fleet/server/index.test.ts @@ -21,7 +21,9 @@ const applyConfigDeprecations = (settings: Record = {}) => { deprecation, path: '', })), - () => ({ message }) => deprecationMessages.push(message) + () => + ({ message }) => + deprecationMessages.push(message) ); return { messages: deprecationMessages, diff --git a/x-pack/plugins/fleet/server/plugin.ts b/x-pack/plugins/fleet/server/plugin.ts index 9991f4ee20980..6aad028666ee8 100644 --- a/x-pack/plugins/fleet/server/plugin.ts +++ b/x-pack/plugins/fleet/server/plugin.ts @@ -159,7 +159,8 @@ export interface FleetStartContract { } export class FleetPlugin - implements AsyncPlugin { + implements AsyncPlugin +{ private licensing$!: Observable; private config$: Observable; private configInitialValue: FleetConfigType; diff --git a/x-pack/plugins/fleet/server/routes/agent/actions_handlers.test.ts b/x-pack/plugins/fleet/server/routes/agent/actions_handlers.test.ts index 3f300aef692ff..b31cda7cbf61d 100644 --- a/x-pack/plugins/fleet/server/routes/agent/actions_handlers.test.ts +++ b/x-pack/plugins/fleet/server/routes/agent/actions_handlers.test.ts @@ -73,13 +73,13 @@ describe('test actions handlers', () => { const mockRequest = httpServerMock.createKibanaRequest(postNewAgentActionRequest); - const agentAction = ({ + const agentAction = { type: 'POLICY_CHANGE', id: 'action1', sent_at: '2020-03-14T19:45:02.620Z', timestamp: '2019-01-04T14:32:03.36764-05:00', created_at: '2020-03-14T19:45:02.620Z', - } as unknown) as AgentAction; + } as unknown as AgentAction; const actionsService: ActionsService = { getAgent: jest.fn().mockReturnValueOnce({ @@ -90,7 +90,7 @@ describe('test actions handlers', () => { const postNewAgentActionHandler = postNewAgentActionHandlerBuilder(actionsService); await postNewAgentActionHandler( - ({ + { core: { savedObjects: { client: mockSavedObjectsClient, @@ -101,13 +101,13 @@ describe('test actions handlers', () => { }, }, }, - } as unknown) as RequestHandlerContext, + } as unknown as RequestHandlerContext, mockRequest, mockResponse ); - const expectedAgentActionResponse = (mockResponse.ok.mock.calls[0][0] - ?.body as unknown) as PostNewAgentActionResponse; + const expectedAgentActionResponse = mockResponse.ok.mock.calls[0][0] + ?.body as unknown as PostNewAgentActionResponse; expect(expectedAgentActionResponse.item).toEqual(agentAction); }); diff --git a/x-pack/plugins/fleet/server/routes/agent/handlers.ts b/x-pack/plugins/fleet/server/routes/agent/handlers.ts index fd4721309eebb..14b26d2c7ba85 100644 --- a/x-pack/plugins/fleet/server/routes/agent/handlers.ts +++ b/x-pack/plugins/fleet/server/routes/agent/handlers.ts @@ -28,53 +28,51 @@ import { defaultIngestErrorHandler } from '../../errors'; import { licenseService } from '../../services'; import * as AgentService from '../../services/agents'; -export const getAgentHandler: RequestHandler< - TypeOf -> = async (context, request, response) => { - const soClient = context.core.savedObjects.client; - const esClient = context.core.elasticsearch.client.asCurrentUser; +export const getAgentHandler: RequestHandler> = + async (context, request, response) => { + const soClient = context.core.savedObjects.client; + const esClient = context.core.elasticsearch.client.asCurrentUser; + + try { + const body: GetOneAgentResponse = { + item: await AgentService.getAgentById(esClient, request.params.agentId), + }; - try { - const body: GetOneAgentResponse = { - item: await AgentService.getAgentById(esClient, request.params.agentId), - }; + return response.ok({ body }); + } catch (error) { + if (soClient.errors.isNotFoundError(error)) { + return response.notFound({ + body: { message: `Agent ${request.params.agentId} not found` }, + }); + } - return response.ok({ body }); - } catch (error) { - if (soClient.errors.isNotFoundError(error)) { - return response.notFound({ - body: { message: `Agent ${request.params.agentId} not found` }, - }); + return defaultIngestErrorHandler({ error, response }); } + }; - return defaultIngestErrorHandler({ error, response }); - } -}; +export const deleteAgentHandler: RequestHandler> = + async (context, request, response) => { + const esClient = context.core.elasticsearch.client.asCurrentUser; -export const deleteAgentHandler: RequestHandler< - TypeOf -> = async (context, request, response) => { - const esClient = context.core.elasticsearch.client.asCurrentUser; + try { + await AgentService.deleteAgent(esClient, request.params.agentId); - try { - await AgentService.deleteAgent(esClient, request.params.agentId); + const body = { + action: 'deleted', + }; - const body = { - action: 'deleted', - }; + return response.ok({ body }); + } catch (error) { + if (error.isBoom) { + return response.customError({ + statusCode: error.output.statusCode, + body: { message: `Agent ${request.params.agentId} not found` }, + }); + } - return response.ok({ body }); - } catch (error) { - if (error.isBoom) { - return response.customError({ - statusCode: error.output.statusCode, - body: { message: `Agent ${request.params.agentId} not found` }, - }); + return defaultIngestErrorHandler({ error, response }); } - - return defaultIngestErrorHandler({ error, response }); - } -}; + }; export const updateAgentHandler: RequestHandler< TypeOf, diff --git a/x-pack/plugins/fleet/server/routes/output/handler.ts b/x-pack/plugins/fleet/server/routes/output/handler.ts index ebd3d213d33c3..0c56d55423e4b 100644 --- a/x-pack/plugins/fleet/server/routes/output/handler.ts +++ b/x-pack/plugins/fleet/server/routes/output/handler.ts @@ -31,28 +31,27 @@ export const getOutputsHandler: RequestHandler = async (context, request, respon } }; -export const getOneOuputHandler: RequestHandler< - TypeOf -> = async (context, request, response) => { - const soClient = context.core.savedObjects.client; - try { - const output = await outputService.get(soClient, request.params.outputId); +export const getOneOuputHandler: RequestHandler> = + async (context, request, response) => { + const soClient = context.core.savedObjects.client; + try { + const output = await outputService.get(soClient, request.params.outputId); - const body: GetOneOutputResponse = { - item: output, - }; + const body: GetOneOutputResponse = { + item: output, + }; - return response.ok({ body }); - } catch (error) { - if (error.isBoom && error.output.statusCode === 404) { - return response.notFound({ - body: { message: `Output ${request.params.outputId} not found` }, - }); - } + return response.ok({ body }); + } catch (error) { + if (error.isBoom && error.output.statusCode === 404) { + return response.notFound({ + body: { message: `Output ${request.params.outputId} not found` }, + }); + } - return defaultIngestErrorHandler({ error, response }); - } -}; + return defaultIngestErrorHandler({ error, response }); + } + }; export const putOuputHandler: RequestHandler< TypeOf, diff --git a/x-pack/plugins/fleet/server/routes/package_policy/handlers.test.ts b/x-pack/plugins/fleet/server/routes/package_policy/handlers.test.ts index fb28c7e2f5155..729417fa96060 100644 --- a/x-pack/plugins/fleet/server/routes/package_policy/handlers.test.ts +++ b/x-pack/plugins/fleet/server/routes/package_policy/handlers.test.ts @@ -28,51 +28,54 @@ type PackagePolicyServicePublicInterface = Omit< const packagePolicyServiceMock = packagePolicyService as jest.Mocked; -jest.mock('../../services/package_policy', (): { - packagePolicyService: jest.Mocked; -} => { - return { - packagePolicyService: { - compilePackagePolicyInputs: jest.fn((packageInfo, vars, dataInputs) => - Promise.resolve(dataInputs) - ), - buildPackagePolicyFromPackage: jest.fn(), - bulkCreate: jest.fn(), - create: jest.fn((soClient, esClient, newData) => - Promise.resolve({ - ...newData, - inputs: newData.inputs.map((input) => ({ - ...input, - streams: input.streams.map((stream) => ({ - id: stream.data_stream.dataset, - ...stream, +jest.mock( + '../../services/package_policy', + (): { + packagePolicyService: jest.Mocked; + } => { + return { + packagePolicyService: { + compilePackagePolicyInputs: jest.fn((packageInfo, vars, dataInputs) => + Promise.resolve(dataInputs) + ), + buildPackagePolicyFromPackage: jest.fn(), + bulkCreate: jest.fn(), + create: jest.fn((soClient, esClient, newData) => + Promise.resolve({ + ...newData, + inputs: newData.inputs.map((input) => ({ + ...input, + streams: input.streams.map((stream) => ({ + id: stream.data_stream.dataset, + ...stream, + })), })), - })), - id: '1', - revision: 1, - updated_at: new Date().toISOString(), - updated_by: 'elastic', - created_at: new Date().toISOString(), - created_by: 'elastic', - }) - ), - delete: jest.fn(), - get: jest.fn(), - getByIDs: jest.fn(), - list: jest.fn(), - listIds: jest.fn(), - update: jest.fn(), - // @ts-ignore - runExternalCallbacks: jest.fn((callbackType, packagePolicy, context, request) => - callbackType === 'postPackagePolicyDelete' - ? Promise.resolve(undefined) - : Promise.resolve(packagePolicy) - ), - upgrade: jest.fn(), - getUpgradeDryRunDiff: jest.fn(), - }, - }; -}); + id: '1', + revision: 1, + updated_at: new Date().toISOString(), + updated_by: 'elastic', + created_at: new Date().toISOString(), + created_by: 'elastic', + }) + ), + delete: jest.fn(), + get: jest.fn(), + getByIDs: jest.fn(), + list: jest.fn(), + listIds: jest.fn(), + update: jest.fn(), + // @ts-ignore + runExternalCallbacks: jest.fn((callbackType, packagePolicy, context, request) => + callbackType === 'postPackagePolicyDelete' + ? Promise.resolve(undefined) + : Promise.resolve(packagePolicy) + ), + upgrade: jest.fn(), + getUpgradeDryRunDiff: jest.fn(), + }, + }; + } +); jest.mock('../../services/epm/packages', () => { return { diff --git a/x-pack/plugins/fleet/server/saved_objects/migrations/security_solution/to_v7_11_0.ts b/x-pack/plugins/fleet/server/saved_objects/migrations/security_solution/to_v7_11_0.ts index 0c7b20ed28261..c17a167184b4b 100644 --- a/x-pack/plugins/fleet/server/saved_objects/migrations/security_solution/to_v7_11_0.ts +++ b/x-pack/plugins/fleet/server/saved_objects/migrations/security_solution/to_v7_11_0.ts @@ -13,9 +13,8 @@ import type { PackagePolicy } from '../../../../common'; export const migratePackagePolicyToV7110: SavedObjectMigrationFn = ( packagePolicyDoc ) => { - const updatedPackagePolicyDoc: SavedObjectUnsanitizedDoc = cloneDeep( - packagePolicyDoc - ); + const updatedPackagePolicyDoc: SavedObjectUnsanitizedDoc = + cloneDeep(packagePolicyDoc); if (packagePolicyDoc.attributes.package?.name === 'endpoint') { const input = updatedPackagePolicyDoc.attributes.inputs[0]; const popup = { diff --git a/x-pack/plugins/fleet/server/saved_objects/migrations/security_solution/to_v7_12_0.ts b/x-pack/plugins/fleet/server/saved_objects/migrations/security_solution/to_v7_12_0.ts index 9d961af74a12a..4fc8c15044e82 100644 --- a/x-pack/plugins/fleet/server/saved_objects/migrations/security_solution/to_v7_12_0.ts +++ b/x-pack/plugins/fleet/server/saved_objects/migrations/security_solution/to_v7_12_0.ts @@ -13,9 +13,8 @@ import type { PackagePolicy } from '../../../../common'; export const migratePackagePolicyToV7120: SavedObjectMigrationFn = ( packagePolicyDoc ) => { - const updatedPackagePolicyDoc: SavedObjectUnsanitizedDoc = cloneDeep( - packagePolicyDoc - ); + const updatedPackagePolicyDoc: SavedObjectUnsanitizedDoc = + cloneDeep(packagePolicyDoc); if (packagePolicyDoc.attributes.package?.name === 'endpoint') { const input = updatedPackagePolicyDoc.attributes.inputs[0]; const ransomware = { diff --git a/x-pack/plugins/fleet/server/saved_objects/migrations/security_solution/to_v7_14_0.ts b/x-pack/plugins/fleet/server/saved_objects/migrations/security_solution/to_v7_14_0.ts index 2f281bcf86a95..a56ef13375149 100644 --- a/x-pack/plugins/fleet/server/saved_objects/migrations/security_solution/to_v7_14_0.ts +++ b/x-pack/plugins/fleet/server/saved_objects/migrations/security_solution/to_v7_14_0.ts @@ -14,9 +14,8 @@ export const migrateEndpointPackagePolicyToV7140: SavedObjectMigrationFn< PackagePolicy, PackagePolicy > = (packagePolicyDoc) => { - const updatedPackagePolicyDoc: SavedObjectUnsanitizedDoc = cloneDeep( - packagePolicyDoc - ); + const updatedPackagePolicyDoc: SavedObjectUnsanitizedDoc = + cloneDeep(packagePolicyDoc); if (packagePolicyDoc.attributes.package?.name === 'endpoint') { const input = updatedPackagePolicyDoc.attributes.inputs[0]; if (input && input.config) { diff --git a/x-pack/plugins/fleet/server/saved_objects/migrations/security_solution/to_v7_15_0.ts b/x-pack/plugins/fleet/server/saved_objects/migrations/security_solution/to_v7_15_0.ts index 9ccafc58989f3..7f96cda589462 100644 --- a/x-pack/plugins/fleet/server/saved_objects/migrations/security_solution/to_v7_15_0.ts +++ b/x-pack/plugins/fleet/server/saved_objects/migrations/security_solution/to_v7_15_0.ts @@ -17,9 +17,8 @@ export const migratePackagePolicyToV7150: SavedObjectMigrationFn = cloneDeep( - packagePolicyDoc - ); + const updatedPackagePolicyDoc: SavedObjectUnsanitizedDoc = + cloneDeep(packagePolicyDoc); const input = updatedPackagePolicyDoc.attributes.inputs[0]; const memory = { diff --git a/x-pack/plugins/fleet/server/services/agent_policy.test.ts b/x-pack/plugins/fleet/server/services/agent_policy.test.ts index 3267b2b7e2665..59e0f6fd7840e 100644 --- a/x-pack/plugins/fleet/server/services/agent_policy.test.ts +++ b/x-pack/plugins/fleet/server/services/agent_policy.test.ts @@ -70,7 +70,7 @@ jest.mock('./agents'); jest.mock('./package_policy'); function getAgentPolicyUpdateMock() { - return (agentPolicyUpdateEventHandler as unknown) as jest.Mock< + return agentPolicyUpdateEventHandler as unknown as jest.Mock< typeof agentPolicyUpdateEventHandler >; } @@ -79,7 +79,7 @@ function getAgentPolicyCreateMock() { const soClient = savedObjectsClientMock.create(); soClient.create.mockImplementation(async (type, attributes) => { return { - attributes: (attributes as unknown) as NewAgentPolicy, + attributes: attributes as unknown as NewAgentPolicy, id: 'mocked', type: 'mocked', references: [], diff --git a/x-pack/plugins/fleet/server/services/agent_policy.ts b/x-pack/plugins/fleet/server/services/agent_policy.ts index 8539db05ffb54..9fe275bb9a3c9 100644 --- a/x-pack/plugins/fleet/server/services/agent_policy.ts +++ b/x-pack/plugins/fleet/server/services/agent_policy.ts @@ -617,14 +617,15 @@ class AgentPolicyService { } if (agentPolicy.package_policies && agentPolicy.package_policies.length) { - const deletedPackagePolicies: DeletePackagePoliciesResponse = await packagePolicyService.delete( - soClient, - esClient, - agentPolicy.package_policies as string[], - { - skipUnassignFromAgentPolicies: true, - } - ); + const deletedPackagePolicies: DeletePackagePoliciesResponse = + await packagePolicyService.delete( + soClient, + esClient, + agentPolicy.package_policies as string[], + { + skipUnassignFromAgentPolicies: true, + } + ); try { await packagePolicyService.runDeleteExternalCallbacks(deletedPackagePolicies); } catch (error) { @@ -677,7 +678,7 @@ class AgentPolicyService { '@timestamp': new Date().toISOString(), revision_idx: fullPolicy.revision, coordinator_idx: 0, - data: (fullPolicy as unknown) as FleetServerPolicy['data'], + data: fullPolicy as unknown as FleetServerPolicy['data'], policy_id: fullPolicy.id, default_fleet_server: policy.is_default_fleet_server === true, }; diff --git a/x-pack/plugins/fleet/server/services/agent_policy_update.ts b/x-pack/plugins/fleet/server/services/agent_policy_update.ts index fe3a3907b9d29..9703467d84c18 100644 --- a/x-pack/plugins/fleet/server/services/agent_policy_update.ts +++ b/x-pack/plugins/fleet/server/services/agent_policy_update.ts @@ -13,7 +13,7 @@ import { unenrollForAgentPolicyId } from './agents'; import { agentPolicyService } from './agent_policy'; import { appContextService } from './app_context'; -const fakeRequest = ({ +const fakeRequest = { headers: {}, getBasePath: () => '', path: '/', @@ -26,7 +26,7 @@ const fakeRequest = ({ url: '/', }, }, -} as unknown) as KibanaRequest; +} as unknown as KibanaRequest; export async function agentPolicyUpdateEventHandler( soClient: SavedObjectsClientContract, diff --git a/x-pack/plugins/fleet/server/services/agents/crud.ts b/x-pack/plugins/fleet/server/services/agents/crud.ts index 2a69f983ec894..03647c52e05f0 100644 --- a/x-pack/plugins/fleet/server/services/agents/crud.ts +++ b/x-pack/plugins/fleet/server/services/agents/crud.ts @@ -29,25 +29,29 @@ function _joinFilters(filters: Array): KueryNode try { return filters .filter((filter) => filter !== undefined) - .reduce((acc: KueryNode | undefined, kuery: string | KueryNode | undefined): - | KueryNode - | undefined => { - if (kuery === undefined) { - return acc; - } - const kueryNode: KueryNode = - typeof kuery === 'string' ? fromKueryExpression(removeSOAttributes(kuery)) : kuery; - - if (!acc) { - return kueryNode; - } - - return { - type: 'function', - function: 'and', - arguments: [acc, kueryNode], - }; - }, undefined as KueryNode | undefined); + .reduce( + ( + acc: KueryNode | undefined, + kuery: string | KueryNode | undefined + ): KueryNode | undefined => { + if (kuery === undefined) { + return acc; + } + const kueryNode: KueryNode = + typeof kuery === 'string' ? fromKueryExpression(removeSOAttributes(kuery)) : kuery; + + if (!acc) { + return kueryNode; + } + + return { + type: 'function', + function: 'and', + arguments: [acc, kueryNode], + }; + }, + undefined as KueryNode | undefined + ); } catch (err) { throw new IngestManagerError(`Kuery is malformed: ${err.message}`); } diff --git a/x-pack/plugins/fleet/server/services/agents/crud_so.ts b/x-pack/plugins/fleet/server/services/agents/crud_so.ts index 246c91bbef518..aa3cb4e4ec1a7 100644 --- a/x-pack/plugins/fleet/server/services/agents/crud_so.ts +++ b/x-pack/plugins/fleet/server/services/agents/crud_so.ts @@ -25,27 +25,31 @@ const INACTIVE_AGENT_CONDITION = `NOT (${ACTIVE_AGENT_CONDITION})`; function _joinFilters(filters: Array) { return filters .filter((filter) => filter !== undefined) - .reduce((acc: KueryNode | undefined, kuery: string | KueryNode | undefined): - | KueryNode - | undefined => { - if (kuery === undefined) { - return acc; - } - const kueryNode: KueryNode = - typeof kuery === 'string' - ? fromKueryExpression(normalizeKuery(AGENT_SAVED_OBJECT_TYPE, kuery)) - : kuery; - - if (!acc) { - return kueryNode; - } - - return { - type: 'function', - function: 'and', - arguments: [acc, kueryNode], - }; - }, undefined as KueryNode | undefined); + .reduce( + ( + acc: KueryNode | undefined, + kuery: string | KueryNode | undefined + ): KueryNode | undefined => { + if (kuery === undefined) { + return acc; + } + const kueryNode: KueryNode = + typeof kuery === 'string' + ? fromKueryExpression(normalizeKuery(AGENT_SAVED_OBJECT_TYPE, kuery)) + : kuery; + + if (!acc) { + return kueryNode; + } + + return { + type: 'function', + function: 'and', + arguments: [acc, kueryNode], + }; + }, + undefined as KueryNode | undefined + ); } export async function listAgents( diff --git a/x-pack/plugins/fleet/server/services/api_keys/enrollment_api_key.ts b/x-pack/plugins/fleet/server/services/api_keys/enrollment_api_key.ts index b666a1678ea6a..cc2357351f6df 100644 --- a/x-pack/plugins/fleet/server/services/api_keys/enrollment_api_key.ts +++ b/x-pack/plugins/fleet/server/services/api_keys/enrollment_api_key.ts @@ -22,7 +22,8 @@ import { escapeSearchQueryPhrase } from '../saved_object'; import { invalidateAPIKeys } from './security'; -const uuidRegex = /^\([0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}\)$/; +const uuidRegex = + /^\([0-9a-fA-F]{8}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{4}\b-[0-9a-fA-F]{12}\)$/; export async function listEnrollmentApiKeys( esClient: ElasticsearchClient, diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/default_settings.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/default_settings.ts index 2dced977229e1..e7fccb22566a5 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/default_settings.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/default_settings.ts @@ -53,9 +53,10 @@ export function buildDefaultSettings({ `large amount of default fields detected for index template ${templateName} in package ${packageName}, applying the first ${QUERY_DEFAULT_FIELD_LIMIT} fields` ); } - const defaultFieldNames = (defaultFields.length > QUERY_DEFAULT_FIELD_LIMIT - ? defaultFields.slice(0, QUERY_DEFAULT_FIELD_LIMIT) - : defaultFields + const defaultFieldNames = ( + defaultFields.length > QUERY_DEFAULT_FIELD_LIMIT + ? defaultFields.slice(0, QUERY_DEFAULT_FIELD_LIMIT) + : defaultFields ).map((field) => field.name); return { diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/transform.test.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/transform.test.ts index 6febd27286ad1..34dcd5427d655 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/transform.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/transform.test.ts @@ -50,7 +50,7 @@ describe('test transform install', () => { }); test('can install new versions and removes older version', async () => { - const previousInstallation: Installation = ({ + const previousInstallation: Installation = { installed_es: [ { id: 'metrics-endpoint.policy-0.16.0-dev.0', @@ -61,9 +61,9 @@ describe('test transform install', () => { type: ElasticsearchAssetType.transform, }, ], - } as unknown) as Installation; + } as unknown as Installation; - const currentInstallation: Installation = ({ + const currentInstallation: Installation = { installed_es: [ { id: 'metrics-endpoint.policy-0.16.0-dev.0', @@ -82,7 +82,7 @@ describe('test transform install', () => { type: ElasticsearchAssetType.transform, }, ], - } as unknown) as Installation; + } as unknown as Installation; (getAsset as jest.MockedFunction) .mockReturnValueOnce(Buffer.from('{"content": "data"}', 'utf8')) .mockReturnValueOnce(Buffer.from('{"content": "data"}', 'utf8')); @@ -91,14 +91,14 @@ describe('test transform install', () => { .mockReturnValueOnce(Promise.resolve(previousInstallation)) .mockReturnValueOnce(Promise.resolve(currentInstallation)); - (getInstallationObject as jest.MockedFunction< - typeof getInstallationObject - >).mockReturnValueOnce( - Promise.resolve(({ + ( + getInstallationObject as jest.MockedFunction + ).mockReturnValueOnce( + Promise.resolve({ attributes: { installed_es: previousInstallation.installed_es, }, - } as unknown) as SavedObject) + } as unknown as SavedObject) ); esClient.transform.getTransform.mockReturnValueOnce( @@ -115,7 +115,7 @@ describe('test transform install', () => { ); await installTransform( - ({ + { name: 'endpoint', version: '0.16.0-dev.0', data_streams: [ @@ -148,7 +148,7 @@ describe('test transform install', () => { path: 'metadata_current', }, ], - } as unknown) as RegistryPackage, + } as unknown as RegistryPackage, [ 'endpoint-0.16.0-dev.0/data_stream/policy/elasticsearch/ingest_pipeline/default.json', 'endpoint-0.16.0-dev.0/elasticsearch/transform/metadata/default.json', @@ -275,18 +275,18 @@ describe('test transform install', () => { }); test('can install new version and when no older version', async () => { - const previousInstallation: Installation = ({ + const previousInstallation: Installation = { installed_es: [], - } as unknown) as Installation; + } as unknown as Installation; - const currentInstallation: Installation = ({ + const currentInstallation: Installation = { installed_es: [ { id: 'metrics-endpoint.metadata-current-default-0.16.0-dev.0', type: ElasticsearchAssetType.transform, }, ], - } as unknown) as Installation; + } as unknown as Installation; (getAsset as jest.MockedFunction).mockReturnValueOnce( Buffer.from('{"content": "data"}', 'utf8') ); @@ -294,16 +294,16 @@ describe('test transform install', () => { .mockReturnValueOnce(Promise.resolve(previousInstallation)) .mockReturnValueOnce(Promise.resolve(currentInstallation)); - (getInstallationObject as jest.MockedFunction< - typeof getInstallationObject - >).mockReturnValueOnce( - Promise.resolve(({ + ( + getInstallationObject as jest.MockedFunction + ).mockReturnValueOnce( + Promise.resolve({ attributes: { installed_es: [] }, - } as unknown) as SavedObject) + } as unknown as SavedObject) ); await installTransform( - ({ + { name: 'endpoint', version: '0.16.0-dev.0', data_streams: [ @@ -322,7 +322,7 @@ describe('test transform install', () => { path: 'metadata_current', }, ], - } as unknown) as RegistryPackage, + } as unknown as RegistryPackage, ['endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/default.json'], esClient, savedObjectsClient @@ -360,29 +360,29 @@ describe('test transform install', () => { }); test('can removes older version when no new install in package', async () => { - const previousInstallation: Installation = ({ + const previousInstallation: Installation = { installed_es: [ { id: 'endpoint.metadata-current-default-0.15.0-dev.0', type: ElasticsearchAssetType.transform, }, ], - } as unknown) as Installation; + } as unknown as Installation; - const currentInstallation: Installation = ({ + const currentInstallation: Installation = { installed_es: [], - } as unknown) as Installation; + } as unknown as Installation; (getInstallation as jest.MockedFunction) .mockReturnValueOnce(Promise.resolve(previousInstallation)) .mockReturnValueOnce(Promise.resolve(currentInstallation)); - (getInstallationObject as jest.MockedFunction< - typeof getInstallationObject - >).mockReturnValueOnce( - Promise.resolve(({ + ( + getInstallationObject as jest.MockedFunction + ).mockReturnValueOnce( + Promise.resolve({ attributes: { installed_es: currentInstallation.installed_es }, - } as unknown) as SavedObject) + } as unknown as SavedObject) ); esClient.transform.getTransform.mockReturnValueOnce( @@ -399,7 +399,7 @@ describe('test transform install', () => { ); await installTransform( - ({ + { name: 'endpoint', version: '0.16.0-dev.0', data_streams: [ @@ -432,7 +432,7 @@ describe('test transform install', () => { path: 'metadata_current', }, ], - } as unknown) as RegistryPackage, + } as unknown as RegistryPackage, [], esClient, savedObjectsClient @@ -489,18 +489,18 @@ describe('test transform install', () => { }); test('ignore already exists error if saved object and ES transforms are out of sync', async () => { - const previousInstallation: Installation = ({ + const previousInstallation: Installation = { installed_es: [], - } as unknown) as Installation; + } as unknown as Installation; - const currentInstallation: Installation = ({ + const currentInstallation: Installation = { installed_es: [ { id: 'metrics-endpoint.metadata-current-default-0.16.0-dev.0', type: ElasticsearchAssetType.transform, }, ], - } as unknown) as Installation; + } as unknown as Installation; (getAsset as jest.MockedFunction).mockReturnValueOnce( Buffer.from('{"content": "data"}', 'utf8') ); @@ -508,12 +508,12 @@ describe('test transform install', () => { .mockReturnValueOnce(Promise.resolve(previousInstallation)) .mockReturnValueOnce(Promise.resolve(currentInstallation)); - (getInstallationObject as jest.MockedFunction< - typeof getInstallationObject - >).mockReturnValueOnce( - Promise.resolve(({ + ( + getInstallationObject as jest.MockedFunction + ).mockReturnValueOnce( + Promise.resolve({ attributes: { installed_es: [] }, - } as unknown) as SavedObject) + } as unknown as SavedObject) ); esClient.transport.request.mockImplementationOnce(() => @@ -528,7 +528,7 @@ describe('test transform install', () => { ); await installTransform( - ({ + { name: 'endpoint', version: '0.16.0-dev.0', data_streams: [ @@ -547,7 +547,7 @@ describe('test transform install', () => { path: 'metadata_current', }, ], - } as unknown) as RegistryPackage, + } as unknown as RegistryPackage, ['endpoint-0.16.0-dev.0/elasticsearch/transform/metadata_current/default.json'], esClient, savedObjectsClient diff --git a/x-pack/plugins/fleet/server/services/fleet_server/saved_object_migrations.ts b/x-pack/plugins/fleet/server/services/fleet_server/saved_object_migrations.ts index 5c05ed7532ac6..379bc8fa39bff 100644 --- a/x-pack/plugins/fleet/server/services/fleet_server/saved_object_migrations.ts +++ b/x-pack/plugins/fleet/server/services/fleet_server/saved_object_migrations.ts @@ -33,7 +33,7 @@ export async function runFleetServerMigration() { } function getInternalUserSOClient() { - const fakeRequest = ({ + const fakeRequest = { headers: {}, getBasePath: () => '', path: '/', @@ -46,7 +46,7 @@ function getInternalUserSOClient() { url: '/', }, }, - } as unknown) as KibanaRequest; + } as unknown as KibanaRequest; return appContextService.getInternalUserSOClient(fakeRequest); } @@ -74,9 +74,7 @@ async function migrateAgents() { for (const so of res.saved_objects) { try { - const { - attributes, - } = await appContextService + const { attributes } = await appContextService .getEncryptedSavedObjects() .getDecryptedAsInternalUser(AGENT_SAVED_OBJECT_TYPE, so.id); diff --git a/x-pack/plugins/fleet/server/services/package_policy.test.ts b/x-pack/plugins/fleet/server/services/package_policy.test.ts index 204650574e92a..aa70fc155fe74 100644 --- a/x-pack/plugins/fleet/server/services/package_policy.test.ts +++ b/x-pack/plugins/fleet/server/services/package_policy.test.ts @@ -117,7 +117,7 @@ describe('Package policy service', () => { describe('compilePackagePolicyInputs', () => { it('should work with config variables from the stream', async () => { const inputs = await packagePolicyService.compilePackagePolicyInputs( - ({ + { data_streams: [ { type: 'logs', @@ -131,7 +131,7 @@ describe('Package policy service', () => { inputs: [{ type: 'log' }], }, ], - } as unknown) as PackageInfo, + } as unknown as PackageInfo, {}, [ { @@ -180,7 +180,7 @@ describe('Package policy service', () => { it('should work with a two level dataset name', async () => { const inputs = await packagePolicyService.compilePackagePolicyInputs( - ({ + { data_streams: [ { type: 'logs', @@ -194,7 +194,7 @@ describe('Package policy service', () => { inputs: [{ type: 'log' }], }, ], - } as unknown) as PackageInfo, + } as unknown as PackageInfo, {}, [ { @@ -232,7 +232,7 @@ describe('Package policy service', () => { it('should work with config variables at the input level', async () => { const inputs = await packagePolicyService.compilePackagePolicyInputs( - ({ + { data_streams: [ { dataset: 'package.dataset1', @@ -246,7 +246,7 @@ describe('Package policy service', () => { inputs: [{ type: 'log' }], }, ], - } as unknown) as PackageInfo, + } as unknown as PackageInfo, {}, [ { @@ -295,7 +295,7 @@ describe('Package policy service', () => { it('should work with config variables at the package level', async () => { const inputs = await packagePolicyService.compilePackagePolicyInputs( - ({ + { data_streams: [ { dataset: 'package.dataset1', @@ -309,7 +309,7 @@ describe('Package policy service', () => { inputs: [{ type: 'log' }], }, ], - } as unknown) as PackageInfo, + } as unknown as PackageInfo, { hosts: { value: ['localhost'], @@ -363,14 +363,14 @@ describe('Package policy service', () => { it('should work with an input with a template and no streams', async () => { const inputs = await packagePolicyService.compilePackagePolicyInputs( - ({ + { data_streams: [], policy_templates: [ { inputs: [{ type: 'log', template_path: 'some_template_path.yml' }], }, ], - } as unknown) as PackageInfo, + } as unknown as PackageInfo, {}, [ { @@ -405,7 +405,7 @@ describe('Package policy service', () => { it('should work with an input with a template and streams', async () => { const inputs = await packagePolicyService.compilePackagePolicyInputs( - ({ + { data_streams: [ { dataset: 'package.dataset1', @@ -424,7 +424,7 @@ describe('Package policy service', () => { inputs: [{ type: 'log', template_path: 'some_template_path.yml' }], }, ], - } as unknown) as PackageInfo, + } as unknown as PackageInfo, {}, [ { @@ -510,13 +510,13 @@ describe('Package policy service', () => { it('should work with a package without input', async () => { const inputs = await packagePolicyService.compilePackagePolicyInputs( - ({ + { policy_templates: [ { inputs: undefined, }, ], - } as unknown) as PackageInfo, + } as unknown as PackageInfo, {}, [] ); @@ -526,13 +526,13 @@ describe('Package policy service', () => { it('should work with a package with a empty inputs array', async () => { const inputs = await packagePolicyService.compilePackagePolicyInputs( - ({ + { policy_templates: [ { inputs: [], }, ], - } as unknown) as PackageInfo, + } as unknown as PackageInfo, {}, [] ); diff --git a/x-pack/plugins/fleet/server/services/preconfiguration.test.ts b/x-pack/plugins/fleet/server/services/preconfiguration.test.ts index d374553e1db83..86fdd2f0aa800 100644 --- a/x-pack/plugins/fleet/server/services/preconfiguration.test.ts +++ b/x-pack/plugins/fleet/server/services/preconfiguration.test.ts @@ -287,50 +287,46 @@ describe('policy preconfiguration', () => { const soClient = getPutPreconfiguredPackagesMock(); const esClient = elasticsearchServiceMock.createClusterClient().asInternalUser; - const { - policies: policiesA, - nonFatalErrors: nonFatalErrorsA, - } = await ensurePreconfiguredPackagesAndPolicies( - soClient, - esClient, - [ - { - name: 'Test policy', - namespace: 'default', - id: 'test-id', - package_policies: [], - }, - ] as PreconfiguredAgentPolicy[], - [], - mockDefaultOutput - ); + const { policies: policiesA, nonFatalErrors: nonFatalErrorsA } = + await ensurePreconfiguredPackagesAndPolicies( + soClient, + esClient, + [ + { + name: 'Test policy', + namespace: 'default', + id: 'test-id', + package_policies: [], + }, + ] as PreconfiguredAgentPolicy[], + [], + mockDefaultOutput + ); expect(policiesA.length).toEqual(1); expect(policiesA[0].id).toBe('mocked-test-id'); expect(nonFatalErrorsA.length).toBe(0); - const { - policies: policiesB, - nonFatalErrors: nonFatalErrorsB, - } = await ensurePreconfiguredPackagesAndPolicies( - soClient, - esClient, - [ - { - name: 'Test policy redo', - namespace: 'default', - id: 'test-id', - package_policies: [ - { - package: { name: 'some-uninstalled-package' }, - name: 'This package is not installed', - }, - ], - }, - ] as PreconfiguredAgentPolicy[], - [], - mockDefaultOutput - ); + const { policies: policiesB, nonFatalErrors: nonFatalErrorsB } = + await ensurePreconfiguredPackagesAndPolicies( + soClient, + esClient, + [ + { + name: 'Test policy redo', + namespace: 'default', + id: 'test-id', + package_policies: [ + { + package: { name: 'some-uninstalled-package' }, + name: 'This package is not installed', + }, + ], + }, + ] as PreconfiguredAgentPolicy[], + [], + mockDefaultOutput + ); expect(policiesB.length).toEqual(1); expect(policiesB[0].id).toBe('mocked-test-id'); @@ -352,26 +348,24 @@ describe('policy preconfiguration', () => { is_managed: true, } as PreconfiguredAgentPolicy); - const { - policies, - nonFatalErrors: nonFatalErrorsB, - } = await ensurePreconfiguredPackagesAndPolicies( - soClient, - esClient, - [ - { - name: 'Renamed Test policy', - description: 'Renamed Test policy description', - unenroll_timeout: 999, - namespace: 'default', - id: 'test-id', - is_managed: true, - package_policies: [], - }, - ] as PreconfiguredAgentPolicy[], - [], - mockDefaultOutput - ); + const { policies, nonFatalErrors: nonFatalErrorsB } = + await ensurePreconfiguredPackagesAndPolicies( + soClient, + esClient, + [ + { + name: 'Renamed Test policy', + description: 'Renamed Test policy description', + unenroll_timeout: 999, + namespace: 'default', + id: 'test-id', + is_managed: true, + package_policies: [], + }, + ] as PreconfiguredAgentPolicy[], + [], + mockDefaultOutput + ); expect(spyAgentPolicyServiceUpdate).toBeCalled(); expect(spyAgentPolicyServiceUpdate).toBeCalledWith( expect.anything(), // soClient @@ -400,16 +394,14 @@ describe('policy preconfiguration', () => { }; mockConfiguredPolicies.set('test-id', policy); - const { - policies, - nonFatalErrors: nonFatalErrorsB, - } = await ensurePreconfiguredPackagesAndPolicies( - soClient, - esClient, - [policy], - [], - mockDefaultOutput - ); + const { policies, nonFatalErrors: nonFatalErrorsB } = + await ensurePreconfiguredPackagesAndPolicies( + soClient, + esClient, + [policy], + [], + mockDefaultOutput + ); expect(spyAgentPolicyServiceUpdate).not.toBeCalled(); expect(policies.length).toEqual(1); expect(policies[0].id).toBe('test-id'); diff --git a/x-pack/plugins/global_search/public/plugin.ts b/x-pack/plugins/global_search/public/plugin.ts index b3a890d84f036..00f320d23b606 100644 --- a/x-pack/plugins/global_search/public/plugin.ts +++ b/x-pack/plugins/global_search/public/plugin.ts @@ -25,7 +25,8 @@ export class GlobalSearchPlugin GlobalSearchPluginStart, GlobalSearchPluginSetupDeps, GlobalSearchPluginStartDeps - > { + > +{ private readonly config: GlobalSearchClientConfigType; private licenseChecker?: ILicenseChecker; private readonly searchService = new SearchService(); diff --git a/x-pack/plugins/global_search/server/plugin.ts b/x-pack/plugins/global_search/server/plugin.ts index d7c06a92f70e0..688691d8941e2 100644 --- a/x-pack/plugins/global_search/server/plugin.ts +++ b/x-pack/plugins/global_search/server/plugin.ts @@ -30,7 +30,8 @@ export class GlobalSearchPlugin GlobalSearchPluginStart, GlobalSearchPluginSetupDeps, GlobalSearchPluginStartDeps - > { + > +{ private readonly config: GlobalSearchConfigType; private readonly searchService = new SearchService(); private searchServiceStart?: SearchServiceStart; diff --git a/x-pack/plugins/global_search/server/routes/integration_tests/get_searchable_types.test.ts b/x-pack/plugins/global_search/server/routes/integration_tests/get_searchable_types.test.ts index 6f495bfbd6433..cd093c8009a92 100644 --- a/x-pack/plugins/global_search/server/routes/integration_tests/get_searchable_types.test.ts +++ b/x-pack/plugins/global_search/server/routes/integration_tests/get_searchable_types.test.ts @@ -30,9 +30,10 @@ describe('GET /internal/global_search/searchable_types', () => { 'globalSearch' >(pluginId, 'globalSearch', () => globalSearchHandlerContext); - const router = httpSetup.createRouter< - ReturnType - >('/'); + const router = + httpSetup.createRouter>( + '/' + ); registerInternalSearchableTypesRoute(router); diff --git a/x-pack/plugins/global_search/server/services/context.ts b/x-pack/plugins/global_search/server/services/context.ts index 454b0324ab3c1..b0669f35b99b9 100644 --- a/x-pack/plugins/global_search/server/services/context.ts +++ b/x-pack/plugins/global_search/server/services/context.ts @@ -14,20 +14,20 @@ export type GlobalSearchContextFactory = (request: KibanaRequest) => GlobalSearc /** * {@link GlobalSearchProviderContext | context} factory */ -export const getContextFactory = (coreStart: CoreStart) => ( - request: KibanaRequest -): GlobalSearchProviderContext => { - const soClient = coreStart.savedObjects.getScopedClient(request); - return { - core: { - savedObjects: { - client: soClient, - typeRegistry: coreStart.savedObjects.getTypeRegistry(), +export const getContextFactory = + (coreStart: CoreStart) => + (request: KibanaRequest): GlobalSearchProviderContext => { + const soClient = coreStart.savedObjects.getScopedClient(request); + return { + core: { + savedObjects: { + client: soClient, + typeRegistry: coreStart.savedObjects.getTypeRegistry(), + }, + uiSettings: { + client: coreStart.uiSettings.asScopedToClient(soClient), + }, + capabilities: from(coreStart.capabilities.resolveCapabilities(request)), }, - uiSettings: { - client: coreStart.uiSettings.asScopedToClient(soClient), - }, - capabilities: from(coreStart.capabilities.resolveCapabilities(request)), - }, + }; }; -}; diff --git a/x-pack/plugins/global_search_providers/public/plugin.ts b/x-pack/plugins/global_search_providers/public/plugin.ts index 5fd47947d1b75..89e8e9f57a3de 100644 --- a/x-pack/plugins/global_search_providers/public/plugin.ts +++ b/x-pack/plugins/global_search_providers/public/plugin.ts @@ -14,7 +14,8 @@ export interface GlobalSearchProvidersPluginSetupDeps { } export class GlobalSearchProvidersPlugin - implements Plugin<{}, {}, GlobalSearchProvidersPluginSetupDeps, {}> { + implements Plugin<{}, {}, GlobalSearchProvidersPluginSetupDeps, {}> +{ setup( { getStartServices }: CoreSetup<{}, {}>, { globalSearch }: GlobalSearchProvidersPluginSetupDeps diff --git a/x-pack/plugins/global_search_providers/public/providers/application.test.ts b/x-pack/plugins/global_search_providers/public/providers/application.test.ts index a686f416292df..aa54f3a0e5ff2 100644 --- a/x-pack/plugins/global_search_providers/public/providers/application.test.ts +++ b/x-pack/plugins/global_search_providers/public/providers/application.test.ts @@ -246,9 +246,9 @@ describe('applicationResultProvider', () => { // test scheduler doesnt play well with promises. need to workaround by passing // an observable instead. Behavior with promise is asserted in previous tests of the suite - const applicationPromise = (hot('a', { + const applicationPromise = hot('a', { a: application, - }) as unknown) as Promise; + }) as unknown as Promise; const provider = createApplicationResultProvider(applicationPromise); @@ -271,9 +271,9 @@ describe('applicationResultProvider', () => { // test scheduler doesnt play well with promises. need to workaround by passing // an observable instead. Behavior with promise is asserted in previous tests of the suite - const applicationPromise = (hot('a', { + const applicationPromise = hot('a', { a: application, - }) as unknown) as Promise; + }) as unknown as Promise; const provider = createApplicationResultProvider(applicationPromise); diff --git a/x-pack/plugins/global_search_providers/server/plugin.ts b/x-pack/plugins/global_search_providers/server/plugin.ts index cf63389c45a34..dae346144bce3 100644 --- a/x-pack/plugins/global_search_providers/server/plugin.ts +++ b/x-pack/plugins/global_search_providers/server/plugin.ts @@ -14,7 +14,8 @@ export interface GlobalSearchProvidersPluginSetupDeps { } export class GlobalSearchProvidersPlugin - implements Plugin<{}, {}, GlobalSearchProvidersPluginSetupDeps, {}> { + implements Plugin<{}, {}, GlobalSearchProvidersPluginSetupDeps, {}> +{ setup( { getStartServices }: CoreSetup<{}, {}>, { globalSearch }: GlobalSearchProvidersPluginSetupDeps diff --git a/x-pack/plugins/graph/public/components/graph_visualization/graph_visualization.test.tsx b/x-pack/plugins/graph/public/components/graph_visualization/graph_visualization.test.tsx index 1ae556a79edcb..8273d99f890c8 100644 --- a/x-pack/plugins/graph/public/components/graph_visualization/graph_visualization.test.tsx +++ b/x-pack/plugins/graph/public/components/graph_visualization/graph_visualization.test.tsx @@ -101,7 +101,7 @@ describe('graph_visualization', () => { width: 2.2, }, ]; - const workspace = ({ + const workspace = { nodes, edges, selectNone: () => {}, @@ -110,7 +110,7 @@ describe('graph_visualization', () => { return !node.isSelected; }), getAllIntersections: jest.fn(), - } as unknown) as jest.Mocked; + } as unknown as jest.Mocked; beforeEach(() => { jest.clearAllMocks(); @@ -120,7 +120,7 @@ describe('graph_visualization', () => { expect( shallow( {}} onSetControl={() => {}} onSetMergeCandidates={() => {}} diff --git a/x-pack/plugins/graph/public/components/inspect_panel.tsx b/x-pack/plugins/graph/public/components/inspect_panel.tsx index a254d54f616e4..5e5547ea341fb 100644 --- a/x-pack/plugins/graph/public/components/inspect_panel.tsx +++ b/x-pack/plugins/graph/public/components/inspect_panel.tsx @@ -49,11 +49,10 @@ export const InspectPanel = ({ const onRequestClick = () => setSelectedTabId('request'); const onResponseClick = () => setSelectedTabId('response'); - const editorContent = useMemo(() => (selectedTabId === 'request' ? lastRequest : lastResponse), [ - lastRequest, - lastResponse, - selectedTabId, - ]); + const editorContent = useMemo( + () => (selectedTabId === 'request' ? lastRequest : lastResponse), + [lastRequest, lastResponse, selectedTabId] + ); if (showInspect) { return ( diff --git a/x-pack/plugins/graph/public/components/search_bar.test.tsx b/x-pack/plugins/graph/public/components/search_bar.test.tsx index 1b76cde1a62fb..9237acb4741f1 100644 --- a/x-pack/plugins/graph/public/components/search_bar.test.tsx +++ b/x-pack/plugins/graph/public/components/search_bar.test.tsx @@ -77,7 +77,7 @@ describe('search_bar', () => { const defaultProps = { isLoading: false, indexPatternProvider: { - get: jest.fn(() => Promise.resolve(({ fields: [] } as unknown) as IndexPattern)), + get: jest.fn(() => Promise.resolve({ fields: [] } as unknown as IndexPattern)), }, confirmWipeWorkspace: (callback: () => void) => { callback(); @@ -169,9 +169,9 @@ describe('search_bar', () => { // pick the button component out of the tree because // it's part of a popover and thus not covered by enzyme - (instance - .find(QueryStringInput) - .prop('prepend') as ReactElement).props.children.props.onClick(); + ( + instance.find(QueryStringInput).prop('prepend') as ReactElement + ).props.children.props.onClick(); expect(openSourceModal).toHaveBeenCalled(); }); diff --git a/x-pack/plugins/graph/public/components/search_bar.tsx b/x-pack/plugins/graph/public/components/search_bar.tsx index fc7e3be3d0d37..57e9831d5a656 100644 --- a/x-pack/plugins/graph/public/components/search_bar.tsx +++ b/x-pack/plugins/graph/public/components/search_bar.tsx @@ -81,9 +81,10 @@ export function SearchBarComponent(props: SearchBarStateProps & SearchBarProps) } = props; const [query, setQuery] = useState({ language: 'kuery', query: urlQuery || '' }); - useEffect(() => setQuery((prev) => ({ language: prev.language, query: urlQuery || '' })), [ - urlQuery, - ]); + useEffect( + () => setQuery((prev) => ({ language: prev.language, query: urlQuery || '' })), + [urlQuery] + ); useEffect(() => { async function fetchPattern() { diff --git a/x-pack/plugins/graph/public/components/workspace_layout/workspace_top_nav_menu.tsx b/x-pack/plugins/graph/public/components/workspace_layout/workspace_top_nav_menu.tsx index 07e21287e5c16..dc7365672ffa2 100644 --- a/x-pack/plugins/graph/public/components/workspace_layout/workspace_top_nav_menu.tsx +++ b/x-pack/plugins/graph/public/components/workspace_layout/workspace_top_nav_menu.tsx @@ -136,12 +136,12 @@ export const WorkspaceTopNavMenu = (props: WorkspaceTopNavMenuProps) => { // since settings button will be disabled only if workspace was set const workspace = props.workspace as Workspace; - const settingsObservable = (asSyncedObservable(() => ({ + const settingsObservable = asSyncedObservable(() => ({ blocklistedNodes: workspace.blocklistedNodes, unblockNode: workspace.unblockNode, unblockAll: workspace.unblockAll, canEditDrillDownUrls: props.canEditDrillDownUrls, - })) as unknown) as AsObservable['observable']; + })) as unknown as AsObservable['observable']; props.coreStart.overlays.openFlyout( toMountPoint( diff --git a/x-pack/plugins/graph/public/helpers/kql_encoder.test.ts b/x-pack/plugins/graph/public/helpers/kql_encoder.test.ts index 4cf46e18c8fa7..8ef3cd44a63b7 100644 --- a/x-pack/plugins/graph/public/helpers/kql_encoder.test.ts +++ b/x-pack/plugins/graph/public/helpers/kql_encoder.test.ts @@ -12,7 +12,7 @@ describe('kql_encoder', () => { let workspaceMock: jest.Mocked; beforeEach(() => { - workspaceMock = ({ + workspaceMock = { returnUnpackedGroupeds: (nodes: []) => nodes, getSelectedOrAllNodes: jest.fn(() => [ { @@ -34,7 +34,7 @@ describe('kql_encoder', () => { }, }, ]), - } as unknown) as jest.Mocked; + } as unknown as jest.Mocked; }); it('should encode query as URI component', () => { diff --git a/x-pack/plugins/graph/public/helpers/use_workspace_loader.test.tsx b/x-pack/plugins/graph/public/helpers/use_workspace_loader.test.tsx index db80289d0d32d..cd0857f82ab6b 100644 --- a/x-pack/plugins/graph/public/helpers/use_workspace_loader.test.tsx +++ b/x-pack/plugins/graph/public/helpers/use_workspace_loader.test.tsx @@ -33,13 +33,13 @@ jest.mock('react-router-dom', () => { }; }); -const mockSavedObjectsClient = ({ +const mockSavedObjectsClient = { resolve: jest.fn().mockResolvedValue({ saved_object: { id: 10, _version: '7.15.0', attributes: { wsState: '{}' } }, outcome: 'exactMatch', }), find: jest.fn().mockResolvedValue({ title: 'test' }), -} as unknown) as SavedObjectsClientCommon; +} as unknown as SavedObjectsClientCommon; async function setup(props: UseWorkspaceLoaderProps) { const returnVal = {}; @@ -66,7 +66,7 @@ describe('use_workspace_loader', () => { it('should not redirect if outcome is exactMatch', async () => { await act(async () => { - await setup((defaultProps as unknown) as UseWorkspaceLoaderProps); + await setup(defaultProps as unknown as UseWorkspaceLoaderProps); }); expect(defaultProps.spaces.ui.redirectLegacyUrl).not.toHaveBeenCalled(); expect(defaultProps.store.dispatch).toHaveBeenCalled(); @@ -85,7 +85,7 @@ describe('use_workspace_loader', () => { }, }; await act(async () => { - await setup((props as unknown) as UseWorkspaceLoaderProps); + await setup(props as unknown as UseWorkspaceLoaderProps); }); expect(props.spaces.ui.redirectLegacyUrl).toHaveBeenCalledWith( '#/workspace/aliasTargetId?query={}', diff --git a/x-pack/plugins/graph/public/plugin.ts b/x-pack/plugins/graph/public/plugin.ts index 1c44714a2c498..a1bc8a93f7f7a 100644 --- a/x-pack/plugins/graph/public/plugin.ts +++ b/x-pack/plugins/graph/public/plugin.ts @@ -49,7 +49,8 @@ export interface GraphPluginStartDependencies { } export class GraphPlugin - implements Plugin { + implements Plugin +{ private readonly appUpdater$ = new BehaviorSubject(() => ({})); constructor(private initializerContext: PluginInitializerContext) {} diff --git a/x-pack/plugins/graph/public/services/persistence/serialize.test.ts b/x-pack/plugins/graph/public/services/persistence/serialize.test.ts index 2466582bc7b25..ec52159ae10e2 100644 --- a/x-pack/plugins/graph/public/services/persistence/serialize.test.ts +++ b/x-pack/plugins/graph/public/services/persistence/serialize.test.ts @@ -159,7 +159,7 @@ describe('serialize', () => { }); it('should serialize given workspace', () => { - const savedWorkspace = ({} as unknown) as GraphWorkspaceSavedObject; + const savedWorkspace = {} as unknown as GraphWorkspaceSavedObject; appStateToSavedWorkspace(savedWorkspace, appState, true); @@ -281,7 +281,7 @@ describe('serialize', () => { }); it('should not save data if set to false', () => { - const savedWorkspace = ({} as unknown) as GraphWorkspaceSavedObject; + const savedWorkspace = {} as unknown as GraphWorkspaceSavedObject; appStateToSavedWorkspace(savedWorkspace, appState, false); diff --git a/x-pack/plugins/graph/public/state_management/helpers.ts b/x-pack/plugins/graph/public/state_management/helpers.ts index 098c1e029be8f..db853afc9f147 100644 --- a/x-pack/plugins/graph/public/state_management/helpers.ts +++ b/x-pack/plugins/graph/public/state_management/helpers.ts @@ -25,5 +25,7 @@ export type InferActionType = X extends ActionCreator ? T : never; * * @param actionCreators The action creators to create a unified matcher for */ -export const matchesOne = (...actionCreators: Array>) => (action: AnyAction) => - actionCreators.some((actionCreator) => actionCreator.match(action)); +export const matchesOne = + (...actionCreators: Array>) => + (action: AnyAction) => + actionCreators.some((actionCreator) => actionCreator.match(action)); diff --git a/x-pack/plugins/graph/public/state_management/mocks.ts b/x-pack/plugins/graph/public/state_management/mocks.ts index 189875d04b015..6f7b5dba2e4a1 100644 --- a/x-pack/plugins/graph/public/state_management/mocks.ts +++ b/x-pack/plugins/graph/public/state_management/mocks.ts @@ -40,48 +40,48 @@ export function createMockGraphStore({ mockedDepsOverwrites?: Partial>; initialStateOverwrites?: Partial; }): MockedGraphEnvironment { - const workspaceMock = ({ + const workspaceMock = { runLayout: jest.fn(), nodes: [], edges: [], options: {}, blocklistedNodes: [], - } as unknown) as Workspace; + } as unknown as Workspace; const mockedDeps: jest.Mocked = { basePath: '', addBasePath: jest.fn((url: string) => url), changeUrl: jest.fn(), - chrome: ({ + chrome: { setBreadcrumbs: jest.fn(), - } as unknown) as ChromeStart, + } as unknown as ChromeStart, createWorkspace: jest.fn(), getWorkspace: jest.fn(() => workspaceMock), indexPatternProvider: { get: jest.fn(() => - Promise.resolve(({ id: '123', title: 'test-pattern' } as unknown) as IndexPattern) + Promise.resolve({ id: '123', title: 'test-pattern' } as unknown as IndexPattern) ), }, I18nContext: jest .fn() .mockImplementation(({ children }: { children: React.ReactNode }) => children), - notifications: ({ + notifications: { toasts: { addDanger: jest.fn(), addSuccess: jest.fn(), }, - } as unknown) as NotificationsStart, + } as unknown as NotificationsStart, http: {} as HttpStart, notifyReact: jest.fn(), savePolicy: 'configAndData', showSaveModal: jest.fn(), - overlays: ({ + overlays: { openModal: jest.fn(), - } as unknown) as OverlayStart, - savedObjectsClient: ({ + } as unknown as OverlayStart, + savedObjectsClient: { find: jest.fn(), get: jest.fn(), - } as unknown) as SavedObjectsClientContract, + } as unknown as SavedObjectsClientContract, handleSearchQueryError: jest.fn(), ...mockedDepsOverwrites, }; diff --git a/x-pack/plugins/graph/public/state_management/url_templates.ts b/x-pack/plugins/graph/public/state_management/url_templates.ts index 01b1a9296b0b6..736270e53a797 100644 --- a/x-pack/plugins/graph/public/state_management/url_templates.ts +++ b/x-pack/plugins/graph/public/state_management/url_templates.ts @@ -23,9 +23,8 @@ import { matchesOne } from './helpers'; const actionCreator = actionCreatorFactory('x-pack/graph/urlTemplates'); export const loadTemplates = actionCreator('LOAD_TEMPLATES'); -export const saveTemplate = actionCreator<{ index: number; template: UrlTemplate }>( - 'SAVE_TEMPLATE' -); +export const saveTemplate = + actionCreator<{ index: number; template: UrlTemplate }>('SAVE_TEMPLATE'); export const removeTemplate = actionCreator('REMOVE_TEMPLATE'); export type UrlTemplatesState = UrlTemplate[]; diff --git a/x-pack/plugins/graph/server/sample_data/ecommerce.ts b/x-pack/plugins/graph/server/sample_data/ecommerce.ts index e8383ea542dbd..36e125864600d 100644 --- a/x-pack/plugins/graph/server/sample_data/ecommerce.ts +++ b/x-pack/plugins/graph/server/sample_data/ecommerce.ts @@ -335,8 +335,7 @@ const wsState: any = { ], urlTemplates: [ { - url: - '/app/discover#/?_a=(columns%3A!(_source)%2Cindex%3Aff959d40-b880-11e8-a6d9-e546fe2bba5f%2Cinterval%3Aauto%2Cquery%3A(language%3Akuery%2Cquery%3A{{gquery}})%2Csort%3A!(_score%2Cdesc))', + url: '/app/discover#/?_a=(columns%3A!(_source)%2Cindex%3Aff959d40-b880-11e8-a6d9-e546fe2bba5f%2Cinterval%3Aauto%2Cquery%3A(language%3Akuery%2Cquery%3A{{gquery}})%2Csort%3A!(_score%2Cdesc))', description: 'Raw documents', isDefault: true, encoderID: 'kql-loose', diff --git a/x-pack/plugins/graph/server/sample_data/flights.ts b/x-pack/plugins/graph/server/sample_data/flights.ts index d62b4e77e3251..61beacc3552f7 100644 --- a/x-pack/plugins/graph/server/sample_data/flights.ts +++ b/x-pack/plugins/graph/server/sample_data/flights.ts @@ -1589,8 +1589,7 @@ const wsState: any = { ], urlTemplates: [ { - url: - '/app/discover#/?_a=(columns%3A!(_source)%2Cindex%3Ad3d7af60-4c81-11e8-b3d7-01146121b73d%2Cinterval%3Aauto%2Cquery%3A(language%3Akuery%2Cquery%3A{{gquery}})%2Csort%3A!(_score%2Cdesc))', + url: '/app/discover#/?_a=(columns%3A!(_source)%2Cindex%3Ad3d7af60-4c81-11e8-b3d7-01146121b73d%2Cinterval%3Aauto%2Cquery%3A(language%3Akuery%2Cquery%3A{{gquery}})%2Csort%3A!(_score%2Cdesc))', description: 'Raw documents', isDefault: true, encoderID: 'kql-loose', diff --git a/x-pack/plugins/graph/server/sample_data/logs.ts b/x-pack/plugins/graph/server/sample_data/logs.ts index bd9b3a5c35097..d3d9c18a309e1 100644 --- a/x-pack/plugins/graph/server/sample_data/logs.ts +++ b/x-pack/plugins/graph/server/sample_data/logs.ts @@ -176,8 +176,7 @@ const wsState: any = { 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.50 Safari/534.24', color: '#CE0060', field: 'agent.keyword', - term: - 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.50 Safari/534.24', + term: 'Mozilla/5.0 (X11; Linux i686) AppleWebKit/534.24 (KHTML, like Gecko) Chrome/11.0.696.50 Safari/534.24', parent: null, size: 15, }, @@ -407,8 +406,7 @@ const wsState: any = { ], urlTemplates: [ { - url: - '/app/discover#/?_a=(columns%3A!(_source)%2Cindex%3A%2790943e30-9a47-11e8-b64d-95841ca0b247%27%2Cinterval%3Aauto%2Cquery%3A(language%3Akuery%2Cquery%3A{{gquery}})%2Csort%3A!(_score%2Cdesc))', + url: '/app/discover#/?_a=(columns%3A!(_source)%2Cindex%3A%2790943e30-9a47-11e8-b64d-95841ca0b247%27%2Cinterval%3Aauto%2Cquery%3A(language%3Akuery%2Cquery%3A{{gquery}})%2Csort%3A!(_score%2Cdesc))', description: 'Raw documents', isDefault: true, encoderID: 'kql-loose', diff --git a/x-pack/plugins/grokdebugger/server/routes/api/grokdebugger/register_grok_simulate_route.ts b/x-pack/plugins/grokdebugger/server/routes/api/grokdebugger/register_grok_simulate_route.ts index 7483e266a1ac9..1f2927436d4ae 100644 --- a/x-pack/plugins/grokdebugger/server/routes/api/grokdebugger/register_grok_simulate_route.ts +++ b/x-pack/plugins/grokdebugger/server/routes/api/grokdebugger/register_grok_simulate_route.ts @@ -35,9 +35,10 @@ export function registerGrokSimulateRoute(framework: KibanaFramework) { async (requestContext, request, response) => { try { const grokdebuggerRequest = GrokdebuggerRequest.fromDownstreamJSON(request.body); - const simulateResponseFromES = await requestContext.core.elasticsearch.client.asCurrentUser.ingest.simulate( - { body: grokdebuggerRequest.upstreamJSON } - ); + const simulateResponseFromES = + await requestContext.core.elasticsearch.client.asCurrentUser.ingest.simulate({ + body: grokdebuggerRequest.upstreamJSON, + }); const grokdebuggerResponse = GrokdebuggerResponse.fromUpstreamJSON( simulateResponseFromES.body ); diff --git a/x-pack/plugins/index_lifecycle_management/__jest__/client_integration/edit_policy/constants.ts b/x-pack/plugins/index_lifecycle_management/__jest__/client_integration/edit_policy/constants.ts index 90fff3a187355..f57f351ae0831 100644 --- a/x-pack/plugins/index_lifecycle_management/__jest__/client_integration/edit_policy/constants.ts +++ b/x-pack/plugins/index_lifecycle_management/__jest__/client_integration/edit_policy/constants.ts @@ -181,7 +181,7 @@ export const POLICY_WITH_NODE_ROLE_ALLOCATION: PolicyFromES = { name: POLICY_NAME, }; -export const POLICY_WITH_KNOWN_AND_UNKNOWN_FIELDS = ({ +export const POLICY_WITH_KNOWN_AND_UNKNOWN_FIELDS = { version: 1, modified_date: Date.now().toString(), policy: { @@ -219,7 +219,7 @@ export const POLICY_WITH_KNOWN_AND_UNKNOWN_FIELDS = ({ name: POLICY_NAME, }, name: POLICY_NAME, -} as any) as PolicyFromES; +} as any as PolicyFromES; export const getGeneratedPolicies = (): PolicyFromES[] => { const policy = { diff --git a/x-pack/plugins/index_lifecycle_management/__jest__/client_integration/helpers/actions/errors_actions.ts b/x-pack/plugins/index_lifecycle_management/__jest__/client_integration/helpers/actions/errors_actions.ts index 7acc6a3e2f26b..34d07d4a36ff9 100644 --- a/x-pack/plugins/index_lifecycle_management/__jest__/client_integration/helpers/actions/errors_actions.ts +++ b/x-pack/plugins/index_lifecycle_management/__jest__/client_integration/helpers/actions/errors_actions.ts @@ -17,17 +17,15 @@ const createWaitForValidationAction = (testBed: TestBed) => () => { component.update(); }; -const createExpectMessagesAction = (testBed: TestBed) => ( - expectedMessages: string[], - phase?: Phase -) => { - const { form } = testBed; - if (phase) { - expect(form.getErrorsMessages(`${phase}-phase`)).toEqual(expectedMessages); - } else { - expect(form.getErrorsMessages()).toEqual(expectedMessages); - } -}; +const createExpectMessagesAction = + (testBed: TestBed) => (expectedMessages: string[], phase?: Phase) => { + const { form } = testBed; + if (phase) { + expect(form.getErrorsMessages(`${phase}-phase`)).toEqual(expectedMessages); + } else { + expect(form.getErrorsMessages()).toEqual(expectedMessages); + } + }; export const createErrorsActions = (testBed: TestBed) => { const { exists } = testBed; diff --git a/x-pack/plugins/index_lifecycle_management/__jest__/client_integration/helpers/actions/forcemerge_actions.ts b/x-pack/plugins/index_lifecycle_management/__jest__/client_integration/helpers/actions/forcemerge_actions.ts index 400f3d2070e6a..f2a27aba9ec56 100644 --- a/x-pack/plugins/index_lifecycle_management/__jest__/client_integration/helpers/actions/forcemerge_actions.ts +++ b/x-pack/plugins/index_lifecycle_management/__jest__/client_integration/helpers/actions/forcemerge_actions.ts @@ -11,15 +11,14 @@ import { Phase } from '../../../../common/types'; import { createFormToggleAction } from './form_toggle_action'; import { createFormSetValueAction } from './form_set_value_action'; -const createFormCheckboxAction = (testBed: TestBed, dataTestSubject: string) => async ( - checked: boolean -) => { - const { form, component } = testBed; - await act(async () => { - form.selectCheckBox(dataTestSubject, checked); - }); - component.update(); -}; +const createFormCheckboxAction = + (testBed: TestBed, dataTestSubject: string) => async (checked: boolean) => { + const { form, component } = testBed; + await act(async () => { + form.selectCheckBox(dataTestSubject, checked); + }); + component.update(); + }; export const createForceMergeActions = (testBed: TestBed, phase: Phase) => { const { exists } = testBed; diff --git a/x-pack/plugins/index_lifecycle_management/__jest__/client_integration/helpers/actions/form_toggle_and_set_value_action.ts b/x-pack/plugins/index_lifecycle_management/__jest__/client_integration/helpers/actions/form_toggle_and_set_value_action.ts index 643e0f23a9dea..b3510466b4b90 100644 --- a/x-pack/plugins/index_lifecycle_management/__jest__/client_integration/helpers/actions/form_toggle_and_set_value_action.ts +++ b/x-pack/plugins/index_lifecycle_management/__jest__/client_integration/helpers/actions/form_toggle_and_set_value_action.ts @@ -9,14 +9,11 @@ import { TestBed } from '@kbn/test/jest'; import { createFormToggleAction } from './form_toggle_action'; import { createFormSetValueAction } from './form_set_value_action'; -export const createFormToggleAndSetValueAction = ( - testBed: TestBed, - toggleSelector: string, - inputSelector: string -) => async (value: string) => { - const { exists } = testBed; - if (!exists(inputSelector)) { - await createFormToggleAction(testBed, toggleSelector)(); - } - await createFormSetValueAction(testBed, inputSelector)(value); -}; +export const createFormToggleAndSetValueAction = + (testBed: TestBed, toggleSelector: string, inputSelector: string) => async (value: string) => { + const { exists } = testBed; + if (!exists(inputSelector)) { + await createFormToggleAction(testBed, toggleSelector)(); + } + await createFormSetValueAction(testBed, inputSelector)(value); + }; diff --git a/x-pack/plugins/index_lifecycle_management/__jest__/client_integration/helpers/actions/rollover_actions.ts b/x-pack/plugins/index_lifecycle_management/__jest__/client_integration/helpers/actions/rollover_actions.ts index 798b74e40055f..93a1b959ec969 100644 --- a/x-pack/plugins/index_lifecycle_management/__jest__/client_integration/helpers/actions/rollover_actions.ts +++ b/x-pack/plugins/index_lifecycle_management/__jest__/client_integration/helpers/actions/rollover_actions.ts @@ -10,29 +10,27 @@ import { TestBed } from '@kbn/test/jest'; import { createFormToggleAction } from './form_toggle_action'; import { createFormSetValueAction } from './form_set_value_action'; -const createSetPrimaryShardSizeAction = (testBed: TestBed) => async ( - value: string, - units?: string -) => { - const { find, component } = testBed; +const createSetPrimaryShardSizeAction = + (testBed: TestBed) => async (value: string, units?: string) => { + const { find, component } = testBed; - await act(async () => { - find('hot-selectedMaxPrimaryShardSize').simulate('change', { target: { value } }); - }); - component.update(); - - if (units) { - act(() => { - find('hot-selectedMaxPrimaryShardSize.show-filters-button').simulate('click'); + await act(async () => { + find('hot-selectedMaxPrimaryShardSize').simulate('change', { target: { value } }); }); component.update(); - act(() => { - find(`hot-selectedMaxPrimaryShardSize.filter-option-${units}`).simulate('click'); - }); - component.update(); - } -}; + if (units) { + act(() => { + find('hot-selectedMaxPrimaryShardSize.show-filters-button').simulate('click'); + }); + component.update(); + + act(() => { + find(`hot-selectedMaxPrimaryShardSize.filter-option-${units}`).simulate('click'); + }); + component.update(); + } + }; const createSetMaxAgeAction = (testBed: TestBed) => async (value: string, units?: string) => { const { find, component } = testBed; diff --git a/x-pack/plugins/index_lifecycle_management/__jest__/policy_table.test.tsx b/x-pack/plugins/index_lifecycle_management/__jest__/policy_table.test.tsx index 820f8393d933d..cf25b1c335ae9 100644 --- a/x-pack/plugins/index_lifecycle_management/__jest__/policy_table.test.tsx +++ b/x-pack/plugins/index_lifecycle_management/__jest__/policy_table.test.tsx @@ -137,7 +137,7 @@ describe('policy table', () => { test('filters based on content of search input', () => { const rendered = mountWithIntl(component); const searchInput = rendered.find('.euiFieldSearch').first(); - ((searchInput.instance() as unknown) as HTMLInputElement).value = 'testy0'; + (searchInput.instance() as unknown as HTMLInputElement).value = 'testy0'; searchInput.simulate('keyup', { key: 'Enter', keyCode: 13, which: 13 }); rendered.update(); snapshot(getPolicyNames(rendered)); diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/phases/shared_fields/data_tier_allocation_field/components/data_tier_allocation.tsx b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/phases/shared_fields/data_tier_allocation_field/components/data_tier_allocation.tsx index 1eeb32d84f677..6ca0324d8972d 100644 --- a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/phases/shared_fields/data_tier_allocation_field/components/data_tier_allocation.tsx +++ b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/phases/shared_fields/data_tier_allocation_field/components/data_tier_allocation.tsx @@ -161,13 +161,8 @@ const getSelectOptions = (phase: PhaseWithAllocation, disableDataTierOption: boo ].filter(Boolean) as SelectOptions[]; export const DataTierAllocation: FunctionComponent = (props) => { - const { - phase, - hasNodeAttributes, - isCloudEnabled, - isUsingDeprecatedDataRoleConfig, - isLoading, - } = props; + const { phase, hasNodeAttributes, isCloudEnabled, isUsingDeprecatedDataRoleConfig, isLoading } = + props; /** * On Cloud we want to disable the data tier allocation option when we detect that we are not diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/phases/shared_fields/min_age_field/min_age_field.tsx b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/phases/shared_fields/min_age_field/min_age_field.tsx index ad92ef2d44479..2c42d76415dbc 100644 --- a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/phases/shared_fields/min_age_field/min_age_field.tsx +++ b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/components/phases/shared_fields/min_age_field/min_age_field.tsx @@ -86,9 +86,8 @@ export const MinAgeField: FunctionComponent = ({ phase }): React.ReactEle const { isUsingRollover } = useConfiguration(); const globalFields = useGlobalFields(); - const { setValue: setMillisecondValue } = globalFields[ - `${phase}MinAgeMilliSeconds` as 'coldMinAgeMilliSeconds' - ]; + const { setValue: setMillisecondValue } = + globalFields[`${phase}MinAgeMilliSeconds` as 'coldMinAgeMilliSeconds']; const [formData] = useFormData({ watch: [minAgeValuePath, minAgeUnitPath] }); const minAgeValue = get(formData, minAgeValuePath); const minAgeUnit = get(formData, minAgeUnitPath); @@ -153,9 +152,8 @@ export const MinAgeField: FunctionComponent = ({ phase }): React.ReactEle {(unitField) => { - const { isInvalid: isUnitFieldInvalid } = getFieldValidityAndErrorMessage( - unitField - ); + const { isInvalid: isUnitFieldInvalid } = + getFieldValidityAndErrorMessage(unitField); const icon = ( <> {/* This element is rendered for testing purposes only */} @@ -167,11 +165,10 @@ export const MinAgeField: FunctionComponent = ({ phase }): React.ReactEle /> ); - const selectAppendValue: Array< - string | React.ReactElement - > = isUsingRollover - ? [i18nTexts.minAgeUnitFieldSuffix, icon] - : [i18nTexts.minAgeUnitFieldSuffix]; + const selectAppendValue: Array = + isUsingRollover + ? [i18nTexts.minAgeUnitFieldSuffix, icon] + : [i18nTexts.minAgeUnitFieldSuffix]; return ( (fieldPath: string): boolean => - fieldPath.startsWith(`phases.${phase}`) || fieldPath.startsWith(`_meta.${phase}`); +const isXPhaseField = + (phase: keyof Phases) => + (fieldPath: string): boolean => + fieldPath.startsWith(`phases.${phase}`) || fieldPath.startsWith(`_meta.${phase}`); const isHotPhaseField = isXPhaseField('hot'); const isWarmPhaseField = isXPhaseField('warm'); diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/form/deserializer.ts b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/form/deserializer.ts index ddb21dba90157..dc3714bdaf8da 100644 --- a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/form/deserializer.ts +++ b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/form/deserializer.ts @@ -14,133 +14,133 @@ import { getDefaultRepository } from '../lib'; import { FormInternal } from '../types'; import { CLOUD_DEFAULT_REPO } from '../constants'; -export const createDeserializer = (isCloudEnabled: boolean) => ( - policy: SerializedPolicy -): FormInternal => { - const { - phases: { hot, warm, cold, frozen, delete: deletePhase }, - } = policy; +export const createDeserializer = + (isCloudEnabled: boolean) => + (policy: SerializedPolicy): FormInternal => { + const { + phases: { hot, warm, cold, frozen, delete: deletePhase }, + } = policy; - let defaultRepository = getDefaultRepository([ - hot?.actions.searchable_snapshot, - cold?.actions.searchable_snapshot, - frozen?.actions.searchable_snapshot, - ]); + let defaultRepository = getDefaultRepository([ + hot?.actions.searchable_snapshot, + cold?.actions.searchable_snapshot, + frozen?.actions.searchable_snapshot, + ]); - if (!defaultRepository && isCloudEnabled) { - defaultRepository = CLOUD_DEFAULT_REPO; - } + if (!defaultRepository && isCloudEnabled) { + defaultRepository = CLOUD_DEFAULT_REPO; + } - const _meta: FormInternal['_meta'] = { - hot: { - isUsingDefaultRollover: isUsingDefaultRollover(policy), - customRollover: { - enabled: Boolean(hot?.actions?.rollover), + const _meta: FormInternal['_meta'] = { + hot: { + isUsingDefaultRollover: isUsingDefaultRollover(policy), + customRollover: { + enabled: Boolean(hot?.actions?.rollover), + }, + bestCompression: hot?.actions?.forcemerge?.index_codec === 'best_compression', + readonlyEnabled: Boolean(hot?.actions?.readonly), }, - bestCompression: hot?.actions?.forcemerge?.index_codec === 'best_compression', - readonlyEnabled: Boolean(hot?.actions?.readonly), - }, - warm: { - enabled: Boolean(warm), - warmPhaseOnRollover: warm === undefined ? true : Boolean(warm.min_age === '0ms'), - bestCompression: warm?.actions?.forcemerge?.index_codec === 'best_compression', - dataTierAllocationType: determineDataTierAllocationType(warm?.actions), - readonlyEnabled: Boolean(warm?.actions?.readonly), - minAgeToMilliSeconds: -1, - }, - cold: { - enabled: Boolean(cold), - dataTierAllocationType: determineDataTierAllocationType(cold?.actions), - freezeEnabled: Boolean(cold?.actions?.freeze), - readonlyEnabled: Boolean(cold?.actions?.readonly), - minAgeToMilliSeconds: -1, - }, - frozen: { - enabled: Boolean(frozen), - dataTierAllocationType: determineDataTierAllocationType(frozen?.actions), - freezeEnabled: Boolean(frozen?.actions?.freeze), - minAgeToMilliSeconds: -1, - }, - delete: { - enabled: Boolean(deletePhase), - minAgeToMilliSeconds: -1, - }, - searchableSnapshot: { - repository: defaultRepository, - }, - }; + warm: { + enabled: Boolean(warm), + warmPhaseOnRollover: warm === undefined ? true : Boolean(warm.min_age === '0ms'), + bestCompression: warm?.actions?.forcemerge?.index_codec === 'best_compression', + dataTierAllocationType: determineDataTierAllocationType(warm?.actions), + readonlyEnabled: Boolean(warm?.actions?.readonly), + minAgeToMilliSeconds: -1, + }, + cold: { + enabled: Boolean(cold), + dataTierAllocationType: determineDataTierAllocationType(cold?.actions), + freezeEnabled: Boolean(cold?.actions?.freeze), + readonlyEnabled: Boolean(cold?.actions?.readonly), + minAgeToMilliSeconds: -1, + }, + frozen: { + enabled: Boolean(frozen), + dataTierAllocationType: determineDataTierAllocationType(frozen?.actions), + freezeEnabled: Boolean(frozen?.actions?.freeze), + minAgeToMilliSeconds: -1, + }, + delete: { + enabled: Boolean(deletePhase), + minAgeToMilliSeconds: -1, + }, + searchableSnapshot: { + repository: defaultRepository, + }, + }; - return produce( - { - ...policy, - _meta, - }, - (draft: FormInternal) => { - if (draft.phases.hot?.actions?.rollover) { - if (draft.phases.hot.actions.rollover.max_size) { - const maxSize = splitSizeAndUnits(draft.phases.hot.actions.rollover.max_size); - draft.phases.hot.actions.rollover.max_size = maxSize.size; - draft._meta.hot.customRollover.maxStorageSizeUnit = maxSize.units; - } + return produce( + { + ...policy, + _meta, + }, + (draft: FormInternal) => { + if (draft.phases.hot?.actions?.rollover) { + if (draft.phases.hot.actions.rollover.max_size) { + const maxSize = splitSizeAndUnits(draft.phases.hot.actions.rollover.max_size); + draft.phases.hot.actions.rollover.max_size = maxSize.size; + draft._meta.hot.customRollover.maxStorageSizeUnit = maxSize.units; + } - if (draft.phases.hot.actions.rollover.max_primary_shard_size) { - const maxPrimaryShardSize = splitSizeAndUnits( - draft.phases.hot.actions.rollover.max_primary_shard_size - ); - draft.phases.hot.actions.rollover.max_primary_shard_size = maxPrimaryShardSize.size; - draft._meta.hot.customRollover.maxPrimaryShardSizeUnit = maxPrimaryShardSize.units; - } + if (draft.phases.hot.actions.rollover.max_primary_shard_size) { + const maxPrimaryShardSize = splitSizeAndUnits( + draft.phases.hot.actions.rollover.max_primary_shard_size + ); + draft.phases.hot.actions.rollover.max_primary_shard_size = maxPrimaryShardSize.size; + draft._meta.hot.customRollover.maxPrimaryShardSizeUnit = maxPrimaryShardSize.units; + } - if (draft.phases.hot.actions.rollover.max_age) { - const maxAge = splitSizeAndUnits(draft.phases.hot.actions.rollover.max_age); - draft.phases.hot.actions.rollover.max_age = maxAge.size; - draft._meta.hot.customRollover.maxAgeUnit = maxAge.units; + if (draft.phases.hot.actions.rollover.max_age) { + const maxAge = splitSizeAndUnits(draft.phases.hot.actions.rollover.max_age); + draft.phases.hot.actions.rollover.max_age = maxAge.size; + draft._meta.hot.customRollover.maxAgeUnit = maxAge.units; + } } - } - if (draft.phases.warm) { - if (draft.phases.warm.actions?.allocate?.require) { - Object.entries(draft.phases.warm.actions.allocate.require).forEach((entry) => { - draft._meta.warm.allocationNodeAttribute = entry.join(':'); - }); - } + if (draft.phases.warm) { + if (draft.phases.warm.actions?.allocate?.require) { + Object.entries(draft.phases.warm.actions.allocate.require).forEach((entry) => { + draft._meta.warm.allocationNodeAttribute = entry.join(':'); + }); + } - if (draft.phases.warm.min_age) { - const minAge = splitSizeAndUnits(draft.phases.warm.min_age); - draft.phases.warm.min_age = minAge.size; - draft._meta.warm.minAgeUnit = minAge.units; + if (draft.phases.warm.min_age) { + const minAge = splitSizeAndUnits(draft.phases.warm.min_age); + draft.phases.warm.min_age = minAge.size; + draft._meta.warm.minAgeUnit = minAge.units; + } } - } - if (draft.phases.cold) { - if (draft.phases.cold.actions?.allocate?.require) { - Object.entries(draft.phases.cold.actions.allocate.require).forEach((entry) => { - draft._meta.cold.allocationNodeAttribute = entry.join(':'); - }); - } + if (draft.phases.cold) { + if (draft.phases.cold.actions?.allocate?.require) { + Object.entries(draft.phases.cold.actions.allocate.require).forEach((entry) => { + draft._meta.cold.allocationNodeAttribute = entry.join(':'); + }); + } - if (draft.phases.cold.min_age) { - const minAge = splitSizeAndUnits(draft.phases.cold.min_age); - draft.phases.cold.min_age = minAge.size; - draft._meta.cold.minAgeUnit = minAge.units; + if (draft.phases.cold.min_age) { + const minAge = splitSizeAndUnits(draft.phases.cold.min_age); + draft.phases.cold.min_age = minAge.size; + draft._meta.cold.minAgeUnit = minAge.units; + } } - } - if (draft.phases.frozen) { - if (draft.phases.frozen.min_age) { - const minAge = splitSizeAndUnits(draft.phases.frozen.min_age); - draft.phases.frozen.min_age = minAge.size; - draft._meta.frozen.minAgeUnit = minAge.units; + if (draft.phases.frozen) { + if (draft.phases.frozen.min_age) { + const minAge = splitSizeAndUnits(draft.phases.frozen.min_age); + draft.phases.frozen.min_age = minAge.size; + draft._meta.frozen.minAgeUnit = minAge.units; + } } - } - if (draft.phases.delete) { - if (draft.phases.delete.min_age) { - const minAge = splitSizeAndUnits(draft.phases.delete.min_age); - draft.phases.delete.min_age = minAge.size; - draft._meta.delete.minAgeUnit = minAge.units; + if (draft.phases.delete) { + if (draft.phases.delete.min_age) { + const minAge = splitSizeAndUnits(draft.phases.delete.min_age); + draft.phases.delete.min_age = minAge.size; + draft._meta.delete.minAgeUnit = minAge.units; + } } } - } - ); -}; + ); + }; diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/form/global_fields_context.tsx b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/form/global_fields_context.tsx index 94b804c1ce532..5834fe5b9ea77 100644 --- a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/form/global_fields_context.tsx +++ b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/form/global_fields_context.tsx @@ -26,29 +26,27 @@ type GlobalFields = { const GlobalFieldsContext = createContext(null); -export const globalFields: Record< - keyof GlobalFields, - { path: string; config?: FieldConfig } -> = { - deleteEnabled: { - path: '_meta.delete.enabled', - }, - searchableSnapshotRepo: { - path: '_meta.searchableSnapshot.repository', - }, - warmMinAgeMilliSeconds: { - path: '_meta.warm.minAgeToMilliSeconds', - }, - coldMinAgeMilliSeconds: { - path: '_meta.cold.minAgeToMilliSeconds', - }, - frozenMinAgeMilliSeconds: { - path: '_meta.frozen.minAgeToMilliSeconds', - }, - deleteMinAgeMilliSeconds: { - path: '_meta.delete.minAgeToMilliSeconds', - }, -}; +export const globalFields: Record }> = + { + deleteEnabled: { + path: '_meta.delete.enabled', + }, + searchableSnapshotRepo: { + path: '_meta.searchableSnapshot.repository', + }, + warmMinAgeMilliSeconds: { + path: '_meta.warm.minAgeToMilliSeconds', + }, + coldMinAgeMilliSeconds: { + path: '_meta.cold.minAgeToMilliSeconds', + }, + frozenMinAgeMilliSeconds: { + path: '_meta.frozen.minAgeToMilliSeconds', + }, + deleteMinAgeMilliSeconds: { + path: '_meta.delete.minAgeToMilliSeconds', + }, + }; export const GlobalFieldsProvider: FunctionComponent = ({ children }) => { return ( diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/form/serializer/serializer.ts b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/form/serializer/serializer.ts index 2a7d21cce03bc..cf81468dd2b48 100644 --- a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/form/serializer/serializer.ts +++ b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/form/serializer/serializer.ts @@ -16,312 +16,312 @@ import { FormInternal } from '../../types'; import { serializeMigrateAndAllocateActions } from './serialize_migrate_and_allocate_actions'; -export const createSerializer = (originalPolicy?: SerializedPolicy) => ( - data: FormInternal -): SerializedPolicy => { - const { _meta, ...updatedPolicy } = data; - - updatedPolicy.phases = { hot: { actions: {} }, ...updatedPolicy.phases }; - - return produce(originalPolicy ?? defaultPolicy, (draft) => { - // Copy over all updated fields - merge(draft, updatedPolicy); - - /** - * Important shared values for serialization - */ - const isUsingRollover = Boolean( - _meta.hot?.isUsingDefaultRollover || _meta.hot?.customRollover.enabled - ); - - // Next copy over all meta fields and delete any fields that have been removed - // by fields exposed in the form. It is very important that we do not delete - // data that the form does not control! E.g., unfollow action in hot phase. - - /** - * HOT PHASE SERIALIZATION - */ - if (draft.phases.hot) { - draft.phases.hot.min_age = draft.phases.hot.min_age ?? '0ms'; - } - - if (draft.phases.hot?.actions) { - const hotPhaseActions = draft.phases.hot.actions; +export const createSerializer = + (originalPolicy?: SerializedPolicy) => + (data: FormInternal): SerializedPolicy => { + const { _meta, ...updatedPolicy } = data; + + updatedPolicy.phases = { hot: { actions: {} }, ...updatedPolicy.phases }; + + return produce(originalPolicy ?? defaultPolicy, (draft) => { + // Copy over all updated fields + merge(draft, updatedPolicy); /** - * HOT PHASE ROLLOVER + * Important shared values for serialization */ - if (isUsingRollover) { - if (_meta.hot?.isUsingDefaultRollover) { - hotPhaseActions.rollover = cloneDeep(defaultRolloverAction); - } else { - // Rollover may not exist if editing an existing policy with initially no rollover configured - if (!hotPhaseActions.rollover) { - hotPhaseActions.rollover = {}; - } + const isUsingRollover = Boolean( + _meta.hot?.isUsingDefaultRollover || _meta.hot?.customRollover.enabled + ); - // We are using user-defined, custom rollover settings. - if (updatedPolicy.phases.hot!.actions.rollover?.max_age) { - hotPhaseActions.rollover.max_age = `${hotPhaseActions.rollover.max_age}${_meta.hot?.customRollover.maxAgeUnit}`; + // Next copy over all meta fields and delete any fields that have been removed + // by fields exposed in the form. It is very important that we do not delete + // data that the form does not control! E.g., unfollow action in hot phase. + + /** + * HOT PHASE SERIALIZATION + */ + if (draft.phases.hot) { + draft.phases.hot.min_age = draft.phases.hot.min_age ?? '0ms'; + } + + if (draft.phases.hot?.actions) { + const hotPhaseActions = draft.phases.hot.actions; + + /** + * HOT PHASE ROLLOVER + */ + if (isUsingRollover) { + if (_meta.hot?.isUsingDefaultRollover) { + hotPhaseActions.rollover = cloneDeep(defaultRolloverAction); } else { - delete hotPhaseActions.rollover.max_age; + // Rollover may not exist if editing an existing policy with initially no rollover configured + if (!hotPhaseActions.rollover) { + hotPhaseActions.rollover = {}; + } + + // We are using user-defined, custom rollover settings. + if (updatedPolicy.phases.hot!.actions.rollover?.max_age) { + hotPhaseActions.rollover.max_age = `${hotPhaseActions.rollover.max_age}${_meta.hot?.customRollover.maxAgeUnit}`; + } else { + delete hotPhaseActions.rollover.max_age; + } + + if (typeof updatedPolicy.phases.hot!.actions.rollover?.max_docs !== 'number') { + delete hotPhaseActions.rollover.max_docs; + } + + if (updatedPolicy.phases.hot!.actions.rollover?.max_primary_shard_size) { + hotPhaseActions.rollover.max_primary_shard_size = `${hotPhaseActions.rollover.max_primary_shard_size}${_meta.hot?.customRollover.maxPrimaryShardSizeUnit}`; + } else { + delete hotPhaseActions.rollover.max_primary_shard_size; + } + + if (updatedPolicy.phases.hot!.actions.rollover?.max_size) { + hotPhaseActions.rollover.max_size = `${hotPhaseActions.rollover.max_size}${_meta.hot?.customRollover.maxStorageSizeUnit}`; + } else { + delete hotPhaseActions.rollover.max_size; + } } - if (typeof updatedPolicy.phases.hot!.actions.rollover?.max_docs !== 'number') { - delete hotPhaseActions.rollover.max_docs; + /** + * HOT PHASE FORCEMERGE + */ + if (!updatedPolicy.phases.hot!.actions?.forcemerge) { + delete hotPhaseActions.forcemerge; + } else if (_meta.hot?.bestCompression) { + hotPhaseActions.forcemerge!.index_codec = 'best_compression'; + } else { + delete hotPhaseActions.forcemerge!.index_codec; } - if (updatedPolicy.phases.hot!.actions.rollover?.max_primary_shard_size) { - hotPhaseActions.rollover.max_primary_shard_size = `${hotPhaseActions.rollover.max_primary_shard_size}${_meta.hot?.customRollover.maxPrimaryShardSizeUnit}`; - } else { - delete hotPhaseActions.rollover.max_primary_shard_size; + if (_meta.hot?.bestCompression && hotPhaseActions.forcemerge) { + hotPhaseActions.forcemerge.index_codec = 'best_compression'; } - if (updatedPolicy.phases.hot!.actions.rollover?.max_size) { - hotPhaseActions.rollover.max_size = `${hotPhaseActions.rollover.max_size}${_meta.hot?.customRollover.maxStorageSizeUnit}`; + /** + * HOT PHASE READ-ONLY + */ + if (_meta.hot?.readonlyEnabled) { + hotPhaseActions.readonly = hotPhaseActions.readonly ?? {}; } else { - delete hotPhaseActions.rollover.max_size; + delete hotPhaseActions.readonly; } + } else { + delete hotPhaseActions.rollover; + delete hotPhaseActions.forcemerge; + delete hotPhaseActions.readonly; } /** - * HOT PHASE FORCEMERGE + * HOT PHASE SET PRIORITY */ - if (!updatedPolicy.phases.hot!.actions?.forcemerge) { - delete hotPhaseActions.forcemerge; - } else if (_meta.hot?.bestCompression) { - hotPhaseActions.forcemerge!.index_codec = 'best_compression'; - } else { - delete hotPhaseActions.forcemerge!.index_codec; + if (!updatedPolicy.phases.hot!.actions?.set_priority) { + delete hotPhaseActions.set_priority; } - if (_meta.hot?.bestCompression && hotPhaseActions.forcemerge) { - hotPhaseActions.forcemerge.index_codec = 'best_compression'; + /** + * HOT PHASE SHRINK + */ + if (!updatedPolicy.phases.hot?.actions?.shrink) { + delete hotPhaseActions.shrink; } /** - * HOT PHASE READ-ONLY + * HOT PHASE SEARCHABLE SNAPSHOT */ - if (_meta.hot?.readonlyEnabled) { - hotPhaseActions.readonly = hotPhaseActions.readonly ?? {}; + if (updatedPolicy.phases.hot!.actions?.searchable_snapshot) { + hotPhaseActions.searchable_snapshot = { + ...hotPhaseActions.searchable_snapshot, + snapshot_repository: _meta.searchableSnapshot.repository, + }; } else { - delete hotPhaseActions.readonly; + delete hotPhaseActions.searchable_snapshot; } - } else { - delete hotPhaseActions.rollover; - delete hotPhaseActions.forcemerge; - delete hotPhaseActions.readonly; } /** - * HOT PHASE SET PRIORITY + * WARM PHASE SERIALIZATION */ - if (!updatedPolicy.phases.hot!.actions?.set_priority) { - delete hotPhaseActions.set_priority; - } + if (_meta.warm.enabled) { + draft.phases.warm!.actions = draft.phases.warm?.actions ?? {}; + const warmPhase = draft.phases.warm!; - /** - * HOT PHASE SHRINK - */ - if (!updatedPolicy.phases.hot?.actions?.shrink) { - delete hotPhaseActions.shrink; - } + /** + * WARM PHASE MIN AGE + * + */ + if (updatedPolicy.phases.warm?.min_age) { + warmPhase.min_age = `${updatedPolicy.phases.warm!.min_age}${_meta.warm.minAgeUnit}`; + } - /** - * HOT PHASE SEARCHABLE SNAPSHOT - */ - if (updatedPolicy.phases.hot!.actions?.searchable_snapshot) { - hotPhaseActions.searchable_snapshot = { - ...hotPhaseActions.searchable_snapshot, - snapshot_repository: _meta.searchableSnapshot.repository, - }; - } else { - delete hotPhaseActions.searchable_snapshot; - } - } + /** + * WARM PHASE DATA ALLOCATION + */ + warmPhase.actions = serializeMigrateAndAllocateActions( + _meta.warm, + warmPhase.actions, + originalPolicy?.phases.warm?.actions, + updatedPolicy.phases.warm?.actions?.allocate?.number_of_replicas + ); - /** - * WARM PHASE SERIALIZATION - */ - if (_meta.warm.enabled) { - draft.phases.warm!.actions = draft.phases.warm?.actions ?? {}; - const warmPhase = draft.phases.warm!; + /** + * WARM PHASE FORCEMERGE + */ + if (!updatedPolicy.phases.warm?.actions?.forcemerge) { + delete warmPhase.actions.forcemerge; + } else if (_meta.warm.bestCompression) { + warmPhase.actions.forcemerge!.index_codec = 'best_compression'; + } else { + delete warmPhase.actions.forcemerge!.index_codec; + } - /** - * WARM PHASE MIN AGE - * - */ - if (updatedPolicy.phases.warm?.min_age) { - warmPhase.min_age = `${updatedPolicy.phases.warm!.min_age}${_meta.warm.minAgeUnit}`; - } + /** + * WARM PHASE READ ONLY + */ + if (_meta.warm.readonlyEnabled) { + warmPhase.actions.readonly = warmPhase.actions.readonly ?? {}; + } else { + delete warmPhase.actions.readonly; + } - /** - * WARM PHASE DATA ALLOCATION - */ - warmPhase.actions = serializeMigrateAndAllocateActions( - _meta.warm, - warmPhase.actions, - originalPolicy?.phases.warm?.actions, - updatedPolicy.phases.warm?.actions?.allocate?.number_of_replicas - ); + /** + * WARM PHASE SET PRIORITY + */ + if (!updatedPolicy.phases.warm?.actions?.set_priority) { + delete warmPhase.actions.set_priority; + } - /** - * WARM PHASE FORCEMERGE - */ - if (!updatedPolicy.phases.warm?.actions?.forcemerge) { - delete warmPhase.actions.forcemerge; - } else if (_meta.warm.bestCompression) { - warmPhase.actions.forcemerge!.index_codec = 'best_compression'; + /** + * WARM PHASE SHRINK + */ + if (!updatedPolicy.phases.warm?.actions?.shrink) { + delete warmPhase.actions.shrink; + } } else { - delete warmPhase.actions.forcemerge!.index_codec; + delete draft.phases.warm; } /** - * WARM PHASE READ ONLY + * COLD PHASE SERIALIZATION */ - if (_meta.warm.readonlyEnabled) { - warmPhase.actions.readonly = warmPhase.actions.readonly ?? {}; - } else { - delete warmPhase.actions.readonly; - } + if (_meta.cold.enabled) { + draft.phases.cold!.actions = draft.phases.cold?.actions ?? {}; + const coldPhase = draft.phases.cold!; - /** - * WARM PHASE SET PRIORITY - */ - if (!updatedPolicy.phases.warm?.actions?.set_priority) { - delete warmPhase.actions.set_priority; - } + /** + * COLD PHASE MIN AGE + */ + if (updatedPolicy.phases.cold?.min_age) { + coldPhase.min_age = `${updatedPolicy.phases.cold!.min_age}${_meta.cold.minAgeUnit}`; + } - /** - * WARM PHASE SHRINK - */ - if (!updatedPolicy.phases.warm?.actions?.shrink) { - delete warmPhase.actions.shrink; - } - } else { - delete draft.phases.warm; - } + /** + * COLD PHASE DATA ALLOCATION + */ + coldPhase.actions = serializeMigrateAndAllocateActions( + _meta.cold, + coldPhase.actions, + originalPolicy?.phases.cold?.actions, + updatedPolicy.phases.cold?.actions?.allocate?.number_of_replicas + ); - /** - * COLD PHASE SERIALIZATION - */ - if (_meta.cold.enabled) { - draft.phases.cold!.actions = draft.phases.cold?.actions ?? {}; - const coldPhase = draft.phases.cold!; + /** + * COLD PHASE FREEZE + */ + if (_meta.cold.freezeEnabled) { + coldPhase.actions.freeze = coldPhase.actions.freeze ?? {}; + } else { + delete coldPhase.actions.freeze; + } - /** - * COLD PHASE MIN AGE - */ - if (updatedPolicy.phases.cold?.min_age) { - coldPhase.min_age = `${updatedPolicy.phases.cold!.min_age}${_meta.cold.minAgeUnit}`; - } + /** + * COLD PHASE READ ONLY + */ + if (_meta.cold.readonlyEnabled) { + coldPhase.actions.readonly = coldPhase.actions.readonly ?? {}; + } else { + delete coldPhase.actions.readonly; + } - /** - * COLD PHASE DATA ALLOCATION - */ - coldPhase.actions = serializeMigrateAndAllocateActions( - _meta.cold, - coldPhase.actions, - originalPolicy?.phases.cold?.actions, - updatedPolicy.phases.cold?.actions?.allocate?.number_of_replicas - ); + /** + * COLD PHASE SET PRIORITY + */ + if (!updatedPolicy.phases.cold?.actions?.set_priority) { + delete coldPhase.actions.set_priority; + } - /** - * COLD PHASE FREEZE - */ - if (_meta.cold.freezeEnabled) { - coldPhase.actions.freeze = coldPhase.actions.freeze ?? {}; + /** + * COLD PHASE SEARCHABLE SNAPSHOT + */ + if (updatedPolicy.phases.cold?.actions?.searchable_snapshot) { + coldPhase.actions.searchable_snapshot = { + ...coldPhase.actions.searchable_snapshot, + snapshot_repository: _meta.searchableSnapshot.repository, + }; + } else { + delete coldPhase.actions.searchable_snapshot; + } } else { - delete coldPhase.actions.freeze; + delete draft.phases.cold; } /** - * COLD PHASE READ ONLY + * FROZEN PHASE SERIALIZATION */ - if (_meta.cold.readonlyEnabled) { - coldPhase.actions.readonly = coldPhase.actions.readonly ?? {}; - } else { - delete coldPhase.actions.readonly; - } + if (_meta.frozen?.enabled) { + draft.phases.frozen!.actions = draft.phases.frozen?.actions ?? {}; + const frozenPhase = draft.phases.frozen!; - /** - * COLD PHASE SET PRIORITY - */ - if (!updatedPolicy.phases.cold?.actions?.set_priority) { - delete coldPhase.actions.set_priority; - } + /** + * FROZEN PHASE MIN AGE + */ + if (updatedPolicy.phases.frozen?.min_age) { + frozenPhase.min_age = `${updatedPolicy.phases.frozen!.min_age}${_meta.frozen.minAgeUnit}`; + } - /** - * COLD PHASE SEARCHABLE SNAPSHOT - */ - if (updatedPolicy.phases.cold?.actions?.searchable_snapshot) { - coldPhase.actions.searchable_snapshot = { - ...coldPhase.actions.searchable_snapshot, - snapshot_repository: _meta.searchableSnapshot.repository, - }; + /** + * FROZEN PHASE SEARCHABLE SNAPSHOT + */ + if (updatedPolicy.phases.frozen?.actions?.searchable_snapshot) { + frozenPhase.actions.searchable_snapshot = { + ...frozenPhase.actions.searchable_snapshot, + snapshot_repository: _meta.searchableSnapshot.repository, + }; + } else { + delete frozenPhase.actions.searchable_snapshot; + } } else { - delete coldPhase.actions.searchable_snapshot; - } - } else { - delete draft.phases.cold; - } - - /** - * FROZEN PHASE SERIALIZATION - */ - if (_meta.frozen?.enabled) { - draft.phases.frozen!.actions = draft.phases.frozen?.actions ?? {}; - const frozenPhase = draft.phases.frozen!; - - /** - * FROZEN PHASE MIN AGE - */ - if (updatedPolicy.phases.frozen?.min_age) { - frozenPhase.min_age = `${updatedPolicy.phases.frozen!.min_age}${_meta.frozen.minAgeUnit}`; + delete draft.phases.frozen; } /** - * FROZEN PHASE SEARCHABLE SNAPSHOT + * DELETE PHASE SERIALIZATION */ - if (updatedPolicy.phases.frozen?.actions?.searchable_snapshot) { - frozenPhase.actions.searchable_snapshot = { - ...frozenPhase.actions.searchable_snapshot, - snapshot_repository: _meta.searchableSnapshot.repository, - }; - } else { - delete frozenPhase.actions.searchable_snapshot; - } - } else { - delete draft.phases.frozen; - } - - /** - * DELETE PHASE SERIALIZATION - */ - if (_meta.delete.enabled) { - const deletePhase = draft.phases.delete!; + if (_meta.delete.enabled) { + const deletePhase = draft.phases.delete!; - /** - * DELETE PHASE DELETE - */ - deletePhase.actions = deletePhase.actions ?? {}; - deletePhase.actions.delete = deletePhase.actions.delete ?? {}; + /** + * DELETE PHASE DELETE + */ + deletePhase.actions = deletePhase.actions ?? {}; + deletePhase.actions.delete = deletePhase.actions.delete ?? {}; - /** - * DELETE PHASE MIN AGE - */ - if (updatedPolicy.phases.delete?.min_age) { - deletePhase.min_age = `${updatedPolicy.phases.delete!.min_age}${_meta.delete.minAgeUnit}`; - } + /** + * DELETE PHASE MIN AGE + */ + if (updatedPolicy.phases.delete?.min_age) { + deletePhase.min_age = `${updatedPolicy.phases.delete!.min_age}${_meta.delete.minAgeUnit}`; + } - /** - * DELETE PHASE WAIT FOR SNAPSHOT - */ - if (!updatedPolicy.phases.delete?.actions?.wait_for_snapshot) { - delete deletePhase.actions.wait_for_snapshot; + /** + * DELETE PHASE WAIT FOR SNAPSHOT + */ + if (!updatedPolicy.phases.delete?.actions?.wait_for_snapshot) { + delete deletePhase.actions.wait_for_snapshot; + } + } else { + delete draft.phases.delete; } - } else { - delete draft.phases.delete; - } - }); -}; + }); + }; diff --git a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/form/validations.ts b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/form/validations.ts index db43faf6cef17..efa6af4f61d0f 100644 --- a/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/form/validations.ts +++ b/x-pack/plugins/index_lifecycle_management/public/application/sections/edit_policy/form/validations.ts @@ -164,110 +164,108 @@ export const createPolicyNameValidations = ({ * For example, the user can't define '5 days' for cold phase if the * warm phase is set to '10 days'. */ -export const minAgeGreaterThanPreviousPhase = (phase: PhaseWithTiming) => ({ - formData, -}: { - formData: Record; -}) => { - if (phase === 'warm') { - return; - } +export const minAgeGreaterThanPreviousPhase = + (phase: PhaseWithTiming) => + ({ formData }: { formData: Record }) => { + if (phase === 'warm') { + return; + } - const getValueFor = (_phase: PhaseWithTiming) => { - const milli = formData[`_meta.${_phase}.minAgeToMilliSeconds`]; + const getValueFor = (_phase: PhaseWithTiming) => { + const milli = formData[`_meta.${_phase}.minAgeToMilliSeconds`]; - const esFormat = - milli >= 0 - ? formData[`phases.${_phase}.min_age`] + formData[`_meta.${_phase}.minAgeUnit`] - : undefined; + const esFormat = + milli >= 0 + ? formData[`phases.${_phase}.min_age`] + formData[`_meta.${_phase}.minAgeUnit`] + : undefined; - return { - milli, - esFormat, + return { + milli, + esFormat, + }; }; - }; - const minAgeValues = { - warm: getValueFor('warm'), - cold: getValueFor('cold'), - frozen: getValueFor('frozen'), - delete: getValueFor('delete'), - }; + const minAgeValues = { + warm: getValueFor('warm'), + cold: getValueFor('cold'), + frozen: getValueFor('frozen'), + delete: getValueFor('delete'), + }; - const i18nErrors = { - greaterThanWarmPhase: i18n.translate( - 'xpack.indexLifecycleMgmt.editPolicy.minAgeSmallerThanWarmPhaseError', - { - defaultMessage: 'Must be greater or equal than the warm phase value ({value})', - values: { - value: minAgeValues.warm.esFormat, - }, - } - ), - greaterThanColdPhase: i18n.translate( - 'xpack.indexLifecycleMgmt.editPolicy.minAgeSmallerThanColdPhaseError', - { - defaultMessage: 'Must be greater or equal than the cold phase value ({value})', - values: { - value: minAgeValues.cold.esFormat, - }, - } - ), - greaterThanFrozenPhase: i18n.translate( - 'xpack.indexLifecycleMgmt.editPolicy.minAgeSmallerThanFrozenPhaseError', - { - defaultMessage: 'Must be greater or equal than the frozen phase value ({value})', - values: { - value: minAgeValues.frozen.esFormat, - }, - } - ), - }; + const i18nErrors = { + greaterThanWarmPhase: i18n.translate( + 'xpack.indexLifecycleMgmt.editPolicy.minAgeSmallerThanWarmPhaseError', + { + defaultMessage: 'Must be greater or equal than the warm phase value ({value})', + values: { + value: minAgeValues.warm.esFormat, + }, + } + ), + greaterThanColdPhase: i18n.translate( + 'xpack.indexLifecycleMgmt.editPolicy.minAgeSmallerThanColdPhaseError', + { + defaultMessage: 'Must be greater or equal than the cold phase value ({value})', + values: { + value: minAgeValues.cold.esFormat, + }, + } + ), + greaterThanFrozenPhase: i18n.translate( + 'xpack.indexLifecycleMgmt.editPolicy.minAgeSmallerThanFrozenPhaseError', + { + defaultMessage: 'Must be greater or equal than the frozen phase value ({value})', + values: { + value: minAgeValues.frozen.esFormat, + }, + } + ), + }; - if (phase === 'cold') { - if (minAgeValues.warm.milli >= 0 && minAgeValues.cold.milli < minAgeValues.warm.milli) { - return { - message: i18nErrors.greaterThanWarmPhase, - }; + if (phase === 'cold') { + if (minAgeValues.warm.milli >= 0 && minAgeValues.cold.milli < minAgeValues.warm.milli) { + return { + message: i18nErrors.greaterThanWarmPhase, + }; + } + return; } - return; - } - if (phase === 'frozen') { - if (minAgeValues.cold.milli >= 0 && minAgeValues.frozen.milli < minAgeValues.cold.milli) { - return { - message: i18nErrors.greaterThanColdPhase, - }; - } else if ( - minAgeValues.warm.milli >= 0 && - minAgeValues.frozen.milli < minAgeValues.warm.milli - ) { - return { - message: i18nErrors.greaterThanWarmPhase, - }; + if (phase === 'frozen') { + if (minAgeValues.cold.milli >= 0 && minAgeValues.frozen.milli < minAgeValues.cold.milli) { + return { + message: i18nErrors.greaterThanColdPhase, + }; + } else if ( + minAgeValues.warm.milli >= 0 && + minAgeValues.frozen.milli < minAgeValues.warm.milli + ) { + return { + message: i18nErrors.greaterThanWarmPhase, + }; + } + return; } - return; - } - if (phase === 'delete') { - if (minAgeValues.frozen.milli >= 0 && minAgeValues.delete.milli < minAgeValues.frozen.milli) { - return { - message: i18nErrors.greaterThanFrozenPhase, - }; - } else if ( - minAgeValues.cold.milli >= 0 && - minAgeValues.delete.milli < minAgeValues.cold.milli - ) { - return { - message: i18nErrors.greaterThanColdPhase, - }; - } else if ( - minAgeValues.warm.milli >= 0 && - minAgeValues.delete.milli < minAgeValues.warm.milli - ) { - return { - message: i18nErrors.greaterThanWarmPhase, - }; + if (phase === 'delete') { + if (minAgeValues.frozen.milli >= 0 && minAgeValues.delete.milli < minAgeValues.frozen.milli) { + return { + message: i18nErrors.greaterThanFrozenPhase, + }; + } else if ( + minAgeValues.cold.milli >= 0 && + minAgeValues.delete.milli < minAgeValues.cold.milli + ) { + return { + message: i18nErrors.greaterThanColdPhase, + }; + } else if ( + minAgeValues.warm.milli >= 0 && + minAgeValues.delete.milli < minAgeValues.warm.milli + ) { + return { + message: i18nErrors.greaterThanWarmPhase, + }; + } } - } -}; + }; diff --git a/x-pack/plugins/index_lifecycle_management/public/plugin.tsx b/x-pack/plugins/index_lifecycle_management/public/plugin.tsx index 339d7a4d7db96..bc0981529c34f 100644 --- a/x-pack/plugins/index_lifecycle_management/public/plugin.tsx +++ b/x-pack/plugins/index_lifecycle_management/public/plugin.tsx @@ -20,7 +20,8 @@ import { ClientConfigType, SetupDependencies, StartDependencies } from './types' import { IlmLocatorDefinition } from './locator'; export class IndexLifecycleManagementPlugin - implements Plugin { + implements Plugin +{ constructor(private readonly initializerContext: PluginInitializerContext) {} private breadcrumbService = new BreadcrumbService(); diff --git a/x-pack/plugins/index_lifecycle_management/server/routes/api/nodes/__jest__/fixtures.ts b/x-pack/plugins/index_lifecycle_management/server/routes/api/nodes/__jest__/fixtures.ts index fe8d685dc2e01..0ebed383e261a 100644 --- a/x-pack/plugins/index_lifecycle_management/server/routes/api/nodes/__jest__/fixtures.ts +++ b/x-pack/plugins/index_lifecycle_management/server/routes/api/nodes/__jest__/fixtures.ts @@ -127,8 +127,7 @@ export const cloudNodeSettingsWithLegacy = { principal: 'http://saml.elastic-cloud.com/attributes/principal', }, sp: { - acs: - 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/api/security/saml/callback', + acs: 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/api/security/saml/callback', entity_id: 'ec:2628060457:916c269173df465f9826f4471799de42', logout: 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/logout', @@ -137,8 +136,7 @@ export const cloudNodeSettingsWithLegacy = { idp: { entity_id: 'urn:idp-cloud-elastic-co', metadata: { - path: - '/app/config/cloud-saml-metadata-916c269173df465f9826f4471799de42.xml', + path: '/app/config/cloud-saml-metadata-916c269173df465f9826f4471799de42.xml', }, }, }, @@ -354,8 +352,7 @@ export const cloudNodeSettingsWithLegacy = { principal: 'http://saml.elastic-cloud.com/attributes/principal', }, sp: { - acs: - 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/api/security/saml/callback', + acs: 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/api/security/saml/callback', entity_id: 'ec:2628060457:916c269173df465f9826f4471799de42', logout: 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/logout', @@ -364,8 +361,7 @@ export const cloudNodeSettingsWithLegacy = { idp: { entity_id: 'urn:idp-cloud-elastic-co', metadata: { - path: - '/app/config/cloud-saml-metadata-916c269173df465f9826f4471799de42.xml', + path: '/app/config/cloud-saml-metadata-916c269173df465f9826f4471799de42.xml', }, }, }, @@ -580,8 +576,7 @@ export const cloudNodeSettingsWithLegacy = { principal: 'http://saml.elastic-cloud.com/attributes/principal', }, sp: { - acs: - 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/api/security/saml/callback', + acs: 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/api/security/saml/callback', entity_id: 'ec:2628060457:916c269173df465f9826f4471799de42', logout: 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/logout', @@ -590,8 +585,7 @@ export const cloudNodeSettingsWithLegacy = { idp: { entity_id: 'urn:idp-cloud-elastic-co', metadata: { - path: - '/app/config/cloud-saml-metadata-916c269173df465f9826f4471799de42.xml', + path: '/app/config/cloud-saml-metadata-916c269173df465f9826f4471799de42.xml', }, }, }, @@ -806,8 +800,7 @@ export const cloudNodeSettingsWithLegacy = { principal: 'http://saml.elastic-cloud.com/attributes/principal', }, sp: { - acs: - 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/api/security/saml/callback', + acs: 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/api/security/saml/callback', entity_id: 'ec:2628060457:916c269173df465f9826f4471799de42', logout: 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/logout', @@ -816,8 +809,7 @@ export const cloudNodeSettingsWithLegacy = { idp: { entity_id: 'urn:idp-cloud-elastic-co', metadata: { - path: - '/app/config/cloud-saml-metadata-916c269173df465f9826f4471799de42.xml', + path: '/app/config/cloud-saml-metadata-916c269173df465f9826f4471799de42.xml', }, }, }, @@ -1032,8 +1024,7 @@ export const cloudNodeSettingsWithLegacy = { principal: 'http://saml.elastic-cloud.com/attributes/principal', }, sp: { - acs: - 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/api/security/saml/callback', + acs: 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/api/security/saml/callback', entity_id: 'ec:2628060457:916c269173df465f9826f4471799de42', logout: 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/logout', @@ -1042,8 +1033,7 @@ export const cloudNodeSettingsWithLegacy = { idp: { entity_id: 'urn:idp-cloud-elastic-co', metadata: { - path: - '/app/config/cloud-saml-metadata-916c269173df465f9826f4471799de42.xml', + path: '/app/config/cloud-saml-metadata-916c269173df465f9826f4471799de42.xml', }, }, }, @@ -1269,8 +1259,7 @@ export const cloudNodeSettingsWithoutLegacy = { principal: 'http://saml.elastic-cloud.com/attributes/principal', }, sp: { - acs: - 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/api/security/saml/callback', + acs: 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/api/security/saml/callback', entity_id: 'ec:2628060457:916c269173df465f9826f4471799de42', logout: 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/logout', @@ -1279,8 +1268,7 @@ export const cloudNodeSettingsWithoutLegacy = { idp: { entity_id: 'urn:idp-cloud-elastic-co', metadata: { - path: - '/app/config/cloud-saml-metadata-916c269173df465f9826f4471799de42.xml', + path: '/app/config/cloud-saml-metadata-916c269173df465f9826f4471799de42.xml', }, }, }, @@ -1496,8 +1484,7 @@ export const cloudNodeSettingsWithoutLegacy = { principal: 'http://saml.elastic-cloud.com/attributes/principal', }, sp: { - acs: - 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/api/security/saml/callback', + acs: 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/api/security/saml/callback', entity_id: 'ec:2628060457:916c269173df465f9826f4471799de42', logout: 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/logout', @@ -1506,8 +1493,7 @@ export const cloudNodeSettingsWithoutLegacy = { idp: { entity_id: 'urn:idp-cloud-elastic-co', metadata: { - path: - '/app/config/cloud-saml-metadata-916c269173df465f9826f4471799de42.xml', + path: '/app/config/cloud-saml-metadata-916c269173df465f9826f4471799de42.xml', }, }, }, @@ -1722,8 +1708,7 @@ export const cloudNodeSettingsWithoutLegacy = { principal: 'http://saml.elastic-cloud.com/attributes/principal', }, sp: { - acs: - 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/api/security/saml/callback', + acs: 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/api/security/saml/callback', entity_id: 'ec:2628060457:916c269173df465f9826f4471799de42', logout: 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/logout', @@ -1732,8 +1717,7 @@ export const cloudNodeSettingsWithoutLegacy = { idp: { entity_id: 'urn:idp-cloud-elastic-co', metadata: { - path: - '/app/config/cloud-saml-metadata-916c269173df465f9826f4471799de42.xml', + path: '/app/config/cloud-saml-metadata-916c269173df465f9826f4471799de42.xml', }, }, }, @@ -1948,8 +1932,7 @@ export const cloudNodeSettingsWithoutLegacy = { principal: 'http://saml.elastic-cloud.com/attributes/principal', }, sp: { - acs: - 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/api/security/saml/callback', + acs: 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/api/security/saml/callback', entity_id: 'ec:2628060457:916c269173df465f9826f4471799de42', logout: 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/logout', @@ -1958,8 +1941,7 @@ export const cloudNodeSettingsWithoutLegacy = { idp: { entity_id: 'urn:idp-cloud-elastic-co', metadata: { - path: - '/app/config/cloud-saml-metadata-916c269173df465f9826f4471799de42.xml', + path: '/app/config/cloud-saml-metadata-916c269173df465f9826f4471799de42.xml', }, }, }, @@ -2174,8 +2156,7 @@ export const cloudNodeSettingsWithoutLegacy = { principal: 'http://saml.elastic-cloud.com/attributes/principal', }, sp: { - acs: - 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/api/security/saml/callback', + acs: 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/api/security/saml/callback', entity_id: 'ec:2628060457:916c269173df465f9826f4471799de42', logout: 'https://916c269173df465f9826f4471799de42.europe-west4.gcp.elastic-cloud.com:9243/logout', @@ -2184,8 +2165,7 @@ export const cloudNodeSettingsWithoutLegacy = { idp: { entity_id: 'urn:idp-cloud-elastic-co', metadata: { - path: - '/app/config/cloud-saml-metadata-916c269173df465f9826f4471799de42.xml', + path: '/app/config/cloud-saml-metadata-916c269173df465f9826f4471799de42.xml', }, }, }, diff --git a/x-pack/plugins/index_lifecycle_management/server/routes/api/nodes/register_list_route.ts b/x-pack/plugins/index_lifecycle_management/server/routes/api/nodes/register_list_route.ts index accd8993abc62..314b206d6ea6b 100644 --- a/x-pack/plugins/index_lifecycle_management/server/routes/api/nodes/register_list_route.ts +++ b/x-pack/plugins/index_lifecycle_management/server/routes/api/nodes/register_list_route.ts @@ -88,15 +88,14 @@ export function registerListRoute({ { path: addBasePath('/nodes/list'), validate: false }, license.guardApiRoute(async (context, request, response) => { try { - const settingsResponse = await context.core.elasticsearch.client.asCurrentUser.transport.request( - { + const settingsResponse = + await context.core.elasticsearch.client.asCurrentUser.transport.request({ method: 'GET', path: '/_nodes/settings', querystring: { format: 'json', }, - } - ); + }); const body: ListNodesRouteResponse = convertSettingsIntoLists( settingsResponse.body as Settings, disallowedNodeAttributes diff --git a/x-pack/plugins/index_management/__jest__/client_integration/helpers/setup_environment.tsx b/x-pack/plugins/index_management/__jest__/client_integration/helpers/setup_environment.tsx index 9023a5ac53a98..7ce81fa47df97 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/helpers/setup_environment.tsx +++ b/x-pack/plugins/index_management/__jest__/client_integration/helpers/setup_environment.tsx @@ -66,19 +66,19 @@ export const setupEnvironment = () => { }; }; -export const WithAppDependencies = (Comp: any, overridingDependencies: any = {}) => ( - props: any -) => { - const mergedDependencies = merge({}, appDependencies, overridingDependencies); - return ( - - - - - - - - - - ); -}; +export const WithAppDependencies = + (Comp: any, overridingDependencies: any = {}) => + (props: any) => { + const mergedDependencies = merge({}, appDependencies, overridingDependencies); + return ( + + + + + + + + + + ); + }; diff --git a/x-pack/plugins/index_management/__jest__/client_integration/home/data_streams_tab.test.ts b/x-pack/plugins/index_management/__jest__/client_integration/home/data_streams_tab.test.ts index 8e114b0596948..7c4d2573bdec6 100644 --- a/x-pack/plugins/index_management/__jest__/client_integration/home/data_streams_tab.test.ts +++ b/x-pack/plugins/index_management/__jest__/client_integration/home/data_streams_tab.test.ts @@ -348,11 +348,8 @@ describe('Data Streams tab', () => { describe('when there are special characters', () => { beforeEach(async () => { - const { - setLoadIndicesResponse, - setLoadDataStreamsResponse, - setLoadDataStreamResponse, - } = httpRequestsMockHelpers; + const { setLoadIndicesResponse, setLoadDataStreamsResponse, setLoadDataStreamResponse } = + httpRequestsMockHelpers; setLoadIndicesResponse([ createDataStreamBackingIndex('data-stream-index', '%dataStream'), diff --git a/x-pack/plugins/index_management/common/lib/template_serialization.ts b/x-pack/plugins/index_management/common/lib/template_serialization.ts index 3e6698ac57136..ce49c32cd8271 100644 --- a/x-pack/plugins/index_management/common/lib/template_serialization.ts +++ b/x-pack/plugins/index_management/common/lib/template_serialization.ts @@ -16,15 +16,8 @@ import { const hasEntries = (data: object = {}) => Object.entries(data).length > 0; export function serializeTemplate(templateDeserialized: TemplateDeserialized): TemplateSerialized { - const { - version, - priority, - indexPatterns, - template, - composedOf, - dataStream, - _meta, - } = templateDeserialized; + const { version, priority, indexPatterns, template, composedOf, dataStream, _meta } = + templateDeserialized; return { version, @@ -86,10 +79,8 @@ export function deserializeTemplateList( cloudManagedTemplatePrefix?: string ): TemplateListItem[] { return indexTemplates.map(({ name, index_template: templateSerialized }) => { - const { - template: { mappings, settings, aliases } = {}, - ...deserializedTemplate - } = deserializeTemplate({ name, ...templateSerialized }, cloudManagedTemplatePrefix); + const { template: { mappings, settings, aliases } = {}, ...deserializedTemplate } = + deserializeTemplate({ name, ...templateSerialized }, cloudManagedTemplatePrefix); return { ...deserializedTemplate, @@ -150,10 +141,8 @@ export function deserializeLegacyTemplateList( cloudManagedTemplatePrefix?: string ): TemplateListItem[] { return Object.entries(indexTemplatesByName).map(([name, templateSerialized]) => { - const { - template: { mappings, settings, aliases } = {}, - ...deserializedTemplate - } = deserializeLegacyTemplate({ name, ...templateSerialized }, cloudManagedTemplatePrefix); + const { template: { mappings, settings, aliases } = {}, ...deserializedTemplate } = + deserializeLegacyTemplate({ name, ...templateSerialized }, cloudManagedTemplatePrefix); return { ...deserializedTemplate, diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/setup_environment.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/setup_environment.tsx index ece377b0ee2cf..d532eaaba8923 100644 --- a/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/setup_environment.tsx +++ b/x-pack/plugins/index_management/public/application/components/component_templates/__jest__/client_integration/helpers/setup_environment.tsx @@ -33,7 +33,7 @@ const appDependencies = { } as any; export const componentTemplatesDependencies = { - httpClient: (mockHttpClient as unknown) as HttpSetup, + httpClient: mockHttpClient as unknown as HttpSetup, apiBasePath: API_BASE_PATH, trackMetric: () => {}, docLinks: docLinksServiceMock.createStartContract(), @@ -51,15 +51,16 @@ export const setupEnvironment = () => { }; }; -export const WithAppDependencies = (Comp: any) => (props: any) => ( - - - - - - - - - / - -); +export const WithAppDependencies = (Comp: any) => (props: any) => + ( + + + + + + + + + / + + ); diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_details/component_template_details.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_details/component_template_details.tsx index 06a5e8b5c27dc..6dbf1b15174e9 100644 --- a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_details/component_template_details.tsx +++ b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_details/component_template_details.tsx @@ -55,9 +55,11 @@ export const ComponentTemplateDetailsFlyoutContent: React.FunctionComponent('summary'); diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/component_template_list.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/component_template_list.tsx index 77668f7d55072..6ff7c5826459e 100644 --- a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/component_template_list.tsx +++ b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_list/component_template_list.tsx @@ -42,10 +42,8 @@ export const ComponentTemplateList: React.FunctionComponent = ({ componentTemplateName, history, }) => { - const { - addContent: addContentToGlobalFlyout, - removeContent: removeContentFromGlobalFlyout, - } = useGlobalFlyout(); + const { addContent: addContentToGlobalFlyout, removeContent: removeContentFromGlobalFlyout } = + useGlobalFlyout(); const { api, trackMetric, documentation } = useComponentTemplatesContext(); const { data, isLoading, error, resendRequest } = api.useLoadComponentTemplates(); diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_selector/component_templates_selector.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_selector/component_templates_selector.tsx index a1e1cc5557660..41be138ea9fa5 100644 --- a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_selector/component_templates_selector.tsx +++ b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_selector/component_templates_selector.tsx @@ -60,10 +60,8 @@ export const ComponentTemplatesSelector = ({ emptyPrompt: { text, showCreateButton } = {}, }: Props) => { const { data: components, isLoading, error } = useApi().useLoadComponentTemplates(); - const { - addContent: addContentToGlobalFlyout, - removeContent: removeContentFromGlobalFlyout, - } = useGlobalFlyout(); + const { addContent: addContentToGlobalFlyout, removeContent: removeContentFromGlobalFlyout } = + useGlobalFlyout(); const [selectedComponent, setSelectedComponent] = useState(null); const [componentsSelected, setComponentsSelected] = useState([]); const isInitialized = useRef(false); diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_wizard/component_template_clone/component_template_clone.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_wizard/component_template_clone/component_template_clone.tsx index d19c500c3622a..1889da7c1336f 100644 --- a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_wizard/component_template_clone/component_template_clone.tsx +++ b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_wizard/component_template_clone/component_template_clone.tsx @@ -24,9 +24,11 @@ export const ComponentTemplateClone: FunctionComponent { if (error && !isLoading) { diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_wizard/component_template_form/component_template_form.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_wizard/component_template_form/component_template_form.tsx index 8763bb8881ed7..8d5e61c81120f 100644 --- a/x-pack/plugins/index_management/public/application/components/component_templates/component_template_wizard/component_template_form/component_template_form.tsx +++ b/x-pack/plugins/index_management/public/application/components/component_templates/component_template_wizard/component_template_form/component_template_form.tsx @@ -160,22 +160,21 @@ export const ComponentTemplateForm = ({ }; const buildComponentTemplateObject = useCallback( - (initialTemplate: ComponentTemplateDeserialized) => ( - wizardData: WizardContent - ): ComponentTemplateDeserialized => { - const outputComponentTemplate = { - ...initialTemplate, - name: wizardData.logistics.name, - version: wizardData.logistics.version, - _meta: wizardData.logistics._meta, - template: { - settings: wizardData.settings, - mappings: wizardData.mappings, - aliases: wizardData.aliases, - }, - }; - return cleanupComponentTemplateObject(outputComponentTemplate); - }, + (initialTemplate: ComponentTemplateDeserialized) => + (wizardData: WizardContent): ComponentTemplateDeserialized => { + const outputComponentTemplate = { + ...initialTemplate, + name: wizardData.logistics.name, + version: wizardData.logistics.version, + _meta: wizardData.logistics._meta, + template: { + settings: wizardData.settings, + mappings: wizardData.mappings, + aliases: wizardData.aliases, + }, + }; + return cleanupComponentTemplateObject(outputComponentTemplate); + }, [] ); diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/component_templates_context.tsx b/x-pack/plugins/index_management/public/application/components/component_templates/component_templates_context.tsx index 94f5befab61c9..89b4e90741410 100644 --- a/x-pack/plugins/index_management/public/application/components/component_templates/component_templates_context.tsx +++ b/x-pack/plugins/index_management/public/application/components/component_templates/component_templates_context.tsx @@ -42,15 +42,8 @@ export const ComponentTemplatesProvider = ({ value: Props; children: React.ReactNode; }) => { - const { - httpClient, - apiBasePath, - trackMetric, - docLinks, - toasts, - setBreadcrumbs, - getUrlForApp, - } = value; + const { httpClient, apiBasePath, trackMetric, docLinks, toasts, setBreadcrumbs, getUrlForApp } = + value; const useRequest = getUseRequest(httpClient); const sendRequest = getSendRequest(httpClient); diff --git a/x-pack/plugins/index_management/public/application/components/component_templates/lib/request.ts b/x-pack/plugins/index_management/public/application/components/component_templates/lib/request.ts index a7056e27b5cad..92847bbe5dc05 100644 --- a/x-pack/plugins/index_management/public/application/components/component_templates/lib/request.ts +++ b/x-pack/plugins/index_management/public/application/components/component_templates/lib/request.ts @@ -22,14 +22,14 @@ export type UseRequestHook = ( ) => UseRequestResponse; export type SendRequestHook = (config: SendRequestConfig) => Promise; -export const getUseRequest = (httpClient: HttpSetup): UseRequestHook => ( - config: UseRequestConfig -) => { - return _useRequest(httpClient, config); -}; +export const getUseRequest = + (httpClient: HttpSetup): UseRequestHook => + (config: UseRequestConfig) => { + return _useRequest(httpClient, config); + }; -export const getSendRequest = (httpClient: HttpSetup): SendRequestHook => ( - config: SendRequestConfig -) => { - return _sendRequest(httpClient, config); -}; +export const getSendRequest = + (httpClient: HttpSetup): SendRequestHook => + (config: SendRequestConfig) => { + return _sendRequest(httpClient, config); + }; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/helpers/setup_environment.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/helpers/setup_environment.tsx index efd1ec7062423..7055dcc74ce7b 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/helpers/setup_environment.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/__jest__/client_integration/helpers/setup_environment.tsx @@ -78,12 +78,13 @@ const defaultProps = { docLinks: docLinksServiceMock.createStartContract(), }; -export const WithAppDependencies = (Comp: any) => (props: any) => ( - - - - - - - -); +export const WithAppDependencies = (Comp: any) => (props: any) => + ( + + + + + + + + ); diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/document_fields.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/document_fields.tsx index 7b464a299c24b..a28531ed70953 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/document_fields.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/document_fields.tsx @@ -22,10 +22,8 @@ const { useGlobalFlyout } = GlobalFlyout; export const DocumentFields = React.memo(() => { const { fields, search, documentFields } = useMappingsState(); const dispatch = useDispatch(); - const { - addContent: addContentToGlobalFlyout, - removeContent: removeContentFromGlobalFlyout, - } = useGlobalFlyout(); + const { addContent: addContentToGlobalFlyout, removeContent: removeContentFromGlobalFlyout } = + useGlobalFlyout(); const { editor: editorType } = documentFields; const isEditing = documentFields.status === 'editingField'; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/analyzer_parameter.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/analyzer_parameter.tsx index bb6a5aae82f1a..5d5f0fc0b930c 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/analyzer_parameter.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/analyzer_parameter.tsx @@ -33,9 +33,9 @@ interface Props { const ANALYZER_OPTIONS = PARAMETERS_OPTIONS.analyzer!; // token_count requires a value for "analyzer", therefore, we cannot not allow "index_default" -const ANALYZER_OPTIONS_WITHOUT_DEFAULT = (PARAMETERS_OPTIONS.analyzer as SuperSelectOption[]).filter( - ({ value }) => value !== INDEX_DEFAULT -); +const ANALYZER_OPTIONS_WITHOUT_DEFAULT = ( + PARAMETERS_OPTIONS.analyzer as SuperSelectOption[] +).filter(({ value }) => value !== INDEX_DEFAULT); const getCustomAnalyzers = (indexSettings: IndexSettings): SelectOption[] | undefined => { const settings: IndexSettingsInterface = {}.hasOwnProperty.call(indexSettings, 'index') diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/path_parameter.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/path_parameter.tsx index 5ce48f63f0b94..aeb4debddcd65 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/path_parameter.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/field_parameters/path_parameter.tsx @@ -40,20 +40,20 @@ const getSuggestedFields = ( })) .sort((a, b) => (a.label > b.label ? 1 : a.label < b.label ? -1 : 0)); -const getDeserializer = (allFields: NormalizedFields['byId']): SerializerFunc => ( - value: string | object -): AliasOption[] => { - if (typeof value === 'string' && Boolean(value)) { - return [ - { - id: value, - label: allFields[value].path.join(' > '), - }, - ]; - } +const getDeserializer = + (allFields: NormalizedFields['byId']): SerializerFunc => + (value: string | object): AliasOption[] => { + if (typeof value === 'string' && Boolean(value)) { + return [ + { + id: value, + label: allFields[value].path.join(' > '), + }, + ]; + } - return []; -}; + return []; + }; interface Props { allFields: NormalizedFields['byId']; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_types/text_type.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_types/text_type.tsx index 1a03dec48c97e..2a007e7741d4a 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_types/text_type.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/field_types/text_type.tsx @@ -74,13 +74,12 @@ const getDefaultToggleValue = (param: string, field: FieldType) => { }; export const TextType = React.memo(({ field }: Props) => { - const onIndexPrefixesChanage = (minField: FieldHook, maxField: FieldHook) => ([ - min, - max, - ]: any) => { - minField.setValue(min); - maxField.setValue(max); - }; + const onIndexPrefixesChanage = + (minField: FieldHook, maxField: FieldHook) => + ([min, max]: any) => { + minField.setValue(min); + maxField.setValue(max); + }; return ( <> diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/fields_list_item.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/fields_list_item.tsx index 1f4e1d1475e5d..76284f925c3b1 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/fields_list_item.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/document_fields/fields/fields_list_item.tsx @@ -131,12 +131,8 @@ function FieldListItemComponent( return null; } - const { - addMultiFieldButtonLabel, - addPropertyButtonLabel, - editButtonLabel, - deleteButtonLabel, - } = i18nTexts; + const { addMultiFieldButtonLabel, addPropertyButtonLabel, editButtonLabel, deleteButtonLabel } = + i18nTexts; return ( diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/load_mappings/load_mappings_provider.test.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/load_mappings/load_mappings_provider.test.tsx index 7f6aea8878a77..2413df5e5d64d 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/load_mappings/load_mappings_provider.test.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/load_mappings/load_mappings_provider.test.tsx @@ -37,20 +37,22 @@ const setup = (props: any) => defaultProps: props, })(); -const openModalWithJsonContent = ({ component, find }: TestBed) => (json: any) => { - act(() => { - find('load-json-button').simulate('click'); - }); +const openModalWithJsonContent = + ({ component, find }: TestBed) => + (json: any) => { + act(() => { + find('load-json-button').simulate('click'); + }); - component.update(); + component.update(); - act(() => { - // Set the mappings to load - find('mockCodeEditor').simulate('change', { - jsonString: JSON.stringify(json), + act(() => { + // Set the mappings to load + find('mockCodeEditor').simulate('change', { + jsonString: JSON.stringify(json), + }); }); - }); -}; + }; describe('', () => { test('it should forward valid mapping definition', () => { diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/runtime_fields/runtime_fields_list.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/runtime_fields/runtime_fields_list.tsx index 387c53e3353fc..13cbd8e227328 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/components/runtime_fields/runtime_fields_list.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/components/runtime_fields/runtime_fields_list.tsx @@ -34,10 +34,8 @@ export const RuntimeFieldsList = () => { const dispatch = useDispatch(); - const { - addContent: addContentToGlobalFlyout, - removeContent: removeContentFromGlobalFlyout, - } = useGlobalFlyout(); + const { addContent: addContentToGlobalFlyout, removeContent: removeContentFromGlobalFlyout } = + useGlobalFlyout(); const { value: { docLinks }, diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/lib/mappings_validator.ts b/x-pack/plugins/index_management/public/application/components/mappings_editor/lib/mappings_validator.ts index 2abaeb45639bf..3eb2f8d6371d8 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/lib/mappings_validator.ts +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/lib/mappings_validator.ts @@ -284,9 +284,8 @@ export const validateMappings = (mappings: any = {}): MappingsValidatorResponse const { properties, dynamic_templates: dynamicTemplates, ...mappingsConfiguration } = mappings; - const { value: parsedConfiguration, errors: configurationErrors } = validateMappingsConfiguration( - mappingsConfiguration - ); + const { value: parsedConfiguration, errors: configurationErrors } = + validateMappingsConfiguration(mappingsConfiguration); const { value: parsedProperties, errors: propertiesErrors } = validateProperties(properties); const errors = [...configurationErrors, ...propertiesErrors]; diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/mappings_editor.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/mappings_editor.tsx index cd2740d78df3f..b188b15b0fb72 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/mappings_editor.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/mappings_editor.tsx @@ -51,50 +51,48 @@ interface Props { } export const MappingsEditor = React.memo(({ onChange, value, docLinks, indexSettings }: Props) => { - const { - parsedDefaultValue, - multipleMappingsDeclared, - } = useMemo(() => { - const mappingsDefinition = extractMappingsDefinition(value); - - if (mappingsDefinition === null) { - return { multipleMappingsDeclared: true }; - } + const { parsedDefaultValue, multipleMappingsDeclared } = + useMemo(() => { + const mappingsDefinition = extractMappingsDefinition(value); + + if (mappingsDefinition === null) { + return { multipleMappingsDeclared: true }; + } - const { - _source, - _meta, - _routing, - dynamic, - properties, - runtime, - /* eslint-disable @typescript-eslint/naming-convention */ - numeric_detection, - date_detection, - dynamic_date_formats, - dynamic_templates, - /* eslint-enable @typescript-eslint/naming-convention */ - } = mappingsDefinition; - - const parsed = { - configuration: { + const { _source, _meta, _routing, dynamic, + properties, + runtime, + /* eslint-disable @typescript-eslint/naming-convention */ numeric_detection, date_detection, dynamic_date_formats, - }, - fields: properties, - templates: { dynamic_templates, - }, - runtime, - }; - - return { parsedDefaultValue: parsed, multipleMappingsDeclared: false }; - }, [value]); + /* eslint-enable @typescript-eslint/naming-convention */ + } = mappingsDefinition; + + const parsed = { + configuration: { + _source, + _meta, + _routing, + dynamic, + numeric_detection, + date_detection, + dynamic_date_formats, + }, + fields: properties, + templates: { + dynamic_templates, + }, + runtime, + }; + + return { parsedDefaultValue: parsed, multipleMappingsDeclared: false }; + }, [value]); /** * Hook that will listen to: diff --git a/x-pack/plugins/index_management/public/application/components/mappings_editor/use_state_listener.tsx b/x-pack/plugins/index_management/public/application/components/mappings_editor/use_state_listener.tsx index e7ace1aff3101..2314f269e540d 100644 --- a/x-pack/plugins/index_management/public/application/components/mappings_editor/use_state_listener.tsx +++ b/x-pack/plugins/index_management/public/application/components/mappings_editor/use_state_listener.tsx @@ -41,9 +41,10 @@ export const useMappingsStateListener = ({ onChange, value }: Args) => { const { fields: mappedFields, runtime: runtimeFields } = value ?? {}; const parsedFieldsDefaultValue = useMemo(() => normalize(mappedFields), [mappedFields]); - const parsedRuntimeFieldsDefaultValue = useMemo(() => normalizeRuntimeFields(runtimeFields), [ - runtimeFields, - ]); + const parsedRuntimeFieldsDefaultValue = useMemo( + () => normalizeRuntimeFields(runtimeFields), + [runtimeFields] + ); useEffect(() => { // If we are creating a new field, but haven't entered any name diff --git a/x-pack/plugins/index_management/public/application/components/template_form/template_form.tsx b/x-pack/plugins/index_management/public/application/components/template_form/template_form.tsx index 4ccd77d275a94..a0362b440cb0b 100644 --- a/x-pack/plugins/index_management/public/application/components/template_form/template_form.tsx +++ b/x-pack/plugins/index_management/public/application/components/template_form/template_form.tsx @@ -196,22 +196,21 @@ export const TemplateForm = ({ }; const buildTemplateObject = useCallback( - (initialTemplate: TemplateDeserialized) => ( - wizardData: WizardContent - ): TemplateDeserialized => { - const outputTemplate = { - ...wizardData.logistics, - _kbnMeta: initialTemplate._kbnMeta, - composedOf: wizardData.components, - template: { - settings: wizardData.settings, - mappings: wizardData.mappings, - aliases: wizardData.aliases, - }, - }; - - return cleanupTemplateObject(outputTemplate); - }, + (initialTemplate: TemplateDeserialized) => + (wizardData: WizardContent): TemplateDeserialized => { + const outputTemplate = { + ...wizardData.logistics, + _kbnMeta: initialTemplate._kbnMeta, + composedOf: wizardData.components, + template: { + settings: wizardData.settings, + mappings: wizardData.mappings, + aliases: wizardData.aliases, + }, + }; + + return cleanupTemplateObject(outputTemplate); + }, [] ); diff --git a/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_list.tsx b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_list.tsx index 7bd7c163837d8..583d1fcb83ed4 100644 --- a/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_list.tsx +++ b/x-pack/plugins/index_management/public/application/sections/home/data_stream_list/data_stream_list.tsx @@ -61,7 +61,12 @@ export const DataStreamList: React.FunctionComponent(false); const [saveError, setSaveError] = useState(null); - const { error: templateToCloneError, data: templateToClone, isLoading } = useLoadIndexTemplate( - decodedTemplateName, - isLegacy - ); + const { + error: templateToCloneError, + data: templateToClone, + isLoading, + } = useLoadIndexTemplate(decodedTemplateName, isLegacy); const onSave = async (template: TemplateDeserialized) => { setIsSaving(true); diff --git a/x-pack/plugins/index_management/public/application/store/actions/clear_cache_indices.js b/x-pack/plugins/index_management/public/application/store/actions/clear_cache_indices.js index 75dc762b8f894..179aa73b4f0a8 100644 --- a/x-pack/plugins/index_management/public/application/store/actions/clear_cache_indices.js +++ b/x-pack/plugins/index_management/public/application/store/actions/clear_cache_indices.js @@ -14,19 +14,21 @@ import { notificationService } from '../../services/notification'; import { clearRowStatus, reloadIndices } from '../actions'; export const clearCacheIndicesStart = createAction('INDEX_MANAGEMENT_CLEAR_CACHE_INDICES_START'); -export const clearCacheIndices = ({ indexNames }) => async (dispatch) => { - dispatch(clearCacheIndicesStart({ indexNames })); - try { - await request(indexNames); - } catch (error) { - notificationService.showDangerToast(error.message); - return dispatch(clearRowStatus({ indexNames })); - } - dispatch(reloadIndices(indexNames)); - notificationService.showSuccessToast( - i18n.translate('xpack.idxMgmt.clearCacheIndicesAction.successMessage', { - defaultMessage: 'Successfully cleared cache: [{indexNames}]', - values: { indexNames: indexNames.join(', ') }, - }) - ); -}; +export const clearCacheIndices = + ({ indexNames }) => + async (dispatch) => { + dispatch(clearCacheIndicesStart({ indexNames })); + try { + await request(indexNames); + } catch (error) { + notificationService.showDangerToast(error.message); + return dispatch(clearRowStatus({ indexNames })); + } + dispatch(reloadIndices(indexNames)); + notificationService.showSuccessToast( + i18n.translate('xpack.idxMgmt.clearCacheIndicesAction.successMessage', { + defaultMessage: 'Successfully cleared cache: [{indexNames}]', + values: { indexNames: indexNames.join(', ') }, + }) + ); + }; diff --git a/x-pack/plugins/index_management/public/application/store/actions/close_indices.js b/x-pack/plugins/index_management/public/application/store/actions/close_indices.js index 4ba2db666e009..1669d6b1b022f 100644 --- a/x-pack/plugins/index_management/public/application/store/actions/close_indices.js +++ b/x-pack/plugins/index_management/public/application/store/actions/close_indices.js @@ -12,19 +12,21 @@ import { notificationService } from '../../services/notification'; import { clearRowStatus, reloadIndices } from '../actions'; export const closeIndicesStart = createAction('INDEX_MANAGEMENT_CLOSE_INDICES_START'); -export const closeIndices = ({ indexNames }) => async (dispatch) => { - dispatch(closeIndicesStart({ indexNames })); - try { - await request(indexNames); - } catch (error) { - notificationService.showDangerToast(error.message); - return dispatch(clearRowStatus({ indexNames })); - } - dispatch(reloadIndices(indexNames)); - notificationService.showSuccessToast( - i18n.translate('xpack.idxMgmt.closeIndicesAction.successfullyClosedIndicesMessage', { - defaultMessage: 'Successfully closed: [{indexNames}]', - values: { indexNames: indexNames.join(', ') }, - }) - ); -}; +export const closeIndices = + ({ indexNames }) => + async (dispatch) => { + dispatch(closeIndicesStart({ indexNames })); + try { + await request(indexNames); + } catch (error) { + notificationService.showDangerToast(error.message); + return dispatch(clearRowStatus({ indexNames })); + } + dispatch(reloadIndices(indexNames)); + notificationService.showSuccessToast( + i18n.translate('xpack.idxMgmt.closeIndicesAction.successfullyClosedIndicesMessage', { + defaultMessage: 'Successfully closed: [{indexNames}]', + values: { indexNames: indexNames.join(', ') }, + }) + ); + }; diff --git a/x-pack/plugins/index_management/public/application/store/actions/delete_indices.js b/x-pack/plugins/index_management/public/application/store/actions/delete_indices.js index d886b35879d4f..307c359b0fe21 100644 --- a/x-pack/plugins/index_management/public/application/store/actions/delete_indices.js +++ b/x-pack/plugins/index_management/public/application/store/actions/delete_indices.js @@ -12,18 +12,20 @@ import { notificationService } from '../../services/notification'; import { clearRowStatus } from '../actions'; export const deleteIndicesSuccess = createAction('INDEX_MANAGEMENT_DELETE_INDICES_SUCCESS'); -export const deleteIndices = ({ indexNames }) => async (dispatch) => { - try { - await request(indexNames); - } catch (error) { - notificationService.showDangerToast(error.message); - return dispatch(clearRowStatus({ indexNames })); - } - notificationService.showSuccessToast( - i18n.translate('xpack.idxMgmt.deleteIndicesAction.successfullyDeletedIndicesMessage', { - defaultMessage: 'Successfully deleted: [{indexNames}]', - values: { indexNames: indexNames.join(', ') }, - }) - ); - dispatch(deleteIndicesSuccess({ indexNames })); -}; +export const deleteIndices = + ({ indexNames }) => + async (dispatch) => { + try { + await request(indexNames); + } catch (error) { + notificationService.showDangerToast(error.message); + return dispatch(clearRowStatus({ indexNames })); + } + notificationService.showSuccessToast( + i18n.translate('xpack.idxMgmt.deleteIndicesAction.successfullyDeletedIndicesMessage', { + defaultMessage: 'Successfully deleted: [{indexNames}]', + values: { indexNames: indexNames.join(', ') }, + }) + ); + dispatch(deleteIndicesSuccess({ indexNames })); + }; diff --git a/x-pack/plugins/index_management/public/application/store/actions/edit_index_settings.js b/x-pack/plugins/index_management/public/application/store/actions/edit_index_settings.js index 0ebb36f68311f..4a82ced82eb83 100644 --- a/x-pack/plugins/index_management/public/application/store/actions/edit_index_settings.js +++ b/x-pack/plugins/index_management/public/application/store/actions/edit_index_settings.js @@ -10,27 +10,29 @@ import { loadIndexSettings as request } from '../../services'; import { notificationService } from '../../services/notification'; import { loadIndexDataSuccess } from './load_index_data'; -export const editIndexSettings = ({ indexName }) => async (dispatch) => { - let indexSettings; - try { - indexSettings = await request(indexName); - } catch (error) { - return notificationService.showDangerToast(error.message); - } - notificationService.showSuccessToast( - i18n.translate( - 'xpack.idxMgmt.editIndexSettingsAction.successfullySavedSettingsForIndicesMessage', - { - defaultMessage: 'Successfully saved settings for {indexName}', - values: { indexName }, - } - ) - ); - dispatch( - loadIndexDataSuccess({ - data: indexSettings, - panelType: 'editIndexSettings', - indexName, - }) - ); -}; +export const editIndexSettings = + ({ indexName }) => + async (dispatch) => { + let indexSettings; + try { + indexSettings = await request(indexName); + } catch (error) { + return notificationService.showDangerToast(error.message); + } + notificationService.showSuccessToast( + i18n.translate( + 'xpack.idxMgmt.editIndexSettingsAction.successfullySavedSettingsForIndicesMessage', + { + defaultMessage: 'Successfully saved settings for {indexName}', + values: { indexName }, + } + ) + ); + dispatch( + loadIndexDataSuccess({ + data: indexSettings, + panelType: 'editIndexSettings', + indexName, + }) + ); + }; diff --git a/x-pack/plugins/index_management/public/application/store/actions/extension_action.js b/x-pack/plugins/index_management/public/application/store/actions/extension_action.js index 97937f67f9ae4..eda9d32d75fba 100644 --- a/x-pack/plugins/index_management/public/application/store/actions/extension_action.js +++ b/x-pack/plugins/index_management/public/application/store/actions/extension_action.js @@ -9,15 +9,15 @@ import { reloadIndices } from '../actions'; import { notificationService } from '../../services/notification'; import { httpService } from '../../services/http'; -export const performExtensionAction = ({ requestMethod, indexNames, successMessage }) => async ( - dispatch -) => { - try { - await requestMethod(indexNames, httpService.httpClient); - } catch (error) { - notificationService.showDangerToast(error.message); - return; - } - dispatch(reloadIndices(indexNames)); - notificationService.showSuccessToast(successMessage); -}; +export const performExtensionAction = + ({ requestMethod, indexNames, successMessage }) => + async (dispatch) => { + try { + await requestMethod(indexNames, httpService.httpClient); + } catch (error) { + notificationService.showDangerToast(error.message); + return; + } + dispatch(reloadIndices(indexNames)); + notificationService.showSuccessToast(successMessage); + }; diff --git a/x-pack/plugins/index_management/public/application/store/actions/flush_indices.js b/x-pack/plugins/index_management/public/application/store/actions/flush_indices.js index f3dae725947e1..364b87e9f2bb7 100644 --- a/x-pack/plugins/index_management/public/application/store/actions/flush_indices.js +++ b/x-pack/plugins/index_management/public/application/store/actions/flush_indices.js @@ -13,19 +13,21 @@ import { notificationService } from '../../services/notification'; export const flushIndicesStart = createAction('INDEX_MANAGEMENT_FLUSH_INDICES_START'); -export const flushIndices = ({ indexNames }) => async (dispatch) => { - dispatch(flushIndicesStart({ indexNames })); - try { - await request(indexNames); - } catch (error) { - notificationService.showDangerToast(error.message); - return dispatch(clearRowStatus({ indexNames })); - } - dispatch(reloadIndices(indexNames)); - notificationService.showSuccessToast( - i18n.translate('xpack.idxMgmt.flushIndicesAction.successfullyFlushedIndicesMessage', { - defaultMessage: 'Successfully flushed: [{indexNames}]', - values: { indexNames: indexNames.join(', ') }, - }) - ); -}; +export const flushIndices = + ({ indexNames }) => + async (dispatch) => { + dispatch(flushIndicesStart({ indexNames })); + try { + await request(indexNames); + } catch (error) { + notificationService.showDangerToast(error.message); + return dispatch(clearRowStatus({ indexNames })); + } + dispatch(reloadIndices(indexNames)); + notificationService.showSuccessToast( + i18n.translate('xpack.idxMgmt.flushIndicesAction.successfullyFlushedIndicesMessage', { + defaultMessage: 'Successfully flushed: [{indexNames}]', + values: { indexNames: indexNames.join(', ') }, + }) + ); + }; diff --git a/x-pack/plugins/index_management/public/application/store/actions/forcemerge_indices.js b/x-pack/plugins/index_management/public/application/store/actions/forcemerge_indices.js index 726e5a1fbed27..60f5da7d4925d 100644 --- a/x-pack/plugins/index_management/public/application/store/actions/forcemerge_indices.js +++ b/x-pack/plugins/index_management/public/application/store/actions/forcemerge_indices.js @@ -13,19 +13,24 @@ import { notificationService } from '../../services/notification'; export const forcemergeIndicesStart = createAction('INDEX_MANAGEMENT_FORCEMERGE_INDICES_START'); -export const forcemergeIndices = ({ indexNames, maxNumSegments }) => async (dispatch) => { - dispatch(forcemergeIndicesStart({ indexNames })); - try { - await request(indexNames, maxNumSegments); - } catch (error) { - notificationService.showDangerToast(error.message); - return dispatch(clearRowStatus({ indexNames })); - } - dispatch(reloadIndices(indexNames)); - notificationService.showSuccessToast( - i18n.translate('xpack.idxMgmt.forceMergeIndicesAction.successfullyForceMergedIndicesMessage', { - defaultMessage: 'Successfully force merged: [{indexNames}]', - values: { indexNames: indexNames.join(', ') }, - }) - ); -}; +export const forcemergeIndices = + ({ indexNames, maxNumSegments }) => + async (dispatch) => { + dispatch(forcemergeIndicesStart({ indexNames })); + try { + await request(indexNames, maxNumSegments); + } catch (error) { + notificationService.showDangerToast(error.message); + return dispatch(clearRowStatus({ indexNames })); + } + dispatch(reloadIndices(indexNames)); + notificationService.showSuccessToast( + i18n.translate( + 'xpack.idxMgmt.forceMergeIndicesAction.successfullyForceMergedIndicesMessage', + { + defaultMessage: 'Successfully force merged: [{indexNames}]', + values: { indexNames: indexNames.join(', ') }, + } + ) + ); + }; diff --git a/x-pack/plugins/index_management/public/application/store/actions/freeze_indices.js b/x-pack/plugins/index_management/public/application/store/actions/freeze_indices.js index f06239cc0d1b4..002b0c5f00c9d 100644 --- a/x-pack/plugins/index_management/public/application/store/actions/freeze_indices.js +++ b/x-pack/plugins/index_management/public/application/store/actions/freeze_indices.js @@ -13,19 +13,21 @@ import { notificationService } from '../../services/notification'; export const freezeIndicesStart = createAction('INDEX_MANAGEMENT_FREEZE_INDICES_START'); -export const freezeIndices = ({ indexNames }) => async (dispatch) => { - dispatch(freezeIndicesStart({ indexNames })); - try { - await request(indexNames); - } catch (error) { - notificationService.showDangerToast(error.message); - return dispatch(clearRowStatus({ indexNames })); - } - dispatch(reloadIndices(indexNames)); - notificationService.showSuccessToast( - i18n.translate('xpack.idxMgmt.freezeIndicesAction.successfullyFrozeIndicesMessage', { - defaultMessage: 'Successfully froze: [{indexNames}]', - values: { indexNames: indexNames.join(', ') }, - }) - ); -}; +export const freezeIndices = + ({ indexNames }) => + async (dispatch) => { + dispatch(freezeIndicesStart({ indexNames })); + try { + await request(indexNames); + } catch (error) { + notificationService.showDangerToast(error.message); + return dispatch(clearRowStatus({ indexNames })); + } + dispatch(reloadIndices(indexNames)); + notificationService.showSuccessToast( + i18n.translate('xpack.idxMgmt.freezeIndicesAction.successfullyFrozeIndicesMessage', { + defaultMessage: 'Successfully froze: [{indexNames}]', + values: { indexNames: indexNames.join(', ') }, + }) + ); + }; diff --git a/x-pack/plugins/index_management/public/application/store/actions/load_index_data.js b/x-pack/plugins/index_management/public/application/store/actions/load_index_data.js index 0fc37fa7cc98b..18925d6d05e64 100644 --- a/x-pack/plugins/index_management/public/application/store/actions/load_index_data.js +++ b/x-pack/plugins/index_management/public/application/store/actions/load_index_data.js @@ -11,12 +11,14 @@ import { notificationService } from '../../services/notification'; export const loadIndexDataSuccess = createAction('INDEX_MANAGEMENT_LOAD_INDEX_DATA_SUCCESS'); -export const loadIndexData = ({ indexName, dataType }) => async (dispatch) => { - let data; - try { - data = await request(dataType, indexName); - } catch (error) { - notificationService.showDangerToast(error.message); - } - dispatch(loadIndexDataSuccess({ data, indexName })); -}; +export const loadIndexData = + ({ indexName, dataType }) => + async (dispatch) => { + let data; + try { + data = await request(dataType, indexName); + } catch (error) { + notificationService.showDangerToast(error.message); + } + dispatch(loadIndexDataSuccess({ data, indexName })); + }; diff --git a/x-pack/plugins/index_management/public/application/store/actions/open_indices.js b/x-pack/plugins/index_management/public/application/store/actions/open_indices.js index 7c74f0ae870e9..73a4a3350b841 100644 --- a/x-pack/plugins/index_management/public/application/store/actions/open_indices.js +++ b/x-pack/plugins/index_management/public/application/store/actions/open_indices.js @@ -13,19 +13,21 @@ import { notificationService } from '../../services/notification'; export const openIndicesStart = createAction('INDEX_MANAGEMENT_OPEN_INDICES_START'); -export const openIndices = ({ indexNames }) => async (dispatch) => { - dispatch(openIndicesStart({ indexNames })); - try { - await request(indexNames); - } catch (error) { - notificationService.showDangerToast(error.message); - return dispatch(clearRowStatus({ indexNames })); - } - dispatch(reloadIndices(indexNames)); - notificationService.showSuccessToast( - i18n.translate('xpack.idxMgmt.openIndicesAction.successfullyOpenedIndicesMessage', { - defaultMessage: 'Successfully opened: [{indexNames}]', - values: { indexNames: indexNames.join(', ') }, - }) - ); -}; +export const openIndices = + ({ indexNames }) => + async (dispatch) => { + dispatch(openIndicesStart({ indexNames })); + try { + await request(indexNames); + } catch (error) { + notificationService.showDangerToast(error.message); + return dispatch(clearRowStatus({ indexNames })); + } + dispatch(reloadIndices(indexNames)); + notificationService.showSuccessToast( + i18n.translate('xpack.idxMgmt.openIndicesAction.successfullyOpenedIndicesMessage', { + defaultMessage: 'Successfully opened: [{indexNames}]', + values: { indexNames: indexNames.join(', ') }, + }) + ); + }; diff --git a/x-pack/plugins/index_management/public/application/store/actions/refresh_indices.js b/x-pack/plugins/index_management/public/application/store/actions/refresh_indices.js index 0f1162bacc814..77944344c47c7 100644 --- a/x-pack/plugins/index_management/public/application/store/actions/refresh_indices.js +++ b/x-pack/plugins/index_management/public/application/store/actions/refresh_indices.js @@ -13,19 +13,21 @@ import { clearRowStatus, reloadIndices } from '../actions'; import { notificationService } from '../../services/notification'; export const refreshIndicesStart = createAction('INDEX_MANAGEMENT_REFRESH_INDICES_START'); -export const refreshIndices = ({ indexNames }) => async (dispatch) => { - dispatch(refreshIndicesStart({ indexNames })); - try { - await request(indexNames); - } catch (error) { - notificationService.showDangerToast(error.message); - return dispatch(clearRowStatus({ indexNames })); - } - dispatch(reloadIndices(indexNames)); - notificationService.showSuccessToast( - i18n.translate('xpack.idxMgmt.refreshIndicesAction.successfullyRefreshedIndicesMessage', { - defaultMessage: 'Successfully refreshed: [{indexNames}]', - values: { indexNames: indexNames.join(', ') }, - }) - ); -}; +export const refreshIndices = + ({ indexNames }) => + async (dispatch) => { + dispatch(refreshIndicesStart({ indexNames })); + try { + await request(indexNames); + } catch (error) { + notificationService.showDangerToast(error.message); + return dispatch(clearRowStatus({ indexNames })); + } + dispatch(reloadIndices(indexNames)); + notificationService.showSuccessToast( + i18n.translate('xpack.idxMgmt.refreshIndicesAction.successfullyRefreshedIndicesMessage', { + defaultMessage: 'Successfully refreshed: [{indexNames}]', + values: { indexNames: indexNames.join(', ') }, + }) + ); + }; diff --git a/x-pack/plugins/index_management/public/application/store/actions/unfreeze_indices.js b/x-pack/plugins/index_management/public/application/store/actions/unfreeze_indices.js index 9b0220e33b175..96d38c48f240d 100644 --- a/x-pack/plugins/index_management/public/application/store/actions/unfreeze_indices.js +++ b/x-pack/plugins/index_management/public/application/store/actions/unfreeze_indices.js @@ -13,19 +13,21 @@ import { notificationService } from '../../services/notification'; export const unfreezeIndicesStart = createAction('INDEX_MANAGEMENT_UNFREEZE_INDICES_START'); -export const unfreezeIndices = ({ indexNames }) => async (dispatch) => { - dispatch(unfreezeIndicesStart({ indexNames })); - try { - await request(indexNames); - } catch (error) { - notificationService.showDangerToast(error.message); - return dispatch(clearRowStatus({ indexNames })); - } - dispatch(reloadIndices(indexNames)); - notificationService.showSuccessToast( - i18n.translate('xpack.idxMgmt.unfreezeIndicesAction.successfullyUnfrozeIndicesMessage', { - defaultMessage: 'Successfully unfroze: [{indexNames}]', - values: { indexNames: indexNames.join(', ') }, - }) - ); -}; +export const unfreezeIndices = + ({ indexNames }) => + async (dispatch) => { + dispatch(unfreezeIndicesStart({ indexNames })); + try { + await request(indexNames); + } catch (error) { + notificationService.showDangerToast(error.message); + return dispatch(clearRowStatus({ indexNames })); + } + dispatch(reloadIndices(indexNames)); + notificationService.showSuccessToast( + i18n.translate('xpack.idxMgmt.unfreezeIndicesAction.successfullyUnfrozeIndicesMessage', { + defaultMessage: 'Successfully unfroze: [{indexNames}]', + values: { indexNames: indexNames.join(', ') }, + }) + ); + }; diff --git a/x-pack/plugins/index_management/public/application/store/actions/update_index_settings.js b/x-pack/plugins/index_management/public/application/store/actions/update_index_settings.js index 5d2fd5353fe09..bbb251634976e 100644 --- a/x-pack/plugins/index_management/public/application/store/actions/update_index_settings.js +++ b/x-pack/plugins/index_management/public/application/store/actions/update_index_settings.js @@ -18,24 +18,26 @@ export const updateIndexSettingsError = createAction( 'INDEX_MANAGEMENT_UPDATE_INDEX_SETTINGS_ERROR' ); -export const updateIndexSettings = ({ indexName, settings }) => async (dispatch) => { - if (Object.keys(settings).length !== 0) { - try { - const { error, message } = await request(indexName, settings); +export const updateIndexSettings = + ({ indexName, settings }) => + async (dispatch) => { + if (Object.keys(settings).length !== 0) { + try { + const { error, message } = await request(indexName, settings); - if (error) { - return dispatch(updateIndexSettingsError({ error: message })); + if (error) { + return dispatch(updateIndexSettingsError({ error: message })); + } + } catch (error) { + return dispatch(updateIndexSettingsError({ error: error.message })); } - } catch (error) { - return dispatch(updateIndexSettingsError({ error: error.message })); } - } - dispatch(updateIndexSettingsSuccess()); - dispatch(reloadIndices([indexName])); - notificationService.showSuccessToast( - i18n.translate('xpack.idxMgmt.updateIndexSettingsAction.settingsSuccessUpdateMessage', { - defaultMessage: 'Successfully updated settings for index {indexName}', - values: { indexName }, - }) - ); -}; + dispatch(updateIndexSettingsSuccess()); + dispatch(reloadIndices([indexName])); + notificationService.showSuccessToast( + i18n.translate('xpack.idxMgmt.updateIndexSettingsAction.settingsSuccessUpdateMessage', { + defaultMessage: 'Successfully updated settings for index {indexName}', + values: { indexName }, + }) + ); + }; diff --git a/x-pack/plugins/index_management/server/routes/api/component_templates/register_privileges_route.test.ts b/x-pack/plugins/index_management/server/routes/api/component_templates/register_privileges_route.test.ts index fdbf0db89e689..2c5070ab846ad 100644 --- a/x-pack/plugins/index_management/server/routes/api/component_templates/register_privileges_route.test.ts +++ b/x-pack/plugins/index_management/server/routes/api/component_templates/register_privileges_route.test.ts @@ -19,7 +19,7 @@ const httpService = httpServiceMock.createSetupContract(); const mockedIndexDataEnricher = new IndexDataEnricher(); const mockRouteContext = ({ hasPrivileges }: { hasPrivileges: unknown }): RequestHandlerContext => { - const routeContextMock = ({ + const routeContextMock = { core: { elasticsearch: { client: { @@ -31,7 +31,7 @@ const mockRouteContext = ({ hasPrivileges }: { hasPrivileges: unknown }): Reques }, }, }, - } as unknown) as RequestHandlerContext; + } as unknown as RequestHandlerContext; return routeContextMock; }; diff --git a/x-pack/plugins/infra/common/formatters/index.ts b/x-pack/plugins/infra/common/formatters/index.ts index a4aeee8084824..372df5b28ca1b 100644 --- a/x-pack/plugins/infra/common/formatters/index.ts +++ b/x-pack/plugins/infra/common/formatters/index.ts @@ -25,13 +25,13 @@ export const FORMATTERS = { highPercision: formatHighPercision, }; -export const createFormatter = (format: InventoryFormatterType, template: string = '{{value}}') => ( - val: string | number -) => { - if (val == null) { - return ''; - } - const fmtFn = FORMATTERS[format]; - const value = fmtFn(Number(val)); - return template.replace(/{{value}}/g, value); -}; +export const createFormatter = + (format: InventoryFormatterType, template: string = '{{value}}') => + (val: string | number) => { + if (val == null) { + return ''; + } + const fmtFn = FORMATTERS[format]; + const value = fmtFn(Number(val)); + return template.replace(/{{value}}/g, value); + }; diff --git a/x-pack/plugins/infra/common/http_api/log_sources/patch_log_source_configuration.ts b/x-pack/plugins/infra/common/http_api/log_sources/patch_log_source_configuration.ts index 30f53bc256cd8..a16f0651e7e5d 100644 --- a/x-pack/plugins/infra/common/http_api/log_sources/patch_log_source_configuration.ts +++ b/x-pack/plugins/infra/common/http_api/log_sources/patch_log_source_configuration.ts @@ -44,7 +44,8 @@ export type PatchLogSourceConfigurationRequestBody = rt.TypeOf< * response */ -export const patchLogSourceConfigurationSuccessResponsePayloadRT = getLogSourceConfigurationSuccessResponsePayloadRT; +export const patchLogSourceConfigurationSuccessResponsePayloadRT = + getLogSourceConfigurationSuccessResponsePayloadRT; export type PatchLogSourceConfigurationSuccessResponsePayload = rt.TypeOf< typeof patchLogSourceConfigurationSuccessResponsePayloadRT diff --git a/x-pack/plugins/infra/common/inventory_models/create_tsvb_model.ts b/x-pack/plugins/infra/common/inventory_models/create_tsvb_model.ts index 4280ef40a8249..5c9b3beb31c7c 100644 --- a/x-pack/plugins/infra/common/inventory_models/create_tsvb_model.ts +++ b/x-pack/plugins/infra/common/inventory_models/create_tsvb_model.ts @@ -7,19 +7,21 @@ import { TSVBMetricModelCreator, TSVBMetricModel, TSVBSeries, InventoryMetric } from './types'; -export const createTSVBModel = ( - id: InventoryMetric, - requires: string[], - series: TSVBSeries[], - interval = '>=300s', - dropLastBucket = true -): TSVBMetricModelCreator => (timeField, indexPattern): TSVBMetricModel => ({ - id, - requires, - drop_last_bucket: dropLastBucket, - index_pattern: indexPattern, - interval, - time_field: timeField, - type: 'timeseries', - series, -}); +export const createTSVBModel = + ( + id: InventoryMetric, + requires: string[], + series: TSVBSeries[], + interval = '>=300s', + dropLastBucket = true + ): TSVBMetricModelCreator => + (timeField, indexPattern): TSVBMetricModel => ({ + id, + requires, + drop_last_bucket: dropLastBucket, + index_pattern: indexPattern, + interval, + time_field: timeField, + type: 'timeseries', + series, + }); diff --git a/x-pack/plugins/infra/common/inventory_models/shared/components/metrics_and_groupby_toolbar_items.tsx b/x-pack/plugins/infra/common/inventory_models/shared/components/metrics_and_groupby_toolbar_items.tsx index 691ebec3c829c..b881396963d17 100644 --- a/x-pack/plugins/infra/common/inventory_models/shared/components/metrics_and_groupby_toolbar_items.tsx +++ b/x-pack/plugins/infra/common/inventory_models/shared/components/metrics_and_groupby_toolbar_items.tsx @@ -34,9 +34,10 @@ export const MetricsAndGroupByToolbarItems = (props: Props) => { [props.metricTypes] ); - const groupByOptions = useMemo(() => props.groupByFields.map(toGroupByOpt), [ - props.groupByFields, - ]); + const groupByOptions = useMemo( + () => props.groupByFields.map(toGroupByOpt), + [props.groupByFields] + ); return ( <> diff --git a/x-pack/plugins/infra/common/log_sources/resolved_log_source_configuration.ts b/x-pack/plugins/infra/common/log_sources/resolved_log_source_configuration.ts index ee831d9a98eb9..9c41a216c7f92 100644 --- a/x-pack/plugins/infra/common/log_sources/resolved_log_source_configuration.ts +++ b/x-pack/plugins/infra/common/log_sources/resolved_log_source_configuration.ts @@ -106,9 +106,9 @@ const resolveKibanaIndexPatternReference = async ( const resolveRuntimeMappings = (indexPattern: IndexPattern): estypes.MappingRuntimeFields => { const { runtimeFields } = indexPattern.getComputedFields(); - const runtimeMappingsFromIndexPattern = (Object.entries(runtimeFields) as ObjectEntries< - typeof runtimeFields - >).reduce( + const runtimeMappingsFromIndexPattern = ( + Object.entries(runtimeFields) as ObjectEntries + ).reduce( (accumulatedMappings, [runtimeFieldName, runtimeFieldSpec]) => ({ ...accumulatedMappings, [runtimeFieldName]: { diff --git a/x-pack/plugins/infra/common/runtime_types.ts b/x-pack/plugins/infra/common/runtime_types.ts index 43c1e3f520556..06df361b3de42 100644 --- a/x-pack/plugins/infra/common/runtime_types.ts +++ b/x-pack/plugins/infra/common/runtime_types.ts @@ -45,21 +45,25 @@ export const throwErrors = (createError: ErrorFactory) => (errors: Errors) => { throw createError(formatErrors(errors)); }; -export const decodeOrThrow = ( - runtimeType: Type, - createError: ErrorFactory = createPlainError -) => (inputValue: InputValue) => - pipe(runtimeType.decode(inputValue), fold(throwErrors(createError), identity)); +export const decodeOrThrow = + ( + runtimeType: Type, + createError: ErrorFactory = createPlainError + ) => + (inputValue: InputValue) => + pipe(runtimeType.decode(inputValue), fold(throwErrors(createError), identity)); type ValdidationResult = ReturnType>; -export const createValidationFunction = ( - runtimeType: Type -): RouteValidationFunction => (inputValue, { badRequest, ok }) => - pipe( - runtimeType.decode(inputValue), - fold>( - (errors: Errors) => badRequest(formatErrors(errors)), - (result: DecodedValue) => ok(result) - ) - ); +export const createValidationFunction = + ( + runtimeType: Type + ): RouteValidationFunction => + (inputValue, { badRequest, ok }) => + pipe( + runtimeType.decode(inputValue), + fold>( + (errors: Errors) => badRequest(formatErrors(errors)), + (result: DecodedValue) => ok(result) + ) + ); diff --git a/x-pack/plugins/infra/common/time/time_key.ts b/x-pack/plugins/infra/common/time/time_key.ts index 0647c6dcab42a..42b14625d22a9 100644 --- a/x-pack/plugins/infra/common/time/time_key.ts +++ b/x-pack/plugins/infra/common/time/time_key.ts @@ -54,10 +54,10 @@ export function compareTimeKeys( return timeComparison; } -export const compareToTimeKey = ( - keyAccessor: (value: Value) => TimeKey, - compareValues?: Comparator -) => (value: Value, key: TimeKey) => compareTimeKeys(keyAccessor(value), key, compareValues); +export const compareToTimeKey = + (keyAccessor: (value: Value) => TimeKey, compareValues?: Comparator) => + (value: Value, key: TimeKey) => + compareTimeKeys(keyAccessor(value), key, compareValues); export const getIndexAtTimeKey = ( keyAccessor: (value: Value) => TimeKey, diff --git a/x-pack/plugins/infra/common/utility_types.ts b/x-pack/plugins/infra/common/utility_types.ts index 1f26309973f0d..49d60c31a71ef 100644 --- a/x-pack/plugins/infra/common/utility_types.ts +++ b/x-pack/plugins/infra/common/utility_types.ts @@ -12,10 +12,9 @@ export type Pick3 = T & - { - [prop in Prop]-?: NonNullable; - }; +export type MandatoryProperty = T & { + [prop in Prop]-?: NonNullable; +}; /** * Portions of below code are derived from https://github.com/tycho01/typical diff --git a/x-pack/plugins/infra/public/alerting/common/components/metrics_alert_dropdown.tsx b/x-pack/plugins/infra/public/alerting/common/components/metrics_alert_dropdown.tsx index 5cbd1909054af..b92144d37eaa1 100644 --- a/x-pack/plugins/infra/public/alerting/common/components/metrics_alert_dropdown.tsx +++ b/x-pack/plugins/infra/public/alerting/common/components/metrics_alert_dropdown.tsx @@ -26,9 +26,10 @@ export const MetricsAlertDropdown = () => { const [visibleFlyoutType, setVisibleFlyoutType] = useState(null); const uiCapabilities = useKibana().services.application?.capabilities; - const canCreateAlerts = useMemo(() => Boolean(uiCapabilities?.infrastructure?.save), [ - uiCapabilities, - ]); + const canCreateAlerts = useMemo( + () => Boolean(uiCapabilities?.infrastructure?.save), + [uiCapabilities] + ); const closeFlyout = useCallback(() => setVisibleFlyoutType(null), [setVisibleFlyoutType]); diff --git a/x-pack/plugins/infra/public/alerting/inventory/components/expression.tsx b/x-pack/plugins/infra/public/alerting/inventory/components/expression.tsx index 78005d9d87cf9..f72c9d4531424 100644 --- a/x-pack/plugins/infra/public/alerting/inventory/components/expression.tsx +++ b/x-pack/plugins/infra/public/alerting/inventory/components/expression.tsx @@ -119,9 +119,10 @@ export const Expressions: React.FC = (props) => { const [timeSize, setTimeSize] = useState(1); const [timeUnit, setTimeUnit] = useState('m'); - const derivedIndexPattern = useMemo(() => createDerivedIndexPattern(), [ - createDerivedIndexPattern, - ]); + const derivedIndexPattern = useMemo( + () => createDerivedIndexPattern(), + [createDerivedIndexPattern] + ); const updateParams = useCallback( (id, e: InventoryMetricConditions) => { @@ -436,16 +437,8 @@ export const ExpressionRow: React.FC = (props) => { const [isExpanded, setRowState] = useState(true); const toggleRowState = useCallback(() => setRowState(!isExpanded), [isExpanded]); - const { - children, - setAlertParams, - expression, - errors, - expressionId, - remove, - canDelete, - fields, - } = props; + const { children, setAlertParams, expression, errors, expressionId, remove, canDelete, fields } = + props; const { metric, comparator = Comparator.GT, diff --git a/x-pack/plugins/infra/public/alerting/log_threshold/components/expression_editor/editor.tsx b/x-pack/plugins/infra/public/alerting/log_threshold/components/expression_editor/editor.tsx index 4eb0f3e8645cf..2664a0d6aa2b0 100644 --- a/x-pack/plugins/infra/public/alerting/log_threshold/components/expression_editor/editor.tsx +++ b/x-pack/plugins/infra/public/alerting/log_threshold/components/expression_editor/editor.tsx @@ -159,175 +159,177 @@ export const SourceStatusWrapper: React.FC = ({ children }) => { ); }; -export const Editor: React.FC< - AlertTypeParamsExpressionProps -> = (props) => { - const { setAlertParams, alertParams, errors } = props; - const [hasSetDefaults, setHasSetDefaults] = useState(false); - const { sourceId, resolvedSourceConfiguration } = useLogSourceContext(); - - const { - criteria: criteriaErrors, - threshold: thresholdErrors, - timeSizeUnit: timeSizeUnitErrors, - timeWindowSize: timeWindowSizeErrors, - } = useMemo(() => decodeOrThrow(errorsRT)(errors), [errors]); - - const supportedFields = useMemo(() => { - if (resolvedSourceConfiguration?.fields) { - return resolvedSourceConfiguration.fields.filter((field) => { - return (field.type === 'string' || field.type === 'number') && field.searchable; - }); - } else { - return []; - } - }, [resolvedSourceConfiguration]); - - const groupByFields = useMemo(() => { - if (resolvedSourceConfiguration?.fields) { - return resolvedSourceConfiguration.fields.filter((field) => { - return field.type === 'string' && field.aggregatable; - }); - } else { - return []; - } - }, [resolvedSourceConfiguration]); - - const updateThreshold = useCallback( - (thresholdParams) => { - const nextThresholdParams = { ...alertParams.count, ...thresholdParams }; - setAlertParams('count', nextThresholdParams); - }, - [alertParams.count, setAlertParams] - ); - - const updateCriteria = useCallback( - (criteria: PartialCriteriaType) => { - setAlertParams('criteria', criteria); - }, - [setAlertParams] - ); - - const updateTimeSize = useCallback( - (ts: number | undefined) => { - setAlertParams('timeSize', ts); - }, - [setAlertParams] - ); - - const updateTimeUnit = useCallback( - (tu: string) => { - if (timeUnitRT.is(tu)) { - setAlertParams('timeUnit', tu); +export const Editor: React.FC> = + (props) => { + const { setAlertParams, alertParams, errors } = props; + const [hasSetDefaults, setHasSetDefaults] = useState(false); + const { sourceId, resolvedSourceConfiguration } = useLogSourceContext(); + + const { + criteria: criteriaErrors, + threshold: thresholdErrors, + timeSizeUnit: timeSizeUnitErrors, + timeWindowSize: timeWindowSizeErrors, + } = useMemo(() => decodeOrThrow(errorsRT)(errors), [errors]); + + const supportedFields = useMemo(() => { + if (resolvedSourceConfiguration?.fields) { + return resolvedSourceConfiguration.fields.filter((field) => { + return (field.type === 'string' || field.type === 'number') && field.searchable; + }); + } else { + return []; } - }, - [setAlertParams] - ); - - const updateGroupBy = useCallback( - (groups: string[]) => { - setAlertParams('groupBy', groups); - }, - [setAlertParams] - ); - - const defaultCountAlertParams = useMemo(() => createDefaultCountAlertParams(supportedFields), [ - supportedFields, - ]); - - const updateType = useCallback( - (type: ThresholdType) => { - const defaults = - type === 'count' ? defaultCountAlertParams : createDefaultRatioAlertParams(supportedFields); - // Reset properties that don't make sense switching from one context to the other - setAlertParams('count', defaults.count); - setAlertParams('criteria', defaults.criteria); - }, - [defaultCountAlertParams, setAlertParams, supportedFields] - ); + }, [resolvedSourceConfiguration]); + + const groupByFields = useMemo(() => { + if (resolvedSourceConfiguration?.fields) { + return resolvedSourceConfiguration.fields.filter((field) => { + return field.type === 'string' && field.aggregatable; + }); + } else { + return []; + } + }, [resolvedSourceConfiguration]); + + const updateThreshold = useCallback( + (thresholdParams) => { + const nextThresholdParams = { ...alertParams.count, ...thresholdParams }; + setAlertParams('count', nextThresholdParams); + }, + [alertParams.count, setAlertParams] + ); - useMount(() => { - const newAlertParams = { ...defaultCountAlertParams, ...alertParams }; - for (const [key, value] of Object.entries(newAlertParams) as ObjectEntries< - typeof newAlertParams - >) { - setAlertParams(key, value); - } - setHasSetDefaults(true); - }); + const updateCriteria = useCallback( + (criteria: PartialCriteriaType) => { + setAlertParams('criteria', criteria); + }, + [setAlertParams] + ); - const shouldShowGroupByOptimizationWarning = useMemo(() => { - const hasSetGroupBy = alertParams.groupBy && alertParams.groupBy.length > 0; - return ( - hasSetGroupBy && - alertParams.count && - !isOptimizableGroupedThreshold(alertParams.count.comparator, alertParams.count.value) + const updateTimeSize = useCallback( + (ts: number | undefined) => { + setAlertParams('timeSize', ts); + }, + [setAlertParams] ); - }, [alertParams]); - - // Wait until the alert param defaults have been set - if (!hasSetDefaults) return null; - - const criteriaComponent = alertParams.criteria ? ( - - ) : null; - return ( - <> - + const updateTimeUnit = useCallback( + (tu: string) => { + if (timeUnitRT.is(tu)) { + setAlertParams('timeUnit', tu); + } + }, + [setAlertParams] + ); - {alertParams.criteria && !isRatioAlert(alertParams.criteria) && criteriaComponent} + const updateGroupBy = useCallback( + (groups: string[]) => { + setAlertParams('groupBy', groups); + }, + [setAlertParams] + ); - + const defaultCountAlertParams = useMemo( + () => createDefaultCountAlertParams(supportedFields), + [supportedFields] + ); - + const updateType = useCallback( + (type: ThresholdType) => { + const defaults = + type === 'count' + ? defaultCountAlertParams + : createDefaultRatioAlertParams(supportedFields); + // Reset properties that don't make sense switching from one context to the other + setAlertParams('count', defaults.count); + setAlertParams('criteria', defaults.criteria); + }, + [defaultCountAlertParams, setAlertParams, supportedFields] + ); - { + const newAlertParams = { ...defaultCountAlertParams, ...alertParams }; + for (const [key, value] of Object.entries(newAlertParams) as ObjectEntries< + typeof newAlertParams + >) { + setAlertParams(key, value); + } + setHasSetDefaults(true); + }); + + const shouldShowGroupByOptimizationWarning = useMemo(() => { + const hasSetGroupBy = alertParams.groupBy && alertParams.groupBy.length > 0; + return ( + hasSetGroupBy && + alertParams.count && + !isOptimizableGroupedThreshold(alertParams.count.comparator, alertParams.count.value) + ); + }, [alertParams]); + + // Wait until the alert param defaults have been set + if (!hasSetDefaults) return null; + + const criteriaComponent = alertParams.criteria ? ( + + ) : null; - {alertParams.criteria && isRatioAlert(alertParams.criteria) && criteriaComponent} - - {shouldShowGroupByOptimizationWarning && ( - <> - - - {i18n.translate('xpack.infra.logs.alertFlyout.groupByOptimizationWarning', { - defaultMessage: - 'When setting a "group by" we highly recommend using the "{comparator}" comparator for your threshold. This can lead to significant performance improvements.', - values: { - comparator: Comparator.GT, - }, - })} - - - )} - - - - ); -}; + return ( + <> + + + {alertParams.criteria && !isRatioAlert(alertParams.criteria) && criteriaComponent} + + + + + + + + {alertParams.criteria && isRatioAlert(alertParams.criteria) && criteriaComponent} + + {shouldShowGroupByOptimizationWarning && ( + <> + + + {i18n.translate('xpack.infra.logs.alertFlyout.groupByOptimizationWarning', { + defaultMessage: + 'When setting a "group by" we highly recommend using the "{comparator}" comparator for your threshold. This can lead to significant performance improvements.', + values: { + comparator: Comparator.GT, + }, + })} + + + )} + + + + ); + }; // required for dynamic import // eslint-disable-next-line import/no-default-export diff --git a/x-pack/plugins/infra/public/alerting/log_threshold/components/expression_editor/hooks/use_chart_preview_data.tsx b/x-pack/plugins/infra/public/alerting/log_threshold/components/expression_editor/hooks/use_chart_preview_data.tsx index f97ad64adedd4..42f826d09aca8 100644 --- a/x-pack/plugins/infra/public/alerting/log_threshold/components/expression_editor/hooks/use_chart_preview_data.tsx +++ b/x-pack/plugins/infra/public/alerting/log_threshold/components/expression_editor/hooks/use_chart_preview_data.tsx @@ -49,9 +49,10 @@ export const useChartPreviewData = ({ sourceId, alertParams, buckets }: Options) [sourceId, http, alertParams, buckets] ); - const isLoading = useMemo(() => getChartPreviewDataRequest.state === 'pending', [ - getChartPreviewDataRequest.state, - ]); + const isLoading = useMemo( + () => getChartPreviewDataRequest.state === 'pending', + [getChartPreviewDataRequest.state] + ); return { chartPreviewData, diff --git a/x-pack/plugins/infra/public/alerting/metric_anomaly/components/expression.tsx b/x-pack/plugins/infra/public/alerting/metric_anomaly/components/expression.tsx index 9f5c47554ac56..5c821c89ad317 100644 --- a/x-pack/plugins/infra/public/alerting/metric_anomaly/components/expression.tsx +++ b/x-pack/plugins/infra/public/alerting/metric_anomaly/components/expression.tsx @@ -66,9 +66,10 @@ export const Expression: React.FC = (props) => { toastWarning: notifications.toasts.addWarning, }); - const derivedIndexPattern = useMemo(() => createDerivedIndexPattern(), [ - createDerivedIndexPattern, - ]); + const derivedIndexPattern = useMemo( + () => createDerivedIndexPattern(), + [createDerivedIndexPattern] + ); const [influencerFieldName, updateInfluencerFieldName] = useState( alertParams.influencerFilter?.fieldName ?? 'host.name' diff --git a/x-pack/plugins/infra/public/alerting/metric_anomaly/components/influencer_filter.tsx b/x-pack/plugins/infra/public/alerting/metric_anomaly/components/influencer_filter.tsx index 34a917a77dcf5..fa149ab12fd63 100644 --- a/x-pack/plugins/infra/public/alerting/metric_anomaly/components/influencer_filter.tsx +++ b/x-pack/plugins/infra/public/alerting/metric_anomaly/components/influencer_filter.tsx @@ -35,9 +35,10 @@ export const InfluencerFilter = ({ onChangeFieldValue, derivedIndexPattern, }: Props) => { - const fieldNameOptions = useMemo(() => (nodeType === 'k8s' ? k8sFieldNames : hostFieldNames), [ - nodeType, - ]); + const fieldNameOptions = useMemo( + () => (nodeType === 'k8s' ? k8sFieldNames : hostFieldNames), + [nodeType] + ); // If initial props contain a fieldValue, assume it was passed in from loaded alertParams, // and enable the UI element @@ -52,9 +53,10 @@ export const InfluencerFilter = ({ [nodeType, onChangeFieldName] ); - const onSelectFieldName = useCallback((e) => onChangeFieldName(e.target.value), [ - onChangeFieldName, - ]); + const onSelectFieldName = useCallback( + (e) => onChangeFieldName(e.target.value), + [onChangeFieldName] + ); const onUpdateFieldValue = useCallback( (value) => { updateStoredFieldValue(value); @@ -79,32 +81,29 @@ export const InfluencerFilter = ({ [onUpdateFieldValue] ); - const affixFieldNameToQuery: CurryLoadSuggestionsType = (fn) => ( - expression, - cursorPosition, - maxSuggestions - ) => { - // Add the field name to the front of the passed-in query - const prefix = `${fieldName}:`; - // Trim whitespace to prevent AND/OR suggestions - const modifiedExpression = `${prefix}${expression}`.trim(); - // Move the cursor position forward by the length of the field name - const modifiedPosition = cursorPosition + prefix.length; - return fn(modifiedExpression, modifiedPosition, maxSuggestions, (suggestions) => - suggestions - .map((s) => ({ - ...s, - // Remove quotes from suggestions - text: s.text.replace(/\"/g, '').trim(), - // Offset the returned suggestions' cursor positions so that they can be autocompleted accurately - start: s.start - prefix.length, - end: s.end - prefix.length, - })) - // Removing quotes can lead to an already-selected suggestion still coming up in the autocomplete list, - // so filter these out - .filter((s) => !expression.startsWith(s.text)) - ); - }; + const affixFieldNameToQuery: CurryLoadSuggestionsType = + (fn) => (expression, cursorPosition, maxSuggestions) => { + // Add the field name to the front of the passed-in query + const prefix = `${fieldName}:`; + // Trim whitespace to prevent AND/OR suggestions + const modifiedExpression = `${prefix}${expression}`.trim(); + // Move the cursor position forward by the length of the field name + const modifiedPosition = cursorPosition + prefix.length; + return fn(modifiedExpression, modifiedPosition, maxSuggestions, (suggestions) => + suggestions + .map((s) => ({ + ...s, + // Remove quotes from suggestions + text: s.text.replace(/\"/g, '').trim(), + // Offset the returned suggestions' cursor positions so that they can be autocompleted accurately + start: s.start - prefix.length, + end: s.end - prefix.length, + })) + // Removing quotes can lead to an already-selected suggestion still coming up in the autocomplete list, + // so filter these out + .filter((s) => !expression.startsWith(s.text)) + ); + }; return ( = (props) => { const [timeSize, setTimeSize] = useState(1); const [timeUnit, setTimeUnit] = useState('m'); - const derivedIndexPattern = useMemo(() => createDerivedIndexPattern(), [ - createDerivedIndexPattern, - ]); + const derivedIndexPattern = useMemo( + () => createDerivedIndexPattern(), + [createDerivedIndexPattern] + ); const options = useMemo(() => { if (metadata?.currentOptions?.metrics) { 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 f6618603388d0..4dd191313261b 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 @@ -74,16 +74,8 @@ const StyledHealth = euiStyled(EuiHealth)` export const ExpressionRow: React.FC = (props) => { const [isExpanded, setRowState] = useState(true); const toggleRowState = useCallback(() => setRowState(!isExpanded), [isExpanded]); - const { - children, - setAlertParams, - expression, - errors, - expressionId, - remove, - fields, - canDelete, - } = props; + const { children, setAlertParams, expression, errors, expressionId, remove, fields, canDelete } = + props; const { aggType = AGGREGATION_TYPES.MAX, metric, diff --git a/x-pack/plugins/infra/public/components/autocomplete_field/autocomplete_field.tsx b/x-pack/plugins/infra/public/components/autocomplete_field/autocomplete_field.tsx index fbb883b228088..0e3e2018c963b 100644 --- a/x-pack/plugins/infra/public/components/autocomplete_field/autocomplete_field.tsx +++ b/x-pack/plugins/infra/public/components/autocomplete_field/autocomplete_field.tsx @@ -265,18 +265,17 @@ const withNextSuggestionSelected = ( : 0, }); -const withSuggestionAtIndexSelected = (suggestionIndex: number) => ( - state: AutocompleteFieldState, - props: AutocompleteFieldProps -): AutocompleteFieldState => ({ - ...state, - selectedIndex: - props.suggestions.length === 0 - ? null - : suggestionIndex >= 0 && suggestionIndex < props.suggestions.length - ? suggestionIndex - : 0, -}); +const withSuggestionAtIndexSelected = + (suggestionIndex: number) => + (state: AutocompleteFieldState, props: AutocompleteFieldProps): AutocompleteFieldState => ({ + ...state, + selectedIndex: + props.suggestions.length === 0 + ? null + : suggestionIndex >= 0 && suggestionIndex < props.suggestions.length + ? suggestionIndex + : 0, + }); const withSuggestionsVisible = (state: AutocompleteFieldState) => ({ ...state, diff --git a/x-pack/plugins/infra/public/components/basic_table/row_expansion_button.tsx b/x-pack/plugins/infra/public/components/basic_table/row_expansion_button.tsx index 76e7280acd080..7b046e9f2d252 100644 --- a/x-pack/plugins/infra/public/components/basic_table/row_expansion_button.tsx +++ b/x-pack/plugins/infra/public/components/basic_table/row_expansion_button.tsx @@ -20,12 +20,10 @@ export const RowExpansionButton = ({ onCollapse: (item: Item) => void; onExpand: (item: Item) => void; }) => { - const handleClick = useCallback(() => (isExpanded ? onCollapse(item) : onExpand(item)), [ - isExpanded, - item, - onCollapse, - onExpand, - ]); + const handleClick = useCallback( + () => (isExpanded ? onCollapse(item) : onExpand(item)), + [isExpanded, item, onCollapse, onExpand] + ); return ( getFormattedTime(time, dateFormat, fallbackFormat), [ - time, - dateFormat, - fallbackFormat, - ]); + const formattedTime = useMemo( + () => getFormattedTime(time, dateFormat, fallbackFormat), + [time, dateFormat, fallbackFormat] + ); return formattedTime; }; diff --git a/x-pack/plugins/infra/public/components/log_stream/log_stream_embeddable_factory.ts b/x-pack/plugins/infra/public/components/log_stream/log_stream_embeddable_factory.ts index 1c7e8ceb28fb4..15500dacf12d9 100644 --- a/x-pack/plugins/infra/public/components/log_stream/log_stream_embeddable_factory.ts +++ b/x-pack/plugins/infra/public/components/log_stream/log_stream_embeddable_factory.ts @@ -19,7 +19,8 @@ import { } from './log_stream_embeddable'; export class LogStreamEmbeddableFactoryDefinition - implements EmbeddableFactoryDefinition { + implements EmbeddableFactoryDefinition +{ public readonly type = LOG_STREAM_EMBEDDABLE; constructor(private getStartServices: StartServicesAccessor) {} diff --git a/x-pack/plugins/infra/public/components/logging/log_analysis_setup/setup_flyout/module_list.tsx b/x-pack/plugins/infra/public/components/logging/log_analysis_setup/setup_flyout/module_list.tsx index 969838284f1aa..0ccd208cf24bd 100644 --- a/x-pack/plugins/infra/public/components/logging/log_analysis_setup/setup_flyout/module_list.tsx +++ b/x-pack/plugins/infra/public/components/logging/log_analysis_setup/setup_flyout/module_list.tsx @@ -23,14 +23,10 @@ export const LogAnalysisModuleList: React.FC<{ onViewModuleSetup: (module: ModuleId) => void; }> = ({ onViewModuleSetup }) => { const { hasLogAnalysisSetupCapabilities } = useLogAnalysisCapabilitiesContext(); - const { - setupStatus: logEntryRateSetupStatus, - jobIds: logEntryRateJobIds, - } = useLogEntryRateModuleContext(); - const { - setupStatus: logEntryCategoriesSetupStatus, - jobIds: logEntryCategoriesJobIds, - } = useLogEntryCategoriesModuleContext(); + const { setupStatus: logEntryRateSetupStatus, jobIds: logEntryRateJobIds } = + useLogEntryRateModuleContext(); + const { setupStatus: logEntryCategoriesSetupStatus, jobIds: logEntryCategoriesJobIds } = + useLogEntryCategoriesModuleContext(); const viewLogEntryRateSetupFlyout = useCallback(() => { onViewModuleSetup('logs_ui_analysis'); diff --git a/x-pack/plugins/infra/public/components/logging/log_analysis_setup/setup_flyout/setup_flyout.tsx b/x-pack/plugins/infra/public/components/logging/log_analysis_setup/setup_flyout/setup_flyout.tsx index 4a744eafaf5f9..77ebb9084dbe3 100644 --- a/x-pack/plugins/infra/public/components/logging/log_analysis_setup/setup_flyout/setup_flyout.tsx +++ b/x-pack/plugins/infra/public/components/logging/log_analysis_setup/setup_flyout/setup_flyout.tsx @@ -26,12 +26,8 @@ const FLYOUT_HEADING_ID = 'logAnalysisSetupFlyoutHeading'; export const LogAnalysisSetupFlyout: React.FC<{ allowedModules?: ModuleId[]; }> = ({ allowedModules = moduleIds }) => { - const { - closeFlyout, - flyoutView, - showModuleList, - showModuleSetup, - } = useLogAnalysisSetupFlyoutStateContext(); + const { closeFlyout, flyoutView, showModuleList, showModuleSetup } = + useLogAnalysisSetupFlyoutStateContext(); if (flyoutView.view === 'hidden') { return null; diff --git a/x-pack/plugins/infra/public/components/logging/log_analysis_setup/setup_flyout/setup_flyout_state.ts b/x-pack/plugins/infra/public/components/logging/log_analysis_setup/setup_flyout/setup_flyout_state.ts index 4f73781a07d77..8167b50ab6021 100644 --- a/x-pack/plugins/infra/public/components/logging/log_analysis_setup/setup_flyout/setup_flyout_state.ts +++ b/x-pack/plugins/infra/public/components/logging/log_analysis_setup/setup_flyout/setup_flyout_state.ts @@ -42,7 +42,5 @@ export const useLogAnalysisSetupFlyoutState = ({ }; }; -export const [ - LogAnalysisSetupFlyoutStateProvider, - useLogAnalysisSetupFlyoutStateContext, -] = createContainer(useLogAnalysisSetupFlyoutState); +export const [LogAnalysisSetupFlyoutStateProvider, useLogAnalysisSetupFlyoutStateContext] = + createContainer(useLogAnalysisSetupFlyoutState); diff --git a/x-pack/plugins/infra/public/components/logging/log_text_stream/log_entry_row.tsx b/x-pack/plugins/infra/public/components/logging/log_text_stream/log_entry_row.tsx index 5ba2ddf736059..c871011d0f01a 100644 --- a/x-pack/plugins/infra/public/components/logging/log_text_stream/log_entry_row.tsx +++ b/x-pack/plugins/infra/public/components/logging/log_text_stream/log_entry_row.tsx @@ -80,10 +80,10 @@ export const LogEntryRow = memo( const setItemIsHovered = useCallback(() => setIsHovered(true), []); const setItemIsNotHovered = useCallback(() => setIsHovered(false), []); - const openFlyout = useCallback(() => openFlyoutWithItem?.(logEntry.id), [ - openFlyoutWithItem, - logEntry.id, - ]); + const openFlyout = useCallback( + () => openFlyoutWithItem?.(logEntry.id), + [openFlyoutWithItem, logEntry.id] + ); const handleOpenViewLogInContext = useCallback(() => { openViewLogInContext?.(logEntry); diff --git a/x-pack/plugins/infra/public/components/logging/log_text_stream/text_styles.tsx b/x-pack/plugins/infra/public/components/logging/log_text_stream/text_styles.tsx index 56c6698935b3e..d1330bdb44b33 100644 --- a/x-pack/plugins/infra/public/components/logging/log_text_stream/text_styles.tsx +++ b/x-pack/plugins/infra/public/components/logging/log_text_stream/text_styles.tsx @@ -77,11 +77,12 @@ export const useMeasuredCharacterDimensions = (scale: TextScale) => { }, []); const CharacterDimensionsProbe = useMemo( - () => () => ( - - X - - ), + () => () => + ( + + X + + ), [measureElement, scale] ); diff --git a/x-pack/plugins/infra/public/components/logging/log_text_stream/vertical_scroll_panel.tsx b/x-pack/plugins/infra/public/components/logging/log_text_stream/vertical_scroll_panel.tsx index 123455ecab2c8..7e13f8b4131fe 100644 --- a/x-pack/plugins/infra/public/components/logging/log_text_stream/vertical_scroll_panel.tsx +++ b/x-pack/plugins/infra/public/components/logging/log_text_stream/vertical_scroll_panel.tsx @@ -300,5 +300,6 @@ const getVisibleChildren = ( }; }; -const getChildIndexBefore = bisector<[any, Rect], number>(([key, rect]) => rect.top + rect.height) - .left; +const getChildIndexBefore = bisector<[any, Rect], number>( + ([key, rect]) => rect.top + rect.height +).left; diff --git a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_capabilities.tsx b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_capabilities.tsx index 26a2e19671da3..db519b4c795eb 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_capabilities.tsx +++ b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_capabilities.tsx @@ -17,9 +17,8 @@ import { useKibanaContextForPlugin } from '../../../hooks/use_kibana'; export const useLogAnalysisCapabilities = () => { const { services } = useKibanaContextForPlugin(); - const [mlCapabilities, setMlCapabilities] = useState( - initialMlCapabilities - ); + const [mlCapabilities, setMlCapabilities] = + useState(initialMlCapabilities); const [fetchMlCapabilitiesRequest, fetchMlCapabilities] = useTrackedPromise( { @@ -40,9 +39,10 @@ export const useLogAnalysisCapabilities = () => { fetchMlCapabilities(); }, [fetchMlCapabilities]); - const isLoading = useMemo(() => fetchMlCapabilitiesRequest.state === 'pending', [ - fetchMlCapabilitiesRequest.state, - ]); + const isLoading = useMemo( + () => fetchMlCapabilitiesRequest.state === 'pending', + [fetchMlCapabilitiesRequest.state] + ); const hasLogAnalysisSetupCapabilities = mlCapabilities.capabilities.canCreateJob; const hasLogAnalysisReadCapabilities = mlCapabilities.capabilities.canGetJobs; diff --git a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module.tsx b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module.tsx index a9ea7e6d6e39a..d844b7439710c 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module.tsx +++ b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module.tsx @@ -127,9 +127,10 @@ export const useLogAnalysisModule = ({ [spaceId, sourceId] ); - const isCleaningUp = useMemo(() => cleanUpModuleRequest.state === 'pending', [ - cleanUpModuleRequest.state, - ]); + const isCleaningUp = useMemo( + () => cleanUpModuleRequest.state === 'pending', + [cleanUpModuleRequest.state] + ); const cleanUpAndSetUpModule = useCallback( ( @@ -154,11 +155,10 @@ export const useLogAnalysisModule = ({ dispatchModuleStatus({ type: 'viewedResults' }); }, [dispatchModuleStatus]); - const jobIds = useMemo(() => moduleDescriptor.getJobIds(spaceId, sourceId), [ - moduleDescriptor, - spaceId, - sourceId, - ]); + const jobIds = useMemo( + () => moduleDescriptor.getJobIds(spaceId, sourceId), + [moduleDescriptor, spaceId, sourceId] + ); return { cleanUpAndSetUpModule, diff --git a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_configuration.ts b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_configuration.ts index ae58fb91b8881..057580679210a 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_configuration.ts +++ b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_configuration.ts @@ -27,33 +27,35 @@ export const useLogAnalysisModuleConfiguration = ({ }; }; -export const isJobConfigurationOutdated = ( - { bucketSpan }: ModuleDescriptor, - currentSourceConfiguration: ModuleSourceConfiguration -) => (jobSummary: JobSummary): boolean => { - if ( - !jobSummary.fullJob || - !jobSummary.fullJob.custom_settings || - !jobSummary.fullJob.datafeed_config - ) { - return false; - } +export const isJobConfigurationOutdated = + ( + { bucketSpan }: ModuleDescriptor, + currentSourceConfiguration: ModuleSourceConfiguration + ) => + (jobSummary: JobSummary): boolean => { + if ( + !jobSummary.fullJob || + !jobSummary.fullJob.custom_settings || + !jobSummary.fullJob.datafeed_config + ) { + return false; + } - const jobConfiguration = jobSummary.fullJob.custom_settings.logs_source_config; - const datafeedRuntimeMappings = jobSummary.fullJob.datafeed_config.runtime_mappings ?? {}; + const jobConfiguration = jobSummary.fullJob.custom_settings.logs_source_config; + const datafeedRuntimeMappings = jobSummary.fullJob.datafeed_config.runtime_mappings ?? {}; - return !( - jobConfiguration && - jobConfiguration.bucketSpan === bucketSpan && - jobConfiguration.indexPattern && - isSubset( - new Set(jobConfiguration.indexPattern.split(',')), - new Set(currentSourceConfiguration.indices) - ) && - jobConfiguration.timestampField === currentSourceConfiguration.timestampField && - equal(datafeedRuntimeMappings, currentSourceConfiguration.runtimeMappings) - ); -}; + return !( + jobConfiguration && + jobConfiguration.bucketSpan === bucketSpan && + jobConfiguration.indexPattern && + isSubset( + new Set(jobConfiguration.indexPattern.split(',')), + new Set(currentSourceConfiguration.indices) + ) && + jobConfiguration.timestampField === currentSourceConfiguration.timestampField && + equal(datafeedRuntimeMappings, currentSourceConfiguration.runtimeMappings) + ); + }; const isSubset = (subset: Set, superset: Set) => { return Array.from(subset).every((subsetElement) => superset.has(subsetElement)); diff --git a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_status.tsx b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_status.tsx index c3117c9326d1e..03522fd9ce6e5 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_status.tsx +++ b/x-pack/plugins/infra/public/containers/logs/log_analysis/log_analysis_module_status.tsx @@ -63,151 +63,152 @@ const createInitialState = ({ setupStatus: { type: 'initializing' }, }); -const createStatusReducer = (jobTypes: JobType[]) => ( - state: StatusReducerState, - action: StatusReducerAction -): StatusReducerState => { - switch (action.type) { - case 'startedSetup': { - return { - ...state, - jobStatus: jobTypes.reduce( - (accumulatedJobStatus, jobType) => ({ - ...accumulatedJobStatus, - [jobType]: 'initializing', - }), - {} as Record - ), - setupStatus: { type: 'pending' }, - }; - } - case 'finishedSetup': { - const { datafeedSetupResults, jobSetupResults, jobSummaries, spaceId, sourceId } = action; - const nextJobStatus = jobTypes.reduce( - (accumulatedJobStatus, jobType) => ({ - ...accumulatedJobStatus, - [jobType]: - hasSuccessfullyCreatedJob(getJobId(spaceId, sourceId, jobType))(jobSetupResults) && - hasSuccessfullyStartedDatafeed(getDatafeedId(spaceId, sourceId, jobType))( - datafeedSetupResults - ) - ? 'started' - : 'failed', - }), - {} as Record - ); - const nextSetupStatus: SetupStatus = Object.values(nextJobStatus).every( - (jobState) => jobState === 'started' - ) - ? { type: 'succeeded' } - : { - type: 'failed', - reasons: [ - ...Object.values(datafeedSetupResults) - .filter(hasError) - .map((datafeed) => datafeed.error.error?.reason), - ...Object.values(jobSetupResults) - .filter(hasError) - .map((job) => job.error.error?.reason), - ], - }; - - return { - ...state, - jobStatus: nextJobStatus, - jobSummaries, - setupStatus: nextSetupStatus, - }; - } - case 'failedSetup': { - return { - ...state, - jobStatus: jobTypes.reduce( +const createStatusReducer = + (jobTypes: JobType[]) => + ( + state: StatusReducerState, + action: StatusReducerAction + ): StatusReducerState => { + switch (action.type) { + case 'startedSetup': { + return { + ...state, + jobStatus: jobTypes.reduce( + (accumulatedJobStatus, jobType) => ({ + ...accumulatedJobStatus, + [jobType]: 'initializing', + }), + {} as Record + ), + setupStatus: { type: 'pending' }, + }; + } + case 'finishedSetup': { + const { datafeedSetupResults, jobSetupResults, jobSummaries, spaceId, sourceId } = action; + const nextJobStatus = jobTypes.reduce( (accumulatedJobStatus, jobType) => ({ ...accumulatedJobStatus, - [jobType]: 'failed', + [jobType]: + hasSuccessfullyCreatedJob(getJobId(spaceId, sourceId, jobType))(jobSetupResults) && + hasSuccessfullyStartedDatafeed(getDatafeedId(spaceId, sourceId, jobType))( + datafeedSetupResults + ) + ? 'started' + : 'failed', }), {} as Record - ), - setupStatus: { type: 'failed', reasons: ['unknown'] }, - }; - } - case 'fetchingJobStatuses': { - return { - ...state, - setupStatus: - state.setupStatus.type === 'unknown' ? { type: 'initializing' } : state.setupStatus, - }; - } - case 'fetchedJobStatuses': { - const { payload: jobSummaries, spaceId, sourceId } = action; - const { setupStatus } = state; + ); + const nextSetupStatus: SetupStatus = Object.values(nextJobStatus).every( + (jobState) => jobState === 'started' + ) + ? { type: 'succeeded' } + : { + type: 'failed', + reasons: [ + ...Object.values(datafeedSetupResults) + .filter(hasError) + .map((datafeed) => datafeed.error.error?.reason), + ...Object.values(jobSetupResults) + .filter(hasError) + .map((job) => job.error.error?.reason), + ], + }; - const nextJobStatus = jobTypes.reduce( - (accumulatedJobStatus, jobType) => ({ - ...accumulatedJobStatus, - [jobType]: getJobStatus(getJobId(spaceId, sourceId, jobType))(jobSummaries), - }), - {} as Record - ); - const nextSetupStatus = getSetupStatus(nextJobStatus)(setupStatus); + return { + ...state, + jobStatus: nextJobStatus, + jobSummaries, + setupStatus: nextSetupStatus, + }; + } + case 'failedSetup': { + return { + ...state, + jobStatus: jobTypes.reduce( + (accumulatedJobStatus, jobType) => ({ + ...accumulatedJobStatus, + [jobType]: 'failed', + }), + {} as Record + ), + setupStatus: { type: 'failed', reasons: ['unknown'] }, + }; + } + case 'fetchingJobStatuses': { + return { + ...state, + setupStatus: + state.setupStatus.type === 'unknown' ? { type: 'initializing' } : state.setupStatus, + }; + } + case 'fetchedJobStatuses': { + const { payload: jobSummaries, spaceId, sourceId } = action; + const { setupStatus } = state; - return { - ...state, - jobSummaries, - jobStatus: nextJobStatus, - setupStatus: nextSetupStatus, - }; - } - case 'failedFetchingJobStatuses': { - return { - ...state, - setupStatus: { type: 'unknown' }, - jobStatus: jobTypes.reduce( + const nextJobStatus = jobTypes.reduce( (accumulatedJobStatus, jobType) => ({ ...accumulatedJobStatus, - [jobType]: 'unknown', + [jobType]: getJobStatus(getJobId(spaceId, sourceId, jobType))(jobSummaries), }), {} as Record - ), - }; - } - case 'viewedResults': { - return { - ...state, - setupStatus: { type: 'skipped', newlyCreated: true }, - }; - } - default: { - return state; + ); + const nextSetupStatus = getSetupStatus(nextJobStatus)(setupStatus); + + return { + ...state, + jobSummaries, + jobStatus: nextJobStatus, + setupStatus: nextSetupStatus, + }; + } + case 'failedFetchingJobStatuses': { + return { + ...state, + setupStatus: { type: 'unknown' }, + jobStatus: jobTypes.reduce( + (accumulatedJobStatus, jobType) => ({ + ...accumulatedJobStatus, + [jobType]: 'unknown', + }), + {} as Record + ), + }; + } + case 'viewedResults': { + return { + ...state, + setupStatus: { type: 'skipped', newlyCreated: true }, + }; + } + default: { + return state; + } } - } -}; + }; -const hasSuccessfullyCreatedJob = (jobId: string) => ( - jobSetupResponses: SetupMlModuleResponsePayload['jobs'] -) => - jobSetupResponses.filter( - (jobSetupResponse) => - jobSetupResponse.id === jobId && jobSetupResponse.success && !jobSetupResponse.error - ).length > 0; +const hasSuccessfullyCreatedJob = + (jobId: string) => (jobSetupResponses: SetupMlModuleResponsePayload['jobs']) => + jobSetupResponses.filter( + (jobSetupResponse) => + jobSetupResponse.id === jobId && jobSetupResponse.success && !jobSetupResponse.error + ).length > 0; -const hasSuccessfullyStartedDatafeed = (datafeedId: string) => ( - datafeedSetupResponses: SetupMlModuleResponsePayload['datafeeds'] -) => - datafeedSetupResponses.filter( - (datafeedSetupResponse) => - datafeedSetupResponse.id === datafeedId && - datafeedSetupResponse.success && - datafeedSetupResponse.started && - !datafeedSetupResponse.error - ).length > 0; +const hasSuccessfullyStartedDatafeed = + (datafeedId: string) => (datafeedSetupResponses: SetupMlModuleResponsePayload['datafeeds']) => + datafeedSetupResponses.filter( + (datafeedSetupResponse) => + datafeedSetupResponse.id === datafeedId && + datafeedSetupResponse.success && + datafeedSetupResponse.started && + !datafeedSetupResponse.error + ).length > 0; -const getJobStatus = (jobId: string) => (jobSummaries: FetchJobStatusResponsePayload): JobStatus => - jobSummaries - .filter((jobSummary) => jobSummary.id === jobId) - .map( - (jobSummary): JobStatus => { +const getJobStatus = + (jobId: string) => + (jobSummaries: FetchJobStatusResponsePayload): JobStatus => + jobSummaries + .filter((jobSummary) => jobSummary.id === jobId) + .map((jobSummary): JobStatus => { if (jobSummary.jobState === 'failed' || jobSummary.datafeedState === '') { return 'failed'; } else if ( @@ -230,27 +231,26 @@ const getJobStatus = (jobId: string) => (jobSummaries: FetchJobStatusResponsePay } return 'unknown'; + })[0] || 'missing'; + +const getSetupStatus = + (everyJobStatus: Record) => + (previousSetupStatus: SetupStatus): SetupStatus => + Object.entries(everyJobStatus).reduce((setupStatus, [, jobStatus]) => { + if (jobStatus === 'missing') { + return { type: 'required' }; + } else if (setupStatus.type === 'required' || setupStatus.type === 'succeeded') { + return setupStatus; + } else if (setupStatus.type === 'skipped' || isJobStatusWithResults(jobStatus)) { + return { + type: 'skipped', + // preserve newlyCreated status + newlyCreated: setupStatus.type === 'skipped' && setupStatus.newlyCreated, + }; } - )[0] || 'missing'; -const getSetupStatus = (everyJobStatus: Record) => ( - previousSetupStatus: SetupStatus -): SetupStatus => - Object.entries(everyJobStatus).reduce((setupStatus, [, jobStatus]) => { - if (jobStatus === 'missing') { - return { type: 'required' }; - } else if (setupStatus.type === 'required' || setupStatus.type === 'succeeded') { return setupStatus; - } else if (setupStatus.type === 'skipped' || isJobStatusWithResults(jobStatus)) { - return { - type: 'skipped', - // preserve newlyCreated status - newlyCreated: setupStatus.type === 'skipped' && setupStatus.newlyCreated, - }; - } - - return setupStatus; - }, previousSetupStatus); + }, previousSetupStatus); const hasError = ( value: Value diff --git a/x-pack/plugins/infra/public/containers/logs/log_analysis/modules/log_entry_categories/use_log_entry_categories_module.tsx b/x-pack/plugins/infra/public/containers/logs/log_analysis/modules/log_entry_categories/use_log_entry_categories_module.tsx index 86e8e75dc3d41..99d4ab4becee5 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_analysis/modules/log_entry_categories/use_log_entry_categories_module.tsx +++ b/x-pack/plugins/infra/public/containers/logs/log_analysis/modules/log_entry_categories/use_log_entry_categories_module.tsx @@ -86,7 +86,5 @@ export const useLogEntryCategoriesModule = ({ }; }; -export const [ - LogEntryCategoriesModuleProvider, - useLogEntryCategoriesModuleContext, -] = createContainer(useLogEntryCategoriesModule); +export const [LogEntryCategoriesModuleProvider, useLogEntryCategoriesModuleContext] = + createContainer(useLogEntryCategoriesModule); diff --git a/x-pack/plugins/infra/public/containers/logs/log_analysis/modules/log_entry_rate/use_log_entry_rate_module.tsx b/x-pack/plugins/infra/public/containers/logs/log_analysis/modules/log_entry_rate/use_log_entry_rate_module.tsx index 0df5d9b446dbe..f3e8f7e777597 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_analysis/modules/log_entry_rate/use_log_entry_rate_module.tsx +++ b/x-pack/plugins/infra/public/containers/logs/log_analysis/modules/log_entry_rate/use_log_entry_rate_module.tsx @@ -80,6 +80,5 @@ export const useLogEntryRateModule = ({ }; }; -export const [LogEntryRateModuleProvider, useLogEntryRateModuleContext] = createContainer( - useLogEntryRateModule -); +export const [LogEntryRateModuleProvider, useLogEntryRateModuleContext] = + createContainer(useLogEntryRateModule); diff --git a/x-pack/plugins/infra/public/containers/logs/log_analysis/modules/log_entry_rate/use_log_entry_rate_setup.tsx b/x-pack/plugins/infra/public/containers/logs/log_analysis/modules/log_entry_rate/use_log_entry_rate_setup.tsx index cc1ef39de32cc..603747c2d2c2b 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_analysis/modules/log_entry_rate/use_log_entry_rate_setup.tsx +++ b/x-pack/plugins/infra/public/containers/logs/log_analysis/modules/log_entry_rate/use_log_entry_rate_setup.tsx @@ -56,6 +56,5 @@ export const useLogEntryRateSetup = () => { }; }; -export const [LogEntryRateSetupProvider, useLogEntryRateSetupContext] = createContainer( - useLogEntryRateSetup -); +export const [LogEntryRateSetupProvider, useLogEntryRateSetupContext] = + createContainer(useLogEntryRateSetup); diff --git a/x-pack/plugins/infra/public/containers/logs/log_highlights/log_highlights.tsx b/x-pack/plugins/infra/public/containers/logs/log_highlights/log_highlights.tsx index f7f6f156f78e8..dab4abff3bed4 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_highlights/log_highlights.tsx +++ b/x-pack/plugins/infra/public/containers/logs/log_highlights/log_highlights.tsx @@ -39,20 +39,17 @@ export const useLogHighlightsState = ({ const throttledStartTimestamp = useThrottle(startTimestamp, FETCH_THROTTLE_INTERVAL); const throttledEndTimestamp = useThrottle(endTimestamp, FETCH_THROTTLE_INTERVAL); - const { - logEntryHighlights, - logEntryHighlightsById, - loadLogEntryHighlightsRequest, - } = useLogEntryHighlights( - sourceId, - sourceVersion, - throttledStartTimestamp, - throttledEndTimestamp, - centerCursor, - size, - filterQuery, - highlightTerms - ); + const { logEntryHighlights, logEntryHighlightsById, loadLogEntryHighlightsRequest } = + useLogEntryHighlights( + sourceId, + sourceVersion, + throttledStartTimestamp, + throttledEndTimestamp, + centerCursor, + size, + filterQuery, + highlightTerms + ); const { logSummaryHighlights, loadLogSummaryHighlightsRequest } = useLogSummaryHighlights( sourceId, diff --git a/x-pack/plugins/infra/public/containers/logs/log_highlights/log_summary_highlights.ts b/x-pack/plugins/infra/public/containers/logs/log_highlights/log_summary_highlights.ts index 7a36fe6aae28c..59abb716f6cb3 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_highlights/log_summary_highlights.ts +++ b/x-pack/plugins/infra/public/containers/logs/log_highlights/log_summary_highlights.ts @@ -56,9 +56,10 @@ export const useLogSummaryHighlights = ( [sourceId, startTimestamp, endTimestamp, bucketSize, filterQuery, highlightTerms] ); - const debouncedLoadSummaryHighlights = useMemo(() => debounce(loadLogSummaryHighlights, 275), [ - loadLogSummaryHighlights, - ]); + const debouncedLoadSummaryHighlights = useMemo( + () => debounce(loadLogSummaryHighlights, 275), + [loadLogSummaryHighlights] + ); useEffect(() => { setLogSummaryHighlights([]); diff --git a/x-pack/plugins/infra/public/containers/logs/log_source/log_source.mock.ts b/x-pack/plugins/infra/public/containers/logs/log_source/log_source.mock.ts index bda1085d44612..6021c728d32af 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_source/log_source.mock.ts +++ b/x-pack/plugins/infra/public/containers/logs/log_source/log_source.mock.ts @@ -11,56 +11,56 @@ type CreateUseLogSource = (sourceConfiguration?: { sourceId?: string }) => typeo const defaultSourceId = 'default'; -export const createUninitializedUseLogSourceMock: CreateUseLogSource = ({ - sourceId = defaultSourceId, -} = {}) => () => ({ - derivedIndexPattern: { - fields: [], - title: 'unknown', - }, - hasFailedLoading: false, - hasFailedLoadingSource: false, - hasFailedLoadingSourceStatus: false, - hasFailedResolvingSource: false, - initialize: jest.fn(), - isLoading: false, - isLoadingSourceConfiguration: false, - isLoadingSourceStatus: false, - isResolvingSourceConfiguration: false, - isUninitialized: true, - loadSource: jest.fn(), - loadSourceConfiguration: jest.fn(), - latestLoadSourceFailures: [], - resolveSourceFailureMessage: undefined, - loadSourceStatus: jest.fn(), - sourceConfiguration: undefined, - sourceId, - sourceStatus: undefined, - updateSource: jest.fn(), - resolvedSourceConfiguration: undefined, - loadResolveLogSourceConfiguration: jest.fn(), -}); +export const createUninitializedUseLogSourceMock: CreateUseLogSource = + ({ sourceId = defaultSourceId } = {}) => + () => ({ + derivedIndexPattern: { + fields: [], + title: 'unknown', + }, + hasFailedLoading: false, + hasFailedLoadingSource: false, + hasFailedLoadingSourceStatus: false, + hasFailedResolvingSource: false, + initialize: jest.fn(), + isLoading: false, + isLoadingSourceConfiguration: false, + isLoadingSourceStatus: false, + isResolvingSourceConfiguration: false, + isUninitialized: true, + loadSource: jest.fn(), + loadSourceConfiguration: jest.fn(), + latestLoadSourceFailures: [], + resolveSourceFailureMessage: undefined, + loadSourceStatus: jest.fn(), + sourceConfiguration: undefined, + sourceId, + sourceStatus: undefined, + updateSource: jest.fn(), + resolvedSourceConfiguration: undefined, + loadResolveLogSourceConfiguration: jest.fn(), + }); -export const createLoadingUseLogSourceMock: CreateUseLogSource = ({ - sourceId = defaultSourceId, -} = {}) => (args) => ({ - ...createUninitializedUseLogSourceMock({ sourceId })(args), - isLoading: true, - isLoadingSourceConfiguration: true, - isLoadingSourceStatus: true, - isResolvingSourceConfiguration: true, -}); +export const createLoadingUseLogSourceMock: CreateUseLogSource = + ({ sourceId = defaultSourceId } = {}) => + (args) => ({ + ...createUninitializedUseLogSourceMock({ sourceId })(args), + isLoading: true, + isLoadingSourceConfiguration: true, + isLoadingSourceStatus: true, + isResolvingSourceConfiguration: true, + }); -export const createLoadedUseLogSourceMock: CreateUseLogSource = ({ - sourceId = defaultSourceId, -} = {}) => (args) => ({ - ...createUninitializedUseLogSourceMock({ sourceId })(args), - sourceConfiguration: createBasicSourceConfiguration(sourceId), - sourceStatus: { - logIndexFields: [], - logIndexStatus: 'available', - }, -}); +export const createLoadedUseLogSourceMock: CreateUseLogSource = + ({ sourceId = defaultSourceId } = {}) => + (args) => ({ + ...createUninitializedUseLogSourceMock({ sourceId })(args), + sourceConfiguration: createBasicSourceConfiguration(sourceId), + sourceStatus: { + logIndexFields: [], + logIndexStatus: 'available', + }, + }); export const createBasicSourceConfiguration = (sourceId: string): LogSourceConfiguration => ({ id: sourceId, diff --git a/x-pack/plugins/infra/public/containers/logs/log_stream/use_fetch_log_entries_after.ts b/x-pack/plugins/infra/public/containers/logs/log_stream/use_fetch_log_entries_after.ts index e41bc07dfd364..ea2162cb96e36 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_stream/use_fetch_log_entries_after.ts +++ b/x-pack/plugins/infra/public/containers/logs/log_stream/use_fetch_log_entries_after.ts @@ -88,13 +88,8 @@ export const useLogEntriesAfterResponse = flattenLogEntriesAfterSearchResponse ); - const { - cancelRequest, - isRequestRunning, - isResponsePartial, - loaded, - total, - } = useDataSearchResponseState(logEntriesAfterSearchResponse$); + const { cancelRequest, isRequestRunning, isResponsePartial, loaded, total } = + useDataSearchResponseState(logEntriesAfterSearchResponse$); return { cancelRequest, diff --git a/x-pack/plugins/infra/public/containers/logs/log_stream/use_fetch_log_entries_before.ts b/x-pack/plugins/infra/public/containers/logs/log_stream/use_fetch_log_entries_before.ts index c9a7dab168200..7d99b3069d973 100644 --- a/x-pack/plugins/infra/public/containers/logs/log_stream/use_fetch_log_entries_before.ts +++ b/x-pack/plugins/infra/public/containers/logs/log_stream/use_fetch_log_entries_before.ts @@ -44,34 +44,32 @@ export const useLogEntriesBeforeRequest = ({ sourceId: string; startTimestamp: number; }) => { - const { - search: fetchLogEntriesBefore, - requests$: logEntriesBeforeSearchRequests$, - } = useDataSearch({ - getRequest: useCallback( - (cursor: LogEntryBeforeCursor['before'], params: { size: number; extendTo?: number }) => { - return !!sourceId - ? { - request: { - params: logEntriesSearchRequestParamsRT.encode({ - before: cursor, - columns: columnOverrides, - endTimestamp, - highlightPhrase, - query: query as JsonObject, - size: params.size, - sourceId, - startTimestamp: params.extendTo ?? startTimestamp, - }), - }, - options: { strategy: LOG_ENTRIES_SEARCH_STRATEGY }, - } - : null; - }, - [columnOverrides, endTimestamp, highlightPhrase, query, sourceId, startTimestamp] - ), - parseResponses: parseLogEntriesBeforeSearchResponses, - }); + const { search: fetchLogEntriesBefore, requests$: logEntriesBeforeSearchRequests$ } = + useDataSearch({ + getRequest: useCallback( + (cursor: LogEntryBeforeCursor['before'], params: { size: number; extendTo?: number }) => { + return !!sourceId + ? { + request: { + params: logEntriesSearchRequestParamsRT.encode({ + before: cursor, + columns: columnOverrides, + endTimestamp, + highlightPhrase, + query: query as JsonObject, + size: params.size, + sourceId, + startTimestamp: params.extendTo ?? startTimestamp, + }), + }, + options: { strategy: LOG_ENTRIES_SEARCH_STRATEGY }, + } + : null; + }, + [columnOverrides, endTimestamp, highlightPhrase, query, sourceId, startTimestamp] + ), + parseResponses: parseLogEntriesBeforeSearchResponses, + }); return { fetchLogEntriesBefore, @@ -89,13 +87,8 @@ export const useLogEntriesBeforeResponse = { ] ); - const isUninitialized = useMemo(() => loadSourceRequest.state === 'uninitialized', [ - loadSourceRequest.state, - ]); + const isUninitialized = useMemo( + () => loadSourceRequest.state === 'uninitialized', + [loadSourceRequest.state] + ); const sourceExists = useMemo(() => (source ? !!source.version : undefined), [source]); diff --git a/x-pack/plugins/infra/public/containers/metrics_source/use_source_via_http.ts b/x-pack/plugins/infra/public/containers/metrics_source/use_source_via_http.ts index 2947f8fb09847..c7da5afd8dcd6 100644 --- a/x-pack/plugins/infra/public/containers/metrics_source/use_source_via_http.ts +++ b/x-pack/plugins/infra/public/containers/metrics_source/use_source_via_http.ts @@ -47,19 +47,15 @@ export const useSourceViaHttp = ({ sourceId = 'default', fetch, toastWarning }: ); }; - const { - error, - loading, - response, - makeRequest, - } = useHTTPRequest( - `/api/metrics/source/${sourceId}`, - 'GET', - null, - decodeResponse, - fetch, - toastWarning - ); + const { error, loading, response, makeRequest } = + useHTTPRequest( + `/api/metrics/source/${sourceId}`, + 'GET', + null, + decodeResponse, + fetch, + toastWarning + ); useEffect(() => { (async () => { diff --git a/x-pack/plugins/infra/public/containers/ml/infra_ml_capabilities.tsx b/x-pack/plugins/infra/public/containers/ml/infra_ml_capabilities.tsx index 661ce8f8a253c..7b9fe25cc3fa1 100644 --- a/x-pack/plugins/infra/public/containers/ml/infra_ml_capabilities.tsx +++ b/x-pack/plugins/infra/public/containers/ml/infra_ml_capabilities.tsx @@ -20,9 +20,8 @@ import { useKibanaContextForPlugin } from '../../hooks/use_kibana'; export const useInfraMLCapabilities = () => { const { services } = useKibanaContextForPlugin(); - const [mlCapabilities, setMlCapabilities] = useState( - initialMlCapabilities - ); + const [mlCapabilities, setMlCapabilities] = + useState(initialMlCapabilities); const [fetchMlCapabilitiesRequest, fetchMlCapabilities] = useTrackedPromise( { @@ -46,9 +45,10 @@ export const useInfraMLCapabilities = () => { fetchMlCapabilities(); }, [fetchMlCapabilities]); - const isLoading = useMemo(() => fetchMlCapabilitiesRequest.state === 'pending', [ - fetchMlCapabilitiesRequest.state, - ]); + const isLoading = useMemo( + () => fetchMlCapabilitiesRequest.state === 'pending', + [fetchMlCapabilitiesRequest.state] + ); const hasInfraMLSetupCapabilities = mlCapabilities.capabilities.canCreateJob; const hasInfraMLReadCapabilities = mlCapabilities.capabilities.canGetJobs; @@ -63,9 +63,8 @@ export const useInfraMLCapabilities = () => { }; }; -export const [InfraMLCapabilitiesProvider, useInfraMLCapabilitiesContext] = createContainer( - useInfraMLCapabilities -); +export const [InfraMLCapabilitiesProvider, useInfraMLCapabilitiesContext] = + createContainer(useInfraMLCapabilities); const initialMlCapabilities = { capabilities: { diff --git a/x-pack/plugins/infra/public/containers/ml/infra_ml_module.tsx b/x-pack/plugins/infra/public/containers/ml/infra_ml_module.tsx index b55ae65e58e91..198a99f394850 100644 --- a/x-pack/plugins/infra/public/containers/ml/infra_ml_module.tsx +++ b/x-pack/plugins/infra/public/containers/ml/infra_ml_module.tsx @@ -104,9 +104,10 @@ export const useInfraMLModule = ({ [spaceId, sourceId] ); - const isCleaningUp = useMemo(() => cleanUpModuleRequest.state === 'pending', [ - cleanUpModuleRequest.state, - ]); + const isCleaningUp = useMemo( + () => cleanUpModuleRequest.state === 'pending', + [cleanUpModuleRequest.state] + ); const cleanUpAndSetUpModule = useCallback( ( @@ -132,11 +133,10 @@ export const useInfraMLModule = ({ dispatchModuleStatus({ type: 'viewedResults' }); }, [dispatchModuleStatus]); - const jobIds = useMemo(() => moduleDescriptor.getJobIds(spaceId, sourceId), [ - moduleDescriptor, - spaceId, - sourceId, - ]); + const jobIds = useMemo( + () => moduleDescriptor.getJobIds(spaceId, sourceId), + [moduleDescriptor, spaceId, sourceId] + ); return { cleanUpAndSetUpModule, diff --git a/x-pack/plugins/infra/public/containers/ml/infra_ml_module_configuration.ts b/x-pack/plugins/infra/public/containers/ml/infra_ml_module_configuration.ts index 3f8ebb835211d..4c876c1705364 100644 --- a/x-pack/plugins/infra/public/containers/ml/infra_ml_module_configuration.ts +++ b/x-pack/plugins/infra/public/containers/ml/infra_ml_module_configuration.ts @@ -26,27 +26,29 @@ export const useInfraMLModuleConfiguration = ({ }; }; -export const isJobConfigurationOutdated = ( - { bucketSpan }: ModuleDescriptor, - currentSourceConfiguration: ModuleSourceConfiguration -) => (jobSummary: JobSummary): boolean => { - if (!jobSummary.fullJob || !jobSummary.fullJob.custom_settings) { - return false; - } +export const isJobConfigurationOutdated = + ( + { bucketSpan }: ModuleDescriptor, + currentSourceConfiguration: ModuleSourceConfiguration + ) => + (jobSummary: JobSummary): boolean => { + if (!jobSummary.fullJob || !jobSummary.fullJob.custom_settings) { + return false; + } - const jobConfiguration = jobSummary.fullJob.custom_settings.metrics_source_config; + const jobConfiguration = jobSummary.fullJob.custom_settings.metrics_source_config; - return !( - jobConfiguration && - jobConfiguration.bucketSpan === bucketSpan && - jobConfiguration.indexPattern && - isSubset( - new Set(jobConfiguration.indexPattern.split(',')), - new Set(currentSourceConfiguration.indices) - ) && - jobConfiguration.timestampField === currentSourceConfiguration.timestampField - ); -}; + return !( + jobConfiguration && + jobConfiguration.bucketSpan === bucketSpan && + jobConfiguration.indexPattern && + isSubset( + new Set(jobConfiguration.indexPattern.split(',')), + new Set(currentSourceConfiguration.indices) + ) && + jobConfiguration.timestampField === currentSourceConfiguration.timestampField + ); + }; const isSubset = (subset: Set, superset: Set) => { return Array.from(subset).every((subsetElement) => superset.has(subsetElement)); diff --git a/x-pack/plugins/infra/public/containers/ml/infra_ml_module_status.tsx b/x-pack/plugins/infra/public/containers/ml/infra_ml_module_status.tsx index 4ebad85ef0fe7..9bbd7720e168f 100644 --- a/x-pack/plugins/infra/public/containers/ml/infra_ml_module_status.tsx +++ b/x-pack/plugins/infra/public/containers/ml/infra_ml_module_status.tsx @@ -63,153 +63,152 @@ const createInitialState = ({ setupStatus: { type: 'initializing' }, }); -const createStatusReducer = (jobTypes: JobType[]) => ( - state: StatusReducerState, - action: StatusReducerAction -): StatusReducerState => { - switch (action.type) { - case 'startedSetup': { - return { - ...state, - jobStatus: jobTypes.reduce( +const createStatusReducer = + (jobTypes: JobType[]) => + ( + state: StatusReducerState, + action: StatusReducerAction + ): StatusReducerState => { + switch (action.type) { + case 'startedSetup': { + return { + ...state, + jobStatus: jobTypes.reduce( + (accumulatedJobStatus, jobType) => ({ + ...accumulatedJobStatus, + [jobType]: 'initializing', + }), + {} as Record + ), + setupStatus: { type: 'pending' }, + }; + } + case 'finishedSetup': { + const { datafeedSetupResults, jobSetupResults, jobSummaries, spaceId, sourceId } = action; + const nextJobStatus = jobTypes.reduce( (accumulatedJobStatus, jobType) => ({ ...accumulatedJobStatus, - [jobType]: 'initializing', + [jobType]: + hasSuccessfullyCreatedJob(getJobId(spaceId, sourceId, jobType))(jobSetupResults) && + hasSuccessfullyStartedDatafeed(getDatafeedId(spaceId, sourceId, jobType))( + datafeedSetupResults + ) + ? 'started' + : 'failed', }), {} as Record - ), - setupStatus: { type: 'pending' }, - }; - } - case 'finishedSetup': { - const { datafeedSetupResults, jobSetupResults, jobSummaries, spaceId, sourceId } = action; - const nextJobStatus = jobTypes.reduce( - (accumulatedJobStatus, jobType) => ({ - ...accumulatedJobStatus, - [jobType]: - hasSuccessfullyCreatedJob(getJobId(spaceId, sourceId, jobType))(jobSetupResults) && - hasSuccessfullyStartedDatafeed(getDatafeedId(spaceId, sourceId, jobType))( - datafeedSetupResults - ) - ? 'started' - : 'failed', - }), - {} as Record - ); - const nextSetupStatus: SetupStatus = Object.values(nextJobStatus).every( - (jobState) => jobState === 'started' - ) - ? { type: 'succeeded' } - : { - type: 'failed', - reasons: [ - ...Object.values(datafeedSetupResults) - .filter(hasError) - .map((datafeed) => datafeed.error.msg), - ...Object.values(jobSetupResults) - .filter(hasError) - .map((job) => job.error.msg), - ], - }; + ); + const nextSetupStatus: SetupStatus = Object.values(nextJobStatus).every( + (jobState) => jobState === 'started' + ) + ? { type: 'succeeded' } + : { + type: 'failed', + reasons: [ + ...Object.values(datafeedSetupResults) + .filter(hasError) + .map((datafeed) => datafeed.error.msg), + ...Object.values(jobSetupResults) + .filter(hasError) + .map((job) => job.error.msg), + ], + }; - return { - ...state, - jobStatus: nextJobStatus, - jobSummaries, - setupStatus: nextSetupStatus, - }; - } - case 'failedSetup': { - return { - ...state, - jobStatus: jobTypes.reduce( + return { + ...state, + jobStatus: nextJobStatus, + jobSummaries, + setupStatus: nextSetupStatus, + }; + } + case 'failedSetup': { + return { + ...state, + jobStatus: jobTypes.reduce( + (accumulatedJobStatus, jobType) => ({ + ...accumulatedJobStatus, + [jobType]: 'failed', + }), + {} as Record + ), + setupStatus: { type: 'failed', reasons: ['unknown'] }, + }; + } + case 'fetchingJobStatuses': { + return { + ...state, + setupStatus: + state.setupStatus.type === 'unknown' ? { type: 'initializing' } : state.setupStatus, + }; + } + case 'fetchedJobStatuses': { + const { payload: jobSummaries, spaceId, sourceId } = action; + const { setupStatus } = state; + const nextJobStatus = jobTypes.reduce( (accumulatedJobStatus, jobType) => ({ ...accumulatedJobStatus, - [jobType]: 'failed', + [jobType]: getJobStatus(getJobId(spaceId, sourceId, jobType))(jobSummaries), }), {} as Record - ), - setupStatus: { type: 'failed', reasons: ['unknown'] }, - }; - } - case 'fetchingJobStatuses': { - return { - ...state, - setupStatus: - state.setupStatus.type === 'unknown' ? { type: 'initializing' } : state.setupStatus, - }; - } - case 'fetchedJobStatuses': { - const { payload: jobSummaries, spaceId, sourceId } = action; - const { setupStatus } = state; - const nextJobStatus = jobTypes.reduce( - (accumulatedJobStatus, jobType) => ({ - ...accumulatedJobStatus, - [jobType]: getJobStatus(getJobId(spaceId, sourceId, jobType))(jobSummaries), - }), - {} as Record - ); - const nextSetupStatus = getSetupStatus(nextJobStatus)(setupStatus); + ); + const nextSetupStatus = getSetupStatus(nextJobStatus)(setupStatus); - return { - ...state, - jobSummaries, - jobStatus: nextJobStatus, - setupStatus: nextSetupStatus, - }; - } - case 'failedFetchingJobStatuses': { - return { - ...state, - setupStatus: { type: 'unknown' }, - jobStatus: jobTypes.reduce( - (accumulatedJobStatus, jobType) => ({ - ...accumulatedJobStatus, - [jobType]: 'unknown', - }), - {} as Record - ), - }; - } - case 'viewedResults': { - return { - ...state, - setupStatus: { type: 'skipped', newlyCreated: true }, - }; - } - default: { - return state; + return { + ...state, + jobSummaries, + jobStatus: nextJobStatus, + setupStatus: nextSetupStatus, + }; + } + case 'failedFetchingJobStatuses': { + return { + ...state, + setupStatus: { type: 'unknown' }, + jobStatus: jobTypes.reduce( + (accumulatedJobStatus, jobType) => ({ + ...accumulatedJobStatus, + [jobType]: 'unknown', + }), + {} as Record + ), + }; + } + case 'viewedResults': { + return { + ...state, + setupStatus: { type: 'skipped', newlyCreated: true }, + }; + } + default: { + return state; + } } - } -}; + }; -const hasSuccessfullyCreatedJob = (jobId: string) => ( - jobSetupResponses: SetupMlModuleResponsePayload['jobs'] -) => - jobSetupResponses.filter( - (jobSetupResponse) => - jobSetupResponse.id === jobId && jobSetupResponse.success && !jobSetupResponse.error - ).length > 0; +const hasSuccessfullyCreatedJob = + (jobId: string) => (jobSetupResponses: SetupMlModuleResponsePayload['jobs']) => + jobSetupResponses.filter( + (jobSetupResponse) => + jobSetupResponse.id === jobId && jobSetupResponse.success && !jobSetupResponse.error + ).length > 0; -const hasSuccessfullyStartedDatafeed = (datafeedId: string) => ( - datafeedSetupResponses: SetupMlModuleResponsePayload['datafeeds'] -) => - datafeedSetupResponses.filter( - (datafeedSetupResponse) => - datafeedSetupResponse.id === datafeedId && - datafeedSetupResponse.success && - datafeedSetupResponse.started && - !datafeedSetupResponse.error - ).length > 0; +const hasSuccessfullyStartedDatafeed = + (datafeedId: string) => (datafeedSetupResponses: SetupMlModuleResponsePayload['datafeeds']) => + datafeedSetupResponses.filter( + (datafeedSetupResponse) => + datafeedSetupResponse.id === datafeedId && + datafeedSetupResponse.success && + datafeedSetupResponse.started && + !datafeedSetupResponse.error + ).length > 0; -const getJobStatus = (jobId: string) => ( - jobSummaries: FetchJobStatusResponsePayload -): JobStatus => { - return ( - jobSummaries - .filter((jobSummary) => jobSummary.id === jobId) - .map( - (jobSummary): JobStatus => { +const getJobStatus = + (jobId: string) => + (jobSummaries: FetchJobStatusResponsePayload): JobStatus => { + return ( + jobSummaries + .filter((jobSummary) => jobSummary.id === jobId) + .map((jobSummary): JobStatus => { if (jobSummary.jobState === 'failed' || jobSummary.datafeedState === '') { return 'failed'; } else if ( @@ -232,33 +231,32 @@ const getJobStatus = (jobId: string) => ( } return 'unknown'; + })[0] || 'missing' + ); + }; + +const getSetupStatus = + (everyJobStatus: Record) => + (previousSetupStatus: SetupStatus): SetupStatus => { + return Object.entries(everyJobStatus).reduce( + (setupStatus, [, jobStatus]) => { + if (jobStatus === 'missing') { + return { type: 'required' }; + } else if (setupStatus.type === 'required' || setupStatus.type === 'succeeded') { + return setupStatus; + } else if (setupStatus.type === 'skipped' || isJobStatusWithResults(jobStatus)) { + return { + type: 'skipped', + // preserve newlyCreated status + newlyCreated: setupStatus.type === 'skipped' && setupStatus.newlyCreated, + }; } - )[0] || 'missing' - ); -}; -const getSetupStatus = (everyJobStatus: Record) => ( - previousSetupStatus: SetupStatus -): SetupStatus => { - return Object.entries(everyJobStatus).reduce( - (setupStatus, [, jobStatus]) => { - if (jobStatus === 'missing') { - return { type: 'required' }; - } else if (setupStatus.type === 'required' || setupStatus.type === 'succeeded') { return setupStatus; - } else if (setupStatus.type === 'skipped' || isJobStatusWithResults(jobStatus)) { - return { - type: 'skipped', - // preserve newlyCreated status - newlyCreated: setupStatus.type === 'skipped' && setupStatus.newlyCreated, - }; - } - - return setupStatus; - }, - previousSetupStatus - ); -}; + }, + previousSetupStatus + ); + }; const hasError = ( value: Value diff --git a/x-pack/plugins/infra/public/containers/ml/modules/metrics_hosts/module.tsx b/x-pack/plugins/infra/public/containers/ml/modules/metrics_hosts/module.tsx index 2697a4223fc18..f892ab62ee3d8 100644 --- a/x-pack/plugins/infra/public/containers/ml/modules/metrics_hosts/module.tsx +++ b/x-pack/plugins/infra/public/containers/ml/modules/metrics_hosts/module.tsx @@ -76,6 +76,5 @@ export const useMetricHostsModule = ({ }; }; -export const [MetricHostsModuleProvider, useMetricHostsModuleContext] = createContainer( - useMetricHostsModule -); +export const [MetricHostsModuleProvider, useMetricHostsModuleContext] = + createContainer(useMetricHostsModule); diff --git a/x-pack/plugins/infra/public/containers/ml/modules/metrics_k8s/module.tsx b/x-pack/plugins/infra/public/containers/ml/modules/metrics_k8s/module.tsx index 98edbca2166b8..eadc374434817 100644 --- a/x-pack/plugins/infra/public/containers/ml/modules/metrics_k8s/module.tsx +++ b/x-pack/plugins/infra/public/containers/ml/modules/metrics_k8s/module.tsx @@ -76,6 +76,5 @@ export const useMetricK8sModule = ({ }; }; -export const [MetricK8sModuleProvider, useMetricK8sModuleContext] = createContainer( - useMetricK8sModule -); +export const [MetricK8sModuleProvider, useMetricK8sModuleContext] = + createContainer(useMetricK8sModule); diff --git a/x-pack/plugins/infra/public/containers/saved_view/saved_view.tsx b/x-pack/plugins/infra/public/containers/saved_view/saved_view.tsx index c54a2a69a994c..44792019a5f9c 100644 --- a/x-pack/plugins/infra/public/containers/saved_view/saved_view.tsx +++ b/x-pack/plugins/infra/public/containers/saved_view/saved_view.tsx @@ -62,9 +62,13 @@ export const useSavedView = (props: Props) => { } = useContext(Source.Context); const { viewType, defaultViewState } = props; type ViewState = typeof defaultViewState; - const { data, loading, find, error: errorOnFind, hasView } = useFindSavedObject< - SavedViewSavedObject - >(viewType); + const { + data, + loading, + find, + error: errorOnFind, + hasView, + } = useFindSavedObject>(viewType); const [urlState, setUrlState] = useUrlState({ defaultState: DEFAULT_SAVED_VIEW_STATE, decodeUrlState, @@ -75,12 +79,18 @@ export const useSavedView = (props: Props) => { const [shouldLoadDefault] = useState(props.shouldLoadDefault); const [currentView, setCurrentView] = useState | null>(null); const [loadingDefaultView, setLoadingDefaultView] = useState(null); - const { create, error: errorOnCreate, data: createdViewData, createdId } = useCreateSavedObject( - viewType - ); - const { update, error: errorOnUpdate, data: updatedViewData, updatedId } = useUpdateSavedObject( - viewType - ); + const { + create, + error: errorOnCreate, + data: createdViewData, + createdId, + } = useCreateSavedObject(viewType); + const { + update, + error: errorOnUpdate, + data: updatedViewData, + updatedId, + } = useUpdateSavedObject(viewType); const { deleteObject, deletedId } = useDeleteSavedObject(viewType); const { getObject, data: currentViewSavedObject } = useGetSavedObject(viewType); const [createError, setCreateError] = useState(null); diff --git a/x-pack/plugins/infra/public/containers/with_kuery_autocompletion.tsx b/x-pack/plugins/infra/public/containers/with_kuery_autocompletion.tsx index 1a759950f640d..f50c629d521e5 100644 --- a/x-pack/plugins/infra/public/containers/with_kuery_autocompletion.tsx +++ b/x-pack/plugins/infra/public/containers/with_kuery_autocompletion.tsx @@ -61,9 +61,8 @@ class WithKueryAutocompletionComponent extends React.Component< ) => { const { indexPattern } = this.props; const language = 'kuery'; - const hasQuerySuggestions = this.props.kibana.services.data?.autocomplete.hasQuerySuggestions( - language - ); + const hasQuerySuggestions = + this.props.kibana.services.data?.autocomplete.hasQuerySuggestions(language); if (!hasQuerySuggestions) { return; diff --git a/x-pack/plugins/infra/public/hooks/use_kibana.ts b/x-pack/plugins/infra/public/hooks/use_kibana.ts index 207e08589cde9..1d21f352a9ea4 100644 --- a/x-pack/plugins/infra/public/hooks/use_kibana.ts +++ b/x-pack/plugins/infra/public/hooks/use_kibana.ts @@ -21,4 +21,5 @@ export const createKibanaContextForPlugin = (core: CoreStart, pluginsStart: Infr ...pluginsStart, }); -export const useKibanaContextForPlugin = useKibana as () => KibanaReactContextValue; +export const useKibanaContextForPlugin = + useKibana as () => KibanaReactContextValue; diff --git a/x-pack/plugins/infra/public/metrics_overview_fetchers.ts b/x-pack/plugins/infra/public/metrics_overview_fetchers.ts index 4f5b73d685591..57017d25ecc64 100644 --- a/x-pack/plugins/infra/public/metrics_overview_fetchers.ts +++ b/x-pack/plugins/infra/public/metrics_overview_fetchers.ts @@ -17,44 +17,43 @@ import { FetchDataParams, MetricsFetchDataResponse } from '../../observability/p import { TopNodesRequest, TopNodesResponse } from '../common/http_api/overview_api'; import { InfraClientCoreSetup } from './types'; -export const createMetricsHasData = ( - getStartServices: InfraClientCoreSetup['getStartServices'] -) => async () => { - const [coreServices] = await getStartServices(); - const { http } = coreServices; - const results = await http.get<{ hasData: boolean }>('/api/metrics/source/default/hasData'); - return results.hasData; -}; +export const createMetricsHasData = + (getStartServices: InfraClientCoreSetup['getStartServices']) => async () => { + const [coreServices] = await getStartServices(); + const { http } = coreServices; + const results = await http.get<{ hasData: boolean }>('/api/metrics/source/default/hasData'); + return results.hasData; + }; -export const createMetricsFetchData = ( - getStartServices: InfraClientCoreSetup['getStartServices'] -) => async ({ absoluteTime, bucketSize }: FetchDataParams): Promise => { - const [coreServices] = await getStartServices(); - const { http } = coreServices; +export const createMetricsFetchData = + (getStartServices: InfraClientCoreSetup['getStartServices']) => + async ({ absoluteTime, bucketSize }: FetchDataParams): Promise => { + const [coreServices] = await getStartServices(); + const { http } = coreServices; - const makeRequest = async (overrides: Partial = {}) => { - const { start, end } = absoluteTime; + const makeRequest = async (overrides: Partial = {}) => { + const { start, end } = absoluteTime; - const overviewRequest: TopNodesRequest = { - sourceId: 'default', - bucketSize, - size: 5, - timerange: { - from: start, - to: end, - }, - ...overrides, - }; - const results = await http.post('/api/metrics/overview/top', { - body: JSON.stringify(overviewRequest), - }); - return { - appLink: `/app/metrics/inventory?waffleTime=(currentTime:${end},isAutoReloading:!f)`, - series: results.series, - sort: async (by: string, direction: string) => - makeRequest({ sort: by, sortDirection: direction }), + const overviewRequest: TopNodesRequest = { + sourceId: 'default', + bucketSize, + size: 5, + timerange: { + from: start, + to: end, + }, + ...overrides, + }; + const results = await http.post('/api/metrics/overview/top', { + body: JSON.stringify(overviewRequest), + }); + return { + appLink: `/app/metrics/inventory?waffleTime=(currentTime:${end},isAutoReloading:!f)`, + series: results.series, + sort: async (by: string, direction: string) => + makeRequest({ sort: by, sortDirection: direction }), + }; }; - }; - return await makeRequest(); -}; + return await makeRequest(); + }; diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page_content.tsx b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page_content.tsx index bfdbe03526164..a8d98ea843c96 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page_content.tsx +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page_content.tsx @@ -40,9 +40,10 @@ export const LogEntryCategoriesPageContent = () => { const { fetchJobStatus, setupStatus, jobStatus } = useLogEntryCategoriesModuleContext(); const { showModuleSetup } = useLogAnalysisSetupFlyoutStateContext(); - const showCategoriesModuleSetup = useCallback(() => showModuleSetup('logs_ui_categories'), [ - showModuleSetup, - ]); + const showCategoriesModuleSetup = useCallback( + () => showModuleSetup('logs_ui_categories'), + [showModuleSetup] + ); useEffect(() => { if (hasLogAnalysisReadCapabilities) { diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page_results_content.tsx b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page_results_content.tsx index 7098f457117d3..bf6fe978ddae2 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page_results_content.tsx +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page_results_content.tsx @@ -40,240 +40,241 @@ interface LogEntryCategoriesResultsContentProps { pageTitle: string; } -export const LogEntryCategoriesResultsContent: React.FunctionComponent = ({ - onOpenSetup, - pageTitle, -}) => { - useTrackPageview({ app: 'infra_logs', path: 'log_entry_categories_results' }); - useTrackPageview({ app: 'infra_logs', path: 'log_entry_categories_results', delay: 15000 }); +export const LogEntryCategoriesResultsContent: React.FunctionComponent = + ({ onOpenSetup, pageTitle }) => { + useTrackPageview({ app: 'infra_logs', path: 'log_entry_categories_results' }); + useTrackPageview({ app: 'infra_logs', path: 'log_entry_categories_results', delay: 15000 }); - const { - services: { ml, http }, - } = useKibanaContextForPlugin(); + const { + services: { ml, http }, + } = useKibanaContextForPlugin(); - const { hasLogAnalysisSetupCapabilities } = useLogAnalysisCapabilitiesContext(); + const { hasLogAnalysisSetupCapabilities } = useLogAnalysisCapabilitiesContext(); - const { - fetchJobStatus, - fetchModuleDefinition, - moduleDescriptor, - setupStatus, - hasOutdatedJobConfigurations, - hasOutdatedJobDefinitions, - hasStoppedJobs, - jobIds, - categoryQualityWarnings, - sourceConfiguration: { sourceId }, - } = useLogEntryCategoriesModuleContext(); + const { + fetchJobStatus, + fetchModuleDefinition, + moduleDescriptor, + setupStatus, + hasOutdatedJobConfigurations, + hasOutdatedJobDefinitions, + hasStoppedJobs, + jobIds, + categoryQualityWarnings, + sourceConfiguration: { sourceId }, + } = useLogEntryCategoriesModuleContext(); - const { - timeRange: selectedTimeRange, - setTimeRange: setSelectedTimeRange, - autoRefresh, - setAutoRefresh, - } = useLogEntryCategoriesResultsUrlState(); + const { + timeRange: selectedTimeRange, + setTimeRange: setSelectedTimeRange, + autoRefresh, + setAutoRefresh, + } = useLogEntryCategoriesResultsUrlState(); - const [categoryQueryTimeRange, setCategoryQueryTimeRange] = useState<{ - lastChangedTime: number; - timeRange: TimeRange; - }>(() => ({ - lastChangedTime: Date.now(), - timeRange: stringToNumericTimeRange(selectedTimeRange), - })); + const [categoryQueryTimeRange, setCategoryQueryTimeRange] = useState<{ + lastChangedTime: number; + timeRange: TimeRange; + }>(() => ({ + lastChangedTime: Date.now(), + timeRange: stringToNumericTimeRange(selectedTimeRange), + })); - const [categoryQueryDatasets, setCategoryQueryDatasets] = useState([]); + const [categoryQueryDatasets, setCategoryQueryDatasets] = useState([]); - const { services } = useKibana<{}>(); + const { services } = useKibana<{}>(); - const showLoadDataErrorNotification = useCallback( - (error: Error) => { - services.notifications?.toasts.addError(error, { - title: loadDataErrorTitle, - }); - }, - [services.notifications] - ); + const showLoadDataErrorNotification = useCallback( + (error: Error) => { + services.notifications?.toasts.addError(error, { + title: loadDataErrorTitle, + }); + }, + [services.notifications] + ); - const { - getLogEntryCategoryDatasets, - getTopLogEntryCategories, - isLoadingLogEntryCategoryDatasets, - isLoadingTopLogEntryCategories, - logEntryCategoryDatasets, - topLogEntryCategories, - sortOptions, - changeSortOptions, - } = useLogEntryCategoriesResults({ - categoriesCount: 25, - endTime: categoryQueryTimeRange.timeRange.endTime, - filteredDatasets: categoryQueryDatasets, - onGetTopLogEntryCategoriesError: showLoadDataErrorNotification, - sourceId, - startTime: categoryQueryTimeRange.timeRange.startTime, - }); + const { + getLogEntryCategoryDatasets, + getTopLogEntryCategories, + isLoadingLogEntryCategoryDatasets, + isLoadingTopLogEntryCategories, + logEntryCategoryDatasets, + topLogEntryCategories, + sortOptions, + changeSortOptions, + } = useLogEntryCategoriesResults({ + categoriesCount: 25, + endTime: categoryQueryTimeRange.timeRange.endTime, + filteredDatasets: categoryQueryDatasets, + onGetTopLogEntryCategoriesError: showLoadDataErrorNotification, + sourceId, + startTime: categoryQueryTimeRange.timeRange.startTime, + }); - const handleQueryTimeRangeChange = useCallback( - ({ start: startTime, end: endTime }: { start: string; end: string }) => { - setCategoryQueryTimeRange((previousQueryParameters) => ({ - ...previousQueryParameters, - timeRange: stringToNumericTimeRange({ startTime, endTime }), - lastChangedTime: Date.now(), - })); - }, - [setCategoryQueryTimeRange] - ); + const handleQueryTimeRangeChange = useCallback( + ({ start: startTime, end: endTime }: { start: string; end: string }) => { + setCategoryQueryTimeRange((previousQueryParameters) => ({ + ...previousQueryParameters, + timeRange: stringToNumericTimeRange({ startTime, endTime }), + lastChangedTime: Date.now(), + })); + }, + [setCategoryQueryTimeRange] + ); - const handleSelectedTimeRangeChange = useCallback( - (selectedTime: { start: string; end: string; isInvalid: boolean }) => { - if (selectedTime.isInvalid) { - return; - } - setSelectedTimeRange({ - startTime: selectedTime.start, - endTime: selectedTime.end, - }); - handleQueryTimeRangeChange(selectedTime); - }, - [setSelectedTimeRange, handleQueryTimeRangeChange] - ); + const handleSelectedTimeRangeChange = useCallback( + (selectedTime: { start: string; end: string; isInvalid: boolean }) => { + if (selectedTime.isInvalid) { + return; + } + setSelectedTimeRange({ + startTime: selectedTime.start, + endTime: selectedTime.end, + }); + handleQueryTimeRangeChange(selectedTime); + }, + [setSelectedTimeRange, handleQueryTimeRangeChange] + ); - const handleAutoRefreshChange = useCallback( - ({ isPaused, refreshInterval: interval }: { isPaused: boolean; refreshInterval: number }) => { - setAutoRefresh({ - isPaused, - interval, - }); - }, - [setAutoRefresh] - ); + const handleAutoRefreshChange = useCallback( + ({ isPaused, refreshInterval: interval }: { isPaused: boolean; refreshInterval: number }) => { + setAutoRefresh({ + isPaused, + interval, + }); + }, + [setAutoRefresh] + ); - const hasResults = useMemo(() => topLogEntryCategories.length > 0, [ - topLogEntryCategories.length, - ]); + const hasResults = useMemo( + () => topLogEntryCategories.length > 0, + [topLogEntryCategories.length] + ); - const isFirstUse = useMemo( - () => - ((setupStatus.type === 'skipped' && !!setupStatus.newlyCreated) || - setupStatus.type === 'succeeded') && - !hasResults, - [hasResults, setupStatus] - ); + const isFirstUse = useMemo( + () => + ((setupStatus.type === 'skipped' && !!setupStatus.newlyCreated) || + setupStatus.type === 'succeeded') && + !hasResults, + [hasResults, setupStatus] + ); - useEffect(() => { - getTopLogEntryCategories(); - }, [ - getTopLogEntryCategories, - categoryQueryDatasets, - categoryQueryTimeRange.lastChangedTime, - sortOptions, - ]); + useEffect(() => { + getTopLogEntryCategories(); + }, [ + getTopLogEntryCategories, + categoryQueryDatasets, + categoryQueryTimeRange.lastChangedTime, + sortOptions, + ]); - useEffect(() => { - getLogEntryCategoryDatasets(); - }, [getLogEntryCategoryDatasets, categoryQueryTimeRange.lastChangedTime]); + useEffect(() => { + getLogEntryCategoryDatasets(); + }, [getLogEntryCategoryDatasets, categoryQueryTimeRange.lastChangedTime]); - useEffect(() => { - fetchModuleDefinition(); - }, [fetchModuleDefinition]); + useEffect(() => { + fetchModuleDefinition(); + }, [fetchModuleDefinition]); - useInterval(() => { - fetchJobStatus(); - }, JOB_STATUS_POLLING_INTERVAL); + useInterval(() => { + fetchJobStatus(); + }, JOB_STATUS_POLLING_INTERVAL); - useInterval( - () => { - handleQueryTimeRangeChange({ - start: selectedTimeRange.startTime, - end: selectedTimeRange.endTime, - }); - }, - autoRefresh.isPaused ? null : autoRefresh.interval - ); + useInterval( + () => { + handleQueryTimeRangeChange({ + start: selectedTimeRange.startTime, + end: selectedTimeRange.endTime, + }); + }, + autoRefresh.isPaused ? null : autoRefresh.interval + ); - const analyzeInMlLink = useMlHref(ml, http.basePath.get(), { - page: ML_PAGES.ANOMALY_EXPLORER, - pageState: { - jobIds: [jobIds['log-entry-categories-count']], - timeRange: { - from: moment(categoryQueryTimeRange.timeRange.startTime).format('YYYY-MM-DDTHH:mm:ss.SSSZ'), - to: moment(categoryQueryTimeRange.timeRange.endTime).format('YYYY-MM-DDTHH:mm:ss.SSSZ'), - mode: 'absolute', + const analyzeInMlLink = useMlHref(ml, http.basePath.get(), { + page: ML_PAGES.ANOMALY_EXPLORER, + pageState: { + jobIds: [jobIds['log-entry-categories-count']], + timeRange: { + from: moment(categoryQueryTimeRange.timeRange.startTime).format( + 'YYYY-MM-DDTHH:mm:ss.SSSZ' + ), + to: moment(categoryQueryTimeRange.timeRange.endTime).format('YYYY-MM-DDTHH:mm:ss.SSSZ'), + mode: 'absolute', + }, }, - }, - }); + }); - return ( - - , - , - ], - }} + return ( + - - - - - - - - - - - - - - - - - - - - - - ); -}; + , + , + ], + }} + > + + + + + + + + + + + + + + + + + + + + + + ); + }; const stringToNumericTimeRange = (timeRange: StringTimeRange): TimeRange => ({ startTime: moment( diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page_setup_content.tsx b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page_setup_content.tsx index 18adfaad03ef8..c012d97dd1fc0 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page_setup_content.tsx +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/page_setup_content.tsx @@ -14,41 +14,40 @@ interface LogEntryCategoriesSetupContentProps { onOpenSetup: () => void; } -export const LogEntryCategoriesSetupContent: React.FunctionComponent = ({ - onOpenSetup, -}) => { - useTrackPageview({ app: 'infra_logs', path: 'log_entry_categories_setup' }); - useTrackPageview({ app: 'infra_logs', path: 'log_entry_categories_setup', delay: 15000 }); +export const LogEntryCategoriesSetupContent: React.FunctionComponent = + ({ onOpenSetup }) => { + useTrackPageview({ app: 'infra_logs', path: 'log_entry_categories_setup' }); + useTrackPageview({ app: 'infra_logs', path: 'log_entry_categories_setup', delay: 15000 }); - return ( - - - - } - body={ - -

+ return ( + -

-
- } - actions={ - - - - } - /> - ); -}; + + } + body={ + +

+ +

+
+ } + actions={ + + + + } + /> + ); + }; diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/use_log_entry_categories_results.ts b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/use_log_entry_categories_results.ts index 73779af8752ee..b4cfb301e0402 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_categories/use_log_entry_categories_results.ts +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_categories/use_log_entry_categories_results.ts @@ -18,7 +18,8 @@ import { callGetLogEntryCategoryDatasetsAPI } from './service_calls/get_log_entr import { useKibanaContextForPlugin } from '../../../hooks/use_kibana'; type TopLogEntryCategories = GetLogEntryCategoriesSuccessResponsePayload['data']['categories']; -type LogEntryCategoryDatasets = GetLogEntryCategoryDatasetsSuccessResponsePayload['data']['datasets']; +type LogEntryCategoryDatasets = + GetLogEntryCategoryDatasetsSuccessResponsePayload['data']['datasets']; export type SortOptions = CategoriesSort; export type ChangeSortOptions = (sortOptions: CategoriesSort) => void; @@ -46,10 +47,8 @@ export const useLogEntryCategoriesResults = ({ }); const { services } = useKibanaContextForPlugin(); const [topLogEntryCategories, setTopLogEntryCategories] = useState([]); - const [ - logEntryCategoryDatasets, - setLogEntryCategoryDatasets, - ] = useState([]); + const [logEntryCategoryDatasets, setLogEntryCategoryDatasets] = + useState([]); const [getTopLogEntryCategoriesRequest, getTopLogEntryCategories] = useTrackedPromise( { diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/page_results_content.tsx b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/page_results_content.tsx index 2d833c87c1e25..2aac520dbc28a 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/page_results_content.tsx +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/page_results_content.tsx @@ -161,12 +161,14 @@ export const LogEntryRateResultsContent: React.FunctionComponent<{ const { showModuleList, showModuleSetup } = useLogAnalysisSetupFlyoutStateContext(); - const showLogEntryRateSetup = useCallback(() => showModuleSetup('logs_ui_analysis'), [ - showModuleSetup, - ]); - const showLogEntryCategoriesSetup = useCallback(() => showModuleSetup('logs_ui_categories'), [ - showModuleSetup, - ]); + const showLogEntryRateSetup = useCallback( + () => showModuleSetup('logs_ui_analysis'), + [showModuleSetup] + ); + const showLogEntryCategoriesSetup = useCallback( + () => showModuleSetup('logs_ui_categories'), + [showModuleSetup] + ); const hasAnomalyResults = logEntryAnomalies.length > 0; diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_log_entry_anomalies_results.ts b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_log_entry_anomalies_results.ts index 3cb0c4c89927c..80123bb10e550 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_log_entry_anomalies_results.ts +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_log_entry_anomalies_results.ts @@ -27,7 +27,8 @@ export type FetchPreviousPage = () => void; export type ChangeSortOptions = (sortOptions: AnomaliesSort) => void; export type ChangePaginationOptions = (paginationOptions: PaginationOptions) => void; export type LogEntryAnomalies = LogEntryAnomaly[]; -type LogEntryAnomaliesDatasets = GetLogEntryAnomaliesDatasetsSuccessResponsePayload['data']['datasets']; +type LogEntryAnomaliesDatasets = + GetLogEntryAnomaliesDatasetsSuccessResponsePayload['data']['datasets']; interface PaginationCursors { previousPageCursor: PaginationCursor; nextPageCursor: PaginationCursor; @@ -285,10 +286,8 @@ export const useLogEntryAnomaliesResults = ({ ); // Anomalies datasets - const [ - logEntryAnomaliesDatasets, - setLogEntryAnomaliesDatasets, - ] = useState([]); + const [logEntryAnomaliesDatasets, setLogEntryAnomaliesDatasets] = + useState([]); const [getLogEntryAnomaliesDatasetsRequest, getLogEntryAnomaliesDatasets] = useTrackedPromise( { @@ -315,9 +314,10 @@ export const useLogEntryAnomaliesResults = ({ [endTime, sourceId, startTime] ); - const isLoadingDatasets = useMemo(() => getLogEntryAnomaliesDatasetsRequest.state === 'pending', [ - getLogEntryAnomaliesDatasetsRequest.state, - ]); + const isLoadingDatasets = useMemo( + () => getLogEntryAnomaliesDatasetsRequest.state === 'pending', + [getLogEntryAnomaliesDatasetsRequest.state] + ); const hasFailedLoadingDatasets = useMemo( () => getLogEntryAnomaliesDatasetsRequest.state === 'rejected', diff --git a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_log_entry_examples.ts b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_log_entry_examples.ts index 34d14de4aa941..8f6269c46c3df 100644 --- a/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_log_entry_examples.ts +++ b/x-pack/plugins/infra/public/pages/logs/log_entry_rate/use_log_entry_examples.ts @@ -53,9 +53,10 @@ export const useLogEntryExamples = ({ [dataset, endTime, exampleCount, sourceId, startTime] ); - const isLoadingLogEntryExamples = useMemo(() => getLogEntryExamplesRequest.state === 'pending', [ - getLogEntryExamplesRequest.state, - ]); + const isLoadingLogEntryExamples = useMemo( + () => getLogEntryExamplesRequest.state === 'pending', + [getLogEntryExamplesRequest.state] + ); const hasFailedLoadingLogEntryExamples = useMemo( () => getLogEntryExamplesRequest.state === 'rejected', diff --git a/x-pack/plugins/infra/public/pages/logs/settings/fields_configuration_panel.tsx b/x-pack/plugins/infra/public/pages/logs/settings/fields_configuration_panel.tsx index 3f8922b1871c9..d21b0b0588dea 100644 --- a/x-pack/plugins/infra/public/pages/logs/settings/fields_configuration_panel.tsx +++ b/x-pack/plugins/infra/public/pages/logs/settings/fields_configuration_panel.tsx @@ -118,18 +118,20 @@ export const FieldsConfigurationPanel = ({ defaultMessage="Timestamp" /> } - {...useMemo(() => getFormRowProps(timestampFieldFormElement), [ - timestampFieldFormElement, - ])} + {...useMemo( + () => getFormRowProps(timestampFieldFormElement), + [timestampFieldFormElement] + )} > getStringInputFieldProps(timestampFieldFormElement), [ - timestampFieldFormElement, - ])} + {...useMemo( + () => getStringInputFieldProps(timestampFieldFormElement), + [timestampFieldFormElement] + )} />
@@ -166,18 +168,20 @@ export const FieldsConfigurationPanel = ({ defaultMessage="Tiebreaker" /> } - {...useMemo(() => getFormRowProps(tiebreakerFieldFormElement), [ - tiebreakerFieldFormElement, - ])} + {...useMemo( + () => getFormRowProps(tiebreakerFieldFormElement), + [tiebreakerFieldFormElement] + )} > getStringInputFieldProps(tiebreakerFieldFormElement), [ - tiebreakerFieldFormElement, - ])} + {...useMemo( + () => getStringInputFieldProps(tiebreakerFieldFormElement), + [tiebreakerFieldFormElement] + )} /> diff --git a/x-pack/plugins/infra/public/pages/logs/settings/form_elements.tsx b/x-pack/plugins/infra/public/pages/logs/settings/form_elements.tsx index 90504a691cb95..8058a10bcd269 100644 --- a/x-pack/plugins/infra/public/pages/logs/settings/form_elements.tsx +++ b/x-pack/plugins/infra/public/pages/logs/settings/form_elements.tsx @@ -141,10 +141,10 @@ export const useCompositeFormElement = ({ } }, [childFormElementEntries]); - const validity = useMemo(() => getCombinedValidity(formValidity, childFormElementsValidity), [ - formValidity, - childFormElementsValidity, - ]); + const validity = useMemo( + () => getCombinedValidity(formValidity, childFormElementsValidity), + [formValidity, childFormElementsValidity] + ); const resetValue = useCallback(() => { childFormElementEntries.forEach(([, formElement]) => formElement.resetValue()); @@ -180,10 +180,10 @@ const useValidity = ( value: Value, validate?: (value: Value) => Promise ) => { - const validationState = useAsync(() => validate?.(value) ?? Promise.resolve([]), [ - validate, - value, - ]); + const validationState = useAsync( + () => validate?.(value) ?? Promise.resolve([]), + [validate, value] + ); const validity = useMemo>(() => { if (validationState.loading) { @@ -236,8 +236,9 @@ export const getCombinedValidity = ( } }; -export const isFormElementForType = ( - isValue: (value: any) => value is Value -) => ( - formElement: FormElement -): formElement is FormElement => isValue(formElement.value); +export const isFormElementForType = + (isValue: (value: any) => value is Value) => + ( + formElement: FormElement + ): formElement is FormElement => + isValue(formElement.value); diff --git a/x-pack/plugins/infra/public/pages/logs/settings/form_field_props.tsx b/x-pack/plugins/infra/public/pages/logs/settings/form_field_props.tsx index 4a3927157b136..81711f7464da8 100644 --- a/x-pack/plugins/infra/public/pages/logs/settings/form_field_props.tsx +++ b/x-pack/plugins/infra/public/pages/logs/settings/form_field_props.tsx @@ -19,17 +19,19 @@ export const getFormRowProps = (formElement: FormElement( - decodeInputValue: (value: string) => Value, - encodeInputValue: (value: Value) => string -) => (formElement: FormElement) => ({ - isInvalid: formElement.validity.validity === 'invalid', - onChange: (evt: React.ChangeEvent) => { - const newValue = evt.currentTarget.value; - formElement.updateValue(() => decodeInputValue(newValue)); - }, - value: encodeInputValue(formElement.value), -}); +export const getInputFieldProps = + ( + decodeInputValue: (value: string) => Value, + encodeInputValue: (value: Value) => string + ) => + (formElement: FormElement) => ({ + isInvalid: formElement.validity.validity === 'invalid', + onChange: (evt: React.ChangeEvent) => { + const newValue = evt.currentTarget.value; + formElement.updateValue(() => decodeInputValue(newValue)); + }, + value: encodeInputValue(formElement.value), + }); export const getStringInputFieldProps = getInputFieldProps( (value) => `${value}`, diff --git a/x-pack/plugins/infra/public/pages/logs/settings/index_pattern_configuration_panel.tsx b/x-pack/plugins/infra/public/pages/logs/settings/index_pattern_configuration_panel.tsx index a16f15505bc30..7e466ee2a6ae9 100644 --- a/x-pack/plugins/infra/public/pages/logs/settings/index_pattern_configuration_panel.tsx +++ b/x-pack/plugins/infra/public/pages/logs/settings/index_pattern_configuration_panel.tsx @@ -79,10 +79,10 @@ export const IndexPatternConfigurationPanel: React.FC<{ defaultMessage="Log index pattern" /> } - {...useMemo(() => (isLoading ? {} : getFormRowProps(indexPatternFormElement)), [ - isLoading, - indexPatternFormElement, - ])} + {...useMemo( + () => (isLoading ? {} : getFormRowProps(indexPatternFormElement)), + [isLoading, indexPatternFormElement] + )} > void; }> = ({ logColumnConfiguration, dragHandleProps, onRemove }) => { - const removeColumn = useCallback(() => onRemove(logColumnConfiguration), [ - logColumnConfiguration, - onRemove, - ]); + const removeColumn = useCallback( + () => onRemove(logColumnConfiguration), + [logColumnConfiguration, onRemove] + ); return ( <> diff --git a/x-pack/plugins/infra/public/pages/logs/settings/source_configuration_form_state.tsx b/x-pack/plugins/infra/public/pages/logs/settings/source_configuration_form_state.tsx index 67e790a98f518..ac390a5bcfb8b 100644 --- a/x-pack/plugins/infra/public/pages/logs/settings/source_configuration_form_state.tsx +++ b/x-pack/plugins/infra/public/pages/logs/settings/source_configuration_form_state.tsx @@ -28,19 +28,16 @@ export const useLogSourceConfigurationFormState = ( ) ); - const { - fieldsFormElement, - tiebreakerFieldFormElement, - timestampFieldFormElement, - } = useFieldsFormElement( - useMemo( - () => ({ - tiebreakerField: configuration?.fields?.tiebreaker ?? '_doc', - timestampField: configuration?.fields?.timestamp ?? '@timestamp', - }), - [configuration] - ) - ); + const { fieldsFormElement, tiebreakerFieldFormElement, timestampFieldFormElement } = + useFieldsFormElement( + useMemo( + () => ({ + tiebreakerField: configuration?.fields?.tiebreaker ?? '_doc', + timestampField: configuration?.fields?.timestamp ?? '@timestamp', + }), + [configuration] + ) + ); const logColumnsFormElement = useLogColumnsFormElement( useMemo(() => configuration?.logColumns ?? [], [configuration]) diff --git a/x-pack/plugins/infra/public/pages/logs/settings/source_configuration_settings.tsx b/x-pack/plugins/infra/public/pages/logs/settings/source_configuration_settings.tsx index 51355cab1fba5..883c321db9ae6 100644 --- a/x-pack/plugins/infra/public/pages/logs/settings/source_configuration_settings.tsx +++ b/x-pack/plugins/infra/public/pages/logs/settings/source_configuration_settings.tsx @@ -76,10 +76,10 @@ export const LogsSettingsPage = () => { sourceConfigurationFormElement.resetValue(); }, [updateSource, sourceConfigurationFormElement, formState]); - const isWriteable = useMemo(() => shouldAllowEdit && source && source.origin !== 'internal', [ - shouldAllowEdit, - source, - ]); + const isWriteable = useMemo( + () => shouldAllowEdit && source && source.origin !== 'internal', + [shouldAllowEdit, source] + ); if ((isLoading || isUninitialized) && !resolvedSourceConfiguration) { return ; diff --git a/x-pack/plugins/infra/public/pages/logs/stream/page_toolbar.tsx b/x-pack/plugins/infra/public/pages/logs/stream/page_toolbar.tsx index 6d7f9fb09676a..015476687d468 100644 --- a/x-pack/plugins/infra/public/pages/logs/stream/page_toolbar.tsx +++ b/x-pack/plugins/infra/public/pages/logs/stream/page_toolbar.tsx @@ -27,12 +27,8 @@ export const LogsToolbar = () => { const { availableTextScales, setTextScale, setTextWrap, textScale, textWrap } = useContext( LogViewConfiguration.Context ); - const { - filterQueryDraft, - isFilterQueryDraftValid, - applyLogFilterQuery, - setLogFilterQueryDraft, - } = useContext(LogFilterState.Context); + const { filterQueryDraft, isFilterQueryDraftValid, applyLogFilterQuery, setLogFilterQueryDraft } = + useContext(LogFilterState.Context); const { setSurroundingLogsId } = useContext(LogFlyout.Context); const { diff --git a/x-pack/plugins/infra/public/pages/logs/stream/page_view_log_in_context.tsx b/x-pack/plugins/infra/public/pages/logs/stream/page_view_log_in_context.tsx index 5537ef9541f89..da507fac5272c 100644 --- a/x-pack/plugins/infra/public/pages/logs/stream/page_view_log_in_context.tsx +++ b/x-pack/plugins/infra/public/pages/logs/stream/page_view_log_in_context.tsx @@ -25,10 +25,8 @@ import { LogStream } from '../../../components/log_stream'; const MODAL_MARGIN = 25; export const PageViewLogInContext: React.FC = () => { - const [ - { contextEntry, startTimestamp, endTimestamp, sourceId }, - { setContextEntry }, - ] = useContext(ViewLogInContext.Context); + const [{ contextEntry, startTimestamp, endTimestamp, sourceId }, { setContextEntry }] = + useContext(ViewLogInContext.Context); const closeModal = useCallback(() => setContextEntry(undefined), [setContextEntry]); const { width: vw, height: vh } = useViewportDimensions(); diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/anomalies_table/anomalies_table.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/anomalies_table/anomalies_table.tsx index 98f3c82818dd2..05227dd1ed5e4 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/anomalies_table/anomalies_table.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/anomalies_table/anomalies_table.tsx @@ -268,16 +268,14 @@ export const AnomaliesTable = (props: Props) => { fetchPreviousPage: k8sPreviousPage, isLoadingMetricsK8sAnomalies: k8sLoading, } = useMetricsK8sAnomaliesResults(anomalyParams); - const page = useMemo(() => (jobType === 'hosts' ? hostPage : k8sPage), [ - jobType, - hostPage, - k8sPage, - ]); - const isLoading = useMemo(() => (jobType === 'hosts' ? hostLoading : k8sLoading), [ - jobType, - hostLoading, - k8sLoading, - ]); + const page = useMemo( + () => (jobType === 'hosts' ? hostPage : k8sPage), + [jobType, hostPage, k8sPage] + ); + const isLoading = useMemo( + () => (jobType === 'hosts' ? hostLoading : k8sLoading), + [jobType, hostLoading, k8sLoading] + ); const fetchNextPage = useMemo( () => (jobType === 'hosts' ? hostFetchNextPage : k8sFetchNextPage), [jobType, hostFetchNextPage, k8sFetchNextPage] diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/flyout_home.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/flyout_home.tsx index 993ae1d9d7571..a16aff903776e 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/flyout_home.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/flyout_home.tsx @@ -48,11 +48,8 @@ export const FlyoutHome = (props: Props) => { setupStatus: k8sSetupStatus, jobSummaries: k8sJobSummaries, } = useMetricK8sModuleContext(); - const { - hasInfraMLCapabilities, - hasInfraMLReadCapabilities, - hasInfraMLSetupCapabilities, - } = useInfraMLCapabilitiesContext(); + const { hasInfraMLCapabilities, hasInfraMLReadCapabilities, hasInfraMLSetupCapabilities } = + useInfraMLCapabilitiesContext(); const createHosts = useCallback(() => { goToSetup('hosts'); diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/job_setup_screen.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/job_setup_screen.tsx index f6d739078002e..fd75aa3bec7a6 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/job_setup_screen.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/ml/anomaly_detection/job_setup_screen.tsx @@ -80,9 +80,10 @@ export const JobSetupScreen = (props: Props) => { } }, [props.jobType, k.jobSummaries, h.jobSummaries]); - const derivedIndexPattern = useMemo(() => createDerivedIndexPattern(), [ - createDerivedIndexPattern, - ]); + const derivedIndexPattern = useMemo( + () => createDerivedIndexPattern(), + [createDerivedIndexPattern] + ); const updateStart = useCallback((date: Moment) => { setStartDate(date); diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/node_details/overlay.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/node_details/overlay.tsx index e2803629afd51..f4c9f9b804135 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/node_details/overlay.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/node_details/overlay.tsx @@ -50,9 +50,10 @@ export const NodeContextPopover = ({ const inventoryModel = findInventoryModel(nodeType); const nodeDetailFrom = currentTime - inventoryModel.metrics.defaultTimeRangeInSeconds * 1000; const uiCapabilities = useKibana().services.application?.capabilities; - const canCreateAlerts = useMemo(() => Boolean(uiCapabilities?.infrastructure?.save), [ - uiCapabilities, - ]); + const canCreateAlerts = useMemo( + () => Boolean(uiCapabilities?.infrastructure?.save), + [uiCapabilities] + ); const tabs = useMemo(() => { return tabConfigs.map((m) => { diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/node_details/tabs/metrics/metrics.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/node_details/tabs/metrics/metrics.tsx index b554cb8024211..fbb8bd469c1e1 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/node_details/tabs/metrics/metrics.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/node_details/tabs/metrics/metrics.tsx @@ -72,9 +72,10 @@ const TabComponent = (props: TabProps) => { const { sourceId, createDerivedIndexPattern } = useSourceContext(); const { nodeType, accountId, region, customMetrics } = useWaffleOptionsContext(); const { currentTime, options, node } = props; - const derivedIndexPattern = useMemo(() => createDerivedIndexPattern('metrics'), [ - createDerivedIndexPattern, - ]); + const derivedIndexPattern = useMemo( + () => createDerivedIndexPattern('metrics'), + [createDerivedIndexPattern] + ); let filter = options.fields ? `${findInventoryFields(nodeType, options.fields).id}: "${node.id}"` : ''; diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/node_details/tabs/processes/index.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/node_details/tabs/processes/index.tsx index df3b37c0aa386..c227a31edc4ab 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/node_details/tabs/processes/index.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/node_details/tabs/processes/index.tsx @@ -46,13 +46,12 @@ const TabComponent = ({ currentTime, node, nodeType, options }: TabProps) => { return { [field]: node.name }; }, [options, node, nodeType]); - const { loading, error, response, makeRequest: reload } = useProcessList( - hostTerm, - timefield, - currentTime, - sortBy, - parseSearchString(searchFilter) - ); + const { + loading, + error, + response, + makeRequest: reload, + } = useProcessList(hostTerm, timefield, currentTime, sortBy, parseSearchString(searchFilter)); const debouncedSearchOnChange = useMemo( () => debounce<(queryText: string) => void>((queryText) => setSearchFilter(queryText), 500), diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/timeline/timeline.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/timeline/timeline.tsx index dd1023e7f0185..65c3136cb48a6 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/timeline/timeline.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/timeline/timeline.tsx @@ -81,12 +81,10 @@ export const Timeline: React.FC = ({ interval, yAxisFormatter, isVisible defaultPaginationOptions: { pageSize: 100 }, }; - const { metricsHostsAnomalies, getMetricsHostsAnomalies } = useMetricsHostsAnomaliesResults( - anomalyParams - ); - const { metricsK8sAnomalies, getMetricsK8sAnomalies } = useMetricsK8sAnomaliesResults( - anomalyParams - ); + const { metricsHostsAnomalies, getMetricsHostsAnomalies } = + useMetricsHostsAnomaliesResults(anomalyParams); + const { metricsK8sAnomalies, getMetricsK8sAnomalies } = + useMetricsK8sAnomaliesResults(anomalyParams); const getAnomalies = useMemo(() => { if (nodeType === 'host') { diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/gradient_legend.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/gradient_legend.tsx index 2d3ff0beb2525..062349fa3ec6c 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/gradient_legend.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/gradient_legend.tsx @@ -21,20 +21,19 @@ interface Props { formatter: InfraFormatter; } -const createTickRender = (bounds: InfraWaffleMapBounds, formatter: InfraFormatter) => ( - rule: InfraWaffleMapGradientRule, - index: number -) => { - const value = rule.value === 0 ? bounds.min : bounds.max * rule.value; - const style = { left: `${rule.value * 100}%` }; - const label = formatter(value); - return ( - - - {label} - - ); -}; +const createTickRender = + (bounds: InfraWaffleMapBounds, formatter: InfraFormatter) => + (rule: InfraWaffleMapGradientRule, index: number) => { + const value = rule.value === 0 ? bounds.min : bounds.max * rule.value; + const style = { left: `${rule.value * 100}%` }; + const label = formatter(value); + return ( + + + {label} + + ); + }; export const GradientLegend: React.FC = ({ legend, bounds, formatter }) => { const maxValue = legend.rules.reduce((acc, rule) => { diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/waffle_time_controls.tsx b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/waffle_time_controls.tsx index 765ae9d131ba6..39150a98c2e89 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/waffle_time_controls.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/components/waffle/waffle_time_controls.tsx @@ -17,13 +17,8 @@ interface Props { } export const WaffleTimeControls = withTheme(({ theme }: Props) => { - const { - currentTime, - isAutoReloading, - startAutoReload, - stopAutoReload, - jumpToTime, - } = useWaffleTimeContext(); + const { currentTime, isAutoReloading, startAutoReload, stopAutoReload, jumpToTime } = + useWaffleTimeContext(); const currentMoment = moment(currentTime); diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/hooks/use_metrics_k8s_anomalies.ts b/x-pack/plugins/infra/public/pages/metrics/inventory_view/hooks/use_metrics_k8s_anomalies.ts index 384cefa691d96..986c4dfa2f8e8 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/hooks/use_metrics_k8s_anomalies.ts +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/hooks/use_metrics_k8s_anomalies.ts @@ -315,16 +315,8 @@ export const callGetMetricsK8sAnomaliesAPI = async ( requestArgs: RequestArgs, fetch: HttpHandler ) => { - const { - sourceId, - anomalyThreshold, - startTime, - endTime, - metric, - query, - sort, - pagination, - } = requestArgs; + const { sourceId, anomalyThreshold, startTime, endTime, metric, query, sort, pagination } = + requestArgs; const response = await fetch(INFA_ML_GET_METRICS_K8S_ANOMALIES_PATH, { method: 'POST', body: JSON.stringify( diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/hooks/use_timeline.ts b/x-pack/plugins/infra/public/pages/metrics/inventory_view/hooks/use_timeline.ts index b210379910c3f..53ff7e318e1f8 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/hooks/use_timeline.ts +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/hooks/use_timeline.ts @@ -77,9 +77,10 @@ export function useTimeline( const displayInterval = useMemo(() => getDisplayInterval(interval), [interval]); - const timeLengthResult = useMemo(() => getTimeLengthFromInterval(displayInterval), [ - displayInterval, - ]); + const timeLengthResult = useMemo( + () => getTimeLengthFromInterval(displayInterval), + [displayInterval] + ); const { timeLength, intervalInSeconds } = timeLengthResult; const endTime = currentTime + intervalInSeconds * 1000; diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/hooks/use_waffle_filters.ts b/x-pack/plugins/infra/public/pages/metrics/inventory_view/hooks/use_waffle_filters.ts index 90cf96330e758..67bc13251de20 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/hooks/use_waffle_filters.ts +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/hooks/use_waffle_filters.ts @@ -66,9 +66,10 @@ export const useWaffleFilters = () => { setFilterQueryDraft(filterQuery.expression); }, []); - const isFilterQueryDraftValid = useMemo(() => validateKuery(filterQueryDraft), [ - filterQueryDraft, - ]); + const isFilterQueryDraftValid = useMemo( + () => validateKuery(filterQueryDraft), + [filterQueryDraft] + ); const { inventoryPrefill } = useAlertPrefillContext(); const prefillContext = useMemo(() => inventoryPrefill, [inventoryPrefill]); // For Jest compatibility diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/hooks/use_waffle_options.test.ts b/x-pack/plugins/infra/public/pages/metrics/inventory_view/hooks/use_waffle_options.test.ts index 0d8114af3d05c..06b6138404a68 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/hooks/use_waffle_options.test.ts +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/hooks/use_waffle_options.test.ts @@ -56,8 +56,7 @@ describe('useWaffleOptions', () => { customMetrics: [ { type: 'custom', - id: - "i don't want to bother to copy and paste an actual uuid so instead i'm going to smash my keyboard skjdghsjodkyjheurvjnsgn", + id: "i don't want to bother to copy and paste an actual uuid so instead i'm going to smash my keyboard skjdghsjodkyjheurvjnsgn", aggregation: 'avg', field: 'hey.system.are.you.good', }, diff --git a/x-pack/plugins/infra/public/pages/metrics/inventory_view/lib/create_inventory_metric_formatter.ts b/x-pack/plugins/infra/public/pages/metrics/inventory_view/lib/create_inventory_metric_formatter.ts index b6ba48290010d..ca09762442d20 100644 --- a/x-pack/plugins/infra/public/pages/metrics/inventory_view/lib/create_inventory_metric_formatter.ts +++ b/x-pack/plugins/infra/public/pages/metrics/inventory_view/lib/create_inventory_metric_formatter.ts @@ -78,17 +78,16 @@ const METRIC_FORMATTERS: MetricFormatters = { }, }; -export const createInventoryMetricFormatter = (metric: SnapshotMetricInput) => ( - val: string | number -) => { - if (SnapshotCustomMetricInputRT.is(metric)) { - const formatter = createFormatterForMetric(metric); +export const createInventoryMetricFormatter = + (metric: SnapshotMetricInput) => (val: string | number) => { + if (SnapshotCustomMetricInputRT.is(metric)) { + const formatter = createFormatterForMetric(metric); + return formatter(val); + } + const metricFormatter = get(METRIC_FORMATTERS, metric.type, METRIC_FORMATTERS.count); + if (val == null) { + return ''; + } + const formatter = createFormatter(metricFormatter.formatter, metricFormatter.template); return formatter(val); - } - const metricFormatter = get(METRIC_FORMATTERS, metric.type, METRIC_FORMATTERS.count); - if (val == null) { - return ''; - } - const formatter = createFormatter(metricFormatter.formatter, metricFormatter.template); - return formatter(val); -}; + }; diff --git a/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/gauges_section_vis.tsx b/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/gauges_section_vis.tsx index a4faa3d6c4755..709357719763b 100644 --- a/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/gauges_section_vis.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/gauges_section_vis.tsx @@ -23,23 +23,25 @@ import { InventoryFormatterType } from '../../../../../common/inventory_models/t import { SeriesOverrides, VisSectionProps } from '../types'; import { getChartName } from './helpers'; -const getFormatter = ( - defaultFormatter: InventoryFormatterType = 'number', - defaultFormatterTemplate: string = '{{value}}', - seriesOverrides: SeriesOverrides = {}, - seriesId: string -) => (val: ReactText) => { - if (val == null) { - return ''; - } - const formatter = get(seriesOverrides, [seriesId, 'formatter'], defaultFormatter); - const formatterTemplate = get( - seriesOverrides, - [seriesId, 'formatterTemplate'], - defaultFormatterTemplate - ); - return createFormatter(formatter, formatterTemplate)(val); -}; +const getFormatter = + ( + defaultFormatter: InventoryFormatterType = 'number', + defaultFormatterTemplate: string = '{{value}}', + seriesOverrides: SeriesOverrides = {}, + seriesId: string + ) => + (val: ReactText) => { + if (val == null) { + return ''; + } + const formatter = get(seriesOverrides, [seriesId, 'formatter'], defaultFormatter); + const formatterTemplate = get( + seriesOverrides, + [seriesId, 'formatterTemplate'], + defaultFormatterTemplate + ); + return createFormatter(formatter, formatterTemplate)(val); + }; export const GaugesSectionVis = ({ id, diff --git a/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/helpers.ts b/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/helpers.ts index a0a795a760b58..0602e8a39b03b 100644 --- a/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/helpers.ts +++ b/x-pack/plugins/infra/public/pages/metrics/metric_detail/components/helpers.ts @@ -23,10 +23,10 @@ import { /** * Returns a formatter */ -export const getFormatter = ( - formatter: InventoryFormatterType = 'number', - template: string = '{{value}}' -) => (val: ReactText) => (val != null ? createFormatter(formatter, template)(val) : ''); +export const getFormatter = + (formatter: InventoryFormatterType = 'number', template: string = '{{value}}') => + (val: ReactText) => + val != null ? createFormatter(formatter, template)(val) : ''; /** * Does a series have more then two points? diff --git a/x-pack/plugins/infra/public/pages/metrics/metric_detail/page_providers.tsx b/x-pack/plugins/infra/public/pages/metrics/metric_detail/page_providers.tsx index c4e1b6bf8ef16..6f44d49ddce90 100644 --- a/x-pack/plugins/infra/public/pages/metrics/metric_detail/page_providers.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/metric_detail/page_providers.tsx @@ -10,14 +10,15 @@ import React from 'react'; import { Source } from '../../../containers/metrics_source'; import { MetricsTimeProvider } from './hooks/use_metrics_time'; -export const withMetricPageProviders = (Component: React.ComponentType) => ( - props: T -) => ( - - - - - - - -); +export const withMetricPageProviders = + (Component: React.ComponentType) => + (props: T) => + ( + + + + + + + + ); diff --git a/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/components/helpers/create_tsvb_link.test.ts b/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/components/helpers/create_tsvb_link.test.ts index a7ed8763d1c72..a9e65bc30a3c6 100644 --- a/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/components/helpers/create_tsvb_link.test.ts +++ b/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/components/helpers/create_tsvb_link.test.ts @@ -22,7 +22,7 @@ import { MetricsExplorerOptions } from '../../hooks/use_metrics_explorer_options jest.mock('uuid'); const mockedUuid = uuid as jest.Mocked; -mockedUuid.v1.mockReturnValue(('test-id' as unknown) as OutputBuffer); +mockedUuid.v1.mockReturnValue('test-id' as unknown as OutputBuffer); const series = { id: 'example-01', rows: [], columns: [] }; describe('createTSVBLink()', () => { @@ -32,8 +32,7 @@ describe('createTSVBLink()', () => { app: 'visualize', hash: '/create', search: { - _a: - "(filters:!(),linked:!f,query:(language:kuery,query:''),uiState:(),vis:(aggs:!(),params:(axis_formatter:number,axis_min:0,axis_position:left,axis_scale:normal,default_index_pattern:'metricbeat-*',filter:(language:kuery,query:'host.name : \"example-01\"'),id:test-id,index_pattern:'metricbeat-*',interval:auto,series:!((axis_position:right,chart_type:line,color:#6092C0,fill:0,formatter:percent,id:test-id,label:'avg(system.cpu.user.pct)',line_width:2,metrics:!((field:system.cpu.user.pct,id:test-id,type:avg)),point_size:0,separate_axis:0,split_mode:everything,stacked:none,value_template:{{value}})),show_grid:1,show_legend:1,time_field:'@timestamp',type:timeseries),title:example-01,type:metrics))", + _a: "(filters:!(),linked:!f,query:(language:kuery,query:''),uiState:(),vis:(aggs:!(),params:(axis_formatter:number,axis_min:0,axis_position:left,axis_scale:normal,default_index_pattern:'metricbeat-*',filter:(language:kuery,query:'host.name : \"example-01\"'),id:test-id,index_pattern:'metricbeat-*',interval:auto,series:!((axis_position:right,chart_type:line,color:#6092C0,fill:0,formatter:percent,id:test-id,label:'avg(system.cpu.user.pct)',line_width:2,metrics:!((field:system.cpu.user.pct,id:test-id,type:avg)),point_size:0,separate_axis:0,split_mode:everything,stacked:none,value_template:{{value}})),show_grid:1,show_legend:1,time_field:'@timestamp',type:timeseries),title:example-01,type:metrics))", _g: '(refreshInterval:(pause:!t,value:0),time:(from:now-1h,to:now))', type: 'metrics', }, @@ -50,8 +49,7 @@ describe('createTSVBLink()', () => { app: 'visualize', hash: '/create', search: { - _a: - "(filters:!(),linked:!f,query:(language:kuery,query:''),uiState:(),vis:(aggs:!(),params:(axis_formatter:number,axis_min:0,axis_position:left,axis_scale:normal,default_index_pattern:'metricbeat-*',filter:(language:kuery,query:'host.name : \"example-01\"'),id:test-id,index_pattern:'metricbeat-*',interval:auto,series:!((axis_position:right,chart_type:line,color:#6092C0,fill:0,formatter:bytes,id:test-id,label:'rate(system.network.out.bytes)',line_width:2,metrics:!((field:system.network.out.bytes,id:test-id,type:max),(field:test-id,id:test-id,type:derivative,unit:'1s'),(field:test-id,id:test-id,type:positive_only)),point_size:0,separate_axis:0,split_mode:everything,stacked:none,value_template:{{value}}/s)),show_grid:1,show_legend:1,time_field:'@timestamp',type:timeseries),title:example-01,type:metrics))", + _a: "(filters:!(),linked:!f,query:(language:kuery,query:''),uiState:(),vis:(aggs:!(),params:(axis_formatter:number,axis_min:0,axis_position:left,axis_scale:normal,default_index_pattern:'metricbeat-*',filter:(language:kuery,query:'host.name : \"example-01\"'),id:test-id,index_pattern:'metricbeat-*',interval:auto,series:!((axis_position:right,chart_type:line,color:#6092C0,fill:0,formatter:bytes,id:test-id,label:'rate(system.network.out.bytes)',line_width:2,metrics:!((field:system.network.out.bytes,id:test-id,type:max),(field:test-id,id:test-id,type:derivative,unit:'1s'),(field:test-id,id:test-id,type:positive_only)),point_size:0,separate_axis:0,split_mode:everything,stacked:none,value_template:{{value}}/s)),show_grid:1,show_legend:1,time_field:'@timestamp',type:timeseries),title:example-01,type:metrics))", _g: '(refreshInterval:(pause:!t,value:0),time:(from:now-1h,to:now))', type: 'metrics', }, @@ -64,8 +62,7 @@ describe('createTSVBLink()', () => { app: 'visualize', hash: '/create', search: { - _a: - "(filters:!(),linked:!f,query:(language:kuery,query:''),uiState:(),vis:(aggs:!(),params:(axis_formatter:number,axis_min:0,axis_position:left,axis_scale:normal,default_index_pattern:'metricbeat-*',filter:(language:kuery,query:'host.name : \"example-01\"'),id:test-id,index_pattern:'metricbeat-*',interval:auto,series:!((axis_position:right,chart_type:line,color:#6092C0,fill:0,formatter:percent,id:test-id,label:'avg(system.cpu.user.pct)',line_width:2,metrics:!((field:system.cpu.user.pct,id:test-id,type:avg)),point_size:0,separate_axis:0,split_mode:everything,stacked:none,value_template:{{value}})),show_grid:1,show_legend:1,time_field:'@timestamp',type:timeseries),title:example-01,type:metrics))", + _a: "(filters:!(),linked:!f,query:(language:kuery,query:''),uiState:(),vis:(aggs:!(),params:(axis_formatter:number,axis_min:0,axis_position:left,axis_scale:normal,default_index_pattern:'metricbeat-*',filter:(language:kuery,query:'host.name : \"example-01\"'),id:test-id,index_pattern:'metricbeat-*',interval:auto,series:!((axis_position:right,chart_type:line,color:#6092C0,fill:0,formatter:percent,id:test-id,label:'avg(system.cpu.user.pct)',line_width:2,metrics:!((field:system.cpu.user.pct,id:test-id,type:avg)),point_size:0,separate_axis:0,split_mode:everything,stacked:none,value_template:{{value}})),show_grid:1,show_legend:1,time_field:'@timestamp',type:timeseries),title:example-01,type:metrics))", _g: '(refreshInterval:(pause:!t,value:0),time:(from:now-10m,to:now))', type: 'metrics', }, @@ -82,8 +79,7 @@ describe('createTSVBLink()', () => { app: 'visualize', hash: '/create', search: { - _a: - "(filters:!(),linked:!f,query:(language:kuery,query:''),uiState:(),vis:(aggs:!(),params:(axis_formatter:number,axis_min:0,axis_position:left,axis_scale:normal,default_index_pattern:'my-beats-*',filter:(language:kuery,query:'host.name : \"example-01\"'),id:test-id,index_pattern:'my-beats-*',interval:auto,series:!((axis_position:right,chart_type:line,color:#6092C0,fill:0,formatter:percent,id:test-id,label:'avg(system.cpu.user.pct)',line_width:2,metrics:!((field:system.cpu.user.pct,id:test-id,type:avg)),point_size:0,separate_axis:0,split_mode:everything,stacked:none,value_template:{{value}})),show_grid:1,show_legend:1,time_field:time,type:timeseries),title:example-01,type:metrics))", + _a: "(filters:!(),linked:!f,query:(language:kuery,query:''),uiState:(),vis:(aggs:!(),params:(axis_formatter:number,axis_min:0,axis_position:left,axis_scale:normal,default_index_pattern:'my-beats-*',filter:(language:kuery,query:'host.name : \"example-01\"'),id:test-id,index_pattern:'my-beats-*',interval:auto,series:!((axis_position:right,chart_type:line,color:#6092C0,fill:0,formatter:percent,id:test-id,label:'avg(system.cpu.user.pct)',line_width:2,metrics:!((field:system.cpu.user.pct,id:test-id,type:avg)),point_size:0,separate_axis:0,split_mode:everything,stacked:none,value_template:{{value}})),show_grid:1,show_legend:1,time_field:time,type:timeseries),title:example-01,type:metrics))", _g: '(refreshInterval:(pause:!t,value:0),time:(from:now-1h,to:now))', type: 'metrics', }, @@ -101,8 +97,7 @@ describe('createTSVBLink()', () => { app: 'visualize', hash: '/create', search: { - _a: - "(filters:!(),linked:!f,query:(language:kuery,query:''),uiState:(),vis:(aggs:!(),params:(axis_formatter:number,axis_min:0,axis_position:left,axis_scale:normal,default_index_pattern:'my-beats-*',filter:(language:kuery,query:'system.network.name:lo* and host.name : \"example-01\"'),id:test-id,index_pattern:'my-beats-*',interval:auto,series:!((axis_position:right,chart_type:line,color:#6092C0,fill:0,formatter:percent,id:test-id,label:'avg(system.cpu.user.pct)',line_width:2,metrics:!((field:system.cpu.user.pct,id:test-id,type:avg)),point_size:0,separate_axis:0,split_mode:everything,stacked:none,value_template:{{value}})),show_grid:1,show_legend:1,time_field:time,type:timeseries),title:example-01,type:metrics))", + _a: "(filters:!(),linked:!f,query:(language:kuery,query:''),uiState:(),vis:(aggs:!(),params:(axis_formatter:number,axis_min:0,axis_position:left,axis_scale:normal,default_index_pattern:'my-beats-*',filter:(language:kuery,query:'system.network.name:lo* and host.name : \"example-01\"'),id:test-id,index_pattern:'my-beats-*',interval:auto,series:!((axis_position:right,chart_type:line,color:#6092C0,fill:0,formatter:percent,id:test-id,label:'avg(system.cpu.user.pct)',line_width:2,metrics:!((field:system.cpu.user.pct,id:test-id,type:avg)),point_size:0,separate_axis:0,split_mode:everything,stacked:none,value_template:{{value}})),show_grid:1,show_legend:1,time_field:time,type:timeseries),title:example-01,type:metrics))", _g: '(refreshInterval:(pause:!t,value:0),time:(from:now-1h,to:now))', type: 'metrics', }, @@ -116,8 +111,7 @@ describe('createTSVBLink()', () => { app: 'visualize', hash: '/create', search: { - _a: - "(filters:!(),linked:!f,query:(language:kuery,query:''),uiState:(),vis:(aggs:!(),params:(axis_formatter:number,axis_position:left,axis_scale:normal,default_index_pattern:'metricbeat-*',filter:(language:kuery,query:'host.name : \"example-01\"'),id:test-id,index_pattern:'metricbeat-*',interval:auto,series:!((axis_position:right,chart_type:line,color:#6092C0,fill:0,formatter:percent,id:test-id,label:'avg(system.cpu.user.pct)',line_width:2,metrics:!((field:system.cpu.user.pct,id:test-id,type:avg)),point_size:0,separate_axis:0,split_mode:everything,stacked:none,value_template:{{value}})),show_grid:1,show_legend:1,time_field:'@timestamp',type:timeseries),title:example-01,type:metrics))", + _a: "(filters:!(),linked:!f,query:(language:kuery,query:''),uiState:(),vis:(aggs:!(),params:(axis_formatter:number,axis_position:left,axis_scale:normal,default_index_pattern:'metricbeat-*',filter:(language:kuery,query:'host.name : \"example-01\"'),id:test-id,index_pattern:'metricbeat-*',interval:auto,series:!((axis_position:right,chart_type:line,color:#6092C0,fill:0,formatter:percent,id:test-id,label:'avg(system.cpu.user.pct)',line_width:2,metrics:!((field:system.cpu.user.pct,id:test-id,type:avg)),point_size:0,separate_axis:0,split_mode:everything,stacked:none,value_template:{{value}})),show_grid:1,show_legend:1,time_field:'@timestamp',type:timeseries),title:example-01,type:metrics))", _g: '(refreshInterval:(pause:!t,value:0),time:(from:now-1h,to:now))', type: 'metrics', }, @@ -131,8 +125,7 @@ describe('createTSVBLink()', () => { app: 'visualize', hash: '/create', search: { - _a: - "(filters:!(),linked:!f,query:(language:kuery,query:''),uiState:(),vis:(aggs:!(),params:(axis_formatter:number,axis_min:0,axis_position:left,axis_scale:normal,default_index_pattern:'metricbeat-*',filter:(language:kuery,query:'host.name : \"example-01\"'),id:test-id,index_pattern:'metricbeat-*',interval:auto,series:!((axis_position:right,chart_type:line,color:#6092C0,fill:0.5,formatter:percent,id:test-id,label:'avg(system.cpu.user.pct)',line_width:2,metrics:!((field:system.cpu.user.pct,id:test-id,type:avg)),point_size:0,separate_axis:0,split_mode:everything,stacked:none,value_template:{{value}})),show_grid:1,show_legend:1,time_field:'@timestamp',type:timeseries),title:example-01,type:metrics))", + _a: "(filters:!(),linked:!f,query:(language:kuery,query:''),uiState:(),vis:(aggs:!(),params:(axis_formatter:number,axis_min:0,axis_position:left,axis_scale:normal,default_index_pattern:'metricbeat-*',filter:(language:kuery,query:'host.name : \"example-01\"'),id:test-id,index_pattern:'metricbeat-*',interval:auto,series:!((axis_position:right,chart_type:line,color:#6092C0,fill:0.5,formatter:percent,id:test-id,label:'avg(system.cpu.user.pct)',line_width:2,metrics:!((field:system.cpu.user.pct,id:test-id,type:avg)),point_size:0,separate_axis:0,split_mode:everything,stacked:none,value_template:{{value}})),show_grid:1,show_legend:1,time_field:'@timestamp',type:timeseries),title:example-01,type:metrics))", _g: '(refreshInterval:(pause:!t,value:0),time:(from:now-1h,to:now))', type: 'metrics', }, @@ -150,8 +143,7 @@ describe('createTSVBLink()', () => { app: 'visualize', hash: '/create', search: { - _a: - "(filters:!(),linked:!f,query:(language:kuery,query:''),uiState:(),vis:(aggs:!(),params:(axis_formatter:number,axis_min:0,axis_position:left,axis_scale:normal,default_index_pattern:'metricbeat-*',filter:(language:kuery,query:'host.name : \"example-01\"'),id:test-id,index_pattern:'metricbeat-*',interval:auto,series:!((axis_position:right,chart_type:line,color:#6092C0,fill:0.5,formatter:percent,id:test-id,label:'avg(system.cpu.user.pct)',line_width:2,metrics:!((field:system.cpu.user.pct,id:test-id,type:avg)),point_size:0,separate_axis:0,split_mode:everything,stacked:stacked,value_template:{{value}})),show_grid:1,show_legend:1,time_field:'@timestamp',type:timeseries),title:example-01,type:metrics))", + _a: "(filters:!(),linked:!f,query:(language:kuery,query:''),uiState:(),vis:(aggs:!(),params:(axis_formatter:number,axis_min:0,axis_position:left,axis_scale:normal,default_index_pattern:'metricbeat-*',filter:(language:kuery,query:'host.name : \"example-01\"'),id:test-id,index_pattern:'metricbeat-*',interval:auto,series:!((axis_position:right,chart_type:line,color:#6092C0,fill:0.5,formatter:percent,id:test-id,label:'avg(system.cpu.user.pct)',line_width:2,metrics:!((field:system.cpu.user.pct,id:test-id,type:avg)),point_size:0,separate_axis:0,split_mode:everything,stacked:stacked,value_template:{{value}})),show_grid:1,show_legend:1,time_field:'@timestamp',type:timeseries),title:example-01,type:metrics))", _g: '(refreshInterval:(pause:!t,value:0),time:(from:now-1h,to:now))', type: 'metrics', }, @@ -169,8 +161,7 @@ describe('createTSVBLink()', () => { app: 'visualize', hash: '/create', search: { - _a: - "(filters:!(),linked:!f,query:(language:kuery,query:''),uiState:(),vis:(aggs:!(),params:(axis_formatter:number,axis_min:0,axis_position:left,axis_scale:normal,default_index_pattern:'metric*',filter:(language:kuery,query:'host.name : \"example-01\"'),id:test-id,index_pattern:'metric*',interval:auto,series:!((axis_position:right,chart_type:line,color:#6092C0,fill:0,formatter:percent,id:test-id,label:'avg(system.cpu.user.pct)',line_width:2,metrics:!((field:system.cpu.user.pct,id:test-id,type:avg)),point_size:0,separate_axis:0,split_mode:everything,stacked:none,value_template:{{value}})),show_grid:1,show_legend:1,time_field:time,type:timeseries),title:example-01,type:metrics))", + _a: "(filters:!(),linked:!f,query:(language:kuery,query:''),uiState:(),vis:(aggs:!(),params:(axis_formatter:number,axis_min:0,axis_position:left,axis_scale:normal,default_index_pattern:'metric*',filter:(language:kuery,query:'host.name : \"example-01\"'),id:test-id,index_pattern:'metric*',interval:auto,series:!((axis_position:right,chart_type:line,color:#6092C0,fill:0,formatter:percent,id:test-id,label:'avg(system.cpu.user.pct)',line_width:2,metrics:!((field:system.cpu.user.pct,id:test-id,type:avg)),point_size:0,separate_axis:0,split_mode:everything,stacked:none,value_template:{{value}})),show_grid:1,show_legend:1,time_field:time,type:timeseries),title:example-01,type:metrics))", _g: '(refreshInterval:(pause:!t,value:0),time:(from:now-1h,to:now))', type: 'metrics', }, 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 1a549041823ec..84d87ee4ad1b7 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 @@ -84,27 +84,26 @@ export const metricsExplorerMetricToTSVBMetric = (metric: MetricsExplorerOptions } }; -const mapMetricToSeries = (chartOptions: MetricsExplorerChartOptions) => ( - metric: MetricsExplorerOptionsMetric -) => { - const format = metricToFormat(metric); - return { - label: createMetricLabel(metric), - axis_position: 'right', - chart_type: 'line', - color: (metric.color && colorTransformer(metric.color)) || colorTransformer(Color.color0), - fill: chartOptions.type === MetricsExplorerChartType.area ? 0.5 : 0, - formatter: format === InfraFormatterType.bits ? InfraFormatterType.bytes : format, - value_template: 'rate' === metric.aggregation ? '{{value}}/s' : '{{value}}', - id: uuid.v1(), - line_width: 2, - metrics: metricsExplorerMetricToTSVBMetric(metric), - point_size: 0, - separate_axis: 0, - split_mode: 'everything', - stacked: chartOptions.stack ? 'stacked' : 'none', +const mapMetricToSeries = + (chartOptions: MetricsExplorerChartOptions) => (metric: MetricsExplorerOptionsMetric) => { + const format = metricToFormat(metric); + return { + label: createMetricLabel(metric), + axis_position: 'right', + chart_type: 'line', + color: (metric.color && colorTransformer(metric.color)) || colorTransformer(Color.color0), + fill: chartOptions.type === MetricsExplorerChartType.area ? 0.5 : 0, + formatter: format === InfraFormatterType.bits ? InfraFormatterType.bytes : format, + value_template: 'rate' === metric.aggregation ? '{{value}}/s' : '{{value}}', + id: uuid.v1(), + line_width: 2, + metrics: metricsExplorerMetricToTSVBMetric(metric), + point_size: 0, + separate_axis: 0, + split_mode: 'everything', + stacked: chartOptions.stack ? 'stacked' : 'none', + }; }; -}; export const createFilterFromOptions = ( options: MetricsExplorerOptions, diff --git a/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/components/kuery_bar.tsx b/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/components/kuery_bar.tsx index e22c6fa661181..cf201c9a57f7c 100644 --- a/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/components/kuery_bar.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/metrics_explorer/components/kuery_bar.tsx @@ -99,5 +99,7 @@ export const MetricsExplorerKueryBar = ({ ); }; -const defaultCurryLoadSuggestions: CurryLoadSuggestionsType = (loadSuggestions) => (...args) => - loadSuggestions(...args); +const defaultCurryLoadSuggestions: CurryLoadSuggestionsType = + (loadSuggestions) => + (...args) => + loadSuggestions(...args); diff --git a/x-pack/plugins/infra/public/pages/metrics/settings/source_configuration_form_state.tsx b/x-pack/plugins/infra/public/pages/metrics/settings/source_configuration_form_state.tsx index 37da4bd1aa1bd..909bf294e4098 100644 --- a/x-pack/plugins/infra/public/pages/metrics/settings/source_configuration_form_state.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/settings/source_configuration_form_state.tsx @@ -32,21 +32,24 @@ export const useSourceConfigurationFormState = ( ), }); - const errors = useMemo(() => [...indicesConfigurationFormState.errors], [ - indicesConfigurationFormState.errors, - ]); + const errors = useMemo( + () => [...indicesConfigurationFormState.errors], + [indicesConfigurationFormState.errors] + ); const resetForm = useCallback(() => { indicesConfigurationFormState.resetForm(); }, [indicesConfigurationFormState]); - const isFormDirty = useMemo(() => indicesConfigurationFormState.isFormDirty, [ - indicesConfigurationFormState.isFormDirty, - ]); + const isFormDirty = useMemo( + () => indicesConfigurationFormState.isFormDirty, + [indicesConfigurationFormState.isFormDirty] + ); - const isFormValid = useMemo(() => indicesConfigurationFormState.isFormValid, [ - indicesConfigurationFormState.isFormValid, - ]); + const isFormValid = useMemo( + () => indicesConfigurationFormState.isFormValid, + [indicesConfigurationFormState.isFormValid] + ); const formState = useMemo( () => ({ diff --git a/x-pack/plugins/infra/public/pages/metrics/settings/source_configuration_settings.tsx b/x-pack/plugins/infra/public/pages/metrics/settings/source_configuration_settings.tsx index 62577b949bdba..0adf4ed6b5b45 100644 --- a/x-pack/plugins/infra/public/pages/metrics/settings/source_configuration_settings.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/settings/source_configuration_settings.tsx @@ -76,10 +76,10 @@ export const SourceConfigurationSettings = ({ formStateChanges, ]); - const isWriteable = useMemo(() => shouldAllowEdit && source && source.origin !== 'internal', [ - shouldAllowEdit, - source, - ]); + const isWriteable = useMemo( + () => shouldAllowEdit && source && source.origin !== 'internal', + [shouldAllowEdit, source] + ); const { hasInfraMLCapabilities } = useInfraMLCapabilitiesContext(); diff --git a/x-pack/plugins/infra/public/plugin.ts b/x-pack/plugins/infra/public/plugin.ts index 76e3e777e6378..712b7c01b9f0a 100644 --- a/x-pack/plugins/infra/public/plugin.ts +++ b/x-pack/plugins/infra/public/plugin.ts @@ -59,33 +59,39 @@ export class Plugin implements InfraClientPluginClass { /** !! Need to be kept in sync with the deepLinks in x-pack/plugins/infra/public/plugin.ts */ pluginsSetup.observability.navigation.registerSections( from(core.getStartServices()).pipe( - map(([{ application: { capabilities } }]) => [ - ...(capabilities.logs.show - ? [ - { - label: 'Logs', - sortKey: 200, - entries: [ - { label: 'Stream', app: 'logs', path: '/stream' }, - { label: 'Anomalies', app: 'logs', path: '/anomalies' }, - { label: 'Categories', app: 'logs', path: '/log-categories' }, - ], - }, - ] - : []), - ...(capabilities.infrastructure.show - ? [ - { - label: 'Metrics', - sortKey: 300, - entries: [ - { label: 'Inventory', app: 'metrics', path: '/inventory' }, - { label: 'Metrics Explorer', app: 'metrics', path: '/explorer' }, - ], - }, - ] - : []), - ]) + map( + ([ + { + application: { capabilities }, + }, + ]) => [ + ...(capabilities.logs.show + ? [ + { + label: 'Logs', + sortKey: 200, + entries: [ + { label: 'Stream', app: 'logs', path: '/stream' }, + { label: 'Anomalies', app: 'logs', path: '/anomalies' }, + { label: 'Categories', app: 'logs', path: '/log-categories' }, + ], + }, + ] + : []), + ...(capabilities.infrastructure.show + ? [ + { + label: 'Metrics', + sortKey: 300, + entries: [ + { label: 'Inventory', app: 'metrics', path: '/inventory' }, + { label: 'Metrics Explorer', app: 'metrics', path: '/explorer' }, + ], + }, + ] + : []), + ] + ) ) ); diff --git a/x-pack/plugins/infra/public/utils/data_search/normalize_data_search_responses.ts b/x-pack/plugins/infra/public/utils/data_search/normalize_data_search_responses.ts index 4c329110ae46e..71975af168f9f 100644 --- a/x-pack/plugins/infra/public/utils/data_search/normalize_data_search_responses.ts +++ b/x-pack/plugins/infra/public/utils/data_search/normalize_data_search_responses.ts @@ -12,9 +12,10 @@ import { AbortError } from '../../../../../../src/plugins/kibana_utils/public'; import { SearchStrategyError } from '../../../common/search_strategies/common/errors'; import { ParsedKibanaSearchResponse } from './types'; -export type RawResponseParser = ( - rawResponse: RawResponse -) => { data: Response; errors?: SearchStrategyError[] }; +export type RawResponseParser = (rawResponse: RawResponse) => { + data: Response; + errors?: SearchStrategyError[]; +}; /** * An operator factory that normalizes each {@link IKibanaSearchResponse} by @@ -30,49 +31,51 @@ export type RawResponseParser = ( * @return An operator that adds parsing and error handling transformations to * each response payload using the arguments given above. */ -export const normalizeDataSearchResponses = ( - initialResponse: InitialResponse, - parseRawResponse: RawResponseParser -) => ( - response$: Observable> -): Observable> => - response$.pipe( - map((response) => { - const { data, errors = [] } = parseRawResponse(response.rawResponse); - return { - data, - errors, - isPartial: response.isPartial ?? false, - isRunning: response.isRunning ?? false, - loaded: response.loaded, - total: response.total, - }; - }), - startWith({ - data: initialResponse, - errors: [], - isPartial: true, - isRunning: true, - loaded: 0, - total: undefined, - }), - catchError((error) => - of({ +export const normalizeDataSearchResponses = + ( + initialResponse: InitialResponse, + parseRawResponse: RawResponseParser + ) => + ( + response$: Observable> + ): Observable> => + response$.pipe( + map((response) => { + const { data, errors = [] } = parseRawResponse(response.rawResponse); + return { + data, + errors, + isPartial: response.isPartial ?? false, + isRunning: response.isRunning ?? false, + loaded: response.loaded, + total: response.total, + }; + }), + startWith({ data: initialResponse, - errors: [ - error instanceof AbortError - ? { - type: 'aborted' as const, - } - : { - type: 'generic' as const, - message: `${error.message ?? error}`, - }, - ], + errors: [], isPartial: true, - isRunning: false, + isRunning: true, loaded: 0, total: undefined, - }) - ) - ); + }), + catchError((error) => + of({ + data: initialResponse, + errors: [ + error instanceof AbortError + ? { + type: 'aborted' as const, + } + : { + type: 'generic' as const, + message: `${error.message ?? error}`, + }, + ], + isPartial: true, + isRunning: false, + loaded: 0, + total: undefined, + }) + ) + ); diff --git a/x-pack/plugins/infra/public/utils/data_search/use_latest_partial_data_search_response.test.tsx b/x-pack/plugins/infra/public/utils/data_search/use_latest_partial_data_search_response.test.tsx index 1ed912b0e01f6..71c49ef75023e 100644 --- a/x-pack/plugins/infra/public/utils/data_search/use_latest_partial_data_search_response.test.tsx +++ b/x-pack/plugins/infra/public/utils/data_search/use_latest_partial_data_search_response.test.tsx @@ -107,9 +107,8 @@ describe('useLatestPartialDataSearchResponse hook', () => { }), }; - const requests$ = of, string>>( - firstRequest - ); + const requests$ = + of, string>>(firstRequest); const { unmount } = renderHook(() => useLatestPartialDataSearchResponse(requests$)); diff --git a/x-pack/plugins/infra/public/utils/data_search/use_latest_partial_data_search_response.ts b/x-pack/plugins/infra/public/utils/data_search/use_latest_partial_data_search_response.ts index 741136b513116..2cafceaad3cb5 100644 --- a/x-pack/plugins/infra/public/utils/data_search/use_latest_partial_data_search_response.ts +++ b/x-pack/plugins/infra/public/utils/data_search/use_latest_partial_data_search_response.ts @@ -16,9 +16,8 @@ import { useDataSearchResponseState } from './use_data_search_response_state'; export const useLatestPartialDataSearchResponse = ( requests$: Observable> ) => { - const latestResponse$: Observable< - ParsedDataSearchResponseDescriptor - > = useOperator(requests$, flattenLatestDataSearchResponse); + const latestResponse$: Observable> = + useOperator(requests$, flattenLatestDataSearchResponse); const { cancelRequest, diff --git a/x-pack/plugins/infra/public/utils/loading_state/loading_progress.ts b/x-pack/plugins/infra/public/utils/loading_state/loading_progress.ts index 5ddc5761f03c3..4670883ec2a77 100644 --- a/x-pack/plugins/infra/public/utils/loading_state/loading_progress.ts +++ b/x-pack/plugins/infra/public/utils/loading_state/loading_progress.ts @@ -25,17 +25,19 @@ export const isRunningLoadingProgress =

( loadingProgress: LoadingProgress

): loadingProgress is RunningLoadingProgress

=> loadingProgress.progress === 'running'; -export const createIdleProgressReducer = () => ( - state: LoadingProgress -): IdleLoadingProgress => ({ - progress: 'idle', -}); +export const createIdleProgressReducer = + () => + (state: LoadingProgress): IdleLoadingProgress => ({ + progress: 'idle', + }); -export const createRunningProgressReducer = () => ( - state: LoadingProgress, - parameters: Parameters -): RunningLoadingProgress => ({ - parameters, - progress: 'running', - time: Date.now(), -}); +export const createRunningProgressReducer = + () => + ( + state: LoadingProgress, + parameters: Parameters + ): RunningLoadingProgress => ({ + parameters, + progress: 'running', + time: Date.now(), + }); diff --git a/x-pack/plugins/infra/public/utils/loading_state/loading_result.ts b/x-pack/plugins/infra/public/utils/loading_state/loading_result.ts index 683de7aeedc11..09411f6c6fce8 100644 --- a/x-pack/plugins/infra/public/utils/loading_state/loading_result.ts +++ b/x-pack/plugins/infra/public/utils/loading_state/loading_result.ts @@ -64,12 +64,15 @@ export const createSuccessResult = ( time: Date.now(), }); -export const createSuccessResultReducer = ( - isExhausted: (params: Parameters, result: Payload) => boolean -) => ( - state: LoadingResult, - { params, result }: { params: Parameters; result: Payload } -): SuccessLoadingResult => createSuccessResult(params, isExhausted(params, result)); +export const createSuccessResultReducer = + ( + isExhausted: (params: Parameters, result: Payload) => boolean + ) => + ( + state: LoadingResult, + { params, result }: { params: Parameters; result: Payload } + ): SuccessLoadingResult => + createSuccessResult(params, isExhausted(params, result)); export const createFailureResult = ( parameters: Parameters, @@ -81,9 +84,12 @@ export const createFailureResult = ( time: Date.now(), }); -export const createFailureResultReducer = ( - convertErrorToString: (error: ErrorPayload) => string = (error) => `${error}` -) => ( - state: LoadingResult, - { params, error }: { params: Parameters; error: ErrorPayload } -): FailureLoadingResult => createFailureResult(params, convertErrorToString(error)); +export const createFailureResultReducer = + ( + convertErrorToString: (error: ErrorPayload) => string = (error) => `${error}` + ) => + ( + state: LoadingResult, + { params, error }: { params: Parameters; error: ErrorPayload } + ): FailureLoadingResult => + createFailureResult(params, convertErrorToString(error)); diff --git a/x-pack/plugins/infra/public/utils/logs_overview_fetches.test.ts b/x-pack/plugins/infra/public/utils/logs_overview_fetches.test.ts index 8d51f54e3f55a..6dfb400567717 100644 --- a/x-pack/plugins/infra/public/utils/logs_overview_fetches.test.ts +++ b/x-pack/plugins/infra/public/utils/logs_overview_fetches.test.ts @@ -21,9 +21,10 @@ const mockedCallFetchLogSourceStatusAPI = callFetchLogSourceStatusAPI as jest.Mo >; jest.mock('../containers/logs/log_source/api/fetch_log_source_configuration'); -const mockedCallFetchLogSourceConfigurationAPI = callFetchLogSourceConfigurationAPI as jest.MockedFunction< - typeof callFetchLogSourceConfigurationAPI ->; +const mockedCallFetchLogSourceConfigurationAPI = + callFetchLogSourceConfigurationAPI as jest.MockedFunction< + typeof callFetchLogSourceConfigurationAPI + >; const DEFAULT_PARAMS = { absoluteTime: { start: 1593430680000, end: 1593430800000 }, diff --git a/x-pack/plugins/infra/public/utils/styles.ts b/x-pack/plugins/infra/public/utils/styles.ts index db979a9ac68ee..bd0ba2099d95c 100644 --- a/x-pack/plugins/infra/public/utils/styles.ts +++ b/x-pack/plugins/infra/public/utils/styles.ts @@ -19,9 +19,7 @@ const asPropReader = (reader: string | string[] | PropReader) => ) => get(props, reader as Prop, defaultValue); export const switchProp = Object.assign( - (propName: string | string[] | PropReader, options: Map | object) => ( - props: object - ) => { + (propName: string | string[] | PropReader, options: Map | object) => (props: object) => { const propValue = asPropReader(propName)(props, switchProp.default); if (typeof propValue === 'undefined') { return; @@ -33,11 +31,10 @@ export const switchProp = Object.assign( } ); -export const ifProp = ( - propName: string | string[] | PropReader, - pass: Pass, - fail: Fail -) => (props: object) => (asPropReader(propName)(props) ? pass : fail); +export const ifProp = + (propName: string | string[] | PropReader, pass: Pass, fail: Fail) => + (props: object) => + asPropReader(propName)(props) ? pass : fail; export const tintOrShade = ( textColor: string, diff --git a/x-pack/plugins/infra/public/utils/typed_redux.ts b/x-pack/plugins/infra/public/utils/typed_redux.ts index 04b3190c0146b..cd02539e719bb 100644 --- a/x-pack/plugins/infra/public/utils/typed_redux.ts +++ b/x-pack/plugins/infra/public/utils/typed_redux.ts @@ -23,15 +23,13 @@ export type GlobalSelectors = { >; }; -export const globalizeSelector = < - GlobalState, - LocalSelector extends Selector, - LocalState = any, - Value = any ->( - globalizer: Selector, - selector: LocalSelector -): Selector => (globalState: GlobalState) => selector(globalizer(globalState)); +export const globalizeSelector = + , LocalState = any, Value = any>( + globalizer: Selector, + selector: LocalSelector + ): Selector => + (globalState: GlobalState) => + selector(globalizer(globalState)); export const globalizeSelectors = < GlobalState, @@ -63,9 +61,9 @@ type PlainActionCreator = WrappedActionCreator extends () ? (payload: A) => R : never; -export const bindPlainActionCreators = ( - actionCreators: WrappedActionCreators -) => (dispatch: Dispatch) => - (bindActionCreators(actionCreators, dispatch) as unknown) as { - [P in keyof WrappedActionCreators]: PlainActionCreator; - }; +export const bindPlainActionCreators = + (actionCreators: WrappedActionCreators) => + (dispatch: Dispatch) => + bindActionCreators(actionCreators, dispatch) as unknown as { + [P in keyof WrappedActionCreators]: PlainActionCreator; + }; diff --git a/x-pack/plugins/infra/public/utils/url_state.tsx b/x-pack/plugins/infra/public/utils/url_state.tsx index 0e6c38e893ca8..8148463ab3fe3 100644 --- a/x-pack/plugins/infra/public/utils/url_state.tsx +++ b/x-pack/plugins/infra/public/utils/url_state.tsx @@ -152,20 +152,19 @@ export const getParamFromQueryString = (queryString: string, key: string): strin return Array.isArray(queryParam) ? queryParam[0] : queryParam; }; -export const replaceStateKeyInQueryString = ( - stateKey: string, - urlState: UrlState | undefined -) => (queryString: string) => { - const previousQueryValues = parse(queryString, { sort: false }); - const newValue = - typeof urlState === 'undefined' - ? previousQueryValues - : { - ...previousQueryValues, - [stateKey]: encodeRisonUrlState(urlState), - }; - return stringify(url.encodeQuery(newValue), { sort: false, encode: false }); -}; +export const replaceStateKeyInQueryString = + (stateKey: string, urlState: UrlState | undefined) => + (queryString: string) => { + const previousQueryValues = parse(queryString, { sort: false }); + const newValue = + typeof urlState === 'undefined' + ? previousQueryValues + : { + ...previousQueryValues, + [stateKey]: encodeRisonUrlState(urlState), + }; + return stringify(url.encodeQuery(newValue), { sort: false, encode: false }); + }; const replaceQueryStringInLocation = (location: Location, queryString: string): Location => { if (queryString === getQueryStringFromLocation(location)) { diff --git a/x-pack/plugins/infra/public/utils/use_observable.ts b/x-pack/plugins/infra/public/utils/use_observable.ts index 345d57e6fa5f6..87d182c94ac05 100644 --- a/x-pack/plugins/infra/public/utils/use_observable.ts +++ b/x-pack/plugins/infra/public/utils/use_observable.ts @@ -95,17 +95,19 @@ export const useOperator = ( ); }; -export const tapUnsubscribe = (onUnsubscribe: () => void) => (source$: Observable) => { - return new Observable((subscriber) => { - const subscription = source$.subscribe({ - next: (value) => subscriber.next(value), - error: (error) => subscriber.error(error), - complete: () => subscriber.complete(), +export const tapUnsubscribe = + (onUnsubscribe: () => void) => + (source$: Observable) => { + return new Observable((subscriber) => { + const subscription = source$.subscribe({ + next: (value) => subscriber.next(value), + error: (error) => subscriber.error(error), + complete: () => subscriber.complete(), + }); + + return () => { + onUnsubscribe(); + subscription.unsubscribe(); + }; }); - - return () => { - onUnsubscribe(); - subscription.unsubscribe(); - }; - }); -}; + }; diff --git a/x-pack/plugins/infra/public/utils/use_tracked_promise.ts b/x-pack/plugins/infra/public/utils/use_tracked_promise.ts index 1b0c290bd6511..4380db2dcb4c4 100644 --- a/x-pack/plugins/infra/public/utils/use_tracked_promise.ts +++ b/x-pack/plugins/infra/public/utils/use_tracked_promise.ts @@ -113,109 +113,110 @@ export const useTrackedPromise = ( }); const execute = useMemo( - () => (...args: Arguments) => { - let rejectCancellationPromise!: (value: any) => void; - const cancellationPromise = new Promise((_, reject) => { - rejectCancellationPromise = reject; - }); - - // remember the list of prior pending promises for cancellation - const previousPendingPromises = pendingPromises.current; - - const cancelPreviousPendingPromises = () => { - previousPendingPromises.forEach((promise) => promise.cancel()); - }; - - const newPromise = createPromise(...args); - const newCancelablePromise = Promise.race([newPromise, cancellationPromise]); - - // track this new state - setPromiseState({ - state: 'pending', - promise: newCancelablePromise, - }); - - if (cancelPreviousOn === 'creation') { - cancelPreviousPendingPromises(); - } - - const newPendingPromise: CancelablePromise = { - cancel: () => { - rejectCancellationPromise(new CanceledPromiseError()); - }, - cancelSilently: () => { - rejectCancellationPromise(new SilentCanceledPromiseError()); - }, - promise: newCancelablePromise.then( - (value) => { - setPromiseState((previousPromiseState) => - previousPromiseState.state === 'pending' && - previousPromiseState.promise === newCancelablePromise - ? { - state: 'resolved', - promise: newPendingPromise.promise, - value, - } - : previousPromiseState - ); - - if (['settlement', 'resolution'].includes(cancelPreviousOn)) { - cancelPreviousPendingPromises(); - } - - // remove itself from the list of pending promises - pendingPromises.current = pendingPromises.current.filter( - (pendingPromise) => pendingPromise.promise !== newPendingPromise.promise - ); - - if (onResolve && shouldTriggerOrThrow()) { - onResolve(value); - } - - return value; + () => + (...args: Arguments) => { + let rejectCancellationPromise!: (value: any) => void; + const cancellationPromise = new Promise((_, reject) => { + rejectCancellationPromise = reject; + }); + + // remember the list of prior pending promises for cancellation + const previousPendingPromises = pendingPromises.current; + + const cancelPreviousPendingPromises = () => { + previousPendingPromises.forEach((promise) => promise.cancel()); + }; + + const newPromise = createPromise(...args); + const newCancelablePromise = Promise.race([newPromise, cancellationPromise]); + + // track this new state + setPromiseState({ + state: 'pending', + promise: newCancelablePromise, + }); + + if (cancelPreviousOn === 'creation') { + cancelPreviousPendingPromises(); + } + + const newPendingPromise: CancelablePromise = { + cancel: () => { + rejectCancellationPromise(new CanceledPromiseError()); }, - (value) => { - if (!(value instanceof SilentCanceledPromiseError)) { + cancelSilently: () => { + rejectCancellationPromise(new SilentCanceledPromiseError()); + }, + promise: newCancelablePromise.then( + (value) => { setPromiseState((previousPromiseState) => previousPromiseState.state === 'pending' && previousPromiseState.promise === newCancelablePromise ? { - state: 'rejected', - promise: newCancelablePromise, + state: 'resolved', + promise: newPendingPromise.promise, value, } : previousPromiseState ); - } - if (['settlement', 'rejection'].includes(cancelPreviousOn)) { - cancelPreviousPendingPromises(); - } + if (['settlement', 'resolution'].includes(cancelPreviousOn)) { + cancelPreviousPendingPromises(); + } - // remove itself from the list of pending promises - pendingPromises.current = pendingPromises.current.filter( - (pendingPromise) => pendingPromise.promise !== newPendingPromise.promise - ); + // remove itself from the list of pending promises + pendingPromises.current = pendingPromises.current.filter( + (pendingPromise) => pendingPromise.promise !== newPendingPromise.promise + ); - if (shouldTriggerOrThrow()) { - if (onReject) { - onReject(value); + if (onResolve && shouldTriggerOrThrow()) { + onResolve(value); } - throw value; + return value; + }, + (value) => { + if (!(value instanceof SilentCanceledPromiseError)) { + setPromiseState((previousPromiseState) => + previousPromiseState.state === 'pending' && + previousPromiseState.promise === newCancelablePromise + ? { + state: 'rejected', + promise: newCancelablePromise, + value, + } + : previousPromiseState + ); + } + + if (['settlement', 'rejection'].includes(cancelPreviousOn)) { + cancelPreviousPendingPromises(); + } + + // remove itself from the list of pending promises + pendingPromises.current = pendingPromises.current.filter( + (pendingPromise) => pendingPromise.promise !== newPendingPromise.promise + ); + + if (shouldTriggerOrThrow()) { + if (onReject) { + onReject(value); + } + + throw value; + } } - } - ), - }; + ), + }; - // add the new promise to the list of pending promises - pendingPromises.current = [...pendingPromises.current, newPendingPromise]; + // add the new promise to the list of pending promises + pendingPromises.current = [...pendingPromises.current, newPendingPromise]; - // silence "unhandled rejection" warnings - newPendingPromise.promise.catch(noOp); + // silence "unhandled rejection" warnings + newPendingPromise.promise.catch(noOp); - return newPendingPromise.promise; - }, + return newPendingPromise.promise; + }, // the dependencies are managed by the caller // eslint-disable-next-line react-hooks/exhaustive-deps dependencies diff --git a/x-pack/plugins/infra/public/utils/use_url_state.ts b/x-pack/plugins/infra/public/utils/use_url_state.ts index 970b3a20b2951..eef82438ff017 100644 --- a/x-pack/plugins/infra/public/utils/use_url_state.ts +++ b/x-pack/plugins/infra/public/utils/use_url_state.ts @@ -105,21 +105,20 @@ const getParamFromQueryString = (queryString: string, key: string) => { return Array.isArray(queryParam) ? queryParam[0] : queryParam; }; -export const replaceStateKeyInQueryString = ( - stateKey: string, - urlState: UrlState | undefined -) => (queryString: string) => { - const previousQueryValues = parse(queryString, { sort: false }); - const newValue = - typeof urlState === 'undefined' - ? previousQueryValues - : { - ...previousQueryValues, - [stateKey]: encodeRisonUrlState(urlState), - }; - - return stringify(url.encodeQuery(newValue), { sort: false, encode: false }); -}; +export const replaceStateKeyInQueryString = + (stateKey: string, urlState: UrlState | undefined) => + (queryString: string) => { + const previousQueryValues = parse(queryString, { sort: false }); + const newValue = + typeof urlState === 'undefined' + ? previousQueryValues + : { + ...previousQueryValues, + [stateKey]: encodeRisonUrlState(urlState), + }; + + return stringify(url.encodeQuery(newValue), { sort: false, encode: false }); + }; const replaceQueryStringInLocation = (location: Location, queryString: string): Location => { if (queryString === getQueryStringFromLocation(location)) { diff --git a/x-pack/plugins/infra/server/lib/adapters/log_entries/kibana_log_entries_adapter.ts b/x-pack/plugins/infra/server/lib/adapters/log_entries/kibana_log_entries_adapter.ts index 4ad2fa656f9b2..ab98de7901a3d 100644 --- a/x-pack/plugins/infra/server/lib/adapters/log_entries/kibana_log_entries_adapter.ts +++ b/x-pack/plugins/infra/server/lib/adapters/log_entries/kibana_log_entries_adapter.ts @@ -268,9 +268,7 @@ const createFilterClauses = ( const createQueryFilterClauses = (filterQuery: LogEntryQuery | undefined) => filterQuery ? [filterQuery] : []; -function processCursor( - cursor: LogEntriesParams['cursor'] -): { +function processCursor(cursor: LogEntriesParams['cursor']): { sortDirection: 'asc' | 'desc'; searchAfterClause: { search_after?: readonly [number, number] }; } { diff --git a/x-pack/plugins/infra/server/lib/adapters/source_status/elasticsearch_source_status_adapter.ts b/x-pack/plugins/infra/server/lib/adapters/source_status/elasticsearch_source_status_adapter.ts index 079d39c080bf5..0aa305a580ffa 100644 --- a/x-pack/plugins/infra/server/lib/adapters/source_status/elasticsearch_source_status_adapter.ts +++ b/x-pack/plugins/infra/server/lib/adapters/source_status/elasticsearch_source_status_adapter.ts @@ -76,11 +76,11 @@ export class InfraElasticsearchSourceStatusAdapter implements InfraSourceStatusA } } -const withDefaultIfNotFound = (defaultValue: DefaultValue) => ( - error: any -): DefaultValue => { - if (error && error.status === 404) { - return defaultValue; - } - throw error; -}; +const withDefaultIfNotFound = + (defaultValue: DefaultValue) => + (error: any): DefaultValue => { + if (error && error.status === 404) { + return defaultValue; + } + throw error; + }; diff --git a/x-pack/plugins/infra/server/lib/alerting/inventory_metric_threshold/inventory_metric_threshold_executor.ts b/x-pack/plugins/infra/server/lib/alerting/inventory_metric_threshold/inventory_metric_threshold_executor.ts index ddfc575438faa..bbbb0e917d518 100644 --- a/x-pack/plugins/infra/server/lib/alerting/inventory_metric_threshold/inventory_metric_threshold_executor.ts +++ b/x-pack/plugins/infra/server/lib/alerting/inventory_metric_threshold/inventory_metric_threshold_executor.ts @@ -70,13 +70,8 @@ export const createInventoryMetricThresholdExecutor = (libs: InfraBackendLibs) = InventoryMetricThresholdAlertInstanceContext, InventoryMetricThresholdAllowedActionGroups >(async ({ services, params }) => { - const { - criteria, - filterQuery, - sourceId, - nodeType, - alertOnNoData, - } = params as InventoryMetricThresholdParams; + const { criteria, filterQuery, sourceId, nodeType, alertOnNoData } = + params as InventoryMetricThresholdParams; if (criteria.length === 0) throw new Error('Cannot execute an alert with 0 conditions'); const { alertWithLifecycle, savedObjectsClient } = services; const alertInstanceFactory: InventoryMetricThresholdAlertInstanceFactory = (id, reason) => @@ -185,7 +180,7 @@ export const createInventoryMetricThresholdExecutor = (libs: InfraBackendLibs) = * TODO: We're lying to the compiler here as explicitly calling `scheduleActions` on * the RecoveredActionGroup isn't allowed */ - (actionGroupId as unknown) as InventoryMetricThresholdAllowedActionGroups, + actionGroupId as unknown as InventoryMetricThresholdAllowedActionGroups, { group: item, alertState: stateToAlertMessage[nextState], diff --git a/x-pack/plugins/infra/server/lib/alerting/metric_anomaly/metric_anomaly_executor.ts b/x-pack/plugins/infra/server/lib/alerting/metric_anomaly/metric_anomaly_executor.ts index 2282a7ff255d1..f7dbe95b4161c 100644 --- a/x-pack/plugins/infra/server/lib/alerting/metric_anomaly/metric_anomaly_executor.ts +++ b/x-pack/plugins/infra/server/lib/alerting/metric_anomaly/metric_anomaly_executor.ts @@ -25,80 +25,79 @@ import { KibanaRequest } from '../../../../../../../src/core/server'; import { InfraBackendLibs } from '../../infra_types'; import { evaluateCondition } from './evaluate_condition'; -export const createMetricAnomalyExecutor = (libs: InfraBackendLibs, ml?: MlPluginSetup) => async ({ - services, - params, - startedAt, -}: AlertExecutorOptions< - /** - * TODO: Remove this use of `any` by utilizing a proper type - */ - Record, - Record, - AlertInstanceState, - AlertInstanceContext, - MetricAnomalyAllowedActionGroups ->) => { - if (!ml) { - return; - } - const request = {} as KibanaRequest; - const mlSystem = ml.mlSystemProvider(request, services.savedObjectsClient); - const mlAnomalyDetectors = ml.anomalyDetectorsProvider(request, services.savedObjectsClient); +export const createMetricAnomalyExecutor = + (libs: InfraBackendLibs, ml?: MlPluginSetup) => + async ({ + services, + params, + startedAt, + }: AlertExecutorOptions< + /** + * TODO: Remove this use of `any` by utilizing a proper type + */ + Record, + Record, + AlertInstanceState, + AlertInstanceContext, + MetricAnomalyAllowedActionGroups + >) => { + if (!ml) { + return; + } + const request = {} as KibanaRequest; + const mlSystem = ml.mlSystemProvider(request, services.savedObjectsClient); + const mlAnomalyDetectors = ml.anomalyDetectorsProvider(request, services.savedObjectsClient); - const { - metric, - alertInterval, - influencerFilter, - sourceId, - spaceId, - nodeType, - threshold, - } = params as MetricAnomalyParams; + const { metric, alertInterval, influencerFilter, sourceId, spaceId, nodeType, threshold } = + params as MetricAnomalyParams; - const bucketInterval = getIntervalInSeconds('15m') * 1000; - const alertIntervalInMs = getIntervalInSeconds(alertInterval ?? '1m') * 1000; + const bucketInterval = getIntervalInSeconds('15m') * 1000; + const alertIntervalInMs = getIntervalInSeconds(alertInterval ?? '1m') * 1000; - const endTime = startedAt.getTime(); - // Anomalies are bucketed at :00, :15, :30, :45 minutes every hour - const previousBucketStartTime = endTime - (endTime % bucketInterval); + const endTime = startedAt.getTime(); + // Anomalies are bucketed at :00, :15, :30, :45 minutes every hour + const previousBucketStartTime = endTime - (endTime % bucketInterval); - // If the alert interval is less than 15m, make sure that it actually queries an anomaly bucket - const startTime = Math.min(endTime - alertIntervalInMs, previousBucketStartTime); + // If the alert interval is less than 15m, make sure that it actually queries an anomaly bucket + const startTime = Math.min(endTime - alertIntervalInMs, previousBucketStartTime); - const { data } = await evaluateCondition({ - sourceId: sourceId ?? 'default', - spaceId: spaceId ?? 'default', - mlSystem, - mlAnomalyDetectors, - startTime, - endTime, - metric, - threshold, - nodeType, - influencerFilter, - }); + const { data } = await evaluateCondition({ + sourceId: sourceId ?? 'default', + spaceId: spaceId ?? 'default', + mlSystem, + mlAnomalyDetectors, + startTime, + endTime, + metric, + threshold, + nodeType, + influencerFilter, + }); - const shouldAlertFire = data.length > 0; + const shouldAlertFire = data.length > 0; - if (shouldAlertFire) { - const { startTime: anomalyStartTime, anomalyScore, actual, typical, influencers } = first( - data as MappedAnomalyHit[] - )!; - const alertInstance = services.alertInstanceFactory(`${nodeType}-${metric}`); + if (shouldAlertFire) { + const { + startTime: anomalyStartTime, + anomalyScore, + actual, + typical, + influencers, + } = first(data as MappedAnomalyHit[])!; + const alertInstance = services.alertInstanceFactory(`${nodeType}-${metric}`); - alertInstance.scheduleActions(FIRED_ACTIONS_ID, { - alertState: stateToAlertMessage[AlertStates.ALERT], - timestamp: moment(anomalyStartTime).toISOString(), - anomalyScore, - actual, - typical, - metric: metricNameMap[metric], - summary: generateSummaryMessage(actual, typical), - influencers: influencers.join(', '), - }); - } -}; + alertInstance.scheduleActions(FIRED_ACTIONS_ID, { + alertState: stateToAlertMessage[AlertStates.ALERT], + timestamp: moment(anomalyStartTime).toISOString(), + anomalyScore, + actual, + typical, + metric: metricNameMap[metric], + summary: generateSummaryMessage(actual, typical), + influencers: influencers.join(', '), + }); + } + }; export const FIRED_ACTIONS_ID = 'metrics.anomaly.fired'; export const FIRED_ACTIONS: ActionGroup = { diff --git a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/lib/evaluate_alert.ts b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/lib/evaluate_alert.ts index a099b83fdb423..c7c1eb5454d1d 100644 --- a/x-pack/plugins/infra/server/lib/alerting/metric_threshold/lib/evaluate_alert.ts +++ b/x-pack/plugins/infra/server/lib/alerting/metric_threshold/lib/evaluate_alert.ts @@ -195,7 +195,7 @@ const getMetric: ( return { [UNGROUPED_FACTORY_KEY]: getValuesFromAggregations( - (result.aggregations! as unknown) as Aggregation, + result.aggregations! as unknown as Aggregation, aggType, dropPartialBucketsOptions, calculatedTimerange, @@ -225,16 +225,18 @@ interface DropPartialBucketOptions { bucketSizeInMillis: number; } -const dropPartialBuckets = ({ from, to, bucketSizeInMillis }: DropPartialBucketOptions) => ( - row: { - key: string; - value: number | null; - } | null -) => { - if (row == null) return null; - const timestamp = new Date(row.key).valueOf(); - return timestamp >= from && timestamp + bucketSizeInMillis <= to; -}; +const dropPartialBuckets = + ({ from, to, bucketSizeInMillis }: DropPartialBucketOptions) => + ( + row: { + key: string; + value: number | null; + } | null + ) => { + if (row == null) return null; + const timestamp = new Date(row.key).valueOf(); + return timestamp >= from && timestamp + bucketSizeInMillis <= to; + }; const getValuesFromAggregations = ( aggregations: Aggregation | undefined, 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 259318b6c93a1..9c99ad6bf49e2 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 @@ -207,14 +207,8 @@ const formatAlertResult = ( } & AlertResult, useWarningThreshold?: boolean ) => { - const { - metric, - currentValue, - threshold, - comparator, - warningThreshold, - warningComparator, - } = alertResult; + const { metric, currentValue, threshold, comparator, warningThreshold, warningComparator } = + alertResult; const noDataValue = i18n.translate( 'xpack.infra.metrics.alerting.threshold.noDataFormattedValue', { diff --git a/x-pack/plugins/infra/server/lib/create_search_client.ts b/x-pack/plugins/infra/server/lib/create_search_client.ts index afe16801dd2a2..6688ae1af1afc 100644 --- a/x-pack/plugins/infra/server/lib/create_search_client.ts +++ b/x-pack/plugins/infra/server/lib/create_search_client.ts @@ -9,10 +9,9 @@ import type { InfraPluginRequestHandlerContext } from '../types'; import { CallWithRequestParams, InfraDatabaseSearchResponse } from './adapters/framework'; import { KibanaFramework } from './adapters/framework/kibana_framework_adapter'; -export const createSearchClient = ( - requestContext: InfraPluginRequestHandlerContext, - framework: KibanaFramework -) => ( - opts: CallWithRequestParams -): Promise> => - framework.callWithRequest(requestContext, 'search', opts); +export const createSearchClient = + (requestContext: InfraPluginRequestHandlerContext, framework: KibanaFramework) => + ( + opts: CallWithRequestParams + ): Promise> => + framework.callWithRequest(requestContext, 'search', opts); diff --git a/x-pack/plugins/infra/server/lib/domains/log_entries_domain/log_entries_domain.ts b/x-pack/plugins/infra/server/lib/domains/log_entries_domain/log_entries_domain.ts index f6be310d79ed2..16209e5e4b684 100644 --- a/x-pack/plugins/infra/server/lib/domains/log_entries_domain/log_entries_domain.ts +++ b/x-pack/plugins/infra/server/lib/domains/log_entries_domain/log_entries_domain.ts @@ -166,28 +166,26 @@ export class InfraLogEntriesDomain { id: doc.id, index: doc.index, cursor: doc.cursor, - columns: columnDefinitions.map( - (column): LogColumn => { - if ('timestampColumn' in column) { - return { - columnId: column.timestampColumn.id, - timestamp: doc.cursor.time, - }; - } else if ('messageColumn' in column) { - return { - columnId: column.messageColumn.id, - message: messageFormattingRules.format(doc.fields, doc.highlights), - }; - } else { - return { - columnId: column.fieldColumn.id, - field: column.fieldColumn.field, - value: doc.fields[column.fieldColumn.field] ?? [], - highlights: doc.highlights[column.fieldColumn.field] ?? [], - }; - } + columns: columnDefinitions.map((column): LogColumn => { + if ('timestampColumn' in column) { + return { + columnId: column.timestampColumn.id, + timestamp: doc.cursor.time, + }; + } else if ('messageColumn' in column) { + return { + columnId: column.messageColumn.id, + message: messageFormattingRules.format(doc.fields, doc.highlights), + }; + } else { + return { + columnId: column.fieldColumn.id, + field: column.fieldColumn.field, + value: doc.fields[column.fieldColumn.field] ?? [], + highlights: doc.highlights[column.fieldColumn.field] ?? [], + }; } - ), + }), context: getContextFromDoc(doc), }; }); diff --git a/x-pack/plugins/infra/server/lib/host_details/process_list.ts b/x-pack/plugins/infra/server/lib/host_details/process_list.ts index e51e06af83f94..a9125c73fe5d0 100644 --- a/x-pack/plugins/infra/server/lib/host_details/process_list.ts +++ b/x-pack/plugins/infra/server/lib/host_details/process_list.ts @@ -129,8 +129,8 @@ export const getProcessList = async ( let summary: { [p: string]: number } = {}; if (result.aggregations!.summaryEvent.summary.hits.hits.length) { - summary = result.aggregations!.summaryEvent.summary.hits.hits[0]._source.system.process - .summary; + summary = + result.aggregations!.summaryEvent.summary.hits.hits[0]._source.system.process.summary; } return { diff --git a/x-pack/plugins/infra/server/lib/log_analysis/log_entry_categories_analysis.ts b/x-pack/plugins/infra/server/lib/log_analysis/log_entry_categories_analysis.ts index 7739f39cb5624..7023f7007763c 100644 --- a/x-pack/plugins/infra/server/lib/log_analysis/log_entry_categories_analysis.ts +++ b/x-pack/plugins/infra/server/lib/log_analysis/log_entry_categories_analysis.ts @@ -244,15 +244,14 @@ async function fetchTopLogEntryCategories( const topLogEntryCategories = topLogEntryCategoriesResponse.aggregations?.terms_category_id.buckets.map( (topCategoryBucket) => { - const maximumAnomalyScoresByDataset = topCategoryBucket.filter_record.terms_dataset.buckets.reduce< - Record - >( - (accumulatedMaximumAnomalyScores, datasetFromRecord) => ({ - ...accumulatedMaximumAnomalyScores, - [datasetFromRecord.key]: datasetFromRecord.maximum_record_score.value ?? 0, - }), - {} - ); + const maximumAnomalyScoresByDataset = + topCategoryBucket.filter_record.terms_dataset.buckets.reduce>( + (accumulatedMaximumAnomalyScores, datasetFromRecord) => ({ + ...accumulatedMaximumAnomalyScores, + [datasetFromRecord.key]: datasetFromRecord.maximum_record_score.value ?? 0, + }), + {} + ); return { categoryId: parseCategoryId(topCategoryBucket.key), diff --git a/x-pack/plugins/infra/server/lib/log_analysis/log_entry_categories_datasets_stats.ts b/x-pack/plugins/infra/server/lib/log_analysis/log_entry_categories_datasets_stats.ts index 7c92a81e1a896..8c3f739339152 100644 --- a/x-pack/plugins/infra/server/lib/log_analysis/log_entry_categories_datasets_stats.ts +++ b/x-pack/plugins/infra/server/lib/log_analysis/log_entry_categories_datasets_stats.ts @@ -34,16 +34,17 @@ export async function getLatestLogEntriesCategoriesDatasetsStats( let afterLatestBatchKey: CompositeDatasetKey | undefined; while (true) { - const latestLogEntryCategoriesDatasetsStatsResponse = await context.infra.mlSystem.mlAnomalySearch( - createLatestLogEntryCategoriesDatasetsStatsQuery( - jobIds, - startTime, - endTime, - COMPOSITE_AGGREGATION_BATCH_SIZE, - afterLatestBatchKey - ), - jobIds - ); + const latestLogEntryCategoriesDatasetsStatsResponse = + await context.infra.mlSystem.mlAnomalySearch( + createLatestLogEntryCategoriesDatasetsStatsQuery( + jobIds, + startTime, + endTime, + COMPOSITE_AGGREGATION_BATCH_SIZE, + afterLatestBatchKey + ), + jobIds + ); const { after_key: afterKey, buckets: latestBatchBuckets = [] } = decodeOrThrow(latestLogEntryCategoriesDatasetsStatsResponseRT)( diff --git a/x-pack/plugins/infra/server/lib/metrics/lib/convert_histogram_buckets_to_timeseries.ts b/x-pack/plugins/infra/server/lib/metrics/lib/convert_histogram_buckets_to_timeseries.ts index f6761f72fabb9..82bd99896839f 100644 --- a/x-pack/plugins/infra/server/lib/metrics/lib/convert_histogram_buckets_to_timeseries.ts +++ b/x-pack/plugins/infra/server/lib/metrics/lib/convert_histogram_buckets_to_timeseries.ts @@ -64,9 +64,9 @@ const getValue = (valueObject: ValueObjectType) => { return null; }; -const dropOutOfBoundsBuckets = (from: number, to: number, bucketSizeInMillis: number) => ( - row: MetricsAPIRow -) => row.timestamp >= from && row.timestamp + bucketSizeInMillis <= to; +const dropOutOfBoundsBuckets = + (from: number, to: number, bucketSizeInMillis: number) => (row: MetricsAPIRow) => + row.timestamp >= from && row.timestamp + bucketSizeInMillis <= to; const convertBucketsToRows = ( options: MetricsAPIRequest, diff --git a/x-pack/plugins/infra/server/lib/sources/sources.ts b/x-pack/plugins/infra/server/lib/sources/sources.ts index 7dc47388bd1da..45da4546ad3b8 100644 --- a/x-pack/plugins/infra/server/lib/sources/sources.ts +++ b/x-pack/plugins/infra/server/lib/sources/sources.ts @@ -205,11 +205,12 @@ export class InfraSources { } private async getStaticDefaultSourceConfiguration() { - const staticSourceConfiguration: SourceConfigurationConfigFileProperties['sources']['default'] = pipe( - sourceConfigurationConfigFilePropertiesRT.decode(this.libs.config), - map(({ sources: { default: defaultConfiguration } }) => defaultConfiguration), - fold(constant({}), identity) - ); + const staticSourceConfiguration: SourceConfigurationConfigFileProperties['sources']['default'] = + pipe( + sourceConfigurationConfigFilePropertiesRT.decode(this.libs.config), + map(({ sources: { default: defaultConfiguration } }) => defaultConfiguration), + fold(constant({}), identity) + ); // NOTE: Legacy logAlias needs converting to a logIndices reference until we can remove // config file sources in 8.0.0. diff --git a/x-pack/plugins/infra/server/routes/metadata/index.ts b/x-pack/plugins/infra/server/routes/metadata/index.ts index cc8888e9bd09d..39021ba51c9d9 100644 --- a/x-pack/plugins/infra/server/routes/metadata/index.ts +++ b/x-pack/plugins/infra/server/routes/metadata/index.ts @@ -92,7 +92,9 @@ export const initMetadataRoute = (libs: InfraBackendLibs) => { ); }; -const nameToFeature = (source: string) => (name: string): InfraMetadataFeature => ({ - name, - source, -}); +const nameToFeature = + (source: string) => + (name: string): InfraMetadataFeature => ({ + name, + source, + }); diff --git a/x-pack/plugins/infra/server/routes/metrics_explorer/lib/transform_series.ts b/x-pack/plugins/infra/server/routes/metrics_explorer/lib/transform_series.ts index 3de020c2ad327..6b876887bd568 100644 --- a/x-pack/plugins/infra/server/routes/metrics_explorer/lib/transform_series.ts +++ b/x-pack/plugins/infra/server/routes/metrics_explorer/lib/transform_series.ts @@ -7,19 +7,21 @@ import { MetricsAPISeries, MetricsExplorerSeries } from '../../../../common/http_api'; -export const transformSeries = (hasGroupBy: boolean) => ( - series: MetricsAPISeries -): MetricsExplorerSeries => { - const id = series.keys?.join(' / ') ?? series.id; - return { - ...series, - id, - rows: series.rows.map((row) => { - if (hasGroupBy) { - return { ...row, groupBy: id }; - } - return row; - }), - columns: hasGroupBy ? [...series.columns, { name: 'groupBy', type: 'string' }] : series.columns, +export const transformSeries = + (hasGroupBy: boolean) => + (series: MetricsAPISeries): MetricsExplorerSeries => { + const id = series.keys?.join(' / ') ?? series.id; + return { + ...series, + id, + rows: series.rows.map((row) => { + if (hasGroupBy) { + return { ...row, groupBy: id }; + } + return row; + }), + columns: hasGroupBy + ? [...series.columns, { name: 'groupBy', type: 'string' }] + : series.columns, + }; }; -}; diff --git a/x-pack/plugins/infra/server/routes/snapshot/lib/query_all_data.ts b/x-pack/plugins/infra/server/routes/snapshot/lib/query_all_data.ts index ff0e9b6ce57f1..b92fbab90af93 100644 --- a/x-pack/plugins/infra/server/routes/snapshot/lib/query_all_data.ts +++ b/x-pack/plugins/infra/server/routes/snapshot/lib/query_all_data.ts @@ -9,25 +9,23 @@ import { MetricsAPIRequest, MetricsAPIResponse } from '../../../../common/http_a import { ESSearchClient } from '../../../lib/metrics/types'; import { query } from '../../../lib/metrics'; -const handleResponse = ( - client: ESSearchClient, - options: MetricsAPIRequest, - previousResponse?: MetricsAPIResponse -) => async (resp: MetricsAPIResponse): Promise => { - const combinedResponse = previousResponse - ? { - ...previousResponse, - series: [...previousResponse.series, ...resp.series], - info: resp.info, - } - : resp; - if (resp.info.afterKey) { - return query(client, { ...options, afterKey: resp.info.afterKey }).then( - handleResponse(client, options, combinedResponse) - ); - } - return combinedResponse; -}; +const handleResponse = + (client: ESSearchClient, options: MetricsAPIRequest, previousResponse?: MetricsAPIResponse) => + async (resp: MetricsAPIResponse): Promise => { + const combinedResponse = previousResponse + ? { + ...previousResponse, + series: [...previousResponse.series, ...resp.series], + info: resp.info, + } + : resp; + if (resp.info.afterKey) { + return query(client, { ...options, afterKey: resp.info.afterKey }).then( + handleResponse(client, options, combinedResponse) + ); + } + return combinedResponse; + }; export const queryAllData = (client: ESSearchClient, options: MetricsAPIRequest) => { return query(client, options).then(handleResponse(client, options)); diff --git a/x-pack/plugins/infra/server/services/log_entries/log_entries_search_strategy.ts b/x-pack/plugins/infra/server/services/log_entries/log_entries_search_strategy.ts index c47a1c163f9ec..651758d9cd976 100644 --- a/x-pack/plugins/infra/server/services/log_entries/log_entries_search_strategy.ts +++ b/x-pack/plugins/infra/server/services/log_entries/log_entries_search_strategy.ts @@ -197,17 +197,18 @@ const { asyncInitialRequestRT, asyncRecoveredRequestRT, asyncRequestRT } = creat logEntriesSearchRequestParamsRT ); -const getLogEntryFromHit = ( - columnDefinitions: LogSourceColumnConfiguration[], - messageFormattingRules: CompiledLogMessageFormattingRule -) => (hit: LogEntryHit): LogEntry => { - const cursor = getLogEntryCursorFromHit(hit); - return { - id: hit._id, - index: hit._index, - cursor, - columns: columnDefinitions.map( - (column): LogColumn => { +const getLogEntryFromHit = + ( + columnDefinitions: LogSourceColumnConfiguration[], + messageFormattingRules: CompiledLogMessageFormattingRule + ) => + (hit: LogEntryHit): LogEntry => { + const cursor = getLogEntryCursorFromHit(hit); + return { + id: hit._id, + index: hit._index, + cursor, + columns: columnDefinitions.map((column): LogColumn => { if ('timestampColumn' in column) { return { columnId: column.timestampColumn.id, @@ -226,11 +227,10 @@ const getLogEntryFromHit = ( highlights: hit.highlight?.[column.fieldColumn.field] ?? [], }; } - } - ), - context: getContextFromHit(hit), + }), + context: getContextFromHit(hit), + }; }; -}; const pickRequestCursor = ( params: LogEntriesSearchRequestParams diff --git a/x-pack/plugins/infra/server/utils/create_afterkey_handler.ts b/x-pack/plugins/infra/server/utils/create_afterkey_handler.ts index 0c320c7b8ec1b..6d41f17a6bb5e 100644 --- a/x-pack/plugins/infra/server/utils/create_afterkey_handler.ts +++ b/x-pack/plugins/infra/server/utils/create_afterkey_handler.ts @@ -8,18 +8,20 @@ import { set } from '@elastic/safer-lodash-set'; import { InfraDatabaseSearchResponse } from '../lib/adapters/framework'; -export const createAfterKeyHandler = ( - optionsAfterKeyPath: string | string[], - afterKeySelector: (input: InfraDatabaseSearchResponse) => any -) => ( - options: Options, - response: InfraDatabaseSearchResponse -): Options => { - if (!response.aggregations) { - return options; - } - const newOptions = { ...options }; - const afterKey = afterKeySelector(response); - set(newOptions, optionsAfterKeyPath, afterKey); - return newOptions; -}; +export const createAfterKeyHandler = + ( + optionsAfterKeyPath: string | string[], + afterKeySelector: (input: InfraDatabaseSearchResponse) => any + ) => + ( + options: Options, + response: InfraDatabaseSearchResponse + ): Options => { + if (!response.aggregations) { + return options; + } + const newOptions = { ...options }; + const afterKey = afterKeySelector(response); + set(newOptions, optionsAfterKeyPath, afterKey); + return newOptions; + }; 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 index abd8efb730ef5..7ba5e44cddf61 100644 --- 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 @@ -52,7 +52,7 @@ const appServices = { export const setupEnvironment = () => { uiMetricService.setup(usageCollectionPluginMock.createSetupContract()); - apiService.setup((mockHttpClient as unknown) as HttpSetup, uiMetricService); + apiService.setup(mockHttpClient as unknown as HttpSetup, uiMetricService); documentationService.setup(docLinksServiceMock.createStartContract()); breadcrumbService.setup(() => {}); @@ -64,8 +64,9 @@ export const setupEnvironment = () => { }; }; -export const WithAppDependencies = (Comp: any) => (props: any) => ( - - - -); +export const WithAppDependencies = (Comp: any) => (props: any) => + ( + + + + ); diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/__jest__/pipeline_processors_editor.test.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/__jest__/pipeline_processors_editor.test.tsx index 5b02927ab873c..c5daa1db2ac07 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/__jest__/pipeline_processors_editor.test.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/__jest__/pipeline_processors_editor.test.tsx @@ -297,21 +297,25 @@ describe('Pipeline Editor', () => { none: 'No description', }; - const createAssertForProcessor = (processorIndex: string) => ({ - description, - descriptionVisible, - }: { - description: string; - descriptionVisible: boolean; - }) => { - expect(find(`processors>${processorIndex}.inlineTextInputNonEditableText`).text()).toBe( - description - ); - expect( - (find(`processors>${processorIndex}.pipelineProcessorItemDescriptionContainer`).props() - .className as string).includes('--displayNone') - ).toBe(!descriptionVisible); - }; + const createAssertForProcessor = + (processorIndex: string) => + ({ + description, + descriptionVisible, + }: { + description: string; + descriptionVisible: boolean; + }) => { + expect(find(`processors>${processorIndex}.inlineTextInputNonEditableText`).text()).toBe( + description + ); + expect( + ( + find(`processors>${processorIndex}.pipelineProcessorItemDescriptionContainer`).props() + .className as string + ).includes('--displayNone') + ).toBe(!descriptionVisible); + }; const assertScriptProcessor = createAssertForProcessor('0'); const assertSetProcessor = createAssertForProcessor('2'); diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/processor_form/field_components/drag_and_drop_text_list.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/processor_form/field_components/drag_and_drop_text_list.tsx index 03bdc2ceb9579..7a0ea533b0d68 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/processor_form/field_components/drag_and_drop_text_list.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/processor_form/field_components/drag_and_drop_text_list.tsx @@ -152,9 +152,8 @@ function DragAndDropTextListComponent({ readDefaultValueOnForm={!item.isNew} > {(field) => { - const { isInvalid, errorMessage } = getFieldValidityAndErrorMessage( - field - ); + const { isInvalid, errorMessage } = + getFieldValidityAndErrorMessage(field); return ( diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/processor_form/processors/network_direction.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/processor_form/processors/network_direction.tsx index 22f2226d80b10..ab8744ee01ab8 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/processor_form/processors/network_direction.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/processor_form/processors/network_direction.tsx @@ -86,9 +86,7 @@ const fieldsConfig: FieldsConfig = { }, }; -const getInternalNetworkConfig: ( - toggleCustom: () => void -) => Record< +const getInternalNetworkConfig: (toggleCustom: () => void) => Record< keyof InternalNetworkFields, { path: string; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/processor_form/processors/set.tsx b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/processor_form/processors/set.tsx index 16d89fcbfb119..6bbda366826f7 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/processor_form/processors/set.tsx +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/processor_form/processors/set.tsx @@ -97,9 +97,7 @@ const fieldsConfig: FieldsConfig = { }; // Required fields config -const getValueConfig: ( - toggleCustom: () => void -) => Record< +const getValueConfig: (toggleCustom: () => void) => Record< keyof ValueToggleFields, { path: string; diff --git a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/processor_form/processors/shared.ts b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/processor_form/processors/shared.ts index 9a45f7f0017c6..a14944a33a8ce 100644 --- a/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/processor_form/processors/shared.ts +++ b/x-pack/plugins/ingest_pipelines/public/application/components/pipeline_editor/components/processor_form/processors/shared.ts @@ -81,7 +81,7 @@ export const from = { return undefined; }, optionalArrayOfStrings: (v: string[]) => (v.length ? v : undefined), - undefinedIfValue: (value: unknown) => (v: boolean) => (v === value ? undefined : v), + undefinedIfValue: (value: unknown) => (v: boolean) => v === value ? undefined : v, emptyStringToUndefined: (v: unknown) => (v === '' ? undefined : v), /** * Useful when serializing user input from a