404: Needle ({path}) not found in Haystack :(
You can redirect to
home.
@@ -8,7 +9,7 @@ const NotFound = ({ path }) => (
);
NotFound.propTypes = {
- path: RPT.string.isRequired
+ path: RPT.string.isRequired,
};
export default NotFound;
diff --git a/src/server/frontend/index.js b/src/server/frontend/index.js
index 55afa6f..31dac6b 100644
--- a/src/server/frontend/index.js
+++ b/src/server/frontend/index.js
@@ -1,4 +1,6 @@
+// @flow
import express from 'express';
+import type { Express, $Request, $Response } from 'express';
import path from 'path';
import PrettyError from 'pretty-error';
import React from 'react';
@@ -7,12 +9,12 @@ import NotFound from './errors/NotFound.react';
import App from '../../browser/App.react';
import render from './render';
-const app = express();
+const app: Express = express();
const prettyError = new PrettyError();
app.use('/assets', express.static(path.join(__dirname, '..', '..', '..', 'dist', 'public', 'assets')));
-app.get('*', (req, res, next) => {
+app.get('*', (req: $Request, res: $Response, next: Function) => {
try {
if (req.path === '/unknown') {
return res.status(404).send(render(
));
@@ -24,7 +26,7 @@ app.get('*', (req, res, next) => {
});
// Internal server error handled by nice formatted HTML
-app.use((err, req, res, next) => {
+app.use((err: Error, req: $Request, res: $Response, next: Function) => {
console.error('Internal server error at %s', req.path);
console.error(prettyError.render(err));
diff --git a/src/server/frontend/render.js b/src/server/frontend/render.js
index 95231d0..56d362c 100644
--- a/src/server/frontend/render.js
+++ b/src/server/frontend/render.js
@@ -1,10 +1,12 @@
+// @flow
import Helmet from 'react-helmet';
import React from 'react';
import ReactDOMServer from 'react-dom/server';
import Html from './Html.react';
import ServerProvider from './ServerProvider.react';
+import type { Options } from './Html.react';
-export default function render(app, options = {}) {
+export default function render(app : Object, options : Options = {}) {
const appHtml = ReactDOMServer.renderToString(
{app});
const { javascript: javascripts } = webpackIsomorphicTools.assets();
diff --git a/src/server/index.js b/src/server/index.js
index e11ed30..5f30d60 100644
--- a/src/server/index.js
+++ b/src/server/index.js
@@ -1,12 +1,35 @@
+// @flow
+import type { $Request, $Response } from 'express';
+
// Bootstrap environment
require('../../env');
// Enabling Source maps for node
require('source-map-support/register');
-require('babel-register');// eslint-disable-line import/no-extraneous-dependencies
+require('babel-register'); // eslint-disable-line import/no-extraneous-dependencies
+
+type Watcher = {
+ watch: Function,
+};
+
+type IsomorphicTools = {
+ refresh: Function,
+ assets: Function,
+};
+
+type Config = {
+ output: {
+ publicPath: string,
+ },
+};
+
+type Timer = {
+ start: () => void,
+ get: () => number
+}
// Start timer
-const timer = require('../utils/timer');
+const timer : Timer = require('../utils/timer');
timer.start();
@@ -14,13 +37,12 @@ timer.start();
const chalk = require('chalk');
const clearConsole = require('react-dev-utils/clearConsole');
const drawHaystack = require('../utils/drawHaystack');
-const errorHandler = require('./middlewares/errorHandler');
+const errorHandler = require('./middlewares/errorHandler').default;
const express = require('express');
const fs = require('fs');
const path = require('path');
-const isInteractive = process.stdout.isTTY;
-const rootDir = require('path').resolve(__dirname, '..', '..');
+const rootDir: string = require('path').resolve(__dirname, '..', '..');
// HOT RELOAD: preload application so it will be loaded directly after removing cache
// and it will not wait for user interacation :D
@@ -31,140 +53,115 @@ const preloadApplication = () => {
console.log(chalk.green('♥ Application preload finished'));
return true;
} catch (error) {
- console.error(chalk.red('❌ Unable to preload application because of syntax error'));
+ console.error(
+ chalk.red('❌ Unable to preload application because of syntax error'),
+ );
console.log();
console.error(error);
return false;
}
-};
-
-// HOT RELOAD: Reloading code in running node application without need of restart
-// https://medium.com/@kevinsimper/dont-use-nodemon-there-are-better-ways-fc016b50b45e#.gn0pnlbnb
+}; // HOT RELOAD: Reloading code in running node application without need of restart // https://medium.com/@kevinsimper/dont-use-nodemon-there-are-better-ways-fc016b50b45e#.gn0pnlbnb
const watchChanges = () => {
- const watcher = require('chokidar'); // eslint-disable-line import/no-extraneous-dependencies, global-require
- const ignoreRegexp = /([/\\]\.)|(\.json$)/;
- const sourceFilesRegexp = new RegExp(path.resolve(__dirname, '..'));
-
- // Chokidar is watching for file changes in src directory and ignoring dotfiles and *.json
- watcher.watch(path.join(__dirname, '..'), { ignored: ignoreRegexp }).on('all', (event, file) => {
- if (event === 'change') {
- if (isInteractive) { clearConsole(); }
- console.log(chalk.red('NODE HOT RELOAD:'), ' Changes detected in ', chalk.yellow(path.relative(rootDir, file)));
- timer.start();
-
- // remember cache size
- const originalCacheSize = Object.keys(require.cache).length;
-
- // remove all files from require cache which are in ./src/ directory
- // this will force next call of require to load files again
- Object.keys(require.cache).forEach((id) => {
- if (sourceFilesRegexp.test(id)) delete require.cache[id];
- });
-
- // enforce node to cache main.js directly after removing cache
- // This speeds up development process - after change node is caching new changed content
- // and user will get faster response
- if (originalCacheSize !== Object.keys(require.cache).length) {
- if (preloadApplication()) {
- console.log(
- `${chalk.green('NODE HOT RELOAD:')} Caching new version finished in ${chalk.green('%dms')} at %s`,
- timer.get(),
- new Date()
- );
+ const watcher: Watcher = require('chokidar'); // eslint-disable-line import/no-extraneous-dependencies, global-require
+ const ignoreRegexp: RegExp = /([\\]\.)|(\.json$)/;
+ const sourceFilesRegexp: RegExp = new RegExp(path.resolve(__dirname, '..')); // Chokidar is watching for file changes in src directory and ignoring dotfiles and *.json
+ watcher
+ .watch(path.join(__dirname, '..'), { ignored: ignoreRegexp })
+ .on('all', (event : string, file: string) => {
+ if (event === 'change') {
+ clearConsole();
+ console.log(
+ chalk.red('NODE HOT RELOAD:'),
+ ' Changes detected in ',
+ chalk.yellow(path.relative(rootDir, file)),
+ );
+ timer.start(); // remember cache size
+ const originalCacheSize: number = Object.keys(require.cache).length; // remove all files from require cache which are in ./src/ directory // this will force next call of require to load files again
+ Object.keys(require.cache).forEach((id : string) => {
+ if (sourceFilesRegexp.test(id)) delete require.cache[id];
+ }); // enforce node to cache main.js directly after removing cache // This speeds up development process - after change node is caching new changed content // and user will get faster response
+ if (originalCacheSize !== Object.keys(require.cache).length) {
+ if (preloadApplication()) {
+ console.log(
+ `${chalk.green('NODE HOT RELOAD:')} Caching new version finished in ${chalk.green('%dms')} at %s`,
+ timer.get(),
+ new Date(),
+ );
+ }
}
}
- }
- });
-};
-
-// Create express app
+ });
+}; // Create express app
const app = express();
-
const webpackMiddleware = require('webpack-dev-middleware');
const webpackHotMiddleware = require('webpack-hot-middleware');
const webpackIsomorphicAssets = require('../../webpack/assets');
const WebpackIsomorphicTools = require('webpack-isomorphic-tools');
const webpack = require('webpack');
-const config = require('../../webpack/webpack.config');
-
-global.webpackIsomorphicTools = new WebpackIsomorphicTools(webpackIsomorphicAssets)
- .server(rootDir, () => console.log('Webpack isomorphic tools started.'));
-
-// Make express to listen on port
-const port = process.env.PORT || 8000;
+const config: Config = require('../../webpack/webpack.config');
+const webpackIsomorphicTools: IsomorphicTools = new WebpackIsomorphicTools(
+ webpackIsomorphicAssets,
+).server(rootDir, () => console.log('Webpack isomorphic tools started.'));
+global.webpackIsomorphicTools = webpackIsomorphicTools; // Make express to listen on port
+const port: string = process.env.PORT || '8000';
if (process.env.NODE_ENV === 'development') {
const options = {
key: fs.readFileSync(path.join(__dirname, '/cert/server.key')),
- cert: fs.readFileSync(path.join(__dirname, '/cert/server.crt'))
+ cert: fs.readFileSync(path.join(__dirname, '/cert/server.crt')),
};
-
const spdy = require('spdy'); // eslint-disable-line global-require
const compiler = webpack(config);
const middleware = webpackMiddleware(compiler, {
publicPath: config.output.publicPath,
contentBase: 'src',
- noInfo: true
- });
-
- // Refresh isomorphic tools on every call which enforce correct checkusum
- app.use((req, res, next) => {
+ noInfo: true,
+ }); // Refresh isomorphic tools on every call which enforce correct checkusum
+ app.use((req: $Request, res: $Response, next: Function) => {
webpackIsomorphicTools.refresh();
next();
});
-
app.use(middleware);
app.use(webpackHotMiddleware(compiler));
-
- spdy
- .createServer(options, app)
- .listen(port, (error) => {
- if (error) {
- console.error(error);
- return process.exit(1);
- }
- watchChanges();
- return undefined;
- });
+ spdy.createServer(options, app).listen(port, (error: Error) : void => {
+ if (error) {
+ console.error(error);
+ return process.exit(1);
+ }
+ watchChanges();
+ return undefined;
+ });
} else {
app.listen(port);
-}
-
-
-// HOT RELOAD: We need to require('./main') in every call to express app
-// When application is required and in cache it will not slow it down
-// But for development it is crucial for reload to perform require on every call.
-app.use((req, res, cb) => {
+} // HOT RELOAD: We need to require('./main') in every call to express app // When application is required and in cache it will not slow it down // But for development it is crucial for reload to perform require on every call.
+app.use((req: $Request, res: $Response, cb: Function) => {
try {
- require('./main')(req, res, cb); // eslint-disable-line global-require
+ require('./main').default(req, res, cb); // eslint-disable-line global-require
} catch (error) {
// This error handling is for developer to see nice formated output
// of node in browser whe it was not able to load code
errorHandler(error, req, res);
}
-});
-
-// This is most simple error handler which will show error,
-// when there is some error in other error handlers
-app.use((err, req, res, next) => { // eslint-disable-line no-unused-vars
+}); // This is most simple error handler which will show error, // when there is some error in other error handlers
+app.use((err: Error, req: $Request, res: $Response) => {
+ // eslint-disable-line no-unused-vars
console.error(chalk.red('Last resort error handler catched'), err.stack);
- res.status(500).send(`
+ res.status(500).send(
+ `
Last resort error handler caught error at path: ${req.path}
- ${err.stack.toString().replace(/\[\d+m/mg, '')}
- `);
-});
-
-// HOT RELOAD: enforce node to cache main.js so first request will be already from cache
+ ${err.stack.toString().replace(/\[\d+m/gm, '')}
+ `,
+ );
+}); // HOT RELOAD: enforce node to cache main.js so first request will be already from cache
if (preloadApplication()) {
if (process.env.NODE_ENV === 'development') {
drawHaystack();
}
-
console.log(
'Server started in %sms at port %s in %s ENV and %s APP ENV',
chalk.green(timer.get()),
chalk.blue(port),
chalk.yellow(process.env.NODE_ENV),
- chalk.red(process.env.APP_ENV)
+ chalk.red(process.env.APP_ENV),
);
}
diff --git a/src/server/main.js b/src/server/main.js
index 6430789..4317648 100644
--- a/src/server/main.js
+++ b/src/server/main.js
@@ -1,13 +1,15 @@
+// @flow
import compression from 'compression';
import cookieParser from 'cookie-parser';
import express from 'express';
+import type { Express } from 'express';
import helmet from 'helmet';
import morgan from 'morgan';
import rollbar from 'rollbar';
import errorHandler from './middlewares/errorHandler';
import frontend from './frontend';
-const app = express();
+const app : Express = express();
// Security
app.disable('x-powered-by');
diff --git a/src/server/middlewares/errorHandler.js b/src/server/middlewares/errorHandler.js
index 78cd0a1..784d951 100644
--- a/src/server/middlewares/errorHandler.js
+++ b/src/server/middlewares/errorHandler.js
@@ -1,8 +1,10 @@
+// @flow
import PrettyError from 'pretty-error';
+import type { $Request, $Response } from 'express';
const prettyError = new PrettyError();
-export default function errorHandler(err, req, res, next) { // eslint-disable-line no-unused-vars
+export default function errorHandler(err: Error, req: $Request, res: $Response, next? :Function) { // eslint-disable-line no-unused-vars
const stackOutput = prettyError.render(err, false, true)
.replace(/\[1m/mg, '
')
.replace(/\[97m/mg, '')
diff --git a/src/utils/timer.js b/src/utils/timer.js
index 4532ef6..6a3c7d7 100644
--- a/src/utils/timer.js
+++ b/src/utils/timer.js
@@ -1,9 +1,10 @@
-let startTime;
+// @flow
+let startTime : Date;
-export function start() {
+export function start(): void {
startTime = new Date();
}
-export function get() {
+export function get(): number {
return new Date() - startTime;
}
diff --git a/yarn.lock b/yarn.lock
index 4f8a85d..b9c3c27 100644
--- a/yarn.lock
+++ b/yarn.lock
@@ -231,6 +231,27 @@ aws4@^1.2.1:
version "1.5.0"
resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.5.0.tgz#0a29ffb79c31c9e712eeb087e8e7a64b4a56d755"
+babel-cli@^6.24.0:
+ version "6.24.0"
+ resolved "https://registry.yarnpkg.com/babel-cli/-/babel-cli-6.24.0.tgz#a05ffd210dca0c288a26d5319c5ac8669a265ad0"
+ dependencies:
+ babel-core "^6.24.0"
+ babel-polyfill "^6.23.0"
+ babel-register "^6.24.0"
+ babel-runtime "^6.22.0"
+ commander "^2.8.1"
+ convert-source-map "^1.1.0"
+ fs-readdir-recursive "^1.0.0"
+ glob "^7.0.0"
+ lodash "^4.2.0"
+ output-file-sync "^1.1.0"
+ path-is-absolute "^1.0.0"
+ slash "^1.0.0"
+ source-map "^0.5.0"
+ v8flags "^2.0.10"
+ optionalDependencies:
+ chokidar "^1.6.1"
+
babel-code-frame@^6.16.0, babel-code-frame@^6.22.0:
version "6.22.0"
resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4"
@@ -239,7 +260,31 @@ babel-code-frame@^6.16.0, babel-code-frame@^6.22.0:
esutils "^2.0.2"
js-tokens "^3.0.0"
-babel-core@^6.0.0, babel-core@^6.22.0:
+babel-core@^6.0.0, babel-core@^6.24.0:
+ version "6.24.0"
+ resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.24.0.tgz#8f36a0a77f5c155aed6f920b844d23ba56742a02"
+ dependencies:
+ babel-code-frame "^6.22.0"
+ babel-generator "^6.24.0"
+ babel-helpers "^6.23.0"
+ babel-messages "^6.23.0"
+ babel-register "^6.24.0"
+ babel-runtime "^6.22.0"
+ babel-template "^6.23.0"
+ babel-traverse "^6.23.1"
+ babel-types "^6.23.0"
+ babylon "^6.11.0"
+ convert-source-map "^1.1.0"
+ debug "^2.1.1"
+ json5 "^0.5.0"
+ lodash "^4.2.0"
+ minimatch "^3.0.2"
+ path-is-absolute "^1.0.0"
+ private "^0.1.6"
+ slash "^1.0.0"
+ source-map "^0.5.0"
+
+babel-core@^6.22.0:
version "6.22.1"
resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.22.1.tgz#9c5fd658ba1772d28d721f6d25d968fc7ae21648"
dependencies:
@@ -273,7 +318,20 @@ babel-eslint@^7.1.1:
babylon "^6.13.0"
lodash.pickby "^4.6.0"
-babel-generator@^6.18.0, babel-generator@^6.22.0:
+babel-generator@^6.18.0, babel-generator@^6.24.0:
+ version "6.24.0"
+ resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.24.0.tgz#eba270a8cc4ce6e09a61be43465d7c62c1f87c56"
+ dependencies:
+ babel-messages "^6.23.0"
+ babel-runtime "^6.22.0"
+ babel-types "^6.23.0"
+ detect-indent "^4.0.0"
+ jsesc "^1.3.0"
+ lodash "^4.2.0"
+ source-map "^0.5.0"
+ trim-right "^1.0.1"
+
+babel-generator@^6.22.0:
version "6.22.0"
resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.22.0.tgz#d642bf4961911a8adc7c692b0c9297f325cda805"
dependencies:
@@ -412,6 +470,13 @@ babel-helpers@^6.22.0:
babel-runtime "^6.22.0"
babel-template "^6.22.0"
+babel-helpers@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.23.0.tgz#4f8f2e092d0b6a8808a4bde79c27f1e2ecf0d992"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-template "^6.23.0"
+
babel-jest@^18.0.0:
version "18.0.0"
resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-18.0.0.tgz#17ebba8cb3285c906d859e8707e4e79795fb65e3"
@@ -435,6 +500,12 @@ babel-messages@^6.22.0:
dependencies:
babel-runtime "^6.22.0"
+babel-messages@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.23.0.tgz#f3cdf4703858035b2a2951c6ec5edf6c62f2630e"
+ dependencies:
+ babel-runtime "^6.22.0"
+
babel-plugin-add-module-exports@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/babel-plugin-add-module-exports/-/babel-plugin-add-module-exports-0.2.1.tgz#9ae9a1f4a8dc67f0cdec4f4aeda1e43a5ff65e25"
@@ -825,6 +896,14 @@ babel-polyfill@^6.20.0:
core-js "^2.4.0"
regenerator-runtime "^0.10.0"
+babel-polyfill@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-polyfill/-/babel-polyfill-6.23.0.tgz#8364ca62df8eafb830499f699177466c3b03499d"
+ dependencies:
+ babel-runtime "^6.22.0"
+ core-js "^2.4.0"
+ regenerator-runtime "^0.10.0"
+
babel-preset-es2015-node6@^0.4.0:
version "0.4.0"
resolved "https://registry.yarnpkg.com/babel-preset-es2015-node6/-/babel-preset-es2015-node6-0.4.0.tgz#f8893f81b6533747924c657348867bd63b4f9dc2"
@@ -863,6 +942,12 @@ babel-preset-es2015@^6.18.0:
babel-plugin-transform-es2015-unicode-regex "^6.22.0"
babel-plugin-transform-regenerator "^6.22.0"
+babel-preset-flow@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-preset-flow/-/babel-preset-flow-6.23.0.tgz#e71218887085ae9a24b5be4169affb599816c49d"
+ dependencies:
+ babel-plugin-transform-flow-strip-types "^6.22.0"
+
babel-preset-jest@^18.0.0:
version "18.0.0"
resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-18.0.0.tgz#84faf8ca3ec65aba7d5e3f59bbaed935ab24049e"
@@ -908,7 +993,7 @@ babel-preset-stage-3@^6.22.0:
babel-plugin-transform-exponentiation-operator "^6.22.0"
babel-plugin-transform-object-rest-spread "^6.22.0"
-babel-register@^6.18.0, babel-register@^6.22.0:
+babel-register@^6.18.0:
version "6.22.0"
resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.22.0.tgz#a61dd83975f9ca4a9e7d6eff3059494cd5ea4c63"
dependencies:
@@ -920,6 +1005,18 @@ babel-register@^6.18.0, babel-register@^6.22.0:
mkdirp "^0.5.1"
source-map-support "^0.4.2"
+babel-register@^6.22.0, babel-register@^6.24.0:
+ version "6.24.0"
+ resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.24.0.tgz#5e89f8463ba9970356d02eb07dabe3308b080cfd"
+ dependencies:
+ babel-core "^6.24.0"
+ babel-runtime "^6.22.0"
+ core-js "^2.4.0"
+ home-or-tmp "^2.0.0"
+ lodash "^4.2.0"
+ mkdirp "^0.5.1"
+ source-map-support "^0.4.2"
+
babel-runtime@^6.18.0, babel-runtime@^6.2.0, babel-runtime@^6.22.0, babel-runtime@^6.6.1:
version "6.22.0"
resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.22.0.tgz#1cf8b4ac67c77a4ddb0db2ae1f74de52ac4ca611"
@@ -927,7 +1024,17 @@ babel-runtime@^6.18.0, babel-runtime@^6.2.0, babel-runtime@^6.22.0, babel-runtim
core-js "^2.4.0"
regenerator-runtime "^0.10.0"
-babel-template@^6.16.0, babel-template@^6.22.0, babel-template@^6.3.0:
+babel-template@^6.16.0, babel-template@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.23.0.tgz#04d4f270adbb3aa704a8143ae26faa529238e638"
+ dependencies:
+ babel-runtime "^6.22.0"
+ babel-traverse "^6.23.0"
+ babel-types "^6.23.0"
+ babylon "^6.11.0"
+ lodash "^4.2.0"
+
+babel-template@^6.22.0, babel-template@^6.3.0:
version "6.22.0"
resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.22.0.tgz#403d110905a4626b317a2a1fcb8f3b73204b2edb"
dependencies:
@@ -937,7 +1044,7 @@ babel-template@^6.16.0, babel-template@^6.22.0, babel-template@^6.3.0:
babylon "^6.11.0"
lodash "^4.2.0"
-babel-traverse@^6.15.0, babel-traverse@^6.18.0, babel-traverse@^6.22.0, babel-traverse@^6.22.1:
+babel-traverse@^6.15.0, babel-traverse@^6.22.0, babel-traverse@^6.22.1:
version "6.22.1"
resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.22.1.tgz#3b95cd6b7427d6f1f757704908f2fc9748a5f59f"
dependencies:
@@ -951,7 +1058,21 @@ babel-traverse@^6.15.0, babel-traverse@^6.18.0, babel-traverse@^6.22.0, babel-tr
invariant "^2.2.0"
lodash "^4.2.0"
-babel-types@^6.15.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.22.0:
+babel-traverse@^6.18.0, babel-traverse@^6.23.0, babel-traverse@^6.23.1:
+ version "6.23.1"
+ resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.23.1.tgz#d3cb59010ecd06a97d81310065f966b699e14f48"
+ dependencies:
+ babel-code-frame "^6.22.0"
+ babel-messages "^6.23.0"
+ babel-runtime "^6.22.0"
+ babel-types "^6.23.0"
+ babylon "^6.15.0"
+ debug "^2.2.0"
+ globals "^9.0.0"
+ invariant "^2.2.0"
+ lodash "^4.2.0"
+
+babel-types@^6.15.0, babel-types@^6.22.0:
version "6.22.0"
resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.22.0.tgz#2a447e8d0ea25d2512409e4175479fd78cc8b1db"
dependencies:
@@ -960,6 +1081,15 @@ babel-types@^6.15.0, babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.22
lodash "^4.2.0"
to-fast-properties "^1.0.1"
+babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.23.0:
+ version "6.23.0"
+ resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.23.0.tgz#bb17179d7538bad38cd0c9e115d340f77e7e9acf"
+ dependencies:
+ babel-runtime "^6.22.0"
+ esutils "^2.0.2"
+ lodash "^4.2.0"
+ to-fast-properties "^1.0.1"
+
babylon@^6.11.0, babylon@^6.13.0, babylon@^6.15.0:
version "6.15.0"
resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.15.0.tgz#ba65cfa1a80e1759b0e89fb562e27dccae70348e"
@@ -1306,7 +1436,7 @@ combined-stream@^1.0.5, combined-stream@~1.0.5:
dependencies:
delayed-stream "~1.0.0"
-commander@2.9.x, commander@^2.9.0:
+commander@2.9.x, commander@^2.8.1, commander@^2.9.0:
version "2.9.0"
resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4"
dependencies:
@@ -2212,6 +2342,10 @@ flat-cache@^1.2.1:
graceful-fs "^4.1.2"
write "^0.2.1"
+flow-bin@^0.42.0:
+ version "0.42.0"
+ resolved "https://registry.yarnpkg.com/flow-bin/-/flow-bin-0.42.0.tgz#05dd754b6b052de7b150f9210e2160746961e3cf"
+
for-in@^0.1.5:
version "0.1.6"
resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.6.tgz#c9f96e89bfad18a545af5ec3ed352a1d9e5b4dc8"
@@ -2260,6 +2394,10 @@ fs-extra@^0.30.0:
path-is-absolute "^1.0.0"
rimraf "^2.2.8"
+fs-readdir-recursive@^1.0.0:
+ version "1.0.0"
+ resolved "https://registry.yarnpkg.com/fs-readdir-recursive/-/fs-readdir-recursive-1.0.0.tgz#8cd1745c8b4f8a29c8caec392476921ba195f560"
+
fs.realpath@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f"
@@ -2373,7 +2511,7 @@ globby@^5.0.0:
pify "^2.0.0"
pinkie-promise "^2.0.0"
-graceful-fs@^4.1.2, graceful-fs@^4.1.6, graceful-fs@^4.1.9:
+graceful-fs@^4.1.2, graceful-fs@^4.1.4, graceful-fs@^4.1.6, graceful-fs@^4.1.9:
version "4.1.11"
resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658"
@@ -3844,6 +3982,14 @@ os-tmpdir@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274"
+output-file-sync@^1.1.0:
+ version "1.1.2"
+ resolved "https://registry.yarnpkg.com/output-file-sync/-/output-file-sync-1.1.2.tgz#d0a33eefe61a205facb90092e826598d5245ce76"
+ dependencies:
+ graceful-fs "^4.1.4"
+ mkdirp "^0.5.1"
+ object-assign "^4.1.0"
+
pako@~0.2.0:
version "0.2.9"
resolved "https://registry.yarnpkg.com/pako/-/pako-0.2.9.tgz#f3f7522f4ef782348da8161bad9ecfd51bf83a75"
@@ -4797,6 +4943,10 @@ traverse-chain@~0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/traverse-chain/-/traverse-chain-0.1.0.tgz#61dbc2d53b69ff6091a12a168fd7d433107e40f1"
+trim-right@^1.0.1:
+ version "1.0.1"
+ resolved "https://registry.yarnpkg.com/trim-right/-/trim-right-1.0.1.tgz#cb2e1203067e0c8de1f614094b9fe45704ea6003"
+
tryit@^1.0.1:
version "1.0.3"
resolved "https://registry.yarnpkg.com/tryit/-/tryit-1.0.3.tgz#393be730a9446fd1ead6da59a014308f36c289cb"
@@ -4887,6 +5037,10 @@ url@^0.11.0:
punycode "1.3.2"
querystring "0.2.0"
+user-home@^1.1.1:
+ version "1.1.1"
+ resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190"
+
user-home@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/user-home/-/user-home-2.0.0.tgz#9c70bfd8169bc1dcbf48604e0f04b8b49cde9e9f"
@@ -4923,6 +5077,12 @@ uuid@^3.0.0, uuid@~3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1"
+v8flags@^2.0.10:
+ version "2.0.11"
+ resolved "https://registry.yarnpkg.com/v8flags/-/v8flags-2.0.11.tgz#bca8f30f0d6d60612cc2c00641e6962d42ae6881"
+ dependencies:
+ user-home "^1.1.1"
+
validate-npm-package-license@^3.0.1:
version "3.0.1"
resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc"