kibana/x-pack/plugins/canvas/types/functions.ts

188 lines
5.5 KiB
TypeScript
Raw Normal View History

/*
* Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one
* or more contributor license agreements. Licensed under the Elastic License
* 2.0; you may not use this file except in compliance with the Elastic License
* 2.0.
*/
Expressions refactor (#54342) * feat: 🎸 add UiComponent interface * feat: 🎸 add adapter for react => ui components and back * refactor: 💡 move registries to shared /common folder * feat: 🎸 create expressions service state contaienr * chore: 🤖 export some symbols * feat: 🎸 add Executor class * test: 💍 add simple integration test * feat: 🎸 move registries into executor * feat: 🎸 add initial implementation of Execution * feat: 🎸 move Executor's state container into a signle file * refactor: 💡 move createError() to /common folder * feat: 🎸 use Executor in plugin definition * refactor: 💡 rename handlers to FunctionHandlers * feat: 🎸 improve function typings * feat: 🎸 move types and func in sep folder, improve Execution * refactor: 💡 cleanup expression_types folder * refactor: 💡 improve typing names of expression types * refactor: 💡 remove lodash from ExpressionType and improve types * test: 💍 add ExpressionType tests * refactor: 💡 remove function wrappers around types * refactor: 💡 move functions to /common * test: 💍 improve expression function tests * feat: 🎸 create /parser folder * refactor: 💡 move function types into /expression_functions dir * refactor: 💡 improve parser setup * refactor: 💡 fix export structure and move args into expr_func * test: 💍 add ExpressionFunctionParameter tests * fix: 🐛 fix executor types and imports * refactor: 💡 move getByAlias to plugin, fix Execution types * feat: 🎸 add function for argument parsing * test: 💍 add Executor type tests * test: 💍 add executor function and context tests * test: 💍 check that Executor returns Execution * test: 💍 add basic tests for Execution * test: 💍 add basic test for execution of a chain of functions * test: 💍 add "mult" function tot tests * feat: 🎸 create separate expression_renderer folder * feat: 🎸 use new executor in public plugin * feat: 🎸 remove renderers from executor, add result to execution * fix: 🐛 fix Kibana TypeScript errors * test: 💍 add file to write integration tests for expr plugin * refactor: 💡 move state_containers to /common * refactor: 💡 move /parser to /ast and inline format() function * refactor: 💡 remove remaining @kbn/interpreter imports * feat: 🎸 better handling and typing for Executor context * feat: 🎸 use Executor.run function in plugin * fix: 🐛 fix TypeScript type errors * test: 💍 move integration tests into one file * feat: 🎸 create ExpressionsService * chore: 🤖 clean up legacy code * feat: 🎸 use ExpressionsService in /public * refactor: 💡 move inspector adapters to /common * feat: 🎸 improve execution * feat: 🎸 add state to execution state and don't clone AST * test: 💍 add tests for Execution object * test: 💍 improve expression test helpers * test: 💍 add Execution tests * refactor: 💡 improve required argument checking * fix: 🐛 fix Kibana TypeScript errors * test: 💍 add ExpressionsService unit tests * fix: 🐛 fix Expression plugin TypeScript types * refactor: 💡 prefix React component with React* * fix: 🐛 fix X-Pack TypeScript errors * fix: 🐛 fix test TypeScript errors * fix: 🐛 fix issues preventing loading * feat: 🎸 remove getInitialContext() handler * fix: 🐛 fix TypeScript errors * chore: 🤖 remove uicomponent interface * chore: 🤖 remove missing import * fix: 🐛 correctly handle .query in "kibana" expression function * refactor: 💡 call first arg in expression functions "input" * fix: 🐛 do not free Execution state container * test: 💍 fix tests after refactor * test: 💍 fix more tests after refactor * fix: 🐛 remove redundant export * test: 💍 update intepreter_functional test shapshots * fix: 🐛 relax "kibana" function throwing on missin gsearch ctx * refactor: 💡 don't use ExpressionAST interface in Canvas * docs: ✏️ improve ExpressionRenderer JSDocs * refactor: 💡 rename context.types to inputTypes in internal fn * refactor: 💡 replace context.types by unknown in ExprFuncDef * refactor: 💡 improve expression function definitions in OSS * fix: 🐛 correctly set name on metric_vis_fn * refactor: 💡 improve Lens definitions of expression functions * refactor: 💡 improve Canvas expression function definitions * test: 💍 add createMockExecutionContext() helper * refactor: 💡 add some type to events$ observable in expr handler * feat: 🎸 add types to observables in data handler * refactor: 💡 use inputTypes in canvas * fix: 🐛 fix interpreter grammer generation script * feat: 🎸 allow array in getByAlias * test: 💍 simplify test function specs * test: 💍 fix autocomplete tests * fix: 🐛 use correct expression types and NP getFunctions() API * refactor: 💡 use NP expressions to get renderer * fix: 🐛 use context.types on server-side Canvas function defs * refactor: 💡 use NP API to register Canvas renderers * feat: 🎸 use NP API to get types * style: 💄 minor formatting changes * feat: 🎸 use NP API to get expression functions * fix: 🐛 fix Canvas workpads * test: 💍 add missing mock functions * refactor: 💡 improve Lens func definition argument types * fix: 🐛 fix Lens type error * feat: 🎸 make lens datatable work again * feat: 🎸 bootstrap ExpressionsService on server-side * feat: 🎸 expose more registry related functions in contract * feat: 🎸 add environment: server to server-side expressions * docs: ✏️ add documentation * test: 💍 add missing Jest mocks * fix: 🐛 correct TypeScript type * docs: ✏️ improve documentation * fix: 🐛 make FunctionHelpDict type contain only Canvas functions * fix: 🐛 fix merge conflict * test: 💍 fix expression mocks
2020-02-11 19:47:36 +01:00
import { ExpressionFunctionDefinition } from 'src/plugins/expressions/common';
2019-07-10 17:02:35 +02:00
import { functions as commonFunctions } from '../canvas_plugin_src/functions/common';
import { functions as browserFunctions } from '../canvas_plugin_src/functions/browser';
import { functions as serverFunctions } from '../canvas_plugin_src/functions/server';
import { functions as externalFunctions } from '../canvas_plugin_src/functions/external';
import { initFunctions } from '../public/functions';
2019-07-10 17:02:35 +02:00
/**
* A `ExpressionFunctionFactory` is a powerful type used for any function that produces
* an `ExpressionFunction`. If it does not meet the signature for such a function,
* or if it does not produce an `ExpressionFunction`, it will be typed as
* returning `never`.
*
* This type will, in turn, strongly-type both a factory that produces an
* `ExpressionFunction`, *and* the `ExpressionFunction` itself. This means one can
* effectively introspect properties from the factory in other places.
*
* As an example, given the following:
*
```
function foo(): ExpressionFunction<'foo', Context, Arguments, Return> {
// ...
}
```
*
* `foo` would be an `ExpressionFunctionFactory`. Using the `FunctionFactory` type allows one to
* introspect the generics from the `ExpressionFunction` without needing to access it
* directly:
*
```
type Baz = FunctionFactory<typeof foo>;
```
*
* Thus, in reality, and in a Typescript-enabled IDE, one would see the following definition
* for `Baz`:
*
```
type Baz = ExpressionFunction<"foo", Context, Arguments, Return>
```
*
* Why is this useful? Given a collection of `ExpressionFunctions` that have been registered
* with the `Interpreter`, you could take that collection and do any number of other
* introspected, strongly-typed operations.
*
* One example would to create a dictionary of all of the names of the `ExpressionFunctions`
* that have been registered:
*
```
const someFunctions = [
functionOne: ExpressionFunction<'functionOne', Context, Arguments, Return>,
functionTwo: ExpressionFunction<'functionTwo', Context, Arguments, Return>,
functionThree: ExpressionFunction<'functionThree', Context, Arguments, Return>,
];
export type FunctionName = FunctionFactory<typeof someFunctions[number]>['name'];
const name: FunctionName = 'functionOne'; // passes
const nonName: FunctionName = 'elastic`; // fails
```
*
* A more practical example would be to use the introspected generics to create dictionaries,
* like of help strings or documentation, that would contain only valid functions and their
* generics, but nothing extraneous. This is actually used in a number of built-in functions
* in Kibana and Canvas.
*/
// prettier-ignore
Expressions refactor (#54342) * feat: 🎸 add UiComponent interface * feat: 🎸 add adapter for react => ui components and back * refactor: 💡 move registries to shared /common folder * feat: 🎸 create expressions service state contaienr * chore: 🤖 export some symbols * feat: 🎸 add Executor class * test: 💍 add simple integration test * feat: 🎸 move registries into executor * feat: 🎸 add initial implementation of Execution * feat: 🎸 move Executor's state container into a signle file * refactor: 💡 move createError() to /common folder * feat: 🎸 use Executor in plugin definition * refactor: 💡 rename handlers to FunctionHandlers * feat: 🎸 improve function typings * feat: 🎸 move types and func in sep folder, improve Execution * refactor: 💡 cleanup expression_types folder * refactor: 💡 improve typing names of expression types * refactor: 💡 remove lodash from ExpressionType and improve types * test: 💍 add ExpressionType tests * refactor: 💡 remove function wrappers around types * refactor: 💡 move functions to /common * test: 💍 improve expression function tests * feat: 🎸 create /parser folder * refactor: 💡 move function types into /expression_functions dir * refactor: 💡 improve parser setup * refactor: 💡 fix export structure and move args into expr_func * test: 💍 add ExpressionFunctionParameter tests * fix: 🐛 fix executor types and imports * refactor: 💡 move getByAlias to plugin, fix Execution types * feat: 🎸 add function for argument parsing * test: 💍 add Executor type tests * test: 💍 add executor function and context tests * test: 💍 check that Executor returns Execution * test: 💍 add basic tests for Execution * test: 💍 add basic test for execution of a chain of functions * test: 💍 add "mult" function tot tests * feat: 🎸 create separate expression_renderer folder * feat: 🎸 use new executor in public plugin * feat: 🎸 remove renderers from executor, add result to execution * fix: 🐛 fix Kibana TypeScript errors * test: 💍 add file to write integration tests for expr plugin * refactor: 💡 move state_containers to /common * refactor: 💡 move /parser to /ast and inline format() function * refactor: 💡 remove remaining @kbn/interpreter imports * feat: 🎸 better handling and typing for Executor context * feat: 🎸 use Executor.run function in plugin * fix: 🐛 fix TypeScript type errors * test: 💍 move integration tests into one file * feat: 🎸 create ExpressionsService * chore: 🤖 clean up legacy code * feat: 🎸 use ExpressionsService in /public * refactor: 💡 move inspector adapters to /common * feat: 🎸 improve execution * feat: 🎸 add state to execution state and don't clone AST * test: 💍 add tests for Execution object * test: 💍 improve expression test helpers * test: 💍 add Execution tests * refactor: 💡 improve required argument checking * fix: 🐛 fix Kibana TypeScript errors * test: 💍 add ExpressionsService unit tests * fix: 🐛 fix Expression plugin TypeScript types * refactor: 💡 prefix React component with React* * fix: 🐛 fix X-Pack TypeScript errors * fix: 🐛 fix test TypeScript errors * fix: 🐛 fix issues preventing loading * feat: 🎸 remove getInitialContext() handler * fix: 🐛 fix TypeScript errors * chore: 🤖 remove uicomponent interface * chore: 🤖 remove missing import * fix: 🐛 correctly handle .query in "kibana" expression function * refactor: 💡 call first arg in expression functions "input" * fix: 🐛 do not free Execution state container * test: 💍 fix tests after refactor * test: 💍 fix more tests after refactor * fix: 🐛 remove redundant export * test: 💍 update intepreter_functional test shapshots * fix: 🐛 relax "kibana" function throwing on missin gsearch ctx * refactor: 💡 don't use ExpressionAST interface in Canvas * docs: ✏️ improve ExpressionRenderer JSDocs * refactor: 💡 rename context.types to inputTypes in internal fn * refactor: 💡 replace context.types by unknown in ExprFuncDef * refactor: 💡 improve expression function definitions in OSS * fix: 🐛 correctly set name on metric_vis_fn * refactor: 💡 improve Lens definitions of expression functions * refactor: 💡 improve Canvas expression function definitions * test: 💍 add createMockExecutionContext() helper * refactor: 💡 add some type to events$ observable in expr handler * feat: 🎸 add types to observables in data handler * refactor: 💡 use inputTypes in canvas * fix: 🐛 fix interpreter grammer generation script * feat: 🎸 allow array in getByAlias * test: 💍 simplify test function specs * test: 💍 fix autocomplete tests * fix: 🐛 use correct expression types and NP getFunctions() API * refactor: 💡 use NP expressions to get renderer * fix: 🐛 use context.types on server-side Canvas function defs * refactor: 💡 use NP API to register Canvas renderers * feat: 🎸 use NP API to get types * style: 💄 minor formatting changes * feat: 🎸 use NP API to get expression functions * fix: 🐛 fix Canvas workpads * test: 💍 add missing mock functions * refactor: 💡 improve Lens func definition argument types * fix: 🐛 fix Lens type error * feat: 🎸 make lens datatable work again * feat: 🎸 bootstrap ExpressionsService on server-side * feat: 🎸 expose more registry related functions in contract * feat: 🎸 add environment: server to server-side expressions * docs: ✏️ add documentation * test: 💍 add missing Jest mocks * fix: 🐛 correct TypeScript type * docs: ✏️ improve documentation * fix: 🐛 make FunctionHelpDict type contain only Canvas functions * fix: 🐛 fix merge conflict * test: 💍 fix expression mocks
2020-02-11 19:47:36 +01:00
export type ExpressionFunctionFactory<Name extends string, Input, Arguments, Output> =
() => ExpressionFunctionDefinition<Name, Input, Arguments, Output>;
2019-07-10 17:02:35 +02:00
/**
* `FunctionFactory` exists as a name shim between the `ExpressionFunction` type and
* the functions that already existed in Canvas. This type can likely be removed, and
* callsites converted, if `ExpressionFunctionFactory` is moved into the Interpreter, (perhaps
* with a shorter name).
*/
// prettier-ignore
export type FunctionFactory<FnFactory> =
Expressions refactor (#54342) * feat: 🎸 add UiComponent interface * feat: 🎸 add adapter for react => ui components and back * refactor: 💡 move registries to shared /common folder * feat: 🎸 create expressions service state contaienr * chore: 🤖 export some symbols * feat: 🎸 add Executor class * test: 💍 add simple integration test * feat: 🎸 move registries into executor * feat: 🎸 add initial implementation of Execution * feat: 🎸 move Executor's state container into a signle file * refactor: 💡 move createError() to /common folder * feat: 🎸 use Executor in plugin definition * refactor: 💡 rename handlers to FunctionHandlers * feat: 🎸 improve function typings * feat: 🎸 move types and func in sep folder, improve Execution * refactor: 💡 cleanup expression_types folder * refactor: 💡 improve typing names of expression types * refactor: 💡 remove lodash from ExpressionType and improve types * test: 💍 add ExpressionType tests * refactor: 💡 remove function wrappers around types * refactor: 💡 move functions to /common * test: 💍 improve expression function tests * feat: 🎸 create /parser folder * refactor: 💡 move function types into /expression_functions dir * refactor: 💡 improve parser setup * refactor: 💡 fix export structure and move args into expr_func * test: 💍 add ExpressionFunctionParameter tests * fix: 🐛 fix executor types and imports * refactor: 💡 move getByAlias to plugin, fix Execution types * feat: 🎸 add function for argument parsing * test: 💍 add Executor type tests * test: 💍 add executor function and context tests * test: 💍 check that Executor returns Execution * test: 💍 add basic tests for Execution * test: 💍 add basic test for execution of a chain of functions * test: 💍 add "mult" function tot tests * feat: 🎸 create separate expression_renderer folder * feat: 🎸 use new executor in public plugin * feat: 🎸 remove renderers from executor, add result to execution * fix: 🐛 fix Kibana TypeScript errors * test: 💍 add file to write integration tests for expr plugin * refactor: 💡 move state_containers to /common * refactor: 💡 move /parser to /ast and inline format() function * refactor: 💡 remove remaining @kbn/interpreter imports * feat: 🎸 better handling and typing for Executor context * feat: 🎸 use Executor.run function in plugin * fix: 🐛 fix TypeScript type errors * test: 💍 move integration tests into one file * feat: 🎸 create ExpressionsService * chore: 🤖 clean up legacy code * feat: 🎸 use ExpressionsService in /public * refactor: 💡 move inspector adapters to /common * feat: 🎸 improve execution * feat: 🎸 add state to execution state and don't clone AST * test: 💍 add tests for Execution object * test: 💍 improve expression test helpers * test: 💍 add Execution tests * refactor: 💡 improve required argument checking * fix: 🐛 fix Kibana TypeScript errors * test: 💍 add ExpressionsService unit tests * fix: 🐛 fix Expression plugin TypeScript types * refactor: 💡 prefix React component with React* * fix: 🐛 fix X-Pack TypeScript errors * fix: 🐛 fix test TypeScript errors * fix: 🐛 fix issues preventing loading * feat: 🎸 remove getInitialContext() handler * fix: 🐛 fix TypeScript errors * chore: 🤖 remove uicomponent interface * chore: 🤖 remove missing import * fix: 🐛 correctly handle .query in "kibana" expression function * refactor: 💡 call first arg in expression functions "input" * fix: 🐛 do not free Execution state container * test: 💍 fix tests after refactor * test: 💍 fix more tests after refactor * fix: 🐛 remove redundant export * test: 💍 update intepreter_functional test shapshots * fix: 🐛 relax "kibana" function throwing on missin gsearch ctx * refactor: 💡 don't use ExpressionAST interface in Canvas * docs: ✏️ improve ExpressionRenderer JSDocs * refactor: 💡 rename context.types to inputTypes in internal fn * refactor: 💡 replace context.types by unknown in ExprFuncDef * refactor: 💡 improve expression function definitions in OSS * fix: 🐛 correctly set name on metric_vis_fn * refactor: 💡 improve Lens definitions of expression functions * refactor: 💡 improve Canvas expression function definitions * test: 💍 add createMockExecutionContext() helper * refactor: 💡 add some type to events$ observable in expr handler * feat: 🎸 add types to observables in data handler * refactor: 💡 use inputTypes in canvas * fix: 🐛 fix interpreter grammer generation script * feat: 🎸 allow array in getByAlias * test: 💍 simplify test function specs * test: 💍 fix autocomplete tests * fix: 🐛 use correct expression types and NP getFunctions() API * refactor: 💡 use NP expressions to get renderer * fix: 🐛 use context.types on server-side Canvas function defs * refactor: 💡 use NP API to register Canvas renderers * feat: 🎸 use NP API to get types * style: 💄 minor formatting changes * feat: 🎸 use NP API to get expression functions * fix: 🐛 fix Canvas workpads * test: 💍 add missing mock functions * refactor: 💡 improve Lens func definition argument types * fix: 🐛 fix Lens type error * feat: 🎸 make lens datatable work again * feat: 🎸 bootstrap ExpressionsService on server-side * feat: 🎸 expose more registry related functions in contract * feat: 🎸 add environment: server to server-side expressions * docs: ✏️ add documentation * test: 💍 add missing Jest mocks * fix: 🐛 correct TypeScript type * docs: ✏️ improve documentation * fix: 🐛 make FunctionHelpDict type contain only Canvas functions * fix: 🐛 fix merge conflict * test: 💍 fix expression mocks
2020-02-11 19:47:36 +01:00
FnFactory extends ExpressionFunctionFactory<infer Name, infer Input, infer Arguments, infer Output> ?
ExpressionFunctionDefinition<Name, Input, Arguments, Output> :
2019-07-10 17:02:35 +02:00
never;
type CommonFunction = FunctionFactory<typeof commonFunctions[number]>;
type BrowserFunction = FunctionFactory<typeof browserFunctions[number]>;
type ServerFunction = FunctionFactory<typeof serverFunctions[number]>;
type ExternalFunction = FunctionFactory<typeof externalFunctions[number]>;
type ClientFunctions = FunctionFactory<
ReturnType<typeof initFunctions> extends Array<infer U> ? U : never
>;
2019-07-10 17:02:35 +02:00
/**
* A collection of all Canvas Functions.
2019-07-10 17:02:35 +02:00
*/
export type CanvasFunction =
| CommonFunction
| BrowserFunction
| ServerFunction
| ExternalFunction
| ClientFunctions;
/**
* Represents a function called by the `case` Function.
*/
export interface Case {
type: 'case';
matches: any;
result: any;
}
export enum Legend {
NORTH_WEST = 'nw',
SOUTH_WEST = 'sw',
NORTH_EAST = 'ne',
SOUTH_EAST = 'se',
}
export enum Position {
TOP = 'top',
BOTTOM = 'bottom',
LEFT = 'left',
RIGHT = 'right',
}
export interface SeriesStyle {
type: 'seriesStyle';
bars: number;
color: string;
fill: number;
horizontalBars: boolean;
label: string;
lines: number;
points: number;
stack: number;
}
export interface Palette {
type: 'palette';
colors: string[];
gradient: boolean;
}
export interface Ticks {
x: {
hash: Record<string, any>;
counter: number;
};
y: {
hash: Record<string, any>;
counter: number;
};
}
export interface AxisConfig {
type: 'axisConfig';
show: boolean;
position: Position;
min: number;
max: number;
tickSize: number;
}
/**
* A Utility function that Typescript can use to determine if an object is an AxisConfig.
* @param axisConfig
*/
export const isAxisConfig = (axisConfig: any): axisConfig is AxisConfig =>
!!axisConfig && axisConfig.type === 'axisConfig';
export interface MapCenter {
type: 'mapCenter';
lat: number;
lon: number;
zoom: number;
}
export interface TimeRange {
type: 'timerange';
from: string;
to: string;
}