Skip to content
This repository was archived by the owner on Dec 9, 2021. It is now read-only.

Commit 89ba699

Browse files
committed
Add types
1 parent a241bb1 commit 89ba699

35 files changed

+120
-82
lines changed

package.json

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
"scripts": {
66
"---------- HELPERS -----------------------------------------------------------------------------": "",
77
"remove": "cross-env rimraf dist",
8-
"buildServer": "cross-env BABEL_ENV=server ./node_modules/.bin/babel src --out-dir dist",
9-
"watchServer": "cross-env BABEL_ENV=server ./node_modules/.bin/babel src --out-dir dist --watch",
8+
"buildServer": "cross-env tsc -project tsconfig.server.json",
9+
"watchServer": "cross-env tsc -watch -project tsconfig.server.json",
1010
"removeAndBuildServer": "cross-env npm run remove && npm run buildServer",
1111
"start": "cross-env NODE_ENV=production node ./dist/server.js",
1212
"---------- DEVELOPMENT -------------------------------------------------------------------------": "",

src/RouterWrapper.tsx

+3-8
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,10 @@ import {BrowserRouter, Route, Switch} from 'react-router-dom';
44
import {StaticRouter} from 'react-router';
55
import About from './views/About';
66
import Home from './views/Home';
7-
import Contact from './views/Contact';
87
import Footer from './views/landmarks/Footer';
98
import Header from './views/landmarks/Header';
10-
import IStore from './interfaces/IStore';
11-
import ISagaStore from './interfaces/ISagaStore';
9+
import IStore from './interfaces/store/IStore';
10+
import ISagaStore from './interfaces/store/ISagaStore';
1211

1312
interface IProviderWrapperProps {
1413
store: ISagaStore<IStore>;
@@ -18,7 +17,7 @@ interface IProviderWrapperProps {
1817
}
1918

2019
const RouterWrapper: React.StatelessComponent<IProviderWrapperProps> = (props: IProviderWrapperProps): JSX.Element => {
21-
const Router = props.isServerSide ? StaticRouter : BrowserRouter;
20+
const Router: any = props.isServerSide ? StaticRouter : BrowserRouter;
2221

2322
return (
2423
<Provider store={props.store}>
@@ -38,10 +37,6 @@ const RouterWrapper: React.StatelessComponent<IProviderWrapperProps> = (props: I
3837
path="/about"
3938
component={About}
4039
/>
41-
<Route
42-
path="/contact"
43-
component={Contact}
44-
/>
4540
</Switch>
4641
<Footer />
4742
</div>

src/_declare/window.d.ts

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
interface Window {
2+
__STATE__?: any;
3+
}

src/client.tsx

+5-5
Original file line numberDiff line numberDiff line change
@@ -6,19 +6,19 @@ import * as React from 'react';
66
import * as ReactDOM from 'react-dom';
77
import RouterWrapper from './RouterWrapper';
88
import ProviderService from './services/ProviderService';
9-
import IStore from './interfaces/IStore';
10-
import ISagaStore from './interfaces/ISagaStore';
9+
import IStore from './interfaces/store/IStore';
10+
import ISagaStore from './interfaces/store/ISagaStore';
1111

1212
const initialState: IStore = {
13-
...(window as any)['__STATE__'],
13+
...window.__STATE__,
1414
renderReducer: {
1515
isServerSide: false,
1616
},
1717
};
18-
const store: ISagaStore<IStore> = ProviderService.createProviderStore(initialState);
18+
const store: ISagaStore<IStore> = ProviderService.createProviderStore(initialState);
1919
const rootEl: HTMLElement = document.getElementById('root');
2020

21-
delete (window as any)['__STATE__'];
21+
delete window.__STATE__;
2222

2323
const render = (Component: any) =>
2424
ReactDOM.render(
File renamed without changes.
File renamed without changes.
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import {Store} from 'redux';
22

33
interface ISagaStore<S> extends Store<S> {
4-
runSaga: any; // TODO: flesh out types
5-
endSaga: any;
4+
runSaga: Function; // TODO: figure out type
5+
endSaga: Function; // TODO: figure out type
66
}
77

88
export default ISagaStore;
File renamed without changes.
File renamed without changes.

src/server.ts

-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import 'fetch-everywhere';
22
import * as inert from 'inert';
3-
43
import ServerManager from './server/ServerManager';
54
import AssetsController from './server/controllers/AssetsController';
65
import ReactController from './server/controllers/ReactController';

src/server/ServerManager.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import * as Hapi from 'hapi';
2-
import IController from '../interfaces/IController';
2+
import IController from '../interfaces/server/IController';
3+
import {ServerConnectionOptions} from 'hapi';
34

45
const PORT = process.env.PORT || 3000;
56
const HOST = process.env.HOST || 'localhost';
67
const NODE_ENV = process.env.NODE_ENV;
78

89
class ServerManager {
910

10-
public static log = () => console.info(`\n\nServer running in ${NODE_ENV} mode at: http://${HOST}:${PORT}\n`);
11+
public static log: Function = (): void => console.info(`\n\nServer running in ${NODE_ENV} mode at: http://${HOST}:${PORT}\n`);
1112

1213
private _server: Hapi.Server = new Hapi.Server({debug: {request: ['error']}});
1314

@@ -21,7 +22,7 @@ class ServerManager {
2122
this._server.connection({
2223
host: HOST,
2324
port: PORT,
24-
});
25+
} as ServerConnectionOptions);
2526
}
2627

2728
public async registerPlugin(pluginConfig: any): Promise<void> {

src/server/controllers/AssetsController.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import * as path from 'path';
22
import * as Hapi from 'hapi';
3-
import IController from '../../interfaces/IController';
3+
import IController from '../../interfaces/server/IController';
44

5-
class AssetsController implements IController{
5+
class AssetsController implements IController {
66

77
public mapRoutes(server: Hapi.Server): void {
88
server.route({
99
method: 'GET',
1010
path: '/assets/{file*}',
11-
handler: (request: Hapi.Request, reply: Hapi.ReplyNoContinue) => {
11+
handler: (request: Hapi.Request, reply: Hapi.ReplyNoContinue): void => {
1212
reply.file(path.resolve(__dirname, `../../public${request.path}`));
1313
},
1414
});

src/server/controllers/ReactController.tsx

+5-5
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,10 @@ import * as React from 'react';
55
import RouterWrapper from '../../RouterWrapper';
66
import ProviderService from '../../services/ProviderService';
77
import rootSaga from '../../store/rootSaga';
8-
import ISagaStore from '../../interfaces/ISagaStore';
9-
import IStore from '../../interfaces/IStore';
8+
import ISagaStore from '../../interfaces/store/ISagaStore';
9+
import IStore from '../../interfaces/store/IStore';
1010
import * as Hapi from 'hapi';
11-
import IController from '../../interfaces/IController';
11+
import IController from '../../interfaces/server/IController';
1212

1313
class ReactController implements IController {
1414

@@ -39,8 +39,8 @@ class ReactController implements IController {
3939
};
4040

4141
let html: string = await fse.readFile(path.resolve(__dirname, '../../public/index.html'), 'utf8');
42-
html = html.replace('{title}', state.metaReducer.title);
43-
html = html.replace('{description}', state.metaReducer.description);
42+
html = html.replace('{title}', initialState.metaReducer.title);
43+
html = html.replace('{description}', initialState.metaReducer.description);
4444
html = html.replace('{content}', renderedHtml);
4545
html = html.replace('{state}', JSON.stringify(initialState));
4646

src/server/plugin/HapiWebpackHotPlugin.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ class HapiWebpackHotPlugin {
88

99
constructor(server: Hapi.Server) {
1010
const config: Webpack.Configuration = require('../../../webpack.config.js');
11-
const compiler: any = Webpack(config);
11+
const compiler: Webpack.Compiler = Webpack(config);
1212

1313
compiler.plugin('done', (stats: any) => this._onDone(stats));
1414

@@ -26,7 +26,7 @@ class HapiWebpackHotPlugin {
2626
server.register({
2727
register: HapiWebpackPlugin,
2828
options,
29-
}, (error) => {
29+
}, (error: Error) => {
3030
if (error) {
3131
console.error(error);
3232
}

src/services/ProviderService.ts

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
11
import {createStore, applyMiddleware} from 'redux';
22
import rootReducer from '../store/rootReducer';
33
import {composeWithDevTools} from 'redux-devtools-extension/developmentOnly';
4-
import createSagaMiddleware, {END} from 'redux-saga';
4+
import createSagaMiddleware, {END, SagaMiddleware} from 'redux-saga';
55
import rootSaga from '../store/rootSaga';
6-
import IStore from '../interfaces/IStore';
7-
import ISagaStore from '../interfaces/ISagaStore';
6+
import IStore from '../interfaces/store/IStore';
7+
import ISagaStore from '../interfaces/store/ISagaStore';
88

99
class ProviderService {
1010

11-
static createProviderStore(initialState: any = {}, isServerSide: boolean = false): ISagaStore<IStore> {
12-
const sagaMiddleware = createSagaMiddleware();
11+
public static createProviderStore(initialState: any = {}, isServerSide: boolean = false): ISagaStore<IStore> {
12+
const sagaMiddleware: SagaMiddleware<any> = createSagaMiddleware();
1313

1414
const store = createStore(
1515
rootReducer,

src/store/loading/LoadingAction.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import IAction from '../../interfaces/IAction';
1+
import IAction from '../../interfaces/store/IAction';
22

33
class LoadingAction {
44

src/store/loading/LoadingReducer.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import LoadingAction from './LoadingAction';
2-
import ILoadingReducerState from '../../interfaces/reducers/ILoadingReducerState';
3-
import IAction from '../../interfaces/IAction';
2+
import ILoadingReducerState from '../../interfaces/store/reducers/ILoadingReducerState';
3+
import IAction from '../../interfaces/store/IAction';
44

55
class LoadingReducer {
66

src/store/meta/MetaAction.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import IMetaReducerState from '../../interfaces/reducers/IMetaReducerState';
2-
import IAction from '../../interfaces/IAction';
1+
import IMetaReducerState from '../../interfaces/store/reducers/IMetaReducerState';
2+
import IAction from '../../interfaces/store/IAction';
33

44
class MetaAction {
55

src/store/meta/MetaReducer.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import MetaAction from './MetaAction';
2-
import IMetaReducerState from '../../interfaces/reducers/IMetaReducerState';
3-
import IAction from '../../interfaces/IAction';
2+
import IMetaReducerState from '../../interfaces/store/reducers/IMetaReducerState';
3+
import IAction from '../../interfaces/store/IAction';
44

55
class MetaReducer {
66

@@ -18,7 +18,7 @@ class MetaReducer {
1818
}
1919
}
2020

21-
public static _setMeta(state: IMetaReducerState, action: IAction<IMetaReducerState>): IMetaReducerState {
21+
private static _setMeta(state: IMetaReducerState, action: IAction<IMetaReducerState>): IMetaReducerState {
2222
return {
2323
...state,
2424
...action.payload,

src/store/render/RenderReducer.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import IRenderReducerState from '../../interfaces/reducers/IRenderReducerState';
2-
import IAction from '../../interfaces/IAction';
1+
import IRenderReducerState from '../../interfaces/store/reducers/IRenderReducerState';
2+
import IAction from '../../interfaces/store/IAction';
33

44
class RenderReducer {
55

src/store/rootReducer.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import MetaReducer from './meta/MetaReducer';
55
import {reducer as formReducer} from 'redux-form';
66
import RenderReducer from './render/RenderReducer';
77

8-
const rootReducer = combineReducers({
8+
const rootReducer = combineReducers<any>({
99
form: formReducer,
1010
loadingReducer: LoadingReducer.reduce,
1111
metaReducer: MetaReducer.reduce,

src/store/rootSaga.ts

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
1-
import {all, fork, takeLatest, select} from 'redux-saga/effects';
1+
import {all, fork, takeLatest, select, ForkEffect} from 'redux-saga/effects';
22
import UserSaga from './user/UserSaga';
33
import UserAction from './user/UserAction';
4+
import IStore from '../interfaces/store/IStore';
45

56
export default function* rootSaga() {
6-
const store = yield select();
7+
const store: IStore = yield select();
78
const isServerSide = store.renderReducer.isServerSide;
89

9-
const filteredSagas = [
10+
const filteredSagas: ForkEffect[] = [
1011
isServerSide ? fork(UserSaga.loadUser) : null,
1112
takeLatest(UserAction.LOAD_USER, UserSaga.loadUser),
1213
].filter(Boolean);

src/store/user/UserAction.ts

+6-4
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,12 @@
1+
import IAction from '../../interfaces/store/IAction';
2+
13
class UserAction {
24

3-
static LOAD_USER = 'UserAction.LOAD_USER';
4-
static LOAD_USER_SUCCESS = 'UserAction.LOAD_USER_SUCCESS';
5-
static LOAD_USER_FAIL = 'UserAction.LOAD_USER_FAIL';
5+
public static readonly LOAD_USER = 'UserAction.LOAD_USER';
6+
public static readonly LOAD_USER_SUCCESS = 'UserAction.LOAD_USER_SUCCESS';
7+
public static readonly LOAD_USER_FAIL = 'UserAction.LOAD_USER_FAIL';
68

7-
static loadUser() {
9+
public static loadUser(): IAction<void> {
810
return {
911
type: UserAction.LOAD_USER,
1012
};

src/store/user/UserReducer.ts

+3-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import UserAction from './UserAction';
2-
import IUserReducerState from '../../interfaces/reducers/IUserReducerState';
3-
import IAction from '../../interfaces/IAction';
2+
import IUserReducerState from '../../interfaces/store/reducers/IUserReducerState';
3+
import IAction from '../../interfaces/store/IAction';
44

55
class UserReducer {
66

@@ -33,7 +33,7 @@ class UserReducer {
3333
}
3434
}
3535

36-
public static _loadUser(state: IUserReducerState, action: IAction<IUserReducerState>): IUserReducerState {
36+
private static _loadUser(state: IUserReducerState, action: IAction<IUserReducerState>): IUserReducerState {
3737
return {
3838
...state,
3939
...action.payload,

src/store/user/UserSaga.ts

+8-7
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
11
import {put} from 'redux-saga/effects';
22
import UserAction from './UserAction';
33
import LoadingAction from '../loading/LoadingAction';
4-
import IAction from '../../interfaces/IAction';
4+
import IAction from '../../interfaces/store/IAction';
5+
import IUserReducerState from '../../interfaces/store/reducers/IUserReducerState';
56

67
class UserSaga {
78

8-
static* loadUser(action: IAction<void> = null) {
9+
public static* loadUser(action: IAction<void> = null) {
910
yield put({
1011
type: LoadingAction.SET_LOADING,
1112
payload: true,
1213
});
1314

14-
const response = yield fetch('https://randomuser.me/api/?inc=picture,name,email,phone,id,dob');
15-
const type = (response.status === 200) ? UserAction.LOAD_USER_SUCCESS : UserAction.LOAD_USER_FAIL;
15+
const response: Response = yield fetch('https://randomuser.me/api/?inc=picture,name,email,phone,id,dob');
16+
const type: string = (response.status === 200) ? UserAction.LOAD_USER_SUCCESS : UserAction.LOAD_USER_FAIL;
1617

17-
let data = null;
18+
let data: IUserReducerState = null;
1819

1920
if (response.status === 200) {
2021
const json = yield response.json();
@@ -25,8 +26,8 @@ class UserSaga {
2526
yield put({
2627
type,
2728
payload: data,
28-
meta: null,
29-
error: response.error,
29+
meta: response,
30+
error: response.statusText,
3031
});
3132

3233
yield put({

src/views/About.tsx

+5-6
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
import * as React from 'react';
22
import {connect} from 'react-redux';
33
import MetaAction from '../store/meta/MetaAction';
4-
import IStore from '../interfaces/IStore';
4+
import IStore from '../interfaces/store/IStore';
55
import {Dispatch} from 'redux';
6-
import IMetaReducerState from '../interfaces/reducers/IMetaReducerState';
6+
import IMetaReducerState from '../interfaces/store/reducers/IMetaReducerState';
77

8-
interface IStateToProps {
9-
}
8+
interface IStateToProps {}
109

1110
interface IDispatchToProps {
1211
setMeta: (meta: IMetaReducerState) => void;
@@ -18,7 +17,7 @@ const mapDispatchToProps = (dispatch: Dispatch<any>) => ({
1817
setMeta: (meta: IMetaReducerState) => dispatch(MetaAction.setMeta(meta)),
1918
});
2019

21-
class About extends React.Component<IStateToProps & IDispatchToProps, any> {
20+
class About extends React.Component<IStateToProps & IDispatchToProps, {}> {
2221

2322
componentWillMount(): void {
2423
this.props.setMeta({title: 'About Page'});
@@ -67,5 +66,5 @@ class About extends React.Component<IStateToProps & IDispatchToProps, any> {
6766

6867
}
6968

70-
export default connect<IStateToProps, IDispatchToProps, any>(mapStateToProps, mapDispatchToProps)(About);
69+
export default connect<IStateToProps, IDispatchToProps, {}>(mapStateToProps, mapDispatchToProps)(About);
7170

0 commit comments

Comments
 (0)