materialuiupgraded
Version:
Material-UI's workspace package
483 lines (396 loc) • 15.3 kB
JavaScript
// flow-typed signature: df9f48c1a489bbd1010b4c4701981db8
// flow-typed version: 245513abee/recompose_v0.x.x/flow_>=v0.55.x <=v0.56.x
/**
* 1) Types give additional constraint on a language, recompose was written on the untyped language
* as a consequence of this fact
* for some recompose HOCs is near impossible to add correct typings.
* 2) flow sometimes does not work as expected.
*
* So any help and suggestions will be very appreciated.
*
* -----------------------------------------------------------------------------------
* Type definition of recompose HOCs are splitted into 2 parts,
* "HOCs with good flow support" - in most cases you can use them without big issues,
* see `test_${hocName}.js` for the idea.
* Some known issues:
* see test_mapProps.js - inference work but type errors are not detected in hocs
*
* SUPPORTED HOCs:
* defaultProps, mapProps, withProps, withStateHandlers, withHandlers, pure,
* onlyUpdateForKeys, shouldUpdate, renderNothing, renderComponent, branch, withPropsOnChange,
* onlyUpdateForPropTypes, toClass, withContext, getContext,
* setStatic, setPropTypes, setDisplayName,
* -----------------------------------------------------------------------------------
* "TODO (UNSUPPORTED) HOCs" - you need to provide type information
* (no automatic type inference), voodoo dancing etc
* see `test_voodoo.js` for the idea
*
* remember that:
* flattenProp,renameProp, renameProps can easily be replaced with withProps
* withReducer, withState -> use withStateHandlers instead
* lifecycle -> you don't need recompose if you need a lifecycle, just use React class instead
* mapPropsStream -> see test_mapPropsStream.js
* -----------------------------------------------------------------------------------
*
* utils:
* getDisplayName, wrapDisplayName, shallowEqual,
* isClassComponent, createEagerElement, createEagerFactory, createSink, componentFromProp,
* nest, hoistStatics,
*/
//-------------------
declare module "recompose" {
// -----------------------------------------------------------------
// Private declarations
// -----------------------------------------------------------------
declare type Void_<A, B, C, D, R, Fn: (A, B, C, D) => R> = (
A,
B,
C,
D
) => void;
declare type Void<T> = Void_<*, *, *, *, *, T>;
declare type ExtractStateHandlersCodomain = <State, Enhanced, V>(
v: (state: State, props: Enhanced) => V
) => Void<V>;
declare type ExtractHandlersCodomain = <Enhanced, V>(
v: (props: Enhanced) => V
) => V;
declare type UnaryFn<A, R> = (a: A) => R;
// -----------------------------------------------------------------
// Public declarations
// -----------------------------------------------------------------
declare export type Component<A> = React$ComponentType<A>;
declare export type HOC<Base, Enhanced> = UnaryFn<
Component<Base>,
Component<Enhanced>
>;
declare export var compose: $Compose;
// ---------------------------------------------------------------------------
// ----------------===<<<HOCs with good flow support>>>===--------------------
// ---------------------------------------------------------------------------
declare export function defaultProps<Default, Enhanced>(
defProps: Default
): HOC<{ ...$Exact<Enhanced>, ...Default }, Enhanced>;
declare export function mapProps<Base, Enhanced>(
propsMapper: (ownerProps: Enhanced) => Base
): HOC<Base, Enhanced>;
declare export function withProps<BaseAdd, Enhanced>(
propsMapper: ((ownerProps: Enhanced) => BaseAdd) | BaseAdd
): HOC<{ ...$Exact<Enhanced>, ...BaseAdd }, Enhanced>;
declare export function withStateHandlers<
State,
Enhanced,
StateHandlers: {
[key: string]: (
state: State,
props: Enhanced
) => (...payload: any[]) => $Shape<State>
}
>(
initialState: ((props: Enhanced) => State) | State,
stateUpdaters: StateHandlers
): HOC<
{
...$Exact<Enhanced>,
...$Exact<State>,
...$ObjMap<StateHandlers, ExtractStateHandlersCodomain>
},
Enhanced
>;
declare export function withHandlers<
Enhanced,
Handlers:
| ((
props: Enhanced
) => {
[key: string]: (props: Enhanced) => Function
})
| {
[key: string]: (props: Enhanced) => Function
}
>(
handlers: ((props: Enhanced) => Handlers) | Handlers
): HOC<
{
...$Exact<Enhanced>,
...$ObjMap<Handlers, ExtractHandlersCodomain>
},
Enhanced
>;
declare export function pure<A>(a: Component<A>): Component<A>;
declare export function onlyUpdateForPropTypes<A>(
a: Component<A>
): Component<A>;
declare export function onlyUpdateForKeys<A>(Array<$Keys<A>>): HOC<A, A>;
declare export function shouldUpdate<A>(
(props: A, nextProps: A) => boolean
): HOC<A, A>;
declare export function toClass<A>(a: Component<A>): Component<A>;
declare export function withContext<A, ContextPropTypes, ContextObj>(
childContextTypes: ContextPropTypes,
getChildContext: (props: A) => ContextObj
): HOC<A, A>;
declare export function getContext<CtxTypes, Enhanced>(
contextTypes: CtxTypes
): HOC<{ ...$Exact<Enhanced>, ...CtxTypes }, Enhanced>;
/**
* It's wrong declaration but having that renderNothing and renderComponent are somehow useless
* outside branch enhancer, we just give it an id type
* so common way of using branch like
* `branch(testFn, renderNothing | renderComponent(Comp))` will work as expected.
* Tests are placed at test_branch.
*/
declare export function renderNothing<A>(C: Component<A>): Component<A>;
declare export function renderComponent<A>(a: Component<A>): HOC<A, A>;
/**
* We make an assumtion that left and right have the same type if exists
*/
declare export function branch<Base, Enhanced>(
testFn: (props: Enhanced) => boolean,
// not a HOC because of inference problems, this works but HOC<Base, Enhanced> is not
left: (Component<Base>) => Component<Enhanced>,
// I never use right part and it can be a problem with inference as should be same type as left
right?: (Component<Base>) => Component<Enhanced>
): HOC<Base, Enhanced>;
// test_statics
declare export function setStatic<A>(key: string, value: any): HOC<A, A>;
declare export function setPropTypes<A>(propTypes: Object): HOC<A, A>;
declare export function setDisplayName<A>(displayName: string): HOC<A, A>;
declare export function withPropsOnChange<BaseAdd, Enhanced>(
shouldMapOrKeys:
| ((props: Enhanced, nextProps: Enhanced) => boolean)
| Array<$Keys<Enhanced>>,
propsMapper: (ownerProps: Enhanced) => BaseAdd
): HOC<{ ...$Exact<Enhanced>, ...BaseAdd }, Enhanced>;
// ---------------------------------------------------------------------------
// ----------------===<<<TODO (UNSUPPORTED) HOCs>>>===------------------------
// ---------------------------------------------------------------------------
// use withProps instead
declare export function flattenProp<Base, Enhanced>(
propName: $Keys<Enhanced>
): HOC<Base, Enhanced>;
// use withProps instead
declare export function renameProp<Base, Enhanced>(
oldName: $Keys<Enhanced>,
newName: $Keys<Base>
): HOC<Base, Enhanced>;
// use withProps instead
declare export function renameProps<Base, Enhanced>(nameMap: {
[key: $Keys<Enhanced>]: $Keys<Base>
}): HOC<Base, Enhanced>;
// use withStateHandlers instead
declare export function withState<Base, Enhanced, T>(
stateName: string,
stateUpdaterName: string,
initialState: T | ((props: Enhanced) => T)
): HOC<Base, Enhanced>;
// use withStateHandlers instead
declare export function withReducer<A, B, Action, State>(
stateName: string,
dispatchName: string,
reducer: (state: State, action: Action) => State,
initialState: State
): HOC<A, B>;
// lifecycle use React instead
declare export function lifecycle<A, B>(spec: Object): HOC<A, B>;
// Help needed, as explicitly providing the type
// errors not detected, see TODO at test_mapPropsStream.js
declare export function mapPropsStream<Base, Enhanced>(
(props$: any) => any
): HOC<Base, Enhanced>;
// ---------------------------------------------------------------------------
// -----------------------------===<<<Utils>>>===-----------------------------
// ---------------------------------------------------------------------------
declare export function getDisplayName<A>(C: Component<A>): string;
declare export function wrapDisplayName<A>(
C: Component<A>,
wrapperName: string
): string;
declare export function shallowEqual(objA: mixed, objB: mixed): boolean;
declare export function isClassComponent(value: any): boolean;
declare export function createEagerElement<A>(
type: Component<A> | string,
props: ?A,
children?: ?React$Node
): React$Element<any>;
declare export function createEagerFactory<A>(
type: Component<A> | string
): (props: ?A, children?: ?React$Node) => React$Element<any>;
declare export function createSink<A>(
callback: (props: A) => void
): Component<A>;
declare export function componentFromProp<A>(propName: string): Component<A>;
declare export function nest<A>(
...Components: Array<Component<any> | string>
): Component<A>;
declare export function hoistStatics<A, B, H: HOC<A, B>>(hoc: H): H;
declare export function componentFromStream<T>(
(props$: any) => any
): T => React$Element<any>;
declare export function createEventHandler(): {
stream: any,
handler: Function
};
}
declare module "recompose/defaultProps" {
declare module.exports: $PropertyType<$Exports<"recompose">, "defaultProps">;
}
declare module "recompose/mapProps" {
declare module.exports: $PropertyType<$Exports<"recompose">, "mapProps">;
}
declare module "recompose/withProps" {
declare module.exports: $PropertyType<$Exports<"recompose">, "withProps">;
}
declare module "recompose/withStateHandlers" {
declare module.exports: $PropertyType<
$Exports<"recompose">,
"withStateHandlers"
>;
}
declare module "recompose/withHandlers" {
declare module.exports: $PropertyType<$Exports<"recompose">, "withHandlers">;
}
declare module "recompose/pure" {
declare module.exports: $PropertyType<$Exports<"recompose">, "pure">;
}
declare module "recompose/onlyUpdateForPropTypes" {
declare module.exports: $PropertyType<
$Exports<"recompose">,
"onlyUpdateForPropTypes"
>;
}
declare module "recompose/onlyUpdateForKeys" {
declare module.exports: $PropertyType<
$Exports<"recompose">,
"onlyUpdateForKeys"
>;
}
declare module "recompose/shouldUpdate" {
declare module.exports: $PropertyType<$Exports<"recompose">, "shouldUpdate">;
}
declare module "recompose/toClass" {
declare module.exports: $PropertyType<$Exports<"recompose">, "toClass">;
}
declare module "recompose/withContext" {
declare module.exports: $PropertyType<$Exports<"recompose">, "withContext">;
}
declare module "recompose/getContext" {
declare module.exports: $PropertyType<$Exports<"recompose">, "getContext">;
}
declare module "recompose/renderNothing" {
declare module.exports: $PropertyType<$Exports<"recompose">, "renderNothing">;
}
declare module "recompose/renderComponent" {
declare module.exports: $PropertyType<
$Exports<"recompose">,
"renderComponent"
>;
}
declare module "recompose/branch" {
declare module.exports: $PropertyType<$Exports<"recompose">, "branch">;
}
declare module "recompose/setStatic" {
declare module.exports: $PropertyType<$Exports<"recompose">, "setStatic">;
}
declare module "recompose/setPropTypes" {
declare module.exports: $PropertyType<$Exports<"recompose">, "setPropTypes">;
}
declare module "recompose/setDisplayName" {
declare module.exports: $PropertyType<
$Exports<"recompose">,
"setDisplayName"
>;
}
declare module "recompose/withPropsOnChange" {
declare module.exports: $PropertyType<
$Exports<"recompose">,
"withPropsOnChange"
>;
}
declare module "recompose/flattenProp" {
declare module.exports: $PropertyType<$Exports<"recompose">, "flattenProp">;
}
declare module "recompose/renameProp" {
declare module.exports: $PropertyType<$Exports<"recompose">, "renameProp">;
}
declare module "recompose/renameProps" {
declare module.exports: $PropertyType<$Exports<"recompose">, "renameProps">;
}
declare module "recompose/withState" {
declare module.exports: $PropertyType<$Exports<"recompose">, "withState">;
}
declare module "recompose/withReducer" {
declare module.exports: $PropertyType<$Exports<"recompose">, "withReducer">;
}
declare module "recompose/lifecycle" {
declare module.exports: $PropertyType<$Exports<"recompose">, "lifecycle">;
}
declare module "recompose/mapPropsStream" {
declare module.exports: $PropertyType<
$Exports<"recompose">,
"mapPropsStream"
>;
}
declare module "recompose/getDisplayName" {
declare module.exports: $PropertyType<
$Exports<"recompose">,
"getDisplayName"
>;
}
declare module "recompose/wrapDisplayName" {
declare module.exports: $PropertyType<
$Exports<"recompose">,
"wrapDisplayName"
>;
}
declare module "recompose/shallowEqual" {
declare module.exports: $PropertyType<$Exports<"recompose">, "shallowEqual">;
}
declare module "recompose/isClassComponent" {
declare module.exports: $PropertyType<
$Exports<"recompose">,
"isClassComponent"
>;
}
declare module "recompose/createEagerElement" {
declare module.exports: $PropertyType<
$Exports<"recompose">,
"createEagerElement"
>;
}
declare module "recompose/createEagerFactory" {
declare module.exports: $PropertyType<
$Exports<"recompose">,
"createEagerFactory"
>;
}
declare module "recompose/createSink" {
declare module.exports: $PropertyType<$Exports<"recompose">, "createSink">;
}
declare module "recompose/componentFromProp" {
declare module.exports: $PropertyType<
$Exports<"recompose">,
"componentFromProp"
>;
}
declare module "recompose/nest" {
declare module.exports: $PropertyType<$Exports<"recompose">, "nest">;
}
declare module "recompose/hoistStatics" {
declare module.exports: $PropertyType<$Exports<"recompose">, "hoistStatics">;
}
declare module "recompose/componentFromStream" {
declare module.exports: $PropertyType<
$Exports<"recompose">,
"componentFromStream"
>;
}
declare module "recompose/createEventHandler" {
declare module.exports: $PropertyType<
$Exports<"recompose">,
"createEventHandler"
>;
}
declare module "recompose/compose" {
declare module.exports: $PropertyType<$Exports<"recompose">, "compose">;
}