diff --git a/.circleci/config.yml b/.circleci/config.yml index 94d5009a04..82da90d547 100755 --- a/.circleci/config.yml +++ b/.circleci/config.yml @@ -23,12 +23,6 @@ jobs: paths: - "node_modules" - # Build - - run: - name: Build - command: | - yarn build - # Test - run: name: Tests @@ -36,10 +30,10 @@ jobs: # Release next - run: - name: Release Next version + name: Publish nuxt-next command: | if [ "${CIRCLE_BRANCH}" == "dev" ]; then - echo "TOKEN: $NPM_TOKEN" echo "//registry.npmjs.org/:_authToken=$NPM_TOKEN" >> ~/.npmrc - npm run release-next + echo "//registry.yarnpkg.com/:_authToken=$NPM_TOKEN" >> ~/.npmrc + ./scripts/release-next && npm publish --tag next fi diff --git a/.eslintrc.js b/.eslintrc.js index 69b6b59125..451755e074 100644 --- a/.eslintrc.js +++ b/.eslintrc.js @@ -8,7 +8,7 @@ module.exports = { browser: true, node: true }, - extends: 'standard', + extends: ['standard', 'standard-jsx'], // required to lint *.vue files plugins: [ 'html' diff --git a/.travis.yml b/.travis.yml index a92abde5dc..3a8d45dd6d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,14 +1,13 @@ language: node_js node_js: - "8" - - "6" + - "9" cache: yarn: true directories: - node_modules install: - yarn install - - yarn run build script: - yarn run test after_success: diff --git a/appveyor.yml b/appveyor.yml index f001912793..d9a0ff6927 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,8 +1,8 @@ # Test against the latest version of this Node.js version environment: matrix: - - nodejs_version: "6" - nodejs_version: "8" + - nodejs_version: "9" cache: - "%LOCALAPPDATA%\\Yarn" diff --git a/build/rollup.config.js b/build/rollup.config.js deleted file mode 100755 index 346d3fab8a..0000000000 --- a/build/rollup.config.js +++ /dev/null @@ -1,116 +0,0 @@ -// Some parts brought from https://github.com/vuejs/vue/blob/dev/build/config.js -const { resolve } = require('path') -const rollupBabel = require('rollup-plugin-babel') -const rollupAlias = require('rollup-plugin-alias') -const rollupCommonJS = require('rollup-plugin-commonjs') -const rollupReplace = require('rollup-plugin-replace') -const rollupNodeResolve = require('rollup-plugin-node-resolve') -const packageJson = require('../package.json') - -const dependencies = Object.keys(packageJson.dependencies) -const version = packageJson.version || process.env.VERSION - -// ----------------------------- -// Banner -// ----------------------------- -const banner = - '/*!\n' + - ' * Nuxt.js v' + version + '\n' + - ' * Released under the MIT License.\n' + - ' */' - -// ----------------------------- -// Aliases -// ----------------------------- -const rootDir = resolve(__dirname, '..') -const libDir = resolve(rootDir, 'lib') -const distDir = resolve(rootDir, 'dist') - -const aliases = { - core: resolve(libDir, 'core/index.js'), - builder: resolve(libDir, 'builder/index.js'), - common: resolve(libDir, 'common/index.js'), - utils: resolve(libDir, 'common/utils.js'), - app: resolve(libDir, 'app') -} - -// ----------------------------- -// Builds -// ----------------------------- -const builds = { - nuxt: { - entry: resolve(libDir, 'index.js'), - file: resolve(distDir, 'nuxt.js') - }, - core: { - entry: resolve(libDir, 'core/index.js'), - file: resolve(distDir, 'core.js') - } -} - -// ----------------------------- -// Default config -// ----------------------------- -function genConfig (opts) { - const config = { - input: opts.entry, - output: { - file: opts.file, - format: 'cjs', - sourcemap: true - }, - external: ['fs', 'path', 'http', 'module', 'vue-server-renderer/server-plugin', 'vue-server-renderer/client-plugin'] - .concat(dependencies, opts.external), - banner: opts.banner || banner, - name: opts.modulename || 'Nuxt', - plugins: [ - rollupAlias(Object.assign({ - resolve: ['.js', '.json', '.jsx', '.ts'] - }, aliases, opts.alias)), - - rollupNodeResolve({ preferBuiltins: true }), - - rollupCommonJS(), - - rollupBabel(Object.assign({ - exclude: 'node_modules/**', - plugins: [ - ['transform-runtime', { 'helpers': false, 'polyfill': false }], - 'transform-async-to-generator', - 'array-includes', - 'external-helpers' - ], - presets: [ - ['env', { - targets: { - node: '6.11.0' - }, - modules: false - }] - ], - 'env': { - 'test': { - 'plugins': [ 'istanbul' ] - } - } - }, opts.babel)), - - rollupReplace({ __VERSION__: version }) - ].concat(opts.plugins || []) - } - - if (opts.env) { - config.plugins.push(rollupReplace({ - 'process.env.NODE_ENV': JSON.stringify(opts.env) - })) - } - - return config -} - -if (process.env.TARGET) { - module.exports = genConfig(builds[process.env.TARGET]) -} else { - exports.getBuild = name => genConfig(builds[name]) - exports.getAllBuilds = () => Object.keys(builds).map(name => genConfig(builds[name])) -} diff --git a/examples/async-data/pages/posts/index.vue b/examples/async-data/pages/posts/index.vue index 6a7014d4ed..1015972fa8 100644 --- a/examples/async-data/pages/posts/index.vue +++ b/examples/async-data/pages/posts/index.vue @@ -3,7 +3,7 @@

Blog

diff --git a/examples/custom-routes/pages/index.vue b/examples/custom-routes/pages/index.vue index 7febff502d..889363ca7c 100644 --- a/examples/custom-routes/pages/index.vue +++ b/examples/custom-routes/pages/index.vue @@ -2,7 +2,7 @@

Users

diff --git a/examples/hello-world-jsx/pages/about.vue b/examples/hello-world-jsx/pages/about.vue deleted file mode 100644 index 26ed2649b8..0000000000 --- a/examples/hello-world-jsx/pages/about.vue +++ /dev/null @@ -1,15 +0,0 @@ - diff --git a/examples/hello-world-jsx/pages/index.js b/examples/hello-world-jsx/pages/index.js deleted file mode 100644 index 675e8981f2..0000000000 --- a/examples/hello-world-jsx/pages/index.js +++ /dev/null @@ -1,8 +0,0 @@ -export default { - render(h) { - return
-

Welcome !

- About page -
- } -} diff --git a/examples/i18n/layouts/default.vue b/examples/i18n/layouts/default.vue index 8bf6defab9..46cf9e913e 100644 --- a/examples/i18n/layouts/default.vue +++ b/examples/i18n/layouts/default.vue @@ -4,10 +4,10 @@

Nuxt i18n

diff --git a/examples/nested-routes/pages/index.vue b/examples/nested-routes/pages/index.vue index 82d8bd3643..5a98a4417b 100644 --- a/examples/nested-routes/pages/index.vue +++ b/examples/nested-routes/pages/index.vue @@ -3,7 +3,7 @@

Players

    -
  • +
  • {{ user.name }}
diff --git a/examples/routes-transitions/pages/users.vue b/examples/routes-transitions/pages/users.vue index a02582e753..29cade784e 100644 --- a/examples/routes-transitions/pages/users.vue +++ b/examples/routes-transitions/pages/users.vue @@ -6,7 +6,7 @@ Next > Next >
    -
  • +
  • {{ user.first_name }} {{ user.last_name }}
  • diff --git a/examples/typescript/pages/index.vue b/examples/typescript/pages/index.vue index bb135477b7..567e415ebc 100644 --- a/examples/typescript/pages/index.vue +++ b/examples/typescript/pages/index.vue @@ -6,7 +6,7 @@ {{selected}}
-
+
diff --git a/examples/vue-apollo/pages/index.vue b/examples/vue-apollo/pages/index.vue index 5aa6f9a5cd..6c6e440d36 100644 --- a/examples/vue-apollo/pages/index.vue +++ b/examples/vue-apollo/pages/index.vue @@ -2,7 +2,7 @@

Cars

    -
  • +
  • {{ car.year }} {{ car.make }} {{ car.model }} diff --git a/examples/vuex-store-modules/pages/todos.vue b/examples/vuex-store-modules/pages/todos.vue index 3c21b92a22..8a693afb95 100644 --- a/examples/vuex-store-modules/pages/todos.vue +++ b/examples/vuex-store-modules/pages/todos.vue @@ -2,7 +2,7 @@

    Todos

      -
    • +
    • {{ todo.text }}
    • diff --git a/examples/vuex-store-modules/pages/website.vue b/examples/vuex-store-modules/pages/website.vue index e0fa75320c..3a8b7d6bd5 100644 --- a/examples/vuex-store-modules/pages/website.vue +++ b/examples/vuex-store-modules/pages/website.vue @@ -2,13 +2,13 @@

      Articles

        -
      • +
      • {{article}}

      Comments (nested under articles)

        -
      • +
      • {{comment}}
      diff --git a/examples/with-cookies/pages/index.vue b/examples/with-cookies/pages/index.vue index 7709bec946..429dbc9051 100755 --- a/examples/with-cookies/pages/index.vue +++ b/examples/with-cookies/pages/index.vue @@ -8,7 +8,7 @@ - + {{ key }} {{ value }} diff --git a/examples/with-firebase/pages/index.vue b/examples/with-firebase/pages/index.vue index 3ad24b3797..7168ef1231 100644 --- a/examples/with-firebase/pages/index.vue +++ b/examples/with-firebase/pages/index.vue @@ -10,7 +10,7 @@ - + avatar diff --git a/examples/with-sockets/pages/index.vue b/examples/with-sockets/pages/index.vue index 7184116d06..7e96f5e16b 100644 --- a/examples/with-sockets/pages/index.vue +++ b/examples/with-sockets/pages/index.vue @@ -4,7 +4,9 @@
      • -
      • {{ message.date.split('T')[1].slice(0, -2) }}: {{ message.text }}
      • +
      • + {{ message.date.split('T')[1].slice(0, -2) }}: {{ message.text }} +
      diff --git a/examples/with-vue-material/README.md b/examples/with-vue-material/README.md new file mode 100644 index 0000000000..2cd080e524 --- /dev/null +++ b/examples/with-vue-material/README.md @@ -0,0 +1,7 @@ +# Nuxt With Vue-Material + +## Compatibility + +Vue-Material >= 1.0.0beta + +[View Demo](https://nuxt-vue-material.now.sh) diff --git a/examples/with-vue-material/nuxt.config.js b/examples/with-vue-material/nuxt.config.js new file mode 100644 index 0000000000..38d84fe8c0 --- /dev/null +++ b/examples/with-vue-material/nuxt.config.js @@ -0,0 +1,25 @@ +module.exports = { + head: { + meta: [ + { + name: 'viewport', + content: 'width=device-width, initial-scale=1, minimal-ui' + } + ], + link: [ + { + rel: 'stylesheet', + href: 'https://fonts.googleapis.com/css?family=Roboto:300,400,500,700,400italic|Material+Icons' + }, + { + rel: 'stylesheet', + href: 'https://unpkg.com/vue-material@beta/dist/vue-material.min.css' + }, + { + rel: 'stylesheet', + href: 'https://unpkg.com/vue-material@beta/dist/theme/default.css' + } + ] + }, + plugins: ['~/plugins/vue-material'] +} diff --git a/examples/with-vue-material/package.json b/examples/with-vue-material/package.json new file mode 100644 index 0000000000..0363fc255b --- /dev/null +++ b/examples/with-vue-material/package.json @@ -0,0 +1,14 @@ +{ + "name": "with-vue-material", + "version": "1.0.0", + "dependencies": { + "nuxt": "latest", + "vue": "~2.4.4", + "vue-material": "beta" + }, + "scripts": { + "dev": "nuxt", + "build": "nuxt build", + "start": "nuxt start" + } +} diff --git a/examples/with-vue-material/pages/index.vue b/examples/with-vue-material/pages/index.vue new file mode 100644 index 0000000000..f24b6c078d --- /dev/null +++ b/examples/with-vue-material/pages/index.vue @@ -0,0 +1,106 @@ + + + + + diff --git a/examples/with-vue-material/plugins/vue-material.js b/examples/with-vue-material/plugins/vue-material.js new file mode 100644 index 0000000000..3f64c62cc1 --- /dev/null +++ b/examples/with-vue-material/plugins/vue-material.js @@ -0,0 +1,4 @@ +import Vue from 'vue' +import VueMaterial from 'vue-material' + +Vue.use(VueMaterial) diff --git a/examples/with-vuetify/assets/app.styl b/examples/with-vuetify/assets/app.styl index 66d746eb17..784fd9c898 100644 --- a/examples/with-vuetify/assets/app.styl +++ b/examples/with-vuetify/assets/app.styl @@ -1,14 +1,27 @@ // Specify overrides (theme and/or base variables etc.) // See https://vuetifyjs.com/quick-start +// And for themes customizing: https://vuetifyjs.com/style/theme + +// Color Palette: https://vuetifyjs.com/style/colors + +// Although, since version https://github.com/vuetifyjs/vuetify/releases/tag/v0.17.0, colors are no +// longer defined **explicitly** in the stylus files. +// you can use `import colors from 'vuetify/es5/util/colors'` in the vuetify instance, under `plugins` +// if you only want to define your color palette. + +// you have to define the same palette colors just if you want to use them inside your own stylus files. + +@require '~vuetify/src/stylus/settings/_colors' + $theme := { - primary: #9c27b0 - accent: #ce93d8 - secondary: #424242 - info: #0D47A1 - warning: #ffb300 - error: #B71C1C - success: #2E7D32 + primary: $red.darken-2 + accent: $red.accent-2 + secondary: $grey.lighten-1 + info: $blue.lighten-1 + warning: $amber.darken-2 + error: $red.accent-4 + success: $green.lighten-2 } // Import Vuetify styling -@require '~vuetify/src/stylus/main.styl' \ No newline at end of file +@require '~vuetify/src/stylus/main' diff --git a/examples/with-vuetify/nuxt.config.js b/examples/with-vuetify/nuxt.config.js index df74955493..a3b50d43bf 100644 --- a/examples/with-vuetify/nuxt.config.js +++ b/examples/with-vuetify/nuxt.config.js @@ -1,3 +1,5 @@ +const nodeExternals = require('webpack-node-externals') + module.exports = { /* ** Head elements @@ -13,7 +15,16 @@ module.exports = { */ build: { vendor: ['vuetify'], - extractCSS: true + extractCSS: true, + extend(config, ctx) { + if (ctx.isServer) { + config.externals = [ + nodeExternals({ + whitelist: [/^vuetify/] + }) + ] + } + } }, /* ** Load Vuetify into the app diff --git a/examples/with-vuetify/plugins/vuetify.js b/examples/with-vuetify/plugins/vuetify.js index a91ae689bb..0a5a2acc45 100644 --- a/examples/with-vuetify/plugins/vuetify.js +++ b/examples/with-vuetify/plugins/vuetify.js @@ -1,4 +1,19 @@ import Vue from 'vue' import Vuetify from 'vuetify' +import colors from 'vuetify/es5/util/colors' -Vue.use(Vuetify) +// You can also specify those components you are going to use for "a la carte" build: +// https://github.com/vuetifyjs/nuxt/blob/master/template/plugins/vuetify.js +// https://github.com/vuetifyjs/a-la-carte/blob/master/template/src/main.js + +Vue.use(Vuetify, { + theme: { + primary: '#121212', // a color that is not in the material colors palette + accent: colors.grey.darken3, + secondary: colors.amber.darken3, + info: colors.teal.lighten1, + warning: colors.amber, + error: colors.deepOrange.accent4, + success: colors.green.accent3 + } +}) diff --git a/index.js b/index.js deleted file mode 100644 index 24e035805e..0000000000 --- a/index.js +++ /dev/null @@ -1,16 +0,0 @@ -/*! - * Nuxt.js - * (c) 2016-2017 Chopin Brothers - * Core maintainer: Pooya (@pi0) - * Released under the MIT License. - */ - -// Node Source Map Support -// https://github.com/evanw/node-source-map-support -require('source-map-support').install() - -// Fix babel flag -/* istanbul ignore else */ -process.noDeprecation = true - -module.exports = require('./dist/nuxt') diff --git a/lib/app/components/nuxt.js b/lib/app/components/nuxt.js index 243eec2023..380bf5f110 100644 --- a/lib/app/components/nuxt.js +++ b/lib/app/components/nuxt.js @@ -1,12 +1,15 @@ import Vue from 'vue' import NuxtChild from './nuxt-child' -import NuxtError from '<%= components.ErrorPage ? ((components.ErrorPage.includes('~') || components.ErrorPage.includes('@')) ? components.ErrorPage : "../" + components.ErrorPage) : "./nuxt-error.vue" %>' +import NuxtError from '<%= components.ErrorPage ? ((components.ErrorPage.indexOf('~') === 0 || components.ErrorPage.indexOf('@') === 0) ? components.ErrorPage : "../" + components.ErrorPage) : "./nuxt-error.vue" %>' import { compile } from '../utils' export default { name: 'nuxt', props: ['nuxtChildKey'], render(h) { + if (this.nuxt._redirected) { + return h('div', [ '<%= messages.redirect %>' ]) + } // If there is some error if (this.nuxt.err) { return h('nuxt-error', { diff --git a/lib/app/index.js b/lib/app/index.js index 986ad113ec..bfcecfd48c 100644 --- a/lib/app/index.js +++ b/lib/app/index.js @@ -8,13 +8,12 @@ import NuxtLink from './components/nuxt-link.js' import NuxtError from '<%= components.ErrorPage ? components.ErrorPage : "./components/nuxt-error.vue" %>' import Nuxt from './components/nuxt.js' import App from '<%= appPath %>' -import { setContext, getLocation } from './utils' +import { setContext, getLocation, getRouteData } from './utils' <% if (store) { %>import { createStore } from './store.js'<% } %> /* Plugins */ - -<% plugins.forEach(plugin => { %>// <%= plugin.src %><%= (plugin.ssr===false) ? ' (Only included in client bundle)' : '' %> -import <%= plugin.name %> from '<%= plugin.name %>'<% }) %> +<% plugins.forEach(plugin => { %>import <%= plugin.name %> from '<%= plugin.name %>' // Source: <%= relativeToBuild(plugin.src) %><%= (plugin.ssr===false) ? ' (ssr: false)' : '' %> +<% }) %> // Component: Vue.component(NoSSR.name, NoSSR) @@ -167,7 +166,17 @@ async function createApp (ssrContext) { // If server-side, wait for async component to be resolved first if (process.server && ssrContext && ssrContext.url) { await new Promise((resolve, reject) => { - router.push(ssrContext.url, resolve, reject) + router.push(ssrContext.url, resolve, () => { + // navigated to a different route in router guard + const unregister = router.afterEach(async (to, from, next) => { + ssrContext.url = to.fullPath + app.context.route = await getRouteData(to) + app.context.params = to.params || {} + app.context.query = to.query || {} + unregister() + resolve() + }) + }) }) } diff --git a/lib/app/utils.js b/lib/app/utils.js index f2a707f0f3..cb2642ced0 100644 --- a/lib/app/utils.js +++ b/lib/app/utils.js @@ -85,7 +85,7 @@ export function resolveRouteComponents(route) { ) } -async function getRouteData(route) { +export async function getRouteData(route) { // Make sure the components are resolved (code-splitting) await resolveRouteComponents(route) // Send back a copy of route with meta based on Component definition @@ -132,11 +132,24 @@ export async function setContext(app, context) { path = status status = 302 } - app.context.next({ - path: path, - query: query, - status: status - }) + // "/absolute/route", "./relative/route" or "../relative/route" + if (/(^[.]{1,2}\/)|(^\/(?!\/))/.test(path)) { + app.context.next({ + path: path, + query: query, + status: status + }) + } else { + path = formatUrl(path, query) + if (process.server) { + app.context.res.setHeader('Location', path) + app.context.res.statusCode = status + app.nuxt._redirected = true + } + if (process.client) { + window.location = path + } + } } if (process.server) app.context.beforeNuxtRender = (fn) => context.beforeRenderFns.push(fn) if (process.client) app.context.nuxtState = window.__NUXT__ @@ -442,3 +455,60 @@ function escapeString(str) { function escapeGroup(group) { return group.replace(/([=!:$\/()])/g, '\\$1') } + +/** + * Format given url, append query to url query string + * + * @param {string} url + * @param {string} query + * @return {string} + */ +function formatUrl (url, query) { + let protocol + let index = url.indexOf('://') + if (index !== -1) { + protocol = url.substring(0, index) + url = url.substring(index + 3) + } else if (url.indexOf('//') === 0) { + url = url.substring(2) + } + + let parts = url.split('/') + let result = (protocol ? protocol + '://' : '//') + parts.shift() + + let path = parts.filter(Boolean).join('/') + let hash + parts = path.split('#') + if (parts.length === 2) { + path = parts[0] + hash = parts[1] + } + + result += path ? '/' + path : '' + + if (query && JSON.stringify(query) !== '{}') { + result += (url.split('?').length === 2 ? '&' : '?') + formatQuery(query) + } + result += hash ? '#' + hash : '' + + return result +} + +/** + * Transform data object to query string + * + * @param {object} query + * @return {string} + */ +function formatQuery (query) { + return Object.keys(query).sort().map(key => { + var val = query[key] + if (val == null) { + return '' + } + if (Array.isArray(val)) { + return val.slice().map(val2 => [key, '=', val2].join('')).join('&') + } + return key + '=' + val + }).filter(Boolean).join('&') +} diff --git a/lib/builder/builder.js b/lib/builder/builder.js index 1325cc2ca8..704fbb7389 100644 --- a/lib/builder/builder.js +++ b/lib/builder/builder.js @@ -1,29 +1,30 @@ -import _ from 'lodash' -import chokidar from 'chokidar' -import fs, { remove, readFile, writeFile, mkdirp, existsSync } from 'fs-extra' -import hash from 'hash-sum' -import pify from 'pify' -import webpack from 'webpack' -import serialize from 'serialize-javascript' -import { join, resolve, basename, extname, dirname } from 'path' -import MFS from 'memory-fs' -import webpackDevMiddleware from 'webpack-dev-middleware' -import webpackHotMiddleware from 'webpack-hot-middleware' -import { r, wp, wChunk, createRoutes, sequence, relativeTo, isPureObject, waitFor } from 'utils' -import Debug from 'debug' -import Glob from 'glob' -import clientWebpackConfig from './webpack/client.config.js' -import serverWebpackConfig from './webpack/server.config.js' -import dllWebpackConfig from './webpack/dll.config.js' -import vueLoaderConfig from './webpack/vue-loader.config' -import styleLoader from './webpack/style-loader' +const { promisify } = require('util') +const _ = require('lodash') +const chokidar = require('chokidar') +const { remove, readFile, writeFile, mkdirp, existsSync } = require('fs-extra') +const hash = require('hash-sum') +const webpack = require('webpack') +const serialize = require('serialize-javascript') +const { join, resolve, basename, extname, dirname } = require('path') +const MFS = require('memory-fs') +const webpackDevMiddleware = require('webpack-dev-middleware') +const webpackHotMiddleware = require('webpack-hot-middleware') +const { r, wp, wChunk, createRoutes, sequence, relativeTo, isPureObject, waitFor, rmCache } = require('../common/utils') +const Debug = require('debug') +const Glob = require('glob') +const clientWebpackConfig = require('./webpack/client.config.js') +const serverWebpackConfig = require('./webpack/server.config.js') +const dllWebpackConfig = require('./webpack/dll.config.js') +const vueLoaderConfig = require('./webpack/vue-loader.config') +const styleLoader = require('./webpack/style-loader') +const { Options } = require('../common') const debug = Debug('nuxt:build') debug.color = 2 // Force green color -const glob = pify(Glob) +const glob = promisify(Glob) -export default class Builder { +module.exports = class Builder { constructor(nuxt) { this.nuxt = nuxt this.isStatic = false // Flag to know if the build is for a generated app @@ -62,18 +63,21 @@ export default class Builder { // Stop watching on nuxt.close() if (this.options.dev) { this.nuxt.hook('close', () => this.unwatch()) + } else { + this.nuxt.hook('build:done', () => this.generateConfig()) } } get plugins() { - return this.options.plugins.map((p, i) => { + return _.uniqBy(this.options.plugins.map((p, i) => { if (typeof p === 'string') p = { src: p } + const pluginBaseName = basename(p.src, extname(p.src)).replace(/[^a-zA-Z?\d\s:]/g, '') return { src: this.nuxt.resolvePath(p.src), ssr: (p.ssr !== false), - name: basename(p.src, extname(p.src)).replace(/[^a-zA-Z?\d\s:]/g, '') + '_plugin_' + hash(p.src) + name: 'nuxt_plugin_' + pluginBaseName + '_' + hash(p.src) } - }) + }), p => p.name) } vendor() { @@ -124,19 +128,6 @@ export default class Builder { // Call before hook await this.nuxt.callHook('build:before', this, this.options.build) - // Babel options - this.babelOptions = _.defaults(this.options.build.babel, { - babelrc: false, - cacheDirectory: !!this.options.dev - }) - if (!this.babelOptions.babelrc && !this.babelOptions.presets) { - this.babelOptions.presets = [ - [require.resolve('babel-preset-vue-app'), { - targets: { ie: 9, uglify: true } - }] - ] - } - // Map postcss plugins into instances on object mode once if (isPureObject(this.options.build.postcss)) { if (isPureObject(this.options.build.postcss.plugins)) { @@ -154,9 +145,9 @@ export default class Builder { // Check if pages dir exists and warn if not this._nuxtPages = typeof this.options.build.createRoutes !== 'function' if (this._nuxtPages) { - if (!fs.existsSync(join(this.options.srcDir, 'pages'))) { + if (!existsSync(join(this.options.srcDir, 'pages'))) { let dir = this.options.srcDir - if (fs.existsSync(join(this.options.srcDir, '..', 'pages'))) { + if (existsSync(join(this.options.srcDir, '..', 'pages'))) { throw new Error(`No \`pages\` directory found in ${dir}. Did you mean to run \`nuxt\` in the parent (\`../\`) directory?`) } else { throw new Error(`Couldn't find a \`pages\` directory in ${dir}. Please create one under the project root`) @@ -189,6 +180,42 @@ export default class Builder { return this } + getBabelOptions({ isServer }) { + const options = _.defaults({}, { + babelrc: false, + cacheDirectory: !!this.options.dev + }, this.options.build.babel) + + if (typeof options.presets === 'function') { + options.presets = options.presets({ isServer }) + } + + if (!options.babelrc && !options.presets) { + options.presets = [ + [ + require.resolve('babel-preset-vue-app'), + { + targets: isServer ? { node: '8.0.0' } : { ie: 9, uglify: true } + } + ] + ] + } + + return options + } + + getFileName(name) { + let fileName = this.options.build.filenames[name] + + // Don't use hashes when watching + // https://github.com/webpack/webpack/issues/1914#issuecomment-174171709 + if (this.options.dev) { + fileName = fileName.replace(/\[(chunkhash|contenthash|hash)\]\./g, '') + } + + return fileName + } + async generateRoutesAndFiles() { debug('Generating files...') // -- Templates -- @@ -220,7 +247,7 @@ export default class Builder { router: this.options.router, env: this.options.env, head: this.options.head, - middleware: fs.existsSync(join(this.options.srcDir, 'middleware')), + middleware: existsSync(join(this.options.srcDir, 'middleware')), store: this.options.store, css: this.options.css, plugins: this.plugins, @@ -235,16 +262,18 @@ export default class Builder { } // -- Layouts -- - if (fs.existsSync(resolve(this.options.srcDir, 'layouts'))) { - const layoutsFiles = await glob('layouts/**/*.vue', { cwd: this.options.srcDir }) + if (existsSync(resolve(this.options.srcDir, 'layouts'))) { + const layoutsFiles = await glob('layouts/**/*.{vue,js}', { cwd: this.options.srcDir }) let hasErrorLayout = false layoutsFiles.forEach((file) => { - let name = file.split('/').slice(1).join('/').replace(/\.vue$/, '') + let name = file.split('/').slice(1).join('/').replace(/\.(vue|js)$/, '') if (name === 'error') { hasErrorLayout = true return } - templateVars.layouts[name] = this.relativeToBuild(this.options.srcDir, file) + if (!templateVars.layouts[name] || /\.vue$/.test(file)) { + templateVars.layouts[name] = this.relativeToBuild(this.options.srcDir, file) + } }) if (!templateVars.components.ErrorPage && hasErrorLayout) { templateVars.components.ErrorPage = this.relativeToBuild(this.options.srcDir, 'layouts/error.vue') @@ -262,8 +291,14 @@ export default class Builder { // If user defined a custom method to create routes if (this._nuxtPages) { // Use nuxt.js createRoutes bases on pages/ - const files = await glob('pages/**/*.vue', { cwd: this.options.srcDir }) - templateVars.router.routes = createRoutes(files, this.options.srcDir) + const files = {}; + (await glob('pages/**/*.{vue,js}', { cwd: this.options.srcDir })).forEach(f => { + const key = f.replace(/\.(js|vue)$/, '') + if (/\.vue$/.test(f) || !files[key]) { + files[key] = f + } + }) + templateVars.router.routes = createRoutes(Object.values(files), this.options.srcDir) } else { templateVars.router.routes = this.options.build.createRoutes(this.options.srcDir) } @@ -299,7 +334,7 @@ export default class Builder { } // Allow override templates using a file with same name in ${srcDir}/app const customPath = r(this.options.srcDir, 'app', file) - const customFileExists = fs.existsSync(customPath) + const customFileExists = existsSync(customPath) return { src: customFileExists @@ -436,7 +471,7 @@ export default class Builder { compiler.plugin('done', async (stats) => { await this.nuxt.callHook('build:compiled', { name, compiler, stats }) // Reload renderer if available - this.nuxt.renderer.loadResources(sharedFS || fs) + this.nuxt.renderer.loadResources(sharedFS || require('fs')) // Resolve on next tick process.nextTick(resolve) }) @@ -459,6 +494,12 @@ export default class Builder { compiler.watch(this.options.watchers.webpack, (err) => { /* istanbul ignore if */ if (err) return reject(err) + // not keep modified or deleted items in Vue.prototype + Object.keys(require.cache).forEach(key => { + if (!/(node_modules\/postcss)|(\.node$)/.test(key)) { + rmCache(key) + } + }) }) ) return @@ -486,7 +527,7 @@ export default class Builder { debug('Adding webpack middleware...') // Create webpack dev middleware - this.webpackDevMiddleware = pify(webpackDevMiddleware(compiler, Object.assign({ + this.webpackDevMiddleware = promisify(webpackDevMiddleware(compiler, Object.assign({ publicPath: this.options.build.publicPath, stats: this.webpackStats, noInfo: true, @@ -494,9 +535,9 @@ export default class Builder { watchOptions: this.options.watchers.webpack }, this.options.build.devMiddleware))) - this.webpackDevMiddleware.close = pify(this.webpackDevMiddleware.close) + this.webpackDevMiddleware.close = promisify(this.webpackDevMiddleware.close) - this.webpackHotMiddleware = pify(webpackHotMiddleware(compiler, Object.assign({ + this.webpackHotMiddleware = promisify(webpackHotMiddleware(compiler, Object.assign({ log: false, heartbeat: 10000 }, this.options.build.hotMiddleware))) @@ -517,14 +558,14 @@ export default class Builder { r(src, 'layouts'), r(src, 'store'), r(src, 'middleware'), - r(src, 'layouts/*.vue'), - r(src, 'layouts/**/*.vue') + r(src, 'layouts/*.{vue,js}'), + r(src, 'layouts/**/*.{vue,js}') ] if (this._nuxtPages) { patterns.push( r(src, 'pages'), - r(src, 'pages/*.vue'), - r(src, 'pages/**/*.vue') + r(src, 'pages/*.{vue,js}'), + r(src, 'pages/**/*.{vue,js}') ) } const options = Object.assign({}, this.options.watchers.chokidar, { @@ -557,6 +598,12 @@ export default class Builder { // Stop webpack middleware await this.webpackDevMiddleware.close() } + + async generateConfig() { + const config = resolve(this.options.buildDir, 'build.config.js') + const options = _.omit(this.options, Options.unsafeKeys) + await writeFile(config, `module.exports = ${JSON.stringify(options, null, ' ')}`, 'utf8') + } } const STATUS = { diff --git a/lib/builder/generator.js b/lib/builder/generator.js index 7a22714bda..63b6268e80 100644 --- a/lib/builder/generator.js +++ b/lib/builder/generator.js @@ -1,10 +1,10 @@ -import { copy, remove, writeFile, mkdirp, removeSync, existsSync } from 'fs-extra' -import _ from 'lodash' -import { resolve, join, dirname, sep } from 'path' -import { minify } from 'html-minifier' -import { isUrl, promisifyRoute, waitFor, flatRoutes } from 'utils' +const { copy, remove, writeFile, mkdirp, removeSync, existsSync } = require('fs-extra') +const _ = require('lodash') +const { resolve, join, dirname, sep } = require('path') +const { minify } = require('html-minifier') +const { isUrl, promisifyRoute, waitFor, flatRoutes } = require('../common/utils') -export default class Generator { +module.exports = class Generator { constructor(nuxt, builder) { this.nuxt = nuxt this.options = nuxt.options @@ -38,11 +38,11 @@ export default class Generator { // Call before hook await this.nuxt.callHook('generate:before', this, this.options.generate) - // Add flag to set process.static - this.builder.forGenerate() - - // Start build process if (build) { + // Add flag to set process.static + this.builder.forGenerate() + + // Start build process await this.builder.build() } @@ -52,18 +52,17 @@ export default class Generator { } } - async initRoutes() { + async initRoutes(...args) { // Resolve config.generate.routes promises before generating the routes let generateRoutes = [] if (this.options.router.mode !== 'hash') { try { - generateRoutes = await promisifyRoute(this.options.generate.routes || []) + generateRoutes = await promisifyRoute(this.options.generate.routes || [], ...args) } catch (e) { console.error('Could not resolve routes') // eslint-disable-line no-console throw e // eslint-disable-line no-unreachable } } - // Generate only index.html for router.mode = 'hash' let routes = (this.options.router.mode === 'hash') ? ['/'] : flatRoutes(this.options.router.routes) routes = this.decorateWithPayloads(routes, generateRoutes) diff --git a/lib/builder/index.js b/lib/builder/index.js index 7e52dab70a..fc3309238b 100755 --- a/lib/builder/index.js +++ b/lib/builder/index.js @@ -1,7 +1,7 @@ -import Builder from './builder' -import Generator from './generator' +const Builder = require('./builder') +const Generator = require('./generator') -export { +module.exports = { Builder, Generator } diff --git a/lib/builder/webpack/base.config.js b/lib/builder/webpack/base.config.js index 5188e92063..fcf07fea54 100644 --- a/lib/builder/webpack/base.config.js +++ b/lib/builder/webpack/base.config.js @@ -1,9 +1,10 @@ -import ExtractTextPlugin from 'extract-text-webpack-plugin' -import { cloneDeep } from 'lodash' -import { join, resolve } from 'path' -import webpack from 'webpack' -import { isUrl, urlJoin } from 'utils' -import TimeFixPlugin from './timefix-plugin' +const ExtractTextPlugin = require('extract-text-webpack-plugin') +const { cloneDeep } = require('lodash') +const { join, resolve } = require('path') +const webpack = require('webpack') +const { isUrl, urlJoin } = require('../../common/utils') +const TimeFixPlugin = require('./plugins/timefix') +const WarnFixPlugin = require('./plugins/warnfix') /* |-------------------------------------------------------------------------- @@ -13,19 +14,17 @@ import TimeFixPlugin from './timefix-plugin' | webpack config files |-------------------------------------------------------------------------- */ -export default function webpackBaseConfig(name) { - const nodeModulesDir = join(__dirname, '..', 'node_modules') - +module.exports = function webpackBaseConfig({ name, isServer }) { const config = { name, - devtool: this.options.dev ? 'cheap-module-source-map' : 'nosources-source-map', + devtool: this.options.dev ? 'cheap-module-eval-source-map' : false, entry: { app: null }, output: { path: resolve(this.options.buildDir, 'dist'), - filename: this.options.build.filenames.app, - chunkFilename: this.options.build.filenames.chunk, + filename: this.getFileName('app'), + chunkFilename: this.getFileName('chunk'), publicPath: (isUrl(this.options.build.publicPath) ? this.options.build.publicPath : urlJoin(this.options.router.base, this.options.build.publicPath)) @@ -47,16 +46,10 @@ export default function webpackBaseConfig(name) { 'assets': join(this.options.srcDir, 'assets'), 'static': join(this.options.srcDir, 'static') }, - modules: [ - ...this.options.modulesDir, - nodeModulesDir - ] + modules: this.options.modulesDir }, resolveLoader: { - modules: [ - ...this.options.modulesDir, - nodeModulesDir - ] + modules: this.options.modulesDir }, module: { noParse: /es6-promise\.js$/, // Avoid webpack shimming process @@ -64,13 +57,13 @@ export default function webpackBaseConfig(name) { { test: /\.vue$/, loader: 'vue-loader', - options: this.vueLoader() + options: this.vueLoader({ isServer }) }, { test: /\.js$/, loader: 'babel-loader', exclude: /node_modules/, - options: Object.assign({}, this.babelOptions) + options: this.getBabelOptions({ isServer }) }, { test: /\.css$/, use: this.styleLoader('css') }, { test: /\.less$/, use: this.styleLoader('less', 'less-loader') }, @@ -106,32 +99,23 @@ export default function webpackBaseConfig(name) { } // Add timefix-plugin before others plugins - config.plugins.unshift(new TimeFixPlugin()) + if (this.options.dev) { + config.plugins.unshift(new TimeFixPlugin()) + } + + // Hide warnings about plugins without a default export (#1179) + config.plugins.push(new WarnFixPlugin()) // CSS extraction const extractCSS = this.options.build.extractCSS if (extractCSS) { const extractOptions = Object.assign( - { filename: this.options.build.filenames.css }, + { filename: this.getFileName('css') }, typeof extractCSS === 'object' ? extractCSS : {} ) config.plugins.push(new ExtractTextPlugin(extractOptions)) } - // Workaround for hiding Warnings about plugins without a default export (#1179) - config.plugins.push({ - apply(compiler) { - compiler.plugin('done', stats => { - stats.compilation.warnings = stats.compilation.warnings.filter(warn => { - if (warn.name === 'ModuleDependencyWarning' && warn.message.includes(`export 'default'`) && warn.message.includes('plugin')) { - return false - } - return true - }) - }) - } - }) - // -------------------------------------- // Dev specific config // -------------------------------------- diff --git a/lib/builder/webpack/client.config.js b/lib/builder/webpack/client.config.js index f11c81a9c4..a4c3f92da6 100644 --- a/lib/builder/webpack/client.config.js +++ b/lib/builder/webpack/client.config.js @@ -1,15 +1,17 @@ -import { each } from 'lodash' -import webpack from 'webpack' -import VueSSRClientPlugin from 'vue-server-renderer/client-plugin' -import HTMLPlugin from 'html-webpack-plugin' -import FriendlyErrorsWebpackPlugin from 'friendly-errors-webpack-plugin' -import UglifyJSPlugin from 'uglifyjs-webpack-plugin' -import ProgressBarPlugin from 'progress-bar-webpack-plugin' -import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer' -import { resolve } from 'path' -import { existsSync } from 'fs' -import Debug from 'debug' -import base from './base.config.js' +const { each } = require('lodash') +const webpack = require('webpack') +const VueSSRClientPlugin = require('vue-server-renderer/client-plugin') +const HTMLPlugin = require('html-webpack-plugin') +const FriendlyErrorsWebpackPlugin = require('friendly-errors-webpack-plugin') +const UglifyJSPlugin = require('uglifyjs-webpack-plugin') +const ProgressBarPlugin = require('progress-bar-webpack-plugin') +const ProgressPlugin = require('webpack/lib/ProgressPlugin') +const { BundleAnalyzerPlugin } = require('webpack-bundle-analyzer') +const { resolve } = require('path') +const { existsSync } = require('fs') +const Debug = require('debug') +const Chalk = require('chalk') +const base = require('./base.config.js') const debug = Debug('nuxt:build') debug.color = 2 // Force green color @@ -24,8 +26,8 @@ debug.color = 2 // Force green color | In production, will generate public/dist/style.css |-------------------------------------------------------------------------- */ -export default function webpackClientConfig() { - let config = base.call(this, 'client') +module.exports = function webpackClientConfig() { + let config = base.call(this, { name: 'client', isServer: false }) // Entry points config.entry.app = resolve(this.options.buildDir, 'client.js') @@ -73,7 +75,7 @@ export default function webpackClientConfig() { new webpack.optimize.CommonsChunkPlugin({ name: 'manifest', minChunks: Infinity, - filename: this.options.build.filenames.manifest + filename: this.getFileName('manifest') }) ) @@ -90,18 +92,26 @@ export default function webpackClientConfig() { })) ) + // Add friendly error plugin + config.plugins.push(new FriendlyErrorsWebpackPlugin()) + // Build progress bar - config.plugins.push( - new ProgressBarPlugin() - ) + if (this.options.build.profile) { + config.plugins.push(new ProgressPlugin({ + profile: true + })) + } else { + config.plugins.push(new ProgressBarPlugin({ + complete: Chalk.green('â–ˆ'), + incomplete: Chalk.white('â–ˆ'), + format: ' :bar ' + Chalk.green.bold(':percent') + ' :msg' + })) + } // -------------------------------------- // Dev specific config // -------------------------------------- if (this.options.dev) { - // Add friendly error plugin - config.plugins.push(new FriendlyErrorsWebpackPlugin()) - // https://webpack.js.org/plugins/named-modules-plugin config.plugins.push(new webpack.NamedModulesPlugin()) @@ -139,7 +149,7 @@ export default function webpackClientConfig() { if (this.options.build.uglify !== false) { config.plugins.push( new UglifyJSPlugin(Object.assign({ - cache: true, + // cache: true, sourceMap: true, parallel: true, extractComments: { @@ -184,36 +194,18 @@ export default function webpackClientConfig() { // Adds Common Chunks Plugin // -------------------------------------------------------------------------- function commonChunksPlugin(config) { - const _this = this - const totalPages = _this.routes ? _this.routes.length : 0 - - // This well-known vendor may exist as a dependency of other requests. - const maybeVendor = [ - '/core-js/', - '/regenerator-runtime/', - '/es6-promise/', - '/babel-runtime/', - '/lodash/' - ] - // Create explicit vendor chunk config.plugins.unshift( new webpack.optimize.CommonsChunkPlugin({ name: 'vendor', - filename: this.options.build.filenames.vendor, + filename: this.getFileName('vendor'), minChunks(module, count) { - // Detect and externalize well-known vendor if detected - if (module.context && maybeVendor.some(v => module.context.includes(v))) { - return true - } // A module is extracted into the vendor chunk when... return ( // If it's inside node_modules /node_modules/.test(module.context) && // Do not externalize if the request is a CSS file - !/\.(css|less|scss|sass|styl|stylus)$/.test(module.request) && - // Used in at-least 1/2 of the total pages - (totalPages <= 2 ? count >= totalPages : count >= totalPages * 0.5) + !/\.(css|less|scss|sass|styl|stylus)$/.test(module.request) ) } }) diff --git a/lib/builder/webpack/dll.config.js b/lib/builder/webpack/dll.config.js index 725015c7df..5ad19116b3 100644 --- a/lib/builder/webpack/dll.config.js +++ b/lib/builder/webpack/dll.config.js @@ -1,6 +1,6 @@ -import webpack from 'webpack' -import { resolve } from 'path' -import ClientConfig from './client.config' +const webpack = require('webpack') +const { resolve } = require('path') +const ClientConfig = require('./client.config') /* |-------------------------------------------------------------------------- @@ -8,7 +8,7 @@ import ClientConfig from './client.config' | https://github.com/webpack/webpack/tree/master/examples/dll |-------------------------------------------------------------------------- */ -export default function webpackDllConfig(_refConfig) { +module.exports = function webpackDllConfig(_refConfig) { const refConfig = _refConfig || new ClientConfig() const name = refConfig.name + '-dll' diff --git a/lib/builder/webpack/timefix-plugin.js b/lib/builder/webpack/plugins/timefix.js similarity index 92% rename from lib/builder/webpack/timefix-plugin.js rename to lib/builder/webpack/plugins/timefix.js index 9c16918735..ddf6445648 100644 --- a/lib/builder/webpack/timefix-plugin.js +++ b/lib/builder/webpack/plugins/timefix.js @@ -1,6 +1,6 @@ // Taken from https://github.com/egoist/poi/blob/3e93c88c520db2d20c25647415e6ae0d3de61145/packages/poi/lib/webpack/timefix-plugin.js#L1-L16 // Thanks to @egoist -export default class TimeFixPlugin { +module.exports = class TimeFixPlugin { constructor(timefix = 11000) { this.timefix = timefix } diff --git a/lib/builder/webpack/plugins/warnfix.js b/lib/builder/webpack/plugins/warnfix.js new file mode 100644 index 0000000000..3f28913af6 --- /dev/null +++ b/lib/builder/webpack/plugins/warnfix.js @@ -0,0 +1,14 @@ +module.exports = class WarnFixPlugin { + apply(compiler) /* istanbul ignore next */ { + compiler.plugin('done', stats => { + stats.compilation.warnings = stats.compilation.warnings.filter(warn => { + if (warn.name === 'ModuleDependencyWarning' && + warn.message.includes(`export 'default'`) && + warn.message.includes('nuxt_plugin_')) { + return false + } + return true + }) + }) + } +} diff --git a/lib/builder/webpack/server.config.js b/lib/builder/webpack/server.config.js index 451e70c304..e6a1ecf869 100644 --- a/lib/builder/webpack/server.config.js +++ b/lib/builder/webpack/server.config.js @@ -1,18 +1,18 @@ -import webpack from 'webpack' -import VueSSRServerPlugin from 'vue-server-renderer/server-plugin' -import nodeExternals from 'webpack-node-externals' -import { each } from 'lodash' -import { resolve } from 'path' -import { existsSync } from 'fs' -import base from './base.config.js' +const webpack = require('webpack') +const VueSSRServerPlugin = require('vue-server-renderer/server-plugin') +const nodeExternals = require('webpack-node-externals') +const { each } = require('lodash') +const { resolve } = require('path') +const { existsSync } = require('fs') +const base = require('./base.config.js') /* |-------------------------------------------------------------------------- | Webpack Server Config |-------------------------------------------------------------------------- */ -export default function webpackServerConfig() { - let config = base.call(this, 'server') +module.exports = function webpackServerConfig() { + let config = base.call(this, { name: 'server', isServer: true }) // env object defined in nuxt.config.js let env = {} diff --git a/lib/builder/webpack/style-loader.js b/lib/builder/webpack/style-loader.js index 90f29d57be..e528d423d7 100755 --- a/lib/builder/webpack/style-loader.js +++ b/lib/builder/webpack/style-loader.js @@ -1,7 +1,7 @@ -import ExtractTextPlugin from 'extract-text-webpack-plugin' -import { join } from 'path' +const ExtractTextPlugin = require('extract-text-webpack-plugin') +const { join } = require('path') -export default function styleLoader(ext, loaders = [], isVueLoader = false) { +module.exports = function styleLoader(ext, loaders = [], isVueLoader = false) { // Normalize loaders loaders = (Array.isArray(loaders) ? loaders : [loaders]).map(loader => { if (typeof loader === 'string') { diff --git a/lib/builder/webpack/vue-loader.config.js b/lib/builder/webpack/vue-loader.config.js index c5b608b6cf..af162b1869 100644 --- a/lib/builder/webpack/vue-loader.config.js +++ b/lib/builder/webpack/vue-loader.config.js @@ -1,4 +1,4 @@ -export default function vueLoader() { +module.exports = function vueLoader({ isServer }) { // https://vue-loader.vuejs.org/en const config = { postcss: this.options.build.postcss, @@ -8,7 +8,7 @@ export default function vueLoader() { loaders: { 'js': { loader: 'babel-loader', - options: Object.assign({}, this.babelOptions) + options: this.getBabelOptions({ isServer }) }, // Note: do not nest the `postcss` option under `loaders` 'css': this.styleLoader('css', [], true), diff --git a/lib/common/cli/errors.js b/lib/common/cli/errors.js index 6a95d886d5..8ec2230db6 100644 --- a/lib/common/cli/errors.js +++ b/lib/common/cli/errors.js @@ -8,10 +8,9 @@ pe.skipPackage('regenerator-runtime') pe.skipPackage('babel-runtime') pe.skipPackage('core-js') -// Skip dist artifacts and Node internals -const skipFiles = [ 'nuxt.js', 'core.js' ] +// Skip node internals pe.skip((traceLine, lineNumber) => { - if (!traceLine.file || skipFiles.indexOf(traceLine.file) !== -1) { + if (!traceLine.file) { return true } }) diff --git a/lib/common/index.js b/lib/common/index.js index 26a5ba474a..3a241c30d1 100755 --- a/lib/common/index.js +++ b/lib/common/index.js @@ -1,12 +1,7 @@ -import * as Utils from './utils' -import Options from './options' +const Utils = require('./utils') +const Options = require('./options') -export default { - Utils, - Options -} - -export { +module.exports = { Utils, Options } diff --git a/lib/common/options.js b/lib/common/options.js index 043024384f..82f1bb4f97 100755 --- a/lib/common/options.js +++ b/lib/common/options.js @@ -1,15 +1,15 @@ -import _ from 'lodash' -import Debug from 'debug' -import { join, resolve } from 'path' -import { existsSync } from 'fs' -import { isUrl, isPureObject } from 'utils' +const _ = require('lodash') +const Debug = require('debug') +const { join, resolve } = require('path') +const { existsSync } = require('fs') +const { isUrl, isPureObject } = require('../common/utils') const debug = Debug('nuxt:build') debug.color = 2 // Force green color const Options = {} -export default Options +module.exports = Options Options.from = function (_options) { // Clone options to prevent unwanted side-effects @@ -32,26 +32,37 @@ Options.from = function (_options) { options.layoutTransition = { name: options.layoutTransition } } + const hasValue = v => typeof v === 'string' && v + options.rootDir = hasValue(options.rootDir) ? options.rootDir : process.cwd() + + // Apply defaults by ${buildDir}/dist/build.config.js + const buildDir = options.buildDir || Options.defaults.buildDir + const buildConfig = resolve(options.rootDir, buildDir, 'build.config.js') + if (existsSync(buildConfig)) { + _.defaultsDeep(options, require(buildConfig)) + } // Apply defaults _.defaultsDeep(options, Options.defaults) // Resolve dirs - const hasValue = v => typeof v === 'string' && v - options.rootDir = hasValue(options.rootDir) ? options.rootDir : process.cwd() options.srcDir = hasValue(options.srcDir) ? resolve(options.rootDir, options.srcDir) : options.rootDir options.buildDir = resolve(options.rootDir, options.buildDir) options.cacheDir = resolve(options.rootDir, options.cacheDir) // Normalize modulesDir + /* istanbul ignore if */ + if (!options.modulesDir) { + options.modulesDir = ['node_modules'] + } if (!Array.isArray(options.modulesDir)) { options.modulesDir = [options.modulesDir] } - /* istanbul ignore if */ - if (!options.modulesDir.length) { - options.modulesDir = ['node_modules'] - } options.modulesDir = options.modulesDir.filter(dir => hasValue(dir)).map(dir => resolve(options.rootDir, dir)) + // Always add nuxt to modulesDir array + const nuxtModulesDir = join(options.nuxtDir, 'node_modules') + options.modulesDir.push(nuxtModulesDir) + // If app.html is defined, set the template path to the user template options.appTemplatePath = resolve(options.buildDir, 'views/app.template.html') if (existsSync(join(options.srcDir, 'app.html'))) { @@ -185,16 +196,22 @@ Options.modes = { } } +Options.unsafeKeys = [ + 'rootDir', 'srcDir', 'buildDir', 'modulesDir', 'cacheDir', 'nuxtDir', + 'nuxtAppDir', 'build', 'generate', 'router.routes', 'appTemplatePath' +] + Options.defaults = { mode: 'universal', dev: process.env.NODE_ENV !== 'production', debug: undefined, // Will be equal to dev if not provided buildDir: '.nuxt', cacheDir: '.cache', - nuxtDir: resolve(__dirname, '..'), // Relative to dist - nuxtAppDir: resolve(__dirname, '../lib/app/'), // Relative to dist + nuxtDir: resolve(__dirname, '../..'), + nuxtAppDir: resolve(__dirname, '../app'), build: { analyze: false, + profile: process.argv.includes('--profile'), dll: false, scopeHoisting: false, extractCSS: false, @@ -323,6 +340,7 @@ Options.defaults = { back_to_home: 'Back to the home page', server_error_details: 'An error occurred in the application and your page could not be served. If you are the application owner, check your logs for details.', client_error: 'Error', - client_error_details: 'An error occurred while rendering the page. Check developer tools console for details.' + client_error_details: 'An error occurred while rendering the page. Check developer tools console for details.', + redirect: 'Redirecting to external page.' } } diff --git a/lib/common/utils.js b/lib/common/utils.js index d9758c8c8d..11b434b1d0 100644 --- a/lib/common/utils.js +++ b/lib/common/utils.js @@ -1,15 +1,15 @@ -import { resolve, relative, sep } from 'path' -import _ from 'lodash' +const { resolve, relative, sep } = require('path') +const _ = require('lodash') -export function encodeHtml(str) { +exports.encodeHtml = function encodeHtml(str) { return str.replace(//g, '>') } -export function getContext(req, res) { +exports.getContext = function getContext(req, res) { return { req, res } } -export function setAnsiColors(ansiHTML) { +exports.setAnsiColors = function setAnsiColors(ansiHTML) { ansiHTML.setColors({ reset: ['efefef', 'a6004c'], darkgrey: '5a012b', @@ -22,50 +22,50 @@ export function setAnsiColors(ansiHTML) { }) } -export async function waitFor(ms) { +exports.waitFor = async function waitFor(ms) { return new Promise(resolve => setTimeout(resolve, (ms || 0))) } -export function urlJoin() { +exports.urlJoin = function urlJoin() { return [].slice.call(arguments).join('/').replace(/\/+/g, '/').replace(':/', '://') } -export function isUrl(url) { +exports.isUrl = function isUrl(url) { return (url.indexOf('http') === 0 || url.indexOf('//') === 0) } -export function promisifyRoute(fn) { +exports.promisifyRoute = function promisifyRoute(fn, ...args) { // If routes is an array if (Array.isArray(fn)) { return Promise.resolve(fn) } // If routes is a function expecting a callback - if (fn.length === 1) { + if (fn.length === arguments.length) { return new Promise((resolve, reject) => { - fn(function (err, routeParams) { + fn((err, routeParams) => { if (err) { reject(err) } resolve(routeParams) - }) + }, ...args) }) } - let promise = fn() + let promise = fn(...args) if (!promise || (!(promise instanceof Promise) && (typeof promise.then !== 'function'))) { promise = Promise.resolve(promise) } return promise } -export function sequence(tasks, fn) { +exports.sequence = function sequence(tasks, fn) { return tasks.reduce((promise, task) => promise.then(() => fn(task)), Promise.resolve()) } -export function parallel(tasks, fn) { +exports.parallel = function parallel(tasks, fn) { return Promise.all(tasks.map(task => fn(task))) } -export function chainFn(base, fn) { +exports.chainFn = function chainFn(base, fn) { /* istanbul ignore if */ if (!(fn instanceof Function)) { return @@ -88,13 +88,13 @@ export function chainFn(base, fn) { } } -export function isPureObject(o) { +exports.isPureObject = function isPureObject(o) { return !Array.isArray(o) && typeof o === 'object' } -export const isWindows = /^win/.test(process.platform) +const isWindows = exports.isWindows = /^win/.test(process.platform) -export function wp(p = '') { +const wp = exports.wp = function wp(p = '') { /* istanbul ignore if */ if (isWindows) { return p.replace(/\\/g, '\\\\') @@ -102,7 +102,7 @@ export function wp(p = '') { return p } -export function wChunk(p = '') { +exports.wChunk = function wChunk(p = '') { /* istanbul ignore if */ if (isWindows) { return p.replace(/\//g, '_') @@ -114,18 +114,18 @@ const reqSep = /\//g const sysSep = _.escapeRegExp(sep) const normalize = string => string.replace(reqSep, sysSep) -export function r() { +const r = exports.r = function r() { let args = Array.prototype.slice.apply(arguments) let lastArg = _.last(args) - if (lastArg.includes('@') || lastArg.includes('~')) { + if (lastArg.indexOf('@') === 0 || lastArg.indexOf('~') === 0) { return wp(lastArg) } return wp(resolve(...args.map(normalize))) } -export function relativeTo() { +exports.relativeTo = function relativeTo() { let args = Array.prototype.slice.apply(arguments) let dir = args.shift() @@ -133,7 +133,7 @@ export function relativeTo() { let path = r(...args) // Check if path is an alias - if (path.includes('@') || path.includes('~')) { + if (path.indexOf('@') === 0 || path.indexOf('~') === 0) { return path } @@ -145,13 +145,17 @@ export function relativeTo() { return wp(rp) } -export function flatRoutes(router, path = '', routes = []) { +exports.flatRoutes = function flatRoutes(router, path = '', routes = []) { router.forEach((r) => { if (!r.path.includes(':') && !r.path.includes('*')) { /* istanbul ignore if */ if (r.children) { + if (path === '' && r.path === '/') { + routes.push('/') + } flatRoutes(r.children, path + r.path + '/', routes) } else { + path = path.replace(/^\/+$/, '/') routes.push((r.path === '' && path[path.length - 1] === '/' ? path.slice(0, -1) : path) + r.path) } } @@ -159,7 +163,7 @@ export function flatRoutes(router, path = '', routes = []) { return routes } -export function cleanChildrenRoutes(routes, isChild = false) { +function cleanChildrenRoutes(routes, isChild = false) { let start = -1 let routesIndex = [] routes.forEach((route) => { @@ -205,16 +209,16 @@ export function cleanChildrenRoutes(routes, isChild = false) { return routes } -export function createRoutes(files, srcDir) { +exports.createRoutes = function createRoutes(files, srcDir) { let routes = [] files.forEach((file) => { - let keys = file.replace(/^pages/, '').replace(/\.vue$/, '').replace(/\/{2,}/g, '/').split('/').slice(1) + let keys = file.replace(/^pages/, '').replace(/\.(vue|js)$/, '').replace(/\/{2,}/g, '/').split('/').slice(1) let route = { name: '', path: '', component: r(srcDir, file) } let parent = routes keys.forEach((key, i) => { route.name = route.name ? route.name + '-' + key.replace('_', '') : key.replace('_', '') route.name += (key === '_') ? 'all' : '' - route.chunkName = file.replace(/\.vue$/, '') + route.chunkName = file.replace(/\.(vue|js)$/, '') let child = _.find(parent, { name: route.name }) if (child) { child.children = child.children || [] @@ -264,3 +268,16 @@ export function createRoutes(files, srcDir) { }) return cleanChildrenRoutes(routes) } + +exports.rmCache = function rmCache(path) { + const mod = require.cache[path] + delete require.cache[path] + if (mod.parent && mod.parent.children) { + for (let i = 0; i < mod.parent.children.length; i++) { + if (mod.parent.children[i] === mod) { + mod.parent.children.splice(i, 1) + break + } + } + } +} diff --git a/lib/core/index.js b/lib/core/index.js index 3eee8a295c..b4e0d1399a 100755 --- a/lib/core/index.js +++ b/lib/core/index.js @@ -1,9 +1,9 @@ -import { Options, Utils } from 'common' -import Module from './module' -import Nuxt from './nuxt' -import Renderer from './renderer' +const { Options, Utils } = require('../common') +const Module = require('./module') +const Nuxt = require('./nuxt') +const Renderer = require('./renderer') -export { +module.exports = { Nuxt, Module, Renderer, diff --git a/lib/core/meta.js b/lib/core/meta.js index 1edd0c3d7f..0df24a9de4 100644 --- a/lib/core/meta.js +++ b/lib/core/meta.js @@ -1,10 +1,10 @@ -import Vue from 'vue' -import VueMeta from 'vue-meta' -import VueServerRenderer from 'vue-server-renderer' -import LRU from 'lru-cache' +const Vue = require('vue') +const VueMeta = require('vue-meta') +const VueServerRenderer = require('vue-server-renderer') +const LRU = require('lru-cache') -export default class MetaRenderer { +module.exports = class MetaRenderer { constructor(nuxt, renderer) { this.nuxt = nuxt this.renderer = renderer diff --git a/lib/core/module.js b/lib/core/module.js index 0ad7182279..2ce68de4e8 100755 --- a/lib/core/module.js +++ b/lib/core/module.js @@ -1,13 +1,13 @@ -import path from 'path' -import fs from 'fs' -import { uniq } from 'lodash' -import hash from 'hash-sum' -import { chainFn, sequence } from 'utils' -import Debug from 'debug' +const path = require('path') +const fs = require('fs') +const { uniq } = require('lodash') +const hash = require('hash-sum') +const { chainFn, sequence } = require('../common/utils') +const Debug = require('debug') const debug = Debug('nuxt:module') -export default class ModuleContainer { +module.exports = class ModuleContainer { constructor(nuxt) { this.nuxt = nuxt this.options = nuxt.options diff --git a/lib/core/nuxt.js b/lib/core/nuxt.js index 072f0f665a..f25d213c20 100644 --- a/lib/core/nuxt.js +++ b/lib/core/nuxt.js @@ -1,18 +1,19 @@ -import chalk from 'chalk' -import { Options } from 'common' -import { sequence } from 'utils' -import ModuleContainer from './module' -import Renderer from './renderer' -import Debug from 'debug' -import enableDestroy from 'server-destroy' -import Module from 'module' -import { isPlainObject } from 'lodash' -import { join, resolve } from 'path' +const Debug = require('debug') +const enableDestroy = require('server-destroy') +const Module = require('module') +const { isPlainObject } = require('lodash') +const chalk = require('chalk') +const { Options } = require('../common') +const { sequence } = require('../common/utils') +const { join, resolve } = require('path') +const { version } = require('../../package.json') +const ModuleContainer = require('./module') +const Renderer = require('./renderer') const debug = Debug('nuxt:') debug.color = 5 -export default class Nuxt { +module.exports = class Nuxt { constructor(options = {}) { this.options = Options.from(options) @@ -44,6 +45,10 @@ export default class Nuxt { this._ready = this.ready().catch(this.errorHandler) } + static get version() { + return version + } + async ready() { if (this._ready) { return this._ready diff --git a/lib/core/renderer.js b/lib/core/renderer.js index 4e70a4af5b..16187ff93e 100644 --- a/lib/core/renderer.js +++ b/lib/core/renderer.js @@ -1,20 +1,20 @@ -import ansiHTML from 'ansi-html' -import serialize from 'serialize-javascript' -import generateETag from 'etag' -import fresh from 'fresh' -import serveStatic from 'serve-static' -import compression from 'compression' -import _ from 'lodash' -import { join, resolve } from 'path' -import fs from 'fs-extra' -import { createBundleRenderer } from 'vue-server-renderer' -import { getContext, setAnsiColors, isUrl, waitFor } from 'utils' -import Debug from 'debug' -import Youch from '@nuxtjs/youch' -import { SourceMapConsumer } from 'source-map' -import connect from 'connect' -import { Options } from 'common' -import MetaRenderer from './meta' +const ansiHTML = require('ansi-html') +const serialize = require('serialize-javascript') +const generateETag = require('etag') +const fresh = require('fresh') +const serveStatic = require('serve-static') +const compression = require('compression') +const _ = require('lodash') +const { join, resolve } = require('path') +const fs = require('fs-extra') +const { createBundleRenderer } = require('vue-server-renderer') +const { getContext, setAnsiColors, isUrl, waitFor } = require('../common/utils') +const Debug = require('debug') +const Youch = require('@nuxtjs/youch') +const { SourceMapConsumer } = require('source-map') +const connect = require('connect') +const { Options } = require('../common') +const MetaRenderer = require('./meta') const debug = Debug('nuxt:render') debug.color = 4 // Force blue color @@ -23,7 +23,7 @@ setAnsiColors(ansiHTML) let jsdom = null -export default class Renderer { +module.exports = class Renderer { constructor(nuxt) { this.nuxt = nuxt this.options = nuxt.options @@ -126,6 +126,7 @@ export default class Renderer { get isResourcesAvailable() { // Required for both + /* istanbul ignore if */ if (!this.resources.clientManifest) { return false } @@ -223,7 +224,7 @@ export default class Renderer { // open in editor for debug mode only const _this = this - if (this.options.debug) { + if (this.options.debug && this.options.dev) { this.useMiddleware({ path: '_open', handler(req, res) { @@ -417,9 +418,11 @@ export default class Renderer { if (line) { frame.lineNumber = line } + /* istanbul ignore if */ if (column) { frame.columnNumber = column } + /* istanbul ignore if */ if (name) { frame.functionName = name } diff --git a/lib/index.js b/lib/index.js index aa7df41b13..f0b416e198 100755 --- a/lib/index.js +++ b/lib/index.js @@ -1,4 +1,11 @@ -import * as core from './core' -import * as builder from './builder' +/*! + * Nuxt.js + * (c) 2016-2017 Chopin Brothers + * Core maintainer: Pooya Parsa (@pi0) + * Released under the MIT License. + */ -export default Object.assign({}, core, builder) +const core = require('./core') +const builder = require('./builder') + +module.exports = Object.assign({}, core, builder) diff --git a/package.json b/package.json index 49834d0aab..296d20925c 100644 --- a/package.json +++ b/package.json @@ -13,7 +13,7 @@ "name": "Pooya Parsa (@pi0)" } ], - "main": "./index.js", + "main": "./lib/index.js", "license": "MIT", "repository": { "type": "git", @@ -21,9 +21,7 @@ }, "files": [ "bin", - "dist", - "lib", - "index.js" + "lib" ], "keywords": [ "nuxt", @@ -47,30 +45,24 @@ ] }, "scripts": { - "test": "npm run lint && cross-env NODE_ENV=test npm run build:nuxt && nyc ava --verbose --serial test/ -- && nyc report --reporter=html", + "test": "npm run lint && nyc ava --verbose --serial test/ -- && nyc report --reporter=html", "coverage": "nyc report --reporter=text-lcov > coverage.lcov && codecov", - "lint": "eslint --ext .js,.vue bin/ lib/ test/ examples/", - "build": "rimraf dist/ && npm run build:nuxt && npm run build:core", - "build:nuxt": "rollup -c build/rollup.config.js --environment TARGET:nuxt", - "build:core": "rollup -c build/rollup.config.js --environment TARGET:core", - "watch": "npm run build:nuxt -- -w", - "make-start": "node ./build/start.js", + "lint": "eslint --ext .js,.vue bin/* build/ lib/ test/ examples/", "precommit": "npm run lint", - "postinstall": "opencollective postinstall || exit 0", - "release-next": "npm run build && node ./build/release-next && npm publish --tag next" + "postinstall": "opencollective postinstall || exit 0" }, "engines": { - "node": ">=6.11", - "npm": ">=3.10.0" + "node": ">=8.0.0", + "npm": ">=5.0.0" }, "dependencies": { "@nuxtjs/youch": "^3.1.0", "ansi-html": "^0.0.7", - "autoprefixer": "^7.1.6", + "autoprefixer": "^7.2.2", "babel-core": "^6.26.0", "babel-loader": "^7.1.2", - "babel-preset-vue-app": "^1.3.1", - "caniuse-lite": "^1.0.30000758", + "babel-preset-vue-app": "^2.0.0", + "caniuse-lite": "^1.0.30000782", "chalk": "^2.3.0", "chokidar": "^1.7.0", "clone": "^2.1.1", @@ -84,10 +76,10 @@ "file-loader": "^1.1.5", "fresh": "^0.5.2", "friendly-errors-webpack-plugin": "^1.6.1", - "fs-extra": "^4.0.2", + "fs-extra": "^5.0.0", "glob": "^7.1.2", "hash-sum": "^1.0.2", - "html-minifier": "^3.5.6", + "html-minifier": "3.5.7", "html-webpack-plugin": "^2.30.1", "lodash": "^4.17.4", "lru-cache": "^4.1.1", @@ -95,70 +87,62 @@ "minimist": "^1.2.0", "open-in-editor": "^2.2.0", "opencollective": "^1.0.3", - "pify": "^3.0.0", "postcss": "^6.0.14", "postcss-cssnext": "^3.0.2", "postcss-import": "^11.0.0", "postcss-loader": "^2.0.8", - "postcss-url": "^7.2.1", + "postcss-url": "^7.3.0", "pretty-error": "^2.1.1", "progress-bar-webpack-plugin": "^1.10.0", "serialize-javascript": "^1.4.0", "serve-static": "^1.13.1", "server-destroy": "^1.0.1", "source-map": "^0.6.1", - "source-map-support": "^0.5.0", - "style-resources-loader": "^0.3.0", - "uglifyjs-webpack-plugin": "^1.0.1", + "style-resources-loader": "^1.0.0", + "uglifyjs-webpack-plugin": "^1.1.2", "url-loader": "^0.6.2", - "vue": "^2.5.6", + "vue": "^2.5.9", "vue-loader": "^13.5.0", - "vue-meta": "^1.3.1", + "vue-meta": "^1.4.0", "vue-router": "^3.0.1", - "vue-server-renderer": "^2.5.6", - "vue-template-compiler": "^2.5.6", + "vue-server-renderer": "^2.5.9", + "vue-template-compiler": "^2.5.9", "vuex": "^3.0.1", - "webpack": "^3.8.1", + "webpack": "^3.10.0", "webpack-bundle-analyzer": "^2.9.0", - "webpack-dev-middleware": "^1.12.0", - "webpack-hot-middleware": "^2.20.0", + "webpack-dev-middleware": "^1.12.2", + "webpack-hot-middleware": "^2.21.0", "webpack-node-externals": "^1.6.0" }, "devDependencies": { - "ava": "^0.23.0", - "babel-eslint": "^8.0.1", + "ava": "^0.24.0", + "babel-eslint": "^8.0.3", "babel-plugin-array-includes": "^2.0.3", "babel-plugin-external-helpers": "^6.22.0", "babel-plugin-istanbul": "^4.1.5", "codecov": "^3.0.0", "copy-webpack-plugin": "^4.2.0", "cross-env": "^5.1.1", - "eslint": "^4.10.0", - "eslint-config-standard": "^10.2.1", + "eslint": "^4.13.1", + "eslint-config-standard": "^11.0.0-beta.0", + "eslint-config-standard-jsx": "^4.0.2", "eslint-plugin-html": "^4.0.1", "eslint-plugin-import": "^2.8.0", "eslint-plugin-node": "^5.2.1", "eslint-plugin-promise": "^3.6.0", + "eslint-plugin-react": "^7.5.1", "eslint-plugin-standard": "^3.0.1", "express": "^4.16.2", "finalhandler": "^1.1.0", - "jsdom": "^11.3.0", + "jsdom": "^11.5.1", "json-loader": "^0.5.7", "nyc": "^11.3.0", "puppeteer": "^0.13.0", "request": "^2.83.0", "request-promise-native": "^1.0.5", - "rimraf": "^2.6.2", - "rollup": "^0.51.7", - "rollup-plugin-alias": "^1.4.0", - "rollup-plugin-babel": "^3.0.2", - "rollup-plugin-commonjs": "^8.2.6", - "rollup-plugin-node-resolve": "^3.0.0", - "rollup-plugin-replace": "^2.0.0", - "rollup-watch": "^4.3.1", "sinon": "^4.1.2", "std-mocks": "^1.0.1", - "uglify-js": "^3.1.7" + "uglify-js": "^3.2.2" }, "collective": { "type": "opencollective", diff --git a/build/release-next.js b/scripts/release-next old mode 100644 new mode 100755 similarity index 93% rename from build/release-next.js rename to scripts/release-next index e34338d755..618caa40bf --- a/build/release-next.js +++ b/scripts/release-next @@ -1,4 +1,5 @@ #!/usr/bin/env node + const { readFileSync, writeFileSync } = require('fs-extra') const { resolve } = require('path') const { spawnSync } = require('child_process') @@ -16,12 +17,12 @@ const originalPackage = readFileSync(packagePath, 'utf-8') const p = JSON.parse(originalPackage) // Change package name -p.name = 'nuxt-next' +// p.name = 'nuxt-next' // Get latest git commit id const gitCommit = String(spawnSync('git', 'rev-parse --short HEAD'.split(' ')).stdout).trim() -// Version with git tag +// Version with latest git commit id p.version = p.version.split('-')[0] + '-gh-' + gitCommit // Write package.json diff --git a/build/start.js b/scripts/start similarity index 94% rename from build/start.js rename to scripts/start index 9f5eaecc28..aa8e474aec 100755 --- a/build/start.js +++ b/scripts/start @@ -3,7 +3,7 @@ const now = Date.now() const { readFileSync, readJSONSync, writeFileSync, copySync, removeSync } = require('fs-extra') -const { resolve, relative } = require('path') +const { resolve } = require('path') // Dirs const rootDir = resolve(__dirname, '..') @@ -42,6 +42,7 @@ requires = requires.filter(r => excludes.indexOf(r) === -1) let dependencies = {} requires.forEach(r => { if (!packageJSON.dependencies[r]) { + // eslint-disable-next-line no-console console.warn('Cannot resolve dependency version for ' + r) return } @@ -104,5 +105,5 @@ writeFileSync(startIndexjs, String(readFileSync(startIndexjs)).replace('./dist/n const binStart = resolve(startDir, 'bin/nuxt-start') writeFileSync(binStart, String(readFileSync(binStart)).replace(/nuxt start/g, 'nuxt-start')) -const ms = Date.now() - now -console.log(`Generated ${packageJSON.name}@${packageJSON.version} in ${ms}ms`) +// eslint-disable-next-line no-console +console.log(`Generated ${packageJSON.name}@${packageJSON.version} in ${Date.now() - now}ms`) diff --git a/test/basic.config.defaults.test.js b/test/basic.config.defaults.test.js new file mode 100644 index 0000000000..5f7136119c --- /dev/null +++ b/test/basic.config.defaults.test.js @@ -0,0 +1,14 @@ +import test from 'ava' +import { resolve } from 'path' +import { Nuxt, Options } from '..' +import { version } from '../package.json' + +test('Nuxt.version is same as package', t => { + t.is(Nuxt.version, version) +}) + +test('modulesDir uses /node_modules as default if not set', async t => { + const options = Options.from({}) + const currentNodeModulesDir = resolve(__dirname, '..', 'node_modules') + t.true(options.modulesDir.includes(currentNodeModulesDir)) +}) diff --git a/test/basic.csr.test.js b/test/basic.csr.test.js index da09e77a1b..94fada4228 100644 --- a/test/basic.csr.test.js +++ b/test/basic.csr.test.js @@ -1,6 +1,6 @@ import test from 'ava' import { resolve } from 'path' -import { Nuxt, Builder } from '../index' +import { Nuxt, Builder } from '..' import * as browser from './helpers/browser' const port = 4003 @@ -143,6 +143,15 @@ test('/redirect2', async t => { t.is(await page.$text('h1'), 'Index page') }) +test('/redirect3', async t => { + // New page for redirecting to external link. + const page = await browser.page(url('/')) + await page.nuxt.navigate('/redirect3', false) + await page.waitForFunction(() => window.location.href === 'https://nuxtjs.org/') + page.close() + t.pass() +}) + test('/no-ssr', async t => { await page.nuxt.navigate('/no-ssr') @@ -170,6 +179,12 @@ test('/fn-midd?please=true', async t => { t.true(h1.includes('Date:')) }) +test('/router-guard', async t => { + await page.nuxt.navigate('/router-guard') + + t.is(await page.$text('p'), 'Nuxt.js') +}) + // Close server and ask nuxt to stop listening to file changes test.after('Closing server and nuxt.js', t => { nuxt.close() diff --git a/test/basic.dev.test.js b/test/basic.dev.test.js index a415ed4322..53a46c6f6e 100644 --- a/test/basic.dev.test.js +++ b/test/basic.dev.test.js @@ -1,18 +1,26 @@ import test from 'ava' import { resolve } from 'path' +import stdMocks from 'std-mocks' // import rp from 'request-promise-native' -import { Nuxt, Builder } from '../index.js' +import { Nuxt, Builder, Utils } from '..' +import { truncateSync, readFileSync, writeFileSync } from 'fs' const port = 4001 const url = (route) => 'http://localhost:' + port + route +const rootDir = resolve(__dirname, 'fixtures/basic') +const pluginPath = resolve(rootDir, 'plugins', 'watch.js') +const pluginContent = readFileSync(pluginPath) let nuxt = null // Init nuxt.js and create server listening on localhost:4000 test.before('Init Nuxt.js', async t => { const options = { - rootDir: resolve(__dirname, 'fixtures/basic'), - dev: true + rootDir, + dev: true, + plugins: [ + '~/plugins/watch.js' + ] } nuxt = new Nuxt(options) await new Builder(nuxt).build() @@ -20,6 +28,29 @@ test.before('Init Nuxt.js', async t => { await nuxt.listen(port, 'localhost') }) +test('remove mixins in live reloading', async t => { + stdMocks.use() + await nuxt.renderRoute(url('/')) + t.true(stdMocks.flush().stdout.some(v => v === 'I am mixin\n')) + + truncateSync(pluginPath) + await new Promise(async (resolve, reject) => { + let waitTimes = 0 + while (!stdMocks.flush().stdout.some(v => ~v.indexOf('Compiled successfully'))) { + await Utils.waitFor(100) && waitTimes++ + if (waitTimes === 20) { + reject(Error('Dev server doesn\'t reload after 2000ms')) + } + } + resolve() + }) + + await nuxt.renderRoute(url('/')) + t.false(stdMocks.flush().stdout.some(v => v === 'I am mixin\n')) + + stdMocks.restore() +}) + test('/stateless', async t => { const window = await nuxt.renderAndGetWindow(url('/stateless')) const html = window.document.body.innerHTML @@ -37,5 +68,6 @@ test('/stateless', async t => { // Close server and ask nuxt to stop listening to file changes test.after('Closing server and nuxt.js', async t => { + writeFileSync(pluginPath, pluginContent) await nuxt.close() }) diff --git a/test/basic.fail.generate.test.js b/test/basic.fail.generate.test.js index e5386e0bcf..79653d3593 100644 --- a/test/basic.fail.generate.test.js +++ b/test/basic.fail.generate.test.js @@ -1,6 +1,6 @@ import test from 'ava' import { resolve } from 'path' -import { Nuxt, Builder, Generator } from '../index.js' +import { Nuxt, Builder, Generator } from '..' test('Fail with routes() which throw an error', async t => { const options = { diff --git a/test/basic.generate.nosubfolders.test.js b/test/basic.generate.nosubfolders.test.js index ce9c1d813a..5aeb01a16f 100644 --- a/test/basic.generate.nosubfolders.test.js +++ b/test/basic.generate.nosubfolders.test.js @@ -5,7 +5,7 @@ import http from 'http' import serveStatic from 'serve-static' import finalhandler from 'finalhandler' import rp from 'request-promise-native' -import { Nuxt, Builder, Generator } from '../index.js' +import { Nuxt, Builder, Generator } from '..' const port = 4002 const url = (route) => 'http://localhost:' + port + route diff --git a/test/basic.generate.test.js b/test/basic.generate.test.js index 0e1020847e..877cd1c52a 100644 --- a/test/basic.generate.test.js +++ b/test/basic.generate.test.js @@ -5,7 +5,7 @@ import http from 'http' import serveStatic from 'serve-static' import finalhandler from 'finalhandler' import rp from 'request-promise-native' -import { Nuxt, Builder, Generator } from '../index.js' +import { Nuxt, Builder, Generator } from '..' const port = 4002 const url = (route) => 'http://localhost:' + port + route diff --git a/test/basic.ssr.test.js b/test/basic.ssr.test.js index b6a7b779fa..0e5a98b237 100755 --- a/test/basic.ssr.test.js +++ b/test/basic.ssr.test.js @@ -1,7 +1,7 @@ import test from 'ava' import { resolve } from 'path' import rp from 'request-promise-native' -import { Nuxt, Builder } from '../index.js' +import { Nuxt, Builder } from '..' import { interceptLog, interceptError } from './helpers/console' const port = 4003 @@ -121,6 +121,19 @@ test('/redirect -> check redirected source', async t => { t.true(html.includes('

      Index page

      ')) }) +test('/redirect -> external link', async t => { + const headers = {} + const { html } = await nuxt.renderRoute('/redirect3', { + res: { + setHeader(k, v) { + headers[k] = v + } + } + }) + t.is(headers.Location, 'https://nuxtjs.org') + t.true(html.includes('
      Redirecting to external page.
      ')) +}) + test('/special-state -> check window.__NUXT__.test = true', async t => { const window = await nuxt.renderAndGetWindow(url('/special-state')) t.is(window.document.title, 'Nuxt.js') @@ -228,6 +241,22 @@ test('/fn-midd?please=true', async t => { t.true(html.includes('

      Date:')) }) +test('/router-guard', async t => { + const { html } = await nuxt.renderRoute('/router-guard') + t.true(html.includes('

      Nuxt.js

      ')) + t.false(html.includes('Router Guard')) +}) + +test('/jsx', async t => { + const { html } = await nuxt.renderRoute('/jsx') + t.true(html.includes('

      JSX Page

      ')) +}) + +test('/js-link', async t => { + const { html } = await nuxt.renderRoute('/js-link') + t.true(html.includes('

      vue file is first-class

      ')) +}) + // Close server and ask nuxt to stop listening to file changes test.after('Closing server and nuxt.js', async t => { await nuxt.close() diff --git a/test/children.patch.test.js b/test/children.patch.test.js index a66cfbf6ce..46bb123526 100644 --- a/test/children.patch.test.js +++ b/test/children.patch.test.js @@ -1,6 +1,6 @@ import test from 'ava' import { resolve } from 'path' -import { Nuxt, Builder, Utils } from '../index.js' +import { Nuxt, Builder, Utils } from '..' import * as browser from './helpers/browser' const port = 4005 diff --git a/test/children.test.js b/test/children.test.js index c648702798..25fddc71a9 100644 --- a/test/children.test.js +++ b/test/children.test.js @@ -1,6 +1,6 @@ import test from 'ava' import { resolve } from 'path' -import { Nuxt, Builder } from '../index.js' +import { Nuxt, Builder } from '..' const port = 4004 // const url = (route) => 'http://localhost:' + port + route diff --git a/test/cli.test.js b/test/cli.test.js index 2fe743cb2f..4e47ba0227 100644 --- a/test/cli.test.js +++ b/test/cli.test.js @@ -1,11 +1,11 @@ +import { promisify } from 'util' import test from 'ava' import { resolve, sep } from 'path' import rp from 'request-promise-native' -import { Utils } from '../index.js' -import pify from 'pify' import { exec, spawn } from 'child_process' +import { Utils } from '..' -const execify = pify(exec, { multiArgs: true }) +const execify = promisify(exec) const rootDir = resolve(__dirname, 'fixtures/basic') const port = 4011 @@ -14,7 +14,7 @@ const url = (route) => 'http://localhost:' + port + route test('bin/nuxt-build', async t => { const binBuild = resolve(__dirname, '..', 'bin', 'nuxt-build') - const [ stdout, stderr ] = await execify(`node ${binBuild} ${rootDir}`) + const { stdout, stderr } = await execify(`node ${binBuild} ${rootDir}`) t.true(stdout.includes('server-bundle.json')) t.true(stderr.includes('Building done')) @@ -82,7 +82,7 @@ test('bin/nuxt-start', async t => { test('bin/nuxt-generate', async t => { const binGenerate = resolve(__dirname, '..', 'bin', 'nuxt-generate') - const [ stdout, stderr ] = await execify(`node ${binGenerate} ${rootDir}`) + const { stdout, stderr } = await execify(`node ${binGenerate} ${rootDir}`) t.true(stdout.includes('server-bundle.json')) t.true(stderr.includes('Destination folder cleaned')) diff --git a/test/debug.test.js b/test/debug.test.js index 189721bc16..e198c9642e 100644 --- a/test/debug.test.js +++ b/test/debug.test.js @@ -1,7 +1,7 @@ import test from 'ava' import { resolve } from 'path' import rp from 'request-promise-native' -import { Nuxt, Builder } from '../index.js' +import { Nuxt, Builder } from '..' const port = 4009 const url = (route) => 'http://localhost:' + port + route @@ -13,7 +13,7 @@ test.before('Init Nuxt.js', async t => { const rootDir = resolve(__dirname, 'fixtures/debug') let config = require(resolve(rootDir, 'nuxt.config.js')) config.rootDir = rootDir - config.dev = false + config.dev = true // Needed for _open middleware nuxt = new Nuxt(config) await new Builder(nuxt).build() @@ -38,6 +38,30 @@ test('/test/error should return error stack trace (Youch)', async t => { t.true(error.includes('
      ')) }) +test('/test/error no source-map (Youch)', async t => { + const sourceMaps = nuxt.renderer.resources.serverBundle.maps + nuxt.renderer.resources.serverBundle.maps = {} + + const { response, error } = await t.throws(nuxt.renderAndGetWindow(url('/test/error'))) + t.is(response.statusCode, 500) + t.is(response.statusMessage, 'NuxtServerError') + t.true(error.includes('test youch !')) + t.true(error.includes('
      ')) + + nuxt.renderer.resources.serverBundle.maps = sourceMaps +}) + +test('/test/error should return json format error (Youch)', async t => { + const opts = { + headers: { + 'accept': 'application/json' + }, + resolveWithFullResponse: true + } + const { response: { headers } } = await t.throws(rp(url('/test/error'), opts)) + t.is(headers['content-type'], 'text/json; charset=utf-8') +}) + // Close server and ask nuxt to stop listening to file changes test.after('Closing server and nuxt.js', t => { nuxt.close() diff --git a/test/deprecate.test.js b/test/deprecate.test.js index e6ae186066..8cf3d1b71e 100755 --- a/test/deprecate.test.js +++ b/test/deprecate.test.js @@ -2,7 +2,7 @@ import test from 'ava' import stdMocks from 'std-mocks' import { resolve } from 'path' import rp from 'request-promise-native' -import { Nuxt, Builder } from '../index.js' +import { Nuxt, Builder } from '..' const port = 4010 const url = (route) => 'http://localhost:' + port + route diff --git a/test/dll.test.js b/test/dll.test.js index 98d33bef99..688534b125 100644 --- a/test/dll.test.js +++ b/test/dll.test.js @@ -1,11 +1,11 @@ +import { promisify } from 'util' import test from 'ava' import { resolve } from 'path' import fs from 'fs' -import pify from 'pify' import stdMocks from 'std-mocks' -import { Nuxt, Builder } from '../index.js' +import { Nuxt, Builder } from '..' -const readFile = pify(fs.readFile) +const readFile = promisify(fs.readFile) const rootDir = resolve(__dirname, './fixtures/dll') const dllDir = resolve(rootDir, '.cache/client-dll') diff --git a/test/dynamic-routes.test.js b/test/dynamic-routes.test.js index 0d5b98737f..c705f5eb62 100644 --- a/test/dynamic-routes.test.js +++ b/test/dynamic-routes.test.js @@ -1,10 +1,10 @@ import test from 'ava' import { resolve } from 'path' import fs from 'fs' -import pify from 'pify' -import { Nuxt, Builder } from '../index.js' +import { Nuxt, Builder } from '..' +import { promisify } from 'util' -const readFile = pify(fs.readFile) +const readFile = promisify(fs.readFile) test.before('Init Nuxt.js', async t => { const nuxt = new Nuxt({ diff --git a/test/error.test.js b/test/error.test.js index 96bea41a2f..7a81f2d96a 100644 --- a/test/error.test.js +++ b/test/error.test.js @@ -1,6 +1,7 @@ import test from 'ava' import { resolve } from 'path' -import { Nuxt, Builder } from '../index.js' +import rp from 'request-promise-native' +import { Nuxt, Builder } from '..' const port = 4005 const url = (route) => 'http://localhost:' + port + route @@ -38,6 +39,17 @@ test('/ with renderAndGetWindow()', async t => { t.is(err.response.statusMessage, 'NuxtServerError') }) +test('/ with text/json content', async t => { + const opts = { + headers: { + 'accept': 'application/json' + }, + resolveWithFullResponse: true + } + const { response: { headers } } = await t.throws(rp(url('/'), opts)) + t.is(headers['content-type'], 'text/json; charset=utf-8') +}) + // Close server and ask nuxt to stop listening to file changes test.after('Closing server and nuxt.js', t => { nuxt.close() diff --git a/test/express.test.js b/test/express.test.js index 531aa606a0..676e931ee3 100644 --- a/test/express.test.js +++ b/test/express.test.js @@ -1,6 +1,6 @@ import test from 'ava' import { resolve } from 'path' -import { Nuxt, Builder } from '../index.js' +import { Nuxt, Builder } from '..' import express from 'express' import rp from 'request-promise-native' diff --git a/test/fixtures/basic/nuxt.config.js b/test/fixtures/basic/nuxt.config.js index 369382e815..439bec51ea 100644 --- a/test/fixtures/basic/nuxt.config.js +++ b/test/fixtures/basic/nuxt.config.js @@ -20,6 +20,7 @@ module.exports = { }, transition: false, build: { + scopeHoisting: true, postcss: [ require('postcss-cssnext')() ] diff --git a/test/fixtures/basic/pages/js-link.js b/test/fixtures/basic/pages/js-link.js new file mode 100644 index 0000000000..efba7fa697 --- /dev/null +++ b/test/fixtures/basic/pages/js-link.js @@ -0,0 +1,2 @@ +export default { +} diff --git a/test/fixtures/basic/pages/js-link.vue b/test/fixtures/basic/pages/js-link.vue new file mode 100644 index 0000000000..f69c87b3c5 --- /dev/null +++ b/test/fixtures/basic/pages/js-link.vue @@ -0,0 +1,5 @@ + + + diff --git a/test/fixtures/basic/pages/jsx.js b/test/fixtures/basic/pages/jsx.js new file mode 100644 index 0000000000..88923dce9d --- /dev/null +++ b/test/fixtures/basic/pages/jsx.js @@ -0,0 +1,7 @@ +export default { + render() { + return
      +

      JSX Page

      +
      + } +} diff --git a/test/fixtures/basic/pages/redirect3.vue b/test/fixtures/basic/pages/redirect3.vue new file mode 100644 index 0000000000..1f587681d5 --- /dev/null +++ b/test/fixtures/basic/pages/redirect3.vue @@ -0,0 +1,11 @@ + + + diff --git a/test/fixtures/basic/pages/router-guard.vue b/test/fixtures/basic/pages/router-guard.vue new file mode 100644 index 0000000000..ae5e319c1f --- /dev/null +++ b/test/fixtures/basic/pages/router-guard.vue @@ -0,0 +1,11 @@ + + + diff --git a/test/fixtures/basic/plugins/watch.js b/test/fixtures/basic/plugins/watch.js new file mode 100644 index 0000000000..b243a212ab --- /dev/null +++ b/test/fixtures/basic/plugins/watch.js @@ -0,0 +1,12 @@ +import Vue from 'vue' + +const Plugin = { + install(Vue) { + Vue.mixin({ + created() { + console.log('I am mixin') // eslint-disable-line no-console + } + }) + } +} +Vue.use(Plugin) diff --git a/test/fixtures/debug/nuxt.config.js b/test/fixtures/debug/nuxt.config.js index 2bb2464225..2e05a7cd6e 100644 --- a/test/fixtures/debug/nuxt.config.js +++ b/test/fixtures/debug/nuxt.config.js @@ -3,9 +3,6 @@ module.exports = { base: '/test/' }, debug: true, - build: { - scopeHoisting: true - }, editor: { cmd: 'echo', pattern: '' diff --git a/test/fixtures/module/modules/middleware/use-middleware.js b/test/fixtures/module/modules/middleware/use-middleware.js new file mode 100644 index 0000000000..f6156520c3 --- /dev/null +++ b/test/fixtures/module/modules/middleware/use-middleware.js @@ -0,0 +1,3 @@ +module.exports = function (req, res, next) { + res.end('Use external middleware') +} diff --git a/test/fixtures/module/nuxt.config.js b/test/fixtures/module/nuxt.config.js index 63b3a2f62a..60ff0fecee 100755 --- a/test/fixtures/module/nuxt.config.js +++ b/test/fixtures/module/nuxt.config.js @@ -21,5 +21,12 @@ module.exports = { hook('build:done', builder => { builder.__build_done__ = true }) + // Add hook for renderer + hook('render:before', (renderer) => { + renderer.useMiddleware({ + path: '/use-middleware', + handler: '~/modules/middleware/use-middleware' + }) + }) } } diff --git a/test/fixtures/with-config/nuxt.config.js b/test/fixtures/with-config/nuxt.config.js index bd564d5e8a..37db356a99 100644 --- a/test/fixtures/with-config/nuxt.config.js +++ b/test/fixtures/with-config/nuxt.config.js @@ -42,12 +42,21 @@ module.exports = { } }, build: { - // extractCSS: true, publicPath: '/orion/', analyze: { analyzerMode: 'disabled', generateStatsFile: true }, + styleResources: { + patterns: [ + '~/assets/pre-process.scss' + ] + }, + babel: { + presets({ isServer }) { + return null // Coverage: Return null, so defaults will be used. + } + }, extend(config, options) { return Object.assign({}, config, { devtool: 'nosources-source-map' diff --git a/test/generator.test.js b/test/generator.test.js new file mode 100644 index 0000000000..9ebbed4235 --- /dev/null +++ b/test/generator.test.js @@ -0,0 +1,76 @@ +import test from 'ava' +import { Nuxt, Generator } from '..' + +test('initRoutes with routes (fn => array)', async t => { + const array = ['/1', '/2', '/3', '/4'] + const config = { + generate: { + routes: array + } + } + const nuxt = new Nuxt(config) + const generator = new Generator(nuxt) + const routes = await generator.initRoutes() + + t.is(routes.length, array.length) + routes.map((route, index) => { + t.is(route.route, array[index]) + }) +}) + +test('initRoutes with routes (fn())', async t => { + const array = ['/1', '/2', '/3', '/4'] + const config = { + generate: { + routes() { + return array + } + } + } + const nuxt = new Nuxt(config) + const generator = new Generator(nuxt) + const routes = await generator.initRoutes() + + t.is(routes.length, array.length) + routes.map((route, index) => { + t.is(route.route, array[index]) + }) +}) + +test('initRoutes with routes (fn(args))', async t => { + const config = { + generate: { + routes(array) { + return array + } + } + } + const nuxt = new Nuxt(config) + const generator = new Generator(nuxt) + const array = ['/1', '/2', '/3', '/4'] + const routes = await generator.initRoutes(array) + + t.is(routes.length, array.length) + routes.map((route, index) => { + t.is(route.route, array[index]) + }) +}) + +test('initRoutes with routes (fn(cb, args))', async t => { + const config = { + generate: { + routes(cb, arg1, arg2, arg3, arg4) { + cb(null, [ arg1, arg2, arg3, arg4 ]) + } + } + } + const nuxt = new Nuxt(config) + const generator = new Generator(nuxt) + const array = ['/1', '/2', '/3', '/4'] + const routes = await generator.initRoutes(...array) + + t.is(routes.length, array.length) + routes.map((route, index) => { + t.is(route.route, array[index]) + }) +}) diff --git a/test/index.test.js b/test/index.test.js index c30f96be7e..03632bdcb0 100644 --- a/test/index.test.js +++ b/test/index.test.js @@ -1,6 +1,6 @@ import test from 'ava' import { resolve } from 'path' -import { Nuxt, Builder } from '../index.js' +import { Nuxt, Builder } from '..' test('Nuxt.js Class', t => { t.is(typeof Nuxt, 'function') diff --git a/test/module.test.js b/test/module.test.js index d8fceedfb1..d26d6c58d9 100755 --- a/test/module.test.js +++ b/test/module.test.js @@ -2,7 +2,7 @@ import test from 'ava' import stdMocks from 'std-mocks' import { resolve, normalize } from 'path' import rp from 'request-promise-native' -import { Nuxt, Builder } from '../index.js' +import { Nuxt, Builder } from '..' const port = 4006 const url = (route) => 'http://localhost:' + port + route @@ -63,6 +63,11 @@ test('Hooks - Error', async t => { t.true(errors.length === 1) }) +test('Hooks - Use external middleware before render', async t => { + let response = await rp(url('/use-middleware')) + t.is(response, 'Use external middleware') +}) + // Close server and ask nuxt to stop listening to file changes test.after('Closing server and nuxt.js', t => { nuxt.close() diff --git a/test/spa.test.js b/test/spa.test.js index 8188960bb8..661aa5cc8a 100755 --- a/test/spa.test.js +++ b/test/spa.test.js @@ -1,6 +1,6 @@ import test from 'ava' import stdMocks from 'std-mocks' -import { Nuxt, Builder } from '../index.js' +import { Nuxt, Builder } from '..' let nuxt = null @@ -47,6 +47,12 @@ test('/custom (call mounted and created once)', async t => { t.true(mounts.length === 1) }) +test('/_nuxt/ (access publicPath in spa mode)', async t => { + const { response: { statusCode, statusMessage } } = await t.throws(renderRoute('/_nuxt/')) + t.is(statusCode, 404) + t.is(statusMessage, 'ResourceNotFound') +}) + // Close server and ask nuxt to stop listening to file changes test.after('Closing server and nuxt.js', t => { nuxt.close() diff --git a/test/utils.test.js b/test/utils.test.js index e96253bb6a..c21244f7a6 100644 --- a/test/utils.test.js +++ b/test/utils.test.js @@ -1,6 +1,6 @@ import test from 'ava' import ansiHTML from 'ansi-html' -import { Utils } from '../index.js' +import { Utils } from '..' test('encodeHtml', t => { const html = '

      Hello

      ' @@ -70,6 +70,21 @@ test('promisifyRoute (fn => promise)', t => { }) }) +test('promisifyRoute ((fn(args) => promise))', t => { + const fn = function (array) { + return new Promise((resolve) => { + resolve(array) + }) + } + const array = [1, 2, 3] + const promise = Utils.promisifyRoute(fn, array) + t.is(typeof promise, 'object') + return promise + .then((res) => { + t.is(res, array) + }) +}) + test('promisifyRoute (fn(cb) with error)', t => { const fn = function (cb) { cb(new Error('Error here')) @@ -82,6 +97,19 @@ test('promisifyRoute (fn(cb) with error)', t => { }) }) +test('promisifyRoute (fn(cb, args) with error)', t => { + const fn = function (cb, array) { + cb(new Error('Error here: ' + array.join())) + } + const array = [1, 2, 3, 4] + const promise = Utils.promisifyRoute(fn, array) + t.is(typeof promise, 'object') + return promise + .catch((e) => { + t.is(e.message, 'Error here: ' + array.join()) + }) +}) + test('promisifyRoute (fn(cb) with result)', t => { const array = [1, 2, 3, 4] const fn = function (cb) { @@ -95,6 +123,21 @@ test('promisifyRoute (fn(cb) with result)', t => { }) }) +test('promisifyRoute (fn(cb, args) with result)', t => { + const fn = function (cb, array, object) { + cb(null, { array, object }) + } + const array = [1, 2, 3, 4] + const object = { a: 1 } + const promise = Utils.promisifyRoute(fn, array, object) + t.is(typeof promise, 'object') + return promise + .then((res) => { + t.is(res.array, array) + t.is(res.object, object) + }) +}) + test('chainFn (mutate, mutate)', t => { // Pass more than one argument to test that they're actually taken into account const firstFn = function (obj, count) { diff --git a/test/with-config.test.js b/test/with-config.test.js index dadbcf664e..5904719f94 100644 --- a/test/with-config.test.js +++ b/test/with-config.test.js @@ -1,13 +1,14 @@ import test from 'ava' import { resolve } from 'path' import rp from 'request-promise-native' -import { Nuxt, Builder } from '../index.js' +import { Nuxt, Builder } from '..' import { interceptLog, release } from './helpers/console' const port = 4007 const url = (route) => 'http://localhost:' + port + route let nuxt = null +let builder = null // Init nuxt.js and create server listening on localhost:4000 test.before('Init Nuxt.js', async t => { @@ -16,11 +17,11 @@ test.before('Init Nuxt.js', async t => { config.rootDir = rootDir config.dev = false nuxt = new Nuxt(config) - + builder = new Builder(nuxt) await interceptLog('building nuxt', async () => { - await new Builder(nuxt).build() - await nuxt.listen(port, 'localhost') + await builder.build() }) + await nuxt.listen(port, 'localhost') }) test('/', async t => { @@ -177,6 +178,17 @@ test('Check /test.txt should return 404', async t => { t.is(err.response.statusCode, 404) }) +test('Check build.styleResources for style-resources-loader', async t => { + const loaders = builder.styleLoader('scss') + const loader = loaders.find(l => l.loader === 'style-resources-loader') + t.is(typeof loader, 'object') + t.deepEqual(loader.options, { + patterns: [ + '~/assets/pre-process.scss' + ] + }) +}) + // Close server and ask nuxt to stop listening to file changes test.after('Closing server and nuxt.js', async t => { await nuxt.close() diff --git a/yarn.lock b/yarn.lock index c2ab174a62..3a13a1509e 100644 --- a/yarn.lock +++ b/yarn.lock @@ -38,53 +38,54 @@ imurmurhash "^0.1.4" slide "^1.1.5" -"@babel/code-frame@7.0.0-beta.32", "@babel/code-frame@^7.0.0-beta.31": - version "7.0.0-beta.32" - resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.32.tgz#04f231b8ec70370df830d9926ce0f5add074ec4c" +"@babel/code-frame@7.0.0-beta.31": + version "7.0.0-beta.31" + resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0-beta.31.tgz#473d021ecc573a2cce1c07d5b509d5215f46ba35" dependencies: chalk "^2.0.0" esutils "^2.0.2" js-tokens "^3.0.0" -"@babel/helper-function-name@7.0.0-beta.32": - version "7.0.0-beta.32" - resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.32.tgz#6161af4419f1b4e3ed2d28c0c79c160e218be1f3" +"@babel/helper-function-name@7.0.0-beta.31": + version "7.0.0-beta.31" + resolved "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.0.0-beta.31.tgz#afe63ad799209989348b1109b44feb66aa245f57" dependencies: - "@babel/helper-get-function-arity" "7.0.0-beta.32" - "@babel/template" "7.0.0-beta.32" - "@babel/types" "7.0.0-beta.32" + "@babel/helper-get-function-arity" "7.0.0-beta.31" + "@babel/template" "7.0.0-beta.31" + "@babel/traverse" "7.0.0-beta.31" + "@babel/types" "7.0.0-beta.31" -"@babel/helper-get-function-arity@7.0.0-beta.32": - version "7.0.0-beta.32" - resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.32.tgz#93721a99db3757de575a83bab7c453299abca568" +"@babel/helper-get-function-arity@7.0.0-beta.31": + version "7.0.0-beta.31" + resolved "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0-beta.31.tgz#1176d79252741218e0aec872ada07efb2b37a493" dependencies: - "@babel/types" "7.0.0-beta.32" + "@babel/types" "7.0.0-beta.31" -"@babel/template@7.0.0-beta.32": - version "7.0.0-beta.32" - resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.32.tgz#e1d9fdbd2a7bcf128f2f920744a67dab18072495" +"@babel/template@7.0.0-beta.31": + version "7.0.0-beta.31" + resolved "https://registry.yarnpkg.com/@babel/template/-/template-7.0.0-beta.31.tgz#577bb29389f6c497c3e7d014617e7d6713f68bda" dependencies: - "@babel/code-frame" "7.0.0-beta.32" - "@babel/types" "7.0.0-beta.32" - babylon "7.0.0-beta.32" + "@babel/code-frame" "7.0.0-beta.31" + "@babel/types" "7.0.0-beta.31" + babylon "7.0.0-beta.31" lodash "^4.2.0" -"@babel/traverse@^7.0.0-beta.31": - version "7.0.0-beta.32" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.32.tgz#b78b754c6e1af3360626183738e4c7a05951bc99" +"@babel/traverse@7.0.0-beta.31": + version "7.0.0-beta.31" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.0.0-beta.31.tgz#db399499ad74aefda014f0c10321ab255134b1df" dependencies: - "@babel/code-frame" "7.0.0-beta.32" - "@babel/helper-function-name" "7.0.0-beta.32" - "@babel/types" "7.0.0-beta.32" - babylon "7.0.0-beta.32" + "@babel/code-frame" "7.0.0-beta.31" + "@babel/helper-function-name" "7.0.0-beta.31" + "@babel/types" "7.0.0-beta.31" + babylon "7.0.0-beta.31" debug "^3.0.1" globals "^10.0.0" invariant "^2.2.0" lodash "^4.2.0" -"@babel/types@7.0.0-beta.32", "@babel/types@^7.0.0-beta.31": - version "7.0.0-beta.32" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.32.tgz#c317d0ecc89297b80bbcb2f50608e31f6452a5ff" +"@babel/types@7.0.0-beta.31": + version "7.0.0-beta.31" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.0.0-beta.31.tgz#42c9c86784f674c173fb21882ca9643334029de4" dependencies: esutils "^2.0.2" lodash "^4.2.0" @@ -109,8 +110,8 @@ resolved "https://registry.yarnpkg.com/@std/esm/-/esm-0.16.0.tgz#2a7a33ecb7f1701cebd4c87df6d0d945ed51f730" "@types/node@*": - version "8.0.53" - resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.53.tgz#396b35af826fa66aad472c8cb7b8d5e277f4e6d8" + version "8.0.58" + resolved "https://registry.yarnpkg.com/@types/node/-/node-8.0.58.tgz#5b3881c0be3a646874803fee3197ea7f1ed6df90" abab@^1.0.3: version "1.0.4" @@ -175,8 +176,8 @@ ajv@^4.9.1: json-stable-stringify "^1.0.1" ajv@^5.0.0, ajv@^5.1.0, ajv@^5.1.5, ajv@^5.2.3, ajv@^5.3.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.4.0.tgz#32d1cf08dbc80c432f426f12e10b2511f6b46474" + version "5.5.1" + resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.1.tgz#b38bb8876d9e86bee994956a04e721e88b248eb2" dependencies: co "^4.6.0" fast-deep-equal "^1.0.0" @@ -209,10 +210,6 @@ ansi-escapes@^1.1.0: version "1.4.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-1.4.0.tgz#d3a8a83b319aa67793662b13e761c7911422306e" -ansi-escapes@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-2.0.0.tgz#5bae52be424878dd9783e8910e3fc2922e83c81b" - ansi-escapes@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.0.0.tgz#ec3e8b4e9f8064fc02c3ac9b65f1c275bda8ef92" @@ -311,6 +308,13 @@ array-flatten@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz#9a5f699051b1e7073328f2a008968b64ea2955d2" +array-includes@^3.0.3: + version "3.0.3" + resolved "https://registry.yarnpkg.com/array-includes/-/array-includes-3.0.3.tgz#184b48f62d92d7452bb31b323165c7f8bd02266d" + dependencies: + define-properties "^1.1.2" + es-abstract "^1.7.0" + array-union@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" @@ -329,6 +333,10 @@ arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" +asap@~2.0.3: + version "2.0.6" + resolved "https://registry.yarnpkg.com/asap/-/asap-2.0.6.tgz#e50347611d7e690943208bbdafebcbc2fb866d46" + asn1.js@^4.0.0: version "4.9.2" resolved "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.9.2.tgz#8117ef4f7ed87cd8f89044b5bff97ac243a16c9a" @@ -392,15 +400,15 @@ autoprefixer@^6.3.1: postcss "^5.2.16" postcss-value-parser "^3.2.3" -autoprefixer@^7.1.1, autoprefixer@^7.1.6: - version "7.1.6" - resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-7.1.6.tgz#fb933039f74af74a83e71225ce78d9fd58ba84d7" +autoprefixer@^7.1.1, autoprefixer@^7.2.2: + version "7.2.2" + resolved "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-7.2.2.tgz#082293b964be00602efacc59aa4aa7df5158bb6e" dependencies: - browserslist "^2.5.1" - caniuse-lite "^1.0.30000748" + browserslist "^2.10.0" + caniuse-lite "^1.0.30000780" normalize-range "^0.1.2" num2fraction "^1.2.2" - postcss "^6.0.13" + postcss "^6.0.14" postcss-value-parser "^3.2.3" ava-init@^0.2.0: @@ -413,15 +421,15 @@ ava-init@^0.2.0: read-pkg-up "^2.0.0" write-pkg "^3.1.0" -ava@^0.23.0: - version "0.23.0" - resolved "https://registry.yarnpkg.com/ava/-/ava-0.23.0.tgz#beed11730adef74a857761b62b8882bf16d5a038" +ava@^0.24.0: + version "0.24.0" + resolved "https://registry.yarnpkg.com/ava/-/ava-0.24.0.tgz#dd0ab33a0b3ad2ac582f55e9a61caf8bcf7a9af1" dependencies: "@ava/babel-preset-stage-4" "^1.1.0" "@ava/babel-preset-transform-test-files" "^3.0.0" "@ava/write-file-atomic" "^2.2.0" "@concordance/react" "^1.0.0" - ansi-escapes "^2.0.0" + ansi-escapes "^3.0.0" ansi-styles "^3.1.0" arr-flatten "^1.0.1" array-union "^1.0.1" @@ -430,6 +438,8 @@ ava@^0.23.0: auto-bind "^1.1.0" ava-init "^0.2.0" babel-core "^6.17.0" + babel-generator "^6.26.0" + babel-plugin-syntax-object-rest-spread "^6.13.0" bluebird "^3.0.0" caching-transform "^1.0.0" chalk "^2.0.1" @@ -463,7 +473,7 @@ ava@^0.23.0: is-ci "^1.0.7" is-generator-fn "^1.0.0" is-obj "^1.0.0" - is-observable "^0.2.0" + is-observable "^1.0.0" is-promise "^2.1.0" js-yaml "^3.8.2" last-line-stream "^1.0.0" @@ -487,12 +497,13 @@ ava@^0.23.0: require-precompiled "^0.1.0" resolve-cwd "^2.0.0" safe-buffer "^5.1.1" + semver "^5.4.1" slash "^1.0.0" - source-map-support "^0.4.0" + source-map-support "^0.5.0" stack-utils "^1.0.1" strip-ansi "^4.0.0" strip-bom-buf "^1.0.0" - supports-color "^4.0.0" + supports-color "^5.0.0" time-require "^0.1.2" trim-off-newlines "^1.0.1" unique-temp-dir "^1.0.0" @@ -542,14 +553,14 @@ babel-core@^6.17.0, babel-core@^6.26.0: slash "^1.0.0" source-map "^0.5.6" -babel-eslint@^8.0.1: - version "8.0.2" - resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-8.0.2.tgz#e44fb9a037d749486071d52d65312f5c20aa7530" +babel-eslint@^8.0.3: + version "8.0.3" + resolved "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-8.0.3.tgz#f29ecf02336be438195325cd47c468da81ee4e98" dependencies: - "@babel/code-frame" "^7.0.0-beta.31" - "@babel/traverse" "^7.0.0-beta.31" - "@babel/types" "^7.0.0-beta.31" - babylon "^7.0.0-beta.31" + "@babel/code-frame" "7.0.0-beta.31" + "@babel/traverse" "7.0.0-beta.31" + "@babel/types" "7.0.0-beta.31" + babylon "7.0.0-beta.31" babel-generator@^6.1.0, babel-generator@^6.18.0, babel-generator@^6.26.0: version "6.26.0" @@ -659,8 +670,8 @@ babel-helper-replace-supers@^6.24.1: babel-types "^6.24.1" babel-helper-vue-jsx-merge-props@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.2.tgz#aceb1c373588279e2755ea1cfd35c22394fd33f8" + version "2.0.3" + resolved "https://registry.yarnpkg.com/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-2.0.3.tgz#22aebd3b33902328e513293a8e4992b384f9f1b6" babel-helpers@^6.24.1: version "6.24.1" @@ -731,10 +742,6 @@ babel-plugin-jsx-v-model@^2.0.1: html-tags "^2.0.0" svg-tags "^1.0.0" -babel-plugin-jsx-vue-functional@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/babel-plugin-jsx-vue-functional/-/babel-plugin-jsx-vue-functional-2.1.0.tgz#5630a0c86fe1904d28c30465e6bf1cf71235a239" - babel-plugin-syntax-async-functions@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz#cad9cad1191b5ad634bf30ae0872391e0647be95" @@ -751,7 +758,7 @@ babel-plugin-syntax-jsx@^6.18.0: version "6.18.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-jsx/-/babel-plugin-syntax-jsx-6.18.0.tgz#0af32a9a6e13ca7a3fd5069e62d7b0f58d0d8946" -babel-plugin-syntax-object-rest-spread@^6.8.0: +babel-plugin-syntax-object-rest-spread@^6.13.0, babel-plugin-syntax-object-rest-spread@^6.8.0: version "6.13.0" resolved "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz#fd6536f2bce13836ffa3a5458c4903a597bb3bf5" @@ -1018,25 +1025,24 @@ babel-preset-env@^1.6.0: invariant "^2.2.2" semver "^5.3.0" -babel-preset-vue-app@^1.3.1: - version "1.3.2" - resolved "https://registry.yarnpkg.com/babel-preset-vue-app/-/babel-preset-vue-app-1.3.2.tgz#53e98ac012a4edd3f8356cc6aafa000a6e980292" +babel-preset-vue-app@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/babel-preset-vue-app/-/babel-preset-vue-app-2.0.0.tgz#3849f42986dc6597f3c8aa21cc0bdfcc5fda4aa6" dependencies: babel-plugin-syntax-dynamic-import "^6.18.0" babel-plugin-transform-object-rest-spread "^6.26.0" babel-plugin-transform-runtime "^6.15.0" babel-preset-env "^1.6.0" - babel-preset-vue "^1.2.1" + babel-preset-vue "^2.0.0" babel-runtime "^6.20.0" -babel-preset-vue@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/babel-preset-vue/-/babel-preset-vue-1.2.1.tgz#b0de8977e0ce981fc6824cf0a537917a02a6fe87" +babel-preset-vue@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/babel-preset-vue/-/babel-preset-vue-2.0.0.tgz#441f7cf75836a0fa908a5df62bc243f8f9109d2c" dependencies: babel-helper-vue-jsx-merge-props "^2.0.2" babel-plugin-jsx-event-modifiers "^2.0.2" babel-plugin-jsx-v-model "^2.0.1" - babel-plugin-jsx-vue-functional "^2.1.0" babel-plugin-syntax-jsx "^6.18.0" babel-plugin-transform-vue-jsx "^3.5.0" @@ -1092,9 +1098,9 @@ babel-types@^6.18.0, babel-types@^6.19.0, babel-types@^6.24.1, babel-types@^6.26 lodash "^4.17.4" to-fast-properties "^1.0.3" -babylon@7.0.0-beta.32, babylon@^7.0.0-beta.31: - version "7.0.0-beta.32" - resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.32.tgz#e9033cb077f64d6895f4125968b37dc0a8c3bc6e" +babylon@7.0.0-beta.31: + version "7.0.0-beta.31" + resolved "https://registry.yarnpkg.com/babylon/-/babylon-7.0.0-beta.31.tgz#7ec10f81e0e456fd0f855ad60fa30c2ac454283f" babylon@^6.1.0, babylon@^6.18.0: version "6.18.0" @@ -1182,8 +1188,8 @@ boom@5.x.x: hoek "4.x.x" boxen@^1.2.1: - version "1.2.2" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.2.2.tgz#3f1d4032c30ffea9d4b02c322eaf2ea741dcbce5" + version "1.3.0" + resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.3.0.tgz#55c6c39a8ba58d9c61ad22cd877532deb665a20b" dependencies: ansi-align "^2.0.0" camelcase "^4.0.0" @@ -1191,7 +1197,7 @@ boxen@^1.2.1: cli-boxes "^1.0.0" string-width "^2.0.0" term-size "^1.2.0" - widest-line "^1.0.0" + widest-line "^2.0.0" brace-expansion@^1.1.7: version "1.1.8" @@ -1216,12 +1222,6 @@ browser-process-hrtime@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/browser-process-hrtime/-/browser-process-hrtime-0.1.2.tgz#425d68a58d3447f02a04aa894187fce8af8b7b8e" -browser-resolve@^1.11.0: - version "1.11.2" - resolved "https://registry.yarnpkg.com/browser-resolve/-/browser-resolve-1.11.2.tgz#8ff09b0a2c421718a1051c260b32e48f442938ce" - dependencies: - resolve "1.1.7" - browserify-aes@^1.0.0, browserify-aes@^1.0.4: version "1.1.1" resolved "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.1.1.tgz#38b7ab55edb806ff2dcda1a7f1620773a477c49f" @@ -1281,12 +1281,12 @@ browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: caniuse-db "^1.0.30000639" electron-to-chromium "^1.2.7" -browserslist@^2.0.0, browserslist@^2.1.2, browserslist@^2.5.1: - version "2.9.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.9.1.tgz#b72d3982ab01b5cd24da62ff6d45573886aff275" +browserslist@^2.0.0, browserslist@^2.1.2, browserslist@^2.10.0: + version "2.10.0" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.10.0.tgz#bac5ee1cc69ca9d96403ffb8a3abdc5b6aed6346" dependencies: - caniuse-lite "^1.0.30000770" - electron-to-chromium "^1.3.27" + caniuse-lite "^1.0.30000780" + electron-to-chromium "^1.3.28" buf-compare@^1.0.0: version "1.0.1" @@ -1304,7 +1304,7 @@ buffer@^4.3.0: ieee754 "^1.1.4" isarray "^1.0.0" -builtin-modules@^1.0.0, builtin-modules@^1.1.0, builtin-modules@^1.1.1: +builtin-modules@^1.0.0, builtin-modules@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" @@ -1410,12 +1410,12 @@ caniuse-api@^2.0.0: lodash.uniq "^4.5.0" caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: - version "1.0.30000770" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000770.tgz#cf68ae1cb8a82f6d3c35df41c62dc6973e470244" + version "1.0.30000782" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000782.tgz#d8815bce1578c350aced1132507301205e0fab53" -caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000748, caniuse-lite@^1.0.30000758, caniuse-lite@^1.0.30000770: - version "1.0.30000770" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000770.tgz#bc8e7f50b073273390db6ab357378909a14e9bdb" +caniuse-lite@^1.0.0, caniuse-lite@^1.0.30000780, caniuse-lite@^1.0.30000782: + version "1.0.30000782" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000782.tgz#5b82b8c385f25348745c471ca51320afb1b7f254" capture-stack-trace@^1.0.0: version "1.0.0" @@ -1459,8 +1459,8 @@ chalk@^2.0.0, chalk@^2.0.1, chalk@^2.1.0, chalk@^2.3.0: supports-color "^4.0.0" chardet@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.0.tgz#0bbe1355ac44d7a3ed4a925707c4ef70f8190f6c" + version "0.4.2" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" chokidar@^1.4.2, chokidar@^1.7.0: version "1.7.0" @@ -1655,13 +1655,9 @@ combined-stream@^1.0.5, combined-stream@~1.0.5: dependencies: delayed-stream "~1.0.0" -commander@2.11.x, commander@~2.11.0: - version "2.11.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.11.0.tgz#157152fd1e7a6c8d98a5b715cf376df928004563" - -commander@^2.9.0: - version "2.12.1" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.12.1.tgz#468635c4168d06145b9323356d1da84d14ac4a7a" +commander@2.12.x, commander@^2.9.0, commander@~2.12.1: + version "2.12.2" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.12.2.tgz#0f5946c427ed9ec0d91a46bb9def53e54650e555" common-path-prefix@^1.0.0: version "1.0.0" @@ -1818,9 +1814,13 @@ core-assert@^0.2.0: buf-compare "^1.0.0" is-error "^2.2.0" +core-js@^1.0.0: + version "1.2.7" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-1.2.7.tgz#652294c14651db28fa93bd2d5ff2983a4f08c636" + core-js@^2.0.0, core-js@^2.4.0, core-js@^2.5.0: - version "2.5.1" - resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.1.tgz#ae6874dc66937789b80754ff5428df66819ca50b" + version "2.5.3" + resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e" core-util-is@1.0.2, core-util-is@~1.0.0: version "1.0.2" @@ -2088,7 +2088,7 @@ debug-log@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/debug-log/-/debug-log-1.0.1.tgz#2307632d4c04382b8df8a32f70b895046d52745f" -debug@2.6.9, debug@^2.2.0, debug@^2.4.1, debug@^2.6.8: +debug@2.6.9, debug@^2.2.0, debug@^2.6.8: version "2.6.9" resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz#5d128515df134ff327e90a4c93f4e077a536341f" dependencies: @@ -2201,12 +2201,11 @@ doctrine@1.5.0: esutils "^2.0.2" isarray "^1.0.0" -doctrine@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.0.tgz#c73d8d2909d22291e1a007a395804da8b665fe63" +doctrine@^2.0.0, doctrine@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.2.tgz#68f96ce8efc56cc42651f1faadb4f175273b0075" dependencies: esutils "^2.0.2" - isarray "^1.0.0" dom-converter@~0.1: version "0.1.4" @@ -2306,9 +2305,9 @@ ejs@^2.5.6: version "2.5.7" resolved "https://registry.yarnpkg.com/ejs/-/ejs-2.5.7.tgz#cc872c168880ae3c7189762fd5ffc00896c9518a" -electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.27: - version "1.3.27" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.27.tgz#78ecb8a399066187bb374eede35d9c70565a803d" +electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.28: + version "1.3.28" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.28.tgz#8dd4e6458086644e9f9f0a1cf32e2a1f9dffd9ee" elliptic@^6.0.0: version "6.4.0" @@ -2367,10 +2366,10 @@ equal-length@^1.0.0: resolved "https://registry.yarnpkg.com/equal-length/-/equal-length-1.0.1.tgz#21ca112d48ab24b4e1e7ffc0e5339d31fdfc274c" errno@^0.1.3, errno@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.4.tgz#b896e23a9e5e8ba33871fc996abd3635fc9a1c7d" + version "0.1.5" + resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.5.tgz#a563781a6052bc2c9ccd89e8cef0eb9506e0c321" dependencies: - prr "~0.0.0" + prr "~1.0.1" error-ex@^1.2.0: version "1.3.1" @@ -2384,6 +2383,24 @@ error-stack-parser@^2.0.0: dependencies: stackframe "^1.0.3" +es-abstract@^1.7.0: + version "1.10.0" + resolved "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.10.0.tgz#1ecb36c197842a00d8ee4c2dfd8646bb97d60864" + dependencies: + es-to-primitive "^1.1.1" + function-bind "^1.1.1" + has "^1.0.1" + is-callable "^1.1.3" + is-regex "^1.0.4" + +es-to-primitive@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.1.1.tgz#45355248a88979034b6792e19bb81f2b7975dd0d" + dependencies: + is-callable "^1.1.1" + is-date-object "^1.0.1" + is-symbol "^1.0.1" + es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: version "0.10.37" resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.37.tgz#0ee741d148b80069ba27d020393756af257defc3" @@ -2478,9 +2495,13 @@ escope@^3.6.0: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint-config-standard@^10.2.1: - version "10.2.1" - resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-10.2.1.tgz#c061e4d066f379dc17cd562c64e819b4dd454591" +eslint-config-standard-jsx@^4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/eslint-config-standard-jsx/-/eslint-config-standard-jsx-4.0.2.tgz#009e53c4ddb1e9ee70b4650ffe63a7f39f8836e1" + +eslint-config-standard@^11.0.0-beta.0: + version "11.0.0-beta.0" + resolved "https://registry.yarnpkg.com/eslint-config-standard/-/eslint-config-standard-11.0.0-beta.0.tgz#f8afe69803d95c685a4b8392b8793188eb03cbb3" eslint-import-resolver-node@^0.3.1: version "0.3.1" @@ -2530,6 +2551,15 @@ eslint-plugin-promise@^3.6.0: version "3.6.0" resolved "https://registry.yarnpkg.com/eslint-plugin-promise/-/eslint-plugin-promise-3.6.0.tgz#54b7658c8f454813dc2a870aff8152ec4969ba75" +eslint-plugin-react@^7.5.1: + version "7.5.1" + resolved "https://registry.yarnpkg.com/eslint-plugin-react/-/eslint-plugin-react-7.5.1.tgz#52e56e8d80c810de158859ef07b880d2f56ee30b" + dependencies: + doctrine "^2.0.0" + has "^1.0.1" + jsx-ast-utils "^2.0.0" + prop-types "^15.6.0" + eslint-plugin-standard@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/eslint-plugin-standard/-/eslint-plugin-standard-3.0.1.tgz#34d0c915b45edc6f010393c7eef3823b08565cf2" @@ -2541,9 +2571,9 @@ eslint-scope@^3.7.1: esrecurse "^4.1.0" estraverse "^4.1.1" -eslint@^4.10.0: - version "4.11.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.11.0.tgz#39a8c82bc0a3783adf5a39fa27fdd9d36fac9a34" +eslint@^4.13.1: + version "4.13.1" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.13.1.tgz#0055e0014464c7eb7878caf549ef2941992b444f" dependencies: ajv "^5.3.0" babel-code-frame "^6.22.0" @@ -2551,7 +2581,7 @@ eslint@^4.10.0: concat-stream "^1.6.0" cross-spawn "^5.1.0" debug "^3.0.1" - doctrine "^2.0.0" + doctrine "^2.0.2" eslint-scope "^3.7.1" espree "^3.5.2" esquery "^1.0.0" @@ -2560,7 +2590,7 @@ eslint@^4.10.0: file-entry-cache "^2.0.0" functional-red-black-tree "^1.0.1" glob "^7.1.2" - globals "^9.17.0" + globals "^11.0.1" ignore "^3.3.3" imurmurhash "^0.1.4" inquirer "^3.0.6" @@ -2634,18 +2664,6 @@ estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1, estraverse@^4.2.0: version "4.2.0" resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" -estree-walker@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.2.1.tgz#bdafe8095383d8414d5dc2ecf4c9173b6db9412e" - -estree-walker@^0.3.0: - version "0.3.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.3.1.tgz#e6b1a51cf7292524e7237c312e5fe6660c1ce1aa" - -estree-walker@^0.5.0: - version "0.5.1" - resolved "https://registry.yarnpkg.com/estree-walker/-/estree-walker-0.5.1.tgz#64fc375053abc6f57d73e9bd2f004644ad3c5854" - esutils@^2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" @@ -2767,10 +2785,14 @@ extract-zip@^1.6.5: mkdirp "0.5.0" yauzl "2.4.1" -extsprintf@1.3.0, extsprintf@^1.2.0: +extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + fast-deep-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" @@ -2791,6 +2813,18 @@ fastparse@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/fastparse/-/fastparse-1.1.1.tgz#d1e2643b38a94d7583b479060e6c4affc94071f8" +fbjs@^0.8.16: + version "0.8.16" + resolved "https://registry.yarnpkg.com/fbjs/-/fbjs-0.8.16.tgz#5e67432f550dc41b572bf55847b8aca64e5337db" + dependencies: + core-js "^1.0.0" + isomorphic-fetch "^2.1.1" + loose-envify "^1.0.0" + object-assign "^4.1.0" + promise "^7.1.1" + setimmediate "^1.0.5" + ua-parser-js "^0.7.9" + fd-slicer@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" @@ -2976,9 +3010,9 @@ from2@^2.1.0: inherits "^2.0.1" readable-stream "^2.0.0" -fs-extra@^4.0.2: - version "4.0.2" - resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.2.tgz#f91704c53d1b461f893452b0c307d9997647ab6b" +fs-extra@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/fs-extra/-/fs-extra-5.0.0.tgz#414d0110cdd06705734d055652c5411260c31abd" dependencies: graceful-fs "^4.1.2" jsonfile "^4.0.0" @@ -3021,7 +3055,7 @@ fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: mkdirp ">=0.5 0" rimraf "2" -function-bind@^1.0.2, function-bind@^1.1.0: +function-bind@^1.0.2, function-bind@^1.1.0, function-bind@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz#a56899d3ea3c9bab874bb9773b7c5ede92f4895d" @@ -3102,7 +3136,11 @@ globals@^10.0.0: version "10.4.0" resolved "https://registry.yarnpkg.com/globals/-/globals-10.4.0.tgz#5c477388b128a9e4c5c5d01c7a2aca68c68b2da7" -globals@^9.17.0, globals@^9.18.0: +globals@^11.0.1: + version "11.1.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.1.0.tgz#632644457f5f0e3ae711807183700ebf2e4633e4" + +globals@^9.18.0: version "9.18.0" resolved "https://registry.yarnpkg.com/globals/-/globals-9.18.0.tgz#aa3896b3e69b487f17e31ed2143d69a8e30c2d8a" @@ -3304,18 +3342,18 @@ html-entities@^1.2.0: version "1.2.1" resolved "https://registry.yarnpkg.com/html-entities/-/html-entities-1.2.1.tgz#0df29351f0721163515dfb9e5543e5f6eed5162f" -html-minifier@^3.2.3, html-minifier@^3.5.6: - version "3.5.6" - resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.6.tgz#7e4e661a09999599c7d8e8a2b8d7fb7430bb5c3e" +html-minifier@3.5.7, html-minifier@^3.2.3: + version "3.5.7" + resolved "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.7.tgz#511e69bb5a8e7677d1012ebe03819aa02ca06208" dependencies: camel-case "3.0.x" clean-css "4.1.x" - commander "2.11.x" + commander "2.12.x" he "1.1.x" ncname "1.0.x" param-case "2.1.x" relateurl "0.2.x" - uglify-js "3.1.x" + uglify-js "3.2.x" html-tags@^2.0.0: version "2.0.0" @@ -3382,11 +3420,11 @@ https-browserify@^1.0.0: resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" https-proxy-agent@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.1.0.tgz#1391bee7fd66aeabc0df2a1fa90f58954f43e443" + version "2.1.1" + resolved "https://registry.yarnpkg.com/https-proxy-agent/-/https-proxy-agent-2.1.1.tgz#a7ce4382a1ba8266ee848578778122d491260fd9" dependencies: agent-base "^4.1.0" - debug "^2.4.1" + debug "^3.1.0" hullabaloo-config-manager@^1.1.0: version "1.1.1" @@ -3527,8 +3565,8 @@ inquirer@^3.0.6: through "^2.3.6" interpret@^1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.0.4.tgz#820cdd588b868ffb191a809506d6c9c8f212b1b0" + version "1.1.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" invariant@^2.2.0, invariant@^2.2.2: version "2.2.2" @@ -3576,12 +3614,20 @@ is-builtin-module@^1.0.0: dependencies: builtin-modules "^1.0.0" +is-callable@^1.1.1, is-callable@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/is-callable/-/is-callable-1.1.3.tgz#86eb75392805ddc33af71c92a0eedf74ee7604b2" + is-ci@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.10.tgz#f739336b2632365061a9d48270cd56ae3369318e" dependencies: ci-info "^1.0.0" +is-date-object@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.1.tgz#9aa20eb6aeebbff77fbd33e74ca01b33581d3a16" + is-directory@^0.3.1: version "0.3.1" resolved "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz#61339b6f2475fc772fd9c9d83f5c8575dc154ae1" @@ -3651,10 +3697,6 @@ is-installed-globally@^0.1.0: global-dirs "^0.1.0" is-path-inside "^1.0.0" -is-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-module/-/is-module-1.0.0.tgz#3258fb69f78c14d5b815d664336b4cffb6441591" - is-npm@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" @@ -3681,6 +3723,12 @@ is-observable@^0.2.0: dependencies: symbol-observable "^0.2.2" +is-observable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-observable/-/is-observable-1.1.0.tgz#b3e986c8f44de950867cab5403f5a3465005975e" + dependencies: + symbol-observable "^1.1.0" + is-path-cwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" @@ -3692,8 +3740,8 @@ is-path-in-cwd@^1.0.0: is-path-inside "^1.0.0" is-path-inside@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" dependencies: path-is-inside "^1.0.1" @@ -3717,6 +3765,12 @@ is-redirect@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" +is-regex@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/is-regex/-/is-regex-1.0.4.tgz#5517489b547091b0930e095654ced25ee97e9491" + dependencies: + has "^1.0.1" + is-resolvable@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.0.0.tgz#8df57c61ea2e3c501408d100fb013cf8d6e0cc62" @@ -3737,6 +3791,10 @@ is-svg@^2.0.0: dependencies: html-comment-regex "^1.1.0" +is-symbol@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.1.tgz#3cc59f00025194b6ab2e38dbae6689256b660572" + is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -3775,6 +3833,13 @@ isobject@^2.0.0: dependencies: isarray "1.0.0" +isomorphic-fetch@^2.1.1: + version "2.2.1" + resolved "https://registry.yarnpkg.com/isomorphic-fetch/-/isomorphic-fetch-2.2.1.tgz#611ae1acf14f5e81f729507472819fe9733558a9" + dependencies: + node-fetch "^1.0.1" + whatwg-fetch ">=0.10.0" + isstream@~0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" @@ -3827,8 +3892,8 @@ istanbul-reports@^1.1.3: handlebars "^4.0.3" js-base64@^2.1.9: - version "2.3.2" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.3.2.tgz#a79a923666372b580f8e27f51845c6f7e8fbfbaf" + version "2.4.0" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.0.tgz#9e566fee624751a1d720c966cd6226d29d4025aa" js-string-escape@^1.0.1: version "1.0.1" @@ -3856,9 +3921,9 @@ jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" -jsdom@^11.3.0: - version "11.4.0" - resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.4.0.tgz#a3941a9699cbb0d61f8ab86f6f28f4ad5ea60d04" +jsdom@^11.5.1: + version "11.5.1" + resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-11.5.1.tgz#5df753b8d0bca20142ce21f4f6c039f99a992929" dependencies: abab "^1.0.3" acorn "^5.1.2" @@ -3871,6 +3936,7 @@ jsdom@^11.3.0: domexception "^1.0.0" escodegen "^1.9.0" html-encoding-sniffer "^1.0.1" + left-pad "^1.2.0" nwmatcher "^1.4.3" parse5 "^3.0.2" pn "^1.0.0" @@ -3941,6 +4007,12 @@ jsprim@^1.2.2: json-schema "0.2.3" verror "1.10.0" +jsx-ast-utils@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/jsx-ast-utils/-/jsx-ast-utils-2.0.1.tgz#e801b1b39985e20fffc87b40e3748080e2dcac7f" + dependencies: + array-includes "^3.0.3" + kind-of@^3.0.2: version "3.2.2" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" @@ -3975,6 +4047,10 @@ lcid@^1.0.0: dependencies: invert-kv "^1.0.0" +left-pad@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/left-pad/-/left-pad-1.2.0.tgz#d30a73c6b8201d8f7d8e7956ba9616087a68e0ee" + levn@^0.3.0, levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -4110,7 +4186,7 @@ longest@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/longest/-/longest-1.0.1.tgz#30a0b2da38f73770e8294a0d22e6625ed77d0097" -loose-envify@^1.0.0: +loose-envify@^1.0.0, loose-envify@^1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.3.1.tgz#d1a8ad33fa9ce0e713d65fdd0ac8b748d478c848" dependencies: @@ -4142,12 +4218,6 @@ macaddress@^0.2.8: version "0.2.8" resolved "https://registry.yarnpkg.com/macaddress/-/macaddress-0.2.8.tgz#5904dc537c39ec6dbefeae902327135fa8511f12" -magic-string@^0.22.4: - version "0.22.4" - resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.22.4.tgz#31039b4e40366395618c1d6cf8193c53917475ff" - dependencies: - vlq "^0.2.1" - make-dir@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.1.0.tgz#19b4369fe48c116f53c2af95ad102c0e39e85d51" @@ -4263,8 +4333,8 @@ miller-rabin@^4.0.0: brorand "^1.0.1" "mime-db@>= 1.30.0 < 2": - version "1.31.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.31.0.tgz#a49cd8f3ebf3ed1a482b60561d9105ad40ca74cb" + version "1.32.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.32.0.tgz#485b3848b01a3cda5f968b4882c0771e58e09414" mime-db@~1.30.0: version "1.30.0" @@ -4280,9 +4350,9 @@ mime@1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/mime/-/mime-1.4.1.tgz#121f9ebc49e3766f311a76e1fa1c8003c4b03aa6" -mime@^1.3.4, mime@^1.4.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/mime/-/mime-1.5.0.tgz#59c20e03ae116089edeb7d3b34a6788c5b3cccea" +mime@^1.3.4, mime@^1.4.1, mime@^1.5.0: + version "1.6.0" + resolved "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz#32cd9e5c64553bd58d19a568af452acff04981b1" mimic-fn@^1.0.0: version "1.1.0" @@ -4352,10 +4422,14 @@ move-concurrently@^1.0.1: rimraf "^2.5.4" run-queue "^1.0.3" -ms@2.0.0, ms@^2.0.0: +ms@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8" +ms@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + multimatch@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b" @@ -4404,6 +4478,13 @@ node-fetch@1.6.3: encoding "^0.1.11" is-stream "^1.0.1" +node-fetch@^1.0.1: + version "1.7.3" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" + dependencies: + encoding "^0.1.11" + is-stream "^1.0.1" + node-libs-browser@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.1.0.tgz#5f94263d404f6e44767d726901fff05478d600df" @@ -5412,9 +5493,9 @@ postcss-unique-selectors@^2.0.2: postcss "^5.0.4" uniqs "^2.0.0" -postcss-url@^7.2.1: - version "7.2.1" - resolved "https://registry.yarnpkg.com/postcss-url/-/postcss-url-7.2.1.tgz#bf47ff1b5395538567cea19ef3241a70fb925f5c" +postcss-url@^7.3.0: + version "7.3.0" + resolved "https://registry.yarnpkg.com/postcss-url/-/postcss-url-7.3.0.tgz#cf2f45e06743cf43cfea25309f81cbc003dc783f" dependencies: mime "^1.4.1" minimatch "^3.0.4" @@ -5464,8 +5545,8 @@ preserve@^0.2.0: resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" prettier@^1.7.0: - version "1.8.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.8.2.tgz#bff83e7fd573933c607875e5ba3abbdffb96aeb8" + version "1.9.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.9.2.tgz#96bc2132f7a32338e6078aeb29727178c6335827" pretty-error@^2.0.2, pretty-error@^2.1.1: version "2.1.1" @@ -5519,6 +5600,20 @@ promise-inflight@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz#98472870bf228132fcbdd868129bad12c3c029e3" +promise@^7.1.1: + version "7.3.1" + resolved "https://registry.yarnpkg.com/promise/-/promise-7.3.1.tgz#064b72602b18f90f29192b8b1bc418ffd1ebd3bf" + dependencies: + asap "~2.0.3" + +prop-types@^15.6.0: + version "15.6.0" + resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.6.0.tgz#ceaf083022fc46b4a35f69e13ef75aed0d639856" + dependencies: + fbjs "^0.8.16" + loose-envify "^1.3.1" + object-assign "^4.1.1" + proxy-addr@~2.0.2: version "2.0.2" resolved "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.2.tgz#6571504f47bb988ec8180253f85dd7e14952bdec" @@ -5530,9 +5625,9 @@ proxy-from-env@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/proxy-from-env/-/proxy-from-env-1.0.0.tgz#33c50398f70ea7eb96d21f7b817630a55791c7ee" -prr@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/prr/-/prr-0.0.0.tgz#1a84b85908325501411853d0081ee3fa86e2926a" +prr@~1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476" pseudomap@^1.0.2: version "1.0.2" @@ -5739,8 +5834,8 @@ reduce-css-calc@^1.2.6, reduce-css-calc@^1.2.7: reduce-function-call "^1.0.1" reduce-css-calc@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-2.1.1.tgz#f4ecd7a00ec3e5683773f208067ad7da117b9db0" + version "2.1.3" + resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-2.1.3.tgz#63c4c6325ffbbf4ea6c23f1d4deb47c3953f3b81" dependencies: css-unit-converter "^1.1.1" postcss-value-parser "^3.3.0" @@ -5760,8 +5855,8 @@ regenerator-runtime@^0.10.0: resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz#336c3efc1220adcedda2c9fab67b5a7955a33658" regenerator-runtime@^0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.0.tgz#7e54fe5b5ccd5d6624ea6255c3473be090b802e1" + version "0.11.1" + resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" regenerator-transform@^0.10.0: version "0.10.1" @@ -5938,10 +6033,6 @@ require-precompiled@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/require-precompiled/-/require-precompiled-0.1.0.tgz#5a1b52eb70ebed43eb982e974c85ab59571e56fa" -require-relative@0.8.7: - version "0.8.7" - resolved "https://registry.yarnpkg.com/require-relative/-/require-relative-0.8.7.tgz#7999539fc9e047a37928fa196f8e1563dabd36de" - require-uncached@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" @@ -5967,11 +6058,7 @@ resolve-from@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz#b22c7af7d9d6881bc8b6e653335eebcb0a188748" -resolve@1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" - -resolve@^1.1.6, resolve@^1.1.7, resolve@^1.2.0, resolve@^1.3.3, resolve@^1.4.0: +resolve@^1.1.7, resolve@^1.2.0, resolve@^1.3.3, resolve@^1.4.0: version "1.5.0" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" dependencies: @@ -5998,7 +6085,7 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@^2.2.8, rimraf@^2.3.3, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6.1, rimraf@^2.6.2: +rimraf@2, rimraf@^2.2.8, rimraf@^2.3.3, rimraf@^2.5.1, rimraf@^2.5.4, rimraf@^2.6.1: version "2.6.2" resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" dependencies: @@ -6011,71 +6098,6 @@ ripemd160@^2.0.0, ripemd160@^2.0.1: hash-base "^2.0.0" inherits "^2.0.1" -rollup-plugin-alias@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-alias/-/rollup-plugin-alias-1.4.0.tgz#120cba7c46621c03138f0ca6fd5dd2ade9872db9" - dependencies: - slash "^1.0.0" - -rollup-plugin-babel@^3.0.2: - version "3.0.2" - resolved "https://registry.yarnpkg.com/rollup-plugin-babel/-/rollup-plugin-babel-3.0.2.tgz#a2765dea0eaa8aece351c983573300d17497495b" - dependencies: - rollup-pluginutils "^1.5.0" - -rollup-plugin-commonjs@^8.2.6: - version "8.2.6" - resolved "https://registry.yarnpkg.com/rollup-plugin-commonjs/-/rollup-plugin-commonjs-8.2.6.tgz#27e5b9069ff94005bb01e01bb46a1e4873784677" - dependencies: - acorn "^5.2.1" - estree-walker "^0.5.0" - magic-string "^0.22.4" - resolve "^1.4.0" - rollup-pluginutils "^2.0.1" - -rollup-plugin-node-resolve@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-node-resolve/-/rollup-plugin-node-resolve-3.0.0.tgz#8b897c4c3030d5001277b0514b25d2ca09683ee0" - dependencies: - browser-resolve "^1.11.0" - builtin-modules "^1.1.0" - is-module "^1.0.0" - resolve "^1.1.6" - -rollup-plugin-replace@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/rollup-plugin-replace/-/rollup-plugin-replace-2.0.0.tgz#19074089c8ed57184b8cc64e967a03d095119277" - dependencies: - magic-string "^0.22.4" - minimatch "^3.0.2" - rollup-pluginutils "^2.0.1" - -rollup-pluginutils@^1.5.0: - version "1.5.2" - resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-1.5.2.tgz#1e156e778f94b7255bfa1b3d0178be8f5c552408" - dependencies: - estree-walker "^0.2.1" - minimatch "^3.0.2" - -rollup-pluginutils@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/rollup-pluginutils/-/rollup-pluginutils-2.0.1.tgz#7ec95b3573f6543a46a6461bd9a7c544525d0fc0" - dependencies: - estree-walker "^0.3.0" - micromatch "^2.3.11" - -rollup-watch@^4.3.1: - version "4.3.1" - resolved "https://registry.yarnpkg.com/rollup-watch/-/rollup-watch-4.3.1.tgz#5aa1eaeab787addf368905d102b39d6fc5ce4a8b" - dependencies: - chokidar "^1.7.0" - require-relative "0.8.7" - rollup-pluginutils "^2.0.1" - -rollup@^0.51.7: - version "0.51.8" - resolved "https://registry.yarnpkg.com/rollup/-/rollup-0.51.8.tgz#58bd0b642885f4770b5f93cc64f14e4233c2236d" - run-async@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" @@ -6122,7 +6144,7 @@ semver-diff@^2.0.0: dependencies: semver "^5.0.3" -"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0: +"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0, semver@^5.4.1: version "5.4.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" @@ -6173,7 +6195,7 @@ set-immediate-shim@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" -setimmediate@^1.0.4: +setimmediate@^1.0.4, setimmediate@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz#290cbb232e306942d7d7ea9b83732ab7856f8285" @@ -6254,7 +6276,7 @@ source-list-map@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.0.tgz#aaa47403f7b245a92fbc97ea08f250d6087ed085" -source-map-support@^0.4.0, source-map-support@^0.4.15: +source-map-support@^0.4.15: version "0.4.18" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.18.tgz#0286a6de8be42641338594e97ccea75f0a2c585f" dependencies: @@ -6476,13 +6498,12 @@ 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" -style-resources-loader@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/style-resources-loader/-/style-resources-loader-0.3.0.tgz#e57aca9baa11bad8e3ab28f415eaf565d6a113bc" +style-resources-loader@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/style-resources-loader/-/style-resources-loader-1.0.0.tgz#a2290ca7366e4d1f90c93d304a55194bfd2e8dc0" dependencies: glob "^7.1.2" loader-utils "^1.1.0" - webpack "^3.8.1" supports-color@^2.0.0: version "2.0.0" @@ -6500,6 +6521,12 @@ supports-color@^4.0.0, supports-color@^4.2.1, supports-color@^4.4.0: dependencies: has-flag "^2.0.0" +supports-color@^5.0.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.1.0.tgz#058a021d1b619f7ddf3980d712ea3590ce7de3d5" + dependencies: + has-flag "^2.0.0" + svg-tags@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz#58f71cee3bd519b59d4b2a843b6c7de64ac04764" @@ -6520,9 +6547,9 @@ symbol-observable@^0.2.2: version "0.2.4" resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-0.2.4.tgz#95a83db26186d6af7e7a18dbd9760a2f86d08f40" -symbol-observable@^1.0.4: - version "1.0.4" - resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.0.4.tgz#29bf615d4aa7121bdd898b22d4b3f9bc4e2aa03d" +symbol-observable@^1.0.4, symbol-observable@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/symbol-observable/-/symbol-observable-1.1.0.tgz#5c68fd8d54115d9dfb72a84720549222e8db9b32" symbol-tree@^3.2.1: version "3.2.2" @@ -6703,18 +6730,22 @@ typedarray@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" -uglify-es@^3.1.3: - version "3.1.10" - resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.1.10.tgz#f1840c3b52771d17555a02ce158cf46f689384bd" +ua-parser-js@^0.7.9: + version "0.7.17" + resolved "https://registry.yarnpkg.com/ua-parser-js/-/ua-parser-js-0.7.17.tgz#e9ec5f9498b9ec910e7ae3ac626a805c4d09ecac" + +uglify-es@^3.2.0: + version "3.2.2" + resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.2.2.tgz#15c62b7775002c81b7987a1c49ecd3f126cace73" dependencies: - commander "~2.11.0" + commander "~2.12.1" source-map "~0.6.1" -uglify-js@3.1.x, uglify-js@^3.1.7: - version "3.1.10" - resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.1.10.tgz#c4a5f9b5c6276b40cb971c1d97c9eeb26af9509c" +uglify-js@3.2.x, uglify-js@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.2.2.tgz#870e4b34ed733d179284f9998efd3293f7fd73f6" dependencies: - commander "~2.11.0" + commander "~2.12.1" source-map "~0.6.1" uglify-js@^2.6, uglify-js@^2.8.29: @@ -6738,15 +6769,15 @@ uglifyjs-webpack-plugin@^0.4.6: uglify-js "^2.8.29" webpack-sources "^1.0.1" -uglifyjs-webpack-plugin@^1.0.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.1.1.tgz#6167c5aae218ee8109de8920bb769b8acbc55d03" +uglifyjs-webpack-plugin@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.1.2.tgz#8a9abc238d01a33daaf86fa9a84c7ebc1e67b0f9" dependencies: cacache "^10.0.0" find-cache-dir "^1.0.0" schema-utils "^0.3.0" source-map "^0.6.1" - uglify-es "^3.1.3" + uglify-es "^3.2.0" webpack-sources "^1.0.1" worker-farm "^1.4.1" @@ -6917,10 +6948,6 @@ viewport-dimensions@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/viewport-dimensions/-/viewport-dimensions-0.2.0.tgz#de740747db5387fd1725f5175e91bac76afdf36c" -vlq@^0.2.1: - version "0.2.3" - resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26" - vm-browserify@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" @@ -6949,9 +6976,9 @@ vue-loader@^13.5.0: vue-style-loader "^3.0.0" vue-template-es2015-compiler "^1.6.0" -vue-meta@^1.3.1: - version "1.3.1" - resolved "https://registry.yarnpkg.com/vue-meta/-/vue-meta-1.3.1.tgz#1c46c9af6119c61934a5b2783538b062c03be2c7" +vue-meta@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/vue-meta/-/vue-meta-1.4.0.tgz#8f3bee11b73a7c035b2edc6679186fd81989e36d" dependencies: deepmerge "^2.0.0" lodash.isplainobject "^4.0.6" @@ -6961,9 +6988,9 @@ vue-router@^3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-3.0.1.tgz#d9b05ad9c7420ba0f626d6500d693e60092cc1e9" -vue-server-renderer@^2.5.6: - version "2.5.8" - resolved "https://registry.yarnpkg.com/vue-server-renderer/-/vue-server-renderer-2.5.8.tgz#22ed81fdfc54329304900d0e1f7dcb279888f012" +vue-server-renderer@^2.5.9: + version "2.5.9" + resolved "https://registry.yarnpkg.com/vue-server-renderer/-/vue-server-renderer-2.5.9.tgz#936e42ba9a8d31ada2da36f29b7386c787908489" dependencies: chalk "^1.1.3" hash-sum "^1.0.2" @@ -6981,9 +7008,9 @@ vue-style-loader@^3.0.0: hash-sum "^1.0.2" loader-utils "^1.0.2" -vue-template-compiler@^2.5.6: - version "2.5.8" - resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.5.8.tgz#826ae77e1d5faa7fa5fca554f33872dde38de674" +vue-template-compiler@^2.5.9: + version "2.5.9" + resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.5.9.tgz#7fabc73c8d3d12d32340cd86c5fc33e00e86d686" dependencies: de-indent "^1.0.2" he "^1.1.0" @@ -6992,9 +7019,9 @@ vue-template-es2015-compiler@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.6.0.tgz#dc42697133302ce3017524356a6c61b7b69b4a18" -vue@^2.5.6: - version "2.5.8" - resolved "https://registry.yarnpkg.com/vue/-/vue-2.5.8.tgz#f855c1c27255184a82225f4bef225473e8faf15b" +vue@^2.5.9: + version "2.5.9" + resolved "https://registry.yarnpkg.com/vue/-/vue-2.5.9.tgz#b2380cd040915dca69881dafd121d760952e65f7" vuex@^3.0.1: version "3.0.1" @@ -7028,19 +7055,19 @@ webpack-bundle-analyzer@^2.9.0: opener "^1.4.3" ws "^3.3.1" -webpack-dev-middleware@^1.12.0: - version "1.12.1" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.12.1.tgz#338be3ca930973be1c2ce07d84d275e997e1a25a" +webpack-dev-middleware@^1.12.2: + version "1.12.2" + resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.12.2.tgz#f8fc1120ce3b4fc5680ceecb43d777966b21105e" dependencies: memory-fs "~0.4.1" - mime "^1.4.1" + mime "^1.5.0" path-is-absolute "^1.0.0" range-parser "^1.0.3" time-stamp "^2.0.0" -webpack-hot-middleware@^2.20.0: - version "2.20.0" - resolved "https://registry.yarnpkg.com/webpack-hot-middleware/-/webpack-hot-middleware-2.20.0.tgz#cb896d837758b6408fe0afeeafdc0e5316b15319" +webpack-hot-middleware@^2.21.0: + version "2.21.0" + resolved "https://registry.yarnpkg.com/webpack-hot-middleware/-/webpack-hot-middleware-2.21.0.tgz#7b3c113a7a4b301c91e0749573c7aab28b414b52" dependencies: ansi-html "0.0.7" html-entities "^1.2.0" @@ -7052,15 +7079,15 @@ webpack-node-externals@^1.6.0: resolved "https://registry.yarnpkg.com/webpack-node-externals/-/webpack-node-externals-1.6.0.tgz#232c62ec6092b100635a3d29d83c1747128df9bd" webpack-sources@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.0.2.tgz#d0148ec083b3b5ccef1035a6b3ec16442983b27a" + version "1.1.0" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.1.0.tgz#a101ebae59d6507354d71d8013950a3a8b7a5a54" dependencies: source-list-map "^2.0.0" source-map "~0.6.1" -webpack@^3.8.1: - version "3.8.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.8.1.tgz#b16968a81100abe61608b0153c9159ef8bb2bd83" +webpack@^3.10.0: + version "3.10.0" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-3.10.0.tgz#5291b875078cf2abf42bdd23afe3f8f96c17d725" dependencies: acorn "^5.0.0" acorn-dynamic-import "^2.0.0" @@ -7095,9 +7122,13 @@ whatwg-encoding@^1.0.1: dependencies: iconv-lite "0.4.19" +whatwg-fetch@>=0.10.0: + version "2.0.3" + resolved "https://registry.yarnpkg.com/whatwg-fetch/-/whatwg-fetch-2.0.3.tgz#9c84ec2dcf68187ff00bc64e1274b442176e1c84" + whatwg-url@^6.3.0: - version "6.3.0" - resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.3.0.tgz#597ee5488371abe7922c843397ddec1ae94c048d" + version "6.4.0" + resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-6.4.0.tgz#08fdf2b9e872783a7a1f6216260a1d66cc722e08" dependencies: lodash.sortby "^4.7.0" tr46 "^1.0.0" @@ -7123,11 +7154,11 @@ wide-align@^1.1.0: dependencies: string-width "^1.0.2" -widest-line@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-1.0.0.tgz#0c09c85c2a94683d0d7eaf8ee097d564bf0e105c" +widest-line@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-2.0.0.tgz#0142a4e8a243f8882c0233aa0e0281aa76152273" dependencies: - string-width "^1.0.1" + string-width "^2.1.1" window-size@0.1.0: version "0.1.0"