Skip to content

Commit 3868460

Browse files
authored
Merge pull request #1 from bertho-zero/master
Pull request from upstream
2 parents a0dd640 + 185b7ce commit 3868460

13 files changed

Lines changed: 211 additions & 159 deletions

File tree

.babelrc

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,18 @@
77
"plugins": [
88
"transform-runtime",
99
"add-module-exports",
10-
"transform-decorators-legacy"
10+
"transform-decorators-legacy",
11+
[
12+
"flow-runtime",
13+
{
14+
"assert": true,
15+
"annotate": true
16+
}
17+
]
1118
],
1219
"env": {
1320
"development": {
14-
"plugins": [
15-
"typecheck"
16-
]
21+
"plugins": []
1722
}
1823
}
1924
}

README.md

Lines changed: 57 additions & 46 deletions
Large diffs are not rendered by default.

api/api.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@ import * as actions from './actions';
1616
import { mapUrl } from './utils/url.js';
1717
import auth, { socketAuth } from './services/authentication';
1818

19+
process.on('unhandledRejection', error => console.error(error));
20+
1921
const pretty = new PrettyError();
2022
const app = feathers();
2123

package.json

Lines changed: 32 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -99,26 +99,27 @@
9999
},
100100
"dependencies": {
101101
"async": "^2.1.4",
102-
"babel-core": "^6.21.0",
102+
"babel-core": "^6.22.1",
103103
"babel-plugin-add-module-exports": "^0.2.1",
104+
"babel-plugin-flow-runtime": "^0.2.1",
104105
"babel-plugin-transform-decorators-legacy": "^1.3.4",
105-
"babel-plugin-transform-runtime": "^6.15.0",
106-
"babel-polyfill": "^6.20.0",
107-
"babel-preset-es2015": "^6.18.0",
108-
"babel-preset-react": "^6.16.0",
109-
"babel-preset-stage-0": "^6.16.0",
110-
"babel-register": "^6.18.0",
111-
"babel-runtime": "^6.20.0",
106+
"babel-plugin-transform-runtime": "^6.22.0",
107+
"babel-polyfill": "^6.22.0",
108+
"babel-preset-es2015": "^6.22.0",
109+
"babel-preset-react": "^6.22.0",
110+
"babel-preset-stage-0": "^6.22.0",
111+
"babel-register": "^6.22.0",
112+
"babel-runtime": "^6.22.0",
112113
"body-parser": "^1.16.0",
113114
"compression": "^1.6.2",
114115
"cookie-parser": "^1.4.3",
115-
"express": "^4.14.0",
116-
"express-session": "^1.14.2",
116+
"express": "^4.14.1",
117+
"express-session": "^1.15.0",
117118
"feathers": "^2.0.3",
118119
"feathers-authentication": "^1.0.2",
119-
"feathers-authentication-client": "git+https://github.com/bertho-zero/feathers-authentication-client.git#patch-3",
120+
"feathers-authentication-client": "^0.1.7",
120121
"feathers-authentication-jwt": "^0.3.1",
121-
"feathers-authentication-local": "^0.3.2",
122+
"feathers-authentication-local": "^0.3.3",
122123
"feathers-authentication-oauth1": "^0.2.3",
123124
"feathers-authentication-oauth2": "^0.2.3",
124125
"feathers-errors": "^2.5.0",
@@ -127,6 +128,7 @@
127128
"feathers-nedb": "^2.6.0",
128129
"feathers-rest": "^1.6.0",
129130
"feathers-socketio": "^1.4.2",
131+
"flow-runtime": "^0.2.1",
130132
"http-proxy": "^1.16.2",
131133
"is-promise": "^2.1.0",
132134
"js-cookie": "^2.1.3",
@@ -135,7 +137,7 @@
135137
"lodash.isplainobject": "^4.0.6",
136138
"lru-memoize": "^1.0.1",
137139
"morgan": "^1.7.0",
138-
"multireducer": "^3.0.3",
140+
"multireducer": "^3.1.0",
139141
"nedb": "^1.8.0",
140142
"passport-facebook-token": "^3.3.0",
141143
"pretty-error": "^2.0.2",
@@ -149,54 +151,53 @@
149151
"react-router-redux": "^4.0.7",
150152
"react-router-scroll": "^0.4.1",
151153
"redux": "^3.6.0",
152-
"redux-auth-wrapper": "^0.9.0",
154+
"redux-auth-wrapper": "^1.0.0",
153155
"redux-connect": "^5.0.0",
154-
"redux-form": "^6.4.3",
155-
"redux-persist": "^4.0.1",
156+
"redux-form": "^6.5.0",
157+
"redux-persist": "^4.1.1",
156158
"serialize-javascript": "^1.3.0",
157159
"serve-favicon": "^2.3.2",
158160
"socket.io": "^1.7.2",
159161
"socket.io-client": "^1.7.2",
160-
"superagent": "^3.3.2"
162+
"superagent": "^3.4.1"
161163
},
162164
"devDependencies": {
163165
"autoprefixer-loader": "^3.2.0",
164166
"babel-eslint": "^7.1.1",
165167
"babel-jest": "^18.0.0",
166168
"babel-loader": "^6.2.10",
167-
"babel-plugin-typecheck": "^3.9.0",
168169
"better-npm-run": "^0.0.14",
169-
"bootstrap-loader": "^2.0.0-beta.19",
170+
"bootstrap-loader": "^2.0.0-beta.20",
170171
"bootstrap-sass": "^3.3.7",
171172
"chai": "^3.5.0",
172173
"clean-webpack-plugin": "^0.1.15",
173174
"concurrently": "^3.1.0",
174175
"css-loader": "^0.26.1",
175-
"eslint": "^3.13.1",
176+
"eslint": "^3.15.0",
176177
"eslint-config-airbnb": "^14.0.0",
177178
"eslint-loader": "^1.6.1",
178179
"eslint-plugin-import": "^2.2.0",
179180
"eslint-plugin-jsx-a11y": "^3.0.2",
180181
"eslint-plugin-react": "^6.9.0",
181-
"extract-text-webpack-plugin": "^2.0.0-beta.4",
182-
"file-loader": "^0.9.0",
182+
"extract-text-webpack-plugin": "2.0.0-beta.5",
183+
"file-loader": "^0.10.0",
183184
"font-awesome": "^4.7.0",
184185
"font-awesome-webpack": "^0.0.4",
185186
"happypack": "^3.0.2",
186-
"html-webpack-plugin": "^2.26.0",
187+
"html-webpack-plugin": "^2.28.0",
187188
"jest": "^18.1.0",
188-
"karma": "^1.4.0",
189+
"karma": "^1.4.1",
189190
"karma-cli": "^1.0.1",
190191
"karma-mocha": "^1.3.0",
191-
"karma-mocha-reporter": "^2.2.1",
192+
"karma-mocha-reporter": "^2.2.2",
192193
"karma-phantomjs-launcher": "^1.0.2",
193194
"karma-sourcemap-loader": "^0.3.7",
194-
"karma-webpack": "^2.0.1",
195+
"karma-webpack": "^2.0.2",
195196
"less": "^2.7.2",
196197
"less-loader": "^2.2.3",
197198
"lighthouse": "^1.4.1",
198199
"mocha": "^3.2.0",
199-
"node-sass": "^4.3.0",
200+
"node-sass": "^4.5.0",
200201
"phantomjs-polyfill": "^0.0.2",
201202
"phantomjs-prebuilt": "^2.1.14",
202203
"piping": "^1.0.0-rc.4",
@@ -212,12 +213,12 @@
212213
"sinon": "^1.17.7",
213214
"strip-loader": "^0.1.2",
214215
"style-loader": "^0.13.1",
215-
"sw-precache-webpack-plugin": "^0.7.2",
216+
"sw-precache-webpack-plugin": "^0.8.0",
216217
"timekeeper": "^1.0.0",
217218
"url-loader": "^0.5.7",
218-
"webpack": "^2.1.0-beta.27",
219-
"webpack-dev-middleware": "^1.9.0",
220-
"webpack-hot-middleware": "^2.15.0",
219+
"webpack": "^2.2.1",
220+
"webpack-dev-middleware": "^1.10.0",
221+
"webpack-hot-middleware": "^2.16.1",
221222
"webpack-isomorphic-tools": "^2.6.6"
222223
},
223224
"engines": {

src/app.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,9 @@ import socketio from 'feathers-socketio/client';
55
import authentication from 'feathers-authentication-client';
66
import io from 'socket.io-client';
77
import superagent from 'superagent';
8-
import localForage from 'localforage';
98
import config from './config';
109

11-
const storage = __SERVER__ ? require('localstorage-memory') : localForage;
10+
const storage = __SERVER__ ? require('localstorage-memory') : require('localforage');
1211

1312
const host = clientUrl => (__SERVER__ ? `http://${config.apiHost}:${config.apiPort}` : clientUrl);
1413

src/helpers/Html.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,11 +14,15 @@ import Helmet from 'react-helmet';
1414
*/
1515
export default class Html extends Component {
1616
static propTypes = {
17-
assets: PropTypes.object.isRequired,
17+
assets: PropTypes.object,
1818
component: PropTypes.node.isRequired,
1919
store: PropTypes.object.isRequired
2020
};
2121

22+
static defaultProps = {
23+
assets: {}
24+
};
25+
2226
render() {
2327
const { assets, component, store } = this.props;
2428
const content = component ? ReactDOM.renderToString(component) : '';

src/progressive.js renamed to src/pwa.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,5 @@ import ReactDOM from 'react-dom/server';
33
import Html from './helpers/Html';
44

55
export default function () {
6-
return `<!doctype html>${ReactDOM.renderToStaticMarkup(<Html assets={{}} />)}`;
6+
return `<!doctype html>${ReactDOM.renderToStaticMarkup(<Html />)}`;
77
}

src/redux/create.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ export default function createStore(history, client, data, persistConfig = null)
3333
}
3434

3535
const finalCreateStore = compose(...enhancers)(_createStore);
36-
const asyncNoopReducers = getMissingReducers(createReducers(), data);
37-
const store = finalCreateStore(combineReducers(createReducers(asyncNoopReducers)), data);
36+
const missingReducers = getMissingReducers(createReducers(), data);
37+
const store = finalCreateStore(combineReducers(createReducers(missingReducers)), data);
3838

3939
store.asyncReducers = {};
4040
store.inject = inject.bind(null, store);

src/routes.js

Lines changed: 14 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -2,61 +2,17 @@ import React from 'react';
22
import { IndexRoute, Route } from 'react-router';
33
import { routerActions } from 'react-router-redux';
44
import { UserAuthWrapper } from 'redux-auth-wrapper';
5-
import async from 'async';
6-
import isPromise from 'is-promise';
7-
import { isLoaded as isAuthLoaded, load as loadAuth } from 'redux/modules/auth';
85
import { App, Home, NotFound } from 'containers';
6+
import getRoutesUtils from 'utils/routes';
97

108
// eslint-disable-next-line import/no-dynamic-require
119
if (typeof System.import === 'undefined') System.import = module => Promise.resolve(require(module));
1210

1311
export default store => {
14-
const injectReducerAndRender = (name, reducerPromise, containerPromise) =>
15-
Promise.all([reducerPromise, containerPromise])
16-
.then(([reducer, container]) => {
17-
store.inject(name, reducer.default || reducer);
18-
return container.default || container;
19-
});
20-
21-
const onEnterChain = (...listOfOnEnters) => (nextState, replace, onEnterCb) => {
22-
let redirected = false;
23-
const wrappedReplace = (...args) => {
24-
replace(...args);
25-
redirected = true;
26-
};
27-
async.eachSeries(listOfOnEnters, (onEnter, callback) => {
28-
if (!redirected) {
29-
const result = onEnter(store, nextState, wrappedReplace);
30-
if (isPromise(result)) return result.then(() => callback(), callback);
31-
}
32-
callback();
33-
}, err => {
34-
if (err) onEnterCb(err);
35-
onEnterCb();
36-
});
37-
};
38-
39-
const loadAuthIfNeeded = () => {
40-
if (!isAuthLoaded(store.getState())) {
41-
return store.dispatch(loadAuth()).catch(() => {});
42-
}
43-
return Promise.resolve();
44-
};
45-
46-
const checkPermissions = chainedPermissions => loadAuthIfNeeded().then(() => chainedPermissions);
47-
48-
const enterPermissions = (...listOfPermissions) => {
49-
const permissions = [loadAuthIfNeeded].concat(listOfPermissions.map(perm => perm.onEnter || perm));
50-
return onEnterChain(...permissions);
51-
};
52-
53-
const permissionsComponent = (...listOfPermissions) => ({
54-
onEnter: enterPermissions(...listOfPermissions),
55-
getComponent: () => checkPermissions(listOfPermissions.reduceRight(
56-
(prev, next) => next(prev),
57-
props => props.children
58-
))
59-
});
12+
const {
13+
injectReducerAndRender,
14+
permissionsComponent
15+
} = getRoutesUtils(store);
6016

6117
/* Permissions */
6218

@@ -84,19 +40,23 @@ export default store => {
8440
<IndexRoute component={Home} />
8541

8642
{/* Routes requiring login */}
87-
<Route {...permissionsComponent(isAuthenticated)}>
43+
{/*
44+
You can also protect a route like this:
45+
<Route path="protected-route" {...permissionsComponent(isAuthenticated)(Component)}>
46+
*/}
47+
<Route {...permissionsComponent(isAuthenticated)()}>
8848
<Route path="loginSuccess" getComponent={() => System.import('./containers/LoginSuccess/LoginSuccess')} />
8949
<Route
9050
path="chatFeathers"
9151
getComponent={() => injectReducerAndRender(
92-
'chat', System.import('./redux/modules/chat'),
52+
{ chat: System.import('./redux/modules/chat') },
9353
System.import('./containers/ChatFeathers/ChatFeathers')
9454
)}
9555
/>
9656
</Route>
9757

9858
{/* Routes disallow login */}
99-
<Route {...permissionsComponent(isNotAuthenticated)}>
59+
<Route {...permissionsComponent(isNotAuthenticated)()}>
10060
<Route path="register" getComponent={() => System.import('./containers/Register/Register')} />
10161
</Route>
10262

@@ -106,14 +66,14 @@ export default store => {
10666
<Route
10767
path="survey"
10868
getComponent={() => injectReducerAndRender(
109-
'survey', System.import('./redux/modules/survey'),
69+
{ survey: System.import('./redux/modules/survey') },
11070
System.import('./containers/Survey/Survey')
11171
)}
11272
/>
11373
<Route
11474
path="widgets"
11575
getComponent={() => injectReducerAndRender(
116-
'widgets', System.import('./redux/modules/widgets'),
76+
{ widgets: System.import('./redux/modules/widgets') },
11777
System.import('./containers/Widgets/Widgets')
11878
)}
11979
/>

src/server.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ import Html from 'helpers/Html';
2020
import getRoutes from 'routes';
2121
import { exposeInitialRequest } from 'app';
2222

23+
process.on('unhandledRejection', error => console.error(error));
24+
2325
const targetUrl = `http://${config.apiHost}:${config.apiPort}`;
2426
const pretty = new PrettyError();
2527
const app = express();

0 commit comments

Comments
 (0)