From 96ce5bf79add2ca0e22f1b24893d065f6025bd59 Mon Sep 17 00:00:00 2001 From: Eli Perelman Date: Wed, 1 Mar 2017 10:45:13 -0600 Subject: [PATCH] Baseline for Neutrino v5 --- package.json | 4 +- packages/neutrino-lint-base/package.json | 4 +- packages/neutrino-lint-base/src/index.js | 2 +- .../neutrino-preset-airbnb-base/package.json | 6 +- .../neutrino-preset-airbnb-base/src/index.js | 3 +- packages/neutrino-preset-jest/package.json | 10 +- packages/neutrino-preset-jest/src/index.js | 63 +-- packages/neutrino-preset-jest/yarn.lock | 453 ++++++++++++++---- packages/neutrino-preset-karma/package.json | 5 +- packages/neutrino-preset-karma/src/index.js | 16 +- packages/neutrino-preset-karma/yarn.lock | 47 +- packages/neutrino-preset-mocha/package.json | 4 +- packages/neutrino-preset-mocha/src/index.js | 30 +- packages/neutrino-preset-node/package.json | 4 +- packages/neutrino-preset-node/src/index.js | 77 ++- packages/neutrino-preset-react/package.json | 6 +- packages/neutrino-preset-react/src/index.js | 89 ++-- packages/neutrino-preset-web/package.json | 4 +- packages/neutrino-preset-web/src/index.js | 50 +- packages/neutrino/bin/neutrino | 50 +- packages/neutrino/package.json | 2 +- packages/neutrino/src/neutrino.js | 125 ++--- yarn.lock | 110 ++++- 23 files changed, 747 insertions(+), 417 deletions(-) diff --git a/package.json b/package.json index 3cac8dc..7790c7a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "neutrino-dev", - "version": "4.2.0", + "version": "5.0.0", "private": true, "author": "Eli Perelman ", "license": "MPL-2.0", @@ -29,6 +29,6 @@ "gitbook-plugin-github": "^2.0.0", "gitbook-plugin-npmsearchlist": "^1.0.0", "gitbook-plugin-prism": "^2.1.0", - "oao": "^0.5.7" + "oao": "^0.7.2" } } diff --git a/packages/neutrino-lint-base/package.json b/packages/neutrino-lint-base/package.json index 0df95e9..cbef4be 100644 --- a/packages/neutrino-lint-base/package.json +++ b/packages/neutrino-lint-base/package.json @@ -1,6 +1,6 @@ { "name": "neutrino-lint-base", - "version": "4.3.1", + "version": "5.0.0", "description": "Neutrino preset starter for adding building ESLint-based presets", "main": "src/index.js", "keywords": [ @@ -20,7 +20,7 @@ "lodash.clonedeep": "^4.5.0" }, "peerDependencies": { - "neutrino": "^4.0.0" + "neutrino": "^5.0.0" }, "homepage": "https://neutrino.js.org", "bugs": "https://github.com/mozilla-neutrino/neutrino-dev/issues" diff --git a/packages/neutrino-lint-base/src/index.js b/packages/neutrino-lint-base/src/index.js index 93c9cfb..1848f2f 100644 --- a/packages/neutrino-lint-base/src/index.js +++ b/packages/neutrino-lint-base/src/index.js @@ -41,7 +41,7 @@ module.exports = neutrino => { config.resolve.modules.add(MODULES); config.resolveLoader.modules.add(MODULES); - neutrino.custom.eslintrc = () => { + neutrino.eslintrc = () => { const options = clone(config.module.rule('lint').loaders.get('eslint').options); options.extends = options.baseConfig.extends; diff --git a/packages/neutrino-preset-airbnb-base/package.json b/packages/neutrino-preset-airbnb-base/package.json index 82c4c0a..8652cdf 100644 --- a/packages/neutrino-preset-airbnb-base/package.json +++ b/packages/neutrino-preset-airbnb-base/package.json @@ -1,6 +1,6 @@ { "name": "neutrino-preset-airbnb-base", - "version": "4.3.1", + "version": "5.0.0", "description": "Neutrino preset for adding Airbnb's base JS ESLint config, following the Airbnb styleguide", "main": "src/index.js", "keywords": [ @@ -15,10 +15,10 @@ "dependencies": { "deepmerge": "^1.3.2", "eslint-config-airbnb-base": "^11.1.0", - "neutrino-lint-base": "^4.3.1" + "neutrino-lint-base": "^5.0.0" }, "peerDependencies": { - "neutrino": "^4.0.0" + "neutrino": "^5.0.0" }, "homepage": "https://neutrino.js.org", "bugs": "https://github.com/mozilla-neutrino/neutrino-dev/issues" diff --git a/packages/neutrino-preset-airbnb-base/src/index.js b/packages/neutrino-preset-airbnb-base/src/index.js index f80776b..eca7adc 100644 --- a/packages/neutrino-preset-airbnb-base/src/index.js +++ b/packages/neutrino-preset-airbnb-base/src/index.js @@ -1,8 +1,7 @@ -const lint = require('neutrino-lint-base'); const merge = require('deepmerge'); module.exports = neutrino => { - lint(neutrino); + neutrino.use(require('neutrino-lint-base')); neutrino.config.module .rule('lint') .loader('eslint', props => merge(props, { diff --git a/packages/neutrino-preset-jest/package.json b/packages/neutrino-preset-jest/package.json index 6794c10..bfc5d41 100644 --- a/packages/neutrino-preset-jest/package.json +++ b/packages/neutrino-preset-jest/package.json @@ -1,6 +1,6 @@ { "name": "neutrino-preset-jest", - "version": "4.3.0", + "version": "5.0.0", "description": "Neutrino preset for testing Neutrino projects with Jest", "main": "src/index.js", "keywords": [ @@ -12,15 +12,17 @@ "license": "MPL-2.0", "repository": "mozilla-neutrino/neutrino-dev", "peerDependencies": { - "neutrino": "^4.0.0" + "neutrino": "^5.0.0" }, "dependencies": { "babel-core": "^6.23.1", "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", - "babel-preset-jest": "^18.0.0", + "babel-preset-jest": "^19.0.0", "deepmerge": "^1.3.2", "eslint-plugin-jest": "^19.0.1", - "jest-cli": "^18.1.0" + "jest": "^19.0.2", + "jest-cli": "^19.0.2", + "lodash.clonedeep": "^4.5.0" }, "homepage": "https://neutrino.js.org", "bugs": "https://github.com/mozilla-neutrino/neutrino-dev/issues" diff --git a/packages/neutrino-preset-jest/src/index.js b/packages/neutrino-preset-jest/src/index.js index 7ecff6d..31595a3 100644 --- a/packages/neutrino-preset-jest/src/index.js +++ b/packages/neutrino-preset-jest/src/index.js @@ -3,51 +3,55 @@ const fs = require('fs'); const path = require('path'); const merge = require('deepmerge'); const os = require('os'); +const clone = require('lodash.clonedeep'); const pkg = require(path.join(process.cwd(), 'package.json')); -function normalizeJestConfig(neutrino, args) { - const jest = neutrino.custom.jest; - const config = neutrino.config; +function normalizeJestOptions(jestOptions, config, args) { + const options = clone(jestOptions); const aliases = config.options.get('alias') || {}; Object .keys(aliases) - .map(key => jest.moduleNameMapper[key] = path.join('', aliases[key])); + .map(key => options.moduleNameMapper[key] = path.join('', aliases[key])); - jest.moduleFileExtensions = [...new Set([ - ...jest.moduleFileExtensions, + options.moduleFileExtensions = [...new Set([ + ...options.moduleFileExtensions, ...config.resolve.extensions.values().map(e => e.replace('.', '')) ])]; - jest.moduleDirectories = [...new Set([ - ...jest.moduleDirectories, + options.moduleDirectories = [...new Set([ + ...options.moduleDirectories, ...config.resolve.modules.values() ])]; - jest.globals = Object.assign({ + options.globals = Object.assign({ BABEL_OPTIONS: config.module.rule('compile').loaders.get('babel').options - }, jest.globals); + }, options.globals); if (args.files.length) { - jest.testRegex = args.files.join('|').replace('.', '\\.'); + options.testRegex = args.files.join('|').replace('.', '\\.'); } - return Object.assign({}, jest, pkg.jest); + return options; } module.exports = neutrino => { - neutrino.custom.jest = { - bail: true, - transform: { - "\\.(js|jsx)$": require.resolve('./transformer') + const jestOptions = merge.all([ + { + bail: true, + transform: { + "\\.(js|jsx)$": require.resolve('./transformer') + }, + roots: [path.join(process.cwd(), 'test')], + testRegex: '(_test|_spec|\\.test|\\.spec)\\.jsx?$', + moduleFileExtensions: ['js', 'jsx'], + moduleDirectories: [path.join(__dirname, '../node_modules')], + moduleNameMapper: { + '\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': require.resolve('./file-mock'), + '\\.(css|less|sass)$': require.resolve('./style-mock') + } }, - testPathDirs: [path.join(process.cwd(), 'test')], - testRegex: '(_test|_spec|\\.test|\\.spec)\\.jsx?$', - moduleFileExtensions: ['js', 'jsx'], - moduleDirectories: [path.join(__dirname, '../node_modules')], - moduleNameMapper: { - '\\.(jpg|jpeg|png|gif|eot|otf|webp|svg|ttf|woff|woff2|mp4|webm|wav|mp3|m4a|aac|oga)$': require.resolve('./file-mock'), - '\\.(css|less|sass)$': require.resolve('./style-mock') - } - }; + pkg.jest, + neutrino.options.jest + ]); neutrino.config.module .rule('compile') @@ -75,14 +79,15 @@ module.exports = neutrino => { } neutrino.on('test', args => { - const jest = normalizeJestConfig(neutrino, args); + const options = normalizeJestOptions(jestOptions, neutrino.config, args); const configFile = path.join(os.tmpdir(), 'config.json'); return new Promise((resolve, reject) => { - const jestCliOptions = { config: configFile, coverage: args.coverage, watch: args.watch }; + const cliOptions = { config: configFile, coverage: args.coverage, watch: args.watch }; + const dir = options.rootDir || process.cwd(); - fs.writeFileSync(configFile, `${JSON.stringify(jest, null, 2)}\n`); - runCLI(jestCliOptions, jest.rootDir || process.cwd(), result => { + fs.writeFileSync(configFile, `${JSON.stringify(options, null, 2)}\n`); + runCLI(cliOptions, dir, result => { if (result.numFailedTests || result.numFailedTestSuites) { reject(); } else { diff --git a/packages/neutrino-preset-jest/yarn.lock b/packages/neutrino-preset-jest/yarn.lock index 1f6e1dc..a179508 100644 --- a/packages/neutrino-preset-jest/yarn.lock +++ b/packages/neutrino-preset-jest/yarn.lock @@ -40,10 +40,23 @@ ansi-styles@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" +ansi-styles@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.0.0.tgz#5404e93a544c4fec7f048262977bebfe3155e0c1" + dependencies: + color-convert "^1.0.0" + ansicolors@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.2.1.tgz#be089599097b74a5c9c4a84a0cdbcdb62bd87aef" +anymatch@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" + dependencies: + arrify "^1.0.0" + micromatch "^2.1.5" + append-transform@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/append-transform/-/append-transform-0.4.0.tgz#d76ebf8ca94d276e247a36bad44a4b74ab611991" @@ -74,7 +87,7 @@ array-unique@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" -arrify@^1.0.1: +arrify@^1.0.0, arrify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" @@ -124,31 +137,7 @@ babel-code-frame@^6.22.0: esutils "^2.0.2" js-tokens "^3.0.0" -babel-core@^6.0.0, babel-core@^6.22.0: - version "6.22.1" - resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.22.1.tgz#9c5fd658ba1772d28d721f6d25d968fc7ae21648" - dependencies: - babel-code-frame "^6.22.0" - babel-generator "^6.22.0" - babel-helpers "^6.22.0" - babel-messages "^6.22.0" - babel-register "^6.22.0" - babel-runtime "^6.22.0" - babel-template "^6.22.0" - babel-traverse "^6.22.1" - babel-types "^6.22.0" - babylon "^6.11.0" - convert-source-map "^1.1.0" - debug "^2.1.1" - json5 "^0.5.0" - lodash "^4.2.0" - minimatch "^3.0.2" - path-is-absolute "^1.0.0" - private "^0.1.6" - slash "^1.0.0" - source-map "^0.5.0" - -babel-core@^6.23.0, babel-core@^6.23.1: +babel-core@^6.0.0, babel-core@^6.23.0, babel-core@^6.23.1: version "6.23.1" resolved "https://registry.yarnpkg.com/babel-core/-/babel-core-6.23.1.tgz#c143cb621bb2f621710c220c5d579d15b8a442df" dependencies: @@ -172,19 +161,7 @@ babel-core@^6.23.0, babel-core@^6.23.1: slash "^1.0.0" source-map "^0.5.0" -babel-generator@^6.18.0, babel-generator@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.22.0.tgz#d642bf4961911a8adc7c692b0c9297f325cda805" - dependencies: - babel-messages "^6.22.0" - babel-runtime "^6.22.0" - babel-types "^6.22.0" - detect-indent "^4.0.0" - jsesc "^1.3.0" - lodash "^4.2.0" - source-map "^0.5.0" - -babel-generator@^6.23.0: +babel-generator@^6.18.0, babel-generator@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-generator/-/babel-generator-6.23.0.tgz#6b8edab956ef3116f79d8c84c5a3c05f32a74bc5" dependencies: @@ -197,13 +174,6 @@ babel-generator@^6.23.0: source-map "^0.5.0" trim-right "^1.0.1" -babel-helpers@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.22.0.tgz#d275f55f2252b8101bff07bc0c556deda657392c" - dependencies: - babel-runtime "^6.22.0" - babel-template "^6.22.0" - babel-helpers@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-helpers/-/babel-helpers-6.23.0.tgz#4f8f2e092d0b6a8808a4bde79c27f1e2ecf0d992" @@ -219,11 +189,13 @@ babel-jest@^18.0.0: babel-plugin-istanbul "^3.0.0" babel-preset-jest "^18.0.0" -babel-messages@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-messages/-/babel-messages-6.22.0.tgz#36066a214f1217e4ed4164867669ecb39e3ea575" +babel-jest@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/babel-jest/-/babel-jest-19.0.0.tgz#59323ced99a3a84d359da219ca881074ffc6ce3f" dependencies: - babel-runtime "^6.22.0" + babel-core "^6.0.0" + babel-plugin-istanbul "^4.0.0" + babel-preset-jest "^19.0.0" babel-messages@^6.23.0: version "6.23.0" @@ -240,10 +212,22 @@ babel-plugin-istanbul@^3.0.0: object-assign "^4.1.0" test-exclude "^3.3.0" +babel-plugin-istanbul@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-istanbul/-/babel-plugin-istanbul-4.0.0.tgz#36bde8fbef4837e5ff0366531a2beabd7b1ffa10" + dependencies: + find-up "^2.1.0" + istanbul-lib-instrument "^1.4.2" + test-exclude "^4.0.0" + babel-plugin-jest-hoist@^18.0.0: version "18.0.0" resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-18.0.0.tgz#4150e70ecab560e6e7344adc849498072d34e12a" +babel-plugin-jest-hoist@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-19.0.0.tgz#4ae2a04ea612a6e73651f3fde52c178991304bea" + babel-plugin-transform-es2015-modules-commonjs@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.23.0.tgz#cba7aa6379fb7ec99250e6d46de2973aaffa7b92" @@ -266,17 +250,11 @@ babel-preset-jest@^18.0.0: dependencies: babel-plugin-jest-hoist "^18.0.0" -babel-register@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-register/-/babel-register-6.22.0.tgz#a61dd83975f9ca4a9e7d6eff3059494cd5ea4c63" +babel-preset-jest@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/babel-preset-jest/-/babel-preset-jest-19.0.0.tgz#22d67201d02324a195811288eb38294bb3cac396" dependencies: - babel-core "^6.22.0" - babel-runtime "^6.22.0" - core-js "^2.4.0" - home-or-tmp "^2.0.0" - lodash "^4.2.0" - mkdirp "^0.5.1" - source-map-support "^0.4.2" + babel-plugin-jest-hoist "^19.0.0" babel-register@^6.23.0: version "6.23.0" @@ -297,17 +275,7 @@ babel-runtime@^6.22.0: core-js "^2.4.0" regenerator-runtime "^0.10.0" -babel-template@^6.16.0, babel-template@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.22.0.tgz#403d110905a4626b317a2a1fcb8f3b73204b2edb" - dependencies: - babel-runtime "^6.22.0" - babel-traverse "^6.22.0" - babel-types "^6.22.0" - babylon "^6.11.0" - lodash "^4.2.0" - -babel-template@^6.23.0: +babel-template@^6.16.0, babel-template@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-template/-/babel-template-6.23.0.tgz#04d4f270adbb3aa704a8143ae26faa529238e638" dependencies: @@ -317,21 +285,7 @@ babel-template@^6.23.0: babylon "^6.11.0" lodash "^4.2.0" -babel-traverse@^6.18.0, babel-traverse@^6.22.0, babel-traverse@^6.22.1: - version "6.22.1" - resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.22.1.tgz#3b95cd6b7427d6f1f757704908f2fc9748a5f59f" - dependencies: - babel-code-frame "^6.22.0" - babel-messages "^6.22.0" - babel-runtime "^6.22.0" - babel-types "^6.22.0" - babylon "^6.15.0" - debug "^2.2.0" - globals "^9.0.0" - invariant "^2.2.0" - lodash "^4.2.0" - -babel-traverse@^6.23.0, babel-traverse@^6.23.1: +babel-traverse@^6.18.0, babel-traverse@^6.23.0, babel-traverse@^6.23.1: version "6.23.1" resolved "https://registry.yarnpkg.com/babel-traverse/-/babel-traverse-6.23.1.tgz#d3cb59010ecd06a97d81310065f966b699e14f48" dependencies: @@ -345,16 +299,7 @@ babel-traverse@^6.23.0, babel-traverse@^6.23.1: invariant "^2.2.0" lodash "^4.2.0" -babel-types@^6.18.0, babel-types@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.22.0.tgz#2a447e8d0ea25d2512409e4175479fd78cc8b1db" - dependencies: - babel-runtime "^6.22.0" - esutils "^2.0.2" - lodash "^4.2.0" - to-fast-properties "^1.0.1" - -babel-types@^6.23.0: +babel-types@^6.18.0, babel-types@^6.22.0, babel-types@^6.23.0: version "6.23.0" resolved "https://registry.yarnpkg.com/babel-types/-/babel-types-6.23.0.tgz#bb17179d7538bad38cd0c9e115d340f77e7e9acf" dependencies: @@ -410,6 +355,12 @@ bser@1.0.2: dependencies: node-int64 "^0.4.0" +bser@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/bser/-/bser-2.0.0.tgz#9ac78d3ed5d915804fd87acb158bc797147a1719" + dependencies: + node-int64 "^0.4.0" + builtin-modules@^1.0.0: version "1.1.1" resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" @@ -491,6 +442,16 @@ code-point-at@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" +color-convert@^1.0.0: + version "1.9.0" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.0.tgz#1accf97dd739b983bf994d56fec8f95853641b7a" + dependencies: + color-name "^1.1.1" + +color-name@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.1.tgz#4b1415304cf50028ea81643643bd82ea05803689" + colors@1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/colors/-/colors-1.0.3.tgz#0433f44d809680fdeb60ed260f1b0c262e82a40b" @@ -682,6 +643,12 @@ fb-watchman@^1.8.0, fb-watchman@^1.9.0: dependencies: bser "1.0.2" +fb-watchman@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fb-watchman/-/fb-watchman-2.0.0.tgz#54e9abf7dfa2f26cd9b1636c588c1afc05de5d58" + dependencies: + bser "^2.0.0" + filename-regex@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.0.tgz#996e3e80479b98b9897f15a8a58b3d084e926775" @@ -710,6 +677,12 @@ find-up@^1.0.0, find-up@^1.1.2: path-exists "^2.0.0" pinkie-promise "^2.0.0" +find-up@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz#45d1b7e506c717ddd482775a2b77920a3c0c57a7" + dependencies: + locate-path "^2.0.0" + for-in@^0.1.5: version "0.1.6" resolved "https://registry.yarnpkg.com/for-in/-/for-in-0.1.6.tgz#c9f96e89bfad18a545af5ec3ed352a1d9e5b4dc8" @@ -792,7 +765,7 @@ graceful-fs@^4.1.2, graceful-fs@^4.1.6: version "1.0.1" resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" -growly@^1.2.0: +growly@^1.2.0, growly@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/growly/-/growly-1.3.0.tgz#f10748cbe76af964b7c96c93c6bcc28af120c081" @@ -1065,6 +1038,10 @@ jest-changed-files@^17.0.2: version "17.0.2" resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-17.0.2.tgz#f5657758736996f590a51b87e5c9369d904ba7b7" +jest-changed-files@^19.0.2: + version "19.0.2" + resolved "https://registry.yarnpkg.com/jest-changed-files/-/jest-changed-files-19.0.2.tgz#16c54c84c3270be408e06d2e8af3f3e37a885824" + jest-cli@^18.1.0: version "18.1.0" resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-18.1.0.tgz#5ead36ecad420817c2c9baa2aa7574f63257b3d6" @@ -1098,6 +1075,38 @@ jest-cli@^18.1.0: worker-farm "^1.3.1" yargs "^6.3.0" +jest-cli@^19.0.2: + version "19.0.2" + resolved "https://registry.yarnpkg.com/jest-cli/-/jest-cli-19.0.2.tgz#cc3620b62acac5f2d93a548cb6ef697d4ec85443" + dependencies: + ansi-escapes "^1.4.0" + callsites "^2.0.0" + chalk "^1.1.1" + graceful-fs "^4.1.6" + is-ci "^1.0.9" + istanbul-api "^1.1.0-alpha.1" + istanbul-lib-coverage "^1.0.0" + istanbul-lib-instrument "^1.1.1" + jest-changed-files "^19.0.2" + jest-config "^19.0.2" + jest-environment-jsdom "^19.0.2" + jest-haste-map "^19.0.0" + jest-jasmine2 "^19.0.2" + jest-message-util "^19.0.0" + jest-regex-util "^19.0.0" + jest-resolve-dependencies "^19.0.0" + jest-runtime "^19.0.2" + jest-snapshot "^19.0.2" + jest-util "^19.0.2" + micromatch "^2.3.11" + node-notifier "^5.0.1" + slash "^1.0.0" + string-length "^1.0.1" + throat "^3.0.0" + which "^1.1.1" + worker-farm "^1.3.1" + yargs "^6.3.0" + jest-config@^18.1.0: version "18.1.0" resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-18.1.0.tgz#6111740a6d48aab86ff5a9e6ab0b98bd993b6ff4" @@ -1111,6 +1120,19 @@ jest-config@^18.1.0: jest-util "^18.1.0" json-stable-stringify "^1.0.0" +jest-config@^19.0.2: + version "19.0.2" + resolved "https://registry.yarnpkg.com/jest-config/-/jest-config-19.0.2.tgz#1b9bd2db0ddd16df61c2b10a54009e1768da6411" + dependencies: + chalk "^1.1.1" + jest-environment-jsdom "^19.0.2" + jest-environment-node "^19.0.2" + jest-jasmine2 "^19.0.2" + jest-regex-util "^19.0.0" + jest-resolve "^19.0.2" + jest-validate "^19.0.2" + pretty-format "^19.0.0" + jest-diff@^18.1.0: version "18.1.0" resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-18.1.0.tgz#4ff79e74dd988c139195b365dc65d87f606f4803" @@ -1120,6 +1142,15 @@ jest-diff@^18.1.0: jest-matcher-utils "^18.1.0" pretty-format "^18.1.0" +jest-diff@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/jest-diff/-/jest-diff-19.0.0.tgz#d1563cfc56c8b60232988fbc05d4d16ed90f063c" + dependencies: + chalk "^1.1.3" + diff "^3.0.0" + jest-matcher-utils "^19.0.0" + pretty-format "^19.0.0" + jest-environment-jsdom@^18.1.0: version "18.1.0" resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-18.1.0.tgz#18b42f0c4ea2bae9f36cab3639b1e8f8c384e24e" @@ -1128,6 +1159,14 @@ jest-environment-jsdom@^18.1.0: jest-util "^18.1.0" jsdom "^9.9.1" +jest-environment-jsdom@^19.0.2: + version "19.0.2" + resolved "https://registry.yarnpkg.com/jest-environment-jsdom/-/jest-environment-jsdom-19.0.2.tgz#ceda859c4a4b94ab35e4de7dab54b926f293e4a3" + dependencies: + jest-mock "^19.0.0" + jest-util "^19.0.2" + jsdom "^9.11.0" + jest-environment-node@^18.1.0: version "18.1.0" resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-18.1.0.tgz#4d6797572c8dda99acf5fae696eb62945547c779" @@ -1135,10 +1174,21 @@ jest-environment-node@^18.1.0: jest-mock "^18.0.0" jest-util "^18.1.0" +jest-environment-node@^19.0.2: + version "19.0.2" + resolved "https://registry.yarnpkg.com/jest-environment-node/-/jest-environment-node-19.0.2.tgz#6e84079db87ed21d0c05e1f9669f207b116fe99b" + dependencies: + jest-mock "^19.0.0" + jest-util "^19.0.2" + jest-file-exists@^17.0.0: version "17.0.0" resolved "https://registry.yarnpkg.com/jest-file-exists/-/jest-file-exists-17.0.0.tgz#7f63eb73a1c43a13f461be261768b45af2cdd169" +jest-file-exists@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/jest-file-exists/-/jest-file-exists-19.0.0.tgz#cca2e587a11ec92e24cfeab3f8a94d657f3fceb8" + jest-haste-map@^18.1.0: version "18.1.0" resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-18.1.0.tgz#06839c74b770a40c1a106968851df8d281c08375" @@ -1149,6 +1199,16 @@ jest-haste-map@^18.1.0: sane "~1.4.1" worker-farm "^1.3.1" +jest-haste-map@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/jest-haste-map/-/jest-haste-map-19.0.0.tgz#adde00b62b1fe04432a104b3254fc5004514b55e" + dependencies: + fb-watchman "^2.0.0" + graceful-fs "^4.1.6" + micromatch "^2.3.11" + sane "~1.5.0" + worker-farm "^1.3.1" + jest-jasmine2@^18.1.0: version "18.1.0" resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-18.1.0.tgz#094e104c2c189708766c77263bb2aecb5860a80b" @@ -1159,6 +1219,16 @@ jest-jasmine2@^18.1.0: jest-snapshot "^18.1.0" jest-util "^18.1.0" +jest-jasmine2@^19.0.2: + version "19.0.2" + resolved "https://registry.yarnpkg.com/jest-jasmine2/-/jest-jasmine2-19.0.2.tgz#167991ac825981fb1a800af126e83afcca832c73" + dependencies: + graceful-fs "^4.1.6" + jest-matcher-utils "^19.0.0" + jest-matchers "^19.0.0" + jest-message-util "^19.0.0" + jest-snapshot "^19.0.2" + jest-matcher-utils@^18.1.0: version "18.1.0" resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-18.1.0.tgz#1ac4651955ee2a60cef1e7fcc98cdfd773c0f932" @@ -1166,6 +1236,13 @@ jest-matcher-utils@^18.1.0: chalk "^1.1.3" pretty-format "^18.1.0" +jest-matcher-utils@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/jest-matcher-utils/-/jest-matcher-utils-19.0.0.tgz#5ecd9b63565d2b001f61fbf7ec4c7f537964564d" + dependencies: + chalk "^1.1.3" + pretty-format "^19.0.0" + jest-matchers@^18.1.0: version "18.1.0" resolved "https://registry.yarnpkg.com/jest-matchers/-/jest-matchers-18.1.0.tgz#0341484bf87a1fd0bac0a4d2c899e2b77a3f1ead" @@ -1175,10 +1252,34 @@ jest-matchers@^18.1.0: jest-util "^18.1.0" pretty-format "^18.1.0" +jest-matchers@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/jest-matchers/-/jest-matchers-19.0.0.tgz#c74ecc6ebfec06f384767ba4d6fa4a42d6755754" + dependencies: + jest-diff "^19.0.0" + jest-matcher-utils "^19.0.0" + jest-message-util "^19.0.0" + jest-regex-util "^19.0.0" + +jest-message-util@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/jest-message-util/-/jest-message-util-19.0.0.tgz#721796b89c0e4d761606f9ba8cb828a3b6246416" + dependencies: + chalk "^1.1.1" + micromatch "^2.3.11" + jest-mock@^18.0.0: version "18.0.0" resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-18.0.0.tgz#5c248846ea33fa558b526f5312ab4a6765e489b3" +jest-mock@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/jest-mock/-/jest-mock-19.0.0.tgz#67038641e9607ab2ce08ec4a8cb83aabbc899d01" + +jest-regex-util@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/jest-regex-util/-/jest-regex-util-19.0.0.tgz#b7754587112aede1456510bb1f6afe74ef598691" + jest-resolve-dependencies@^18.1.0: version "18.1.0" resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-18.1.0.tgz#8134fb5caf59c9ed842fe0152ab01c52711f1bbb" @@ -1186,6 +1287,12 @@ jest-resolve-dependencies@^18.1.0: jest-file-exists "^17.0.0" jest-resolve "^18.1.0" +jest-resolve-dependencies@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/jest-resolve-dependencies/-/jest-resolve-dependencies-19.0.0.tgz#a741ad1fa094140e64ecf2642a504f834ece22ee" + dependencies: + jest-file-exists "^19.0.0" + jest-resolve@^18.1.0: version "18.1.0" resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-18.1.0.tgz#6800accb536658c906cd5e29de412b1ab9ac249b" @@ -1195,6 +1302,14 @@ jest-resolve@^18.1.0: jest-haste-map "^18.1.0" resolve "^1.2.0" +jest-resolve@^19.0.2: + version "19.0.2" + resolved "https://registry.yarnpkg.com/jest-resolve/-/jest-resolve-19.0.2.tgz#5793575de4f07aec32f7d7ff0c6c181963eefb3c" + dependencies: + browser-resolve "^1.11.2" + jest-haste-map "^19.0.0" + resolve "^1.2.0" + jest-runtime@^18.1.0: version "18.1.0" resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-18.1.0.tgz#3abfd687175b21fc3b85a2b8064399e997859922" @@ -1215,6 +1330,26 @@ jest-runtime@^18.1.0: micromatch "^2.3.11" yargs "^6.3.0" +jest-runtime@^19.0.2: + version "19.0.2" + resolved "https://registry.yarnpkg.com/jest-runtime/-/jest-runtime-19.0.2.tgz#d9a43e72de416d27d196fd9c7940d98fe6685407" + dependencies: + babel-core "^6.0.0" + babel-jest "^19.0.0" + babel-plugin-istanbul "^4.0.0" + chalk "^1.1.3" + graceful-fs "^4.1.6" + jest-config "^19.0.2" + jest-file-exists "^19.0.0" + jest-haste-map "^19.0.0" + jest-regex-util "^19.0.0" + jest-resolve "^19.0.2" + jest-util "^19.0.2" + json-stable-stringify "^1.0.1" + micromatch "^2.3.11" + strip-bom "3.0.0" + yargs "^6.3.0" + jest-snapshot@^18.1.0: version "18.1.0" resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-18.1.0.tgz#55b96d2ee639c9bce76f87f2a3fd40b71c7a5916" @@ -1226,6 +1361,18 @@ jest-snapshot@^18.1.0: natural-compare "^1.4.0" pretty-format "^18.1.0" +jest-snapshot@^19.0.2: + version "19.0.2" + resolved "https://registry.yarnpkg.com/jest-snapshot/-/jest-snapshot-19.0.2.tgz#9c1b216214f7187c38bfd5c70b1efab16b0ff50b" + dependencies: + chalk "^1.1.3" + jest-diff "^19.0.0" + jest-file-exists "^19.0.0" + jest-matcher-utils "^19.0.0" + jest-util "^19.0.2" + natural-compare "^1.4.0" + pretty-format "^19.0.0" + jest-util@^18.1.0: version "18.1.0" resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-18.1.0.tgz#3a99c32114ab17f84be094382527006e6d4bfc6a" @@ -1237,6 +1384,34 @@ jest-util@^18.1.0: jest-mock "^18.0.0" mkdirp "^0.5.1" +jest-util@^19.0.2: + version "19.0.2" + resolved "https://registry.yarnpkg.com/jest-util/-/jest-util-19.0.2.tgz#e0a0232a2ab9e6b2b53668bdb3534c2b5977ed41" + dependencies: + chalk "^1.1.1" + graceful-fs "^4.1.6" + jest-file-exists "^19.0.0" + jest-message-util "^19.0.0" + jest-mock "^19.0.0" + jest-validate "^19.0.2" + leven "^2.0.0" + mkdirp "^0.5.1" + +jest-validate@^19.0.2: + version "19.0.2" + resolved "https://registry.yarnpkg.com/jest-validate/-/jest-validate-19.0.2.tgz#dc534df5f1278d5b63df32b14241d4dbf7244c0c" + dependencies: + chalk "^1.1.1" + jest-matcher-utils "^19.0.0" + leven "^2.0.0" + pretty-format "^19.0.0" + +jest@^19.0.2: + version "19.0.2" + resolved "https://registry.yarnpkg.com/jest/-/jest-19.0.2.tgz#b794faaf8ff461e7388f28beef559a54f20b2c10" + dependencies: + jest-cli "^19.0.2" + jodid25519@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" @@ -1258,7 +1433,7 @@ jsbn@~0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" -jsdom@^9.9.1: +jsdom@^9.11.0, jsdom@^9.9.1: version "9.11.0" resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-9.11.0.tgz#a95b0304e521a2ca5a63c6ea47bf7708a7a84591" dependencies: @@ -1290,7 +1465,7 @@ json-schema@0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" -json-stable-stringify@^1.0.0: +json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" dependencies: @@ -1336,6 +1511,10 @@ lcid@^1.0.0: dependencies: invert-kv "^1.0.0" +leven@^2.0.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/leven/-/leven-2.1.0.tgz#c2e7a9f772094dee9d34202ae8acce4687875580" + levn@~0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" @@ -1353,6 +1532,13 @@ load-json-file@^1.0.0: pinkie-promise "^2.0.0" strip-bom "^2.0.0" +locate-path@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz#2b568b265eec944c6d9c0de9c3dbbbca0354cd8e" + dependencies: + p-locate "^2.0.0" + path-exists "^3.0.0" + lodash._arraycopy@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz#76e7b7c1f1fb92547374878a562ed06a3e50f6e1" @@ -1406,6 +1592,10 @@ lodash.clonedeep@^3.0.0: lodash._baseclone "^3.0.0" lodash._bindcallback "^3.0.0" +lodash.clonedeep@^4.5.0: + version "4.5.0" + resolved "https://registry.yarnpkg.com/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz#e23f3f9c4f8fbdde872529c1071857a086e5ccef" + lodash.isarguments@^3.0.0: version "3.1.0" resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" @@ -1460,7 +1650,7 @@ merge@^1.1.3: version "1.2.0" resolved "https://registry.yarnpkg.com/merge/-/merge-1.2.0.tgz#7531e39d4949c281a66b8c5a6e0265e8b05894da" -micromatch@^2.3.11: +micromatch@^2.1.5, micromatch@^2.3.11: version "2.3.11" resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" dependencies: @@ -1538,6 +1728,15 @@ node-notifier@^4.6.1: shellwords "^0.1.0" which "^1.0.5" +node-notifier@^5.0.1: + version "5.0.2" + resolved "https://registry.yarnpkg.com/node-notifier/-/node-notifier-5.0.2.tgz#4438449fe69e321f941cef943986b0797032701b" + dependencies: + growly "^1.3.0" + semver "^5.3.0" + shellwords "^0.1.0" + which "^1.2.12" + normalize-package-data@^2.3.2: version "2.3.5" resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.5.tgz#8d924f142960e1777e7ffe170543631cc7cb02df" @@ -1612,6 +1811,16 @@ os-tmpdir@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" +p-limit@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" + +p-locate@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz#20a0103b222a70c8fd39cc2e580680f3dde5ec43" + dependencies: + p-limit "^1.1.0" + parse-glob@^3.0.4: version "3.0.4" resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" @@ -1637,6 +1846,10 @@ path-exists@^2.0.0: dependencies: pinkie-promise "^2.0.0" +path-exists@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz#ce0ebeaa5f78cb18925ea7d810d7b59b010fd515" + path-is-absolute@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" @@ -1681,6 +1894,12 @@ pretty-format@^18.1.0: dependencies: ansi-styles "^2.2.1" +pretty-format@^19.0.0: + version "19.0.0" + resolved "https://registry.yarnpkg.com/pretty-format/-/pretty-format-19.0.0.tgz#56530d32acb98a3fa4851c4e2b9d37b420684c84" + dependencies: + ansi-styles "^3.0.0" + private@^0.1.6: version "0.1.7" resolved "https://registry.yarnpkg.com/private/-/private-0.1.7.tgz#68ce5e8a1ef0a23bb570cc28537b5332aba63ef1" @@ -1814,6 +2033,18 @@ sane@~1.4.1: walker "~1.0.5" watch "~0.10.0" +sane@~1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/sane/-/sane-1.5.0.tgz#a4adeae764d048621ecb27d5f9ecf513101939f3" + dependencies: + anymatch "^1.3.0" + exec-sh "^0.2.0" + fb-watchman "^1.8.0" + minimatch "^3.0.2" + minimist "^1.1.1" + walker "~1.0.5" + watch "~0.10.0" + sax@^1.2.1: version "1.2.2" resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.2.tgz#fd8631a23bc7826bef5d871bdb87378c95647828" @@ -1895,6 +2126,12 @@ sshpk@^1.7.0: jsbn "~0.1.0" tweetnacl "~0.14.0" +string-length@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/string-length/-/string-length-1.0.1.tgz#56970fb1c38558e9e70b728bf3de269ac45adfac" + dependencies: + strip-ansi "^3.0.0" + string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -1917,6 +2154,10 @@ strip-ansi@^3.0.0, strip-ansi@^3.0.1: dependencies: ansi-regex "^2.0.0" +strip-bom@3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" + strip-bom@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" @@ -1947,6 +2188,16 @@ test-exclude@^3.3.0: read-pkg-up "^1.0.1" require-main-filename "^1.0.1" +test-exclude@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/test-exclude/-/test-exclude-4.0.0.tgz#0ddc0100b8ae7e88b34eb4fd98a907e961991900" + dependencies: + arrify "^1.0.1" + micromatch "^2.3.11" + object-assign "^4.1.0" + read-pkg-up "^1.0.1" + require-main-filename "^1.0.1" + throat@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/throat/-/throat-3.0.0.tgz#e7c64c867cbb3845f10877642f7b60055b8ec0d6" @@ -2052,7 +2303,7 @@ which-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/which-module/-/which-module-1.0.0.tgz#bba63ca861948994ff307736089e3b96026c2a4f" -which@^1.0.5, which@^1.1.1: +which@^1.0.5, which@^1.1.1, which@^1.2.12: version "1.2.12" resolved "https://registry.yarnpkg.com/which/-/which-1.2.12.tgz#de67b5e450269f194909ef23ece4ebe416fa1192" dependencies: diff --git a/packages/neutrino-preset-karma/package.json b/packages/neutrino-preset-karma/package.json index 8c31681..adad84e 100644 --- a/packages/neutrino-preset-karma/package.json +++ b/packages/neutrino-preset-karma/package.json @@ -1,6 +1,6 @@ { "name": "neutrino-preset-karma", - "version": "4.2.0", + "version": "5.0.0", "description": "Neutrino preset for testing Neutrino projects with Karma", "main": "src/index.js", "keywords": [ @@ -14,9 +14,10 @@ "license": "MPL-2.0", "repository": "mozilla-neutrino/neutrino-dev", "peerDependencies": { - "neutrino": "^4.0.0" + "neutrino": "^5.0.0" }, "dependencies": { + "deepmerge": "^1.3.2", "karma": "^1.5.0", "karma-chrome-launcher": "^2.0.0", "karma-coverage": "^1.1.1", diff --git a/packages/neutrino-preset-karma/src/index.js b/packages/neutrino-preset-karma/src/index.js index bd19698..96b863a 100644 --- a/packages/neutrino-preset-karma/src/index.js +++ b/packages/neutrino-preset-karma/src/index.js @@ -1,7 +1,8 @@ const { Server } = require('karma'); +const merge = require('deepmerge'); module.exports = neutrino => { - neutrino.custom.karma = { + const defaults = { plugins: [ require.resolve('karma-webpack'), require.resolve('karma-chrome-launcher'), @@ -35,11 +36,16 @@ module.exports = neutrino => { }; neutrino.on('test', ({ files, watch }) => { - const { karma } = neutrino.custom; + const karma = merge.all([ + defaults, + neutrino.options.karma, + { + singleRun: !watch, + autoWatch: watch, + webpack: neutrino.getWebpackOptions() + } + ]); - karma.singleRun = !watch; - karma.autoWatch = watch; - karma.webpack = neutrino.getWebpackOptions(); delete karma.webpack.plugins; if (files && files.length) { diff --git a/packages/neutrino-preset-karma/yarn.lock b/packages/neutrino-preset-karma/yarn.lock index dfff2bf..5c1322b 100644 --- a/packages/neutrino-preset-karma/yarn.lock +++ b/packages/neutrino-preset-karma/yarn.lock @@ -630,6 +630,10 @@ deep-is@~0.1.3: version "0.1.3" resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" +deepmerge@^1.3.2: + version "1.3.2" + resolved "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.3.2.tgz#1663691629d4dbfe364fa12a2a4f0aa86aa3a050" + delayed-stream@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" @@ -1002,7 +1006,7 @@ glob-parent@^2.0.0: dependencies: is-glob "^2.0.0" -glob@7.0.5, glob@^7.0.5: +glob@7.0.5: version "7.0.5" resolved "https://registry.yarnpkg.com/glob/-/glob-7.0.5.tgz#b4202a69099bbb4d292a7c1b95b6682b67ebdc95" dependencies: @@ -1023,7 +1027,7 @@ glob@^5.0.15: once "^1.3.0" path-is-absolute "^1.0.0" -glob@^7.1.1: +glob@^7.0.5, glob@^7.1.1: version "7.1.1" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" dependencies: @@ -1788,14 +1792,10 @@ oauth-sign@~0.8.1: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" -object-assign@4.1.0: +object-assign@4.1.0, object-assign@^4.0.1, object-assign@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.0.tgz#7a3b3d0e98063d43f4c03f2e8ae6cd51a86883a0" -object-assign@^4.0.1, object-assign@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - object-component@0.0.3: version "0.0.3" resolved "https://registry.yarnpkg.com/object-component/-/object-component-0.0.3.tgz#f0c69aa50efc95b866c186f400a33769cb2f1291" @@ -2180,15 +2180,15 @@ right-align@^0.1.1: dependencies: align-text "^0.1.1" -rimraf@2, rimraf@~2.5.1, rimraf@~2.5.4: - version "2.5.4" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" +rimraf@2, rimraf@^2.6.0: + version "2.6.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" dependencies: glob "^7.0.5" -rimraf@^2.6.0: - version "2.6.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" +rimraf@~2.5.1, rimraf@~2.5.4: + version "2.5.4" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.5.4.tgz#96800093cbf1a0c86bd95b4625467535c29dfa04" dependencies: glob "^7.0.5" @@ -2200,14 +2200,14 @@ safe-buffer@^5.0.1: version "5.0.1" resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" -"semver@2 || 3 || 4 || 5", semver@~4.3.3: - version "4.3.6" - resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" - -semver@~5.3.0: +"semver@2 || 3 || 4 || 5", semver@~5.3.0: version "5.3.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" +semver@~4.3.3: + version "4.3.6" + resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" + set-blocking@^2.0.0, set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -2580,16 +2580,7 @@ watchpack@^1.2.0: chokidar "^1.4.3" graceful-fs "^4.1.2" -webpack-dev-middleware@^1.0.11: - version "1.10.0" - resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.10.0.tgz#7d5be2651e692fddfafd8aaed177c16ff51f0eb8" - dependencies: - memory-fs "~0.4.1" - mime "^1.3.4" - path-is-absolute "^1.0.0" - range-parser "^1.0.3" - -webpack-dev-middleware@^1.10.1: +webpack-dev-middleware@^1.0.11, webpack-dev-middleware@^1.10.1: version "1.10.1" resolved "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-1.10.1.tgz#c6b4cf428139cf1aefbe06a0c00fdb4f8da2f893" dependencies: diff --git a/packages/neutrino-preset-mocha/package.json b/packages/neutrino-preset-mocha/package.json index 31e1ecb..47a2f95 100644 --- a/packages/neutrino-preset-mocha/package.json +++ b/packages/neutrino-preset-mocha/package.json @@ -1,6 +1,6 @@ { "name": "neutrino-preset-mocha", - "version": "4.2.0", + "version": "5.0.0", "description": "Neutrino preset for testing Neutrino projects with Mocha", "main": "src/index.js", "keywords": [ @@ -12,7 +12,7 @@ "license": "MPL-2.0", "repository": "mozilla-neutrino/neutrino-dev", "peerDependencies": { - "neutrino": "^4.0.0" + "neutrino": "^5.0.0" }, "dependencies": { "babel-plugin-transform-es2015-modules-commonjs": "^6.23.0", diff --git a/packages/neutrino-preset-mocha/src/index.js b/packages/neutrino-preset-mocha/src/index.js index d4a7082..45d8a14 100644 --- a/packages/neutrino-preset-mocha/src/index.js +++ b/packages/neutrino-preset-mocha/src/index.js @@ -2,7 +2,7 @@ const mocha = require('./mocha'); const merge = require('deepmerge'); module.exports = neutrino => { - neutrino.custom.mocha = { + const defaults = { reporter: 'spec', ui: 'tdd', bail: true @@ -10,21 +10,19 @@ module.exports = neutrino => { neutrino.config.module .rule('compile') - .loader('babel', ({ options }) => { - return { - options: merge(options, { - env: { - test: { - plugins: [require.resolve('babel-plugin-transform-es2015-modules-commonjs')] - } + .loader('babel', props => merge(props, { + options: { + env: { + test: { + plugins: [require.resolve('babel-plugin-transform-es2015-modules-commonjs')] } - }) - }; - }); + } + } + })); - neutrino.on('test', ({ files }) => { - const babelOptions = neutrino.config.module.rule('compile').loaders.get('babel').options; - - return mocha(neutrino.custom.mocha, babelOptions, files); - }); + neutrino.on('test', ({ files }) => mocha( + merge(defaults, neutrino.options.mocha), + neutrino.config.module.rule('compile').loaders.get('babel').options, + files + )); }; diff --git a/packages/neutrino-preset-node/package.json b/packages/neutrino-preset-node/package.json index b175a0e..3fc7aa8 100644 --- a/packages/neutrino-preset-node/package.json +++ b/packages/neutrino-preset-node/package.json @@ -1,6 +1,6 @@ { "name": "neutrino-preset-node", - "version": "4.2.2", + "version": "5.0.0", "description": "Neutrino preset for building Node.js projects", "main": "src/index.js", "keywords": [ @@ -26,7 +26,7 @@ "webpack-node-externals": "1.5.4" }, "peerDependencies": { - "neutrino": "^4.0.0" + "neutrino": "^5.0.0" }, "homepage": "https://neutrino.js.org", "bugs": "https://github.com/mozilla-neutrino/neutrino-dev/issues" diff --git a/packages/neutrino-preset-node/src/index.js b/packages/neutrino-preset-node/src/index.js index c74eef3..f4371e5 100644 --- a/packages/neutrino-preset-node/src/index.js +++ b/packages/neutrino-preset-node/src/index.js @@ -69,49 +69,47 @@ module.exports = neutrino => { if (config.module.rules.has('lint')) { config.module .rule('lint') - .loader('eslint', ({ options }) => { - return { - options: merge(options, { - envs: ['node'], - rules: { - // enforce return after a callback - 'callback-return': 'off', + .loader('eslint', props => merge(props, { + options: { + envs: ['node'], + rules: { + // enforce return after a callback + 'callback-return': 'off', - // require all requires be top-level - // http://eslint.org/docs/rules/global-require - 'global-require': 'error', + // require all requires be top-level + // http://eslint.org/docs/rules/global-require + 'global-require': 'error', - // enforces error handling in callbacks (node environment) - 'handle-callback-err': 'off', + // enforces error handling in callbacks (node environment) + 'handle-callback-err': 'off', - // Allow console in Node.js - 'no-console': 'off', + // Allow console in Node.js + 'no-console': 'off', - // disallow mixing regular variable and require declarations - 'no-mixed-requires': ['off', false], + // disallow mixing regular variable and require declarations + 'no-mixed-requires': ['off', false], - // disallow use of new operator with the require function - 'no-new-require': 'error', + // disallow use of new operator with the require function + 'no-new-require': 'error', - // disallow string concatenation with __dirname and __filename - // http://eslint.org/docs/rules/no-path-concat - 'no-path-concat': 'error', + // disallow string concatenation with __dirname and __filename + // http://eslint.org/docs/rules/no-path-concat + 'no-path-concat': 'error', - // disallow use of process.env - 'no-process-env': 'off', + // disallow use of process.env + 'no-process-env': 'off', - // disallow process.exit() - 'no-process-exit': 'off', + // disallow process.exit() + 'no-process-exit': 'off', - // restrict usage of specified node modules - 'no-restricted-modules': 'off', + // restrict usage of specified node modules + 'no-restricted-modules': 'off', - // disallow use of synchronous methods (off by default) - 'no-sync': 'off' - } - }) - }; - }); + // disallow use of synchronous methods (off by default) + 'no-sync': 'off' + } + } + })); } config.module @@ -120,15 +118,12 @@ module.exports = neutrino => { .include(SRC, TEST) .loader('babel', require.resolve('babel-loader'), { presets: [ - [ - require.resolve('babel-preset-env'), - { - modules: false, - targets: { - node: 6.9 - } + [require.resolve('babel-preset-env'), { + modules: false, + targets: { + node: 6.9 } - ] + }] ] }); diff --git a/packages/neutrino-preset-react/package.json b/packages/neutrino-preset-react/package.json index 0459934..3d0746e 100644 --- a/packages/neutrino-preset-react/package.json +++ b/packages/neutrino-preset-react/package.json @@ -1,6 +1,6 @@ { "name": "neutrino-preset-react", - "version": "4.2.3", + "version": "5.0.0", "description": "Neutrino preset for building React web applications", "main": "src/index.js", "keywords": [ @@ -18,12 +18,12 @@ "babel-preset-react": "^6.23.0", "deepmerge": "^1.3.2", "eslint-plugin-react": "^6.10.0", - "neutrino-preset-web": "^4.2.3", + "neutrino-preset-web": "^5.0.0", "react-hot-loader": "^3.0.0-beta.6", "webpack": "^2.2.1" }, "peerDependencies": { - "neutrino": "^4.0.0" + "neutrino": "^5.0.0" }, "homepage": "https://neutrino.js.org", "bugs": "https://github.com/mozilla-neutrino/neutrino-dev/issues" diff --git a/packages/neutrino-preset-react/src/index.js b/packages/neutrino-preset-react/src/index.js index 7db13f7..defbc7b 100644 --- a/packages/neutrino-preset-react/src/index.js +++ b/packages/neutrino-preset-react/src/index.js @@ -1,6 +1,5 @@ 'use strict'; -const web = require('neutrino-preset-web'); const merge = require('deepmerge'); const path = require('path'); const webpack = require('webpack'); @@ -8,7 +7,7 @@ const webpack = require('webpack'); const MODULES = path.join(__dirname, '../node_modules'); module.exports = neutrino => { - web(neutrino); + neutrino.use(require('neutrino-preset-web')); const { config } = neutrino; @@ -16,58 +15,54 @@ module.exports = neutrino => { config.module .rule('lint') .test(/\.jsx?$/) - .loader('eslint', ({ options }) => { - return { - options: merge(options, { - plugins: ['react'], - baseConfig: { - extends: ['plugin:react/recommended'] - }, - parserOptions: { - ecmaFeatures: { - experimentalObjectRestSpread: true - } - }, - rules: { - 'react/prop-types': ['off'], - 'jsx-quotes': ['error', 'prefer-double'], - 'class-methods-use-this': ['error', { - exceptMethods: [ - 'render', - 'getInitialState', - 'getDefaultProps', - 'getChildContext', - 'componentWillMount', - 'componentDidMount', - 'componentWillReceiveProps', - 'shouldComponentUpdate', - 'componentWillUpdate', - 'componentDidUpdate', - 'componentWillUnmount' - ] - }] + .loader('eslint', props => merge(props, { + options: { + plugins: ['react'], + baseConfig: { + extends: ['plugin:react/recommended'] + }, + parserOptions: { + ecmaFeatures: { + experimentalObjectRestSpread: true } - }) - }; - }); + }, + rules: { + 'react/prop-types': ['off'], + 'jsx-quotes': ['error', 'prefer-double'], + 'class-methods-use-this': ['error', { + exceptMethods: [ + 'render', + 'getInitialState', + 'getDefaultProps', + 'getChildContext', + 'componentWillMount', + 'componentDidMount', + 'componentWillReceiveProps', + 'shouldComponentUpdate', + 'componentWillUpdate', + 'componentDidUpdate', + 'componentWillUnmount' + ] + }] + } + } + })); } config.module .rule('compile') .test(/\.jsx?$/) - .loader('babel', ({ options }) => { - return { - options: merge(options, { - presets: [require.resolve('babel-preset-react')], - plugins: [require.resolve('babel-plugin-transform-object-rest-spread')], - env: { - development: { - plugins: [require.resolve('react-hot-loader/babel')] - } + .loader('babel', props => merge(props, { + options: { + presets: [require.resolve('babel-preset-react')], + plugins: [require.resolve('babel-plugin-transform-object-rest-spread')], + env: { + development: { + plugins: [require.resolve('react-hot-loader/babel')] } - }) - }; - }); + } + } + })); config.resolve.modules.add(MODULES); config.resolve.extensions.add('.jsx'); diff --git a/packages/neutrino-preset-web/package.json b/packages/neutrino-preset-web/package.json index 0d7f0ba..4073fff 100644 --- a/packages/neutrino-preset-web/package.json +++ b/packages/neutrino-preset-web/package.json @@ -1,6 +1,6 @@ { "name": "neutrino-preset-web", - "version": "4.2.3", + "version": "5.0.0", "description": "Neutrino preset for building generic web applications", "main": "src/index.js", "keywords": [ @@ -34,7 +34,7 @@ "worker-loader": "^0.8.0" }, "peerDependencies": { - "neutrino": "^4.0.0" + "neutrino": "^5.0.0" }, "homepage": "https://neutrino.js.org", "bugs": "https://github.com/mozilla-neutrino/neutrino-dev/issues" diff --git a/packages/neutrino-preset-web/src/index.js b/packages/neutrino-preset-web/src/index.js index 41915ef..69a902b 100644 --- a/packages/neutrino-preset-web/src/index.js +++ b/packages/neutrino-preset-web/src/index.js @@ -22,7 +22,23 @@ const URL_LOADER = require.resolve('url-loader'); const PROJECT_MODULES = path.join(CWD, 'node_modules'); const MODULES = path.join(__dirname, '../node_modules'); -module.exports = ({ config }) => { +module.exports = neutrino => { + const { config } = neutrino; + + const html = { + inject: false, + template: htmlTemplate, + appMountId: 'root', + xhtml: true, + mobile: true, + minify: { + useShortDoctype: true, + keepClosingSlash: true, + collapseWhitespace: true, + preserveLineBreaks: true, + } + }; + config .target('web') .context(CWD) @@ -142,14 +158,12 @@ module.exports = ({ config }) => { if (config.module.rules.has('lint')) { config.module .rule('lint') - .loader('eslint', ({ options }) => { - return { - options: merge(options, { - globals: ['Buffer'], - envs: ['browser', 'commonjs'] - }) - }; - }); + .loader('eslint', props => merge(props, { + options: { + globals: ['Buffer'], + envs: ['browser', 'commonjs'] + } + })); } config @@ -158,19 +172,7 @@ module.exports = ({ config }) => { config .plugin('html') - .use(HtmlPlugin, merge({ - inject: false, - template: htmlTemplate, - appMountId: 'root', - xhtml: true, - mobile: true, - minify: { - useShortDoctype: true, - keepClosingSlash: true, - collapseWhitespace: true, - preserveLineBreaks: true, - } - }, PKG.config && PKG.config.html ? PKG.config.html : {})); + .use(HtmlPlugin, merge(html, neutrino.options.html)); if (process.env.NODE_ENV !== 'test') { config @@ -184,10 +186,10 @@ module.exports = ({ config }) => { if (process.env.NODE_ENV === 'development') { const protocol = !!process.env.HTTPS ? 'https' : 'http'; const host = process.env.HOST || - PKG.config && PKG.config.neutrino && PKG.config.neutrino.devServer && PKG.config.neutrino.devServer.host || + (PKG.neutrino && PKG.neutrino.config && PKG.neutrino.config.devServer && PKG.neutrino.config.devServer.host) || 'localhost'; const port = parseInt(process.env.PORT) || - PKG.config && PKG.config.neutrino && PKG.config.neutrino.devServer && parseInt(PKG.config.neutrino.devServer.port) || + (PKG.neutrino && PKG.neutrino.config && PKG.neutrino.config.devServer && parseInt(PKG.neutrino.config.devServer.port)) || 5000; config.devtool('eval'); diff --git a/packages/neutrino/bin/neutrino b/packages/neutrino/bin/neutrino index 858c556..03b07de 100755 --- a/packages/neutrino/bin/neutrino +++ b/packages/neutrino/bin/neutrino @@ -2,10 +2,16 @@ const Neutrino = require('../src/neutrino'); const yargs = require('yargs'); -const path = require('path'); -const pkg = require(path.join(process.cwd(), 'package.json')); +const { join } = require('path'); -const pkgPresets = pkg.config && pkg.config.presets ? pkg.config.presets : []; +const cwd = process.cwd(); +let pkg = {}; + +try { + pkg = require(join(cwd, 'package.json')); +} catch (ex) {} + +const pkgPresets = pkg.neutrino && pkg.neutrino.presets ? pkg.neutrino.presets : []; const environments = { build: 'production', start: 'development', test: 'test' }; const args = yargs .option('presets', { @@ -37,9 +43,43 @@ const args = yargs function run(command, presets) { process.env.NODE_ENV = environments[command]; - const N = new Neutrino(presets); - N[command](args) + const options = pkg.neutrino && pkg.neutrino.options ? pkg.neutrino.options : {}; + const api = new Neutrino(options); + const cwd = process.cwd(); + + // Grab all presets and merge them into a single webpack-chain config instance + presets.forEach(preset => { + const paths = [ + join(cwd, preset), + join(cwd, 'node_modules', preset), + preset + ]; + + for (let i = 0; i < paths.length; i += 1) { + try { + api.use(require(paths[i])); + } catch (exception) { + if (/Cannot find module/.test(exception.message)) { + continue; + } + + exception.message = `Neutrino was unable to load the module '${preset}'. ` + + `Ensure this module exports a function and is free from errors.\n${exception.message}`; + throw exception; + } + } + + throw new Error(`Neutrino cannot find a module with the name or path '${preset}'. ` + + `Ensure this module can be found relative to the root of the project.`); + }); + + // Also grab any Neutrino config from package.json and merge it into the config at a higher precedence + if (pkg.neutrino && pkg.neutrino.config) { + api.config.merge(pkg.neutrino.config); + } + + api[command](args) .then(() => process.exit(0)) .catch(err => { if (err) { diff --git a/packages/neutrino/package.json b/packages/neutrino/package.json index 27d6f67..20f3b34 100644 --- a/packages/neutrino/package.json +++ b/packages/neutrino/package.json @@ -1,6 +1,6 @@ { "name": "neutrino", - "version": "4.3.1", + "version": "5.0.0", "description": "Create and build JS applications with managed configurations", "main": "src/neutrino.js", "bin": { diff --git a/packages/neutrino/src/neutrino.js b/packages/neutrino/src/neutrino.js index db206a7..57aa4a2 100644 --- a/packages/neutrino/src/neutrino.js +++ b/packages/neutrino/src/neutrino.js @@ -5,48 +5,19 @@ const webpack = require('webpack'); const Config = require('webpack-chain'); const ora = require('ora'); -const cwd = process.cwd(); - class Neutrino extends EventEmitter { - constructor(presets = []) { + constructor(options) { super(); this.config = new Config(); - this.custom = {}; - - // Grab all presets and merge them into a single webpack-chain config instance - presets.forEach(preset => { - const paths = [ - path.join(cwd, preset), - path.join(cwd, 'node_modules', preset), - preset - ]; - - for (let i = 0; i < paths.length; i += 1) { - try { - return require(paths[i])(this); - } catch (exception) { - if (/Cannot find module/.test(exception.message)) { - continue; - } - - exception.message = `Neutrino was unable to load the module '${preset}'. ` + - `Ensure this module exports a function and is free from errors.\n${exception.message}`; - throw exception; - } - } - - throw new Error(`Neutrino cannot find a module with the name or path '${preset}'. ` + - `Ensure this module can be found relative to the root of the project.`); - }); + this.options = options; + } - // Also grab any Neutrino config from package.json and merge it into the config - try { - const pkg = require(path.join(process.cwd(), 'package.json')); + use(presets = []) { + if (!Array.isArray(presets)) { + presets = [presets]; + } - if (pkg.config && pkg.config.neutrino) { - this.config.merge(pkg.config.neutrino); - } - } catch (ex) {} + presets.map(preset => preset(this)); } handleErrors(err, stats) { @@ -85,26 +56,7 @@ class Neutrino extends EventEmitter { build(args) { return this .emitForAll('prebuild', args) - .then(() => new Promise((resolve, reject) => { - const config = this.getWebpackOptions(); - const compiler = webpack(config); - - compiler.run((err, stats) => { - const failed = this.handleErrors(err, stats); - - if (failed) { - return reject(); - } - - console.log(stats.toString({ - colors: true, - chunks: false, - children: false - })); - - resolve(); - }); - })) + .then(() => this.builder()) .then(() => this.emitForAll('build', args)); } @@ -115,28 +67,26 @@ class Neutrino extends EventEmitter { const config = this.getWebpackOptions(); if (config.devServer) { - return this._devServer(); + return this.devServer(); } if (config.target === 'node') { console.log('Warning: This preset does not support watch compilation. Falling back to a one-time build.'); - return this.build(); + return this.builder(); } - return new Promise(resolve => { - const config = this.getWebpackOptions(); - const compiler = webpack(config); - const watcher = compiler.watch(config.watchOptions || {}, (err, stats) => { - this.handleErrors(err, stats); - }); - - process.on('SIGINT', () => watcher.close(resolve)); - }); + return this.watcher(); }) .then(() => this.emitForAll('start', args)); } - _devServer() { + test(args) { + return this + .emitForAll('pretest', args) + .then(() => this.emitForAll('test', args)); + } + + devServer() { return new Promise(resolve => { const starting = ora('Starting development server').start(); const config = this.getWebpackOptions(); @@ -162,10 +112,39 @@ class Neutrino extends EventEmitter { }); } - test(args) { - return this - .emitForAll('pretest', args) - .then(() => this.emitForAll('test', args)); + watcher() { + return new Promise(resolve => { + const config = this.getWebpackOptions(); + const compiler = webpack(config); + const watcher = compiler.watch(config.watchOptions || {}, (err, stats) => { + this.handleErrors(err, stats); + }); + + process.on('SIGINT', () => watcher.close(resolve)); + }); + } + + builder() { + return new Promise((resolve, reject) => { + const config = this.getWebpackOptions(); + const compiler = webpack(config); + + compiler.run((err, stats) => { + const failed = this.handleErrors(err, stats); + + if (failed) { + return reject(); + } + + console.log(stats.toString({ + colors: true, + chunks: false, + children: false + })); + + resolve(); + }); + }); } } diff --git a/yarn.lock b/yarn.lock index 4533170..8e14b0a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -340,6 +340,14 @@ core-util-is@~1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" +cross-spawn@^5.0.1: + version "5.1.0" + resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz#e8bd0efee58fcff6f8f94510a0a554bbfa235449" + dependencies: + lru-cache "^4.0.1" + shebang-command "^1.2.0" + which "^1.2.9" + cryptiles@2.x.x: version "2.0.5" resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" @@ -470,6 +478,18 @@ escape-string-regexp@^1.0.0, escape-string-regexp@^1.0.2, escape-string-regexp@^ version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" +execa@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/execa/-/execa-0.6.0.tgz#934fc9f04a9febb4d4b449d976e92cfd95ef4f6e" + dependencies: + cross-spawn "^5.0.1" + get-stream "^3.0.0" + is-stream "^1.1.0" + npm-run-path "^2.0.0" + p-finally "^1.0.0" + signal-exit "^3.0.0" + strip-eof "^1.0.0" + exit@0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/exit/-/exit-0.1.2.tgz#0632638f8d877cc82107d30a0fff1a17cba1cd0c" @@ -588,6 +608,10 @@ generate-object-property@^1.1.0: dependencies: is-property "^1.0.0" +get-stream@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" + getpass@^0.1.1: version "0.1.6" resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.6.tgz#283ffd9fc1256840875311c1b60e8c40187110e6" @@ -861,6 +885,10 @@ is-property@^1.0.0: version "1.0.2" resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" +is-stream@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" + is-typedarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" @@ -1096,7 +1124,7 @@ lru-cache@2: version "2.7.3" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-2.7.3.tgz#6d4524e8b955f95d4f5b58851ce21dd72fb4e952" -lru-cache@~4.0.1: +lru-cache@^4.0.1, lru-cache@~4.0.1: version "4.0.2" resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.2.tgz#1d17679c069cda5d040991a09dbc2c0db377e55e" dependencies: @@ -1291,6 +1319,12 @@ npm-registry-client@~7.2.1: optionalDependencies: npmlog "~2.0.0 || ~3.1.0" +npm-run-path@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz#35a9232dfa35d7067b4cb2ddf2357b1871536c5f" + dependencies: + path-key "^2.0.0" + npm-user-validate@~0.1.2, npm-user-validate@~0.1.5: version "0.1.5" resolved "https://registry.yarnpkg.com/npm-user-validate/-/npm-user-validate-0.1.5.tgz#52465d50c2d20294a57125b996baedbf56c5004b" @@ -1468,20 +1502,23 @@ nth-check@~1.0.1: dependencies: boolbase "~1.0.0" -oao@^0.5.7: - version "0.5.7" - resolved "https://registry.yarnpkg.com/oao/-/oao-0.5.7.tgz#ab512b50ace0586066d43e2f8e86c2ab40a85ce4" +oao@^0.7.2: + version "0.7.2" + resolved "https://registry.yarnpkg.com/oao/-/oao-0.7.2.tgz#ac4b8d3da07fdafe7b9f2e3cbf56edcd996d5d09" dependencies: babel-polyfill "6.22.0" commander "2.9.0" + execa "^0.6.0" globby "6.1.0" inquirer "3.0.1" kebab-case "1.0.0" + rimraf "^2.6.1" semver "5.3.0" shelljs "0.7.6" split "1.0.0" - storyboard "^3.0.0" - storyboard-preset-console "^3.0.0" + storyboard "^3.1.0" + storyboard-listener-console "^3.0.0" + storyboard-listener-console-parallel "^3.1.0" terminal-kit "^0.26.1" timm "^1.2.3" @@ -1537,6 +1574,10 @@ osenv@0, osenv@~0.1.3: os-homedir "^1.0.0" os-tmpdir "^1.0.0" +p-finally@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" + path-array@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/path-array/-/path-array-1.0.1.tgz#7e2f0f35f07a2015122b868b7eac0eb2c4fec271" @@ -1551,6 +1592,10 @@ path-is-inside@^1.0.1, path-is-inside@~1.0.0, path-is-inside@~1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" +path-key@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" + pify@^2.0.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -1809,6 +1854,12 @@ rimraf@2, rimraf@^2.2.8, rimraf@^2.5.2, rimraf@^2.5.4, rimraf@~2.5.2, rimraf@~2. dependencies: glob "^7.0.5" +rimraf@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" + dependencies: + glob "^7.0.5" + run-async@^2.2.0: version "2.3.0" resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" @@ -1819,14 +1870,14 @@ rx@^4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/rx/-/rx-4.1.0.tgz#a5f13ff79ef3b740fe30aa803fb09f98805d4782" -"semver@2 >=2.2.1 || 3.x || 4 || 5", "semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", "semver@4 || 5", semver@5.3.0, "semver@^2.3.0 || 3.x || 4 || 5": - version "5.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" - -semver@5.1.0, semver@~5.1.0: +"semver@2 >=2.2.1 || 3.x || 4 || 5", "semver@2 || 3 || 4 || 5", "semver@2.x || 3.x || 4 || 5", "semver@4 || 5", semver@5.1.0, "semver@^2.3.0 || 3.x || 4 || 5", semver@~5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.1.0.tgz#85f2cf8550465c4df000cf7d86f6b054106ab9e5" +semver@5.3.0: + version "5.3.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" + semver@^4.0.3, semver@^4.1.0: version "4.3.6" resolved "https://registry.yarnpkg.com/semver/-/semver-4.3.6.tgz#300bc6e0e86374f7ba61068b5b1ecd57fc6532da" @@ -1838,6 +1889,16 @@ sha@~2.0.1: graceful-fs "^4.1.2" readable-stream "^2.0.2" +shebang-command@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" + dependencies: + shebang-regex "^1.0.0" + +shebang-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" + shelljs@0.7.6: version "0.7.6" resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.7.6.tgz#379cccfb56b91c8601e4793356eb5382924de9ad" @@ -1850,7 +1911,7 @@ sigmund@~1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/sigmund/-/sigmund-1.0.1.tgz#3ff21f198cad2175f9f3b781853fd94d0d19b590" -signal-exit@^3.0.2: +signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" @@ -1917,21 +1978,22 @@ storyboard-core@^3.0.0-rc.2: timm "^1.2.3" uuid "^3.0.1" -storyboard-listener-console@^3.0.0-rc.2: - version "3.0.0-rc.2" - resolved "https://registry.yarnpkg.com/storyboard-listener-console/-/storyboard-listener-console-3.0.0-rc.2.tgz#3e854d13af2b7b589699bf0306bb355a38264eb7" +storyboard-listener-console-parallel@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/storyboard-listener-console-parallel/-/storyboard-listener-console-parallel-3.1.0.tgz#97f96f78c51f1e9147af18943ec506777afc3ee7" dependencies: + terminal-kit "^0.26.1" timm "^1.2.3" -storyboard-preset-console@^3.0.0: +storyboard-listener-console@^3.0.0: version "3.0.0" - resolved "https://registry.yarnpkg.com/storyboard-preset-console/-/storyboard-preset-console-3.0.0.tgz#ae3f098e5b386876b2d41ab7c89d55bfd3ac0a44" + resolved "https://registry.yarnpkg.com/storyboard-listener-console/-/storyboard-listener-console-3.0.0.tgz#feeb54e25fc5def0f41145d2dea23f6003fff2cd" dependencies: - storyboard-listener-console "^3.0.0-rc.2" + timm "^1.2.3" -storyboard@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/storyboard/-/storyboard-3.0.0.tgz#839515a88fbefb89a22f9055d3df5b0d5e6e9099" +storyboard@^3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/storyboard/-/storyboard-3.1.0.tgz#00053f50b2df3657a531d26b996e56a606323936" dependencies: storyboard-core "^3.0.0-rc.2" @@ -1968,6 +2030,10 @@ strip-ansi@^3.0.0, strip-ansi@~3.0.1: dependencies: ansi-regex "^2.0.0" +strip-eof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" + supports-color@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-0.2.0.tgz#d92de2694eb3f67323973d7ae3d8b55b4c22190a" @@ -2118,7 +2184,7 @@ weak-map@1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/weak-map/-/weak-map-1.0.0.tgz#b66e56a9df0bd25a76bbf1b514db129080614a37" -which@1, which@~1.2.11, which@~1.2.4: +which@1, which@^1.2.9, which@~1.2.11, which@~1.2.4: version "1.2.12" resolved "https://registry.yarnpkg.com/which/-/which-1.2.12.tgz#de67b5e450269f194909ef23ece4ebe416fa1192" dependencies: