1
0
Fork 0
mirror of https://github.com/terribleplan/next.js.git synced 2024-01-19 02:48:18 +00:00

Merge branch 'master' into v3-beta

This commit is contained in:
Guillermo Rauch 2017-06-01 18:30:57 -07:00
commit 850a931e88
45 changed files with 940 additions and 372 deletions

View file

@ -30,7 +30,16 @@ export default () => {
return
}
const { err } = Router.components[route] || {}
const { err, Component } = Router.components[route] || {}
if (!Component) {
// This only happens when we create a new page without a default export.
// If you removed a default export from a exising viewing page, this has no effect.
console.log(`Hard reloading due to no default component in page: ${route}`)
window.location.reload()
return
}
if (err) {
// reload to recover from runtime errors
Router.reload(route)

View file

@ -19,7 +19,7 @@ export default ({ children, title = 'This is the default title' }) => (
{ children }
<footer>
I`m here to stay
{'I`m here to stay'}
</footer>
</div>
)

View file

@ -3,8 +3,8 @@
"next/babel"
],
"plugins": [
["wrap-in-js", {
"extensions": ["css$"]
["import", {
"libraryName": "antd"
}]
]
}

View file

@ -0,0 +1,29 @@
[![Deploy to now](https://deploy.now.sh/static/button.svg)](https://deploy.now.sh/?repo=https://github.com/zeit/next.js/tree/master/examples/with-ant-design)
# Ant Design example
## How to use
Download the example [or clone the repo](https://github.com/zeit/next.js):
```bash
curl https://codeload.github.com/zeit/next.js/tar.gz/master | tar -xz --strip=2 next.js-master/examples/with-ant-design
cd with-ant-design
```
Install it and run:
```bash
npm install
npm run dev
```
Deploy it to the cloud with [now](https://zeit.co/now) ([download](https://zeit.co/download))
```bash
now
```
## The idea behind the example
This example shows how to use Next.js along with [Ant Design of React](http://ant.design). This is intended to show the integration of this UI toolkit with the Framework.

View file

@ -0,0 +1,18 @@
{
"name": "with-ant-design",
"version": "1.0.0",
"scripts": {
"dev": "next",
"build": "next build",
"start": "next start"
},
"dependencies": {
"antd": "^2.10.2",
"babel-plugin-import": "^1.1.1",
"next": "latest",
"react": "^15.5.4",
"react-dom": "^15.5.4"
},
"author": "",
"license": "ISC"
}

View file

@ -0,0 +1,74 @@
import Head from 'next/head'
import { Form, Select, InputNumber, DatePicker, Switch, Slider, Button, LocaleProvider } from 'antd'
import enUS from 'antd/lib/locale-provider/en_US'
const FormItem = Form.Item
const Option = Select.Option
export default () => (
<LocaleProvider locale={enUS}>
<div style={{ marginTop: 100 }}>
<Head>
<link rel='stylesheet' href='//cdnjs.cloudflare.com/ajax/libs/antd/2.9.3/antd.min.css' />
</Head>
<Form layout='horizontal'>
<FormItem
label='Input Number'
labelCol={{ span: 8 }}
wrapperCol={{ span: 8 }}
>
<InputNumber size='large' min={1} max={10} style={{ width: 100 }} defaultValue={3} name='inputNumber' />
<a href='#'>Link</a>
</FormItem>
<FormItem
label='Switch'
labelCol={{ span: 8 }}
wrapperCol={{ span: 8 }}
>
<Switch defaultChecked name='switch' />
</FormItem>
<FormItem
label='Slider'
labelCol={{ span: 8 }}
wrapperCol={{ span: 8 }}
>
<Slider defaultValue={70} />
</FormItem>
<FormItem
label='Select'
labelCol={{ span: 8 }}
wrapperCol={{ span: 8 }}
>
<Select size='large' defaultValue='lucy' style={{ width: 192 }} name='select'>
<Option value='jack'>jack</Option>
<Option value='lucy'>lucy</Option>
<Option value='disabled' disabled>disabled</Option>
<Option value='yiminghe'>yiminghe</Option>
</Select>
</FormItem>
<FormItem
label='DatePicker'
labelCol={{ span: 8 }}
wrapperCol={{ span: 8 }}
>
<DatePicker name='startDate' />
</FormItem>
<FormItem
style={{ marginTop: 48 }}
wrapperCol={{ span: 8, offset: 8 }}
>
<Button size='large' type='primary' htmlType='submit'>
OK
</Button>
<Button size='large' style={{ marginLeft: 8 }}>
Cancel
</Button>
</FormItem>
</Form>
</div>
</LocaleProvider>
)

View file

@ -0,0 +1,13 @@
{
"presets": [
"next/babel"
],
"plugins": [
[
"import",
{
"libraryName": "antd-mobile"
}
]
]
}

View file

@ -0,0 +1,28 @@
[![Deploy to now](https://deploy.now.sh/static/button.svg)](https://deploy.now.sh/?repo=https://github.com/zeit/next.js/tree/master/examples/with-material-ui)
# Ant Design Mobile example
## How to use
Download the example [or clone the repo](https://github.com/zeit/next.js):
```bash
curl https://codeload.github.com/zeit/next.js/tar.gz/master | tar -xz --strip=2 next.js-master/examples/with-antd-mobile
cd with-antd-mobile
```
Install it and run:
```bash
npm install
npm run dev
```
Deploy it to the cloud with [now](https://zeit.co/now) ([download](https://zeit.co/download))
```bash
now
```
## The idea behind the example
This example features how you use [antd-mobile](https://github.com/ant-design/ant-design-mobile) (Ant Design Mobile FrontEnd Framwork) with Next.js.

View file

@ -0,0 +1,16 @@
import React, { Component } from 'react'
import { LocaleProvider } from 'antd-mobile'
import enUS from 'antd-mobile/lib/locale-provider/en_US'
export default class Layout extends Component {
render () {
const { language, children } = this.props
const locale = language.substr(0, 2) === 'en' ? enUS : undefined
return (
<LocaleProvider locale={locale}>
{children}
</LocaleProvider>
)
}
}

View file

@ -0,0 +1,44 @@
import React, { Component } from 'react'
import Router from 'next/router'
import { TabBar, Icon } from 'antd-mobile'
export default class MenuBar extends Component {
render () {
const {
pathname,
children
} = this.props
return (
<TabBar>
{tabBarData.map(({ title, icon, selectedIcon, link, dot, component: Component }) => (
<TabBar.Item
key={link}
title={title}
icon={<Icon type={icon} />}
selectedIcon={<Icon type={selectedIcon} />}
selected={pathname === link}
onPress={() => Router.push(link)}
>
{children}
</TabBar.Item>
))}
</TabBar>
)
}
}
const tabBarData = [
{
title: 'Home',
icon: 'koubei-o',
selectedIcon: 'koubei',
link: '/home'
},
{
title: 'Trick',
icon: 'check-circle-o',
selectedIcon: 'check-circle',
link: '/trick'
}
]

View file

@ -0,0 +1,54 @@
const path = require('path')
const fs = require('fs')
const requireHacker = require('require-hacker')
function setupRequireHacker () {
requireHacker.resolver((filename, module) => {
if (filename.endsWith('/style/css')) {
return requireHacker.resolve(`${filename}.web.js`, module)
}
})
requireHacker.hook('js', filename => {
if (
filename.endsWith('.web.js') ||
!filename.includes('/node_modules/') ||
['antd-mobile', 'rc-swipeout', 'rmc-picker'].every(p => !filename.includes(p))
) return
const webjs = filename.replace(/\.js$/, '.web.js')
if (!fs.existsSync(webjs)) return
return fs.readFileSync(webjs, { encoding: 'utf8' })
})
requireHacker.hook('css', () => '')
requireHacker.hook('svg', filename => {
return requireHacker.to_javascript_module_source(fs.readFileSync(filename, { encoding: 'utf8' }))
})
}
setupRequireHacker()
function moduleDir (m) {
return path.dirname(require.resolve(`${m}/package.json`))
}
module.exports = {
webpack: (config, { dev }) => {
config.resolve.extensions = ['.web.js', '.js', '.json']
config.module.rules.push(
{
test: /\.(svg)$/i,
loader: 'svg-sprite-loader',
include: [
moduleDir('antd-mobile')
]
}
)
return config
}
}

View file

@ -0,0 +1,16 @@
{
"dependencies": {
"antd-mobile": "^1.1.2",
"babel-plugin-import": "^1.1.1",
"next": "latest",
"react": "^15.5.4",
"react-dom": "^15.5.4",
"require-hacker": "^3.0.0",
"svg-sprite-loader": "~0.3.0"
},
"scripts": {
"dev": "next",
"build": "next build",
"start": "next start"
}
}

View file

@ -0,0 +1,18 @@
import Document, { Head, Main, NextScript } from 'next/document'
export default class extends Document {
render () {
return (
<html>
<Head>
<script src='/static/hd.min.js' />
<link rel='stylesheet' type='text/css' href='//unpkg.com/antd-mobile/dist/antd-mobile.min.css' />
</Head>
<body style={{margin: 0}}>
<Main />
<NextScript />
</body>
</html>
)
}
}

View file

@ -0,0 +1,54 @@
import React, {Component} from 'react'
import {
WhiteSpace, WingBlank,
NavBar, Icon, Pagination, Steps
} from 'antd-mobile'
import Layout from '../components/Layout'
import MenuBar from '../components/MenuBar'
export default class Home extends Component {
static getInitialProps ({ req }) {
const language = req ? req.headers['accept-language'] : navigator.language
return {
language
}
}
render () {
const {
language,
url: { pathname }
} = this.props
return (
<Layout language={language}>
<MenuBar
pathname={pathname}
>
<NavBar
leftContent='back'
mode='light'
onLeftClick={() => console.log('onLeftClick')}
rightContent={[
<Icon key='0' type='search' style={{ marginRight: '0.32rem' }} />,
<Icon key='1' type='ellipsis' />
]}
>
NavBar
</NavBar>
<WhiteSpace />
<Pagination total={5} current={0} />
<WhiteSpace />
<WingBlank>
<Steps current={1}>
<Steps.Step title='Finished' description='Most components has supported' />
<Steps.Step title='In Progress' description='Switch Modal and Menu' />
<Steps.Step title='Waiting' description='1.2.0' />
</Steps>
</WingBlank>
</MenuBar>
</Layout>
)
}
}

View file

@ -0,0 +1,9 @@
import { Component } from 'react'
export default class Index extends Component {
static async getInitialProps ({ res }) {
res.setHeader('Location', '/home')
res.statusCode = 302
res.end()
}
}

View file

@ -0,0 +1,122 @@
import React, { Component } from 'react'
import {
WhiteSpace,
List, Switch, Modal, Button, Menu
} from 'antd-mobile'
import Layout from '../components/Layout'
import MenuBar from '../components/MenuBar'
export default class Trick extends Component {
static getInitialProps ({ req }) {
const language = req ? req.headers['accept-language'] : navigator.language
const userAgent = req ? req.headers['user-agent'] : navigator.userAgent
const android = /android/i.test(userAgent)
const platform = android ? 'android' : 'ios'
return {
language,
platform
}
}
constructor (props) {
super(props)
this.menuData = [
{
label: 'Menu 1',
value: '1',
children: [
{
label: 'Submenu 1-1',
value: '11'
},
{
label: 'Submenu 1-2',
value: '12'
}
]
},
{
label: 'Menu 2',
value: '2',
children: [
{
label: 'Submenu 2-1',
value: '21'
},
{
label: 'Submenu 2-2',
value: '22'
},
{
label: 'Submenu 2-3',
value: '23'
}
]
}
]
this.state = {
switchChecked: true,
modalOpened: false
}
}
render () {
const {
language,
platform,
url: { pathname }
} = this.props
const {
switchChecked,
modalOpened
} = this.state
return (
<Layout language={language}>
<MenuBar
pathname={pathname}
>
<WhiteSpace />
<List renderHeader={() => 'Switch and Modal platform prop is required in SSR mode'}>
<List.Item
extra={
<Switch
platform={platform}
checked={switchChecked}
onChange={val => this.setState({ switchChecked: val })}
/>
}
>
Switch {platform}
</List.Item>
<Button onClick={() => this.setState({ modalOpened: true })}>
Open {platform} modal
</Button>
</List>
<Modal
title='Modal'
platform={platform}
visible={modalOpened}
transparent
closable
footer={[{ text: 'OK', onPress: () => this.setState({ modalOpened: false }) }]}
onClose={() => this.setState({ modalOpened: false })}
>
I am a modal.<br />
Must set platform prop
</Modal>
<List renderHeader={() => 'Menu height prop is required in SSR mode'}>
<Menu
height={500}
data={this.menuData}
/>
</List>
</MenuBar>
</Layout>
)
}
}

View file

@ -0,0 +1,2 @@
!function(e){function t(a){if(i[a])return i[a].exports;var n=i[a]={exports:{},id:a,loaded:!1};return e[a].call(n.exports,n,n.exports,t),n.loaded=!0,n.exports}var i={};return t.m=e,t.c=i,t.p="",t(0)}([function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var i=window;t["default"]=i.flex=function(e,t){var a=e||100,n=t||1,r=i.document,o=navigator.userAgent,d=o.match(/Android[\S\s]+AppleWebkit\/(\d{3})/i),l=o.match(/U3\/((\d+|\.){5,})/i),c=l&&parseInt(l[1].split(".").join(""),10)>=80,p=navigator.appVersion.match(/(iphone|ipad|ipod)/gi),s=i.devicePixelRatio||1;p||d&&d[1]>534||c||(s=1);var u=1/s,m=r.querySelector('meta[name="viewport"]');m||(m=r.createElement("meta"),m.setAttribute("name","viewport"),r.head.appendChild(m)),m.setAttribute("content","width=device-width,user-scalable=no,initial-scale="+u+",maximum-scale="+u+",minimum-scale="+u),r.documentElement.style.fontSize=a/2*s*n+"px"},e.exports=t["default"]}]);
flex(100, 1);

View file

@ -4,6 +4,7 @@
[
"css-modules-transform", {
"extensions": [".css", ".sass"],
"append": [ "postcss-cssnext" ],
"extractCss": "./static/css/bundle.css",
"preprocessCss": "./pre-processor.js"
}

View file

@ -0,0 +1,3 @@
@mixin opacity($opacity)
opacity: $opacity
filter: alpha(opacity=($opacity * 100))

View file

@ -16,6 +16,8 @@
},
"devDependencies": {
"babel-plugin-css-modules-transform": "^1.2.1",
"node-sass": "^4.5.0"
"node-sass": "^4.5.0",
"postcss": "^5.2.16",
"postcss-cssnext": "^2.10.0"
}
}

View file

@ -1,4 +1,7 @@
@import "../global"
.example
@include opacity(0.5)
font-size: 36px
width: 300px
margin: 100px auto
display: flex

View file

@ -10,7 +10,7 @@ if (typeof window !== 'undefined') {
}
export default () => {
css.global('html, body', { padding: '3rem 1rem', margin: 0, background: 'papayawhip', 'min-height': '100%', 'font-family': 'Helvetica, Arial, sans-serif', 'font-size': '24px' })
css.global('html, body', { padding: '3rem 1rem', margin: 0, background: 'papayawhip', minHeight: '100%', fontFamily: 'Helvetica, Arial, sans-serif', fontSize: '24px' })
const basicStyles = {
backgroundColor: 'white',

View file

@ -1,2 +1,2 @@
import { translate } from 'react-i18next'
export default translate(['common'])((props) => (<h1>{props.t('hello')}</h1>))
export default translate(['common'])((props) => (<h1>{props.t('hello')}, {props.t('morning')}</h1>))

View file

@ -4,9 +4,12 @@ import startI18n from '../tools/startI18n'
import { getTranslation } from '../tools/translationHelpers'
import Title from '../components/Title'
// get language from query parameter or url path
const lang = 'id'
export default class Homepage extends Component {
static async getInitialProps () {
const translations = await getTranslation('pt', 'common', 'http://localhost:3000/static/locales/')
const translations = await getTranslation(lang, 'common', 'http://localhost:3000/static/locales/')
return { translations }
}
@ -14,7 +17,7 @@ export default class Homepage extends Component {
constructor (props) {
super(props)
this.i18n = startI18n(props.translations)
this.i18n = startI18n(props.translations, lang)
}
render (props) {

View file

@ -0,0 +1,3 @@
{
"hello": "halo"
}

View file

@ -1,3 +1,4 @@
{
"hello": "e ae tche"
"hello": "e ae tche",
"morning": "manha"
}

View file

@ -1,6 +1,7 @@
import i18n from 'i18next'
const startI18n = file => i18n.init({
const startI18n = (file, lang) => i18n.init({
lng: lang, // active language http://i18next.com/translate/
fallbackLng: 'pt',
resources: file,
ns: ['common'],

View file

@ -29,26 +29,6 @@ now
Scoped CSS is neat and keeps your JS clean. PostCSS is amazing for extended features, such as nesting. CSS Modules keep your class names “local”.
# Known bugs
# Known issues
There's a bug, possibly within `next.js`, making composition between files unuseable. Consider the following:
*`styles.css`*
```css
.paragraph {
composes: font-sans from '../global.css';
}
```
*`global.css`*
```css
.font-sans {
font-family: georgia; /* ;) */
}
```
The following error is thrown:
```
Module build failed: Error: Cannot find module '-!./../node_modules/css-loader/index.js??ref--6-4!./../node_modules/postcss-loader/index.js!../global.css'
```
Composed CSS files are not watched by next.js, and thus, if you change one, nothing will happen. You'll need to edit a JS file or the CSS file you're composing for it to hot reload.

View file

@ -1,3 +1,5 @@
const trash = require('trash')
module.exports = {
webpack: (config) => {
config.module.rules.push(
@ -10,27 +12,21 @@ module.exports = {
name: 'dist/[path][name].[ext]'
}
},
'raw-loader',
'val-loader',
{
loader: 'skeleton-loader',
options: {
procedure: (content) => (
`${content} \n` + ['module.exports = {',
'stylesheet: module.exports.toString(),',
'classNames: exports.locals',
procedure: function (content) {
const fileName = `${this._module.userRequest}.json`
const classNames = JSON.stringify(require(fileName))
trash(fileName)
return ['module.exports = {',
`classNames: ${classNames},`,
`stylesheet: \`${content}\``,
'}'
].join('')
)
}
},
{
loader: 'css-loader',
options: {
modules: true,
minimize: true,
importLoaders: 1,
localIdentName: '[local]-[hash:base64:5]'
}
}
},
'postcss-loader'

View file

@ -10,18 +10,17 @@
"author": "Thomas Lindstrøm <t@hom.as>",
"license": "ISC",
"dependencies": {
"babel-plugin-wrap-in-js": "^1.1.1",
"css-loader": "^0.26.1",
"cssnano": "^3.10.0",
"next": "latest",
"postcss-cssnext": "^2.9.0",
"postcss-loader": "^1.3.0",
"raw-loader": "^0.5.1",
"postcss-modules": "^0.6.4",
"react": "^15.4.2",
"react-dom": "^15.4.2",
"skeleton-loader": "0.0.7",
"val-loader": "^0.5.0"
"skeleton-loader": "^1.1.2",
"trash": "^4.0.1"
},
"devDependencies": {
"now": "^3.1.0"
"now": "^4.10.3"
}
}

View file

@ -0,0 +1,3 @@
.font-color {
color: blue;
}

View file

@ -1,4 +1,4 @@
.paragraph {
composes: font-color from './global.css';
font-size: 20px;
color: red;
}

View file

@ -1,5 +1,9 @@
module.exports = {
plugins: [
require('postcss-cssnext')()
require('postcss-cssnext')(),
require('postcss-modules')({
generateScopedName: '[local]-[hash:base64:5]'
}),
require('cssnano')()
]
}

View file

@ -4,7 +4,6 @@ const isWindows = /^win/.test(process.platform)
export async function compile(fly) {
await fly.parallel(['bin', 'server', 'lib', 'client'])
await fly.start('unrestrict')
}
export async function bin(fly, opts) {
@ -27,14 +26,6 @@ export async function client(fly, opts) {
notify('Compiled client files')
}
export async function unrestrict(fly) {
await fly.source('dist/lib/eval-script.js').babel({
babelrc: false,
plugins: ['babel-plugin-transform-remove-strict-mode']
}).target('dist/lib')
notify('Completed removing strict mode for eval script')
}
export async function copy(fly) {
await fly.source('pages/**/*.js').target('dist/pages')
}

View file

@ -1,6 +1,6 @@
{
"name": "next",
"version": "3.0.0-beta6",
"version": "3.0.0-beta7",
"description": "Minimalistic framework for server-rendered React applications",
"main": "./dist/server/next.js",
"license": "MIT",
@ -82,12 +82,11 @@
"path-match": "1.2.4",
"pkg-up": "2.0.0",
"prop-types": "15.5.10",
"react-hot-loader": "3.0.0-beta.6",
"recursive-copy": "^2.0.6",
"send": "0.15.3",
"react-hot-loader": "3.0.0-beta.7",
"source-map-support": "0.4.15",
"strip-ansi": "3.0.1",
"styled-jsx": "0.5.7",
"styled-jsx": "1.0.2",
"touch": "1.0.0",
"unfetch": "2.1.2",
"url": "0.11.0",

View file

@ -583,6 +583,7 @@ Supported options:
- `dev` (`bool`) whether to launch Next.js in dev mode - default `false`
- `dir` (`string`) where the Next project is located - default `'.'`
- `quiet` (`bool`) Hide error messages containing server information - default `false`
- `conf` (`object`) the same object you would use in `next.config.js` - default `{}`
Then, change your `start` script to `NODE_ENV=production node server.js`.
@ -863,7 +864,7 @@ Then run `now` and enjoy!
Next.js can be deployed to other hosting solutions too. Please have a look at the ['Deployment'](https://github.com/zeit/next.js/wiki/Deployment) section of the wiki.
Note: we recommend putting `.next`, or your custom dist folder (Please have a look at ['Custom Config'](You can set a custom folder in config https://github.com/zeit/next.js#custom-configuration.)), in `.npmignore` or `.gitignore`. Otherwise, use `files` or `now.files` to opt-into a whitelist of files you want to deploy (and obviously exclude `.next` or your custom dist folder)
Note: we recommend putting `.next`, or your custom dist folder (you can set a custom folder in ['Custom Config'](https://github.com/zeit/next.js#custom-configuration)), in `.npmignore` or `.gitignore`. Otherwise, use `files` or `now.files` to opt-into a whitelist of files you want to deploy (and obviously exclude `.next` or your custom dist folder)
## Static HTML export

View file

@ -314,7 +314,7 @@ export default async function createCompiler (dir, { dev = false, quiet = false,
}
if (config.webpack) {
console.log('> Using "webpack" config function defined in next.config.js.')
console.log(`> Using "webpack" config function defined in ${config.configOrigin}.`)
webpackConfig = await config.webpack(webpackConfig, { dev })
}
return webpack(webpackConfig)

View file

@ -8,17 +8,23 @@ const defaultConfig = {
webpackDevMiddleware: null,
poweredByHeader: true,
distDir: '.next',
assetPrefix: ''
assetPrefix: '',
configOrigin: 'default',
useFileSystemPublicRoutes: true
}
export default function getConfig (dir) {
export default function getConfig (dir, customConfig) {
if (!cache.has(dir)) {
cache.set(dir, loadConfig(dir))
cache.set(dir, loadConfig(dir, customConfig))
}
return cache.get(dir)
}
function loadConfig (dir) {
function loadConfig (dir, customConfig) {
if (customConfig && typeof customConfig === 'object') {
customConfig.configOrigin = 'server'
return withDefaults(customConfig)
}
const path = join(dir, 'next.config.js')
let userConfig = {}
@ -27,7 +33,12 @@ function loadConfig (dir) {
if (userHasConfig) {
const userConfigModule = require(path)
userConfig = userConfigModule.default || userConfigModule
userConfig.configOrigin = 'next.config.js'
}
return Object.assign({}, defaultConfig, userConfig)
return withDefaults(userConfig)
}
function withDefaults (config) {
return Object.assign({}, defaultConfig, config)
}

View file

@ -36,8 +36,8 @@ export class Head extends Component {
getChunkPreloadLink (filename) {
const { __NEXT_DATA__ } = this.context._documentProps
let { buildStats, assetPrefix } = __NEXT_DATA__
const hash = buildStats ? buildStats[filename].hash : '-'
let { buildStats, assetPrefix, buildId } = __NEXT_DATA__
const hash = buildStats ? buildStats[filename].hash : buildId
return (
<link
@ -118,8 +118,8 @@ export class NextScript extends Component {
getChunkScript (filename, additionalProps = {}) {
const { __NEXT_DATA__ } = this.context._documentProps
let { buildStats, assetPrefix } = __NEXT_DATA__
const hash = buildStats ? buildStats[filename].hash : '-'
let { buildStats, assetPrefix, buildId } = __NEXT_DATA__
const hash = buildStats ? buildStats[filename].hash : buildId
return (
<script

View file

@ -8,7 +8,7 @@ import clean from './build/clean'
import getConfig from './config'
export default class HotReloader {
constructor (dir, { quiet } = {}) {
constructor (dir, { quiet, conf } = {}) {
this.dir = dir
this.quiet = quiet
this.middlewares = []
@ -22,7 +22,7 @@ export default class HotReloader {
this.prevFailedChunkNames = null
this.prevChunkHashes = null
this.config = getConfig(dir)
this.config = getConfig(dir, conf)
}
async run (req, res) {
@ -148,7 +148,7 @@ export default class HotReloader {
}
if (this.config.webpackDevMiddleware) {
console.log('> Using "webpackDevMiddleware" config function defined in next.config.js.')
console.log(`> Using "webpackDevMiddleware" config function defined in ${this.config.configOrigin}.`)
webpackDevMiddlewareConfig = this.config.webpackDevMiddleware(webpackDevMiddlewareConfig)
}

View file

@ -1,4 +1,4 @@
import { resolve, join } from 'path'
import { resolve, join, sep } from 'path'
import { parse as parseUrl } from 'url'
import { parse as parseQs } from 'querystring'
import fs from 'fs'
@ -24,14 +24,14 @@ const internalPrefixes = [
]
export default class Server {
constructor ({ dir = '.', dev = false, staticMarkup = false, quiet = false } = {}) {
constructor ({ dir = '.', dev = false, staticMarkup = false, quiet = false, conf = null } = {}) {
this.dir = resolve(dir)
this.dev = dev
this.quiet = quiet
this.router = new Router()
this.hotReloader = dev ? new HotReloader(this.dir, { quiet }) : null
this.hotReloader = dev ? new HotReloader(this.dir, { quiet, conf }) : null
this.http = null
this.config = getConfig(this.dir)
this.config = getConfig(this.dir, conf)
this.dist = this.config.distDir
this.buildStats = !dev ? require(join(this.dir, this.dist, 'build-stats.json')) : null
this.buildId = !dev ? this.readBuildId() : '-'
@ -113,24 +113,32 @@ export default class Server {
},
'/_next/:hash/manifest.js': async (req, res, params) => {
if (!this.dev) return this.send404(res)
this.handleBuildHash('manifest.js', params.hash, res)
const p = join(this.dir, `${this.dist}/manifest.js`)
await this.serveStatic(req, res, p)
},
'/_next/:hash/main.js': async (req, res, params) => {
if (!this.dev) return this.send404(res)
this.handleBuildHash('main.js', params.hash, res)
const p = join(this.dir, `${this.dist}/main.js`)
await this.serveStatic(req, res, p)
},
'/_next/:hash/commons.js': async (req, res, params) => {
if (!this.dev) return this.send404(res)
this.handleBuildHash('commons.js', params.hash, res)
const p = join(this.dir, `${this.dist}/commons.js`)
await this.serveStatic(req, res, p)
},
'/_next/:hash/app.js': async (req, res, params) => {
if (this.dev) return this.send404(res)
this.handleBuildHash('app.js', params.hash, res)
const p = join(this.dir, `${this.dist}/app.js`)
await this.serveStatic(req, res, p)
@ -184,9 +192,11 @@ export default class Server {
'/static/:path+': async (req, res, params) => {
const p = join(this.dir, 'static', ...(params.path || []))
await this.serveStatic(req, res, p)
},
}
}
'/:path*': async (req, res, params, parsedUrl) => {
if (this.config.useFileSystemPublicRoutes) {
routes['/:path*'] = async (req, res, params, parsedUrl) => {
const { pathname, query } = parsedUrl
await this.render(req, res, pathname, query)
}
@ -238,7 +248,7 @@ export default class Server {
res.setHeader('X-Powered-By', `Next.js ${pkg.version}`)
}
const html = await this.renderToHTML(req, res, pathname, query)
return sendHTML(req, res, html, req.method)
return sendHTML(req, res, html, req.method, this.renderOpts)
}
async renderToHTML (req, res, pathname, query) {
@ -266,7 +276,7 @@ export default class Server {
async renderError (err, req, res, pathname, query) {
const html = await this.renderErrorToHTML(err, req, res, pathname, query)
return sendHTML(req, res, html, req.method)
return sendHTML(req, res, html, req.method, this.renderOpts)
}
async renderErrorToHTML (err, req, res, pathname, query) {
@ -298,6 +308,10 @@ export default class Server {
}
async serveStatic (req, res, path) {
if (!this.isServeableUrl(path)) {
return this.render404(req, res)
}
try {
return await serveStatic(req, res, path)
} catch (err) {
@ -309,6 +323,19 @@ export default class Server {
}
}
isServeableUrl (path) {
const resolved = resolve(path)
if (
resolved.indexOf(join(this.dir, this.dist) + sep) !== 0 &&
resolved.indexOf(join(this.dir, 'static') + sep) !== 0
) {
// Seems like the user is trying to traverse the filesystem.
return false
}
return true
}
isInternalUrl (req) {
for (const prefix of internalPrefixes) {
if (prefix.test(req.url)) {
@ -348,10 +375,16 @@ export default class Server {
handleBuildHash (filename, hash, res) {
if (this.dev) return
if (hash !== this.buildStats[filename].hash) {
throw new Error(`Invalid Build File Hash(${hash}) for chunk: ${filename}`)
}
res.setHeader('Cache-Control', 'max-age=365000000, immutable')
}
send404 (res) {
res.statusCode = 404
res.end('404 - Not Found')
}
}

View file

@ -16,7 +16,7 @@ import { flushChunks } from '../lib/dynamic'
export async function render (req, res, pathname, query, opts) {
const html = await renderToHTML(req, res, pathname, opts)
sendHTML(req, res, html, req.method)
sendHTML(req, res, html, req.method, opts)
}
export function renderToHTML (req, res, pathname, query, opts) {
@ -25,7 +25,7 @@ export function renderToHTML (req, res, pathname, query, opts) {
export async function renderError (err, req, res, pathname, query, opts) {
const html = await renderErrorToHTML(err, req, res, query, opts)
sendHTML(req, res, html, req.method)
sendHTML(req, res, html, req.method, opts)
}
export function renderErrorToHTML (err, req, res, pathname, query, opts = {}) {
@ -90,15 +90,21 @@ async function doRender (req, res, pathname, query, {
}
const docProps = await loadGetInitialProps(Document, { ...ctx, renderPage })
// While developing, we should not cache any assets.
// So, we use a different buildId for each page load.
// With that we can ensure, we have unique URL for assets per every page load.
// So, it'll prevent issues like this: https://git.io/vHLtb
const devBuildId = Date.now()
if (res.finished) return
if (!Document.prototype || !Document.prototype.isReactComponent) throw new Error('_document.js is not exporting a React element')
const doc = createElement(Document, {
__NEXT_DATA__: {
props,
pathname,
query,
buildId,
buildId: dev ? devBuildId : buildId,
buildStats,
assetPrefix,
nextExport,
@ -160,7 +166,7 @@ export async function renderScriptError (req, res, page, error, customFields, op
`)
}
export function sendHTML (req, res, html, method) {
export function sendHTML (req, res, html, method, { dev }) {
if (res.finished) return
const etag = generateETag(html)
@ -170,6 +176,12 @@ export function sendHTML (req, res, html, method) {
return
}
if (dev) {
// In dev, we should not cache pages for any reason.
// That's why we do this.
res.setHeader('Cache-Control', 'no-store, must-revalidate')
}
res.setHeader('ETag', etag)
res.setHeader('Content-Type', 'text/html')
res.setHeader('Content-Length', Buffer.byteLength(html))

View file

@ -1,5 +1,4 @@
/* global describe, test, expect */
import fetch from 'node-fetch'
export default function (context) {
describe('Misc', () => {
@ -13,14 +12,5 @@ export default function (context) {
const html = await context.app.renderToHTML({}, res, '/finish-response', {})
expect(html).toBeFalsy()
})
test('allow etag header support', async () => {
const url = `http://localhost:${context.appPort}/stateless`
const etag = (await fetch(url)).headers.get('ETag')
const headers = { 'If-None-Match': etag }
const res2 = await fetch(url, { headers })
expect(res2.status).toBe(304)
})
})
}

View file

@ -9,6 +9,7 @@ import {
renderViaHTTP
} from 'next-test-utils'
import webdriver from 'next-webdriver'
import fetch from 'node-fetch'
const appDir = join(__dirname, '../')
let appPort
@ -35,6 +36,15 @@ describe('Production Usage', () => {
const html = await renderViaHTTP(appPort, '/')
expect(html).toMatch(/Hello World/)
})
it('should allow etag header support', async () => {
const url = `http://localhost:${appPort}/`
const etag = (await fetch(url)).headers.get('ETag')
const headers = { 'If-None-Match': etag }
const res2 = await fetch(url, { headers })
expect(res2.status).toBe(304)
})
})
describe('With navigation', () => {

546
yarn.lock
View file

@ -40,8 +40,8 @@ acorn@^3.0.4:
resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a"
acorn@^4.0.3, acorn@^4.0.4:
version "4.0.11"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.11.tgz#edcda3bd937e7556410d42ed5860f67399c794c0"
version "4.0.13"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787"
acorn@^5.0.0, acorn@^5.0.1:
version "5.0.3"
@ -255,8 +255,8 @@ async@^1.4.0:
resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a"
async@^2.0.0, async@^2.1.2, async@^2.1.4:
version "2.4.0"
resolved "https://registry.yarnpkg.com/async/-/async-2.4.0.tgz#4990200f18ea5b837c2cc4f8c031a6985c385611"
version "2.4.1"
resolved "https://registry.yarnpkg.com/async/-/async-2.4.1.tgz#62a56b279c98a11d0987096a01cc3eeb8eb7bbd7"
dependencies:
lodash "^4.14.0"
@ -459,13 +459,21 @@ babel-helpers@^6.23.0, babel-helpers@^6.24.1:
babel-runtime "^6.22.0"
babel-template "^6.24.1"
babel-jest@20.0.1, babel-jest@^20.0.1:
version "20.0.1"
resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-20.0.1.tgz#9cbe9a15bbe3f1ca1b727dc8e45a4161771d3655"
babel-jest@20.0.2:
version "20.0.2"
resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-20.0.2.tgz#0894fb1f44dca32edc0ca6a90020d8e6a5991a59"
dependencies:
babel-core "^6.0.0"
babel-plugin-istanbul "^4.0.0"
babel-preset-jest "^20.0.1"
babel-preset-jest "^20.0.2"
babel-jest@^20.0.3:
version "20.0.3"
resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-20.0.3.tgz#e4a03b13dc10389e140fc645d09ffc4ced301671"
dependencies:
babel-core "^6.0.0"
babel-plugin-istanbul "^4.0.0"
babel-preset-jest "^20.0.3"
babel-loader@7.0.0:
version "7.0.0"
@ -495,9 +503,9 @@ babel-plugin-istanbul@4.1.3, babel-plugin-istanbul@^4.0.0:
istanbul-lib-instrument "^1.7.1"
test-exclude "^4.1.0"
babel-plugin-jest-hoist@^20.0.1:
version "20.0.1"
resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-20.0.1.tgz#1b9cc322cff704d3812d1bca8dccd12205eedfd5"
babel-plugin-jest-hoist@^20.0.3:
version "20.0.3"
resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-20.0.3.tgz#afedc853bd3f8dc3548ea671fbe69d03cc2c1767"
babel-plugin-module-resolver@2.6.2:
version "2.6.2"
@ -807,9 +815,9 @@ babel-plugin-transform-strict-mode@^6.24.1:
babel-runtime "^6.22.0"
babel-types "^6.24.1"
babel-preset-env@1.3.3:
version "1.3.3"
resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.3.3.tgz#5913407784e3d98de2aa814a3ef9059722b34e0b"
babel-preset-env@1.5.0:
version "1.5.0"
resolved "https://registry.yarnpkg.com/babel-preset-env/-/babel-preset-env-1.5.0.tgz#6e5452f7c8742afe3b9a917883ccf3f7a4f340c5"
dependencies:
babel-plugin-check-es2015-constants "^6.22.0"
babel-plugin-syntax-trailing-function-commas "^6.22.0"
@ -838,8 +846,9 @@ babel-preset-env@1.3.3:
babel-plugin-transform-es2015-unicode-regex "^6.22.0"
babel-plugin-transform-exponentiation-operator "^6.22.0"
babel-plugin-transform-regenerator "^6.22.0"
browserslist "^1.4.0"
browserslist "^2.1.2"
invariant "^2.2.2"
semver "^5.3.0"
babel-preset-es2015@6.24.1:
version "6.24.1"
@ -876,11 +885,11 @@ babel-preset-flow@^6.23.0:
dependencies:
babel-plugin-transform-flow-strip-types "^6.22.0"
babel-preset-jest@^20.0.1:
version "20.0.1"
resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-20.0.1.tgz#8a9e23ce8a0f0c49835de53ed73ecf75dd6daa2e"
babel-preset-jest@^20.0.2, babel-preset-jest@^20.0.3:
version "20.0.3"
resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-20.0.3.tgz#cbacaadecb5d689ca1e1de1360ebfc66862c178a"
dependencies:
babel-plugin-jest-hoist "^20.0.1"
babel-plugin-jest-hoist "^20.0.3"
babel-preset-react@6.24.1:
version "6.24.1"
@ -950,6 +959,15 @@ babel-traverse@^6.18.0, babel-traverse@^6.23.1, babel-traverse@^6.24.1:
invariant "^2.2.0"
lodash "^4.2.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"
babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.21.0, babel-types@^6.23.0, babel-types@^6.24.1:
version "6.24.1"
resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.24.1.tgz#a136879dc15b3606bda0d90c1fc74304c2ff0975"
@ -964,8 +982,8 @@ babylon@6.14.1:
resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.14.1.tgz#956275fab72753ad9b3435d7afe58f8bf0a29815"
babylon@^6.11.0, babylon@^6.13.0, babylon@^6.15.0, babylon@^6.17.0:
version "6.17.1"
resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.1.tgz#17f14fddf361b695981fe679385e4f1c01ebd86f"
version "6.17.2"
resolved "https://registry.yarnpkg.com/babylon/-/babylon-6.17.2.tgz#201d25ef5f892c41bae49488b08db0dd476e9f5c"
balanced-match@^0.4.1:
version "0.4.2"
@ -1102,12 +1120,12 @@ browserify-zlib@^0.1.4:
dependencies:
pako "~0.2.0"
browserslist@^1.4.0:
version "1.7.7"
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-1.7.7.tgz#0bd76704258be829b2398bb50e4b62d1a166b0b9"
browserslist@^2.1.2:
version "2.1.4"
resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.1.4.tgz#cc526af4a1312b7d2e05653e56d0c8ab70c0e053"
dependencies:
caniuse-db "^1.0.30000639"
electron-to-chromium "^1.2.7"
caniuse-lite "^1.0.30000670"
electron-to-chromium "^1.3.11"
bser@1.0.2:
version "1.0.2"
@ -1179,9 +1197,9 @@ camelcase@^3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-3.0.0.tgz#32fc4b9fcdaf845fcdf7e73bb97cac2261f0ab0a"
caniuse-db@^1.0.30000639:
version "1.0.30000669"
resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000669.tgz#dbe8f25700ecda631dfb05cb71027762bd4b03e5"
caniuse-lite@^1.0.30000670:
version "1.0.30000676"
resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000676.tgz#1e962123f48073f0c51c4ea0651dd64d25786498"
case-sensitive-paths-webpack-plugin@2.0.0:
version "2.0.0"
@ -1534,6 +1552,12 @@ css-select@~1.2.0:
domutils "1.5.1"
nth-check "~1.0.1"
css-tree@1.0.0-alpha17:
version "1.0.0-alpha17"
resolved "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha17.tgz#7ab95ab72c533917af8be54313fec81841c5223a"
dependencies:
source-map "^0.5.3"
css-what@2.1:
version "2.1.0"
resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd"
@ -1561,8 +1585,8 @@ dashdash@^1.12.0:
assert-plus "^1.0.0"
date-fns@^1.27.2:
version "1.28.4"
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.28.4.tgz#7938aec34ba31fc8bd134d2344bc2e0bbfd95165"
version "1.28.5"
resolved "https://registry.yarnpkg.com/date-fns/-/date-fns-1.28.5.tgz#257cfc45d322df45ef5658665967ee841cd73faf"
date-now@^0.1.4:
version "0.1.4"
@ -1578,17 +1602,17 @@ debug@2.6.1:
dependencies:
ms "0.7.2"
debug@2.6.4:
version "2.6.4"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.4.tgz#7586a9b3c39741c0282ae33445c4e8ac74734fe0"
debug@2.6.7:
version "2.6.7"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.7.tgz#92bad1f6d05bbb6bba22cca88bcd0ec894c2861e"
dependencies:
ms "0.7.3"
ms "2.0.0"
debug@^2.1.1, debug@^2.2.0, debug@^2.6.3:
version "2.6.6"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.6.tgz#a9fa6fbe9ca43cf1e79f73b75c0189cbb7d6db5a"
version "2.6.8"
resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.8.tgz#e731531ca2ede27d188222427da17821d68ff4fc"
dependencies:
ms "0.7.3"
ms "2.0.0"
decamelize@^1.0.0, decamelize@^1.1.1:
version "1.2.0"
@ -1739,9 +1763,9 @@ ee-first@1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d"
electron-to-chromium@^1.2.7:
version "1.3.10"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.10.tgz#63d62b785471f0d8dda85199d64579de8a449f08"
electron-to-chromium@^1.3.11:
version "1.3.13"
resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.13.tgz#1b3a5eace6e087bb5e257a100b0cbfe81b2891fc"
elegant-spinner@^1.0.1:
version "1.0.1"
@ -1820,7 +1844,7 @@ error-stack-parser@^2.0.0:
dependencies:
stackframe "^1.0.3"
es-abstract@^1.6.1, es-abstract@^1.7.0:
es-abstract@^1.7.0:
version "1.7.0"
resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.7.0.tgz#dfade774e01bfcd97f96180298c449c8623fb94c"
dependencies:
@ -1838,8 +1862,8 @@ es-to-primitive@^1.1.1:
is-symbol "^1.0.1"
es5-ext@^0.10.14, es5-ext@^0.10.9, es5-ext@~0.10.14:
version "0.10.16"
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.16.tgz#1ef1b04f3d09db6a5d630226d62202f2e425e45a"
version "0.10.22"
resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.22.tgz#1876c51f990769c112c781ea3ebe89f84fd39071"
dependencies:
es6-iterator "2"
es6-symbol "~3.1"
@ -2181,8 +2205,8 @@ fileset@^2.0.2:
minimatch "^3.0.3"
filesize@^3.2.1:
version "3.5.9"
resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.5.9.tgz#9e3dd8a9b124f5b2f1fb2ee9cd13a86c707bb222"
version "3.5.10"
resolved "https://registry.yarnpkg.com/filesize/-/filesize-3.5.10.tgz#fc8fa23ddb4ef9e5e0ab6e1e64f679a24a56761f"
fill-range@^2.1.0:
version "2.2.3"
@ -2195,10 +2219,10 @@ fill-range@^2.1.0:
repeat-string "^1.5.2"
finalhandler@~1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.2.tgz#d0e36f9dbc557f2de14423df6261889e9d60c93a"
version "1.0.3"
resolved "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.0.3.tgz#ef47e77950e999780e86022a560e3217e0d0cc89"
dependencies:
debug "2.6.4"
debug "2.6.7"
encodeurl "~1.0.1"
escape-html "~1.0.3"
on-finished "~2.3.0"
@ -2493,8 +2517,8 @@ growly@^1.3.0:
resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081"
handlebars@^4.0.3:
version "4.0.8"
resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.8.tgz#22b875cd3f0e6cbea30314f144e82bc7a72ff420"
version "4.0.10"
resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.0.10.tgz#3d30c718b09a3d96f23ea4cc1f403c4d3ba9ff4f"
dependencies:
async "^1.4.0"
optimist "^0.6.1"
@ -2665,8 +2689,8 @@ ieee754@^1.1.4:
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.8.tgz#be33d40ac10ef1926701f6f08a2d86fbfd1ad3e4"
ignore@^3.0.9, ignore@^3.2.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.0.tgz#3812d22cbe9125f2c2b4915755a1b8abd745a001"
version "3.3.3"
resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.3.tgz#432352e57accd87ab3110e82d3fea0e47812156d"
imurmurhash@^0.1.4:
version "0.1.4"
@ -2776,8 +2800,8 @@ is-date-object@^1.0.1:
resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16"
is-dotfile@^1.0.0:
version "1.0.2"
resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.2.tgz#2c132383f39199f8edc268ca01b9b007d205cc4d"
version "1.0.3"
resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1"
is-equal-shallow@^0.1.3:
version "0.1.3"
@ -2928,75 +2952,75 @@ isstream@~0.1.2:
resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
istanbul-api@^1.1.1:
version "1.1.8"
resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.1.8.tgz#a844e55c6f9aeee292e7f42942196f60b23dc93e"
version "1.1.9"
resolved "https://registry.yarnpkg.com/istanbul-api/-/istanbul-api-1.1.9.tgz#2827920d380d4286d857d57a2968a841db8a7ec8"
dependencies:
async "^2.1.4"
fileset "^2.0.2"
istanbul-lib-coverage "^1.1.0"
istanbul-lib-hook "^1.0.6"
istanbul-lib-instrument "^1.7.1"
istanbul-lib-report "^1.1.0"
istanbul-lib-source-maps "^1.2.0"
istanbul-reports "^1.1.0"
istanbul-lib-coverage "^1.1.1"
istanbul-lib-hook "^1.0.7"
istanbul-lib-instrument "^1.7.2"
istanbul-lib-report "^1.1.1"
istanbul-lib-source-maps "^1.2.1"
istanbul-reports "^1.1.1"
js-yaml "^3.7.0"
mkdirp "^0.5.1"
once "^1.4.0"
istanbul-lib-coverage@^1.0.1, istanbul-lib-coverage@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.0.tgz#caca19decaef3525b5d6331d701f3f3b7ad48528"
istanbul-lib-coverage@^1.0.1, istanbul-lib-coverage@^1.1.0, istanbul-lib-coverage@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/istanbul-lib-coverage/-/istanbul-lib-coverage-1.1.1.tgz#73bfb998885299415c93d38a3e9adf784a77a9da"
istanbul-lib-hook@^1.0.6:
version "1.0.6"
resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.0.6.tgz#c0866d1e81cf2d5319249510131fc16dee49231f"
istanbul-lib-hook@^1.0.6, istanbul-lib-hook@^1.0.7:
version "1.0.7"
resolved "https://registry.yarnpkg.com/istanbul-lib-hook/-/istanbul-lib-hook-1.0.7.tgz#dd6607f03076578fe7d6f2a630cf143b49bacddc"
dependencies:
append-transform "^0.4.0"
istanbul-lib-instrument@^1.4.2, istanbul-lib-instrument@^1.7.1:
version "1.7.1"
resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.1.tgz#169e31bc62c778851a99439dd99c3cc12184d360"
istanbul-lib-instrument@^1.4.2, istanbul-lib-instrument@^1.7.1, istanbul-lib-instrument@^1.7.2:
version "1.7.2"
resolved "https://registry.yarnpkg.com/istanbul-lib-instrument/-/istanbul-lib-instrument-1.7.2.tgz#6014b03d3470fb77638d5802508c255c06312e56"
dependencies:
babel-generator "^6.18.0"
babel-template "^6.16.0"
babel-traverse "^6.18.0"
babel-types "^6.18.0"
babylon "^6.13.0"
istanbul-lib-coverage "^1.1.0"
istanbul-lib-coverage "^1.1.1"
semver "^5.3.0"
istanbul-lib-report@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.0.tgz#444c4ecca9afa93cf584f56b10f195bf768c0770"
istanbul-lib-report@^1.1.0, istanbul-lib-report@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/istanbul-lib-report/-/istanbul-lib-report-1.1.1.tgz#f0e55f56655ffa34222080b7a0cd4760e1405fc9"
dependencies:
istanbul-lib-coverage "^1.1.0"
istanbul-lib-coverage "^1.1.1"
mkdirp "^0.5.1"
path-parse "^1.0.5"
supports-color "^3.1.2"
istanbul-lib-source-maps@^1.1.0, istanbul-lib-source-maps@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.0.tgz#8c7706d497e26feeb6af3e0c28fd5b0669598d0e"
istanbul-lib-source-maps@^1.1.0, istanbul-lib-source-maps@^1.2.0, istanbul-lib-source-maps@^1.2.1:
version "1.2.1"
resolved "https://registry.yarnpkg.com/istanbul-lib-source-maps/-/istanbul-lib-source-maps-1.2.1.tgz#a6fe1acba8ce08eebc638e572e294d267008aa0c"
dependencies:
debug "^2.6.3"
istanbul-lib-coverage "^1.1.0"
istanbul-lib-coverage "^1.1.1"
mkdirp "^0.5.1"
rimraf "^2.6.1"
source-map "^0.5.3"
istanbul-reports@^1.1.0:
version "1.1.0"
resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.1.0.tgz#1ef3b795889219cfb5fad16365f6ce108d5f8c66"
istanbul-reports@^1.1.0, istanbul-reports@^1.1.1:
version "1.1.1"
resolved "https://registry.yarnpkg.com/istanbul-reports/-/istanbul-reports-1.1.1.tgz#042be5c89e175bc3f86523caab29c014e77fee4e"
dependencies:
handlebars "^4.0.3"
jest-changed-files@^20.0.1:
version "20.0.1"
resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-20.0.1.tgz#ba9bd42c3fddb1b7c4ae40065199b44a2335e152"
jest-changed-files@^20.0.2:
version "20.0.3"
resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-20.0.3.tgz#9394d5cc65c438406149bef1bf4d52b68e03e3f8"
jest-cli@20.0.1:
version "20.0.1"
resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-20.0.1.tgz#86ca0bc2e47215ad8e7dc85455c0210f86648502"
jest-cli@20.0.2:
version "20.0.2"
resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-20.0.2.tgz#98316e8eb45b4aee817395f38c3d08b7e13ca5b2"
dependencies:
ansi-escapes "^1.4.0"
callsites "^2.0.0"
@ -3007,18 +3031,18 @@ jest-cli@20.0.1:
istanbul-lib-coverage "^1.0.1"
istanbul-lib-instrument "^1.4.2"
istanbul-lib-source-maps "^1.1.0"
jest-changed-files "^20.0.1"
jest-config "^20.0.1"
jest-docblock "^20.0.1"
jest-environment-jsdom "^20.0.1"
jest-haste-map "^20.0.1"
jest-jasmine2 "^20.0.1"
jest-message-util "^20.0.1"
jest-regex-util "^20.0.1"
jest-resolve-dependencies "^20.0.1"
jest-runtime "^20.0.1"
jest-snapshot "^20.0.1"
jest-util "^20.0.1"
jest-changed-files "^20.0.2"
jest-config "^20.0.2"
jest-docblock "^20.0.2"
jest-environment-jsdom "^20.0.2"
jest-haste-map "^20.0.2"
jest-jasmine2 "^20.0.2"
jest-message-util "^20.0.2"
jest-regex-util "^20.0.2"
jest-resolve-dependencies "^20.0.2"
jest-runtime "^20.0.2"
jest-snapshot "^20.0.2"
jest-util "^20.0.2"
micromatch "^2.3.11"
node-notifier "^5.0.2"
pify "^2.3.0"
@ -3029,171 +3053,171 @@ jest-cli@20.0.1:
worker-farm "^1.3.1"
yargs "^7.0.2"
jest-config@^20.0.1:
version "20.0.1"
resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-20.0.1.tgz#c6934f585c3e1775c96133efb302f986c3909ad8"
jest-config@^20.0.2, jest-config@^20.0.4:
version "20.0.4"
resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-20.0.4.tgz#e37930ab2217c913605eff13e7bd763ec48faeea"
dependencies:
chalk "^1.1.3"
glob "^7.1.1"
jest-environment-jsdom "^20.0.1"
jest-environment-node "^20.0.1"
jest-jasmine2 "^20.0.1"
jest-matcher-utils "^20.0.1"
jest-regex-util "^20.0.1"
jest-resolve "^20.0.1"
jest-validate "^20.0.1"
pretty-format "^20.0.1"
jest-environment-jsdom "^20.0.3"
jest-environment-node "^20.0.3"
jest-jasmine2 "^20.0.4"
jest-matcher-utils "^20.0.3"
jest-regex-util "^20.0.3"
jest-resolve "^20.0.4"
jest-validate "^20.0.3"
pretty-format "^20.0.3"
jest-diff@^20.0.1:
version "20.0.1"
resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-20.0.1.tgz#2567c80c324243328321386f8871a28ec9d350ac"
jest-diff@^20.0.3:
version "20.0.3"
resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-20.0.3.tgz#81f288fd9e675f0fb23c75f1c2b19445fe586617"
dependencies:
chalk "^1.1.3"
diff "^3.2.0"
jest-matcher-utils "^20.0.1"
pretty-format "^20.0.1"
jest-matcher-utils "^20.0.3"
pretty-format "^20.0.3"
jest-docblock@^20.0.1:
version "20.0.1"
resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-20.0.1.tgz#055e0bbcb76798198479901f92d2733bf619f854"
jest-docblock@^20.0.2, jest-docblock@^20.0.3:
version "20.0.3"
resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-20.0.3.tgz#17bea984342cc33d83c50fbe1545ea0efaa44712"
jest-environment-jsdom@^20.0.1:
version "20.0.1"
resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-20.0.1.tgz#2d29f81368987d387c70ce4f500c6aa560f9b4f7"
jest-environment-jsdom@^20.0.2, jest-environment-jsdom@^20.0.3:
version "20.0.3"
resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-20.0.3.tgz#048a8ac12ee225f7190417713834bb999787de99"
dependencies:
jest-mock "^20.0.1"
jest-util "^20.0.1"
jest-mock "^20.0.3"
jest-util "^20.0.3"
jsdom "^9.12.0"
jest-environment-node@^20.0.1:
version "20.0.1"
resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-20.0.1.tgz#75ab5358072ee1efebc54f43474357d7b3d674c7"
jest-environment-node@^20.0.3:
version "20.0.3"
resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-20.0.3.tgz#d488bc4612af2c246e986e8ae7671a099163d403"
dependencies:
jest-mock "^20.0.1"
jest-util "^20.0.1"
jest-mock "^20.0.3"
jest-util "^20.0.3"
jest-haste-map@^20.0.1:
version "20.0.1"
resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-20.0.1.tgz#e6ba4db99ab512e7c081a5b0a0af731d0e193d56"
jest-haste-map@^20.0.2, jest-haste-map@^20.0.4:
version "20.0.4"
resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-20.0.4.tgz#653eb55c889ce3c021f7b94693f20a4159badf03"
dependencies:
fb-watchman "^2.0.0"
graceful-fs "^4.1.11"
jest-docblock "^20.0.1"
jest-docblock "^20.0.3"
micromatch "^2.3.11"
sane "~1.6.0"
worker-farm "^1.3.1"
jest-jasmine2@^20.0.1:
version "20.0.1"
resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-20.0.1.tgz#675772b1fd32ad74e92e8ae8282f8ea71d1de168"
jest-jasmine2@^20.0.2, jest-jasmine2@^20.0.4:
version "20.0.4"
resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-20.0.4.tgz#fcc5b1411780d911d042902ef1859e852e60d5e1"
dependencies:
chalk "^1.1.3"
graceful-fs "^4.1.11"
jest-diff "^20.0.1"
jest-matcher-utils "^20.0.1"
jest-matchers "^20.0.1"
jest-message-util "^20.0.1"
jest-snapshot "^20.0.1"
jest-diff "^20.0.3"
jest-matcher-utils "^20.0.3"
jest-matchers "^20.0.3"
jest-message-util "^20.0.3"
jest-snapshot "^20.0.3"
once "^1.4.0"
p-map "^1.1.1"
jest-matcher-utils@^20.0.1:
version "20.0.1"
resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-20.0.1.tgz#31aef67f59535af3c2271a3a3685db604dbd1622"
jest-matcher-utils@^20.0.3:
version "20.0.3"
resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-20.0.3.tgz#b3a6b8e37ca577803b0832a98b164f44b7815612"
dependencies:
chalk "^1.1.3"
pretty-format "^20.0.1"
pretty-format "^20.0.3"
jest-matchers@^20.0.1:
version "20.0.1"
resolved "https://registry.yarnpkg.com/jest-matchers/-/jest-matchers-20.0.1.tgz#053b7654ce60129268f39992886e987a5201bb90"
jest-matchers@^20.0.3:
version "20.0.3"
resolved "https://registry.yarnpkg.com/jest-matchers/-/jest-matchers-20.0.3.tgz#ca69db1c32db5a6f707fa5e0401abb55700dfd60"
dependencies:
jest-diff "^20.0.1"
jest-matcher-utils "^20.0.1"
jest-message-util "^20.0.1"
jest-regex-util "^20.0.1"
jest-diff "^20.0.3"
jest-matcher-utils "^20.0.3"
jest-message-util "^20.0.3"
jest-regex-util "^20.0.3"
jest-message-util@^20.0.1:
version "20.0.1"
resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-20.0.1.tgz#ac21cb055a6a5786b7f127ac7e705df5ffb1c335"
jest-message-util@^20.0.2, jest-message-util@^20.0.3:
version "20.0.3"
resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-20.0.3.tgz#6aec2844306fcb0e6e74d5796c1006d96fdd831c"
dependencies:
chalk "^1.1.3"
micromatch "^2.3.11"
slash "^1.0.0"
jest-mock@^20.0.1:
version "20.0.1"
resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-20.0.1.tgz#f4cca2e87e441b66fabe4ead6a6d61773ec0773a"
jest-mock@^20.0.3:
version "20.0.3"
resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-20.0.3.tgz#8bc070e90414aa155c11a8d64c869a0d5c71da59"
jest-regex-util@^20.0.1:
version "20.0.1"
resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-20.0.1.tgz#ecbcca8fbe4e217bca7f6f42a9b831d051224dc4"
jest-regex-util@^20.0.2, jest-regex-util@^20.0.3:
version "20.0.3"
resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-20.0.3.tgz#85bbab5d133e44625b19faf8c6aa5122d085d762"
jest-resolve-dependencies@^20.0.1:
version "20.0.1"
resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-20.0.1.tgz#38fc012191775b0b277fabebb37aa8282e26846f"
jest-resolve-dependencies@^20.0.2:
version "20.0.3"
resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-20.0.3.tgz#6e14a7b717af0f2cb3667c549de40af017b1723a"
dependencies:
jest-regex-util "^20.0.1"
jest-regex-util "^20.0.3"
jest-resolve@^20.0.1:
version "20.0.1"
resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-20.0.1.tgz#cace553663f25c703dc977a4ce176e29eda92772"
jest-resolve@^20.0.4:
version "20.0.4"
resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-20.0.4.tgz#9448b3e8b6bafc15479444c6499045b7ffe597a5"
dependencies:
browser-resolve "^1.11.2"
is-builtin-module "^1.0.0"
resolve "^1.3.2"
jest-runtime@^20.0.1:
version "20.0.1"
resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-20.0.1.tgz#384f9298b8e8a177870c6d9ad0023db10ddcaedc"
jest-runtime@^20.0.2:
version "20.0.4"
resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-20.0.4.tgz#a2c802219c4203f754df1404e490186169d124d8"
dependencies:
babel-core "^6.0.0"
babel-jest "^20.0.1"
babel-jest "^20.0.3"
babel-plugin-istanbul "^4.0.0"
chalk "^1.1.3"
convert-source-map "^1.4.0"
graceful-fs "^4.1.11"
jest-config "^20.0.1"
jest-haste-map "^20.0.1"
jest-regex-util "^20.0.1"
jest-resolve "^20.0.1"
jest-util "^20.0.1"
jest-config "^20.0.4"
jest-haste-map "^20.0.4"
jest-regex-util "^20.0.3"
jest-resolve "^20.0.4"
jest-util "^20.0.3"
json-stable-stringify "^1.0.1"
micromatch "^2.3.11"
strip-bom "3.0.0"
yargs "^7.0.2"
jest-snapshot@^20.0.1:
version "20.0.1"
resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-20.0.1.tgz#3704c599705042f20ec7c95ba76a4524c744dfac"
jest-snapshot@^20.0.2, jest-snapshot@^20.0.3:
version "20.0.3"
resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-20.0.3.tgz#5b847e1adb1a4d90852a7f9f125086e187c76566"
dependencies:
chalk "^1.1.3"
jest-diff "^20.0.1"
jest-matcher-utils "^20.0.1"
jest-util "^20.0.1"
jest-diff "^20.0.3"
jest-matcher-utils "^20.0.3"
jest-util "^20.0.3"
natural-compare "^1.4.0"
pretty-format "^20.0.1"
pretty-format "^20.0.3"
jest-util@^20.0.1:
version "20.0.1"
resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-20.0.1.tgz#a3e7afb67110b2c3ac77b82e9a51ca57f4ff72a1"
jest-util@^20.0.2, jest-util@^20.0.3:
version "20.0.3"
resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-20.0.3.tgz#0c07f7d80d82f4e5a67c6f8b9c3fe7f65cfd32ad"
dependencies:
chalk "^1.1.3"
graceful-fs "^4.1.11"
jest-message-util "^20.0.1"
jest-mock "^20.0.1"
jest-validate "^20.0.1"
jest-message-util "^20.0.3"
jest-mock "^20.0.3"
jest-validate "^20.0.3"
leven "^2.1.0"
mkdirp "^0.5.1"
jest-validate@^20.0.1:
version "20.0.1"
resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-20.0.1.tgz#a236c29e3c29e9b92a1e5da211a732f0238da928"
jest-validate@^20.0.3:
version "20.0.3"
resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-20.0.3.tgz#d0cfd1de4f579f298484925c280f8f1d94ec3cab"
dependencies:
chalk "^1.1.3"
jest-matcher-utils "^20.0.1"
jest-matcher-utils "^20.0.3"
leven "^2.1.0"
pretty-format "^20.0.1"
pretty-format "^20.0.3"
jodid25519@^1.0.0:
version "1.0.2"
@ -3307,8 +3331,8 @@ kew@^0.7.0:
resolved "https://registry.yarnpkg.com/kew/-/kew-0.7.0.tgz#79d93d2d33363d6fdd2970b335d9141ad591d79b"
kind-of@^3.0.2:
version "3.2.0"
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.0.tgz#b58abe4d5c044ad33726a8c1525b48cf891bff07"
version "3.2.2"
resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64"
dependencies:
is-buffer "^1.1.5"
@ -3344,15 +3368,17 @@ levn@^0.3.0, levn@~0.3.0:
type-check "~0.3.2"
lint-staged@^3.4.0:
version "3.4.1"
resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-3.4.1.tgz#96cd1cf7a1ac92d81662643c37d1cca28b91b046"
version "3.6.0"
resolved "https://registry.yarnpkg.com/lint-staged/-/lint-staged-3.6.0.tgz#cda8f0bef16e7928cc14b735186ae12cd662599c"
dependencies:
app-root-path "^2.0.0"
cosmiconfig "^1.1.0"
execa "^0.6.0"
listr "^0.12.0"
lodash.chunk "^4.2.0"
minimatch "^3.0.0"
npm-which "^3.0.1"
p-map "^1.1.1"
staged-git-files "0.0.4"
listr-silent-renderer@^1.1.1:
@ -3457,6 +3483,10 @@ lodash.bind@^4.1.4:
version "4.2.1"
resolved "https://registry.yarnpkg.com/lodash.bind/-/lodash.bind-4.2.1.tgz#7ae3017e939622ac31b7d7d7dcb1b34db1690d35"
lodash.chunk@^4.2.0:
version "4.2.0"
resolved "https://registry.yarnpkg.com/lodash.chunk/-/lodash.chunk-4.2.0.tgz#66e5ce1f76ed27b4303d8c6512e8d1216e8106bc"
lodash.defaults@^4.0.1:
version "4.2.0"
resolved "https://registry.yarnpkg.com/lodash.defaults/-/lodash.defaults-4.2.0.tgz#d09178716ffea4dde9e5fb7b37f6f0802274580c"
@ -3632,10 +3662,14 @@ mime-types@^2.1.12, mime-types@~2.1.11, mime-types@~2.1.15, mime-types@~2.1.7:
dependencies:
mime-db "~1.27.0"
mime@1.3.4, mime@^1.3.4:
mime@1.3.4:
version "1.3.4"
resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.4.tgz#115f9e3b6b3daf2959983cb38f149a2d40eb5d53"
mime@^1.3.4:
version "1.3.6"
resolved "https://registry.yarnpkg.com/mime/-/mime-1.3.6.tgz#591d84d3653a6b0b4a3b9df8de5aa8108e72e5e0"
min-document@^2.19.0:
version "2.19.0"
resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
@ -3689,13 +3723,9 @@ ms@0.7.2:
version "0.7.2"
resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765"
ms@0.7.3:
version "0.7.3"
resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.3.tgz#708155a5e44e33f5fd0fc53e81d0d40a91be1fff"
ms@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-1.0.0.tgz#59adcd22edc543f7b5381862d31387b1f4bc9473"
ms@2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
mute-stream@0.0.5:
version "0.0.5"
@ -3782,8 +3812,8 @@ node-notifier@5.1.2, node-notifier@^5.0.2:
which "^1.2.12"
node-pre-gyp@^0.6.29:
version "0.6.34"
resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.34.tgz#94ad1c798a11d7fc67381b50d47f8cc18d9799f7"
version "0.6.36"
resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz#db604112cb74e0d477554e9b505b17abddfab786"
dependencies:
mkdirp "^0.5.1"
nopt "^4.0.1"
@ -3867,8 +3897,8 @@ number-is-nan@^1.0.0:
resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d"
"nwmatcher@>= 1.3.9 < 2.0.0":
version "1.3.9"
resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.3.9.tgz#8bab486ff7fa3dfd086656bbe8b17116d3692d2a"
version "1.4.0"
resolved "https://registry.yarnpkg.com/nwmatcher/-/nwmatcher-1.4.0.tgz#b4389362170e7ef9798c3c7716d80ebc0106fccf"
nyc@10.3.2:
version "10.3.2"
@ -3914,15 +3944,6 @@ object-keys@^1.0.8:
version "1.0.11"
resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.11.tgz#c54601778ad560f1142ce0e01bcca8b56d13426d"
object.entries@1.0.4:
version "1.0.4"
resolved "https://registry.yarnpkg.com/object.entries/-/object.entries-1.0.4.tgz#1bf9a4dd2288f5b33f3a993d257661f05d161a5f"
dependencies:
define-properties "^1.1.2"
es-abstract "^1.6.1"
function-bind "^1.1.0"
has "^1.0.1"
object.omit@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa"
@ -4179,9 +4200,9 @@ preserve@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b"
pretty-format@^20.0.1:
version "20.0.1"
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-20.0.1.tgz#ba95329771907c189643dd251e244061ff642350"
pretty-format@^20.0.3:
version "20.0.3"
resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-20.0.3.tgz#020e350a560a1fe1a98dc3beb6ccffb386de8b14"
dependencies:
ansi-regex "^2.1.1"
ansi-styles "^3.0.0"
@ -4309,15 +4330,15 @@ react-dom@15.5.3:
object-assign "^4.1.0"
prop-types "~15.5.0"
react-hot-loader@3.0.0-beta.6:
version "3.0.0-beta.6"
resolved "https://registry.yarnpkg.com/react-hot-loader/-/react-hot-loader-3.0.0-beta.6.tgz#463fac0bfc8b63a8385258af20c91636abce75f4"
react-hot-loader@3.0.0-beta.7:
version "3.0.0-beta.7"
resolved "https://registry.yarnpkg.com/react-hot-loader/-/react-hot-loader-3.0.0-beta.7.tgz#d5847b8165d731c4d5b30d86d5d4716227a0fa83"
dependencies:
babel-template "^6.7.0"
global "^4.3.0"
react-deep-force-update "^2.0.1"
react-proxy "^3.0.0-alpha.0"
redbox-react "^1.2.5"
redbox-react "^1.3.6"
source-map "^0.4.4"
react-proxy@^3.0.0-alpha.0:
@ -4400,13 +4421,14 @@ recursive-copy@^2.0.6:
promise "^7.0.1"
slash "^1.0.0"
redbox-react@^1.2.5:
version "1.3.6"
resolved "https://registry.yarnpkg.com/redbox-react/-/redbox-react-1.3.6.tgz#70314c57c066257eb70b0a24dc794b5cef4f1c4e"
redbox-react@^1.3.6:
version "1.3.7"
resolved "https://registry.yarnpkg.com/redbox-react/-/redbox-react-1.3.7.tgz#bb3a1a73c07ebe1d67b55860908ee2bc35386968"
dependencies:
error-stack-parser "^1.3.6"
object-assign "^4.0.1"
prop-types "^15.5.4"
sourcemapped-stacktrace "^1.1.6"
regenerate@^1.2.1:
version "1.3.2"
@ -4654,24 +4676,6 @@ send@0.15.1:
range-parser "~1.2.0"
statuses "~1.3.1"
send@0.15.2:
version "0.15.2"
resolved "https://registry.yarnpkg.com/send/-/send-0.15.2.tgz#f91fab4403bcf87e716f70ceb5db2f578bdc17d6"
dependencies:
debug "2.6.4"
depd "~1.1.0"
destroy "~1.0.4"
encodeurl "~1.0.1"
escape-html "~1.0.3"
etag "~1.8.0"
fresh "0.5.0"
http-errors "~1.6.1"
mime "1.3.4"
ms "1.0.0"
on-finished "~2.3.0"
range-parser "~1.2.0"
statuses "~1.3.1"
serve-static@1.12.1:
version "1.12.1"
resolved "https://registry.yarnpkg.com/serve-static/-/serve-static-1.12.1.tgz#7443a965e3ced647aceb5639fa06bf4d1bbe0039"
@ -4777,6 +4781,12 @@ source-map@~0.2.0:
dependencies:
amdefine ">=0.0.4"
sourcemapped-stacktrace@^1.1.6:
version "1.1.6"
resolved "https://registry.yarnpkg.com/sourcemapped-stacktrace/-/sourcemapped-stacktrace-1.1.6.tgz#112d8749c942c3cd3b630dfac9514577b86a3a51"
dependencies:
source-map "0.5.6"
spawn-wrap@1.2.4:
version "1.2.4"
resolved "https://registry.yarnpkg.com/spawn-wrap/-/spawn-wrap-1.2.4.tgz#920eb211a769c093eebfbd5b0e7a5d2e68ab2e40"
@ -4803,8 +4813,8 @@ spdx-license-ids@^1.0.2:
resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57"
sprintf-js@^1.0.3:
version "1.1.0"
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.0.tgz#cffcaf702daf65ea39bb4e0fa2b299cec1a1be46"
version "1.1.1"
resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.1.1.tgz#36be78320afe5801f6cea3ee78b6e5aab940ea0c"
sprintf-js@~1.0.2:
version "1.0.3"
@ -4914,10 +4924,10 @@ string_decoder@^0.10.25:
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
string_decoder@~1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.0.tgz#f06f41157b664d86069f84bdbdc9b0d8ab281667"
version "1.0.1"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.1.tgz#62e200f039955a6810d8df0a33ffc0f013662d98"
dependencies:
buffer-shims "~1.0.0"
safe-buffer "^5.0.1"
stringstream@~0.0.4:
version "0.0.5"
@ -4947,18 +4957,24 @@ strip-json-comments@~2.0.1:
version "2.0.1"
resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a"
styled-jsx@0.5.7:
version "0.5.7"
resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-0.5.7.tgz#2cb02263ffa719b1435a864fdd6c62802ae86669"
styled-jsx@1.0.2:
version "1.0.2"
resolved "https://registry.yarnpkg.com/styled-jsx/-/styled-jsx-1.0.2.tgz#84b4855e19ac49238e0b6bea3d3af3aaf296cb22"
dependencies:
babel-plugin-syntax-jsx "6.18.0"
babel-traverse "6.21.0"
babel-types "6.23.0"
babylon "6.14.1"
convert-source-map "1.3.0"
css-tree "1.0.0-alpha17"
escape-string-regexp "1.0.5"
object.entries "1.0.4"
source-map "0.5.6"
string-hash "1.1.1"
stylis "3.0.10"
stylis@3.0.10:
version "3.0.10"
resolved "https://registry.yarnpkg.com/stylis/-/stylis-3.0.10.tgz#9f561e8a9799c2c317c596583bcaaa52a0d27663"
supports-color@^2.0.0:
version "2.0.0"
@ -5024,8 +5040,8 @@ tar@^2.2.1:
inherits "2"
test-exclude@^4.1.0:
version "4.1.0"
resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.1.0.tgz#04ca70b7390dd38c98d4a003a173806ca7991c91"
version "4.1.1"
resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.1.1.tgz#4d84964b0966b0087ecc334a2ce002d3d9341e26"
dependencies:
arrify "^1.0.1"
micromatch "^2.3.11"
@ -5044,8 +5060,8 @@ thenify-all@^1.0.0:
thenify ">= 3.1.0 < 4"
"thenify@>= 3.1.0 < 4":
version "3.2.1"
resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.2.1.tgz#251fd1c80aff6e5cf57cb179ab1fcb724269bd11"
version "3.3.0"
resolved "https://registry.yarnpkg.com/thenify/-/thenify-3.3.0.tgz#e69e38a1babe969b0108207978b9f62b88604839"
dependencies:
any-promise "^1.0.0"
@ -5139,8 +5155,8 @@ ua-parser-js@^0.7.9:
resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.12.tgz#04c81a99bdd5dc52263ea29d24c6bf8d4818a4bb"
uglify-js@^2.6, uglify-js@^2.8.5:
version "2.8.24"
resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.24.tgz#48eb5175cf32e22ec11a47e638d7c8b4e0faf2dd"
version "2.8.27"
resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-2.8.27.tgz#47787f912b0f242e5b984343be8e35e95f694c9c"
dependencies:
source-map "~0.5.1"
yargs "~3.10.0"