소스 검색

server test

Benoit Sida 3 년 전
부모
커밋
5dd981b35b

+ 4
- 1
.babelrc 파일 보기

1
 {
1
 {
2
     "presets": ["env", "react"],
2
     "presets": ["env", "react"],
3
-    "plugins": ["transform-object-rest-spread"]
3
+    "plugins": [
4
+        "transform-object-rest-spread",
5
+        "transform-class-properties"
6
+    ]
4
 }
7
 }

+ 7
- 1
package.json 파일 보기

5
   "main": "index.js",
5
   "main": "index.js",
6
   "scripts": {
6
   "scripts": {
7
     "test": "echo \"Error: no test specified\" && exit 1",
7
     "test": "echo \"Error: no test specified\" && exit 1",
8
-    "start": "webpack-dev-server --progress --colors --hot --config ./webpack.config.js"
8
+    "dev": "node_modules/.bin/webpack-dev-server --progress --colors --hot --config ./webpack.config.js",
9
+    "server": "NODE_ENV=production node_modules/babel-cli/bin/babel-node.js --presets env server.js",
10
+    "build": "node_modules/.bin/webpack",
11
+    "start": "npm run build && npm run server"
9
   },
12
   },
10
   "repository": {
13
   "repository": {
11
     "type": "git",
14
     "type": "git",
16
   "devDependencies": {
19
   "devDependencies": {
17
     "babel-core": "^6.24.1",
20
     "babel-core": "^6.24.1",
18
     "babel-loader": "^7.0.0",
21
     "babel-loader": "^7.0.0",
22
+    "babel-plugin-transform-class-properties": "^6.24.1",
19
     "babel-plugin-transform-object-rest-spread": "^6.23.0",
23
     "babel-plugin-transform-object-rest-spread": "^6.23.0",
20
     "babel-preset-env": "^1.4.0",
24
     "babel-preset-env": "^1.4.0",
21
     "babel-preset-react": "^6.24.1",
25
     "babel-preset-react": "^6.24.1",
32
   },
36
   },
33
   "dependencies": {
37
   "dependencies": {
34
     "@blueprintjs/core": "^1.16.0",
38
     "@blueprintjs/core": "^1.16.0",
39
+    "babel-cli": "^6.24.1",
35
     "classnames": "^2.2.5",
40
     "classnames": "^2.2.5",
41
+    "express": "^4.15.2",
36
     "font-awesome": "^4.7.0",
42
     "font-awesome": "^4.7.0",
37
     "react": "^15.5.4",
43
     "react": "^15.5.4",
38
     "react-addons-css-transition-group": "^15.5.2",
44
     "react-addons-css-transition-group": "^15.5.2",

+ 22
- 0
server.js 파일 보기

1
+import path from 'path';
2
+import Express from 'express';
3
+
4
+// initialize the server and configure support for ejs templates
5
+const app = new Express();
6
+app.set('views', path.join(__dirname, 'views'));
7
+
8
+// define the folder that will be used for static assets
9
+app.use(Express.static(path.join(__dirname, 'dist')));
10
+
11
+// universal routing and rendering
12
+app.get('/user', () => console.log('api call'));
13
+
14
+// start the server
15
+const port = process.env.PORT || 3000;
16
+const env = process.env.NODE_ENV || 'production';
17
+app.listen(port, err => {
18
+  if (err) {
19
+    return console.error(err);
20
+  }
21
+  console.info(`Server running on http://localhost:${port} [${env}]`);
22
+});

+ 2
- 1
src/App.jsx 파일 보기

5
 import Topbar from './Header/Topbar'
5
 import Topbar from './Header/Topbar'
6
 import Routes from './Routes'
6
 import Routes from './Routes'
7
 import { LOGIN } from './Store/Actions'
7
 import { LOGIN } from './Store/Actions'
8
+import Login from './Pages/Login/Login'
8
 import './assets'
9
 import './assets'
9
 
10
 
10
 const USER = {
11
 const USER = {
17
 
18
 
18
 const App = ({ user, login }) => {
19
 const App = ({ user, login }) => {
19
     if (!user)
20
     if (!user)
20
-        return <a onClick={() => login(USER)}>login</a>
21
+        return <Login login={() => login(USER)} />
21
     return (
22
     return (
22
         <Router>
23
         <Router>
23
             <div className="flex-frame">
24
             <div className="flex-frame">

+ 6
- 0
src/App.scss 파일 보기

6
     min-height: 100vh;
6
     min-height: 100vh;
7
     background: $pt-app-background-color;
7
     background: $pt-app-background-color;
8
 
8
 
9
+    
10
+
9
     main {
11
     main {
10
         flex: 1;
12
         flex: 1;
11
         padding: 50px;
13
         padding: 50px;
18
             justify-content: center;
20
             justify-content: center;
19
         }
21
         }
20
     }
22
     }
23
+}
24
+
25
+.title {
26
+    font-family: 'Cinzel';
21
 }
27
 }

+ 1
- 6
src/Header/UserMenu.jsx 파일 보기

1
 import React from 'react'
1
 import React from 'react'
2
 import classNames from 'classnames'
2
 import classNames from 'classnames'
3
-import { Link } from 'react-router-dom'
4
 import { Menu, MenuItem, MenuDivider } from "@blueprintjs/core"
3
 import { Menu, MenuItem, MenuDivider } from "@blueprintjs/core"
5
-
6
-const MenuLink = ({ to, iconName, children, ...otherProps }) => {
7
-    let classes = classNames(["pt-menu-item","pt-popover-dismiss", {[`pt-icon-${iconName}`]: iconName}]);
8
-    return <li><Link to={to} className={classes} {...otherProps}>{children}</Link></li>
9
-}
4
+import { MenuLink } from '../Shared/Components'
10
 
5
 
11
 const userMenu = ({ logout }) => 
6
 const userMenu = ({ logout }) => 
12
     <Menu>
7
     <Menu>

BIN
src/Pages/Login/Cinzel.woff2 파일 보기


+ 50
- 0
src/Pages/Login/Login.jsx 파일 보기

1
+import React from 'react'
2
+import { connect } from 'react-redux'
3
+import { Card } from '../../Shared/Components'
4
+import { InputGroup, Tooltip, Button, Classes, Intent } from '@blueprintjs/core'
5
+import { LOGIN } from '../../Store/Actions'
6
+import './Login.scss'
7
+
8
+const PasswordToggler = ({show, toggle}) => 
9
+    <Tooltip content={`${show ? "Hide" : "Show"} Password`}>
10
+        <Button className={Classes.MINIMAL} intent={Intent.WARNING}
11
+            iconName={show ? "eye-off" : "eye-open"} onClick={toggle} />
12
+    </Tooltip>
13
+
14
+const Logo = () => <h1 className="logo"><img src="lighthouse.png"/><span>Lighthouse</span></h1>
15
+
16
+const LoginTemplate = ({ togglePassword, showPassword, connect }) =>
17
+    <div className="flex-frame center">
18
+        <Logo />
19
+        <Card>
20
+            <form onSubmit={e => connect('test', e)}>
21
+                <InputGroup name="username" placeholder="Username" leftIconName="user"/>
22
+                <InputGroup name="password" placeholder="Enter your password..." leftIconName="lock" 
23
+                    type={showPassword ? "text" : "password"}
24
+                    rightElement={<PasswordToggler show={showPassword} toggle={togglePassword} />}
25
+                />
26
+                <Button iconName="log-in" type="submit">Login</Button>
27
+            </form>
28
+        </Card>
29
+    </div>
30
+
31
+export default class Login extends React.Component {
32
+    state = { showPassword: false }
33
+
34
+    togglePassword = () => this.setState({ showPassword: !this.state.showPassword })
35
+
36
+    connect(test, e) {
37
+        e.preventDefault();
38
+        let data = new Map(new FormData(e.target));
39
+        console.log(data);
40
+        return false;
41
+    }
42
+
43
+    render() {
44
+        return <LoginTemplate
45
+            showPassword={this.state.showPassword}
46
+            togglePassword={this.togglePassword}
47
+            connect={this.connect}
48
+        />
49
+    }
50
+}

+ 31
- 0
src/Pages/Login/Login.scss 파일 보기

1
+@import '~@blueprintjs/core/dist/variables.scss';
2
+
3
+@font-face {
4
+  font-family: 'Cinzel';
5
+  font-style: normal;
6
+  font-weight: 400;
7
+  src: local('Cinzel Regular'), local('Cinzel-Regular'), url(Cinzel.woff2) format('woff2');
8
+  unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215;
9
+}
10
+
11
+.flex-frame {
12
+    &.center {
13
+        justify-content: center;
14
+        align-items: center;
15
+
16
+        .logo {
17
+            margin-bottom: 50px;
18
+            img { height: 60px; }
19
+            span { font-family: 'Cinzel'; }
20
+        }
21
+
22
+        .pt-card {
23
+            text-align: center;
24
+            .pt-input-group {
25
+                margin-bottom: $pt-grid-size;
26
+            }
27
+        }
28
+
29
+
30
+    }
31
+}

+ 1
- 17
src/Pages/User/UserPic.jsx 파일 보기

1
 import React from 'react'
1
 import React from 'react'
2
-import cl from 'classnames'
3
-
4
-const Card = ({ className, children, interactive }) => {
5
-    let classes = cl(["pt-card", className, {'pt-interactive': interactive}]);
6
-    return <div className={classes}>{children}</div>
7
-}
8
-
9
-const Placeholder = ({ iconName, title, description }) => 
10
-    <div className="pt-non-ideal-state">
11
-        <div className="pt-non-ideal-state-visual pt-non-ideal-state-icon">
12
-            <span className={`pt-icon pt-icon-${iconName}`}></span>
13
-        </div>
14
-        <h4 className="pt-non-ideal-state-title">{title}</h4>
15
-        <div className="pt-non-ideal-state-description">
16
-            {description}
17
-        </div>
18
-    </div>
2
+import { Card, Placeholder } from '../../Shared/Components'
19
 
3
 
20
 const UserPic = () => 
4
 const UserPic = () => 
21
     <Card className="profile-pic" interactive>
5
     <Card className="profile-pic" interactive>

+ 22
- 0
src/Shared/Components.jsx 파일 보기

1
+import React from 'react'
2
+import cl from 'classnames'
3
+import { Link } from 'react-router-dom'
4
+
5
+export const Card = ({ className, children, interactive }) => 
6
+    <div className={cl(["pt-card", className, {'pt-interactive': interactive}])}>{children}</div>
7
+
8
+export const Placeholder = ({ iconName, title, description }) => 
9
+    <div className="pt-non-ideal-state">
10
+        <div className="pt-non-ideal-state-visual pt-non-ideal-state-icon">
11
+            <span className={`pt-icon pt-icon-${iconName}`}></span>
12
+        </div>
13
+        <h4 className="pt-non-ideal-state-title">{title}</h4>
14
+        <div className="pt-non-ideal-state-description">
15
+            {description}
16
+        </div>
17
+    </div>
18
+
19
+const MenuLink = ({ to, iconName, children, ...otherProps }) => {
20
+    let classes = cl(["pt-menu-item","pt-popover-dismiss", {[`pt-icon-${iconName}`]: iconName}]);
21
+    return <li><Link to={to} className={classes} {...otherProps}>{children}</Link></li>
22
+}

+ 2
- 1
src/Store/Actions/index.js 파일 보기

1
 import { LOGIN, LOGOUT } from './user'
1
 import { LOGIN, LOGOUT } from './user'
2
-export { LOGIN, LOGOUT }
2
+import { TOGGLE_SHOW_PASSWORD } from './login'
3
+export { LOGIN, LOGOUT, TOGGLE_SHOW_PASSWORD }

+ 2
- 0
src/Store/Actions/login.js 파일 보기

1
+import { createAction } from 'redux-actions'
2
+export const TOGGLE_SHOW_PASSWORD = createAction('TOGGLE_SHOW_PASSWORD');

+ 3
- 2
src/Store/Reducers/index.js 파일 보기

1
 import { combineReducers } from 'redux'
1
 import { combineReducers } from 'redux'
2
-import { user } from './user'
2
+import user from './user'
3
+import login from './login'
3
 
4
 
4
-const reducers = combineReducers({ user })
5
+const reducers = combineReducers({ user, login })
5
 
6
 
6
 export default reducers
7
 export default reducers

+ 8
- 0
src/Store/Reducers/login.js 파일 보기

1
+import { handleActions } from 'redux-actions'
2
+import { TOGGLE_SHOW_PASSWORD } from '../Actions'
3
+
4
+const login = handleActions({
5
+  [TOGGLE_SHOW_PASSWORD]: (state, action) => ({ showPassword: !state.showPassword }),
6
+}, { showPassword: false });
7
+
8
+export default login

+ 4
- 2
src/Store/Reducers/user.js 파일 보기

1
 import { handleActions } from 'redux-actions'
1
 import { handleActions } from 'redux-actions'
2
 import { LOGIN, LOGOUT } from '../Actions'
2
 import { LOGIN, LOGOUT } from '../Actions'
3
 
3
 
4
-export const user = handleActions({
4
+const user = handleActions({
5
   [LOGIN]: (state, action) => action.payload,
5
   [LOGIN]: (state, action) => action.payload,
6
   [LOGOUT]: (state, action) => null
6
   [LOGOUT]: (state, action) => null
7
-}, null);
7
+}, null);
8
+
9
+export default user;

+ 5
- 4
src/index.js 파일 보기

5
 import reducers from './Store/Reducers'
5
 import reducers from './Store/Reducers'
6
 import App from './App'
6
 import App from './App'
7
 
7
 
8
-const devToolsEnabled = window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
8
+const devToolsEnabled = ENV != 'production' && window.__REDUX_DEVTOOLS_EXTENSION__ && window.__REDUX_DEVTOOLS_EXTENSION__()
9
 
9
 
10
 let store = createStore(reducers, devToolsEnabled)
10
 let store = createStore(reducers, devToolsEnabled)
11
+window.onload = () => ReactDOM.render(<Provider store={store}><App /></Provider>, document.getElementById('root'));
11
 
12
 
12
-ReactDOM.render(<Provider store={store}><App /></Provider>, document.getElementById('root'));
13
-
14
-module.hot.accept();
13
+if (ENV != 'production') {
14
+    module.hot.accept();
15
+}

+ 15
- 5
webpack.config.js 파일 보기

1
+const webpack = require('webpack');
1
 var ExtractTextPlugin = require('extract-text-webpack-plugin')
2
 var ExtractTextPlugin = require('extract-text-webpack-plugin')
2
 
3
 
3
-module.exports = {
4
+const config = {
4
     entry: [
5
     entry: [
5
-        'webpack-dev-server/client?http://localhost:8080',
6
-        'webpack/hot/only-dev-server',
7
         './src/index.js',
6
         './src/index.js',
8
     ],
7
     ],
9
     output: {
8
     output: {
35
         extensions: ['*', '.js', '.jsx']
34
         extensions: ['*', '.js', '.jsx']
36
     },
35
     },
37
     plugins: [
36
     plugins: [
38
-        new ExtractTextPlugin({ filename: 'style.css', allChunks: true })
37
+        new ExtractTextPlugin({ filename: 'style.css', allChunks: true }),
38
+        new webpack.DefinePlugin({
39
+            ENV: "'test'"
40
+        }),
39
     ],
41
     ],
40
     devServer: {
42
     devServer: {
41
         contentBase: './dist',
43
         contentBase: './dist',
42
         hot: true,
44
         hot: true,
43
         historyApiFallback: true
45
         historyApiFallback: true
44
     },
46
     },
45
-}
47
+}
48
+
49
+if (process.env.NODE_ENV !== 'production')
50
+    config.entry.push(
51
+        'webpack-dev-server/client?http://localhost:8080',
52
+        'webpack/hot/only-dev-server'
53
+    );
54
+
55
+module.exports = config

+ 70
- 6
yarn.lock 파일 보기

208
   version "1.6.0"
208
   version "1.6.0"
209
   resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
209
   resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e"
210
 
210
 
211
+babel-cli@^6.24.1:
212
+  version "6.24.1"
213
+  resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.24.1.tgz#207cd705bba61489b2ea41b5312341cf6aca2283"
214
+  dependencies:
215
+    babel-core "^6.24.1"
216
+    babel-polyfill "^6.23.0"
217
+    babel-register "^6.24.1"
218
+    babel-runtime "^6.22.0"
219
+    commander "^2.8.1"
220
+    convert-source-map "^1.1.0"
221
+    fs-readdir-recursive "^1.0.0"
222
+    glob "^7.0.0"
223
+    lodash "^4.2.0"
224
+    output-file-sync "^1.1.0"
225
+    path-is-absolute "^1.0.0"
226
+    slash "^1.0.0"
227
+    source-map "^0.5.0"
228
+    v8flags "^2.0.10"
229
+  optionalDependencies:
230
+    chokidar "^1.6.1"
231
+
211
 babel-code-frame@^6.11.0, babel-code-frame@^6.22.0:
232
 babel-code-frame@^6.11.0, babel-code-frame@^6.22.0:
212
   version "6.22.0"
233
   version "6.22.0"
213
   resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4"
234
   resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4"
386
   version "6.13.0"
407
   version "6.13.0"
387
   resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
408
   resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95"
388
 
409
 
410
+babel-plugin-syntax-class-properties@^6.8.0:
411
+  version "6.13.0"
412
+  resolved "https://registry.yarnpkg.com/babel-plugin-syntax-class-properties/-/babel-plugin-syntax-class-properties-6.13.0.tgz#d7eb23b79a317f8543962c505b827c7d6cac27de"
413
+
389
 babel-plugin-syntax-exponentiation-operator@^6.8.0:
414
 babel-plugin-syntax-exponentiation-operator@^6.8.0:
390
   version "6.13.0"
415
   version "6.13.0"
391
   resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de"
416
   resolved "https://registry.yarnpkg.com/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz#9ee7e8337290da95288201a6a57f4170317830de"
414
     babel-plugin-syntax-async-functions "^6.8.0"
439
     babel-plugin-syntax-async-functions "^6.8.0"
415
     babel-runtime "^6.22.0"
440
     babel-runtime "^6.22.0"
416
 
441
 
442
+babel-plugin-transform-class-properties@^6.24.1:
443
+  version "6.24.1"
444
+  resolved "https://registry.yarnpkg.com/babel-plugin-transform-class-properties/-/babel-plugin-transform-class-properties-6.24.1.tgz#6a79763ea61d33d36f37b611aa9def81a81b46ac"
445
+  dependencies:
446
+    babel-helper-function-name "^6.24.1"
447
+    babel-plugin-syntax-class-properties "^6.8.0"
448
+    babel-runtime "^6.22.0"
449
+    babel-template "^6.24.1"
450
+
417
 babel-plugin-transform-es2015-arrow-functions@^6.22.0:
451
 babel-plugin-transform-es2015-arrow-functions@^6.22.0:
418
   version "6.22.0"
452
   version "6.22.0"
419
   resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221"
453
   resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz#452692cb711d5f79dc7f85e440ce41b9f244d221"
645
     babel-runtime "^6.22.0"
679
     babel-runtime "^6.22.0"
646
     babel-types "^6.24.1"
680
     babel-types "^6.24.1"
647
 
681
 
682
+babel-polyfill@^6.23.0:
683
+  version "6.23.0"
684
+  resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d"
685
+  dependencies:
686
+    babel-runtime "^6.22.0"
687
+    core-js "^2.4.0"
688
+    regenerator-runtime "^0.10.0"
689
+
648
 babel-preset-env@^1.4.0:
690
 babel-preset-env@^1.4.0:
649
   version "1.4.0"
691
   version "1.4.0"
650
   resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.4.0.tgz#c8e02a3bcc7792f23cded68e0355b9d4c28f0f7a"
692
   resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.4.0.tgz#c8e02a3bcc7792f23cded68e0355b9d4c28f0f7a"
967
     strip-ansi "^3.0.0"
1009
     strip-ansi "^3.0.0"
968
     supports-color "^2.0.0"
1010
     supports-color "^2.0.0"
969
 
1011
 
970
-chokidar@^1.4.3, chokidar@^1.6.0:
1012
+chokidar@^1.4.3, chokidar@^1.6.0, chokidar@^1.6.1:
971
   version "1.7.0"
1013
   version "1.7.0"
972
   resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468"
1014
   resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468"
973
   dependencies:
1015
   dependencies:
1090
   dependencies:
1132
   dependencies:
1091
     delayed-stream "~1.0.0"
1133
     delayed-stream "~1.0.0"
1092
 
1134
 
1093
-commander@2.9.x:
1135
+commander@2.9.x, commander@^2.8.1:
1094
   version "2.9.0"
1136
   version "2.9.0"
1095
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4"
1137
   resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4"
1096
   dependencies:
1138
   dependencies:
1345
   version "0.1.4"
1387
   version "0.1.4"
1346
   resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
1388
   resolved "https://registry.yarnpkg.com/date-now/-/date-now-0.1.4.tgz#eaf439fd4d4848ad74e5cc7dbef200672b9e345b"
1347
 
1389
 
1348
-debug@2.6.1:
1390
+debug@2.6.1, debug@^2.1.1:
1349
   version "2.6.1"
1391
   version "2.6.1"
1350
   resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.1.tgz#79855090ba2c4e3115cc7d8769491d58f0491351"
1392
   resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.1.tgz#79855090ba2c4e3115cc7d8769491d58f0491351"
1351
   dependencies:
1393
   dependencies:
1352
     ms "0.7.2"
1394
     ms "0.7.2"
1353
 
1395
 
1354
-debug@2.6.4, debug@^2.1.1, debug@^2.2.0:
1396
+debug@2.6.4, debug@^2.2.0:
1355
   version "2.6.4"
1397
   version "2.6.4"
1356
   resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.4.tgz#7586a9b3c39741c0282ae33445c4e8ac74734fe0"
1398
   resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.4.tgz#7586a9b3c39741c0282ae33445c4e8ac74734fe0"
1357
   dependencies:
1399
   dependencies:
1577
   dependencies:
1619
   dependencies:
1578
     fill-range "^2.1.0"
1620
     fill-range "^2.1.0"
1579
 
1621
 
1580
-express@^4.13.3:
1622
+express@^4.13.3, express@^4.15.2:
1581
   version "4.15.2"
1623
   version "4.15.2"
1582
   resolved "https://registry.yarnpkg.com/express/-/express-4.15.2.tgz#af107fc148504457f2dca9a6f2571d7129b97b35"
1624
   resolved "https://registry.yarnpkg.com/express/-/express-4.15.2.tgz#af107fc148504457f2dca9a6f2571d7129b97b35"
1583
   dependencies:
1625
   dependencies:
1750
   version "0.5.0"
1792
   version "0.5.0"
1751
   resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e"
1793
   resolved "https://registry.yarnpkg.com/fresh/-/fresh-0.5.0.tgz#f474ca5e6a9246d6fd8e0953cfa9b9c805afa78e"
1752
 
1794
 
1795
+fs-readdir-recursive@^1.0.0:
1796
+  version "1.0.0"
1797
+  resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz#8cd1745c8b4f8a29c8caec392476921ba195f560"
1798
+
1753
 fs.realpath@^1.0.0:
1799
 fs.realpath@^1.0.0:
1754
   version "1.0.0"
1800
   version "1.0.0"
1755
   resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
1801
   resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
1851
     lodash "~4.16.4"
1897
     lodash "~4.16.4"
1852
     minimatch "~3.0.2"
1898
     minimatch "~3.0.2"
1853
 
1899
 
1854
-graceful-fs@^4.1.2:
1900
+graceful-fs@^4.1.2, graceful-fs@^4.1.4:
1855
   version "4.1.11"
1901
   version "4.1.11"
1856
   resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
1902
   resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
1857
 
1903
 
2841
     os-homedir "^1.0.0"
2887
     os-homedir "^1.0.0"
2842
     os-tmpdir "^1.0.0"
2888
     os-tmpdir "^1.0.0"
2843
 
2889
 
2890
+output-file-sync@^1.1.0:
2891
+  version "1.1.2"
2892
+  resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76"
2893
+  dependencies:
2894
+    graceful-fs "^4.1.4"
2895
+    mkdirp "^0.5.1"
2896
+    object-assign "^4.1.0"
2897
+
2844
 pako@~0.2.0:
2898
 pako@~0.2.0:
2845
   version "0.2.9"
2899
   version "0.2.9"
2846
   resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75"
2900
   resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75"
4117
     punycode "1.3.2"
4171
     punycode "1.3.2"
4118
     querystring "0.2.0"
4172
     querystring "0.2.0"
4119
 
4173
 
4174
+user-home@^1.1.1:
4175
+  version "1.1.1"
4176
+  resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190"
4177
+
4120
 util-deprecate@~1.0.1:
4178
 util-deprecate@~1.0.1:
4121
   version "1.0.2"
4179
   version "1.0.2"
4122
   resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
4180
   resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
4147
   version "3.0.1"
4205
   version "3.0.1"
4148
   resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1"
4206
   resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1"
4149
 
4207
 
4208
+v8flags@^2.0.10:
4209
+  version "2.1.1"
4210
+  resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.1.1.tgz#aab1a1fa30d45f88dd321148875ac02c0b55e5b4"
4211
+  dependencies:
4212
+    user-home "^1.1.1"
4213
+
4150
 validate-npm-package-license@^3.0.1:
4214
 validate-npm-package-license@^3.0.1:
4151
   version "3.0.1"
4215
   version "3.0.1"
4152
   resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc"
4216
   resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc"