Skip to content

Commit 5921d23

Browse files
authored
Merge pull request #352 from bertho-zero/react-router-v4
React router v4
2 parents ad4c8d4 + 8b8df15 commit 5921d23

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+646
-604
lines changed

.babelrc

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,15 +7,17 @@
77
"targets": {
88
"browsers": ["last 2 versions", "IE >= 8"],
99
"node": "current"
10-
}
10+
},
11+
"useBuiltIns": "entry"
1112
}
1213
],
1314
"stage-0"
1415
],
1516
"plugins": [
1617
"transform-runtime",
1718
"add-module-exports",
18-
"transform-decorators-legacy"
19+
"transform-decorators-legacy",
20+
"react-loadable/babel"
1921
],
2022
"env": {
2123
"development": {

.eslintrc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
"prefer-promise-reject-errors": "warn",
2222
"prefer-template": "warn",
2323
"react/forbid-prop-types": "warn",
24-
"react/jsx-closing-tag-location": ["warn", "line-aligned"],
24+
"react/jsx-closing-tag-location": "off",
2525
"react/jsx-filename-extension": "off",
2626
"react/jsx-no-target-blank": "warn",
2727
"react/no-multi-comp": ["error", {"ignoreStateless": true}],

.travis.yml

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,26 @@ sudo: required
1818

1919
before_install:
2020
- sudo apt-get -qq update
21+
- curl -o- -L https://yarnpkg.com/install.sh | bash
22+
- export PATH="$HOME/.yarn/bin:$PATH"
23+
24+
install:
25+
- yarn
2126

2227
before_script:
2328
- export DISPLAY=:99.0
2429
- sh -e /etc/init.d/xvfb start
2530
- export NODE_ENV=development
2631

32+
cache:
33+
yarn: true
34+
directories:
35+
- node_modules
36+
2737
script:
28-
- npm run lint
29-
- npm test
30-
- npm run test-node
38+
- yarn lint
39+
- yarn test
40+
- yarn test-node
3141

3242
env:
3343
- TRAVIS=travis CXX=g++-4.8

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ We also spit out the `redux` state into a global `window.__data` variable in the
134134

135135
#### Server-side Data Fetching
136136

137-
The [redux-connect](https://www.npmjs.com/package/redux-connect) package exposes an API to return promises that need to be fulfilled before a route is rendered. It exposes a `<ReduxAsyncConnect />` container, which wraps our render tree on both [server](https://github.com/bertho-zero/react-redux-universal-hot-example/blob/master/src/server.js) and [client](https://github.com/bertho-zero/react-redux-universal-hot-example/blob/master/src/client.js). More documentation is available on the [redux-connect](https://www.npmjs.com/package/redux-connect) page.
137+
The [redial](https://www.npmjs.com/package/redial) package exposes an API to return promises that need to be fulfilled before a route is rendered. It exposes a `<ReduxAsyncConnect />` container, which wraps our render tree on both [server](https://github.com/bertho-zero/react-redux-universal-hot-example/blob/master/src/server.js) and [client](https://github.com/bertho-zero/react-redux-universal-hot-example/blob/master/src/client.js). More documentation is available on the [redial](https://www.npmjs.com/package/redial) page.
138138

139139
#### Client Side
140140

api/api.js

Lines changed: 17 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -6,17 +6,13 @@ import cookieParser from 'cookie-parser';
66
import hooks from 'feathers-hooks';
77
import rest from 'feathers-rest';
88
import socketio from 'feathers-socketio';
9-
import PrettyError from 'pretty-error';
109
import config from './config';
11-
import middleware from './middleware';
1210
import services from './services';
13-
import * as actions from './actions';
14-
import mapUrl from './utils/url.js';
11+
import { actionHandler, logger, notFound, errorHandler } from './middleware';
1512
import auth from './services/authentication';
1613

1714
process.on('unhandledRejection', error => console.error(error));
1815

19-
const pretty = new PrettyError();
2016
const app = feathers();
2117

2218
app
@@ -30,53 +26,27 @@ app
3026
cookie: { maxAge: 60000 }
3127
}))
3228
.use(bodyParser.urlencoded({ extended: true }))
33-
.use(bodyParser.json());
34-
35-
const actionsHandler = async (req, res, next) => {
36-
const splittedUrlPath = req.url
37-
.split('?')[0]
38-
.split('/')
39-
.slice(1);
40-
const { action, params } = mapUrl(actions, splittedUrlPath);
41-
42-
req.app = app;
43-
44-
const catchError = async error => {
45-
console.error('API ERROR:', pretty.render(error));
46-
res.status(error.status || 500).json(error);
47-
};
48-
49-
if (action) {
50-
try {
51-
try {
52-
const result = await action(req, params);
53-
if (result instanceof Function) {
54-
result(res);
55-
} else {
56-
res.json(result);
57-
}
58-
} catch (reason) {
59-
if (reason && reason.redirect) {
60-
return res.redirect(reason.redirect);
61-
}
62-
return catchError(reason);
63-
}
64-
} catch (error) {
65-
return catchError(error);
66-
}
67-
} else {
68-
next();
69-
}
70-
};
71-
72-
app
29+
.use(bodyParser.json())
30+
// Core
7331
.configure(hooks())
7432
.configure(rest())
7533
.configure(socketio({ path: '/ws' }))
7634
.configure(auth)
77-
.use(actionsHandler)
35+
.use(actionHandler(app))
7836
.configure(services)
79-
.configure(middleware);
37+
// Final handlers
38+
.use(notFound())
39+
.use(logger(app))
40+
.use(errorHandler({
41+
json: (error, req, res) => {
42+
res.json(error);
43+
},
44+
html: (error, req, res) => {
45+
res.json(error);
46+
// render your error view with the error object
47+
// res.render('error', error); // set view engine of express if you want to use res.render
48+
}
49+
}));
8050

8151
if (process.env.APIPORT) {
8252
app.listen(process.env.APIPORT, err => {

api/middleware/actionHandler.js

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import PrettyError from 'pretty-error';
2+
import * as actions from 'actions';
3+
import mapUrl from 'utils/url';
4+
5+
const pretty = new PrettyError();
6+
7+
export default function actionHandler(app) {
8+
return async (req, res, next) => {
9+
const splittedUrlPath = req.url
10+
.split('?')[0]
11+
.split('/')
12+
.slice(1);
13+
const { action, params } = mapUrl(actions, splittedUrlPath);
14+
15+
req.app = app;
16+
17+
if (action) {
18+
try {
19+
const result = await action(req, params);
20+
if (result instanceof Function) {
21+
result(res);
22+
} else {
23+
res.json(result);
24+
}
25+
} catch (error) {
26+
if (error && error.redirect) {
27+
return res.redirect(error.redirect);
28+
}
29+
console.error('API ERROR:', pretty.render(error));
30+
res.status(error.status || 500).json(error);
31+
}
32+
} else {
33+
next();
34+
}
35+
};
36+
}

api/middleware/index.js

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,4 @@
1-
import errorHandler from 'feathers-errors/handler';
2-
import notFound from './notFound';
3-
import logger from './logger';
4-
5-
export default function middleware() {
6-
const app = this;
7-
8-
app.use(notFound());
9-
app.use(logger(app));
10-
app.use(errorHandler({
11-
json: (error, req, res) => {
12-
res.json(error);
13-
},
14-
html: (error, req, res) => {
15-
res.json(error);
16-
// render your error view with the error object
17-
// res.render('error', error); // set view engine of express if you want to use res.render
18-
}
19-
}));
20-
}
1+
export actionHandler from './actionHandler';
2+
export errorHandler from 'feathers-errors/handler';
3+
export logger from './logger';
4+
export notFound from './notFound';

api/middleware/notFound.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
const errors = require('feathers-errors');
22

3-
export default function notFoundHandler() {
3+
export default function notFound() {
44
return (req, res, next) => {
55
next(new errors.NotFound('Page not found'));
66
};

package.json

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
{
22
"name": "react-redux-universal-hot-example",
33
"description": "Example of an isomorphic (universal) webapp using react redux and hot reloading",
4-
"author": "Erik Rasmussen <[email protected]> (http://github.com/erikras)",
4+
"author": "Kévin Berthommier <[email protected]> (http://github.com/bertho-zero)",
5+
"contributors": [
6+
"Erik Rasmussen <[email protected]> (http://github.com/erikras)"
7+
],
58
"license": "MIT",
69
"version": "0.9.0",
710
"repository": {
@@ -119,9 +122,10 @@
119122
},
120123
"dependencies": {
121124
"async": "^2.1.4",
122-
"axios": "^0.16.2",
125+
"axios": "^0.17.0",
123126
"babel-core": "^6.26.0",
124127
"babel-plugin-add-module-exports": "^0.2.1",
128+
"babel-plugin-dynamic-import-node": "^1.1.0",
125129
"babel-plugin-transform-decorators-legacy": "^1.3.4",
126130
"babel-plugin-transform-runtime": "^6.23.0",
127131
"babel-polyfill": "^6.26.0",
@@ -149,6 +153,7 @@
149153
"feathers-nedb": "^2.6.0",
150154
"feathers-rest": "^1.7.3",
151155
"feathers-socketio": "^2.0.0",
156+
"history": "^4.7.2",
152157
"http-proxy": "^1.16.2",
153158
"is-promise": "^2.1.0",
154159
"js-cookie": "^2.1.3",
@@ -164,15 +169,19 @@
164169
"react-bootstrap": "^0.31.2",
165170
"react-dom": "^16.0.0",
166171
"react-helmet": "^5.0.3",
172+
"react-loadable": "^5.3.0",
167173
"react-redux": "^5.0.6",
168-
"react-router": "^3.0.2",
169-
"react-router-bootstrap": "^0.23.1",
170-
"react-router-redux": "^4.0.8",
171-
"react-router-scroll": "^0.4.1",
174+
"react-router": "^4.2.0",
175+
"react-router-bootstrap": "^0.24.4",
176+
"react-router-config": "^1.0.0-beta.4",
177+
"react-router-dom": "^4.2.2",
178+
"react-router-redux": "^5.0.0-alpha.6",
179+
"recompose": "^0.26.0",
180+
"redial": "^0.5.0",
172181
"redux": "^3.6.0",
173-
"redux-auth-wrapper": "^1.0.0",
174-
"redux-connect": "^6.0.0",
182+
"redux-auth-wrapper": "^2.0.2",
175183
"redux-form": "^7.1.1",
184+
"redux-logger": "^3.0.6",
176185
"redux-persist": "^4.8.3",
177186
"serialize-javascript": "^1.3.0",
178187
"serve-favicon": "^2.3.2",
@@ -211,7 +220,7 @@
211220
"less": "^3.0.0-alpha.3",
212221
"less-loader": "^4.0.3",
213222
"lighthouse": "^2.4.0",
214-
"lint-staged": "^4.0.3",
223+
"lint-staged": "^5.0.0",
215224
"mocha": "^4.0.1",
216225
"node-sass": "^4.5.0",
217226
"piping": "^1.0.0-rc.4",

server.babel.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
// enable runtime transpilation to use ES6/7 in node
2+
require('babel-polyfill');
23

34
var fs = require('fs');
45

@@ -7,6 +8,9 @@ var config;
78

89
try {
910
config = JSON.parse(babelrc);
11+
if (Array.isArray(config.plugins)) {
12+
config.plugins.push('dynamic-import-node');
13+
}
1014
} catch (err) {
1115
console.error('==> ERROR: Error parsing your .babelrc.');
1216
console.error(err);

0 commit comments

Comments
 (0)