cc1dd52977
* 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>
189 lines
5.6 KiB
TypeScript
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;
|
|
}
|