kibana/packages/kbn-utility-types/index.ts

101 lines
3 KiB
TypeScript
Raw Normal View History

/*
* Licensed to Elasticsearch B.V. under one or more contributor
* license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright
* ownership. Elasticsearch B.V. licenses this file to you under
* the Apache License, Version 2.0 (the "License"); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import { PromiseType } from 'utility-types';
export { $Values, Assign, Class, Optional, Required } from 'utility-types';
/**
* A type that may or may not be a `Promise`.
*/
export type MaybePromise<T> = T | Promise<T>;
/**
* Converts a type to a `Promise`, unless it is already a `Promise`. Useful when proxying the return value of a possibly async function.
*/
export type ShallowPromise<T> = T extends Promise<infer U> ? Promise<U> : Promise<T>;
/**
* Returns wrapped type of a `Promise`.
*/
export type UnwrapPromise<T extends Promise<any>> = PromiseType<T>;
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
/**
* Returns wrapped type of a promise, or returns type as is, if it is not a promise.
*/
export type UnwrapPromiseOrReturn<T> = T extends Promise<infer U> ? U : T;
/**
* Minimal interface for an object resembling an `Observable`.
*/
export interface ObservableLike<T> {
subscribe(observer: (value: T) => void): void;
}
/**
* Returns wrapped type of an observable.
*/
export type UnwrapObservable<T extends ObservableLike<any>> = T extends ObservableLike<infer U>
? U
: never;
/**
* Ensures T is of type X.
*/
export type Ensure<T, X> = T extends X ? T : never;
// If we define this inside RecursiveReadonly TypeScript complains.
// eslint-disable-next-line @typescript-eslint/no-empty-interface
export interface RecursiveReadonlyArray<T> extends ReadonlyArray<RecursiveReadonly<T>> {}
export type RecursiveReadonly<T> = T extends (...args: any) => any
? T
: T extends any[]
? RecursiveReadonlyArray<T[number]>
: T extends object
? Readonly<{ [K in keyof T]: RecursiveReadonly<T[K]> }>
: T;
/**
* Returns types or array or object values.
*/
export type Values<T> = T extends any[] ? T[number] : T extends object ? T[keyof T] : never;
/**
* Utility type for converting a union of types into an intersection.
*
* This is a bit of "black magic" that will interpret a Union type as an Intersection
* type. This is necessary in the case of distinguishing one collection from
* another.
*/
2020-05-22 09:08:58 +02:00
export type UnionToIntersection<U> = (U extends any ? (k: U) => void : never) extends (
k: infer I
) => void
? I
: never;
/**
* Returns public keys of an object.
*/
export type PublicKeys<T> = keyof T;
/**
* Returns an object with public keys only.
*/
export type PublicContract<T> = Pick<T, PublicKeys<T>>;