diff --git a/package.json b/package.json index e22bef7d..ce1c8d10 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "version": "0.0.0", "scripts": { "precommit": "npm test", - "test": "npm run lint && lerna run test", + "test": "npm run lint && jest", "lint": "xo" }, "main": "index.js", @@ -44,11 +44,16 @@ "devDependencies": { "eslint-config-rem": "^4.0.0", "husky": "^0.14.3", + "jest": "^22.1.4", "lerna": "^2.0.0", "xo": "^0.18.2" }, "dependencies": {}, "workspaces": [ "packages/*" - ] + ], + "jest": { + "testEnvironment": "node", + "testPathIgnorePatterns": ["/node_modules/", "/examples?/"] + } } diff --git a/packages/babel-preset-poi/package.json b/packages/babel-preset-poi/package.json index b069e820..13c1809e 100644 --- a/packages/babel-preset-poi/package.json +++ b/packages/babel-preset-poi/package.json @@ -6,7 +6,7 @@ "index.js" ], "scripts": { - "test": "ava" + "test": "echo fine" }, "license": "MIT", "dependencies": { @@ -23,7 +23,6 @@ "babel-runtime": "^6.26.0" }, "devDependencies": { - "ava": "^0.24.0", "babel-core": "^6.26.0" } } diff --git a/packages/babel-preset-poi/test/__snapshots__/test.js.snap b/packages/babel-preset-poi/test/__snapshots__/test.js.snap new file mode 100644 index 00000000..931ede6e --- /dev/null +++ b/packages/babel-preset-poi/test/__snapshots__/test.js.snap @@ -0,0 +1,26 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`class properties: class properties 1`] = ` +"\\"use strict\\"; + +let Foo = class Foo { + constructor() { + this.state = 1; + } + +};" +`; + +exports[`decorators legacy: decorators legacy 1`] = ` +"\\"use strict\\"; + +var _class; + +let Foo = bound(_class = class Foo {}) || _class;" +`; + +exports[`object reset spread: object reset spread 1`] = ` +"\\"use strict\\"; + +const a = Object.assign({}, foo);" +`; diff --git a/packages/babel-preset-poi/test/snapshots/test.js.md b/packages/babel-preset-poi/test/snapshots/test.js.md deleted file mode 100644 index 6ec061ed..00000000 --- a/packages/babel-preset-poi/test/snapshots/test.js.md +++ /dev/null @@ -1,36 +0,0 @@ -# Snapshot report for `test/test.js` - -The actual snapshot is saved in `test.js.snap`. - -Generated by [AVA](https://ava.li). - -## class properties - -> class properties - - `"use strict";␊ - ␊ - let Foo = class Foo {␊ - constructor() {␊ - this.state = 1;␊ - }␊ - ␊ - };` - -## decorators legacy - -> decorators legacy - - `"use strict";␊ - ␊ - var _class;␊ - ␊ - let Foo = bound(_class = class Foo {}) || _class;` - -## object reset spread - -> object reset spread - - `"use strict";␊ - ␊ - const a = Object.assign({}, foo);` diff --git a/packages/babel-preset-poi/test/snapshots/test.js.snap b/packages/babel-preset-poi/test/snapshots/test.js.snap deleted file mode 100644 index fe0e0e62..00000000 Binary files a/packages/babel-preset-poi/test/snapshots/test.js.snap and /dev/null differ diff --git a/packages/babel-preset-poi/test/test.js b/packages/babel-preset-poi/test/test.js index 4da7598e..6851f2e6 100644 --- a/packages/babel-preset-poi/test/test.js +++ b/packages/babel-preset-poi/test/test.js @@ -1,12 +1,11 @@ -import test from 'ava' -import * as babel from 'babel-core' +const babel = require('babel-core') function snapshot({ title, input }) { - test(title, t => { + test(title, () => { const { code } = babel.transform(input, { presets: [require.resolve('..')] }) - t.snapshot(code, title) + expect(code).toMatchSnapshot(title) }) } diff --git a/packages/poi-preset-babel-minify/index.js b/packages/poi-preset-babel-minify/index.js index 3a315094..e8e1872c 100644 --- a/packages/poi-preset-babel-minify/index.js +++ b/packages/poi-preset-babel-minify/index.js @@ -6,8 +6,7 @@ module.exports = (pluginOptions, overrides) => { // do not use if `minimize` is off if (config.plugins.has('minimize')) { - config.plugin('minimize') - .use(BabelMinifyPlugin, [pluginOptions, overrides]) + config.plugins.update('minimize', BabelMinifyPlugin, [pluginOptions, overrides]) } }) } diff --git a/packages/poi-preset-buble/lib/index.js b/packages/poi-preset-buble/lib/index.js index f3d3ba36..10df633c 100644 --- a/packages/poi-preset-buble/lib/index.js +++ b/packages/poi-preset-buble/lib/index.js @@ -22,43 +22,40 @@ module.exports = ({ }, bubleOptions) for (const rule of ['js', 'es']) { - const thisRule = config.module.rule(rule) + const thisRule = config.rules.get(rule) // Remove babel-loader first - thisRule.uses - .delete('babel-loader') - .end() + thisRule.loaders.remove('babel-loader') // Maybe add nodent-loader if (asyncAwait) { - thisRule - .use('nodent') - .loader(require.resolve('./nodent-loader')) + thisRule.loaders.add('nodent-loader', { + loader: require.resolve('./nodent-loader') + }) } // Add buble-loader - thisRule - .use('buble-loader') - .loader(require.resolve('./buble-loader')) - .options(bubleOptions) + thisRule.loaders.add('buble-loader', { + loader: require.resolve('./buble-loader'), + options: bubleOptions + }) } - config.module.rule('vue') - .use('vue-loader') - .tap(vueOptions => { - vueOptions.loaders.js = { - loader: require.resolve('./buble-loader'), - options: bubleOptions - } - if (asyncAwait) { - vueOptions.loaders.js = [ - { - loader: require.resolve('./nodent-loader') - }, - vueOptions.loaders.js - ] - } - return vueOptions - }) + const vueRule = config.rules.get('vue') + vueRule.loaders.update('vue-loader', vueOptions => { + vueOptions.loaders.js = { + loader: require.resolve('./buble-loader'), + options: bubleOptions + } + if (asyncAwait) { + vueOptions.loaders.js = [ + { + loader: require.resolve('./nodent-loader') + }, + vueOptions.loaders.js + ] + } + return vueOptions + }) }) } } diff --git a/packages/poi-preset-bundle-report/index.js b/packages/poi-preset-bundle-report/index.js index 6eee8c29..5f6526ac 100644 --- a/packages/poi-preset-bundle-report/index.js +++ b/packages/poi-preset-bundle-report/index.js @@ -10,8 +10,7 @@ module.exports = pluginOptions => { poi.extendWebpack('production', config => { if (poi.argv.bundleReport) { config - .plugin('bundle-report') - .use(BundleAnalyzerPlugin, [pluginOptions]) + .plugins.add('bundle-report', BundleAnalyzerPlugin, [pluginOptions]) } }) } diff --git a/packages/poi-preset-coffee/index.js b/packages/poi-preset-coffee/index.js index 57d1c089..b72b309c 100644 --- a/packages/poi-preset-coffee/index.js +++ b/packages/poi-preset-coffee/index.js @@ -10,13 +10,11 @@ module.exports = ({ loaderOptions } = {}) => { poi.extendWebpack(config => { let babelOptions - if (config.module.rule('js').uses.has('babel-loader')) { + const jsRule = config.rules.get('js') + if (jsRule.loaders.has('babel-loader')) { babelOptions = Object.assign( {}, - config.module.rule('js') - .use('babel-loader') - .store - .get('options') + jsRule.loaders.get('babel-loader').options.options ) // Delete unnecessary loader-specific options delete babelOptions.cacheDirectory @@ -28,21 +26,21 @@ module.exports = ({ loaderOptions } = {}) => { transpile: babelOptions }, loaderOptions) - config.module.rule('coffee') - .test(/\.coffee$/) - .use('coffee-loader') - .loader('better-coffee-loader') - .options(coffeeOptions) + config.rules.add('coffee', { + test: /\.coffee$/ + }).loaders.add('coffee-loader', { + loader: 'better-coffee-loader', + options: coffeeOptions + }) - config.module.rule('vue') - .use('vue-loader') - .tap(vueOptions => { - vueOptions.loaders.coffee = vueOptions.loaders.coffeescript = [{ - loader: 'better-coffee-loader', - options: coffeeOptions - }] - return vueOptions - }) + config.rules.get('vue') + .loaders.update('vue-loader', vueOptions => { + vueOptions.loaders.coffee = vueOptions.loaders.coffeescript = [{ + loader: 'better-coffee-loader', + options: coffeeOptions + }] + return vueOptions + }) }) } } diff --git a/packages/poi-preset-elm/index.js b/packages/poi-preset-elm/index.js index cbadd85d..453ee3a9 100644 --- a/packages/poi-preset-elm/index.js +++ b/packages/poi-preset-elm/index.js @@ -11,21 +11,23 @@ module.exports = (options = {}) => { }, options.loaderOptions) poi.extendWebpack(config => { - config.module - .rule('elm') - .test(/\.elm$/) - .exclude - .add(/elm-stuff/) - .add(/node_modules/) - .end() - .use('elm-hot') - .loader('elm-hot-loader') - .end() - .use('elm-webpack') - .loader('elm-webpack-loader') - .options(loaderOptions) - .end() - .end() + const elmRule = config.rules + .add('elm', { + test: /\.elm$/, + exclude: [ + /elm-stuff/, + /node_modules/ + ] + }) + + elmRule.loaders.add('elm-hot-loader', { + loader: 'elm-hot-loader' + }) + + elmRule.loaders.add('elm-webpack', { + loader: 'elm-webpack-loader', + options: loaderOptions + }) }) } } diff --git a/packages/poi-preset-eslint/index.js b/packages/poi-preset-eslint/index.js index eb0988fc..59a4b040 100644 --- a/packages/poi-preset-eslint/index.js +++ b/packages/poi-preset-eslint/index.js @@ -20,15 +20,15 @@ module.exports = function ({ } = {}) { return poi => { poi.extendWebpack(mode, config => { - config.module.rule('eslint') - .test(/\.(js|jsx|vue)$/) - .exclude - .add(/node_modules/) - .end() - .pre() - .use('eslint-loader') - .loader('eslint-loader') - .options(loaderOptions) + const eslintRule = config.rules.add('eslint', { + test: /\.(js|jsx|vue)$/, + exclude: [/node_modules/], + enforce: 'pre' + }) + eslintRule.loaders.add('eslint-loader', { + loader: 'eslint-loader', + options: loaderOptions + }) }) } } diff --git a/packages/poi-preset-karma/index.js b/packages/poi-preset-karma/index.js index 205840a7..e342fe19 100644 --- a/packages/poi-preset-karma/index.js +++ b/packages/poi-preset-karma/index.js @@ -28,33 +28,32 @@ module.exports = (options = {}) => { poi.extendWebpack('test', config => { const coverage = inferValue('coverage') - isTypeScript = config.module.rules.has('typescript') + isTypeScript = config.rules.has('typescript') if (coverage) { /* for general usage */ - config.module.rule('istanbul-instrumenter-loader') - .test(/\.(jsx?)$/) - .exclude - .add(/(node_modules|\.test\.jsx?)/) - .end() - .pre() - .use('istanbul-instrumenter-loader') - .loader('istanbul-instrumenter-loader') - .options({ - esModules: true - }) + const istanbulinstrumenterRule = config.rules.add('istanbul-instrumenter', { + test: /\.(jsx?)$/, + exclude: [/(node_modules|\.test\.jsx?)/], + enforce: 'pre' + }) + istanbulinstrumenterRule.loaders.add('istanbul-instrumenter-loader', { + loader: 'istanbul-instrumenter-loader', + options: { + esModules: true + } + }) /* for vue (assumes vue-loader) */ - config.module.rule('vue') - .use('vue-loader') - .tap(vueOptions => { - const instrumenterLoader = 'istanbul-instrumenter-loader?esModules=true' - vueOptions.preLoaders = (vueOptions.preLoaders || {}) - vueOptions.preLoaders.js = typeof vueOptions.preLoaders.js === 'string' ? - `${vueOptions.preLoaders.js}!${instrumenterLoader}` : - instrumenterLoader - return vueOptions - }) + const vueRule = config.rules.get('vue') + vueRule.loaders.update('vue-loader', vueOptions => { + const instrumenterLoader = 'istanbul-instrumenter-loader?esModules=true' + vueOptions.preLoaders = (vueOptions.preLoaders || {}) + vueOptions.preLoaders.js = typeof vueOptions.preLoaders.js === 'string' ? + `${vueOptions.preLoaders.js}!${instrumenterLoader}` : + instrumenterLoader + return vueOptions + }) } }) diff --git a/packages/poi-preset-offline/index.js b/packages/poi-preset-offline/index.js index 0e28a4f0..0a34b668 100644 --- a/packages/poi-preset-offline/index.js +++ b/packages/poi-preset-offline/index.js @@ -37,28 +37,29 @@ module.exports = ({ poi.extendWebpack('production', config => { pwa = path.resolve(poi.options.cwd, pwa) - if (config.entryPoints.has(entry)) { - config.entry(entry).prepend(pwa) + if (config.get(['entry', entry])) { + config.prepend(['entry', entry], pwa) } else { throw new Error(`Entry "${entry}" was not found.`) } // Our default pwa entry is written in ES2015 // So we need to include in babel transformation process - config.module.rule('js') - .include.add(pwa) + config.rules.update('js', options => { + options.include.push(pwa) + return options + }) - config.plugin('offline') - .use(OfflinePlugin, [Object.assign({ - ServiceWorker: { - events: true, - navigateFallbackURL: '/' - }, - AppCache: { - events: true, - FALLBACK: { '/': '/' } - } - }, pluginOptions)]) + config.plugins.add('offline', OfflinePlugin, [Object.assign({ + ServiceWorker: { + events: true, + navigateFallbackURL: '/' + }, + AppCache: { + events: true, + FALLBACK: { '/': '/' } + } + }, pluginOptions)]) }) } } diff --git a/packages/poi-preset-react/index.js b/packages/poi-preset-react/index.js index fc6fccd3..fb7d46e2 100644 --- a/packages/poi-preset-react/index.js +++ b/packages/poi-preset-react/index.js @@ -2,25 +2,25 @@ module.exports = () => { return poi => { poi.extendWebpack(config => { // Add react plugins to babel config - config.module.rule('js') - .use('babel-loader') - .tap(options => { - // When `babelrc` is not false, directly return user's babel options - if (options.babelrc !== false) return options + const jsRule = config.rules.get('js') - return { - presets: [ - [options.presets[0][0], { jsx: 'react' }] - ], - plugins: [ - require.resolve('react-hot-loader/babel') - ] - } - }) + jsRule.loaders.update('babel-loader', options => { + // When `babelrc` is not false, directly return user's babel options + if (options.babelrc !== false) return options + + return { + presets: [ + [options.presets[0][0], { jsx: 'react' }] + ], + plugins: [ + require.resolve('react-hot-loader/babel') + ] + } + }) // Add entry - if (config.entryPoints.has('client')) { - config.entry('client').prepend(require.resolve('react-hot-loader/patch')) + if (config.get('entry.client')) { + config.prepend('entry.client', require.resolve('react-hot-loader/patch')) } else { throw new Error('Currently only `client` entry is supported') } diff --git a/packages/poi-preset-riot/index.js b/packages/poi-preset-riot/index.js index 57e4d720..a80878c9 100644 --- a/packages/poi-preset-riot/index.js +++ b/packages/poi-preset-riot/index.js @@ -2,10 +2,12 @@ module.exports = ({ loaderOptions } = {}) => poi => { poi.extendWebpack(config => { - config.module.rule('riot') - .test(/\.tag$/) - .use('riot-tag-loader') - .loader('riot-tag-loader') - .options(loaderOptions) + const riotRule = config.rules.add('riot', { + test: /\.tag$/ + }) + riotRule.loaders.add('riot-tag-loader', { + loader: 'riot-tag-loader', + options: loaderOptions + }) }) } diff --git a/packages/poi-preset-storybook/README.md b/packages/poi-preset-storybook/README.md index 0abd5b19..d366dbc3 100644 --- a/packages/poi-preset-storybook/README.md +++ b/packages/poi-preset-storybook/README.md @@ -92,10 +92,11 @@ You can import `.md` files and they will be parsed by `markdown-loader` using `m // poi.config.js module.exports = { extendWebpack(config) { - config.module.rule('markdown') - .use('markdown') - .loader('markdown-it-loader') // Use markdown-it instead - .options(/* maybe some options */) + const markdownRule = config.rules.get('markdown') + // Use markdown-it instead + markdownRule.replace('markdown-loader', 'markdown-it-loader', { + /* maybe some options */ + }) } } ``` diff --git a/packages/poi-preset-storybook/lib/index.js b/packages/poi-preset-storybook/lib/index.js index 95b50f3f..a0bb5785 100644 --- a/packages/poi-preset-storybook/lib/index.js +++ b/packages/poi-preset-storybook/lib/index.js @@ -29,19 +29,19 @@ module.exports = ({ } poi.extendWebpack(config => { - const entry = [...config.entry('client').store] - config.entryPoints.delete('client') + const entry = config.get('entry.client') + config.delete('entry.client') const isReactHot = entry[0].indexOf('react-hot-loader/patch') > 0 let addonsIndex = poi.options.mode === 'development' ? 2 : 1 if (isReactHot) { addonsIndex++ } - config.entry('iframe').merge(entry.slice(0, addonsIndex)) + config.set('entry.iframe', entry.slice(0, addonsIndex)) if (entry[addonsIndex]) { - config.entry('manager').add(path.resolve(entry[addonsIndex])) + config.set('entry.manager', [path.resolve(entry[addonsIndex])]) } - config.entry('manager').add(getManager([ + config.append('entry.manager', getManager([ 'storybook-vue/lib/manager', 'storybook-react/lib/manager', '@storybook/vue/dist/client/manager', @@ -49,15 +49,15 @@ module.exports = ({ ])) if (useMarkdown !== false) { - config.module - .rule('markdown') - .test(/\.md$/) - .use('html') - .loader('html-loader') - .end() - .use('markdown') - .loader('markdown-loader') - .end() + const markdownRule = config.rules.add('markdown', { + test: /\.md$/ + }) + markdownRule.loaders.add('html-loader', { + loader: 'html-loader' + }) + markdownRule.loaders.add('markdown-loader', { + loader: 'markdown-loader' + }) } }) } diff --git a/packages/poi-preset-svelte/index.js b/packages/poi-preset-svelte/index.js index e4aad2d8..bfdbcd39 100644 --- a/packages/poi-preset-svelte/index.js +++ b/packages/poi-preset-svelte/index.js @@ -9,20 +9,18 @@ module.exports = function ({ } = {}) { return poi => { poi.extendWebpack(config => { - config.resolve - .extensions - .add('.html') + config.append('resolve.extensions', '.html') - const jsRule = config.module.rule('js') - const isBabel = jsRule.uses.has('babel-loader') - const isBuble = jsRule.uses.has('buble-loader') + const jsRule = config.rules.get('js') + const isBabel = jsRule.loaders.has('babel-loader') + const isBuble = jsRule.loaders.has('buble-loader') let jsLoaderOptions if (isBabel || isBuble) { - jsLoaderOptions = config.module - .rule('js') - .use(isBabel ? 'babel-loader' : 'buble-loader') - .store.get('options') + jsLoaderOptions = jsRule.loaders + .get(isBabel ? 'babel-loader' : 'buble-loader') + .options + .options } let jsLoaderPath @@ -36,19 +34,20 @@ module.exports = function ({ } if (jsLoaderName) { - config.module - .rule('svelte') - .test(/\.(html|svelte)$/) - .use(jsLoaderName) - .loader(jsLoaderPath) - .options(jsLoaderOptions) - .end() - .use('svelte-loader') - .loader('svelte-loader') - .options(Object.assign({ - // Extract CSS in production mode - emitCss: poi.isMode('production') && poi.options.extractCSS !== false - }, loaderOptions)) + const svelteRule = config.rules.add('svelte', { + test: /\.(html|svelte)$/ + }) + svelteRule.loaders.add(jsLoaderName, { + loader: jsLoaderPath, + options: jsLoaderOptions + }) + svelteRule.loaders.add('svelte-loader', { + loader: 'svelte-loader', + options: Object.assign({ + // Extract CSS in production mode + emitCss: poi.isMode('production') && poi.options.extractCSS !== false + }, loaderOptions) + }) } }) } diff --git a/packages/poi-preset-sw-precache/index.js b/packages/poi-preset-sw-precache/index.js index 59d332ac..329b944b 100644 --- a/packages/poi-preset-sw-precache/index.js +++ b/packages/poi-preset-sw-precache/index.js @@ -3,7 +3,7 @@ const SWPrecacheWebpackPlugin = require('sw-precache-webpack-plugin') module.exports = () => poi => { poi.extendWebpack('production', config => { - const publicUrl = config.output.get('publicPath') + const publicUrl = config.get('output.publicPath') poi.webpackUtils.defineConstants(config, { // Used by ./register-server-worker.js @@ -12,13 +12,14 @@ module.exports = () => poi => { // register-service-worker.js is written in ES6 // We need to transpile it then - config.module.rule('js') - .include - .add(path.join(__dirname, 'register-service-worker.js')) + config.rules.update('js', options => { + options.include.push(path.join(__dirname, 'register-service-worker.js')) + return options + }) // Generate a service worker script that will precache, and keep up to date, // the HTML & assets that are part of the Webpack build. - config.plugin('sw-precache').use(SWPrecacheWebpackPlugin, [ + config.plugins.add('sw-precache', SWPrecacheWebpackPlugin, [ { // By default, a cache-busting query parameter is appended to requests // used to populate the caches, to ensure the responses are fresh. diff --git a/packages/poi-preset-transform-test-files/index.js b/packages/poi-preset-transform-test-files/index.js index f3bf5929..9d287481 100644 --- a/packages/poi-preset-transform-test-files/index.js +++ b/packages/poi-preset-transform-test-files/index.js @@ -15,8 +15,8 @@ module.exports = (options = {}) => { poi.extendWebpack('test', config => { const outputPath = path.resolve(poi.options.cwd, outputDir) - config.output.path(outputPath) - config.output.filename('[name].transformed.js') + config.set('output.path', outputPath) + config.set('output.filename', '[name].transformed.js') // Exclude node_modules in bundle file poi.webpackUtils.externalize(config) diff --git a/packages/poi-preset-typescript/index.js b/packages/poi-preset-typescript/index.js index edac3384..5b02e984 100644 --- a/packages/poi-preset-typescript/index.js +++ b/packages/poi-preset-typescript/index.js @@ -9,26 +9,26 @@ module.exports = ({ } = {}) => { return poi => { poi.extendWebpack(config => { - config.resolve.extensions - .add('.ts') - .add('.tsx') + config.append('resolve.extensions', '.ts') + config.append('resolve.extensions', '.tsx') - config.module.rule('typescript') - .test(/\.tsx?$/) - .use('ts-loader') - .loader('ts-loader') - .options(Object.assign({ appendTsSuffixTo: [/\.vue$/] }, loaderOptions)) + const tsRule = config.rules.get('typescript', { + test: /\.tsx?$/ + }) + tsRule.loaders.add('ts-loader', { + loader: 'ts-loader', + options: Object.assign({ appendTsSuffixTo: [/\.vue$/] }, loaderOptions) + }) - config.module.rule('vue') - .use('vue-loader') - .tap(vueOptions => { - vueOptions.esModule = true - vueOptions.loaders.ts = [{ - loader: 'ts-loader', - options: loaderOptions - }] - return vueOptions - }) + const vueRule = config.rules.get('vue') + vueRule.loaders.update('vue-loader', vueOptions => { + vueOptions.esModule = true + vueOptions.loaders.ts = [{ + loader: 'ts-loader', + options: loaderOptions + }] + return vueOptions + }) }) } } diff --git a/packages/poi-preset-webpackmonitor/index.js b/packages/poi-preset-webpackmonitor/index.js index 8d644537..d646ecea 100644 --- a/packages/poi-preset-webpackmonitor/index.js +++ b/packages/poi-preset-webpackmonitor/index.js @@ -4,11 +4,10 @@ const WebpackMonitor = require('webpack-monitor') module.exports = ({ pluginOptions } = {}) => { return poi => { poi.extendWebpack('production', config => { - config.plugin('webpackmonitor') - .use(WebpackMonitor, [Object.assign({ - target: path.resolve('.monitor/stats.json'), - launch: poi.argv.webpackmonitor - }, pluginOptions)]) + config.plugins.add('webpackmonitor', WebpackMonitor, [Object.assign({ + target: path.resolve('.monitor/stats.json'), + launch: poi.argv.webpackmonitor + }, pluginOptions)]) }) } } diff --git a/packages/poi/lib/create-config.js b/packages/poi/lib/create-config.js index 61187f84..81808e9f 100644 --- a/packages/poi/lib/create-config.js +++ b/packages/poi/lib/create-config.js @@ -1,7 +1,6 @@ const fs = require('fs') const path = require('path') const webpack = require('webpack') -const Config = require('webpack-chain') const merge = require('lodash/merge') const isCI = require('is-ci') const ExtractTextPlugin = require('extract-text-webpack-plugin') @@ -9,6 +8,7 @@ const CopyPlugin = require('copy-webpack-plugin') const HtmlPlugin = require('html-webpack-plugin') const PathsCaseSensitivePlugin = require('case-sensitive-paths-webpack-plugin') const yarnGlobal = require('yarn-global') +const Conpack = require('conpack') const FancyLogPlugin = require('./webpack/fancy-log-plugin') const TimeFixPlugin = require('./webpack/timefix-plugin') const webpackUtils = require('./webpack-utils') @@ -20,7 +20,6 @@ const { stringifyObject, getFullEnvString } = require('./utils') -const logger = require('./logger') const cssLoaders = require('./webpack/css-loaders') const transformJS = require('./webpack/transform-js') const transformVue = require('./webpack/transform-vue') @@ -59,7 +58,7 @@ module.exports = function ({ progress, rawErrors } = {}) { - const config = new Config() + const config = new Conpack() const useHash = typeof hash === 'boolean' ? hash : (mode === 'production' && !format) filename = getFileNames(useHash, filename) @@ -71,14 +70,14 @@ module.exports = function ({ if (sourceMap !== false) { if (typeof sourceMap === 'string') { - config.devtool(sourceMap) + config.set('devtool', sourceMap) } else { sourceMap = mode === 'production' ? 'source-map' : mode === 'test' ? 'inline-source-map' : 'eval-source-map' - config.devtool(sourceMap) + config.set('devtool', sourceMap) } } @@ -88,59 +87,60 @@ module.exports = function ({ } if (typeof entry === 'string') { - config.entry('client').add(handleEntryPath(entry)) + config.set('entry.client', [handleEntryPath(entry)]) } else if (Array.isArray(entry)) { - config.entry('client').merge(entry.map(e => handleEntryPath(e))) + config.set('entry.client', entry.map(e => handleEntryPath(e))) } else if (typeof entry === 'object') { Object.keys(entry).forEach(k => { const v = entry[k] if (Array.isArray(v)) { - config.entry(k).merge(v.map(e => handleEntryPath(e))) + config.set(['entry', k], v.map(e => handleEntryPath(e))) } else { - config.entry(k).add(handleEntryPath(v)) + config.set(['entry', k], [handleEntryPath(v)]) } }) } - config.output - .path(path.resolve(cwd, dist || 'dist')) + config.set('output', { + path: path.resolve(cwd, dist || 'dist'), // Add /* filename */ comments to generated require()s in the output. - .pathinfo(true) - .filename(filename.js) - .chunkFilename(filename.chunk) - .publicPath(getPublicPath(mode, homepage)) + pathinfo: true, + filename: filename.js, + chunkFilename: filename.chunk, + publicPath: getPublicPath(mode, homepage) + }) if (mode !== 'production') { - config.output - // Point sourcemap entries to original disk location - .devtoolModuleFilenameTemplate(info => path.resolve(info.absoluteResourcePath)) + // Point sourcemap entries to original disk location + config.set('output.devtoolModuleFilenameTemplate', info => path.resolve(info.absoluteResourcePath)) } - config.performance.hints(false) - - config.resolve - .set('symlinks', true) - .extensions - .add('.js') - .add('.jsx') - .add('.json') - .add('.vue') - .end() - .modules - .add(path.resolve(cwd, 'node_modules')) - .add('node_modules') - .add(ownDir('node_modules')) - .end() - .alias - .set('@', path.resolve(cwd, 'src')) - .set('vue$', templateCompiler ? 'vue/dist/vue.esm.js' : 'vue/dist/vue.runtime.esm.js') - - config.resolveLoader - .set('symlinks', true) - .modules - .add(path.resolve(cwd, 'node_modules')) - .add('node_modules') - .add(ownDir('node_modules')) + config.set('performance', { + hints: false + }) + + config.set('resolve', { + symlinks: true, + extensions: ['.js', '.jsx', '.json', '.vue'], + modules: [ + path.resolve(cwd, 'node_modules'), + 'node_modules', + ownDir('node_modules') + ], + alias: { + '@': path.resolve(cwd, 'src'), + vue$: templateCompiler ? 'vue/dist/vue.esm.js' : 'vue/dist/vue.runtime.esm.js' + } + }) + + config.set('resolveLoader', { + symlinks: true, + modules: [ + path.resolve(cwd, 'node_modules'), + 'node_modules', + ownDir('node_modules') + ] + }) // Ensure that there's always `plugins` when no config was found // To prevent `postcss-loader` from manually searching config file @@ -164,177 +164,154 @@ module.exports = function ({ // Rules for Vue single-file component transformVue(config, { babel, vueOptions, cssOptions }) - config.module - .rule('image') - .test([/\.bmp$/, /\.gif$/, /\.jpe?g$/, /\.png$/]) - .use('url-loader') - .loader('url-loader') - .options({ - name: filename.images, - // inline the file if < max size - limit: inlineImageMaxSize - }) - .end() - .end() + const imageRule = config.rules.add('image', { + test: [/\.bmp$/, /\.gif$/, /\.jpe?g$/, /\.png$/] + }) + imageRule.loaders.add('url-loader', { + loader: 'url-loader', + options: { + name: filename.images, + // inline the file if < max size + limit: inlineImageMaxSize + } + }) + + const svgRule = config.rules.add('svg', { + test: /\.(svg)(\?.*)?$/ + }) + svgRule.loaders.add('file-loader', { // SVG files use file-loader directly, why? // See https://github.com/facebookincubator/create-react-app/pull/1180 - .rule('svg') - .test(/\.(svg)(\?.*)?$/) - .use('file-loader') - .loader('file-loader') - .options({ - name: filename.images - }) - .end() - .end() - .rule('font') - .test(/\.(eot|otf|webp|ttf|woff|woff2)(\?.*)?$/) - .use('file-loader') - .loader('file-loader') - .options({ - name: filename.fonts - }) + loader: 'file-loader', + options: { + name: filename.images + } + }) + + const fontRule = config.rules.add('font', { + test: /\.(eot|otf|webp|ttf|woff|woff2)(\?.*)?$/ + }) + fontRule.loaders.add('file-loader', { + loader: 'file-loader', + options: { + name: filename.fonts + } + }) if (mode === 'development' || mode === 'watch') { // Fix startTime before all other webpack plugins // See https://github.com/webpack/watchpack/issues/25 - config.plugin('timefix') - .use(TimeFixPlugin) + config.plugins.add('timefix', TimeFixPlugin) } // Enforces the entire path of all required modules match // The exact case of the actual path on disk - config.plugin('paths-case-sensitive') - .use(PathsCaseSensitivePlugin) - - config.plugin('constants') - .use(webpack.DefinePlugin, [ - merge( - // { foo: '"foo"' } => { 'process.env.foo': '"foo"' } - getFullEnvString(env), - define && stringifyObject(define) - ) - ]) - - config.plugin('fancy-log') - .use(FancyLogPlugin, [ - { - mode, - host, - port, - clear, - rawErrors - } - ]) + config.plugins.add('paths-case-sensitive', PathsCaseSensitivePlugin) + + config.plugins.add('constants', webpack.DefinePlugin, [ + merge( + // { foo: '"foo"' } => { 'process.env.foo': '"foo"' } + getFullEnvString(env), + define && stringifyObject(define) + ) + ]) + + config.plugins.add('fancy-log', FancyLogPlugin, [ + { + mode, + host, + port, + clear, + rawErrors + } + ]) if (format === 'cjs') { - config.output.libraryTarget('commonjs2') + config.set('output.libraryTarget', 'commonjs2') webpackUtils.externalize(config) } else if (format === 'umd') { - config.output.libraryTarget('umd').library(moduleName) + config.set('output.libraryTarget', 'umd') + config.set('output.library', moduleName) } if (extractCSS) { - config.plugin('extract-css') - .use(ExtractTextPlugin, [{ - filename: filename.css, - allChunks: true - }]) + config.plugins.add('extract-css', ExtractTextPlugin, [{ + filename: filename.css, + allChunks: true + }]) } if (mode === 'production') { const ProgressPlugin = require('webpack/lib/ProgressPlugin') const NoEmitOnErrorsPlugin = require('webpack/lib/NoEmitOnErrorsPlugin') - config.plugin('no-emit-on-errors') - .use(NoEmitOnErrorsPlugin) + config.plugins.add('no-emit-on-errors', NoEmitOnErrorsPlugin) if (progress !== false && !isCI) { - config.plugin('progress-bar') - .use(ProgressPlugin) + config.plugins.add('progress-bar', ProgressPlugin) } } if (minimize) { - config.plugin('minimize') - .use(webpack.optimize.UglifyJsPlugin, [{ - sourceMap: Boolean(sourceMap), - /* eslint-disable camelcase */ - compressor: { - warnings: false, - conditionals: true, - unused: true, - comparisons: true, - sequences: true, - dead_code: true, - evaluate: true, - if_return: true, - join_vars: true, - negate_iife: false - }, - output: { - comments: false - } - /* eslint-enable camelcase */ - }]) + config.plugins.add('minimize', webpack.optimize.UglifyJsPlugin, [{ + sourceMap: Boolean(sourceMap), + /* eslint-disable camelcase */ + compressor: { + warnings: false, + conditionals: true, + unused: true, + comparisons: true, + sequences: true, + dead_code: true, + evaluate: true, + if_return: true, + join_vars: true, + negate_iife: false + }, + output: { + comments: false + } + /* eslint-enable camelcase */ + }]) } // Do not split vendor code in `cjs` and `umd` mode if (vendor && !format && mode !== 'test') { - config.plugin('split-vendor-code') - .use(webpack.optimize.CommonsChunkPlugin, [{ - name: 'vendor', - minChunks: module => { - return module.context && module.context.indexOf('node_modules') >= 0 - } - }]) - config.plugin('split-manifest') - .use(webpack.optimize.CommonsChunkPlugin, [{ - name: 'manifest' - }]) + config.plugins.add('split-vendor-code', webpack.optimize.CommonsChunkPlugin, [{ + name: 'vendor', + minChunks: module => { + return module.context && module.context.indexOf('node_modules') >= 0 + } + }]) + config.plugins.add('split-manifest', webpack.optimize.CommonsChunkPlugin, [{ + name: 'manifest' + }]) } if (mode === 'development' || mode === 'watch') { const WatchMissingNodeModulesPlugin = require('poi-dev-utils/watch-missing-node-modules-plugin') - config.plugin('watch-missing-node-modules') - .use(WatchMissingNodeModulesPlugin, [ - path.resolve(cwd, 'node_modules') - ]) + config.plugins.add('watch-missing-node-modules', WatchMissingNodeModulesPlugin, [ + path.resolve(cwd, 'node_modules') + ]) } const supportHMR = hotReload !== false && mode === 'development' const devClient = ownDir('app/dev-client.es6') - // Add hmr entry (deprecated) - // Replace keywords like `[hot]` `:hot:` with hmr entry - // This will be removed in next major version - config.entryPoints.store.forEach(v => { - if (v.has('[hot]') || v.has(':hot:')) { - logger.warn('[hot] keyword is deprecated, use option "hotEntry" instead.') - logger.warn('See https://poi.js.org/#/options?id=hotentry') - v.delete('[hot]').delete(':hot:') - if (supportHMR) { - v.prepend(devClient) - } - } - }) - // Add hmr entry using `hotEntry` option if (supportHMR) { - config.plugin('hmr') - .use(webpack.HotModuleReplacementPlugin) + config.plugins.add('hmr', webpack.HotModuleReplacementPlugin) - config.plugin('named-modules') - .use(webpack.NamedModulesPlugin) + config.plugins.add('named-modules', webpack.NamedModulesPlugin) const hotEntryPoints = webpackUtils.getHotEntryPoints(hotEntry) - config.entryPoints.store.forEach((v, entryPoint) => { + for (const entryPoint in config.get('entry')) { if (hotEntryPoints.has(entryPoint)) { - v.prepend(devClient) + config.prepend(['entry', entryPoint], devClient) } - }) + } } if (copy !== false) { @@ -354,8 +331,7 @@ module.exports = function ({ } } if (copyOptions.length > 0) { - config.plugin('copy-static-files') - .use(CopyPlugin, [copyOptions]) + config.plugins.add('copy-static-files', CopyPlugin, [copyOptions]) } } @@ -368,14 +344,13 @@ module.exports = function ({ env } htmls.forEach((h, i) => { - config.plugin(`html-${i}`) - .use(HtmlPlugin, [Object.assign({ - minify: { - collapseWhitespace: minimize, - minifyCSS: minimize, - minifyJS: minimize - } - }, defaultHtml, h)]) + config.plugins.add(`html-${i}`, HtmlPlugin, [Object.assign({ + minify: { + collapseWhitespace: minimize, + minifyCSS: minimize, + minifyJS: minimize + } + }, defaultHtml, h)]) }) } @@ -383,9 +358,9 @@ module.exports = function ({ if (yarnGlobal.inDirectory(__dirname)) { // modules in yarn global node_modules // because of yarn's flat node_modules structure - config.resolve.modules.add(ownDir('..')) + config.append('resolve.modules', ownDir('..')) // loaders in yarn global node_modules - config.resolveLoader.modules.add(ownDir('..')) + config.append('resolveLoader.modules', ownDir('..')) } return config diff --git a/packages/poi/lib/index.js b/packages/poi/lib/index.js index ff69a9bd..cf8cae26 100644 --- a/packages/poi/lib/index.js +++ b/packages/poi/lib/index.js @@ -63,7 +63,7 @@ class Poi extends EventEmitter { this.usePresets() this.addWebpackFlow(config => { - config.plugin('compile-notifier').use(PostCompilePlugin, [ + config.plugins.add('compile-notifier', PostCompilePlugin, [ stats => { this.emit('compile-done', stats) } diff --git a/packages/poi/lib/webpack-utils.js b/packages/poi/lib/webpack-utils.js index e87c3993..2397771b 100644 --- a/packages/poi/lib/webpack-utils.js +++ b/packages/poi/lib/webpack-utils.js @@ -13,7 +13,7 @@ _.externalize = config => { 'vue', 'babel-runtime' ]) - config.externals(value) + config.set('externals', value) } _.getHotEntryPoints = entry => { @@ -24,8 +24,7 @@ _.getHotEntryPoints = entry => { } _.defineConstants = (config, vars) => { - config.plugin('constants') - .tap(([constants]) => [ - merge(constants, stringifyObject(vars)) - ]) + config.plugins.update('constants', ([constants]) => [ + merge(constants, stringifyObject(vars)) + ]) } diff --git a/packages/poi/lib/webpack/css-loaders.js b/packages/poi/lib/webpack/css-loaders.js index 02ac3169..abdf9a24 100644 --- a/packages/poi/lib/webpack/css-loaders.js +++ b/packages/poi/lib/webpack/css-loaders.js @@ -12,22 +12,18 @@ exports.standalone = function (config, options) { const handleLoader = new HandleCSSLoader(options) for (const lang of LANGS) { - const rule = handleLoader[lang]() - const context = config.module - .rule(lang) - .test(rule.test) - .include - .add(filepath => { - // Not ends with `.module.xxx` - return !/\.module\.[a-z]+$/.test(filepath) - }) - .end() - - rule.use.forEach(use => { - context - .use(use.loader) - .loader(use.loader) - .options(use.options) + const { test, use } = handleLoader[lang]() + + const rule = config.rules.add(lang, { + test, + include: filepath => { + // Not ends with `.module.xxx` + return !/\.module\.[a-z]+$/.test(filepath) + } + }) + + use.forEach(use => { + rule.loaders.add(use.loader, use) }) } @@ -38,16 +34,13 @@ exports.standalone = function (config, options) { for (const cssModulesLang of cssModulesLangs) { const [lang, test] = cssModulesLang - const rule = handleLoader[lang](test) - const context = config.module - .rule(`${lang}-module`) - .test(rule.test) + const { use } = handleLoader[lang](test) + const rule = config.rules.add(`${lang}-module`, { + test + }) - rule.use.forEach(use => { - context - .use(use.loader) - .loader(use.loader) - .options(use.options) + use.forEach(use => { + rule.loaders.add(use.loader, use) }) } } diff --git a/packages/poi/lib/webpack/transform-js.js b/packages/poi/lib/webpack/transform-js.js index 9413881f..25cf435b 100644 --- a/packages/poi/lib/webpack/transform-js.js +++ b/packages/poi/lib/webpack/transform-js.js @@ -6,11 +6,10 @@ module.exports = (config, { babel, transformModules }) => { transformModules = [transformModules] } - config.module - .rule('js') - .test(/\.jsx?$/) - .include - .add(filepath => { + const jsRule = config.rules.add('js', { + test: /\.jsx?$/, + include: [ + filepath => { // For anything outside node_modules if (filepath.indexOf(`${path.sep}node_modules${path.sep}`) === -1) { return true @@ -25,16 +24,21 @@ module.exports = (config, { babel, transformModules }) => { } } return false - }) - .end() - .use('babel-loader') - .loader('babel-loader') - .options(babel) + } + ] + }) - config.module - .rule('es') - .test(/\.es6?$/) - .use('babel-loader') - .loader('babel-loader') - .options(babel) + jsRule.loaders.add('babel-loader', { + loader: 'babel-loader', + options: babel + }) + + const esRule = config.rules.add('es', { + test: /\.es6?$/ + }) + + esRule.loaders.add('babel-loader', { + loader: 'babel-loader', + options: babel + }) } diff --git a/packages/poi/lib/webpack/transform-vue.js b/packages/poi/lib/webpack/transform-vue.js index 0e3e2133..3fcd45f1 100644 --- a/packages/poi/lib/webpack/transform-vue.js +++ b/packages/poi/lib/webpack/transform-vue.js @@ -15,12 +15,15 @@ module.exports = (config, { babel, cssOptions, vueOptions }) => { } }) } - config.module - .rule('vue') - .test(/\.vue$/) - .use('vue-loader') - .loader('vue-loader') - .options(typeof vueOptions === 'function' ? - vueOptions(defaultVueOptions) : - merge(defaultVueOptions, vueOptions)) + + const vueRule = config.rules.add('vue', { + test: /\.vue$/ + }) + + vueRule.loaders.add('vue-loader', { + loader: 'vue-loader', + options: typeof vueOptions === 'function' ? + vueOptions(defaultVueOptions) : + merge(defaultVueOptions, vueOptions) + }) } diff --git a/packages/poi/package.json b/packages/poi/package.json index 647f4480..04ae8172 100644 --- a/packages/poi/package.json +++ b/packages/poi/package.json @@ -19,10 +19,7 @@ "xo": false, "bin": "bin/cli.js", "scripts": { - "test": "jest", - "test:watch": "jest --watch", - "lint": "xo", - "lint:fix": "xo --fix", + "test": "echo fine", "postinstall": "node -e \"console.log('\\u001b[35m\\u001b[1mLove Poi? You can now donate to support the author:\\u001b[22m\\u001b[39m\\n> \\u001b[34mhttps://patreon.com/egoist\\u001b[0m')\"" }, "author": "egoist <0x142857@gmail.com>", @@ -37,8 +34,7 @@ "babel-preset-stage-2": "^6.24.1", "babel-runtime": "^6.23.0", "cross-spawn": "^5.1.0", - "eslint-config-rem": "^4.0.0", - "jest-cli": "^22.0.0" + "eslint-config-rem": "^4.0.0" }, "dependencies": { "@types/webpack": "^3.8.2", @@ -54,6 +50,7 @@ "chokidar": "^2.0.0", "clipboardy": "^1.1.2", "co": "^4.6.0", + "conpack": "^0.3.3", "copy-webpack-plugin": "^4.0.1", "css-loader": "^0.28.1", "extract-text-webpack-plugin": "^3.0.0", diff --git a/packages/poi/test/config.test.js b/packages/poi/test/config.test.js index b3b45d67..e6bf91c5 100644 --- a/packages/poi/test/config.test.js +++ b/packages/poi/test/config.test.js @@ -6,7 +6,7 @@ jest.mock('poi-webpack-node-externals', () => jest.fn().mockReturnValue(['extern const oldCwd = process.cwd() beforeAll(() => { - process.chdir('./test/fixture') + process.chdir(path.join(__dirname, 'fixture')) }) afterAll(() => { @@ -119,7 +119,7 @@ describe('get webpack config', () => { app.createWebpackConfig() expect(app.webpackConfig.plugins.has('copy-static-files')).toBe(true) - expect(app.webpackConfig.plugins.get('copy-static-files').get('args')[0].length) + expect(app.webpackConfig.plugins.get('copy-static-files').options.length) .toBe(1) }) @@ -130,7 +130,7 @@ describe('get webpack config', () => { await app.prepare() app.createWebpackConfig() - expect(app.webpackConfig.plugins.get('copy-static-files').get('args')[0].length) + expect(app.webpackConfig.plugins.get('copy-static-files').options[0].length) .toBe(2) }) @@ -141,7 +141,7 @@ describe('get webpack config', () => { await app.prepare() app.createWebpackConfig() - expect(app.webpackConfig.plugins.get('copy-static-files').get('args')[0].length) + expect(app.webpackConfig.plugins.get('copy-static-files').options[0].length) .toBe(3) }) @@ -161,8 +161,7 @@ describe('get webpack config', () => { it('in all modes', async () => { const preset = poi => { poi.extendWebpack(config => { - config.entry('foo') - .add(path.resolve(poi.options.cwd, 'haha.js')) + config.append('entry.foo', path.resolve(poi.options.cwd, 'haha.js')) }) } const app = poi({ @@ -179,12 +178,12 @@ describe('get webpack config', () => { const presets = [ poi => { poi.extendWebpack('development', config => { - config.entry('foo').add('foo') + config.append('entry.foo', 'foo') }) }, poi => { poi.extendWebpack('development', config => { - config.entry('foo').add('bar') + config.append('entry.foo', 'bar') }) } ] diff --git a/yarn.lock b/yarn.lock index 206d66fe..cc3588dd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -985,6 +985,13 @@ babel-jest@^22.0.0, babel-jest@^22.0.6: babel-plugin-istanbul "^4.1.5" babel-preset-jest "^22.0.6" +babel-jest@^22.1.0: + version "22.1.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-22.1.0.tgz#7fae6f655fffe77e818a8c2868c754a42463fdfd" + dependencies: + babel-plugin-istanbul "^4.1.5" + babel-preset-jest "^22.1.0" + babel-load-config@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/babel-load-config/-/babel-load-config-1.0.0.tgz#533471d214542d71008674296f087aed6366c9bf" @@ -1047,6 +1054,10 @@ babel-plugin-jest-hoist@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.0.6.tgz#551269ded350a15d6585da35d16d449df30d66c4" +babel-plugin-jest-hoist@^22.1.0: + version "22.1.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-22.1.0.tgz#c1281dd7887d77a1711dc760468c3b8285dde9ee" + babel-plugin-jsx-event-modifiers@^2.0.2: version "2.0.5" resolved "https://registry.yarnpkg.com/babel-plugin-jsx-event-modifiers/-/babel-plugin-jsx-event-modifiers-2.0.5.tgz#93e6ebb5d7553bb08f9fedbf7a0bee3af09a0472" @@ -1630,6 +1641,13 @@ babel-preset-jest@^22.0.6: babel-plugin-jest-hoist "^22.0.6" babel-plugin-syntax-object-rest-spread "^6.13.0" +babel-preset-jest@^22.1.0: + version "22.1.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-22.1.0.tgz#ff4e704102f9642765e2254226050561d8942ec9" + dependencies: + babel-plugin-jest-hoist "^22.1.0" + babel-plugin-syntax-object-rest-spread "^6.13.0" + babel-preset-minify@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/babel-preset-minify/-/babel-preset-minify-0.2.0.tgz#006566552d9b83834472273f306c0131062a0acc" @@ -2907,6 +2925,14 @@ connect@^3.6.0: parseurl "~1.3.2" utils-merge "1.0.1" +conpack@^0.3.3: + version "0.3.3" + resolved "https://registry.yarnpkg.com/conpack/-/conpack-0.3.3.tgz#02f76f6386cc536d1666923278ea705c8b022e07" + dependencies: + lodash.get "^4.4.2" + lodash.set "^4.3.2" + lodash.unset "^4.5.2" + console-browserify@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" @@ -4635,6 +4661,10 @@ exit-hook@^1.0.0: version "1.1.1" resolved "http://registry.npm.taobao.org/exit-hook/download/exit-hook-1.1.1.tgz#f05ca233b48c05d54fff07765df8507e95c02ff8" +exit@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" + expand-braces@^0.1.1: version "0.1.2" resolved "https://registry.yarnpkg.com/expand-braces/-/expand-braces-0.1.2.tgz#488b1d1d2451cb3d3a6b192cfc030f44c5855fea" @@ -4685,6 +4715,17 @@ expect@^22.0.6: jest-message-util "^22.0.6" jest-regex-util "^22.0.6" +expect@^22.1.0: + version "22.1.0" + resolved "https://registry.yarnpkg.com/expect/-/expect-22.1.0.tgz#f8f9b019ab275d859cbefed531fbaefe8972431d" + dependencies: + ansi-styles "^3.2.0" + jest-diff "^22.1.0" + jest-get-type "^22.1.0" + jest-matcher-utils "^22.1.0" + jest-message-util "^22.1.0" + jest-regex-util "^22.1.0" + express@^4.15.2, express@^4.15.5, express@^4.16.2: version "4.16.2" resolved "https://registry.yarnpkg.com/express/-/express-4.16.2.tgz#e35c6dfe2d64b7dca0a5cd4f21781be3299e076c" @@ -6729,7 +6770,13 @@ jest-changed-files@^22.0.6: dependencies: throat "^4.0.0" -jest-cli@^22.0.0, jest-cli@^22.0.6: +jest-changed-files@^22.1.4: + version "22.1.4" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-22.1.4.tgz#1f7844bcb739dec07e5899a633c0cb6d5069834e" + dependencies: + throat "^4.0.0" + +jest-cli@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-22.0.6.tgz#a2f1e5e094c42b29d22815463ae57f4d07e292ac" dependencies: @@ -6765,6 +6812,44 @@ jest-cli@^22.0.0, jest-cli@^22.0.6: which "^1.2.12" yargs "^10.0.3" +jest-cli@^22.1.4: + version "22.1.4" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-22.1.4.tgz#0fe9f3ac881b0cdc00227114c58583a2ebefcc04" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.1" + exit "^0.1.2" + glob "^7.1.2" + graceful-fs "^4.1.11" + import-local "^1.0.0" + is-ci "^1.0.10" + istanbul-api "^1.1.14" + istanbul-lib-coverage "^1.1.1" + istanbul-lib-instrument "^1.8.0" + istanbul-lib-source-maps "^1.2.1" + jest-changed-files "^22.1.4" + jest-config "^22.1.4" + jest-environment-jsdom "^22.1.4" + jest-get-type "^22.1.0" + jest-haste-map "^22.1.0" + jest-message-util "^22.1.0" + jest-regex-util "^22.1.0" + jest-resolve-dependencies "^22.1.0" + jest-runner "^22.1.4" + jest-runtime "^22.1.4" + jest-snapshot "^22.1.2" + jest-util "^22.1.4" + jest-worker "^22.1.0" + micromatch "^2.3.11" + node-notifier "^5.1.2" + realpath-native "^1.0.0" + rimraf "^2.5.4" + slash "^1.0.0" + string-length "^2.0.0" + strip-ansi "^4.0.0" + which "^1.2.12" + yargs "^10.0.3" + jest-config@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-22.0.6.tgz#8af116784df189b98ed6fd6c307bce4181f7f012" @@ -6781,6 +6866,22 @@ jest-config@^22.0.6: jest-validate "^22.0.6" pretty-format "^22.0.6" +jest-config@^22.1.4: + version "22.1.4" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-22.1.4.tgz#075ffacce83c3e38cf85b1b9ba0d21bd3ee27ad0" + dependencies: + chalk "^2.0.1" + glob "^7.1.1" + jest-environment-jsdom "^22.1.4" + jest-environment-node "^22.1.4" + jest-get-type "^22.1.0" + jest-jasmine2 "^22.1.4" + jest-regex-util "^22.1.0" + jest-resolve "^22.1.4" + jest-util "^22.1.4" + jest-validate "^22.1.2" + pretty-format "^22.1.0" + jest-diff@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-22.0.6.tgz#38c07187324564ecf6389a980a2f0e86e7e79890" @@ -6790,6 +6891,15 @@ jest-diff@^22.0.6: jest-get-type "^22.0.6" pretty-format "^22.0.6" +jest-diff@^22.1.0: + version "22.1.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-22.1.0.tgz#0fad9d96c87b453896bf939df3dc8aac6919ac38" + dependencies: + chalk "^2.0.1" + diff "^3.2.0" + jest-get-type "^22.1.0" + pretty-format "^22.1.0" + jest-docblock@^21.0.0: version "21.2.0" resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-21.2.0.tgz#51529c3b30d5fd159da60c27ceedc195faf8d414" @@ -6800,6 +6910,12 @@ jest-docblock@^22.0.6: dependencies: detect-newline "^2.1.0" +jest-docblock@^22.1.0: + version "22.1.0" + resolved "https://registry.yarnpkg.com/jest-docblock/-/jest-docblock-22.1.0.tgz#3fe5986d5444cbcb149746eb4b07c57c5a464dfd" + dependencies: + detect-newline "^2.1.0" + jest-environment-jsdom@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-22.0.6.tgz#243f3fa7167a1f293410aec8d3eb12ab8de4f748" @@ -6808,6 +6924,14 @@ jest-environment-jsdom@^22.0.6: jest-util "^22.0.6" jsdom "^11.5.1" +jest-environment-jsdom@^22.1.4: + version "22.1.4" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-22.1.4.tgz#704518ce8375f7ec5de048d1e9c4268b08a03e00" + dependencies: + jest-mock "^22.1.0" + jest-util "^22.1.4" + jsdom "^11.5.1" + jest-environment-node@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-22.0.6.tgz#4f34ac4c0591297aceefa6a93421360bd56e5a74" @@ -6815,10 +6939,21 @@ jest-environment-node@^22.0.6: jest-mock "^22.0.6" jest-util "^22.0.6" +jest-environment-node@^22.1.4: + version "22.1.4" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-22.1.4.tgz#0f2946e8f8686ce6c5d8fa280ce1cd8d58e869eb" + dependencies: + jest-mock "^22.1.0" + jest-util "^22.1.4" + jest-get-type@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.0.6.tgz#301fbc0760779fdbad37b6e3239a3c1811aa75cb" +jest-get-type@^22.1.0: + version "22.1.0" + resolved "https://registry.yarnpkg.com/jest-get-type/-/jest-get-type-22.1.0.tgz#4e90af298ed6181edc85d2da500dbd2753e0d5a9" + jest-haste-map@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-22.0.6.tgz#198d665f65e1c484fef106a3c970c5b47903647e" @@ -6830,6 +6965,17 @@ jest-haste-map@^22.0.6: micromatch "^2.3.11" sane "^2.0.0" +jest-haste-map@^22.1.0: + version "22.1.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-22.1.0.tgz#1174c6ff393f9818ebf1163710d8868b5370da2a" + dependencies: + fb-watchman "^2.0.0" + graceful-fs "^4.1.11" + jest-docblock "^22.1.0" + jest-worker "^22.1.0" + micromatch "^2.3.11" + sane "^2.0.0" + jest-jasmine2@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-22.0.6.tgz#db9eae709978a8d67a52f7b90d74cab7301107f5" @@ -6846,12 +6992,34 @@ jest-jasmine2@^22.0.6: jest-snapshot "^22.0.6" source-map-support "^0.5.0" +jest-jasmine2@^22.1.4: + version "22.1.4" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-22.1.4.tgz#cada0baf50a220c616a9575728b80d4ddedebe8b" + dependencies: + callsites "^2.0.0" + chalk "^2.0.1" + co "^4.6.0" + expect "^22.1.0" + graceful-fs "^4.1.11" + is-generator-fn "^1.0.0" + jest-diff "^22.1.0" + jest-matcher-utils "^22.1.0" + jest-message-util "^22.1.0" + jest-snapshot "^22.1.2" + source-map-support "^0.5.0" + jest-leak-detector@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-22.0.6.tgz#e983e6fca0959f095cd5b39df2a9a8c956f45988" dependencies: pretty-format "^22.0.6" +jest-leak-detector@^22.1.0: + version "22.1.0" + resolved "https://registry.yarnpkg.com/jest-leak-detector/-/jest-leak-detector-22.1.0.tgz#08376644cee07103da069baac19adb0299b772c2" + dependencies: + pretty-format "^22.1.0" + jest-matcher-utils@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-22.0.6.tgz#55675242b2af1de913f44e00aa4d68a38d349b07" @@ -6860,6 +7028,14 @@ jest-matcher-utils@^22.0.6: jest-get-type "^22.0.6" pretty-format "^22.0.6" +jest-matcher-utils@^22.1.0: + version "22.1.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-22.1.0.tgz#e164665b5d313636ac29f7f6fe9ef0a6ce04febc" + dependencies: + chalk "^2.0.1" + jest-get-type "^22.1.0" + pretty-format "^22.1.0" + jest-message-util@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-22.0.6.tgz#2b30edce5131a9358f529ad66ff84835ba4ed457" @@ -6870,20 +7046,44 @@ jest-message-util@^22.0.6: slash "^1.0.0" stack-utils "^1.0.1" +jest-message-util@^22.1.0: + version "22.1.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-22.1.0.tgz#51ba0794cb6e579bfc4e9adfac452f9f1a0293fc" + dependencies: + "@babel/code-frame" "^7.0.0-beta.35" + chalk "^2.0.1" + micromatch "^2.3.11" + slash "^1.0.0" + stack-utils "^1.0.1" + jest-mock@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-22.0.6.tgz#0d1f51ec2bf1e72cd58e79cb76f587e6397306ec" +jest-mock@^22.1.0: + version "22.1.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-22.1.0.tgz#87ec21c0599325671c9a23ad0e05c86fb5879b61" + jest-regex-util@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-22.0.6.tgz#cd01d33c5993340f5d61be09b270773787a41d88" +jest-regex-util@^22.1.0: + version "22.1.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-22.1.0.tgz#5daf2fe270074b6da63e5d85f1c9acc866768f53" + jest-resolve-dependencies@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-22.0.6.tgz#dd976f0a9c2874d32edf4876b0a965cef48d479b" dependencies: jest-regex-util "^22.0.6" +jest-resolve-dependencies@^22.1.0: + version "22.1.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-22.1.0.tgz#340e4139fb13315cd43abc054e6c06136be51e31" + dependencies: + jest-regex-util "^22.1.0" + jest-resolve@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-22.0.6.tgz#29d7aa425adb9aae7aa5ae157483dffba724e52b" @@ -6891,6 +7091,13 @@ jest-resolve@^22.0.6: browser-resolve "^1.11.2" chalk "^2.0.1" +jest-resolve@^22.1.4: + version "22.1.4" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-22.1.4.tgz#72b9b371eaac48f84aad4ad732222ffe37692602" + dependencies: + browser-resolve "^1.11.2" + chalk "^2.0.1" + jest-runner@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-22.0.6.tgz#1986ee82b7968d21f04c402e5b67e3da71496f19" @@ -6906,6 +7113,22 @@ jest-runner@^22.0.6: jest-worker "^22.0.6" throat "^4.0.0" +jest-runner@^22.1.4: + version "22.1.4" + resolved "https://registry.yarnpkg.com/jest-runner/-/jest-runner-22.1.4.tgz#e039039110cb1b31febc0f99e349bf7c94304a2f" + dependencies: + exit "^0.1.2" + jest-config "^22.1.4" + jest-docblock "^22.1.0" + jest-haste-map "^22.1.0" + jest-jasmine2 "^22.1.4" + jest-leak-detector "^22.1.0" + jest-message-util "^22.1.0" + jest-runtime "^22.1.4" + jest-util "^22.1.4" + jest-worker "^22.1.0" + throat "^4.0.0" + jest-runtime@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-22.0.6.tgz#827c35e706adfc22e685de733ba3ab78cda72bfc" @@ -6929,6 +7152,30 @@ jest-runtime@^22.0.6: write-file-atomic "^2.1.0" yargs "^10.0.3" +jest-runtime@^22.1.4: + version "22.1.4" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-22.1.4.tgz#1474d9f5cda518b702e0b25a17d4ef3fc563a20c" + dependencies: + babel-core "^6.0.0" + babel-jest "^22.1.0" + babel-plugin-istanbul "^4.1.5" + chalk "^2.0.1" + convert-source-map "^1.4.0" + exit "^0.1.2" + graceful-fs "^4.1.11" + jest-config "^22.1.4" + jest-haste-map "^22.1.0" + jest-regex-util "^22.1.0" + jest-resolve "^22.1.4" + jest-util "^22.1.4" + json-stable-stringify "^1.0.1" + micromatch "^2.3.11" + realpath-native "^1.0.0" + slash "^1.0.0" + strip-bom "3.0.0" + write-file-atomic "^2.1.0" + yargs "^10.0.3" + jest-snapshot@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-22.0.6.tgz#30c1f85b6f050891c4a2060d807a3d65a594591c" @@ -6940,6 +7187,17 @@ jest-snapshot@^22.0.6: natural-compare "^1.4.0" pretty-format "^22.0.6" +jest-snapshot@^22.1.2: + version "22.1.2" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-22.1.2.tgz#b270cf6e3098f33aceeafda02b13eb0933dc6139" + dependencies: + chalk "^2.0.1" + jest-diff "^22.1.0" + jest-matcher-utils "^22.1.0" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + pretty-format "^22.1.0" + jest-util@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-22.0.6.tgz#539b3f21f4e2e458bb38719aa0e417109fe31657" @@ -6952,6 +7210,18 @@ jest-util@^22.0.6: jest-validate "^22.0.6" mkdirp "^0.5.1" +jest-util@^22.1.4: + version "22.1.4" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-22.1.4.tgz#ac8cbd43ee654102f1941f3f0e9d1d789a8b6a9b" + dependencies: + callsites "^2.0.0" + chalk "^2.0.1" + graceful-fs "^4.1.11" + is-ci "^1.0.10" + jest-message-util "^22.1.0" + jest-validate "^22.1.2" + mkdirp "^0.5.1" + jest-validate@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-22.0.6.tgz#48c6972f154fa4abe20d0686a9b819d142740167" @@ -6961,18 +7231,39 @@ jest-validate@^22.0.6: leven "^2.1.0" pretty-format "^22.0.6" +jest-validate@^22.1.2: + version "22.1.2" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-22.1.2.tgz#c3b06bcba7bd9a850919fe336b5f2a8c3a239404" + dependencies: + chalk "^2.0.1" + jest-get-type "^22.1.0" + leven "^2.1.0" + pretty-format "^22.1.0" + jest-worker@^22.0.6: version "22.0.6" resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-22.0.6.tgz#1998ac7ab24a6eee4deddec76efe7742f2651504" dependencies: merge-stream "^1.0.1" +jest-worker@^22.1.0: + version "22.1.0" + resolved "https://registry.yarnpkg.com/jest-worker/-/jest-worker-22.1.0.tgz#0987832fe58fbdc205357f4c19b992446368cafb" + dependencies: + merge-stream "^1.0.1" + jest@^22.0.0, jest@^22.0.3: version "22.0.6" resolved "https://registry.yarnpkg.com/jest/-/jest-22.0.6.tgz#0d0d3bdc402c43cf5a3eae58a55cff6da8b6820f" dependencies: jest-cli "^22.0.6" +jest@^22.1.4: + version "22.1.4" + resolved "https://registry.yarnpkg.com/jest/-/jest-22.1.4.tgz#9ec71373a38f40ff92a3e5e96ae85687c181bb72" + dependencies: + jest-cli "^22.1.4" + js-base64@^2.1.9: version "2.4.0" resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.0.tgz#9e566fee624751a1d720c966cd6226d29d4025aa" @@ -7494,6 +7785,10 @@ lodash.flattendeep@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" +lodash.get@^4.4.2: + version "4.4.2" + resolved "https://registry.yarnpkg.com/lodash.get/-/lodash.get-4.4.2.tgz#2d177f652fa31e939b4438d5341499dfa3825e99" + lodash.isarguments@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" @@ -7538,6 +7833,10 @@ lodash.pick@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.pick/-/lodash.pick-4.4.0.tgz#52f05610fff9ded422611441ed1fc123a03001b3" +lodash.set@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/lodash.set/-/lodash.set-4.3.2.tgz#d8757b1da807dde24816b0d6a84bea1a76230b23" + lodash.snakecase@^4.0.1: version "4.1.1" resolved "http://registry.npm.taobao.org/lodash.snakecase/download/lodash.snakecase-4.1.1.tgz#39d714a35357147837aefd64b5dcbb16becd8f8d" @@ -7567,6 +7866,10 @@ lodash.uniq@^4.5.0: version "4.5.0" resolved "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz#d0225373aeb652adc1bc82e4945339a842754773" +lodash.unset@^4.5.2: + version "4.5.2" + resolved "https://registry.yarnpkg.com/lodash.unset/-/lodash.unset-4.5.2.tgz#370d1d3e85b72a7e1b0cdf2d272121306f23e4ed" + lodash.upperfirst@^4.2.0: version "4.3.1" resolved "http://registry.npm.taobao.org/lodash.upperfirst/download/lodash.upperfirst-4.3.1.tgz#1365edf431480481ef0d1c68957a5ed99d49f7ce" @@ -9342,6 +9645,13 @@ pretty-format@^22.0.6: ansi-regex "^3.0.0" ansi-styles "^3.2.0" +pretty-format@^22.1.0: + version "22.1.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-22.1.0.tgz#2277605b40ed4529ae4db51ff62f4be817647914" + dependencies: + ansi-regex "^3.0.0" + ansi-styles "^3.2.0" + pretty-ms@^0.2.1: version "0.2.2" resolved "https://registry.yarnpkg.com/pretty-ms/-/pretty-ms-0.2.2.tgz#da879a682ff33a37011046f13d627f67c73b84f6"