diff --git a/.gitignore b/.gitignore index f8dc1b6d42..51db454053 100644 --- a/.gitignore +++ b/.gitignore @@ -6,6 +6,6 @@ local.log /dist tmp .DS_Store -package-lock.json +/package-lock.json !/test/fixtures/**/package-lock.json .idea diff --git a/src/cli/commands/test.ts b/src/cli/commands/test.ts index d1231081da..173e3ae2b4 100644 --- a/src/cli/commands/test.ts +++ b/src/cli/commands/test.ts @@ -30,7 +30,6 @@ async function test(...args) { if (args.length === 0) { args.unshift(process.cwd()); } - // org fallback to config unless specified options.org = options.org || config.org; // making `show-vulnerable-paths` true by default. diff --git a/src/lib/plugins/npm/index.js b/src/lib/plugins/npm/index.js index 7a5c3aa4d0..358084c8ea 100644 --- a/src/lib/plugins/npm/index.js +++ b/src/lib/plugins/npm/index.js @@ -3,6 +3,7 @@ const fileSystem = require('fs'); const fs = require('then-fs'); const path = require('path'); const lockFileParser = require('snyk-nodejs-lockfile-parser'); +const _ = require('lodash'); module.exports = { inspect, @@ -62,7 +63,8 @@ async function generateDependenciesFromLockfile(root, options, targetFile) { const lockFile = await fs.readFile(lockFileFullPath, 'utf-8'); const defaultManifestFileName = path.relative(root, manifestFileFullPath); + const strictOutOfSync = _.get(options, 'strictOutOfSync', true); return lockFileParser.buildDepTree(manifestFile, lockFile, options.dev, - lockFileParser.LockfileType.npm, true, defaultManifestFileName); + lockFileParser.LockfileType.npm, strictOutOfSync, defaultManifestFileName); } diff --git a/src/lib/plugins/yarn/index.js b/src/lib/plugins/yarn/index.js index 2bfd0fbd4d..7e3853af01 100644 --- a/src/lib/plugins/yarn/index.js +++ b/src/lib/plugins/yarn/index.js @@ -4,6 +4,7 @@ const fs = require('then-fs'); const path = require('path'); const lockFileParser = require('snyk-nodejs-lockfile-parser'); const debug = require('debug')('snyk'); +const _ = require('lodash'); module.exports = { inspect, @@ -76,8 +77,9 @@ async function generateDependenciesFromLockfile(root, options, targetFile) { const lockFile = await fs.readFile(lockFileFullPath, 'utf-8'); const defaultManifestFileName = path.relative(root, manifestFileFullPath); + const strictOutOfSync = _.get(options, 'strictOutOfSync', true); return lockFileParser.buildDepTree(manifestFile, lockFile, options.dev, - lockFileParser.LockfileType.yarn, true, defaultManifestFileName); + lockFileParser.LockfileType.yarn, strictOutOfSync, defaultManifestFileName); } function getRuntimeVersion() { diff --git a/src/lib/snyk-test/npm/index.js b/src/lib/snyk-test/npm/index.js index a458159ce2..aeb904b42d 100644 --- a/src/lib/snyk-test/npm/index.js +++ b/src/lib/snyk-test/npm/index.js @@ -149,7 +149,8 @@ function generateDependenciesFromLockfile(root, options, targetFile) { debug(resolveModuleSpinnerLabel); return spinner(resolveModuleSpinnerLabel) .then(() => { - return lockFileParser.buildDepTree(manifestFile, lockFile, options.dev, lockFileType); + const strictOutOfSync = _.get(options, 'strictOutOfSync', true); + return lockFileParser.buildDepTree(manifestFile, lockFile, options.dev, lockFileType, strictOutOfSync); }) // clear spinner in case of success or failure .then(spinner.clear(resolveModuleSpinnerLabel)) diff --git a/test/acceptance/cli.acceptance.test.ts b/test/acceptance/cli.acceptance.test.ts index b9cd2b3909..3f136c29ff 100644 --- a/test/acceptance/cli.acceptance.test.ts +++ b/test/acceptance/cli.acceptance.test.ts @@ -14,10 +14,12 @@ import * as needle from 'needle'; // configure our fake configuration too import * as snykPolicy from 'snyk-policy'; +function getRuntimeVersion(): number { + return parseInt(process.version.slice(1).split('.')[0], 10); +} const {test, only} = tap; (tap as any).runOnly = false; // <- for debug. set to true, and replace a test to only(..) - const port = process.env.PORT = process.env.SNYK_PORT = '12345'; process.env.SNYK_API = 'http://localhost:' + port + '/api/v1'; process.env.SNYK_HOST = 'http://localhost:' + port; @@ -25,7 +27,7 @@ process.env.LOG_LEVEL = '0'; const apiKey = '123456789'; let oldkey; let oldendpoint; -const server:any = fakeServer(process.env.SNYK_API, apiKey); +const server: any = fakeServer(process.env.SNYK_API, apiKey); const before = tap.runOnly ? only : test; const after = tap.runOnly ? only : test; @@ -58,15 +60,14 @@ before('prime config', async (t) => { t.end(); }); - test('test cli with multiple params: good and bad', async (t) => { t.plan(6); try { await cli.test('/', 'semver', {registry: 'npm', org: 'EFF', json: true}); t.fail('expect to err'); - } catch(err) { + } catch (err) { const errObj = JSON.parse(err.message); - t.ok(errObj.length == 2, 'expecting two results'); + t.ok(errObj.length === 2, 'expecting two results'); t.notOk(errObj[0].ok, 'first object shouldnt be ok'); t.ok(errObj[1].ok, 'second object should be ok'); t.ok(errObj[0].path.length > 0, 'should have path'); @@ -81,7 +82,7 @@ test('userMessage correctly bubbles with npm', async (t) => { try { await cli.test('npm-package', {org: 'missing-org'}); t.fail('expect to err'); - } catch(err) { + } catch (err) { t.equal(err.userMessage, 'cli error message', 'got correct err message'); } t.end(); @@ -92,9 +93,9 @@ test('userMessage correctly bubbles with everything other than npm', async (t) = try { await cli.test('ruby-app', { org: 'missing-org' }); t.fail('expect to err'); - } catch(err) { + } catch (err) { t.equal(err.userMessage, 'cli error message', 'got correct err message'); - }; + } t.end(); }); @@ -129,7 +130,7 @@ test('`test empty --file=Gemfile`', async (t) => { try { await cli.test('empty', {file: 'Gemfile'}); t.fail('should have failed'); - } catch(err) { + } catch (err) { t.pass('throws err'); t.match(err.message, 'Could not find the specified file: Gemfile', 'shows err'); @@ -139,7 +140,7 @@ test('`test empty --file=Gemfile`', async (t) => { test('`test --file=fixtures/protect/package.json`', async (t) => { const res = await cli.test( path.resolve(__dirname, '..'), - {file: 'fixtures/protect/package.json'} + {file: 'fixtures/protect/package.json'}, ); t.match( res, @@ -148,13 +149,12 @@ test('`test --file=fixtures/protect/package.json`', async (t) => { ); }); - test('`test /` test for non-existent with path specified', async (t) => { chdirWorkspaces(); try { await cli.test('/'); t.fail('should have failed'); - } catch(err) { + } catch (err) { t.pass('throws err'); t.match(err.message, 'Could not detect supported target files in /.' + '\nPlease see our documentation for supported' + @@ -170,12 +170,12 @@ test('`test nuget-app --file=non_existent`', async (t) => { try { await cli.test('nuget-app', {file: 'non-existent'}); t.fail('should have failed'); - } catch(err) { + } catch (err) { t.pass('throws err'); t.match(err.message, 'Could not find the specified file: non-existent', - 'show first part of err message') + 'show first part of err message'); t.match(err.message, 'Please check that it exists and try again.', - 'show second part of err message') + 'show second part of err message'); } }); @@ -184,7 +184,7 @@ test('`test empty --file=readme.md`', async (t) => { try { await cli.test('empty', {file: 'readme.md'}); t.fail('should have failed'); - } catch(err) { + } catch (err) { t.pass('throws err'); t.match(err.message, 'Could not detect package manager for file: readme.md', @@ -197,7 +197,7 @@ test('`test ruby-app-no-lockfile --file=Gemfile`', async (t) => { try { await cli.test('ruby-app-no-lockfile', {file: 'Gemfile'}); t.fail('should have failed'); - } catch(err) { + } catch (err) { t.pass('throws err'); t.match(err.message, 'Please run `bundle install`', 'shows err'); } @@ -544,7 +544,6 @@ test('`test npm-package-policy` returns correct meta', async (t) => { t.match(meta[5], /Local Snyk policy:\s+found/, 'local policy displayed'); }); - test('`test ruby-gem-no-lockfile --file=ruby-gem.gemspec`', async (t) => { chdirWorkspaces(); await cli.test('ruby-gem-no-lockfile', {file: 'ruby-gem.gemspec'}); @@ -795,12 +794,12 @@ test('`test npm-package` sends pkg info', async (t) => { const pkg = req.body; t.equal(req.method, 'POST', 'makes POST request'); t.match(req.url, '/vuln/npm', 'posts to correct url'); - t.ok(pkg.dependencies['debug'], 'dependency'); - t.ok(pkg.dependencies['debug'].dependencies['ms'], 'transitive dependency'); + t.ok(pkg.dependencies.debug, 'dependency'); + t.ok(pkg.dependencies.debug.dependencies.ms, 'transitive dependency'); t.notOk(pkg.dependencies['object-assign'], 'no dev dependency'); t.notOk(pkg.from, 'no "from" array on root'); - t.notOk(pkg.dependencies['debug'].from, + t.notOk(pkg.dependencies.debug.from, 'no "from" array on dep'); }); @@ -811,12 +810,12 @@ test('`test npm-package --file=package-lock.json ` sends pkg info', async (t) => const pkg = req.body; t.equal(req.method, 'POST', 'makes POST request'); t.match(req.url, '/vuln/npm', 'posts to correct url'); - t.ok(pkg.dependencies['debug'], 'dependency'); - t.ok(pkg.dependencies['debug'].dependencies['ms'], 'transitive dependency'); + t.ok(pkg.dependencies.debug, 'dependency'); + t.ok(pkg.dependencies.debug.dependencies.ms, 'transitive dependency'); t.notOk(pkg.dependencies['object-assign'], 'no dev dependency'); t.notOk(pkg.from, 'no "from" array on root'); - t.notOk(pkg.dependencies['debug'].from, + t.notOk(pkg.dependencies.debug.from, 'no "from" array on dep'); }); @@ -827,22 +826,76 @@ test('`test npm-package --file=package-lock.json --dev` sends pkg info', async ( const pkg = req.body; t.equal(req.method, 'POST', 'makes POST request'); t.match(req.url, '/vuln/npm', 'posts to correct url'); - t.ok(pkg.dependencies['debug'], 'dependency'); - t.ok(pkg.dependencies['debug'].dependencies['ms'], 'transitive dependency'); + t.ok(pkg.dependencies.debug, 'dependency'); + t.ok(pkg.dependencies.debug.dependencies.ms, 'transitive dependency'); t.ok(pkg.dependencies['object-assign'], 'dev dependency included'); t.notOk(pkg.from, 'no "from" array on root'); - t.notOk(pkg.dependencies['debug'].from, + t.notOk(pkg.dependencies.debug.from, 'no "from" array on dep'); }); +test('`test npm-out-of-sync` out of sync fails', async (t) => { + chdirWorkspaces(); + try { + await cli.test('npm-out-of-sync', {dev: true}); + t.fail('Should fail'); + } catch (e) { + t.equal(e.message, '\nTesting npm-out-of-sync...\n\n' + + 'Dependency snyk was not found in package-lock.json.' + + ' Your package.json and package-lock.json are probably out of sync.' + + ' Please run "npm install" and try again.', 'Contains enough info about err'); + } +}); + +if (getRuntimeVersion() > 4) { + // yarn lockfile based testing is only supported for node 4+ + test('`test yarn-out-of-sync` out of sync fails', async (t) => { + chdirWorkspaces(); + try { + await cli.test('yarn-out-of-sync', {dev: true}); + t.fail('Should fail'); + } catch (e) { + t.equal(e.message, '\nTesting yarn-out-of-sync...\n\n' + + 'Dependency snyk was not found in yarn.lock.' + + ' Your package.json and yarn.lock are probably out of sync.' + + ' Please run "yarn install" and try again.', 'Contains enough info about err'); + } + }); + + test('`test yarn-out-of-sync --strictOutOfSync=false` passes', async (t) => { + chdirWorkspaces(); + await cli.test('yarn-out-of-sync', { dev: true, strictOutOfSync: false}); + const req = server.popRequest(); + const pkg = req.body; + t.equal(req.method, 'POST', 'makes POST request'); + t.match(req.url, '/vuln/npm', 'posts to correct url'); + t.ok(pkg.dependencies['to-array'], 'dependency'); + t.ok(pkg.dependencies['object-assign'], + 'dev dependency included'); + t.ok(pkg.dependencies.rewire.dependencies.eslint, 'transitive dependency'); + }); +} + +test('`test npm-out-of-sync --strictOutOfSync=false` passes', async (t) => { + chdirWorkspaces(); + await cli.test('npm-out-of-sync', { dev: true, strictOutOfSync: false}); + const req = server.popRequest(); + const pkg = req.body; + t.equal(req.method, 'POST', 'makes POST request'); + t.match(req.url, '/vuln/npm', 'posts to correct url'); + t.ok(pkg.dependencies['to-array'], 'dependency'); + t.ok(pkg.dependencies['object-assign'], + 'dev dependency included'); +}); + test('`test npm-package-shrinkwrap --file=package-lock.json ` with npm-shrinkwrap errors', async (t) => { t.plan(1); chdirWorkspaces(); try { await cli.test('npm-package-shrinkwrap', {file: 'package-lock.json'}); t.fail('Should fail'); - } catch(e) { + } catch (e) { t.includes(e.message, '--file=package-lock.json', 'Contains enough info about err'); } }); @@ -872,12 +925,12 @@ test('`test npm-package --file=yarn.lock ` sends pkg info', async (t) => { const pkg = req.body; t.equal(req.method, 'POST', 'makes POST request'); t.match(req.url, '/vuln/npm', 'posts to correct url'); - t.ok(pkg.dependencies['debug'], 'dependency'); - t.ok(pkg.dependencies['debug'].dependencies['ms'], 'transitive dependency'); + t.ok(pkg.dependencies.debug, 'dependency'); + t.ok(pkg.dependencies.debug.dependencies.ms, 'transitive dependency'); t.notOk(pkg.dependencies['object-assign'], 'no dev dependency'); t.notOk(pkg.from, 'no "from" array on root'); - t.notOk(pkg.dependencies['debug'].from, + t.notOk(pkg.dependencies.debug.from, 'no "from" array on dep'); }); @@ -888,12 +941,12 @@ test('`test npm-package --file=yarn.lock --dev` sends pkg info', async (t) => { const pkg = req.body; t.equal(req.method, 'POST', 'makes POST request'); t.match(req.url, '/vuln/npm', 'posts to correct url'); - t.ok(pkg.dependencies['debug'], 'dependency'); - t.ok(pkg.dependencies['debug'].dependencies['ms'], 'transitive dependency'); + t.ok(pkg.dependencies.debug, 'dependency'); + t.ok(pkg.dependencies.debug.dependencies.ms, 'transitive dependency'); t.ok(pkg.dependencies['object-assign'], 'dev dependency included'); t.notOk(pkg.from, 'no "from" array on root'); - t.notOk(pkg.dependencies['debug'].from, + t.notOk(pkg.dependencies.debug.from, 'no "from" array on dep'); }); @@ -1634,8 +1687,8 @@ test('`test foo:latest --docker` supports custom policy', async (t) => { t.teardown(loadPlugin.restore); await cli.test('foo:latest', { - docker: true, - org: 'explicit-org', + 'docker': true, + 'org': 'explicit-org', 'policy-path': 'npm-package-policy/custom-location', }); const req = server.popRequest(); @@ -1643,13 +1696,13 @@ test('`test foo:latest --docker` supports custom policy', async (t) => { t.equal(req.body.depGraph.pkgManager.name, 'deb'); t.same(spyPlugin.getCall(0).args, ['foo:latest', null, { - args: null, - file: null, - docker: true, - org: 'explicit-org', - packageManager: null, - path: 'foo:latest', - showVulnPaths: true, + 'args': null, + 'file': null, + 'docker': true, + 'org': 'explicit-org', + 'packageManager': null, + 'path': 'foo:latest', + 'showVulnPaths': true, 'policy-path': 'npm-package-policy/custom-location', }], 'calls docker plugin with expected arguments'); @@ -1782,7 +1835,7 @@ test('`test --policy-path`', async (t) => { json: true, }); t.fail('should have reported vulns'); - } catch(res) { + } catch (res) { const req = server.popRequest(); const policyString = req.body.policy; t.equal(policyString, expected, 'sends correct policy'); @@ -1808,7 +1861,7 @@ test('`test --policy-path`', async (t) => { const res = await cli.test('.', { 'policy-path': 'custom-location', - json: true, + 'json': true, }); const req = server.popRequest(); const policyString = req.body.policy; @@ -1857,7 +1910,7 @@ test('`test npm-package-with-git-url ` handles git url with patch policy', async try { await cli.test(); t.fail('should fail'); - } catch(res) { + } catch (res) { server.popRequest(); t.match(res.message, 'for known vulnerabilities', 'found results'); @@ -1914,7 +1967,6 @@ test('`test sbt-simple-struts`', async (t) => { } }); - /** * `monitor` */ @@ -1933,7 +1985,7 @@ test('`monitor --policy-path`', async (t) => { t.test('custom policy path', async (t) => { const res = await cli.monitor('.', { 'policy-path': 'custom-location', - json: true, + 'json': true, }); const req = server.popRequest(); const policyString = req.body.policy; @@ -1948,7 +2000,7 @@ test('`monitor non-existing --json`', async (t) => { try { await cli.monitor('non-existing', {json: true}); t.fail('should have failed'); - } catch(err) { + } catch (err) { const errObj = JSON.parse(err.message); t.notOk(errObj.ok, 'ok object should be false'); t.match(errObj.error, 'is not a valid path', 'show err message'); @@ -1962,7 +2014,7 @@ test('`monitor non-existing`', async (t) => { try { await cli.monitor('non-existing', {json: false}); t.fail('should have failed'); - } catch(err) { + } catch (err) { t.match(err.message, 'is not a valid path', 'show err message'); t.pass('throws err'); } @@ -1992,11 +2044,11 @@ test('`monitor npm-package`', async (t) => { const pkg = req.body.package; t.equal(req.method, 'PUT', 'makes PUT request'); t.match(req.url, '/monitor/npm', 'puts at correct url'); - t.ok(pkg.dependencies['debug'], 'dependency'); + t.ok(pkg.dependencies.debug, 'dependency'); t.notOk(pkg.dependencies['object-assign'], 'no dev dependency'); t.notOk(pkg.from, 'no "from" array on root'); - t.notOk(pkg.dependencies['debug'].from, + t.notOk(pkg.dependencies.debug.from, 'no "from" array on dep'); }); @@ -2015,7 +2067,7 @@ test('`monitor npm-package with dev dep flag`', async (t) => { const req = server.popRequest(); t.equal(req.method, 'PUT', 'makes PUT request'); t.match(req.url, '/monitor/npm', 'puts at correct url'); - t.ok(req.body.package.dependencies['debug'], 'dependency'); + t.ok(req.body.package.dependencies.debug, 'dependency'); t.ok(req.body.package.dependencies['object-assign'], 'includes dev dependency'); }); @@ -2208,7 +2260,7 @@ test('`monitor foo:latest --docker`', async (t) => { return{ plugin: { packageManager: 'rpm', - dockerImageId: dockerImageId, + dockerImageId, }, package: {}, }; @@ -2245,7 +2297,7 @@ test('`monitor foo:latest --docker --file=Dockerfile`', async (t) => { return { plugin: { packageManager: 'rpm', - dockerImageId: dockerImageId, + dockerImageId, }, package: {docker: 'base-image-name'}, }; @@ -2333,8 +2385,8 @@ test('`monitor foo:latest --docker` with custom policy path', async (t) => { t.teardown(loadPlugin.restore); await cli.monitor('foo:latest', { - docker: true, - org: 'explicit-org', + 'docker': true, + 'org': 'explicit-org', 'policy-path': 'custom-location', }); const req = server.popRequest(); @@ -2343,9 +2395,9 @@ test('`monitor foo:latest --docker` with custom policy path', async (t) => { 'puts at correct url (uses package manager from plugin response)'); t.same(spyPlugin.getCall(0).args, ['foo:latest', null, { - args: null, - docker: true, - org: 'explicit-org', + 'args': null, + 'docker': true, + 'org': 'explicit-org', 'policy-path': 'custom-location', }], 'calls docker plugin with expected arguments'); const expected = fs.readFileSync( @@ -2361,7 +2413,7 @@ test('`wizard` for unsupported package managers', async (t) => { try { await cli.wizard({file: data.file}); t.fail('should fail'); - } catch(e) { + } catch (e) { return e; } } @@ -2389,7 +2441,7 @@ test('`protect` for unsupported package managers', async (t) => { try { await cli.protect({file: data.file}); t.fail('should fail'); - } catch(e) { + } catch (e) { return e; } } @@ -2423,7 +2475,7 @@ test('`protect --policy-path`', async (t) => { try { await cli.protect(); t.fail('should fail'); - } catch(err) { + } catch (err) { const req = server.popRequest(); const policyString = req.body.policy; t.equal(policyString, expected, 'sends correct policy'); @@ -2475,7 +2527,7 @@ test('`test --insecure`', async (t) => { try { await cli.test('npm-package'); t.fail('should fail'); - } catch(e) { + } catch (e) { t.notOk(requestStub.firstCall.args[3].rejectUnauthorized, 'rejectUnauthorized not present (same as true)'); } @@ -2487,17 +2539,17 @@ test('`test --insecure`', async (t) => { // by `args`, so we simply set the global here. // NOTE: due to this we add tests to `args.test.js` (global as any).ignoreUnknownCA = true; - const requestStub = sinon.stub(needle, 'request').callsFake((a, b, c, d, cb) => { + const requestStub = sinon.stub(needle, 'request').callsFake((a, b, c, d, cb) => { cb(new Error('bail')); }); - t.teardown(() => { + t.teardown(() => { delete (global as any).ignoreUnknownCA; requestStub.restore(); }); - try { + try { await cli.test('npm-package'); t.fail('should fail'); - } catch(e) { + } catch (e) { t.false(requestStub.firstCall.args[3].rejectUnauthorized, 'rejectUnauthorized false'); } diff --git a/test/acceptance/workspaces/npm-out-of-sync/package-lock.json b/test/acceptance/workspaces/npm-out-of-sync/package-lock.json new file mode 100644 index 0000000000..a462e341b1 --- /dev/null +++ b/test/acceptance/workspaces/npm-out-of-sync/package-lock.json @@ -0,0 +1,19 @@ +{ + "name": "npm-package", + "version": "1.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=" + } + } +} diff --git a/test/acceptance/workspaces/npm-out-of-sync/package.json b/test/acceptance/workspaces/npm-out-of-sync/package.json new file mode 100644 index 0000000000..14f1eefb88 --- /dev/null +++ b/test/acceptance/workspaces/npm-out-of-sync/package.json @@ -0,0 +1,19 @@ +{ + "name": "npm-package", + "version": "1.0.0", + "description": "Simple NPM package", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "snyk", + "license": "ISC", + "dependencies": { + "to-array": "0.1.4", + "snyk": "*" + }, + "devDependencies": { + "object-assign": "4.1.1", + "rewire": "^4.0.1" + } +} diff --git a/test/acceptance/workspaces/npm-package-policy/node_modules/marked/.snyk-npm-marked-20170112.flag b/test/acceptance/workspaces/npm-package-policy/node_modules/marked/.snyk-npm-marked-20170112.flag index f32edfc466..71fa30042b 100644 --- a/test/acceptance/workspaces/npm-package-policy/node_modules/marked/.snyk-npm-marked-20170112.flag +++ b/test/acceptance/workspaces/npm-package-policy/node_modules/marked/.snyk-npm-marked-20170112.flag @@ -1 +1 @@ -2018-10-08T10:35:50.683Z +2019-02-18T10:42:50.326Z \ No newline at end of file diff --git a/test/acceptance/workspaces/yarn-out-of-sync/package.json b/test/acceptance/workspaces/yarn-out-of-sync/package.json new file mode 100644 index 0000000000..14f1eefb88 --- /dev/null +++ b/test/acceptance/workspaces/yarn-out-of-sync/package.json @@ -0,0 +1,19 @@ +{ + "name": "npm-package", + "version": "1.0.0", + "description": "Simple NPM package", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "snyk", + "license": "ISC", + "dependencies": { + "to-array": "0.1.4", + "snyk": "*" + }, + "devDependencies": { + "object-assign": "4.1.1", + "rewire": "^4.0.1" + } +} diff --git a/test/acceptance/workspaces/yarn-out-of-sync/yarn.lock b/test/acceptance/workspaces/yarn-out-of-sync/yarn.lock new file mode 100644 index 0000000000..0722eae3dd --- /dev/null +++ b/test/acceptance/workspaces/yarn-out-of-sync/yarn.lock @@ -0,0 +1,813 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +acorn-jsx@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-3.0.1.tgz#afdf9488fb1ecefc8348f6fb22f464e32a58b36b" + dependencies: + acorn "^3.0.4" + +acorn@^3.0.4: + version "3.3.0" + resolved "http://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" + +acorn@^5.5.0: + version "5.7.3" + resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.7.3.tgz#67aa231bf8812974b85235a96771eb6bd07ea279" + +ajv-keywords@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-2.1.1.tgz#617997fc5f60576894c435f940d819e135b80762" + +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: + co "^4.6.0" + fast-deep-equal "^1.0.0" + fast-json-stable-stringify "^2.0.0" + json-schema-traverse "^0.3.0" + +ansi-escapes@^3.0.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.1.0.tgz#f73207bb81207d75fd6c83f125af26eea378ca30" + +ansi-regex@^2.0.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" + +ansi-regex@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" + +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.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" + dependencies: + color-convert "^1.9.0" + +argparse@^1.0.7: + version "1.0.10" + resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" + dependencies: + sprintf-js "~1.0.2" + +array-union@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" + dependencies: + array-uniq "^1.0.1" + +array-uniq@^1.0.1: + version "1.0.3" + resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" + +arrify@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" + +babel-code-frame@^6.22.0: + version "6.26.0" + resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.26.0.tgz#63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b" + dependencies: + chalk "^1.1.3" + esutils "^2.0.2" + js-tokens "^3.0.2" + +balanced-match@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" + +brace-expansion@^1.1.7: + version "1.1.11" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" + dependencies: + balanced-match "^1.0.0" + concat-map "0.0.1" + +buffer-from@^1.0.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef" + +caller-path@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" + dependencies: + callsites "^0.2.0" + +callsites@^0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/callsites/-/callsites-0.2.0.tgz#afab96262910a7f33c19a5775825c69f34e350ca" + +chalk@^1.1.3: + version "1.1.3" + resolved "http://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" + dependencies: + ansi-styles "^2.2.1" + escape-string-regexp "^1.0.2" + has-ansi "^2.0.0" + strip-ansi "^3.0.0" + supports-color "^2.0.0" + +chalk@^2.0.0, chalk@^2.1.0: + version "2.4.1" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.1.tgz#18c49ab16a037b6eb0152cc83e3471338215b66e" + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + +chardet@^0.4.0: + version "0.4.2" + resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.4.2.tgz#b5473b33dc97c424e5d98dc87d55d4d8a29c8bf2" + +circular-json@^0.3.1: + version "0.3.3" + resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" + +cli-cursor@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" + dependencies: + restore-cursor "^2.0.0" + +cli-width@^2.0.0: + version "2.2.0" + resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" + +co@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" + +color-convert@^1.9.0: + version "1.9.3" + resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" + dependencies: + color-name "1.1.3" + +color-name@1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" + +concat-map@0.0.1: + version "0.0.1" + resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" + +concat-stream@^1.6.0: + version "1.6.2" + resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz#904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34" + dependencies: + buffer-from "^1.0.0" + inherits "^2.0.3" + readable-stream "^2.2.2" + typedarray "^0.0.6" + +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.1.0: + 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" + +debug@^3.1.0: + version "3.2.5" + resolved "https://registry.yarnpkg.com/debug/-/debug-3.2.5.tgz#c2418fbfd7a29f4d4f70ff4cea604d4b64c46407" + dependencies: + ms "^2.1.1" + +deep-is@~0.1.3: + version "0.1.3" + resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" + +del@^2.0.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" + dependencies: + globby "^5.0.0" + is-path-cwd "^1.0.0" + is-path-in-cwd "^1.0.0" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + rimraf "^2.2.8" + +doctrine@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" + dependencies: + esutils "^2.0.2" + +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" + +eslint-scope@^3.7.1: + version "3.7.3" + resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-3.7.3.tgz#bb507200d3d17f60247636160b4826284b108535" + dependencies: + esrecurse "^4.1.0" + estraverse "^4.1.1" + +eslint-visitor-keys@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" + +eslint@^4.19.1: + version "4.19.1" + resolved "http://registry.npmjs.org/eslint/-/eslint-4.19.1.tgz#32d1d653e1d90408854bfb296f076ec7e186a300" + dependencies: + ajv "^5.3.0" + babel-code-frame "^6.22.0" + chalk "^2.1.0" + concat-stream "^1.6.0" + cross-spawn "^5.1.0" + debug "^3.1.0" + doctrine "^2.1.0" + eslint-scope "^3.7.1" + eslint-visitor-keys "^1.0.0" + espree "^3.5.4" + esquery "^1.0.0" + esutils "^2.0.2" + file-entry-cache "^2.0.0" + functional-red-black-tree "^1.0.1" + glob "^7.1.2" + globals "^11.0.1" + ignore "^3.3.3" + imurmurhash "^0.1.4" + inquirer "^3.0.6" + is-resolvable "^1.0.0" + js-yaml "^3.9.1" + json-stable-stringify-without-jsonify "^1.0.1" + levn "^0.3.0" + lodash "^4.17.4" + minimatch "^3.0.2" + mkdirp "^0.5.1" + natural-compare "^1.4.0" + optionator "^0.8.2" + path-is-inside "^1.0.2" + pluralize "^7.0.0" + progress "^2.0.0" + regexpp "^1.0.1" + require-uncached "^1.0.3" + semver "^5.3.0" + strip-ansi "^4.0.0" + strip-json-comments "~2.0.1" + table "4.0.2" + text-table "~0.2.0" + +espree@^3.5.4: + version "3.5.4" + resolved "https://registry.yarnpkg.com/espree/-/espree-3.5.4.tgz#b0f447187c8a8bed944b815a660bddf5deb5d1a7" + dependencies: + acorn "^5.5.0" + acorn-jsx "^3.0.0" + +esprima@^4.0.0: + version "4.0.1" + resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" + +esquery@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" + dependencies: + estraverse "^4.0.0" + +esrecurse@^4.1.0: + version "4.2.1" + resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" + dependencies: + estraverse "^4.1.0" + +estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: + version "4.2.0" + resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" + +esutils@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" + +external-editor@^2.0.4: + version "2.2.0" + resolved "http://registry.npmjs.org/external-editor/-/external-editor-2.2.0.tgz#045511cfd8d133f3846673d1047c154e214ad3d5" + dependencies: + chardet "^0.4.0" + iconv-lite "^0.4.17" + tmp "^0.0.33" + +fast-deep-equal@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz#c053477817c86b51daa853c81e059b733d023614" + +fast-json-stable-stringify@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" + +fast-levenshtein@~2.0.4: + version "2.0.6" + resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" + +figures@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" + dependencies: + escape-string-regexp "^1.0.5" + +file-entry-cache@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" + dependencies: + flat-cache "^1.2.1" + object-assign "^4.0.1" + +flat-cache@^1.2.1: + version "1.3.0" + resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" + dependencies: + circular-json "^0.3.1" + del "^2.0.2" + graceful-fs "^4.1.2" + write "^0.2.1" + +fs.realpath@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" + +functional-red-black-tree@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" + +glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + +globals@^11.0.1: + version "11.7.0" + resolved "https://registry.yarnpkg.com/globals/-/globals-11.7.0.tgz#a583faa43055b1aca771914bf68258e2fc125673" + +globby@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" + dependencies: + array-union "^1.0.1" + arrify "^1.0.0" + glob "^7.0.3" + object-assign "^4.0.1" + pify "^2.0.0" + pinkie-promise "^2.0.0" + +graceful-fs@^4.1.2: + version "4.1.11" + resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" + +has-ansi@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" + dependencies: + ansi-regex "^2.0.0" + +has-flag@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" + +iconv-lite@^0.4.17: + version "0.4.24" + resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" + dependencies: + safer-buffer ">= 2.1.2 < 3" + +ignore@^3.3.3: + version "3.3.10" + resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz#0a97fb876986e8081c631160f8f9f389157f0043" + +imurmurhash@^0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" + +inflight@^1.0.4: + version "1.0.6" + resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" + dependencies: + once "^1.3.0" + wrappy "1" + +inherits@2, inherits@^2.0.3, inherits@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" + +inquirer@^3.0.6: + version "3.3.0" + resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-3.3.0.tgz#9dd2f2ad765dcab1ff0443b491442a20ba227dc9" + dependencies: + ansi-escapes "^3.0.0" + chalk "^2.0.0" + cli-cursor "^2.1.0" + cli-width "^2.0.0" + external-editor "^2.0.4" + figures "^2.0.0" + lodash "^4.3.0" + mute-stream "0.0.7" + run-async "^2.2.0" + rx-lite "^4.0.8" + rx-lite-aggregates "^4.0.8" + string-width "^2.1.0" + strip-ansi "^4.0.0" + through "^2.3.6" + +is-fullwidth-code-point@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" + +is-path-cwd@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" + +is-path-in-cwd@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" + dependencies: + is-path-inside "^1.0.0" + +is-path-inside@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" + dependencies: + path-is-inside "^1.0.1" + +is-promise@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" + +is-resolvable@^1.0.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz#fb18f87ce1feb925169c9a407c19318a3206ed88" + +isarray@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" + +isexe@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" + +js-tokens@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.2.tgz#9866df395102130e38f7f996bceb65443209c25b" + +js-yaml@^3.9.1: + version "3.12.0" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + +json-schema-traverse@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz#349a6d44c53a51de89b40805c5d5e59b417d3340" + +json-stable-stringify-without-jsonify@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" + +levn@^0.3.0, levn@~0.3.0: + version "0.3.0" + resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" + dependencies: + prelude-ls "~1.1.2" + type-check "~0.3.2" + +lodash@^4.17.4, lodash@^4.3.0: + version "4.17.11" + resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" + +lru-cache@^4.0.1: + version "4.1.3" + resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.3.tgz#a1175cf3496dfc8436c156c334b4955992bce69c" + dependencies: + pseudomap "^1.0.2" + yallist "^2.1.2" + +mimic-fn@^1.0.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" + +minimatch@^3.0.2, minimatch@^3.0.4: + version "3.0.4" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" + dependencies: + brace-expansion "^1.1.7" + +minimist@0.0.8: + version "0.0.8" + resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" + +mkdirp@^0.5.1: + version "0.5.1" + resolved "http://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" + dependencies: + minimist "0.0.8" + +ms@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" + +mute-stream@0.0.7: + version "0.0.7" + resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" + +natural-compare@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" + +object-assign@4.1.1, object-assign@^4.0.1: + version "4.1.1" + resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" + +once@^1.3.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" + dependencies: + wrappy "1" + +onetime@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" + dependencies: + mimic-fn "^1.0.0" + +optionator@^0.8.2: + version "0.8.2" + resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" + dependencies: + deep-is "~0.1.3" + fast-levenshtein "~2.0.4" + levn "~0.3.0" + prelude-ls "~1.1.2" + type-check "~0.3.2" + wordwrap "~1.0.0" + +os-tmpdir@~1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" + +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" + +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" + +pify@^2.0.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" + +pinkie-promise@^2.0.0: + version "2.0.1" + resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" + dependencies: + pinkie "^2.0.0" + +pinkie@^2.0.0: + version "2.0.4" + resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" + +pluralize@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/pluralize/-/pluralize-7.0.0.tgz#298b89df8b93b0221dbf421ad2b1b1ea23fc6777" + +prelude-ls@~1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" + +process-nextick-args@~2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.0.tgz#a37d732f4271b4ab1ad070d35508e8290788ffaa" + +progress@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" + +pseudomap@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" + +readable-stream@^2.2.2: + version "2.3.6" + resolved "http://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" + dependencies: + core-util-is "~1.0.0" + inherits "~2.0.3" + isarray "~1.0.0" + process-nextick-args "~2.0.0" + safe-buffer "~5.1.1" + string_decoder "~1.1.1" + util-deprecate "~1.0.1" + +regexpp@^1.0.1: + version "1.1.0" + resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.1.0.tgz#0e3516dd0b7904f413d2d4193dce4618c3a689ab" + +require-uncached@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/require-uncached/-/require-uncached-1.0.3.tgz#4e0d56d6c9662fd31e43011c4b95aa49955421d3" + dependencies: + caller-path "^0.1.0" + resolve-from "^1.0.0" + +resolve-from@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-1.0.1.tgz#26cbfe935d1aeeeabb29bc3fe5aeb01e93d44226" + +restore-cursor@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" + dependencies: + onetime "^2.0.0" + signal-exit "^3.0.2" + +rewire@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/rewire/-/rewire-4.0.1.tgz#ba1100d400a9da759fe599fc6e0233f0879ed6da" + dependencies: + eslint "^4.19.1" + +rimraf@^2.2.8: + version "2.6.2" + resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" + 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" + dependencies: + is-promise "^2.1.0" + +rx-lite-aggregates@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite-aggregates/-/rx-lite-aggregates-4.0.8.tgz#753b87a89a11c95467c4ac1626c4efc4e05c67be" + dependencies: + rx-lite "*" + +rx-lite@*, rx-lite@^4.0.8: + version "4.0.8" + resolved "https://registry.yarnpkg.com/rx-lite/-/rx-lite-4.0.8.tgz#0b1e11af8bc44836f04a6407e92da42467b79444" + +safe-buffer@~5.1.0, safe-buffer@~5.1.1: + version "5.1.2" + resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d" + +"safer-buffer@>= 2.1.2 < 3": + version "2.1.2" + resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" + +semver@^5.3.0: + version "5.5.1" + resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.1.tgz#7dfdd8814bdb7cabc7be0fb1d734cfb66c940477" + +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" + +signal-exit@^3.0.2: + version "3.0.2" + resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" + +slice-ansi@1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" + dependencies: + is-fullwidth-code-point "^2.0.0" + +sprintf-js@~1.0.2: + version "1.0.3" + resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" + +string-width@^2.1.0, string-width@^2.1.1: + version "2.1.1" + resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" + dependencies: + is-fullwidth-code-point "^2.0.0" + strip-ansi "^4.0.0" + +string_decoder@~1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz#9cf1611ba62685d7030ae9e4ba34149c3af03fc8" + dependencies: + safe-buffer "~5.1.0" + +strip-ansi@^3.0.0: + version "3.0.1" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" + dependencies: + ansi-regex "^2.0.0" + +strip-ansi@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" + dependencies: + ansi-regex "^3.0.0" + +strip-json-comments@~2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" + +supports-color@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" + +supports-color@^5.3.0: + version "5.5.0" + resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" + dependencies: + has-flag "^3.0.0" + +table@4.0.2: + version "4.0.2" + resolved "https://registry.yarnpkg.com/table/-/table-4.0.2.tgz#a33447375391e766ad34d3486e6e2aedc84d2e36" + dependencies: + ajv "^5.2.3" + ajv-keywords "^2.1.0" + chalk "^2.1.0" + lodash "^4.17.4" + slice-ansi "1.0.0" + string-width "^2.1.1" + +text-table@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" + +through@^2.3.6: + version "2.3.8" + resolved "http://registry.npmjs.org/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" + +tmp@^0.0.33: + version "0.0.33" + resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" + dependencies: + os-tmpdir "~1.0.2" + +to-array@0.1.4: + version "0.1.4" + resolved "https://registry.yarnpkg.com/to-array/-/to-array-0.1.4.tgz#17e6c11f73dd4f3d74cda7a4ff3238e9ad9bf890" + +type-check@~0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" + dependencies: + prelude-ls "~1.1.2" + +typedarray@^0.0.6: + version "0.0.6" + resolved "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz#867ac74e3864187b1d3d47d996a78ec5c8830777" + +util-deprecate@~1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" + +which@^1.2.9: + version "1.3.1" + resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" + dependencies: + isexe "^2.0.0" + +wordwrap@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" + +wrappy@1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" + +write@^0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" + dependencies: + mkdirp "^0.5.1" + +yallist@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52"