Skip to content

Commit

Permalink
flow-typed
Browse files Browse the repository at this point in the history
  • Loading branch information
lyubomir committed Feb 3, 2017
1 parent 7d6e677 commit b3a35c7
Show file tree
Hide file tree
Showing 8 changed files with 177 additions and 10 deletions.
1 change: 1 addition & 0 deletions .eslintignore
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ build/*

# Third-party source code which we (1) do not want to modify or (2) try to
# modify as little as possible.
flow-typed/*
libs/*

# ESLint will by default ignore its own configuration file. However, there does
Expand Down
7 changes: 6 additions & 1 deletion .jshintignore
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
# The following do not need to be checked because they do not represent JS
# source code.
build/
debian/
libs/
node_modules/

# The following are checked by ESLint which supersedes JSHint.
flow-typed/
react/

analytics.js
webpack.config.babel.js
6 changes: 6 additions & 0 deletions flow-typed/npm/flow-bin_v0.x.x.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
// flow-typed signature: 6a5610678d4b01e13bbfbbc62bdaf583
// flow-typed version: 3817bc6980/flow-bin_v0.x.x/flow_>=v0.25.x

declare module "flow-bin" {
declare module.exports: string;
}
89 changes: 89 additions & 0 deletions flow-typed/npm/react-redux_v5.x.x.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
// flow-typed signature: 0ed284c5a2e97a9e3c0e87af3dedc09d
// flow-typed version: bdf1e66252/react-redux_v5.x.x/flow_>=v0.30.x

import type { Dispatch, Store } from 'redux'

declare module 'react-redux' {

/*
S = State
A = Action
OP = OwnProps
SP = StateProps
DP = DispatchProps
*/

declare type MapStateToProps<S, OP: Object, SP: Object> = (state: S, ownProps: OP) => SP | MapStateToProps<S, OP, SP>;

declare type MapDispatchToProps<A, OP: Object, DP: Object> = ((dispatch: Dispatch<A>, ownProps: OP) => DP) | DP;

declare type MergeProps<SP, DP: Object, OP: Object, P: Object> = (stateProps: SP, dispatchProps: DP, ownProps: OP) => P;

declare type StatelessComponent<P> = (props: P) => ?React$Element<any>;

declare class ConnectedComponent<OP, P, Def, St> extends React$Component<void, OP, void> {
static WrappedComponent: Class<React$Component<Def, P, St>>;
getWrappedInstance(): React$Component<Def, P, St>;
static defaultProps: void;
props: OP;
state: void;
}

declare type ConnectedComponentClass<OP, P, Def, St> = Class<ConnectedComponent<OP, P, Def, St>>;

declare type Connector<OP, P> = {
(component: StatelessComponent<P>): ConnectedComponentClass<OP, P, void, void>;
<Def, St>(component: Class<React$Component<Def, P, St>>): ConnectedComponentClass<OP, P, Def, St>;
};

declare class Provider<S, A> extends React$Component<void, { store: Store<S, A>, children?: any }, void> { }

declare type ConnectOptions = {
pure?: boolean,
withRef?: boolean
};

declare type Null = null | void;

declare function connect<A, OP>(
...rest: Array<void> // <= workaround for https://github.com/facebook/flow/issues/2360
): Connector<OP, $Supertype<{ dispatch: Dispatch<A> } & OP>>;

declare function connect<A, OP>(
mapStateToProps: Null,
mapDispatchToProps: Null,
mergeProps: Null,
options: ConnectOptions
): Connector<OP, $Supertype<{ dispatch: Dispatch<A> } & OP>>;

declare function connect<S, A, OP, SP>(
mapStateToProps: MapStateToProps<S, OP, SP>,
mapDispatchToProps: Null,
mergeProps: Null,
options?: ConnectOptions
): Connector<OP, $Supertype<SP & { dispatch: Dispatch<A> } & OP>>;

declare function connect<A, OP, DP>(
mapStateToProps: Null,
mapDispatchToProps: MapDispatchToProps<A, OP, DP>,
mergeProps: Null,
options?: ConnectOptions
): Connector<OP, $Supertype<DP & OP>>;

declare function connect<S, A, OP, SP, DP>(
mapStateToProps: MapStateToProps<S, OP, SP>,
mapDispatchToProps: MapDispatchToProps<A, OP, DP>,
mergeProps: Null,
options?: ConnectOptions
): Connector<OP, $Supertype<SP & DP & OP>>;

declare function connect<S, A, OP, SP, DP, P>(
mapStateToProps: MapStateToProps<S, OP, SP>,
mapDispatchToProps: MapDispatchToProps<A, OP, DP>,
mergeProps: MergeProps<SP, DP, OP, P>,
options?: ConnectOptions
): Connector<OP, P>;

}
56 changes: 56 additions & 0 deletions flow-typed/npm/redux_v3.x.x.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
// flow-typed signature: ba132c96664f1a05288f3eb2272a3c35
// flow-typed version: c4bbd91cfc/redux_v3.x.x/flow_>=v0.33.x

declare module 'redux' {

/*
S = State
A = Action
*/

declare type Dispatch<A: { type: $Subtype<string> }> = (action: A) => A;

declare type MiddlewareAPI<S, A> = {
dispatch: Dispatch<A>;
getState(): S;
};

declare type Store<S, A> = {
// rewrite MiddlewareAPI members in order to get nicer error messages (intersections produce long messages)
dispatch: Dispatch<A>;
getState(): S;
subscribe(listener: () => void): () => void;
replaceReducer(nextReducer: Reducer<S, A>): void
};

declare type Reducer<S, A> = (state: S, action: A) => S;

declare type Middleware<S, A> =
(api: MiddlewareAPI<S, A>) =>
(next: Dispatch<A>) => Dispatch<A>;

declare type StoreCreator<S, A> = {
(reducer: Reducer<S, A>, enhancer?: StoreEnhancer<S, A>): Store<S, A>;
(reducer: Reducer<S, A>, preloadedState: S, enhancer?: StoreEnhancer<S, A>): Store<S, A>;
};

declare type StoreEnhancer<S, A> = (next: StoreCreator<S, A>) => StoreCreator<S, A>;

declare function createStore<S, A>(reducer: Reducer<S, A>, enhancer?: StoreEnhancer<S, A>): Store<S, A>;
declare function createStore<S, A>(reducer: Reducer<S, A>, preloadedState: S, enhancer?: StoreEnhancer<S, A>): Store<S, A>;

declare function applyMiddleware<S, A>(...middlewares: Array<Middleware<S, A>>): StoreEnhancer<S, A>;

declare type ActionCreator<A, B> = (...args: Array<B>) => A;
declare type ActionCreators<K, A> = { [key: K]: ActionCreator<A, any> };

declare function bindActionCreators<A, C: ActionCreator<A, any>>(actionCreator: C, dispatch: Dispatch<A>): C;
declare function bindActionCreators<A, K, C: ActionCreators<K, A>>(actionCreators: C, dispatch: Dispatch<A>): C;

declare function combineReducers<O: Object, A>(reducers: O): Reducer<$ObjMap<O, <S>(r: Reducer<S, any>) => S>, A>;

declare function compose<S, A>(...fns: Array<StoreEnhancer<S, A>>): Function;

}
1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@
"clean-css": "^3.0.0",
"css-loader": "*",
"eslint": "^3.14.1",
"eslint-plugin-import": "^2.2.0",
"eslint-plugin-jsdoc": "*",
"eslint-plugin-react": "*",
"eslint-plugin-react-native": "^2.2.1",
Expand Down
8 changes: 7 additions & 1 deletion react/.eslintrc.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,11 @@ module.exports = {
}
},
'plugins': [

// ESLint's rule no-duplicate-imports does not understand Flow's import
// type. Fortunately, eslint-plugin-import understands Flow's import
// type.
'import',
'jsdoc',
'react',
'react-native'
Expand Down Expand Up @@ -273,7 +278,6 @@ module.exports = {
'no-confusing-arrow': 2,
'no-const-assign': 2,
'no-dupe-class-members': 2,
'no-duplicate-imports': 2,
'no-new-symbol': 2,
'no-restricted-imports': 0,
'no-this-before-super': 2,
Expand All @@ -298,6 +302,8 @@ module.exports = {
'template-curly-spacing': 2,
'yield-star-spacing': 2,

'import/no-duplicates': 2,

// JsDoc plugin rules group. The following rules are in addition to
// valid-jsdoc rule.
'jsdoc/check-param-names': 0,
Expand Down
19 changes: 11 additions & 8 deletions react/features/base/redux/MiddlewareRegistry.js
Original file line number Diff line number Diff line change
@@ -1,15 +1,14 @@
/* @flow */

import { applyMiddleware } from 'redux';

type Middleware = Function;
import type { Middleware } from 'redux';

/**
* A registry for Redux middleware, allowing features to register their
* middleware without needing to create additional inter-feature dependencies.
*/
class MiddlewareRegistry {
_elements: Middleware[];
_elements: Array<Middleware<*, *>>;

/**
* Creates a MiddlewareRegistry instance.
Expand All @@ -19,7 +18,7 @@ class MiddlewareRegistry {
* The set of registered middleware.
*
* @private
* @type {Route[]}
* @type {Middleware[]}
*/
this._elements = [];
}
Expand All @@ -32,11 +31,15 @@ class MiddlewareRegistry {
* be included (such as middleware from third-party modules).
* @returns {Middleware}
*/
applyMiddleware(...additional: Middleware[]) {
return applyMiddleware(
applyMiddleware(...additional: Array<Middleware<*, *>>) {
// XXX The explicit definition of the local variable middlewares is to
// satisfy flow.
const middlewares = [
...this._elements,
...additional
);
];

return applyMiddleware(...middlewares);
}

/**
Expand All @@ -47,7 +50,7 @@ class MiddlewareRegistry {
* @param {Middleware} middleware - A Redux middleware.
* @returns {void}
*/
register(middleware: Middleware) {
register(middleware: Middleware<*, *>) {
this._elements.push(middleware);
}
}
Expand Down

0 comments on commit b3a35c7

Please sign in to comment.