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