kibana/x-pack/plugins/canvas/types/functions.ts
Yaroslav Kuznietsov cc1dd52977
[Canvas] Expression reveal image. Async libs and images loading. (#103399)
* Added lazy loading of async libs to storybook.

* Refactored lazy loading of import for a storybook.

* more refactoring stuff.

* more refactoring.

* small refactor of waitFor.

* Added support of async functions.

* Types fix.

* fixed docs.

* Fixed some mistakes.

* Fixed type of tests.

* added type for async function to write dicts easier.

* Updated stories and view with async image.

* Changed all static to  async imports.

* Removed static import of `elasticLogo`. Fixed type error.

* Changed way of returning async functions in `functionWrapper`.

* fixed renderer test.

* fixed errors.

* added outline and fixed types.

* added outline everywhere.

* waitFor fixed.

* removed useless exports.

* Fixed type error.

* fixed types of dropdown_control.test.ts

* fixed `csv.test.ts` types.

* Tests fixed.

* Fixed storybooks.

* Fixed failed tests.

* [Canvas] Expression reveal image. (#101987)

* expression_reveal_image skeleton.

* expression_functions added.

* expression_renderers added.

* Backup of daily work.

* Fixed errors.

* Added legacy support. Added button for legacy.

* Added storybook.

* Removed revealImage from canvas.

* setState while rendering error fixed.

* tsconfig.json added.

* jest.config.js added.

* Demo doc added.

* Types fixed.

* added limits.

* Removed not used imports.

* i18n namespaces fixed.

* Fixed test suite error.

* Some errors fixed.

* Fixed eslint error.

* Removed more unused translations.

* Moved UI and elements, related to expressionRevealImage from canvas.

* Fixed unused translations errors.

* Moved type of element to types.

* Fixed types and added service for representing elements, ui and supported renderers to canvas.

* Added expression registration to canvas.

* Fixed

* Fixed mutiple call of the function.

* Removed support of a legacy lib for revealImage chart.

* Removed legacy presentation_utils plugin import.

* Doc error fixed.

* Removed useless translations and tried to fix error.

* One more fix.

* Small imports fix.

* Fixed translations.

* Made fixes based on nits.

* Removed useless params.

* fix.

* Fixed errors, related to jest and __mocks__.

* Removed useless type definition.

* Replaced RendererHandlers with IInterpreterRendererHandlers.

* fixed supported_shareable.

* Moved elements back to canvas.

* Moved views to canvas, removed expression service and imported renderer to canvas.

* Fixed translations.

* Types fix.

* Moved libs to presentation utils.

* Fixed one mistake.

* removed dataurl lib.

* Fixed jest files.

* elasticLogo removed.

* Removed elastic_outline.

* removed httpurl.

* Removed missing_asset.

* removed url.

* replaced mostly all tests.

* Fixed types.

* Fixed types and removed function_wrapper.ts

* Fixed types of test helpers.

* Changed limits of presentationUtil plugin.

* Fixed imports.

* One more fix.

* Fixed huge size of bundle.

* Reduced allow limit for presentationUtil

* Updated limits for presentationUtil.

* Fixed public API.

* fixed type errors.

* Moved css to component.

* Fixed spaces at element.

* Changed order of requiredPlugins.

* Updated limits.

* Removed unused plugin.

* Added rule for allowing import from __stories__ directory.

* removed useless comment.

* Changed readme.md

* Fixed docs error.

* A possible of smoke test.

* onResize changed to useResizeObserver.

* Remove useless events and `useEffect` block.

* Changed from passing handlers to separate functions.

* `function` moved to `server`.

* Fixed eslint error.

Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>

* Fixed mistake of merge.

* Storybook fixed.

* Fixed a mistake that occurred while resolving merge conflicts.

* removed registerFunctionAsync and changed functionWrapper from async to sync. + RepeatImageFunction.

* Fixed async functionWrapper usage and fixed `image.test.js` to run.

* Added default value for image.

* More fixes of async.

* Fixed a lot of legacy.

* Type fixes.

* Fix of fallen tests.

* First part of suggestions completed.

* Made image required.

* Removed useless `async`

* Jest test fixed.

* Fixed code, based on nits.

* Moved to `emotion`.

* Fixed prettier error.

* replaced jsx pragma with react.

* Removed unused jsx.

Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
2021-07-19 17:10:18 +03:00

189 lines
5.6 KiB
TypeScript

/*
* 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.
*/
import { ExpressionFunctionDefinition } from 'src/plugins/expressions/common';
import { UnwrapPromiseOrReturn } from '@kbn/utility-types';
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';
/**
* 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
export type ExpressionFunctionFactory<Name extends string, Input, Arguments, Output> =
() => ExpressionFunctionDefinition<Name, Input, Arguments, Output>
/**
* `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> =
FnFactory extends ExpressionFunctionFactory<infer Name, infer Input, infer Arguments, infer Output> ?
ExpressionFunctionDefinition<Name, Input, Arguments, UnwrapPromiseOrReturn<Output>> :
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
>;
/**
* A collection of all Canvas Functions.
*/
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;
}