From 8e2c7f1ba81213272576fc5480dea083bc76e1d7 Mon Sep 17 00:00:00 2001 From: Ivan Goncharov Date: Mon, 18 Dec 2017 13:19:00 +0200 Subject: [PATCH] Add MVP of mocha-like benchmark tests Based on #1163 by @mohawk2 --- .flowconfig | 1 + .gitignore | 1 + .npmignore | 1 + package.json | 8 +- resources/benchmark.js | 112 ++++++++++++ src/language/__tests__/lexer-benchmark.js | 45 +++++ src/language/__tests__/parser-benchmark.js | 28 +++ src/language/__tests__/printer-benchmark.js | 25 +++ yarn.lock | 193 ++++++++++++++++++-- 9 files changed, 398 insertions(+), 16 deletions(-) create mode 100644 resources/benchmark.js create mode 100644 src/language/__tests__/lexer-benchmark.js create mode 100644 src/language/__tests__/parser-benchmark.js create mode 100644 src/language/__tests__/printer-benchmark.js diff --git a/.flowconfig b/.flowconfig index c3e4067ad6..067b98650a 100644 --- a/.flowconfig +++ b/.flowconfig @@ -3,6 +3,7 @@ .*/dist/.* .*/coverage/.* .*/resources/.* +.*/benchmark/.* [include] diff --git a/.gitignore b/.gitignore index 89f817e5df..72d5bfdd99 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ node_modules coverage dist npm +benchmark diff --git a/.npmignore b/.npmignore index ec3753d8eb..91546a956c 100644 --- a/.npmignore +++ b/.npmignore @@ -17,3 +17,4 @@ resources src dist npm +benchmark diff --git a/package.json b/package.json index 7e0ab35f76..85f80ebac2 100644 --- a/package.json +++ b/package.json @@ -28,6 +28,7 @@ "prettier": "prettier --write 'src/**/*.js'", "check": "flow check", "check-cover": "for file in {src/*.js,src/**/*.js}; do echo $file; flow coverage $file; done", + "benchmark": "node resources/benchmark.js", "build": "npm run build:clean && npm run build:cp && npm run build:npm && npm run build:npm-flow && npm run build:module && npm run build:module-flow && npm run build:package-json", "build:clean": "rm -rf ./dist && mkdir ./dist", "build:cp": "cp README.md LICENSE ./dist", @@ -53,10 +54,13 @@ "babel-plugin-transform-flow-strip-types": "6.22.0", "babel-plugin-transform-object-rest-spread": "6.26.0", "babel-preset-env": "^1.5.2", + "beautify-benchmark": "0.2.4", + "benchmark": "2.1.4", "chai": "4.1.2", "chai-json-equal": "0.0.1", "chai-spies-next": "0.9.3", "chai-subset": "1.6.0", + "chalk": "2.3.0", "coveralls": "3.0.0", "eslint": "4.16.0", "eslint-plugin-babel": "4.1.2", @@ -64,8 +68,10 @@ "eslint-plugin-prettier": "2.5.0", "flow-bin": "0.64.0", "isparta": "4.0.0", + "microtime": "2.1.7", "mocha": "5.0.0", "prettier": "1.10.2", - "sane": "2.3.0" + "sane": "2.3.0", + "shelljs": "0.8.1" } } diff --git a/resources/benchmark.js b/resources/benchmark.js new file mode 100644 index 0000000000..a58ea35ece --- /dev/null +++ b/resources/benchmark.js @@ -0,0 +1,112 @@ +const benchmark = require('benchmark'); +const beautifyBenchmark = require('beautify-benchmark'); +const sh = require('shelljs'); +const chalk = require('chalk'); +const pathJoin = require('path').join; + +const args = process.argv.slice(2); +args[0] = args[0] || 'HEAD'; +args[1] = args[1] || 'local'; + +console.log('Benchmarking revisions: ' + args.join(', ')); + +const localDistDir = './benchmark/local'; +sh.rm('-rf', localDistDir); +console.log(`Building local dist: ${localDistDir}`); +sh.mkdir('-p', localDistDir); +exec(`babel src --optional runtime --copy-files --out-dir ${localDistDir}`); + +const revisions = {}; +for (const arg of args) { + const distPath = buildRevisionDist(arg); + const distRequire = (path) => reqireFromCWD(pathJoin(distPath, path)); + revisions[arg] = distRequire; +} + +const suites = {}; +global.suite = suite; +const testFiles = sh.ls(`${localDistDir}/**/__tests__/**/*-benchmark.js`); +for (const file of testFiles) { + reqireFromCWD(file); +} + +dummyRun(); +for (const [name, measures] of Object.entries(suites)) { + console.log(chalk.green(name) + '\n'); + benchmark.invoke(measures, 'run'); +} + +function reqireFromCWD(path) { + return require(pathJoin(process.cwd(), path)) +} + +function dummyRun() { + (new benchmark.Suite('dummy')) + .add('dummy', () => { Math.pow(2, 256); }) + .run(); +} + +function newMeasurement(name) { + return new benchmark.Suite(name, { + onStart(event) { + console.log(' ⏱️ ', event.currentTarget.name); + }, + onCycle(event) { + beautifyBenchmark.add(event.target); + }, + onComplete() { + beautifyBenchmark.log(); + }, + }); +} + +function suite(name, fn) { + const measures = {}; + for (const [revision, distRequire] of Object.entries(revisions)) { + currentRevision = revision; + global.measure = (name, fn) => { + measures[name] = measures[name] || newMeasurement(name); + measures[name].add(revision, fn); + }; + try { + fn(distRequire); + } catch (e) { + console.error(e.stack); + } + } + global.measure = undefined; + suites[name] = Object.values(measures); +} + +function exec(command) { + const {code, stdout, stderr} = sh.exec(command, {silent: true}); + if (code !== 0) { + console.error(stdout); + console.error(stderr); + sh.exit(code); + } + return stdout.trim(); +} + +function buildRevisionDist(revision) { + if (revision === 'local') { + return localDistDir; + } + + const hash = exec(`git log -1 --format=%h "${revision}"`); + const buildDir = './benchmark/' + hash; + const distDir = buildDir + '/dist' + + if (sh.test('-d', buildDir)) { + return distDir; + } + console.log(`Building "${revision}"(${hash}) revision: ${buildDir}`); + sh.mkdir('-p', buildDir); + exec(`git archive "${hash}" | tar -xC "${buildDir}"`); + + const pwd = sh.pwd(); + sh.cd(buildDir); + exec('yarn && npm run build'); + sh.cd(pwd); + return buildDir + '/dist'; +} diff --git a/src/language/__tests__/lexer-benchmark.js b/src/language/__tests__/lexer-benchmark.js new file mode 100644 index 0000000000..81500292b8 --- /dev/null +++ b/src/language/__tests__/lexer-benchmark.js @@ -0,0 +1,45 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import { readFileSync } from 'fs'; +import { join } from 'path'; +import { getIntrospectionQuery } from '../../utilities/introspectionQuery'; +/* global suite, measure */ + +function readFile(path) { + const fullPath = join(__dirname, path); + return readFileSync(fullPath, { encoding: 'utf8' }); +} + +const introspectionQuery = getIntrospectionQuery(); +const kitchenSink = readFile('./kitchen-sink.graphql'); +const schemaKitchenSink = readFile('./schema-kitchen-sink.graphql'); + +suite('Run lexer on a string', distRequire => { + const { Source } = distRequire('language/source'); + const { createLexer } = distRequire('language/lexer'); + + function runLexer(source) { + const lexer = createLexer(source); + let token; + do { + token = lexer.advance(); + } while (token.kind !== ''); + } + + measure('Introspection Query', () => { + runLexer(new Source(introspectionQuery)); + }); + + measure('Kitchen Sink', () => { + runLexer(new Source(kitchenSink)); + }); + + measure('Schema Kitchen Sink', () => { + runLexer(new Source(schemaKitchenSink)); + }); +}); diff --git a/src/language/__tests__/parser-benchmark.js b/src/language/__tests__/parser-benchmark.js new file mode 100644 index 0000000000..3c01224b2f --- /dev/null +++ b/src/language/__tests__/parser-benchmark.js @@ -0,0 +1,28 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import { readFileSync } from 'fs'; +import { join } from 'path'; +import { getIntrospectionQuery } from '../../utilities/introspectionQuery'; +/* global suite, measure */ + +function readFile(path) { + const fullPath = join(__dirname, path); + return readFileSync(fullPath, { encoding: 'utf8' }); +} + +const introspectionQuery = getIntrospectionQuery(); +const kitchenSink = readFile('./kitchen-sink.graphql'); +const schemaKitchenSink = readFile('./schema-kitchen-sink.graphql'); + +suite('Parse string to AST', distRequire => { + const { parse } = distRequire('language/parser'); + + measure('Introspection Query', () => parse(introspectionQuery)); + measure('Kitchen Sink', () => parse(kitchenSink)); + measure('Schema Kitchen Sink', () => parse(schemaKitchenSink)); +}); diff --git a/src/language/__tests__/printer-benchmark.js b/src/language/__tests__/printer-benchmark.js new file mode 100644 index 0000000000..20318add48 --- /dev/null +++ b/src/language/__tests__/printer-benchmark.js @@ -0,0 +1,25 @@ +/** + * Copyright (c) 2015-present, Facebook, Inc. + * + * This source code is licensed under the MIT license found in the + * LICENSE file in the root directory of this source tree. + */ + +import { readFileSync } from 'fs'; +import { join } from 'path'; +import { getIntrospectionQuery } from '../../utilities/introspectionQuery'; +/* global suite, measure */ + +suite('Print AST', distRequire => { + const { print } = distRequire('language/printer'); + const { parse } = distRequire('language/parser'); + + const kitchenSink = readFileSync(join(__dirname, './kitchen-sink.graphql'), { + encoding: 'utf8', + }); + const kitchenSinkAST = parse(kitchenSink); + measure('Kitchen Sink', () => print(kitchenSinkAST)); + + const introspectionQueryAST = parse(getIntrospectionQuery()); + measure('Introspection Query', () => print(introspectionQueryAST)); +}); diff --git a/yarn.lock b/yarn.lock index 7fbdb2628d..fb60c9ffcf 100644 --- a/yarn.lock +++ b/yarn.lock @@ -786,10 +786,31 @@ bcrypt-pbkdf@^1.0.0: dependencies: tweetnacl "^0.14.3" +beautify-benchmark@0.2.4: + version "0.2.4" + resolved "https://registry.yarnpkg.com/beautify-benchmark/-/beautify-benchmark-0.2.4.tgz#3151def14c1a2e0d07ff2e476861c7ed0e1ae39b" + +benchmark@2.1.4: + version "2.1.4" + resolved "https://registry.yarnpkg.com/benchmark/-/benchmark-2.1.4.tgz#09f3de31c916425d498cc2ee565a0ebf3c2a5629" + dependencies: + lodash "^4.17.4" + platform "^1.3.3" + binary-extensions@^1.0.0: version "1.11.0" resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.11.0.tgz#46aa1751fb6a2f93ee5e689bb1087d4b14c6c205" +bindings@1.3.x: + version "1.3.0" + resolved "https://registry.yarnpkg.com/bindings/-/bindings-1.3.0.tgz#b346f6ecf6a95f5a815c5839fc7cdb22502f1ed7" + +bl@^1.0.0: + version "1.2.1" + resolved "https://registry.yarnpkg.com/bl/-/bl-1.2.1.tgz#cac328f7bee45730d404b692203fcb590e172d5e" + dependencies: + readable-stream "^2.0.5" + block-stream@*: version "0.0.9" resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" @@ -898,6 +919,14 @@ chai@4.1.2: pathval "^1.0.0" type-detect "^4.0.0" +chalk@2.3.0, chalk@^2.0.0, chalk@^2.1.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" + dependencies: + ansi-styles "^3.1.0" + escape-string-regexp "^1.0.5" + supports-color "^4.0.0" + chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -908,14 +937,6 @@ chalk@^1.1.3: strip-ansi "^3.0.0" supports-color "^2.0.0" -chalk@^2.0.0, chalk@^2.1.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.3.0.tgz#b5ea48efc9c1793dccc9b4767c93914d3f2d52ba" - dependencies: - ansi-styles "^3.1.0" - escape-string-regexp "^1.0.5" - supports-color "^4.0.0" - chalk@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.4.0.tgz#5199a3ddcd0c1efe23bc08c1b027b06176e0c64f" @@ -947,6 +968,10 @@ chokidar@^1.6.1: optionalDependencies: fsevents "^1.0.0" +chownr@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/chownr/-/chownr-1.0.1.tgz#e2a75042a9551908bebd25b8523d5f9769d79181" + circular-json@^0.3.1: version "0.3.3" resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" @@ -1121,7 +1146,7 @@ detect-indent@^4.0.0: dependencies: repeating "^2.0.0" -detect-libc@^1.0.2: +detect-libc@^1.0.2, detect-libc@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" @@ -1145,6 +1170,12 @@ electron-to-chromium@^1.3.27: version "1.3.27" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.27.tgz#78ecb8a399066187bb374eede35d9c70565a803d" +end-of-stream@^1.0.0, end-of-stream@^1.1.0: + version "1.4.1" + resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.1.tgz#ed29634d19baba463b6ce6b80a37213eab71ec43" + dependencies: + once "^1.4.0" + escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" @@ -1303,6 +1334,10 @@ expand-range@^1.8.1: dependencies: fill-range "^2.1.0" +expand-template@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/expand-template/-/expand-template-1.1.0.tgz#e09efba977bf98f9ee0ed25abd0c692e02aec3fc" + extend@~3.0.0, extend@~3.0.1: version "3.0.1" resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" @@ -1480,6 +1515,10 @@ getpass@^0.1.1: dependencies: assert-plus "^1.0.0" +github-from-package@0.0.0: + version "0.0.0" + resolved "https://registry.yarnpkg.com/github-from-package/-/github-from-package-0.0.0.tgz#97fb5d96bfde8973313f20e8288ef9a167fa64ce" + glob-base@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" @@ -1493,7 +1532,7 @@ glob-parent@^2.0.0: dependencies: is-glob "^2.0.0" -glob@7.1.2, glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: +glob@7.1.2, glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: version "7.1.2" resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" dependencies: @@ -1694,6 +1733,10 @@ inquirer@^3.0.6: strip-ansi "^4.0.0" through "^2.3.6" +interpret@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" + invariant@^2.2.0, invariant@^2.2.2: version "2.2.2" resolved "https://registry.yarnpkg.com/invariant/-/invariant-2.2.2.tgz#9e1f56ac0acdb6bf303306f338be3b204ae60360" @@ -2001,6 +2044,14 @@ micromatch@^2.1.5: parse-glob "^3.0.4" regex-cache "^0.4.2" +microtime@2.1.7: + version "2.1.7" + resolved "https://registry.yarnpkg.com/microtime/-/microtime-2.1.7.tgz#0904f6e755e6a7450552c191f4099e231cb5fa6c" + dependencies: + bindings "1.3.x" + nan "2.8.x" + prebuild-install "^2.1.0" + mime-db@~1.30.0: version "1.30.0" resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.30.0.tgz#74c643da2dd9d6a45399963465b26d5ca7d71f01" @@ -2062,7 +2113,7 @@ mute-stream@0.0.7: version "0.0.7" resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" -nan@^2.3.0: +nan@2.8.x, nan@^2.3.0: version "2.8.0" resolved "https://registry.yarnpkg.com/nan/-/nan-2.8.0.tgz#ed715f3fe9de02b57a5e6252d90a96675e1f085a" @@ -2070,6 +2121,12 @@ natural-compare@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" +node-abi@^2.1.1: + version "2.2.0" + resolved "https://registry.yarnpkg.com/node-abi/-/node-abi-2.2.0.tgz#e802ac7a2408e2c0593fb3176ffdf8a99a9b4dec" + dependencies: + semver "^5.4.1" + node-int64@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" @@ -2097,6 +2154,10 @@ nomnomnomnom@^2.0.0: chalk "~0.4.0" underscore "~1.6.0" +noop-logger@^0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/noop-logger/-/noop-logger-0.1.1.tgz#94a2b1633c4f1317553007d8966fd0e841b6a4c2" + nopt@3.x: version "3.0.6" resolved "https://registry.yarnpkg.com/nopt/-/nopt-3.0.6.tgz#c6465dbf08abcd4db359317f79ac68a646b28ff9" @@ -2116,7 +2177,7 @@ normalize-path@^2.0.0, normalize-path@^2.0.1: dependencies: remove-trailing-separator "^1.0.1" -npmlog@^4.0.2: +npmlog@^4.0.1, npmlog@^4.0.2: version "4.1.2" resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.2.tgz#08a7f2a8bf734604779a9efa4ad5cc717abb954b" dependencies: @@ -2144,7 +2205,7 @@ object.omit@^2.0.0: for-own "^0.1.4" is-extendable "^0.1.1" -once@1.x, once@^1.3.0, once@^1.3.3: +once@1.x, once@^1.3.0, once@^1.3.1, once@^1.3.3, once@^1.4.0: version "1.4.0" resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" dependencies: @@ -2174,7 +2235,7 @@ optionator@^0.8.1, optionator@^0.8.2: type-check "~0.3.2" wordwrap "~1.0.0" -os-homedir@^1.0.0: +os-homedir@^1.0.0, os-homedir@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" @@ -2214,6 +2275,10 @@ path-is-inside@^1.0.1, path-is-inside@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" +path-parse@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" + pathval@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" @@ -2240,10 +2305,34 @@ pinkie@^2.0.0: version "2.0.4" resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" +platform@^1.3.3: + version "1.3.5" + resolved "https://registry.yarnpkg.com/platform/-/platform-1.3.5.tgz#fb6958c696e07e2918d2eeda0f0bc9448d733444" + pluralize@^7.0.0: version "7.0.0" resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" +prebuild-install@^2.1.0: + version "2.5.0" + resolved "https://registry.yarnpkg.com/prebuild-install/-/prebuild-install-2.5.0.tgz#6fdd8436069971c76688071f4847d4c891a119f4" + dependencies: + detect-libc "^1.0.3" + expand-template "^1.0.2" + github-from-package "0.0.0" + minimist "^1.2.0" + mkdirp "^0.5.1" + node-abi "^2.1.1" + noop-logger "^0.1.1" + npmlog "^4.0.1" + os-homedir "^1.0.1" + pump "^1.0.1" + rc "^1.1.6" + simple-get "^1.4.2" + tar-fs "^1.13.0" + tunnel-agent "^0.6.0" + xtend "4.0.1" + prelude-ls@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" @@ -2272,6 +2361,13 @@ pseudomap@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" +pump@^1.0.0, pump@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/pump/-/pump-1.0.3.tgz#5dfe8311c33bbf6fc18261f9f34702c47c08a954" + dependencies: + end-of-stream "^1.1.0" + once "^1.3.1" + punycode@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" @@ -2291,6 +2387,15 @@ randomatic@^1.1.3: is-number "^3.0.0" kind-of "^4.0.0" +rc@^1.1.6: + version "1.2.5" + resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.5.tgz#275cd687f6e3b36cc756baa26dfee80a790301fd" + dependencies: + deep-extend "~0.4.0" + ini "~1.3.0" + minimist "^1.2.0" + strip-json-comments "~2.0.1" + rc@^1.1.7: version "1.2.2" resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.2.tgz#d8ce9cb57e8d64d9c7badd9876c7c34cbe3c7077" @@ -2300,7 +2405,7 @@ rc@^1.1.7: minimist "^1.2.0" strip-json-comments "~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.0.0, readable-stream@^2.0.2, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.2.2: version "2.3.3" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.3.tgz#368f2512d79f9d46fdfc71349ae7878bbc1eb95c" dependencies: @@ -2321,6 +2426,12 @@ readdirp@^2.0.0: readable-stream "^2.0.2" set-immediate-shim "^1.0.1" +rechoir@^0.6.2: + version "0.6.2" + resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" + dependencies: + resolve "^1.1.6" + regenerate@^1.2.1: version "1.3.3" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" @@ -2452,6 +2563,12 @@ resolve@1.1.x: version "1.1.7" resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.1.7.tgz#203114d82ad2c5ed9e8e0411b3932875e889e97b" +resolve@^1.1.6: + version "1.5.0" + resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.5.0.tgz#1f09acce796c9a762579f31b2c1cc4c3cddf9f36" + dependencies: + path-parse "^1.0.5" + restore-cursor@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" @@ -2509,6 +2626,10 @@ semver@^5.3.0: version "5.4.1" resolved "https://registry.yarnpkg.com/semver/-/semver-5.4.1.tgz#e059c09d8571f0540823733433505d3a2f00b18e" +semver@^5.4.1: + version "5.5.0" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" + set-blocking@~2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" @@ -2527,10 +2648,26 @@ 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.8.1: + version "0.8.1" + resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.1.tgz#729e038c413a2254c4078b95ed46e0397154a9f1" + dependencies: + glob "^7.0.0" + interpret "^1.0.0" + rechoir "^0.6.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" +simple-get@^1.4.2: + version "1.4.3" + resolved "https://registry.yarnpkg.com/simple-get/-/simple-get-1.4.3.tgz#e9755eda407e96da40c5e5158c9ea37b33becbeb" + dependencies: + once "^1.3.1" + unzip-response "^1.0.0" + xtend "^4.0.0" + slash@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz#c41f2f6c39fc16d1cd17ad4b5d896114ae470d55" @@ -2671,6 +2808,15 @@ table@^4.0.1: slice-ansi "1.0.0" string-width "^2.1.1" +tar-fs@^1.13.0: + version "1.16.0" + resolved "https://registry.yarnpkg.com/tar-fs/-/tar-fs-1.16.0.tgz#e877a25acbcc51d8c790da1c57c9cf439817b896" + dependencies: + chownr "^1.0.1" + mkdirp "^0.5.1" + pump "^1.0.0" + tar-stream "^1.1.2" + tar-pack@^3.4.0: version "3.4.1" resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.1.tgz#e1dbc03a9b9d3ba07e896ad027317eb679a10a1f" @@ -2684,6 +2830,15 @@ tar-pack@^3.4.0: tar "^2.2.1" uid-number "^0.0.6" +tar-stream@^1.1.2: + version "1.5.5" + resolved "https://registry.yarnpkg.com/tar-stream/-/tar-stream-1.5.5.tgz#5cad84779f45c83b1f2508d96b09d88c7218af55" + dependencies: + bl "^1.0.0" + end-of-stream "^1.0.0" + readable-stream "^2.0.0" + xtend "^4.0.0" + tar@^2.2.1: version "2.2.1" resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" @@ -2777,6 +2932,10 @@ underscore@~1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.6.0.tgz#8b38b10cacdef63337b8b24e4ff86d45aea529a8" +unzip-response@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-1.0.2.tgz#b984f0877fc0a89c2c773cc1ef7b5b232b5b06fe" + user-home@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/user-home/-/user-home-1.1.1.tgz#2b5be23a32b63a7c9deb8d0f28d485724a3df190" @@ -2858,6 +3017,10 @@ write@^0.2.1: dependencies: mkdirp "^0.5.1" +xtend@4.0.1, xtend@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" + yallist@^2.1.2: version "2.1.2" resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"