From c66b67d7d0b5f2c972a41b9abc8abc4085f5d9af Mon Sep 17 00:00:00 2001 From: Peter Pisljar Date: Thu, 25 Mar 2021 12:34:38 +0100 Subject: [PATCH] handling references for kibana_context and get_index_pattern expression functions (#95224) # Conflicts: # src/plugins/data/server/search/search_service.ts --- ...-public.executioncontext.getsavedobject.md | 13 -- ...ins-expressions-public.executioncontext.md | 1 - ...-server.executioncontext.getsavedobject.md | 13 -- ...ins-expressions-server.executioncontext.md | 1 - .../expressions/load_index_pattern.ts | 26 +++ .../search/expressions/kibana_context.ts | 167 +++++++++++------- .../search/expressions/kibana_context.ts | 39 ++++ .../data/public/search/search_service.ts | 8 +- .../search/expressions/kibana_context.ts | 46 +++++ .../data/server/search/search_service.ts | 4 +- .../expressions/common/execution/types.ts | 15 -- .../expressions/common/executor/executor.ts | 12 +- src/plugins/expressions/public/plugin.ts | 13 +- src/plugins/expressions/public/public.api.md | 3 - src/plugins/expressions/server/server.api.md | 3 - 15 files changed, 234 insertions(+), 130 deletions(-) delete mode 100644 docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executioncontext.getsavedobject.md delete mode 100644 docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.executioncontext.getsavedobject.md create mode 100644 src/plugins/data/public/search/expressions/kibana_context.ts create mode 100644 src/plugins/data/server/search/expressions/kibana_context.ts diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executioncontext.getsavedobject.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executioncontext.getsavedobject.md deleted file mode 100644 index dffce4a091718..0000000000000 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executioncontext.getsavedobject.md +++ /dev/null @@ -1,13 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-expressions-public](./kibana-plugin-plugins-expressions-public.md) > [ExecutionContext](./kibana-plugin-plugins-expressions-public.executioncontext.md) > [getSavedObject](./kibana-plugin-plugins-expressions-public.executioncontext.getsavedobject.md) - -## ExecutionContext.getSavedObject property - -Allows to fetch saved objects from ElasticSearch. In browser `getSavedObject` function is provided automatically by the Expressions plugin. On the server the caller of the expression has to provide this context function. The reason is because on the browser we always know the user who tries to fetch a saved object, thus saved object client is scoped automatically to that user. However, on the server we can scope that saved object client to any user, or even not scope it at all and execute it as an "internal" user. - -Signature: - -```typescript -getSavedObject?: (type: string, id: string) => Promise>; -``` diff --git a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executioncontext.md b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executioncontext.md index 901b46f0888d4..1388e04c315e2 100644 --- a/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executioncontext.md +++ b/docs/development/plugins/expressions/public/kibana-plugin-plugins-expressions-public.executioncontext.md @@ -18,7 +18,6 @@ export interface ExecutionContextAbortSignal | Adds ability to abort current execution. | | [getKibanaRequest](./kibana-plugin-plugins-expressions-public.executioncontext.getkibanarequest.md) | () => KibanaRequest | Getter to retrieve the KibanaRequest object inside an expression function. Useful for functions which are running on the server and need to perform operations that are scoped to a specific user. | -| [getSavedObject](./kibana-plugin-plugins-expressions-public.executioncontext.getsavedobject.md) | <T extends SavedObjectAttributes = SavedObjectAttributes>(type: string, id: string) => Promise<SavedObject<T>> | Allows to fetch saved objects from ElasticSearch. In browser getSavedObject function is provided automatically by the Expressions plugin. On the server the caller of the expression has to provide this context function. The reason is because on the browser we always know the user who tries to fetch a saved object, thus saved object client is scoped automatically to that user. However, on the server we can scope that saved object client to any user, or even not scope it at all and execute it as an "internal" user. | | [getSearchContext](./kibana-plugin-plugins-expressions-public.executioncontext.getsearchcontext.md) | () => ExecutionContextSearch | Get search context of the expression. | | [getSearchSessionId](./kibana-plugin-plugins-expressions-public.executioncontext.getsearchsessionid.md) | () => string | undefined | Search context in which expression should operate. | | [inspectorAdapters](./kibana-plugin-plugins-expressions-public.executioncontext.inspectoradapters.md) | InspectorAdapters | Adapters for inspector plugin. | diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.executioncontext.getsavedobject.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.executioncontext.getsavedobject.md deleted file mode 100644 index b8c8f4f3bb067..0000000000000 --- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.executioncontext.getsavedobject.md +++ /dev/null @@ -1,13 +0,0 @@ - - -[Home](./index.md) > [kibana-plugin-plugins-expressions-server](./kibana-plugin-plugins-expressions-server.md) > [ExecutionContext](./kibana-plugin-plugins-expressions-server.executioncontext.md) > [getSavedObject](./kibana-plugin-plugins-expressions-server.executioncontext.getsavedobject.md) - -## ExecutionContext.getSavedObject property - -Allows to fetch saved objects from ElasticSearch. In browser `getSavedObject` function is provided automatically by the Expressions plugin. On the server the caller of the expression has to provide this context function. The reason is because on the browser we always know the user who tries to fetch a saved object, thus saved object client is scoped automatically to that user. However, on the server we can scope that saved object client to any user, or even not scope it at all and execute it as an "internal" user. - -Signature: - -```typescript -getSavedObject?: (type: string, id: string) => Promise>; -``` diff --git a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.executioncontext.md b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.executioncontext.md index 39018599a2c92..8503f81ad7d25 100644 --- a/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.executioncontext.md +++ b/docs/development/plugins/expressions/server/kibana-plugin-plugins-expressions-server.executioncontext.md @@ -18,7 +18,6 @@ export interface ExecutionContextAbortSignal | Adds ability to abort current execution. | | [getKibanaRequest](./kibana-plugin-plugins-expressions-server.executioncontext.getkibanarequest.md) | () => KibanaRequest | Getter to retrieve the KibanaRequest object inside an expression function. Useful for functions which are running on the server and need to perform operations that are scoped to a specific user. | -| [getSavedObject](./kibana-plugin-plugins-expressions-server.executioncontext.getsavedobject.md) | <T extends SavedObjectAttributes = SavedObjectAttributes>(type: string, id: string) => Promise<SavedObject<T>> | Allows to fetch saved objects from ElasticSearch. In browser getSavedObject function is provided automatically by the Expressions plugin. On the server the caller of the expression has to provide this context function. The reason is because on the browser we always know the user who tries to fetch a saved object, thus saved object client is scoped automatically to that user. However, on the server we can scope that saved object client to any user, or even not scope it at all and execute it as an "internal" user. | | [getSearchContext](./kibana-plugin-plugins-expressions-server.executioncontext.getsearchcontext.md) | () => ExecutionContextSearch | Get search context of the expression. | | [getSearchSessionId](./kibana-plugin-plugins-expressions-server.executioncontext.getsearchsessionid.md) | () => string | undefined | Search context in which expression should operate. | | [inspectorAdapters](./kibana-plugin-plugins-expressions-server.executioncontext.inspectoradapters.md) | InspectorAdapters | Adapters for inspector plugin. | diff --git a/src/plugins/data/common/index_patterns/expressions/load_index_pattern.ts b/src/plugins/data/common/index_patterns/expressions/load_index_pattern.ts index 37a28fea53342..1c50f0704910a 100644 --- a/src/plugins/data/common/index_patterns/expressions/load_index_pattern.ts +++ b/src/plugins/data/common/index_patterns/expressions/load_index_pattern.ts @@ -10,6 +10,7 @@ import { i18n } from '@kbn/i18n'; import { ExpressionFunctionDefinition } from 'src/plugins/expressions/common'; import { IndexPatternsContract } from '../index_patterns'; import { IndexPatternSpec } from '..'; +import { SavedObjectReference } from '../../../../../core/types'; const name = 'indexPatternLoad'; const type = 'index_pattern'; @@ -57,4 +58,29 @@ export const getIndexPatternLoadMeta = (): Omit< }), }, }, + extract(state) { + const refName = 'indexPatternLoad.id'; + const references: SavedObjectReference[] = [ + { + name: refName, + type: 'search', + id: state.id[0] as string, + }, + ]; + return { + state: { + ...state, + id: [refName], + }, + references, + }; + }, + + inject(state, references) { + const reference = references.find((ref) => ref.name === 'indexPatternLoad.id'); + if (reference) { + state.id[0] = reference.id; + } + return state; + }, }); diff --git a/src/plugins/data/common/search/expressions/kibana_context.ts b/src/plugins/data/common/search/expressions/kibana_context.ts index 98d7a2c45b4fc..22a7150d4a64e 100644 --- a/src/plugins/data/common/search/expressions/kibana_context.ts +++ b/src/plugins/data/common/search/expressions/kibana_context.ts @@ -15,6 +15,14 @@ import { Query, uniqFilters } from '../../query'; import { ExecutionContextSearch, KibanaContext, KibanaFilter } from './kibana_context_type'; import { KibanaQueryOutput } from './kibana_context_type'; import { KibanaTimerangeOutput } from './timerange'; +import { SavedObjectReference } from '../../../../../core/types'; +import { SavedObjectsClientCommon } from '../../index_patterns'; +import { Filter } from '../../es_query/filters'; + +/** @internal */ +export interface KibanaContextStartDependencies { + savedObjectsClient: SavedObjectsClientCommon; +} interface Arguments { q?: KibanaQueryOutput | null; @@ -40,75 +48,108 @@ const mergeQueries = (first: Query | Query[] = [], second: Query | Query[]) => (n: any) => JSON.stringify(n.query) ); -export const kibanaContextFunction: ExpressionFunctionKibanaContext = { - name: 'kibana_context', - type: 'kibana_context', - inputTypes: ['kibana_context', 'null'], - help: i18n.translate('data.search.functions.kibana_context.help', { - defaultMessage: 'Updates kibana global context', - }), - args: { - q: { - types: ['kibana_query', 'null'], - aliases: ['query', '_'], - default: null, - help: i18n.translate('data.search.functions.kibana_context.q.help', { - defaultMessage: 'Specify Kibana free form text query', - }), - }, - filters: { - types: ['kibana_filter', 'null'], - multi: true, - help: i18n.translate('data.search.functions.kibana_context.filters.help', { - defaultMessage: 'Specify Kibana generic filters', - }), +export const getKibanaContextFn = ( + getStartDependencies: ( + getKibanaRequest: ExecutionContext['getKibanaRequest'] + ) => Promise +) => { + const kibanaContextFunction: ExpressionFunctionKibanaContext = { + name: 'kibana_context', + type: 'kibana_context', + inputTypes: ['kibana_context', 'null'], + help: i18n.translate('data.search.functions.kibana_context.help', { + defaultMessage: 'Updates kibana global context', + }), + args: { + q: { + types: ['kibana_query', 'null'], + aliases: ['query', '_'], + default: null, + help: i18n.translate('data.search.functions.kibana_context.q.help', { + defaultMessage: 'Specify Kibana free form text query', + }), + }, + filters: { + types: ['kibana_filter', 'null'], + multi: true, + help: i18n.translate('data.search.functions.kibana_context.filters.help', { + defaultMessage: 'Specify Kibana generic filters', + }), + }, + timeRange: { + types: ['timerange', 'null'], + default: null, + help: i18n.translate('data.search.functions.kibana_context.timeRange.help', { + defaultMessage: 'Specify Kibana time range filter', + }), + }, + savedSearchId: { + types: ['string', 'null'], + default: null, + help: i18n.translate('data.search.functions.kibana_context.savedSearchId.help', { + defaultMessage: 'Specify saved search ID to be used for queries and filters', + }), + }, }, - timeRange: { - types: ['timerange', 'null'], - default: null, - help: i18n.translate('data.search.functions.kibana_context.timeRange.help', { - defaultMessage: 'Specify Kibana time range filter', - }), + + extract(state) { + const references: SavedObjectReference[] = []; + if (state.savedSearchId.length && typeof state.savedSearchId[0] === 'string') { + const refName = 'kibana_context.savedSearchId'; + references.push({ + name: refName, + type: 'search', + id: state.savedSearchId[0] as string, + }); + return { + state: { + ...state, + savedSearchId: [refName], + }, + references, + }; + } + return { state, references }; }, - savedSearchId: { - types: ['string', 'null'], - default: null, - help: i18n.translate('data.search.functions.kibana_context.savedSearchId.help', { - defaultMessage: 'Specify saved search ID to be used for queries and filters', - }), + + inject(state, references) { + const reference = references.find((r) => r.name === 'kibana_context.savedSearchId'); + if (reference) { + state.savedSearchId[0] = reference.id; + } + return state; }, - }, - async fn(input, args, { getSavedObject }) { - const timeRange = args.timeRange || input?.timeRange; - let queries = mergeQueries(input?.query, args?.q || []); - let filters = [...(input?.filters || []), ...(args?.filters?.map(unboxExpressionValue) || [])]; + async fn(input, args, { getKibanaRequest }) { + const { savedObjectsClient } = await getStartDependencies(getKibanaRequest); - if (args.savedSearchId) { - if (typeof getSavedObject !== 'function') { - throw new Error( - '"getSavedObject" function not available in execution context. ' + - 'When you execute expression you need to add extra execution context ' + - 'as the third argument and provide "getSavedObject" implementation.' - ); - } - const obj = await getSavedObject('search', args.savedSearchId); - const search = obj.attributes.kibanaSavedObjectMeta as { searchSourceJSON: string }; - const { query, filter } = getParsedValue(search.searchSourceJSON, {}); + const timeRange = args.timeRange || input?.timeRange; + let queries = mergeQueries(input?.query, args?.q || []); + let filters = [ + ...(input?.filters || []), + ...((args?.filters?.map(unboxExpressionValue) || []) as Filter[]), + ]; - if (query) { - queries = mergeQueries(queries, query); - } - if (filter) { - filters = [...filters, ...(Array.isArray(filter) ? filter : [filter])]; + if (args.savedSearchId) { + const obj = await savedObjectsClient.get('search', args.savedSearchId); + const search = (obj.attributes as any).kibanaSavedObjectMeta.searchSourceJSON as string; + const { query, filter } = getParsedValue(search, {}); + + if (query) { + queries = mergeQueries(queries, query); + } + if (filter) { + filters = [...filters, ...(Array.isArray(filter) ? filter : [filter])]; + } } - } - return { - type: 'kibana_context', - query: queries, - filters: uniqFilters(filters).filter((f: any) => !f.meta?.disabled), - timeRange, - }; - }, + return { + type: 'kibana_context', + query: queries, + filters: uniqFilters(filters).filter((f: any) => !f.meta?.disabled), + timeRange, + }; + }, + }; + return kibanaContextFunction; }; diff --git a/src/plugins/data/public/search/expressions/kibana_context.ts b/src/plugins/data/public/search/expressions/kibana_context.ts new file mode 100644 index 0000000000000..e7ce8edf3080a --- /dev/null +++ b/src/plugins/data/public/search/expressions/kibana_context.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { StartServicesAccessor } from 'src/core/public'; +import { getKibanaContextFn } from '../../../common/search/expressions'; +import { DataPublicPluginStart, DataStartDependencies } from '../../types'; +import { SavedObjectsClientCommon } from '../../../common/index_patterns'; + +/** + * This is some glue code that takes in `core.getStartServices`, extracts the dependencies + * needed for this function, and wraps them behind a `getStartDependencies` function that + * is then called at runtime. + * + * We do this so that we can be explicit about exactly which dependencies the function + * requires, without cluttering up the top-level `plugin.ts` with this logic. It also + * makes testing the expression function a bit easier since `getStartDependencies` is + * the only thing you should need to mock. + * + * @param getStartServices - core's StartServicesAccessor for this plugin + * + * @internal + */ +export function getKibanaContext({ + getStartServices, +}: { + getStartServices: StartServicesAccessor; +}) { + return getKibanaContextFn(async () => { + const [core] = await getStartServices(); + return { + savedObjectsClient: (core.savedObjects.client as unknown) as SavedObjectsClientCommon, + }; + }); +} diff --git a/src/plugins/data/public/search/search_service.ts b/src/plugins/data/public/search/search_service.ts index 94fa5b7230f69..a3acd775ee892 100644 --- a/src/plugins/data/public/search/search_service.ts +++ b/src/plugins/data/public/search/search_service.ts @@ -21,7 +21,6 @@ import { handleResponse } from './fetch'; import { kibana, kibanaContext, - kibanaContextFunction, ISearchGeneric, SearchSourceDependencies, SearchSourceService, @@ -52,6 +51,7 @@ import { import { aggShardDelay } from '../../common/search/aggs/buckets/shard_delay_fn'; import { DataPublicPluginStart, DataStartDependencies } from '../types'; import { NowProviderInternalContract } from '../now_provider'; +import { getKibanaContext } from './expressions/kibana_context'; /** @internal */ export interface SearchServiceSetupDependencies { @@ -110,7 +110,11 @@ export class SearchService implements Plugin { }) ); expressions.registerFunction(kibana); - expressions.registerFunction(kibanaContextFunction); + expressions.registerFunction( + getKibanaContext({ getStartServices } as { + getStartServices: StartServicesAccessor; + }) + ); expressions.registerFunction(luceneFunction); expressions.registerFunction(kqlFunction); expressions.registerFunction(kibanaTimerangeFunction); diff --git a/src/plugins/data/server/search/expressions/kibana_context.ts b/src/plugins/data/server/search/expressions/kibana_context.ts new file mode 100644 index 0000000000000..c8fdbf4764b0e --- /dev/null +++ b/src/plugins/data/server/search/expressions/kibana_context.ts @@ -0,0 +1,46 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { StartServicesAccessor } from 'src/core/server'; +import { getKibanaContextFn } from '../../../common/search/expressions'; +import { DataPluginStart, DataPluginStartDependencies } from '../../plugin'; +import { SavedObjectsClientCommon } from '../../../common/index_patterns'; + +/** + * This is some glue code that takes in `core.getStartServices`, extracts the dependencies + * needed for this function, and wraps them behind a `getStartDependencies` function that + * is then called at runtime. + * + * We do this so that we can be explicit about exactly which dependencies the function + * requires, without cluttering up the top-level `plugin.ts` with this logic. It also + * makes testing the expression function a bit easier since `getStartDependencies` is + * the only thing you should need to mock. + * + * @param getStartServices - core's StartServicesAccessor for this plugin + * + * @internal + */ +export function getKibanaContext({ + getStartServices, +}: { + getStartServices: StartServicesAccessor; +}) { + return getKibanaContextFn(async (getKibanaRequest) => { + const request = getKibanaRequest && getKibanaRequest(); + if (!request) { + throw new Error('KIBANA_CONTEXT_KIBANA_REQUEST_MISSING'); + } + + const [{ savedObjects }] = await getStartServices(); + return { + savedObjectsClient: (savedObjects.getScopedClient( + request + ) as any) as SavedObjectsClientCommon, + }; + }); +} diff --git a/src/plugins/data/server/search/search_service.ts b/src/plugins/data/server/search/search_service.ts index 69710e82b73b4..04608406ca136 100644 --- a/src/plugins/data/server/search/search_service.ts +++ b/src/plugins/data/server/search/search_service.ts @@ -52,7 +52,6 @@ import { ISearchOptions, kibana, kibanaContext, - kibanaContextFunction, kibanaTimerangeFunction, kibanaFilterFunction, kqlFunction, @@ -75,6 +74,7 @@ import { ISearchSessionService, SearchSessionService } from './session'; import { KbnServerError } from '../../../kibana_utils/server'; import { registerBsearchRoute } from './routes/bsearch'; import { DataRequestHandlerContext } from '../types'; +import { getKibanaContext } from './expressions/kibana_context'; type StrategyMap = Record>; @@ -154,7 +154,7 @@ export class SearchService implements Plugin { expressions.registerFunction(luceneFunction); expressions.registerFunction(kqlFunction); expressions.registerFunction(kibanaTimerangeFunction); - expressions.registerFunction(kibanaContextFunction); + expressions.registerFunction(getKibanaContext({ getStartServices: core.getStartServices })); expressions.registerFunction(fieldFunction); expressions.registerFunction(rangeFunction); expressions.registerFunction(kibanaFilterFunction); diff --git a/src/plugins/expressions/common/execution/types.ts b/src/plugins/expressions/common/execution/types.ts index a897ef5222bfa..d9c8682567b30 100644 --- a/src/plugins/expressions/common/execution/types.ts +++ b/src/plugins/expressions/common/execution/types.ts @@ -11,7 +11,6 @@ import type { KibanaRequest } from 'src/core/server'; import { ExpressionType, SerializableState } from '../expression_types'; import { Adapters, RequestAdapter } from '../../../inspector/common'; -import { SavedObject, SavedObjectAttributes } from '../../../../core/public'; import { TablesAdapter } from '../util/tables_adapter'; /** @@ -59,20 +58,6 @@ export interface ExecutionContext< */ getKibanaRequest?: () => KibanaRequest; - /** - * Allows to fetch saved objects from ElasticSearch. In browser `getSavedObject` - * function is provided automatically by the Expressions plugin. On the server - * the caller of the expression has to provide this context function. The - * reason is because on the browser we always know the user who tries to - * fetch a saved object, thus saved object client is scoped automatically to - * that user. However, on the server we can scope that saved object client to - * any user, or even not scope it at all and execute it as an "internal" user. - */ - getSavedObject?: ( - type: string, - id: string - ) => Promise>; - /** * Returns the state (true|false) of the sync colors across panels switch. */ diff --git a/src/plugins/expressions/common/executor/executor.ts b/src/plugins/expressions/common/executor/executor.ts index 7962fe723d19f..255de31f7239b 100644 --- a/src/plugins/expressions/common/executor/executor.ts +++ b/src/plugins/expressions/common/executor/executor.ts @@ -215,17 +215,25 @@ export class Executor = Record { - link.arguments = fn.inject(link.arguments, references); + link.arguments = fn.inject( + link.arguments, + references + .filter((r) => r.name.includes(`l${linkId}_`)) + .map((r) => ({ ...r, name: r.name.replace(`l${linkId}_`, '') })) + ); + linkId++; }); } public extract(ast: ExpressionAstExpression) { + let linkId = 0; const allReferences: SavedObjectReference[] = []; const newAst = this.walkAst(cloneDeep(ast), (fn, link) => { const { state, references } = fn.extract(link.arguments); link.arguments = state; - allReferences.push(...references); + allReferences.push(...references.map((r) => ({ ...r, name: `l${linkId++}_${r.name}` }))); }); return { state: newAst, references: allReferences }; } diff --git a/src/plugins/expressions/public/plugin.ts b/src/plugins/expressions/public/plugin.ts index 2bff5e09352e4..2410ad8741312 100644 --- a/src/plugins/expressions/public/plugin.ts +++ b/src/plugins/expressions/public/plugin.ts @@ -7,12 +7,7 @@ */ import { PluginInitializerContext, CoreSetup, CoreStart, Plugin } from 'src/core/public'; -import { - ExpressionsService, - ExpressionsServiceSetup, - ExecutionContext, - ExpressionsServiceStart, -} from '../common'; +import { ExpressionsService, ExpressionsServiceSetup, ExpressionsServiceStart } from '../common'; import { setRenderersRegistry, setNotifications, setExpressionsService } from './services'; import { ReactExpressionRenderer } from './react_expression_renderer'; import { ExpressionLoader, IExpressionLoader, loader } from './loader'; @@ -42,14 +37,8 @@ export class ExpressionsPublicPlugin implements Plugin { - const [start] = await core.getStartServices(); - return start.savedObjects.client.get(type, id); - }; - executor.extendContext({ environment: 'client', - getSavedObject, }); } diff --git a/src/plugins/expressions/public/public.api.md b/src/plugins/expressions/public/public.api.md index 029d727e82e74..b3e7803f97c38 100644 --- a/src/plugins/expressions/public/public.api.md +++ b/src/plugins/expressions/public/public.api.md @@ -137,9 +137,6 @@ export type ExecutionContainer = StateContainer { abortSignal: AbortSignal; getKibanaRequest?: () => KibanaRequest; - // Warning: (ae-forgotten-export) The symbol "SavedObjectAttributes" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "SavedObject" needs to be exported by the entry point index.d.ts - getSavedObject?: (type: string, id: string) => Promise>; getSearchContext: () => ExecutionContextSearch; getSearchSessionId: () => string | undefined; inspectorAdapters: InspectorAdapters; diff --git a/src/plugins/expressions/server/server.api.md b/src/plugins/expressions/server/server.api.md index de9797843a4ab..2d873fa518306 100644 --- a/src/plugins/expressions/server/server.api.md +++ b/src/plugins/expressions/server/server.api.md @@ -135,9 +135,6 @@ export type ExecutionContainer = StateContainer { abortSignal: AbortSignal; getKibanaRequest?: () => KibanaRequest; - // Warning: (ae-forgotten-export) The symbol "SavedObjectAttributes" needs to be exported by the entry point index.d.ts - // Warning: (ae-forgotten-export) The symbol "SavedObject" needs to be exported by the entry point index.d.ts - getSavedObject?: (type: string, id: string) => Promise>; getSearchContext: () => ExecutionContextSearch; getSearchSessionId: () => string | undefined; inspectorAdapters: InspectorAdapters;