diff --git a/.eslintignore b/.eslintignore index fee462cf586..138b3e7b5a9 100644 --- a/.eslintignore +++ b/.eslintignore @@ -12,6 +12,9 @@ /test/integration/hmr-dynamic/index.js /test/integration/wasm-async/index.js /test/integration/wasm-dynamic/index.js +/test/integration/rust/index.js +/test/integration/rust-deps/index.js +/test/integration/rust-cargo/src/index.js # Generated by the build lib diff --git a/.gitignore b/.gitignore index df0be4ee6b9..fdf8dd88ac8 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,6 @@ lib !test/**/node_modules .vscode/ .idea/ -*.min.js \ No newline at end of file +*.min.js +test/integration/**/target +test/integration/**/Cargo.lock diff --git a/.travis.yml b/.travis.yml index a304b368914..34db62bcde2 100644 --- a/.travis.yml +++ b/.travis.yml @@ -3,8 +3,13 @@ node_js: # TODO: Run Babel on tests so that async-await works in Node 6 # - '6' - '8' -cache: yarn -script: +cache: + yarn: true + cargo: true +before_install: + - curl https://sh.rustup.rs -sSf | sh -s -- -y + - export PATH=/home/travis/.cargo/bin:$PATH +script: - yarn test-ci - yarn lint sudo: false diff --git a/appveyor.yml b/appveyor.yml index a0c843a66bd..2bc1aa20196 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -9,6 +9,14 @@ install: # install modules - yarn install + # Install Rust and Cargo + # (Based on from https://github.com/rust-lang/libc/blob/master/appveyor.yml) + - curl -sSf -o rustup-init.exe https://win.rustup.rs + - rustup-init.exe -y + - set PATH=%PATH%;C:\Users\appveyor\.cargo\bin + - rustc -Vv + - cargo -V + # Post-install test scripts. test_script: # Output useful info for debugging. @@ -21,6 +29,7 @@ test_script: cache: - "%LOCALAPPDATA%\\Yarn" + - C:\Users\appveyor\.cargo # Don't actually build. build: off diff --git a/package.json b/package.json index 239a65c4ffa..c7dde848e9a 100644 --- a/package.json +++ b/package.json @@ -17,6 +17,7 @@ "browser-resolve": "^1.11.2", "chalk": "^2.1.0", "chokidar": "^1.7.0", + "command-exists": "^1.2.2", "commander": "^2.11.0", "cross-spawn": "^5.1.0", "cssnano": "^3.10.0", @@ -40,6 +41,8 @@ "sanitize-filename": "^1.6.1", "serve-static": "^1.12.4", "source-map": "0.6.1", + "toml": "^2.3.3", + "tomlify-j0.4": "^3.0.0", "uglify-es": "^3.2.1", "v8-compile-cache": "^1.1.0", "worker-farm": "^1.4.1", diff --git a/src/Asset.js b/src/Asset.js index c9034996271..22e7429b7c1 100644 --- a/src/Asset.js +++ b/src/Asset.js @@ -60,7 +60,7 @@ class Asset { if (this.contents && this.mightHaveDependencies()) { await this.parseIfNeeded(); - this.collectDependencies(); + await this.collectDependencies(); } } diff --git a/src/Parser.js b/src/Parser.js index 9f28518503e..ff0e98387be 100644 --- a/src/Parser.js +++ b/src/Parser.js @@ -31,6 +31,7 @@ class Parser { this.registerExtension('scss', './assets/SASSAsset'); this.registerExtension('html', './assets/HTMLAsset'); + this.registerExtension('rs', './assets/RustAsset'); let extensions = options.extensions || {}; for (let ext in extensions) { diff --git a/src/WorkerFarm.js b/src/WorkerFarm.js index 1aeda507859..7bc641be9a8 100644 --- a/src/WorkerFarm.js +++ b/src/WorkerFarm.js @@ -63,18 +63,18 @@ class WorkerFarm extends Farm { // While we're waiting, just run on the main thread. // This significantly speeds up startup time. if (this.started && this.warmWorkers >= this.activeChildren) { - return this.remoteWorker.run(...args); + return this.remoteWorker.run(...args, false); } else { // Workers have started, but are not warmed up yet. // Send the job to a remote worker in the background, // but use the result from the local worker - it will be faster. if (this.started) { - this.remoteWorker.run(...args).then(() => { + this.remoteWorker.run(...args, true).then(() => { this.warmWorkers++; }); } - return this.localWorker.run(...args); + return this.localWorker.run(...args, false); } } diff --git a/src/assets/RustAsset.js b/src/assets/RustAsset.js new file mode 100644 index 00000000000..be2e2364741 --- /dev/null +++ b/src/assets/RustAsset.js @@ -0,0 +1,213 @@ +const path = require('path'); +const commandExists = require('command-exists'); +const childProcess = require('child_process'); +const promisify = require('../utils/promisify'); +const exec = promisify(childProcess.execFile); +const tomlify = require('tomlify-j0.4'); +const fs = require('../utils/fs'); +const Asset = require('../Asset'); +const config = require('../utils/config'); +const pipeSpawn = require('../utils/pipeSpawn'); +const md5 = require('../utils/md5'); + +const RUST_TARGET = 'wasm32-unknown-unknown'; +const MAIN_FILES = ['src/lib.rs', 'src/main.rs']; + +// Track installation status so we don't need to check more than once +let rustInstalled = false; +let wasmGCInstalled = false; + +class RustAsset extends Asset { + constructor(name, pkg, options) { + super(name, pkg, options); + this.type = 'wasm'; + } + + process() { + // We don't want to process this asset if the worker is in a warm up phase + // since the asset will also be processed by the main process, which + // may cause errors since rust writes to the filesystem. + if (this.options.isWarmUp) { + return; + } + + return super.process(); + } + + async parse() { + // Install rust toolchain and target if needed + await this.installRust(); + + // See if there is a Cargo config in the project + let cargoConfig = await this.getConfig(['Cargo.toml']); + let cargoDir; + let isMainFile = false; + + if (cargoConfig) { + const mainFiles = MAIN_FILES.slice(); + if (cargoConfig.lib && cargoConfig.lib.path) { + mainFiles.push(cargoConfig.lib.path); + } + + cargoDir = path.dirname(await config.resolve(this.name, ['Cargo.toml'])); + isMainFile = mainFiles.some( + file => path.join(cargoDir, file) === this.name + ); + } + + // If this is the main file of a Cargo build, use the cargo command to compile. + // Otherwise, use rustc directly. + if (isMainFile) { + await this.cargoBuild(cargoConfig, cargoDir); + } else { + await this.rustcBuild(); + } + + // If this is a prod build, use wasm-gc to remove unused code + if (this.options.minify) { + await this.installWasmGC(); + await exec('wasm-gc', [this.wasmPath, this.wasmPath]); + } + } + + async installRust() { + if (rustInstalled) { + return; + } + + // Check for rustup + try { + await commandExists('rustup'); + } catch (e) { + throw new Error( + "Rust isn't installed. Visit https://www.rustup.rs/ for more info" + ); + } + + // Ensure nightly toolchain is installed + let [stdout] = await exec('rustup', ['show']); + if (!stdout.includes('nightly')) { + await pipeSpawn('rustup', ['update']); + await pipeSpawn('rustup', ['toolchain', 'install', 'nightly']); + } + + // Ensure wasm target is installed + [stdout] = await exec('rustup', [ + 'target', + 'list', + '--toolchain', + 'nightly' + ]); + if (!stdout.includes(RUST_TARGET + ' (installed)')) { + await pipeSpawn('rustup', [ + 'target', + 'add', + 'wasm32-unknown-unknown', + '--toolchain', + 'nightly' + ]); + } + + rustInstalled = true; + } + + async installWasmGC() { + if (wasmGCInstalled) { + return; + } + + try { + await commandExists('wasm-gc'); + } catch (e) { + await pipeSpawn('cargo', [ + 'install', + '--git', + 'https://github.com/alexcrichton/wasm-gc' + ]); + } + + wasmGCInstalled = true; + } + + async cargoBuild(cargoConfig, cargoDir) { + // Ensure the cargo config has cdylib as the crate-type + if (!cargoConfig.lib) { + cargoConfig.lib = {}; + } + + if (!Array.isArray(cargoConfig.lib['crate-type'])) { + cargoConfig.lib['crate-type'] = []; + } + + if (!cargoConfig.lib['crate-type'].includes('cdylib')) { + cargoConfig.lib['crate-type'].push('cdylib'); + await fs.writeFile( + path.join(cargoDir, 'Cargo.toml'), + tomlify.toToml(cargoConfig) + ); + } + + // Run cargo + let args = ['+nightly', 'build', '--target', RUST_TARGET, '--release']; + await exec('cargo', args, {cwd: cargoDir}); + + // Get output file paths + let outDir = path.join(cargoDir, 'target', RUST_TARGET, 'release'); + let rustName = cargoConfig.package.name; + this.wasmPath = path.join(outDir, rustName + '.wasm'); + this.depsPath = path.join(outDir, rustName + '.d'); + } + + async rustcBuild() { + // Get output filename + await fs.mkdirp(this.options.cacheDir); + let name = md5(this.name); + this.wasmPath = path.join(this.options.cacheDir, name + '.wasm'); + + // Run rustc to compile the code + const args = [ + '+nightly', + '--target', + RUST_TARGET, + '-O', + '--crate-type=cdylib', + this.name, + '-o', + this.wasmPath + ]; + await exec('rustc', args); + + // Run again to collect dependencies + this.depsPath = path.join(this.options.cacheDir, name + '.d'); + await exec('rustc', [this.name, '--emit=dep-info', '-o', this.depsPath]); + } + + async collectDependencies() { + // Read deps file + let contents = await fs.readFile(this.depsPath, 'utf8'); + let dir = path.dirname(this.name); + + let deps = contents + .split('\n') + .filter(Boolean) + .slice(1); + + for (let dep of deps) { + dep = path.resolve(dir, dep.slice(0, dep.indexOf(':'))); + if (dep !== this.name) { + this.addDependency(dep, {includedInParent: true}); + } + } + } + + async generate() { + return { + wasm: { + path: this.wasmPath, // pass output path to RawPackager + mtime: Date.now() // force re-bundling since otherwise the hash would never change + } + }; + } +} + +module.exports = RustAsset; diff --git a/src/packagers/RawPackager.js b/src/packagers/RawPackager.js index 4cd6d47b5c3..1a37b1f4cfe 100644 --- a/src/packagers/RawPackager.js +++ b/src/packagers/RawPackager.js @@ -18,8 +18,11 @@ class RawPackager extends Packager { ); } - let contents = - asset.generated[asset.type] || (await fs.readFile(asset.name)); + let contents = asset.generated[asset.type]; + if (!contents || (contents && contents.path)) { + contents = await fs.readFile(contents ? contents.path : asset.name); + } + await fs.writeFile(name, contents); } diff --git a/src/utils/config.js b/src/utils/config.js index eb8eed4618d..ecb7e193290 100644 --- a/src/utils/config.js +++ b/src/utils/config.js @@ -1,6 +1,10 @@ const fs = require('./fs'); const path = require('path'); -const json5 = require('json5'); + +const PARSERS = { + json: require('json5').parse, + toml: require('toml').parse +}; const existsCache = new Map(); @@ -30,12 +34,14 @@ async function load(filepath, filenames, root = path.parse(filepath).root) { let configFile = await resolve(filepath, filenames, root); if (configFile) { try { - if (path.extname(configFile) === '.js') { + let extname = path.extname(configFile).slice(1); + if (extname === 'js') { return require(configFile); } let configStream = await fs.readFile(configFile); - return json5.parse(configStream.toString()); + let parse = PARSERS[extname] || PARSERS.json; + return parse(configStream.toString()); } catch (err) { if (err.code === 'MODULE_NOT_FOUND' || err.code === 'ENOENT') { existsCache.delete(configFile); diff --git a/src/utils/objectHash.js b/src/utils/objectHash.js index fb7574b59e7..11e5ef76de9 100644 --- a/src/utils/objectHash.js +++ b/src/utils/objectHash.js @@ -1,10 +1,17 @@ const crypto = require('crypto'); -module.exports = function(object) { +function objectHash(object) { let hash = crypto.createHash('md5'); for (let key of Object.keys(object).sort()) { - hash.update(key + object[key]); + let val = object[key]; + if (typeof val === 'object' && val) { + hash.update(key + objectHash(val)); + } else { + hash.update(key + val); + } } return hash.digest('hex'); -}; +} + +module.exports = objectHash; diff --git a/src/utils/pipeSpawn.js b/src/utils/pipeSpawn.js new file mode 100644 index 00000000000..3dad9ad4393 --- /dev/null +++ b/src/utils/pipeSpawn.js @@ -0,0 +1,19 @@ +const spawn = require('cross-spawn'); + +function pipeSpawn(cmd, params, opts) { + const cp = spawn(cmd, params, opts); + cp.stdout.pipe(process.stdout); + cp.stderr.pipe(process.stderr); + return new Promise((resolve, reject) => { + cp.on('error', reject); + cp.on('close', function(code) { + if (code !== 0) { + return reject(new Error(cmd + ' failed.')); + } + + return resolve(); + }); + }); +} + +module.exports = pipeSpawn; diff --git a/src/worker.js b/src/worker.js index c6792e1e814..cbd068a50ef 100644 --- a/src/worker.js +++ b/src/worker.js @@ -11,8 +11,9 @@ exports.init = function(options, callback) { callback(); }; -exports.run = async function(path, pkg, options, callback) { +exports.run = async function(path, pkg, options, isWarmUp, callback) { try { + options.isWarmUp = isWarmUp; var asset = parser.getAsset(path, pkg, options); await asset.process(); diff --git a/test/integration/rust-cargo/.eslintrc b/test/integration/rust-cargo/.eslintrc new file mode 100644 index 00000000000..38d01a2adca --- /dev/null +++ b/test/integration/rust-cargo/.eslintrc @@ -0,0 +1,6 @@ +{ + "extends": "../.eslintrc.json", + "parserOptions": { + "sourceType": "module" + } +} diff --git a/test/integration/rust-cargo/Cargo.toml b/test/integration/rust-cargo/Cargo.toml new file mode 100644 index 00000000000..49f0c68271c --- /dev/null +++ b/test/integration/rust-cargo/Cargo.toml @@ -0,0 +1,9 @@ +[package] +name = "cargo" +version = "0.1.0" +authors = ["josealbizures "] + +[dependencies] + +[lib] +crate-type = ["cdylib"] \ No newline at end of file diff --git a/test/integration/rust-cargo/src/index.js b/test/integration/rust-cargo/src/index.js new file mode 100644 index 00000000000..1e436ceeaea --- /dev/null +++ b/test/integration/rust-cargo/src/index.js @@ -0,0 +1,3 @@ +module.exports = import('./lib.rs').then(function ({add}) { + return add(2, 3); +}); diff --git a/test/integration/rust-cargo/src/lib.rs b/test/integration/rust-cargo/src/lib.rs new file mode 100644 index 00000000000..2ec8e0327e4 --- /dev/null +++ b/test/integration/rust-cargo/src/lib.rs @@ -0,0 +1,4 @@ +#[no_mangle] +pub fn add(a: i32, b: i32) -> i32 { + return a + b +} diff --git a/test/integration/rust-deps/.eslintrc b/test/integration/rust-deps/.eslintrc new file mode 100644 index 00000000000..38d01a2adca --- /dev/null +++ b/test/integration/rust-deps/.eslintrc @@ -0,0 +1,6 @@ +{ + "extends": "../.eslintrc.json", + "parserOptions": { + "sourceType": "module" + } +} diff --git a/test/integration/rust-deps/add.rs b/test/integration/rust-deps/add.rs new file mode 100644 index 00000000000..efb8d8de9a5 --- /dev/null +++ b/test/integration/rust-deps/add.rs @@ -0,0 +1,3 @@ +pub fn add(a: i32, b: i32) -> i32 { + return a + b +} diff --git a/test/integration/rust-deps/index.js b/test/integration/rust-deps/index.js new file mode 100644 index 00000000000..c2f332e5265 --- /dev/null +++ b/test/integration/rust-deps/index.js @@ -0,0 +1,3 @@ +module.exports = import('./test.rs').then(function ({test}) { + return test(2, 3); +}); diff --git a/test/integration/rust-deps/test.rs b/test/integration/rust-deps/test.rs new file mode 100644 index 00000000000..4b5be81b5da --- /dev/null +++ b/test/integration/rust-deps/test.rs @@ -0,0 +1,7 @@ +mod add; +use add::*; + +#[no_mangle] +pub fn test(a: i32, b: i32) -> i32 { + return add(a, b) + 5; +} diff --git a/test/integration/rust/.eslintrc b/test/integration/rust/.eslintrc new file mode 100644 index 00000000000..38d01a2adca --- /dev/null +++ b/test/integration/rust/.eslintrc @@ -0,0 +1,6 @@ +{ + "extends": "../.eslintrc.json", + "parserOptions": { + "sourceType": "module" + } +} diff --git a/test/integration/rust/add.rs b/test/integration/rust/add.rs new file mode 100644 index 00000000000..2ec8e0327e4 --- /dev/null +++ b/test/integration/rust/add.rs @@ -0,0 +1,4 @@ +#[no_mangle] +pub fn add(a: i32, b: i32) -> i32 { + return a + b +} diff --git a/test/integration/rust/index.js b/test/integration/rust/index.js new file mode 100644 index 00000000000..943448c6335 --- /dev/null +++ b/test/integration/rust/index.js @@ -0,0 +1,3 @@ +module.exports = import('./add.rs').then(function ({add}) { + return add(2, 3); +}); diff --git a/test/rust.js b/test/rust.js new file mode 100644 index 00000000000..4cf21e84a72 --- /dev/null +++ b/test/rust.js @@ -0,0 +1,133 @@ +const assert = require('assert'); +const {bundle, bundler, run, assertBundleTree} = require('./utils'); +const fs = require('fs'); +const commandExists = require('command-exists'); + +describe('rust', function() { + if (!commandExists.sync('rustup')) { + // eslint-disable-next-line no-console + console.log( + 'Skipping Rust tests. Install https://www.rustup.rs/ to run them.' + ); + return; + } + + it('should generate a wasm file from a rust file with rustc', async function() { + this.timeout(500000); + let b = await bundle(__dirname + '/integration/rust/index.js'); + + assertBundleTree(b, { + name: 'index.js', + assets: [ + 'bundle-loader.js', + 'bundle-url.js', + 'index.js', + 'wasm-loader.js' + ], + childBundles: [ + { + type: 'wasm', + assets: ['add.rs'], + childBundles: [] + }, + { + type: 'map' + } + ] + }); + + var res = await run(b); + assert.equal(res, 5); + + // not minified + assert(fs.statSync(Array.from(b.childBundles)[0].name).size > 100); + }); + + it('should support rust files with dependencies via rustc', async function() { + this.timeout(500000); + let b = bundler(__dirname + '/integration/rust-deps/index.js'); + let bundle = await b.bundle(); + + assertBundleTree(bundle, { + name: 'index.js', + assets: [ + 'bundle-loader.js', + 'bundle-url.js', + 'index.js', + 'wasm-loader.js' + ], + childBundles: [ + { + type: 'map' + }, + { + type: 'wasm', + assets: ['test.rs'], + childBundles: [] + } + ] + }); + + var res = await run(bundle); + assert.equal(res, 10); + }); + + it('should generate a wasm file from a rust file with cargo', async function() { + this.timeout(500000); + let b = await bundle(__dirname + '/integration/rust-cargo/src/index.js'); + + assertBundleTree(b, { + name: 'index.js', + assets: [ + 'bundle-loader.js', + 'bundle-url.js', + 'index.js', + 'wasm-loader.js' + ], + childBundles: [ + { + type: 'map' + }, + { + type: 'wasm', + assets: ['lib.rs'], + childBundles: [] + } + ] + }); + + var res = await run(b); + assert.equal(res, 5); + }); + + it('should use wasm-gc to minify output', async function() { + this.timeout(500000); + let b = await bundle(__dirname + '/integration/rust/index.js', { + minify: true, + sourceMaps: false + }); + + assertBundleTree(b, { + name: 'index.js', + assets: [ + 'bundle-loader.js', + 'bundle-url.js', + 'index.js', + 'wasm-loader.js' + ], + childBundles: [ + { + type: 'wasm', + assets: ['add.rs'], + childBundles: [] + } + ] + }); + + var res = await run(b); + assert.equal(res, 5); + + // assert that it is smaller + assert(fs.statSync(Array.from(b.childBundles)[0].name).size < 100); + }); +}); diff --git a/yarn.lock b/yarn.lock index 405556876de..99394dfffc8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -31,7 +31,7 @@ ajv@^4.9.1: co "^4.6.0" json-stable-stringify "^1.0.1" -ajv@^5.2.3, ajv@^5.3.0: +ajv@^5.1.0, ajv@^5.2.3, ajv@^5.3.0: version "5.5.2" resolved "https://registry.yarnpkg.com/ajv/-/ajv-5.5.2.tgz#73b5eeca3fab653e3d3f9422b341ad42205dc965" dependencies: @@ -245,7 +245,11 @@ aws-sign2@~0.6.0: version "0.6.0" resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" -aws4@^1.2.1: +aws-sign2@~0.7.0: + version "0.7.0" + resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz#b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8" + +aws4@^1.2.1, aws4@^1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" @@ -798,6 +802,18 @@ boom@2.x.x: dependencies: hoek "2.x.x" +boom@4.x.x: + version "4.3.1" + resolved "https://registry.yarnpkg.com/boom/-/boom-4.3.1.tgz#4f8a3005cb4a7e3889f749030fd25b96e01d2e31" + dependencies: + hoek "4.x.x" + +boom@5.x.x: + version "5.2.0" + resolved "https://registry.yarnpkg.com/boom/-/boom-5.2.0.tgz#5dd9da6ee3a5f302077436290cb717d3f4a54e02" + dependencies: + hoek "4.x.x" + brace-expansion@^1.1.7: version "1.1.8" resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.8.tgz#c07b211c7c952ec1f8efd51a77ef0d1d3990a292" @@ -903,15 +919,15 @@ browserslist@^1.3.6, browserslist@^1.5.2, browserslist@^1.7.6: electron-to-chromium "^1.2.7" browserslist@^2.1.2: - version "2.10.1" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.10.1.tgz#f9dc692b79004a78ec9ba0d012c54de44cc6d7e4" + version "2.11.3" + resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-2.11.3.tgz#fe36167aed1bbcde4827ebfe71347a2cc70b99b2" dependencies: - caniuse-lite "^1.0.30000784" + caniuse-lite "^1.0.30000792" electron-to-chromium "^1.3.30" bsb-js@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/bsb-js/-/bsb-js-1.0.1.tgz#bc50a74c6bed97e7882af9327e352164c9e355d5" + version "1.0.2" + resolved "https://registry.yarnpkg.com/bsb-js/-/bsb-js-1.0.2.tgz#b9e7af1dfdb8de6191bb36fdff43f59359a7dfe7" buffer-xor@^1.0.3: version "1.0.3" @@ -998,12 +1014,12 @@ caniuse-api@^1.5.2: lodash.uniq "^4.5.0" caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: - version "1.0.30000784" - resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000784.tgz#1be95012d9489c7719074f81aee57dbdffe6361b" + version "1.0.30000793" + resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000793.tgz#3c00c66e423a7a1907c7dd96769a78b2afa8a72e" -caniuse-lite@^1.0.30000784: - version "1.0.30000784" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000784.tgz#129ced74e9a1280a441880b6cd2bce30ef59e6c0" +caniuse-lite@^1.0.30000792: + version "1.0.30000792" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30000792.tgz#d0cea981f8118f3961471afbb43c9a1e5bbf0332" caseless@~0.11.0: version "0.11.0" @@ -1079,13 +1095,12 @@ clap@^1.0.9: chalk "^1.1.3" class-utils@^0.3.5: - version "0.3.5" - resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.5.tgz#17e793103750f9627b2176ea34cfd1b565903c80" + version "0.3.6" + resolved "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz#f93369ae8b9a7ce02fd41faad0ca83033190c463" dependencies: arr-union "^3.1.0" define-property "^0.2.5" isobject "^3.0.0" - lazy-cache "^2.0.2" static-extend "^0.1.1" cli-cursor@^1.0.2: @@ -1131,6 +1146,14 @@ cliui@^3.2.0: strip-ansi "^3.0.1" wrap-ansi "^2.0.0" +cliui@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/cliui/-/cliui-4.0.0.tgz#743d4650e05f36d1ed2575b59638d87322bfbbcc" + dependencies: + string-width "^2.1.1" + strip-ansi "^4.0.0" + wrap-ansi "^2.0.0" + clone@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.3.tgz#298d7e2231660f40c003c2ed3140decf3f53085f" @@ -1210,15 +1233,19 @@ combined-stream@^1.0.5, combined-stream@~1.0.5: dependencies: delayed-stream "~1.0.0" +command-exists@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/command-exists/-/command-exists-1.2.2.tgz#12819c64faf95446ec0ae07fe6cafb6eb3708b22" + commander@2.9.0: version "2.9.0" resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" dependencies: graceful-readlink ">= 1.0.0" -commander@^2.11.0, commander@^2.9.0, commander@~2.12.1: - version "2.12.2" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.12.2.tgz#0f5946c427ed9ec0d91a46bb9def53e54650e555" +commander@^2.11.0, commander@^2.9.0, commander@~2.13.0: + version "2.13.0" + resolved "https://registry.yarnpkg.com/commander/-/commander-2.13.0.tgz#6964bca67685df7c1f1430c584f07d7597885b9c" commondir@^1.0.1: version "1.0.1" @@ -1341,6 +1368,12 @@ cryptiles@2.x.x: dependencies: boom "2.x.x" +cryptiles@3.x.x: + version "3.1.2" + resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-3.1.2.tgz#a89fbb220f5ce25ec56e8c4aa8a4fd7b5b0d29fe" + dependencies: + boom "5.x.x" + crypto-browserify@^3.11.0: version "3.12.0" resolved "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz#396cf9f3137f03e4b8e532c58f698254e00f80ec" @@ -1536,10 +1569,14 @@ delegates@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" -depd@1.1.1, depd@~1.1.1: +depd@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.1.tgz#5783b4e1c459f06fa5ca27f991f3d06e7a310359" +depd@~1.1.1: + version "1.1.2" + resolved "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz#9bcd52e14c097763e749b274c4346ed2e560b5a9" + des.js@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/des.js/-/des.js-1.0.0.tgz#c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc" @@ -1574,8 +1611,8 @@ diffie-hellman@^5.0.0: randombytes "^2.0.0" doctrine@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.0.2.tgz#68f96ce8efc56cc42651f1faadb4f175273b0075" + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" dependencies: esutils "^2.0.2" @@ -1625,15 +1662,9 @@ ee-first@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz#590c61156b0ae2f4f0255732a158b266bc56b21d" -electron-releases@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/electron-releases/-/electron-releases-2.1.0.tgz#c5614bf811f176ce3c836e368a0625782341fd4e" - electron-to-chromium@^1.2.7, electron-to-chromium@^1.3.30: - version "1.3.30" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.30.tgz#9666f532a64586651fc56a72513692e820d06a80" - dependencies: - electron-releases "^2.1.0" + version "1.3.31" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.31.tgz#00d832cba9fe2358652b0c48a8816c8e3a037e9f" elegant-spinner@^1.0.1: version "1.0.1" @@ -1695,8 +1726,8 @@ eslint-visitor-keys@^1.0.0: resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" eslint@^4.13.0: - version "4.14.0" - resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.14.0.tgz#96609768d1dd23304faba2d94b7fefe5a5447a82" + version "4.15.0" + resolved "https://registry.yarnpkg.com/eslint/-/eslint-4.15.0.tgz#89ab38c12713eec3d13afac14e4a89e75ef08145" dependencies: ajv "^5.3.0" babel-code-frame "^6.22.0" @@ -1852,7 +1883,7 @@ extend-shallow@^3.0.0: assign-symbols "^1.0.0" is-extendable "^1.0.1" -extend@~3.0.0: +extend@~3.0.0, extend@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" @@ -1871,8 +1902,8 @@ extglob@^0.3.1: is-extglob "^1.0.0" extglob@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.3.tgz#55e019d0c95bf873949c737b7e5172dba84ebb29" + version "2.0.4" + resolved "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz#ad00fe4dc612a9232e8718711dc5cb5ab0285543" dependencies: array-unique "^0.3.2" define-property "^1.0.0" @@ -1883,10 +1914,14 @@ extglob@^2.0.2: snapdragon "^0.8.1" to-regex "^3.0.1" -extsprintf@1.3.0, extsprintf@^1.2.0: +extsprintf@1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz#96918440e3041a7a414f8c52e3c574eb3c3e1e05" +extsprintf@^1.2.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" + fast-deep-equal@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz#96256a3bc975595eb36d82e9929d060d893439ff" @@ -2013,6 +2048,14 @@ form-data@~2.1.1: combined-stream "^1.0.5" mime-types "^2.1.12" +form-data@~2.3.1: + version "2.3.1" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.3.1.tgz#6fb94fbd71885306d73d15cc497fe4cc4ecd44bf" + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.5" + mime-types "^2.1.12" + fragment-cache@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz#4290fad27f13e89be7f33799c6bc5a0abfff0d19" @@ -2247,6 +2290,10 @@ har-schema@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" +har-schema@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz#a94c2224ebcac04782a0d9035521f24735b7ec92" + har-validator@~2.0.6: version "2.0.6" resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" @@ -2263,6 +2310,13 @@ har-validator@~4.2.1: ajv "^4.9.1" har-schema "^1.0.5" +har-validator@~5.0.3: + version "5.0.3" + resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-5.0.3.tgz#ba402c266194f15956ef15e0fcf242993f6a7dfd" + dependencies: + ajv "^5.1.0" + har-schema "^2.0.0" + has-ansi@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" @@ -2343,6 +2397,15 @@ hawk@3.1.3, hawk@~3.1.3: hoek "2.x.x" sntp "1.x.x" +hawk@~6.0.2: + version "6.0.2" + resolved "https://registry.yarnpkg.com/hawk/-/hawk-6.0.2.tgz#af4d914eb065f9b5ce4d9d11c1cb2126eecc3038" + dependencies: + boom "4.x.x" + cryptiles "3.x.x" + hoek "4.x.x" + sntp "2.x.x" + he@1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/he/-/he-1.1.1.tgz#93410fd21b009735151f8868c2f271f3427e23fd" @@ -2359,6 +2422,10 @@ hoek@2.x.x: version "2.16.3" resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" +hoek@4.x.x: + version "4.2.0" + resolved "https://registry.yarnpkg.com/hoek/-/hoek-4.2.0.tgz#72d9d0754f7fe25ca2d01ad8f8f9a9449a89526d" + home-or-tmp@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/home-or-tmp/-/home-or-tmp-2.0.0.tgz#e36c3f2d2cae7d746a857e38d18d5f32a7882db8" @@ -2413,6 +2480,14 @@ http-signature@~1.1.0: jsprim "^1.2.2" sshpk "^1.7.0" +http-signature@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz#9aecd925114772f3d95b65a60abb8f7c18fbace1" + dependencies: + assert-plus "^1.0.0" + jsprim "^1.2.2" + sshpk "^1.7.0" + https-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz#ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73" @@ -2556,8 +2631,8 @@ is-builtin-module@^1.0.0: builtin-modules "^1.0.0" is-ci@^1.0.10: - version "1.0.10" - resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.0.10.tgz#f739336b2632365061a9d48270cd56ae3369318e" + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-ci/-/is-ci-1.1.0.tgz#247e4162e7860cebbdaf30b774d6b0ac7dcfe7a5" dependencies: ci-info "^1.0.0" @@ -2853,8 +2928,8 @@ jest-validate@^21.1.0: pretty-format "^21.2.1" js-base64@^2.1.8, js-base64@^2.1.9: - version "2.4.0" - resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.0.tgz#9e566fee624751a1d720c966cd6226d29d4025aa" + version "2.4.1" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-2.4.1.tgz#e02813181cd53002888e918935467acb2910e596" js-tokens@^3.0.0, js-tokens@^3.0.2: version "3.0.2" @@ -3486,8 +3561,8 @@ micromatch@^2.1.5, micromatch@^2.3.11: regex-cache "^0.4.2" micromatch@^3.0.4: - version "3.1.4" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.4.tgz#bb812e741a41f982c854e42b421a7eac458796f4" + version "3.1.5" + resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.5.tgz#d05e168c206472dfbca985bfef4f57797b4cd4ba" dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" @@ -3514,7 +3589,7 @@ mime-db@~1.30.0: version "1.30.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" -mime-types@^2.1.12, mime-types@~2.1.7: +mime-types@^2.1.12, mime-types@~2.1.17, mime-types@~2.1.7: version "2.1.17" resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.17.tgz#09d7a393f03e995a79f8af857b70a9e0ab16557a" dependencies: @@ -3546,7 +3621,7 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1: dependencies: brace-expansion "^1.1.7" -minimist@0.0.8, minimist@~0.0.1: +minimist@0.0.8: version "0.0.8" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" @@ -3554,6 +3629,10 @@ minimist@^1.1.3, minimist@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" +minimist@~0.0.1: + version "0.0.10" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" + mixin-deep@^1.2.0: version "1.3.0" resolved "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.0.tgz#47a8732ba97799457c8c1eca28f95132d7e8150a" @@ -3597,8 +3676,8 @@ nan@^2.3.0, nan@^2.3.2: resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" nanomatch@^1.2.5: - version "1.2.6" - resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.6.tgz#f27233e97c34a8706b7e781a4bc611c957a81625" + version "1.2.7" + resolved "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.7.tgz#53cd4aa109ff68b7f869591fdc9d10daeeea3e79" dependencies: arr-diff "^4.0.0" array-unique "^0.3.2" @@ -3762,8 +3841,8 @@ normalize-url@^1.4.0: sort-keys "^1.0.0" npm-path@^2.0.2: - version "2.0.3" - resolved "https://registry.yarnpkg.com/npm-path/-/npm-path-2.0.3.tgz#15cff4e1c89a38da77f56f6055b24f975dfb2bbe" + version "2.0.4" + resolved "https://registry.yarnpkg.com/npm-path/-/npm-path-2.0.4.tgz#c641347a5ff9d6a09e4d9bce5580c4f505278e64" dependencies: which "^1.2.10" @@ -3830,7 +3909,7 @@ nyc@^11.1.0: yargs "^10.0.3" yargs-parser "^8.0.0" -oauth-sign@~0.8.1: +oauth-sign@~0.8.1, oauth-sign@~0.8.2: version "0.8.2" resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" @@ -3888,8 +3967,8 @@ onetime@^2.0.0: mimic-fn "^1.0.0" opn@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/opn/-/opn-5.1.0.tgz#72ce2306a17dbea58ff1041853352b4a8fc77519" + version "5.2.0" + resolved "https://registry.yarnpkg.com/opn/-/opn-5.2.0.tgz#71fdf934d6827d676cecbea1531f95d354641225" dependencies: is-wsl "^1.1.0" @@ -3966,8 +4045,10 @@ p-finally@^1.0.0: resolved "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz#3fbcfb15b899a44123b34b6dcc18b724336a2cae" p-limit@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.1.0.tgz#b07ff2d9a5d88bec806035895a2bab66a27988bc" + version "1.2.0" + resolved "https://registry.yarnpkg.com/p-limit/-/p-limit-1.2.0.tgz#0e92b6bedcb59f022c13d0f1949dc82d15909f1c" + dependencies: + p-try "^1.0.0" p-locate@^2.0.0: version "2.0.0" @@ -3979,6 +4060,10 @@ p-map@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/p-map/-/p-map-1.2.0.tgz#e4e94f311eabbc8633a1e79908165fca26241b6b" +p-try@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz#cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3" + pako@~1.0.5: version "1.0.6" resolved "https://registry.yarnpkg.com/pako/-/pako-1.0.6.tgz#0101211baa70c4bca4a0f63f2206e97b7dfaf258" @@ -4074,6 +4159,10 @@ performance-now@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" +performance-now@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz#6309f4e0e5fa913ec1c69307ae364b4b377c9e7b" + physical-cpu-count@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/physical-cpu-count/-/physical-cpu-count-2.0.0.tgz#18de2f97e4bf7a9551ad7511942b5496f7aba660" @@ -4366,12 +4455,12 @@ postcss@^5.0.10, postcss@^5.0.11, postcss@^5.0.12, postcss@^5.0.13, postcss@^5.0 supports-color "^3.2.3" postcss@^6.0.1, postcss@^6.0.10: - version "6.0.14" - resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.14.tgz#5534c72114739e75d0afcf017db853099f562885" + version "6.0.16" + resolved "https://registry.yarnpkg.com/postcss/-/postcss-6.0.16.tgz#112e2fe2a6d2109be0957687243170ea5589e146" dependencies: chalk "^2.3.0" source-map "^0.6.1" - supports-color "^4.4.0" + supports-color "^5.1.0" posthtml-include@^1.1.0: version "1.1.0" @@ -4424,8 +4513,8 @@ preserve@^0.2.0: resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" prettier@^1.9.1: - version "1.9.2" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.9.2.tgz#96bc2132f7a32338e6078aeb29727178c6335827" + version "1.10.2" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.10.2.tgz#1af8356d1842276a99a5b5529c82dd9e9ad3cc93" pretty-format@^21.2.1: version "21.2.1" @@ -4494,6 +4583,10 @@ qs@~6.4.0: version "6.4.0" resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" +qs@~6.5.1: + version "6.5.1" + resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" + query-string@^4.1.0: version "4.3.4" resolved "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz#bbb693b9ca915c232515b228b1a02b609043dbeb" @@ -4517,8 +4610,8 @@ randomatic@^1.1.3: kind-of "^4.0.0" randombytes@^2.0.0, randombytes@^2.0.1, randombytes@^2.0.5: - version "2.0.5" - resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.5.tgz#dc009a246b8d09a177b4b7a0ae77bc570f4b1b79" + version "2.0.6" + resolved "https://registry.yarnpkg.com/randombytes/-/randombytes-2.0.6.tgz#d302c522948588848a8d300c932b44c24231da80" dependencies: safe-buffer "^5.1.0" @@ -4534,8 +4627,8 @@ range-parser@~1.2.0: resolved "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.0.tgz#f49be6b487894ddc40dcc94a322f611092e00d5e" rc@^1.1.7: - version "1.2.2" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.2.tgz#d8ce9cb57e8d64d9c7badd9876c7c34cbe3c7077" + version "1.2.4" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.4.tgz#a0f606caae2a3b862bbd0ef85482c0125b315fa3" dependencies: deep-extend "~0.4.0" ini "~1.3.0" @@ -4557,7 +4650,7 @@ read-pkg@^1.0.0: normalize-package-data "^2.3.2" path-type "^1.0.0" -readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2, readable-stream@^2.2.6, readable-stream@^2.3.3: +readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2, readable-stream@^2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" dependencies: @@ -4675,7 +4768,34 @@ repeating@^2.0.0: dependencies: is-finite "^1.0.0" -request@2, request@2.81.0: +request@2: + version "2.83.0" + resolved "https://registry.yarnpkg.com/request/-/request-2.83.0.tgz#ca0b65da02ed62935887808e6f510381034e3356" + dependencies: + aws-sign2 "~0.7.0" + aws4 "^1.6.0" + caseless "~0.12.0" + combined-stream "~1.0.5" + extend "~3.0.1" + forever-agent "~0.6.1" + form-data "~2.3.1" + har-validator "~5.0.3" + hawk "~6.0.2" + http-signature "~1.2.0" + is-typedarray "~1.0.0" + isstream "~0.1.2" + json-stringify-safe "~5.0.1" + mime-types "~2.1.17" + oauth-sign "~0.8.2" + performance-now "^2.1.0" + qs "~6.5.1" + safe-buffer "^5.1.1" + stringstream "~0.0.5" + tough-cookie "~2.3.3" + tunnel-agent "^0.6.0" + uuid "^3.1.0" + +request@2.81.0: version "2.81.0" resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" dependencies: @@ -4858,8 +4978,8 @@ scss-tokenizer@^0.2.3: source-map "^0.4.2" "semver@2 || 3 || 4 || 5", semver@^5.3.0: - version "5.4.1" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" + version "5.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" semver@~5.3.0: version "5.3.0" @@ -5004,6 +5124,12 @@ sntp@1.x.x: dependencies: hoek "2.x.x" +sntp@2.x.x: + version "2.1.0" + resolved "https://registry.yarnpkg.com/sntp/-/sntp-2.1.0.tgz#2c6cec14fedc2222739caf9b5c3d85d1cc5a2cc8" + dependencies: + hoek "4.x.x" + sort-keys@^1.0.0: version "1.1.2" resolved "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz#441b6d4d346798f1b4e49e8920adfba0e543f9ad" @@ -5119,7 +5245,11 @@ static-extend@^0.1.1: define-property "^0.2.5" object-copy "^0.1.0" -"statuses@>= 1.3.1 < 2", statuses@~1.3.1: +"statuses@>= 1.3.1 < 2": + version "1.4.0" + resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.4.0.tgz#bb73d446da2796106efcc1b601a253d6c46bd087" + +statuses@~1.3.1: version "1.3.1" resolved "https://registry.yarnpkg.com/statuses/-/statuses-1.3.1.tgz#faf51b9eb74aaef3b3acf4ad5f61abf24cb7b93e" @@ -5137,12 +5267,12 @@ stream-browserify@^2.0.1: readable-stream "^2.0.2" stream-http@^2.7.2: - version "2.7.2" - resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.7.2.tgz#40a050ec8dc3b53b33d9909415c02c0bf1abfbad" + version "2.8.0" + resolved "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.0.tgz#fd86546dac9b1c91aff8fc5d287b98fafb41bc10" dependencies: builtin-status-codes "^3.0.0" inherits "^2.0.1" - readable-stream "^2.2.6" + readable-stream "^2.3.3" to-arraybuffer "^1.0.0" xtend "^4.0.0" @@ -5189,7 +5319,7 @@ stringify-object@^3.2.0: is-obj "^1.0.1" is-regexp "^1.0.0" -stringstream@~0.0.4: +stringstream@~0.0.4, stringstream@~0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" @@ -5256,12 +5386,18 @@ supports-color@^3.1.2, supports-color@^3.2.3: dependencies: has-flag "^1.0.0" -supports-color@^4.0.0, supports-color@^4.4.0: +supports-color@^4.0.0: version "4.5.0" resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-4.5.0.tgz#be7a0de484dec5c5cddf8b3d59125044912f635b" dependencies: has-flag "^2.0.0" +supports-color@^5.1.0: + version "5.1.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.1.0.tgz#058a021d1b619f7ddf3980d712ea3590ce7de3d5" + dependencies: + has-flag "^2.0.0" + svgo@^0.7.0, svgo@^0.7.2: version "0.7.2" resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" @@ -5373,7 +5509,15 @@ to-regex@^3.0.1: extend-shallow "^2.0.1" regex-not "^1.0.0" -tough-cookie@~2.3.0: +toml@^2.3.3: + version "2.3.3" + resolved "https://registry.yarnpkg.com/toml/-/toml-2.3.3.tgz#8d683d729577cb286231dfc7a8affe58d31728fb" + +tomlify-j0.4@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/tomlify-j0.4/-/tomlify-j0.4-3.0.0.tgz#99414d45268c3a3b8bf38be82145b7bba34b7473" + +tough-cookie@~2.3.0, tough-cookie@~2.3.3: version "2.3.3" resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.3.tgz#0b618a5565b6dea90bf3425d04d55edc475a7561" dependencies: @@ -5432,10 +5576,10 @@ typescript@^2.6.2: resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.6.2.tgz#3c5b6fd7f6de0914269027f03c0946758f7673a4" uglify-es@^3.2.1: - version "3.3.4" - resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.4.tgz#2d592678791e5310456bbc95e952139e3b13167a" + version "3.3.7" + resolved "https://registry.yarnpkg.com/uglify-es/-/uglify-es-3.3.7.tgz#d1249af668666aba7cb1163e277455be9eb393cf" dependencies: - commander "~2.12.1" + commander "~2.13.0" source-map "~0.6.1" uglify-js@^2.6, uglify-js@^2.8.29: @@ -5530,9 +5674,9 @@ util@0.10.3, util@^0.10.3: dependencies: inherits "2.0.1" -uuid@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.1.0.tgz#3dd3d3e790abc24d7b0d3a034ffababe28ebbc04" +uuid@^3.0.0, uuid@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.2.1.tgz#12c528bb9d58d0b9265d9a2f6f0fe8be17ff1f14" v8-compile-cache@^1.1.0: version "1.1.0" @@ -5597,10 +5741,14 @@ window-size@0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.0.tgz#5438cd2ea93b202efa3a19fe8887aee7c94f9c9d" -wordwrap@0.0.2, wordwrap@~0.0.2: +wordwrap@0.0.2: version "0.0.2" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.2.tgz#b79669bb42ecb409f83d583cad52ca17eaa1643f" +wordwrap@~0.0.2: + version "0.0.3" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" + wordwrap@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" @@ -5663,17 +5811,17 @@ yargs-parser@^5.0.0: dependencies: camelcase "^3.0.0" -yargs-parser@^8.0.0: +yargs-parser@^8.0.0, yargs-parser@^8.1.0: version "8.1.0" resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950" dependencies: camelcase "^4.1.0" yargs@^10.0.3: - version "10.0.3" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.0.3.tgz#6542debd9080ad517ec5048fb454efe9e4d4aaae" + version "10.1.1" + resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.1.tgz#5fe1ea306985a099b33492001fa19a1e61efe285" dependencies: - cliui "^3.2.0" + cliui "^4.0.0" decamelize "^1.1.1" find-up "^2.1.0" get-caller-file "^1.0.1" @@ -5684,7 +5832,7 @@ yargs@^10.0.3: string-width "^2.0.0" which-module "^2.0.0" y18n "^3.2.1" - yargs-parser "^8.0.0" + yargs-parser "^8.1.0" yargs@^7.0.0: version "7.1.0"