├── .github ├── CODEOWNERS ├── settings.yml └── workflows │ └── ci.yml ├── bin ├── .gitignore ├── LICENSE.md ├── package.json ├── cli.js ├── README.md └── package-lock.json ├── .gitignore ├── .travis.yml ├── test ├── lib │ ├── package-json-with-bom.json │ ├── childProcessFactory.js │ ├── test-dir.js │ └── fixtureHelper.js └── specs │ ├── lib │ ├── extract.js │ └── config.js │ └── index.js ├── lib ├── silentlog.js ├── worker.js ├── extract.js └── config │ └── npm-config.js ├── LICENSE.md ├── README.md ├── package.json ├── index.js └── CHANGELOG.md /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @npm/cli-team 2 | -------------------------------------------------------------------------------- /bin/.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /.nyc_output 3 | /test/cache 4 | -------------------------------------------------------------------------------- /.github/settings.yml: -------------------------------------------------------------------------------- 1 | --- 2 | _extends: 'open-source-project-boilerplate' 3 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /node_modules 2 | /bin/node_modules 3 | /.nyc_output 4 | /test/cache 5 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | 3 | node_js: 4 | - node 5 | - 12 6 | - 10 7 | - 8 8 | - 6 9 | 10 | cache: 11 | directories: 12 | - $HOME/.npm 13 | 14 | notifications: 15 | email: false 16 | -------------------------------------------------------------------------------- /test/lib/package-json-with-bom.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "strong-spawn-npm", 3 | "version": "1.0.0", 4 | "description": "Reliably spawn npm™ on any platform", 5 | "homepage": "https://github.com/strongloop/strong-spawn-npm" 6 | } 7 | -------------------------------------------------------------------------------- /lib/silentlog.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const noop = Function.prototype 4 | module.exports = { 5 | error: noop, 6 | warn: noop, 7 | info: noop, 8 | verbose: noop, 9 | silly: noop, 10 | http: noop, 11 | pause: noop, 12 | resume: noop 13 | } 14 | -------------------------------------------------------------------------------- /test/lib/childProcessFactory.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const EventEmitter = require('events').EventEmitter 4 | 5 | module.exports = () => { 6 | const child = new EventEmitter() 7 | child.stdout = new EventEmitter() 8 | child.stderr = new EventEmitter() 9 | 10 | return child 11 | } 12 | -------------------------------------------------------------------------------- /lib/worker.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const BB = require('bluebird') 4 | 5 | // const log = require('npmlog') 6 | const pacote = require('pacote') 7 | 8 | module.exports = (args, cb) => { 9 | const parsed = typeof args === 'string' ? JSON.parse(args) : args 10 | const spec = parsed[0] 11 | const extractTo = parsed[1] 12 | const opts = parsed[2] 13 | // opts.log = log 14 | // log.level = opts.loglevel 15 | return BB.resolve(pacote.extract(spec, extractTo, opts)).nodeify(cb) 16 | } 17 | -------------------------------------------------------------------------------- /LICENSE.md: -------------------------------------------------------------------------------- 1 | ISC License 2 | 3 | Copyright (c) npm, Inc. 4 | 5 | Permission to use, copy, modify, and/or distribute this software for 6 | any purpose with or without fee is hereby granted, provided that the 7 | above copyright notice and this permission notice appear in all copies. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS" AND THE COPYRIGHT HOLDER DISCLAIMS 10 | ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 11 | WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 12 | COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR 13 | CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS 14 | OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 15 | OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE 16 | USE OR PERFORMANCE OF THIS SOFTWARE. 17 | -------------------------------------------------------------------------------- /bin/LICENSE.md: -------------------------------------------------------------------------------- 1 | ISC License 2 | 3 | Copyright (c) npm, Inc. 4 | 5 | Permission to use, copy, modify, and/or distribute this software for 6 | any purpose with or without fee is hereby granted, provided that the 7 | above copyright notice and this permission notice appear in all copies. 8 | 9 | THE SOFTWARE IS PROVIDED "AS IS" AND THE COPYRIGHT HOLDER DISCLAIMS 10 | ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED 11 | WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE 12 | COPYRIGHT HOLDER BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR 13 | CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS 14 | OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE 15 | OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE 16 | USE OR PERFORMANCE OF THIS SOFTWARE. 17 | -------------------------------------------------------------------------------- /bin/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cipm", 3 | "repository": "https://github.com/npm/libcipm", 4 | "version": "2.0.1", 5 | "description": "a standalone ci-oriented package installer for npm projects", 6 | "bin": "./cli.js", 7 | "main": "./cli.js", 8 | "files": [ 9 | "*.js" 10 | ], 11 | "scripts": { 12 | "docs": "tail -n +2 README.md | marked-man --manual 'User Commands' --version \"$npm_package_name@$npm_package_version\" > $npm_package_name.1" 13 | }, 14 | "keywords": [ 15 | "npm", 16 | "package manager", 17 | "caching", 18 | "downloader", 19 | "npm ci" 20 | ], 21 | "author": { 22 | "name": "Kat Marchán", 23 | "email": "kzm@sykosomatic.org", 24 | "twitter": "maybekatz" 25 | }, 26 | "license": "ISC", 27 | "dependencies": { 28 | "libcipm": "^2.0.0", 29 | "npmlog": "^4.1.2", 30 | "yargs": "^11.0.0" 31 | }, 32 | "bundleDependencies": [ 33 | "npmlog", 34 | "yargs", 35 | "libcipm" 36 | ] 37 | } 38 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Note: pending imminent deprecation 2 | 3 | **This module will be deprecated once npm v7 is released. Please do not rely 4 | on it more than absolutely necessary.** 5 | 6 | ---- 7 | 8 | [`libcipm`](https://github.com/npm/libcipm) installs npm projects in a way that's 9 | optimized for continuous integration/deployment/etc scenarios. It gives up 10 | the ability to build its own trees or install packages individually, as well 11 | as other user-oriented features, in exchange for speed, and being more strict 12 | about project state. 13 | 14 | For documentation about the associated command-line tool, see 15 | [`cipm`](https://npm.im/cipm). 16 | 17 | ## Install 18 | 19 | `$ npm install libcipm` 20 | 21 | ## Table of Contents 22 | 23 | * [Features](#features) 24 | * [API](#api) 25 | 26 | ### Features 27 | 28 | * npm-compatible project installation 29 | * lifecycle script support 30 | * blazing fast 31 | * npm-compatible caching 32 | * errors if `package.json` and `package-lock.json` are out of sync, instead of fixing it like npm does. Essentially provides a `--frozen` install. 33 | -------------------------------------------------------------------------------- /test/lib/test-dir.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const mkdirp = require('mkdirp') 4 | const path = require('path') 5 | const rimraf = require('rimraf') 6 | const tap = require('tap') 7 | 8 | const cacheDir = path.resolve(__dirname, '../cache') 9 | 10 | module.exports = testDir 11 | function testDir (filename) { 12 | const base = path.basename(filename, '.js') 13 | const dir = path.join(cacheDir, base) 14 | tap.beforeEach(cb => { 15 | reset(dir, err => { 16 | if (err) { throw err } 17 | cb() 18 | }) 19 | }) 20 | if (!process.env.KEEPCACHE) { 21 | tap.tearDown(() => { 22 | process.chdir(__dirname) 23 | // This is ok cause this is the last 24 | // thing to run in the process 25 | rimraf(dir, () => {}) 26 | }) 27 | } 28 | return dir 29 | } 30 | 31 | module.exports.reset = reset 32 | function reset (testDir, cb) { 33 | process.chdir(__dirname) 34 | rimraf(testDir, function (err) { 35 | if (err) { return cb(err) } 36 | mkdirp(testDir, function (err) { 37 | if (err) { return cb(err) } 38 | process.chdir(testDir) 39 | cb() 40 | }) 41 | }) 42 | } 43 | -------------------------------------------------------------------------------- /test/specs/lib/extract.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const test = require('tap').test 4 | const requireInject = require('require-inject') 5 | 6 | const extract = requireInject('../../../lib/extract.js', { 7 | '../../../lib/worker.js': (msg, cb) => { cb(null, msg) }, 8 | 'npm-package-arg': { 9 | resolve: () => ({ registry: false, type: 'not-remote' }) 10 | } 11 | }) 12 | 13 | test('extract.child() ensures dirPacker is defined', t => { 14 | const name = 'name' 15 | const child = { version: '0.0.0', integrity: 'integrity', resolved: 'resolved' } 16 | const childPath = './path' 17 | 18 | const opts = { log: { level: 'level' }, dirPacker: {} } 19 | const a = extract.child(name, child, childPath, opts) 20 | 21 | a.then(b => { 22 | t.ok('dirPacker' in b[2], 'dirPacker is defined') 23 | t.end() 24 | }) 25 | }) 26 | 27 | test('extract.child() only overwrites dirPacker when opts.dirPacker is defined', t => { 28 | const name = 'name' 29 | const child = { version: '0.0.0', integrity: 'integrity', resolved: 'resolved' } 30 | const childPath = './path' 31 | const config = { 32 | toPacote (moreOpts) { 33 | return moreOpts 34 | } 35 | } 36 | 37 | const opts = { log: { level: 'level' } } 38 | const a = extract.child(name, child, childPath, config, opts) 39 | 40 | a.then(b => { 41 | t.ok(!('dirPacker' in b[2]), 'An undefined dirPacker overrode the pacote childOpts') 42 | t.end() 43 | }) 44 | }) 45 | -------------------------------------------------------------------------------- /bin/cli.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | 'use strict' 4 | 5 | const yargs = require('yargs') 6 | const Installer = require('libcipm') 7 | const fromNpm = require('libcipm/lib/config/npm-config.js').fromNpm 8 | 9 | module.exports = cliMain 10 | 11 | if (require.main === module) { 12 | cliMain() 13 | } 14 | 15 | function cliMain () { 16 | parseArgs() 17 | const log = require('npmlog') 18 | return fromNpm(process.argv) 19 | .then(c => { 20 | log.level = c.loglevel 21 | return new Installer(c.concat({log})) 22 | }) 23 | .then(cipm => cipm.run()) 24 | .then( 25 | details => console.error(`added ${details.pkgCount} packages in ${ 26 | details.runTime / 1000 27 | }s`), 28 | err => { 29 | console.error(`cipm failed:\n${err.message}\n${err.stack}`) 30 | process.exitCode = 1 31 | } 32 | ) 33 | } 34 | 35 | function parseArgs () { 36 | return yargs 37 | .usage('Install dependencies from an existing package-lock.json') 38 | .option('loglevel', { 39 | type: 'string', 40 | describe: 'log level for npmlog', 41 | default: 'notice' 42 | }) 43 | .option('offline', { 44 | type: 'boolean', 45 | describe: 'force cipm to run offline, or error' 46 | }) 47 | .option('ignore-scripts', { 48 | type: 'boolean', 49 | describe: 'skip running lifecycle scripts' 50 | }) 51 | .option('prefix', { 52 | type: 'string', 53 | describe: 'path to package.json' 54 | }) 55 | .option('userconfig', { 56 | type: 'string', 57 | describe: 'path to npmrc' 58 | }) 59 | .help() 60 | .alias('h', 'help') 61 | .argv 62 | } 63 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "libcipm", 3 | "version": "4.0.8", 4 | "description": "programmatic API for cipm: a ci-oriented package installer for npm", 5 | "main": "index.js", 6 | "files": [ 7 | "*.js", 8 | "lib" 9 | ], 10 | "scripts": { 11 | "prerelease": "npm t", 12 | "postrelease": "npm publish && git push --follow-tags", 13 | "pretest": "standard", 14 | "release": "standard-version -s", 15 | "test": "tap -J --nyc-arg=--all --coverage test/specs" 16 | }, 17 | "repository": "https://github.com/npm/libcipm", 18 | "keywords": [ 19 | "npm", 20 | "package manager", 21 | "caching", 22 | "downloader" 23 | ], 24 | "author": { 25 | "name": "Kat Marchán", 26 | "email": "kzm@sykosomatic.org", 27 | "twitter": "maybekatz" 28 | }, 29 | "license": "ISC", 30 | "dependencies": { 31 | "bin-links": "^1.1.2", 32 | "bluebird": "^3.5.1", 33 | "figgy-pudding": "^3.5.1", 34 | "find-npm-prefix": "^1.0.2", 35 | "graceful-fs": "^4.1.11", 36 | "ini": "^1.3.5", 37 | "lock-verify": "^2.1.0", 38 | "mkdirp": "^0.5.1", 39 | "npm-lifecycle": "^3.0.0", 40 | "npm-logical-tree": "^1.2.1", 41 | "npm-package-arg": "^6.1.0", 42 | "pacote": "^9.1.0", 43 | "read-package-json": "^2.0.13", 44 | "rimraf": "^2.6.2", 45 | "worker-farm": "^1.6.0" 46 | }, 47 | "devDependencies": { 48 | "npmlog": "^4.1.2", 49 | "nyc": "^11.8.0", 50 | "require-inject": "^1.4.3", 51 | "standard": "^11.0.1", 52 | "standard-version": "^4.4.0", 53 | "tacks": "^1.2.6", 54 | "tap": "^12.0.1" 55 | }, 56 | "config": { 57 | "nyc": { 58 | "exclude": [ 59 | "node_modules/**", 60 | "test/**" 61 | ] 62 | } 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /test/specs/lib/config.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const test = require('tap').test 4 | const requireInject = require('require-inject') 5 | const childProcessFactory = require('../../lib/childProcessFactory.js') 6 | 7 | let child 8 | const config = requireInject('../../../lib/config/npm-config.js', { 9 | child_process: { 10 | spawn: () => child 11 | } 12 | }).fromNpm 13 | 14 | function cleanup () { 15 | child = childProcessFactory() 16 | } 17 | 18 | test('config: errors if npm is not found', t => { 19 | cleanup() 20 | 21 | config().catch(err => { 22 | t.equal(err.message, '`npm` command not found. Please ensure you have npm@5.4.0 or later installed.') 23 | t.end() 24 | }) 25 | 26 | child.emit('close', 127) 27 | }) 28 | 29 | test('config: errors if npm config ls --json cant output json', t => { 30 | cleanup() 31 | 32 | config().catch(err => { 33 | t.equal(err.message, '`npm config ls --json` failed to output json. Please ensure you have npm@5.4.0 or later installed.') 34 | t.end() 35 | }) 36 | 37 | child.stdout.emit('data', 'this is definitely not json') 38 | child.emit('close', 0) 39 | }) 40 | 41 | test('config: errors if npm errors for any reason', t => { 42 | cleanup() 43 | // in error situations, stdout may not exist 44 | delete child.stdout 45 | 46 | const errorMessage = 'failed to reticulate splines' 47 | 48 | config().catch(err => { 49 | t.equal(err, errorMessage) 50 | t.end() 51 | }) 52 | 53 | child.emit('error', errorMessage) 54 | }) 55 | 56 | test('config: parses configs from npm', t => { 57 | cleanup() 58 | 59 | const c = config() 60 | child.stdout.emit('data', JSON.stringify({cache: 'foo'})) 61 | child.emit('close', 0) 62 | return c.then(config => { 63 | t.match(config.cache, /^foo[/\\]_cacache$/, 'configs match') 64 | }) 65 | }) 66 | 67 | test('config: cleanup', t => { 68 | cleanup() 69 | t.end() 70 | }) 71 | -------------------------------------------------------------------------------- /lib/extract.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const BB = require('bluebird') 4 | 5 | const extractionWorker = require('./worker.js') 6 | const figgyPudding = require('figgy-pudding') 7 | const npa = require('npm-package-arg') 8 | const WORKER_PATH = require.resolve('./worker.js') 9 | let workerFarm 10 | 11 | // Broken for now, cause too many issues on some systems. 12 | const ENABLE_WORKERS = false 13 | 14 | const ExtractOpts = figgyPudding({ 15 | log: {}, 16 | dirPacker: {} 17 | }) 18 | 19 | module.exports = { 20 | startWorkers () { 21 | if (ENABLE_WORKERS) { 22 | if (!workerFarm) { workerFarm = require('worker-farm') } 23 | this._workers = workerFarm({ 24 | maxConcurrentCallsPerWorker: 20, 25 | maxRetries: 1 26 | }, WORKER_PATH) 27 | } 28 | }, 29 | 30 | stopWorkers () { 31 | if (ENABLE_WORKERS) { 32 | if (!workerFarm) { workerFarm = require('worker-farm') } 33 | workerFarm.end(this._workers) 34 | } 35 | }, 36 | 37 | child (name, child, childPath, opts) { 38 | opts = ExtractOpts(opts) 39 | const spec = npa.resolve(name, child.version) 40 | let childOpts = opts.concat({ 41 | integrity: child.integrity, 42 | resolved: child.resolved 43 | }) 44 | const args = [spec, childPath, childOpts] 45 | return BB.fromNode((cb) => { 46 | let launcher = extractionWorker 47 | let msg = args 48 | const spec = typeof args[0] === 'string' ? npa(args[0]) : args[0] 49 | if (ENABLE_WORKERS && (spec.registry || spec.type === 'remote')) { 50 | if (!workerFarm) { workerFarm = require('worker-farm') } 51 | // We can't serialize these options 52 | childOpts = childOpts.concat({ 53 | log: null, 54 | dirPacker: null 55 | }) 56 | // workers will run things in parallel! 57 | launcher = this._workers 58 | try { 59 | msg = JSON.stringify(msg) 60 | } catch (e) { 61 | return cb(e) 62 | } 63 | } 64 | launcher(msg, cb) 65 | }) 66 | } 67 | } 68 | -------------------------------------------------------------------------------- /test/lib/fixtureHelper.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const BB = require('bluebird') 4 | const fs = require('fs') 5 | const mkdirp = require('mkdirp') 6 | const resolve = require('path').resolve 7 | const pathSep = require('path').sep 8 | const rimraf = require('rimraf') 9 | 10 | function getPath (dir) { 11 | return resolve(__dirname, '..', 'fixtures', dir.replace(/\//g, pathSep)) 12 | } 13 | 14 | function writeFile (path, name, contents) { 15 | if (typeof contents === 'object') { 16 | contents = JSON.stringify(contents, null, 2) 17 | } 18 | fs.writeFileSync(resolve(path, name), contents) 19 | } 20 | 21 | function writeFiles (path, fs) { 22 | Object.keys(fs).forEach(fileName => { 23 | const filePath = fileName.replace(/\//g, pathSep) 24 | writeFile(path, filePath, fs[fileName]) 25 | }) 26 | } 27 | 28 | function setup (dir) { 29 | const path = getPath(dir) 30 | rimraf.sync(path) 31 | mkdirp.sync(path) 32 | return path 33 | } 34 | 35 | module.exports = { 36 | write (dir, fs) { 37 | const path = setup(dir) 38 | writeFiles(path, fs) 39 | return path 40 | }, 41 | equals (dir, name, expected) { 42 | const path = getPath(dir) 43 | if (typeof expected === 'object') { 44 | expected = JSON.stringify(expected, null, 2) 45 | } 46 | 47 | return expected === fs.readFileSync(resolve(path, name)).toString() 48 | }, 49 | read (dir, name) { 50 | const path = getPath(dir) 51 | return fs.readFileSync(resolve(path, name)).toString() 52 | }, 53 | missing (dir, name) { 54 | const path = getPath(dir) 55 | try { 56 | return !fs.accessSync(resolve(path, name)) 57 | } catch (e) { 58 | return e.code === 'ENOENT' 59 | } 60 | }, 61 | teardown () { 62 | rimraf.sync(getPath('')) 63 | }, 64 | getWriter (dir, fs) { 65 | const path = getPath(dir) 66 | return (_, child, childPath) => { 67 | mkdirp.sync(childPath) 68 | const pathSuffix = childPath.replace(path, '').replace(/\\/g, '/') 69 | writeFiles(childPath, fs[pathSuffix]) 70 | return BB.resolve() 71 | } 72 | } 73 | } 74 | -------------------------------------------------------------------------------- /bin/README.md: -------------------------------------------------------------------------------- 1 | [![npm](https://img.shields.io/npm/v/cipm.svg)](https://npm.im/cipm) [![license](https://img.shields.io/npm/l/cipm.svg)](https://npm.im/cipm) [![Travis](https://img.shields.io/travis/zkat/cipm.svg)](https://travis-ci.org/zkat/cipm) [![AppVeyor](https://ci.appveyor.com/api/projects/status/github/zkat/cipm?svg=true)](https://ci.appveyor.com/project/zkat/cipm) [![Coverage Status](https://coveralls.io/repos/github/zkat/cipm/badge.svg?branch=latest)](https://coveralls.io/github/zkat/cipm?branch=latest) 2 | 3 | # cipm(1) -- install npm dependencies from a package lock 4 | 5 | ## SYNOPSIS 6 | 7 | `cipm [--userconfig ] [--ignore-scripts] [--offline] [--loglevel ]` 8 | 9 | ## INSTALL 10 | 11 | `npm install [-g|-D] cipm` 12 | 13 | ## DESCRIPTION 14 | 15 | When invoked inside an npm project with a `package.json` and `package-lock.json` (or an `npm-shrinkwrap.json`), it will install the specified dependencies and run their install scripts. 16 | 17 | The main difference between this and `npm install` is that `cipm` is both a small, standalone program, and that it can bypass a lot of the heavier machinery in npm oriented towards interacting with invalid states: `cipm` completely removes `node_modules` before beginning the install, if it exists. 18 | 19 | `cipm` also requires that the current project have an existing lockfile, which must first be generated using `npm install` in `npm@5` or later versions (or any other package manager supporting `lockfileVersion@>=1`). 20 | 21 | This tool is ideal for using in CI environments that require regular, full installs of an application, but that are usually able to cache package data in a central cache. 22 | 23 | ## EXAMPLES 24 | 25 | ## AUTHOR 26 | 27 | Written by [Kat Marchan](https://github.com/zkat). 28 | 29 | ## REPORTING BUGS 30 | 31 | Please file any relevant issues [on Github.](https://github.com/zkat/cipm) 32 | 33 | ## LICENSE 34 | 35 | This work is released under the conditions of the MIT license. See LICENSE.md for more details. 36 | 37 | ## SEE ALSO 38 | 39 | * `npm-install(1)` 40 | * `npm-package-locks(5)` 41 | * `package-lock.json(5)` 42 | -------------------------------------------------------------------------------- /lib/config/npm-config.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const BB = require('bluebird') 4 | 5 | const fs = require('fs') 6 | const figgyPudding = require('figgy-pudding') 7 | const ini = require('ini') 8 | const path = require('path') 9 | const spawn = require('child_process').spawn 10 | 11 | const readFileAsync = BB.promisify(fs.readFile) 12 | 13 | const NpmConfig = figgyPudding({ 14 | cache: { default: '' }, 15 | then: {}, 16 | userconfig: {} 17 | }) 18 | 19 | module.exports = NpmConfig 20 | 21 | module.exports.fromNpm = getNpmConfig 22 | function getNpmConfig (argv) { 23 | return new BB((resolve, reject) => { 24 | const npmBin = process.platform === 'win32' ? 'npm.cmd' : 'npm' 25 | const child = spawn(npmBin, [ 26 | 'config', 'ls', '--json', '-l' 27 | // We add argv here to get npm to parse those options for us :D 28 | ].concat(argv || []), { 29 | env: process.env, 30 | cwd: process.cwd(), 31 | stdio: [0, 'pipe', 2] 32 | }) 33 | 34 | let stdout = '' 35 | if (child.stdout) { 36 | child.stdout.on('data', (chunk) => { 37 | stdout += chunk 38 | }) 39 | } 40 | 41 | child.on('error', reject) 42 | child.on('close', (code) => { 43 | if (code === 127) { 44 | reject(new Error('`npm` command not found. Please ensure you have npm@5.4.0 or later installed.')) 45 | } else { 46 | try { 47 | resolve(JSON.parse(stdout)) 48 | } catch (e) { 49 | reject(new Error('`npm config ls --json` failed to output json. Please ensure you have npm@5.4.0 or later installed.')) 50 | } 51 | } 52 | }) 53 | }).then(opts => { 54 | return BB.all( 55 | process.cwd().split(path.sep).reduce((acc, next) => { 56 | acc.path = path.join(acc.path, next) 57 | acc.promises.push(maybeReadIni(path.join(acc.path, '.npmrc'))) 58 | acc.promises.push(maybeReadIni(path.join(acc.path, 'npmrc'))) 59 | return acc 60 | }, { 61 | path: '', 62 | promises: [] 63 | }).promises.concat( 64 | opts.userconfig ? maybeReadIni(opts.userconfig) : {} 65 | ) 66 | ).then(configs => NpmConfig(...configs, opts)) 67 | }).then(opts => { 68 | if (opts.cache) { 69 | return opts.concat({ cache: path.join(opts.cache, '_cacache') }) 70 | } else { 71 | return opts 72 | } 73 | }) 74 | } 75 | 76 | function maybeReadIni (f) { 77 | return readFileAsync(f, 'utf8').catch(err => { 78 | if (err.code === 'ENOENT') { 79 | return '' 80 | } else { 81 | throw err 82 | } 83 | }).then(ini.parse) 84 | } 85 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | --- 2 | ################################################################################ 3 | # Template - Node CI 4 | # 5 | # Description: 6 | # This contains the basic information to: install dependencies, run tests, 7 | # get coverage, and run linting on a nodejs project. This template will run 8 | # over the MxN matrix of all operating systems, and all current LTS versions 9 | # of NodeJS. 10 | # 11 | # Dependencies: 12 | # This template assumes that your project is using the `tap` module for 13 | # testing. If you're not using this module, then the step that runs your 14 | # coverage will need to be adjusted. 15 | # 16 | ################################################################################ 17 | name: Node CI 18 | 19 | on: [push, pull_request] 20 | 21 | jobs: 22 | build: 23 | strategy: 24 | fail-fast: false 25 | matrix: 26 | node-version: [10.x, 12.x, 13.x] 27 | os: [ubuntu-latest, windows-latest, macOS-latest] 28 | 29 | runs-on: ${{ matrix.os }} 30 | 31 | steps: 32 | # Checkout the repository 33 | - uses: actions/checkout@v2 34 | # Installs the specific version of Node.js 35 | - name: Use Node.js ${{ matrix.node-version }} 36 | uses: actions/setup-node@v1 37 | with: 38 | node-version: ${{ matrix.node-version }} 39 | 40 | ################################################################################ 41 | # Install Dependencies 42 | # 43 | # ASSUMPTIONS: 44 | # - The project has a package-lock.json file 45 | # 46 | # Simply run the tests for the project. 47 | ################################################################################ 48 | - name: Install dependencies 49 | run: npm ci 50 | 51 | ################################################################################ 52 | # Run Testing 53 | # 54 | # ASSUMPTIONS: 55 | # - The project has `tap` as a devDependency 56 | # - There is a script called "test" in the package.json 57 | # 58 | # Simply run the tests for the project. 59 | ################################################################################ 60 | - name: Run tests 61 | run: npm test 62 | 63 | ################################################################################ 64 | # Run coverage check 65 | # 66 | # ASSUMPTIONS: 67 | # - The project has `tap` as a devDependency 68 | # - There is a script called "coverage" in the package.json 69 | # 70 | # Coverage should only be posted once, we are choosing the latest LTS of 71 | # node, and ubuntu as the matrix point to post coverage from. We limit 72 | # to the 'push' event so that coverage ins't posted twice from the 73 | # pull-request event, and push event (line 3). 74 | ################################################################################ 75 | - name: Run coverage report 76 | if: github.event_name == 'push' && matrix.node-version == '12.x' && matrix.os == 'ubuntu-latest' 77 | run: npm run coverage 78 | env: 79 | # The environment variable name is leveraged by `tap` 80 | COVERALLS_REPO_TOKEN: ${{ secrets.COVERALLS_REPO_TOKEN }} 81 | 82 | ################################################################################ 83 | # Run linting 84 | # 85 | # ASSUMPTIONS: 86 | # - There is a script called "lint" in the package.json 87 | # 88 | # We run linting AFTER we run testing and coverage checks, because if a step 89 | # fails in an GitHub Action, all other steps are not run. We don't want to 90 | # fail to run tests or coverage because of linting. It should be the lowest 91 | # priority of all the steps. 92 | ################################################################################ 93 | - name: Run linter 94 | run: npm run lint 95 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const BB = require('bluebird') 4 | 5 | const binLink = require('bin-links') 6 | const buildLogicalTree = require('npm-logical-tree') 7 | const extract = require('./lib/extract.js') 8 | const figgyPudding = require('figgy-pudding') 9 | const fs = require('graceful-fs') 10 | const getPrefix = require('find-npm-prefix') 11 | const lifecycle = require('npm-lifecycle') 12 | const lockVerify = require('lock-verify') 13 | const mkdirp = BB.promisify(require('mkdirp')) 14 | const npa = require('npm-package-arg') 15 | const path = require('path') 16 | const readPkgJson = BB.promisify(require('read-package-json')) 17 | const rimraf = BB.promisify(require('rimraf')) 18 | 19 | const readFileAsync = BB.promisify(fs.readFile) 20 | const statAsync = BB.promisify(fs.stat) 21 | const symlinkAsync = BB.promisify(fs.symlink) 22 | const writeFileAsync = BB.promisify(fs.writeFile) 23 | 24 | const LifecycleOpts = figgyPudding({ 25 | config: {}, 26 | 'script-shell': {}, 27 | scriptShell: 'script-shell', 28 | 'ignore-scripts': {}, 29 | ignoreScripts: 'ignore-scripts', 30 | 'ignore-prepublish': {}, 31 | ignorePrepublish: 'ignore-prepublish', 32 | 'scripts-prepend-node-path': {}, 33 | scriptsPrependNodePath: 'scripts-prepend-node-path', 34 | 'unsafe-perm': {}, 35 | unsafePerm: 'unsafe-perm', 36 | prefix: {}, 37 | dir: 'prefix', 38 | failOk: { default: false } 39 | }, { other () { return true } }) 40 | 41 | class Installer { 42 | constructor (opts) { 43 | this.opts = opts 44 | 45 | // Stats 46 | this.startTime = Date.now() 47 | this.runTime = 0 48 | this.timings = { scripts: 0 } 49 | this.pkgCount = 0 50 | 51 | // Misc 52 | this.log = this.opts.log || require('./lib/silentlog.js') 53 | this.pkg = null 54 | this.tree = null 55 | this.failedDeps = new Set() 56 | } 57 | 58 | timedStage (name) { 59 | const start = Date.now() 60 | return BB.resolve(this[name].apply(this, [].slice.call(arguments, 1))) 61 | .tap(() => { 62 | this.timings[name] = Date.now() - start 63 | this.log.info(name, `Done in ${this.timings[name] / 1000}s`) 64 | }) 65 | } 66 | 67 | run () { 68 | return this.timedStage('prepare') 69 | .then(() => this.timedStage('extractTree', this.tree)) 70 | .then(() => this.timedStage('updateJson', this.tree)) 71 | .then(pkgJsons => this.timedStage('buildTree', this.tree, pkgJsons)) 72 | .then(() => this.timedStage('garbageCollect', this.tree)) 73 | .then(() => this.timedStage('runScript', 'prepublish', this.pkg, this.prefix)) 74 | .then(() => this.timedStage('runScript', 'prepare', this.pkg, this.prefix)) 75 | .then(() => this.timedStage('teardown')) 76 | .then(() => { 77 | this.runTime = Date.now() - this.startTime 78 | this.log.info( 79 | 'run-scripts', 80 | `total script time: ${this.timings.scripts / 1000}s` 81 | ) 82 | this.log.info( 83 | 'run-time', 84 | `total run time: ${this.runTime / 1000}s` 85 | ) 86 | }) 87 | .catch(err => { 88 | this.timedStage('teardown') 89 | if (err.message.match(/aggregate error/)) { 90 | throw err[0] 91 | } else { 92 | throw err 93 | } 94 | }) 95 | .then(() => this) 96 | } 97 | 98 | prepare () { 99 | this.log.info('prepare', 'initializing installer') 100 | this.log.level = this.opts.loglevel 101 | this.log.verbose('prepare', 'starting workers') 102 | extract.startWorkers() 103 | 104 | return ( 105 | this.opts.prefix && this.opts.global 106 | ? BB.resolve(this.opts.prefix) 107 | // There's some Special™ logic around the `--prefix` config when it 108 | // comes from a config file or env vs when it comes from the CLI 109 | : process.argv.some(arg => arg.match(/^\s*--prefix\s*/i)) 110 | ? BB.resolve(this.opts.prefix) 111 | : getPrefix(process.cwd()) 112 | ) 113 | .then(prefix => { 114 | this.prefix = prefix 115 | this.log.verbose('prepare', 'installation prefix: ' + prefix) 116 | return BB.join( 117 | readJson(prefix, 'package.json'), 118 | readJson(prefix, 'package-lock.json', true), 119 | readJson(prefix, 'npm-shrinkwrap.json', true), 120 | (pkg, lock, shrink) => { 121 | if (shrink) { 122 | this.log.verbose('prepare', 'using npm-shrinkwrap.json') 123 | } else if (lock) { 124 | this.log.verbose('prepare', 'using package-lock.json') 125 | } 126 | pkg._shrinkwrap = shrink || lock 127 | this.pkg = pkg 128 | } 129 | ) 130 | }) 131 | .then(() => statAsync( 132 | path.join(this.prefix, 'node_modules') 133 | ).catch(err => { if (err.code !== 'ENOENT') { throw err } })) 134 | .then(stat => { 135 | stat && this.log.warn( 136 | 'prepare', 'removing existing node_modules/ before installation' 137 | ) 138 | return BB.join( 139 | this.checkLock(), 140 | stat && rimraf(path.join(this.prefix, 'node_modules/*')) 141 | ) 142 | }).then(() => { 143 | // This needs to happen -after- we've done checkLock() 144 | this.tree = buildLogicalTree(this.pkg, this.pkg._shrinkwrap) 145 | this.log.silly('tree', this.tree) 146 | this.expectedTotal = 0 147 | this.tree.forEach((dep, next) => { 148 | this.expectedTotal++ 149 | next() 150 | }) 151 | }) 152 | } 153 | 154 | teardown () { 155 | this.log.verbose('teardown', 'shutting down workers.') 156 | return extract.stopWorkers() 157 | } 158 | 159 | checkLock () { 160 | this.log.verbose('checkLock', 'verifying package-lock data') 161 | const pkg = this.pkg 162 | const prefix = this.prefix 163 | if (!pkg._shrinkwrap || !pkg._shrinkwrap.lockfileVersion) { 164 | return BB.reject( 165 | new Error(`cipm can only install packages with an existing package-lock.json or npm-shrinkwrap.json with lockfileVersion >= 1. Run an install with npm@5 or later to generate it, then try again.`) 166 | ) 167 | } 168 | return lockVerify(prefix).then(result => { 169 | if (result.status) { 170 | result.warnings.forEach(w => this.log.warn('lockfile', w)) 171 | } else { 172 | throw new Error( 173 | 'cipm can only install packages when your package.json and package-lock.json or ' + 174 | 'npm-shrinkwrap.json are in sync. Please update your lock file with `npm install` ' + 175 | 'before continuing.\n\n' + 176 | result.warnings.map(w => 'Warning: ' + w).join('\n') + '\n' + 177 | result.errors.join('\n') + '\n' 178 | ) 179 | } 180 | }).catch(err => { 181 | throw err 182 | }) 183 | } 184 | 185 | extractTree (tree) { 186 | this.log.verbose('extractTree', 'extracting dependencies to node_modules/') 187 | const cg = this.log.newItem('extractTree', this.expectedTotal) 188 | return tree.forEachAsync((dep, next) => { 189 | if (!this.checkDepEnv(dep)) { return } 190 | const depPath = dep.path(this.prefix) 191 | const spec = npa.resolve(dep.name, dep.version, this.prefix) 192 | if (dep.isRoot) { 193 | return next() 194 | } else if (spec.type === 'directory') { 195 | const relative = path.relative(path.dirname(depPath), spec.fetchSpec) 196 | this.log.silly('extractTree', `${dep.name}@${spec.fetchSpec} -> ${depPath} (symlink)`) 197 | return mkdirp(path.dirname(depPath)) 198 | .then(() => symlinkAsync(relative, depPath, 'junction')) 199 | .catch( 200 | () => rimraf(depPath) 201 | .then(() => symlinkAsync(relative, depPath, 'junction')) 202 | ).then(() => next()) 203 | .then(() => { 204 | this.pkgCount++ 205 | cg.completeWork(1) 206 | }) 207 | } else { 208 | this.log.silly('extractTree', `${dep.name}@${dep.version} -> ${depPath}`) 209 | return ( 210 | dep.bundled 211 | ? statAsync(path.join(depPath, 'package.json')).catch(err => { 212 | if (err.code !== 'ENOENT') { throw err } 213 | }) 214 | : BB.resolve(false) 215 | ) 216 | .then(wasBundled => { 217 | // Don't extract if a bundled dep is actually present 218 | if (wasBundled) { 219 | cg.completeWork(1) 220 | return next() 221 | } else { 222 | return BB.resolve(extract.child( 223 | dep.name, dep, depPath, this.opts 224 | )) 225 | .then(() => cg.completeWork(1)) 226 | .then(() => { this.pkgCount++ }) 227 | .then(next) 228 | } 229 | }) 230 | } 231 | }, {concurrency: 50, Promise: BB}) 232 | .then(() => cg.finish()) 233 | } 234 | 235 | checkDepEnv (dep) { 236 | const includeDev = ( 237 | // Covers --dev and --development (from npm config itself) 238 | this.opts.dev || 239 | ( 240 | !/^prod(uction)?$/.test(this.opts.only) && 241 | !this.opts.production 242 | ) || 243 | /^dev(elopment)?$/.test(this.opts.only) || 244 | /^dev(elopment)?$/.test(this.opts.also) 245 | ) 246 | const includeProd = !/^dev(elopment)?$/.test(this.opts.only) 247 | const includeOptional = includeProd && this.opts.optional 248 | return (dep.dev && includeDev) || 249 | (dep.optional && includeOptional) || 250 | (!dep.dev && !dep.optional && includeProd) 251 | } 252 | 253 | updateJson (tree) { 254 | this.log.verbose('updateJson', 'updating json deps to include _from') 255 | const pkgJsons = new Map() 256 | return tree.forEachAsync((dep, next) => { 257 | if (!this.checkDepEnv(dep)) { return } 258 | const spec = npa.resolve(dep.name, dep.version) 259 | const depPath = dep.path(this.prefix) 260 | return next() 261 | .then(() => readJson(depPath, 'package.json')) 262 | .then(pkg => (spec.registry || spec.type === 'directory') 263 | ? pkg 264 | : this.updateFromField(dep, pkg).then(() => pkg) 265 | ) 266 | .then(pkg => (pkg.scripts && pkg.scripts.install) 267 | ? pkg 268 | : this.updateInstallScript(dep, pkg).then(() => pkg) 269 | ) 270 | .tap(pkg => { pkgJsons.set(dep, pkg) }) 271 | }, {concurrency: 100, Promise: BB}) 272 | .then(() => pkgJsons) 273 | } 274 | 275 | buildTree (tree, pkgJsons) { 276 | this.log.verbose('buildTree', 'finalizing tree and running scripts') 277 | return tree.forEachAsync((dep, next) => { 278 | if (!this.checkDepEnv(dep)) { return } 279 | const spec = npa.resolve(dep.name, dep.version) 280 | const depPath = dep.path(this.prefix) 281 | const pkg = pkgJsons.get(dep) 282 | this.log.silly('buildTree', `linking ${spec}`) 283 | return this.runScript('preinstall', pkg, depPath) 284 | .then(next) // build children between preinstall and binLink 285 | // Don't link root bins 286 | .then(() => { 287 | if ( 288 | dep.isRoot || 289 | !(pkg.bin || pkg.man || (pkg.directories && pkg.directories.bin)) 290 | ) { 291 | // We skip the relatively expensive readPkgJson if there's no way 292 | // we'll actually be linking any bins or mans 293 | return 294 | } 295 | return readPkgJson(path.join(depPath, 'package.json')) 296 | .then(pkg => binLink(pkg, depPath, false, { 297 | force: this.opts.force, 298 | ignoreScripts: this.opts['ignore-scripts'], 299 | log: Object.assign({}, this.log, { info: () => {} }), 300 | name: pkg.name, 301 | pkgId: pkg.name + '@' + pkg.version, 302 | prefix: this.prefix, 303 | prefixes: [this.prefix], 304 | umask: this.opts.umask 305 | }), e => { 306 | this.log.verbose('buildTree', `error linking ${spec}: ${e.message} ${e.stack}`) 307 | }) 308 | }) 309 | .then(() => this.runScript('install', pkg, depPath)) 310 | .then(() => this.runScript('postinstall', pkg, depPath)) 311 | .then(() => this) 312 | .catch(e => { 313 | if (dep.optional) { 314 | this.failedDeps.add(dep) 315 | } else { 316 | throw e 317 | } 318 | }) 319 | }, {concurrency: 1, Promise: BB}) 320 | } 321 | 322 | updateFromField (dep, pkg) { 323 | const depPath = dep.path(this.prefix) 324 | const depPkgPath = path.join(depPath, 'package.json') 325 | const parent = dep.requiredBy.values().next().value 326 | return readJson(parent.path(this.prefix), 'package.json') 327 | .then(ppkg => 328 | (ppkg.dependencies && ppkg.dependencies[dep.name]) || 329 | (ppkg.devDependencies && ppkg.devDependencies[dep.name]) || 330 | (ppkg.optionalDependencies && ppkg.optionalDependencies[dep.name]) 331 | ) 332 | .then(from => npa.resolve(dep.name, from)) 333 | .then(from => { pkg._from = from.toString() }) 334 | .then(() => writeFileAsync(depPkgPath, JSON.stringify(pkg, null, 2))) 335 | .then(() => pkg) 336 | } 337 | 338 | updateInstallScript (dep, pkg) { 339 | const depPath = dep.path(this.prefix) 340 | return statAsync(path.join(depPath, 'binding.gyp')) 341 | .catch(err => { if (err.code !== 'ENOENT') { throw err } }) 342 | .then(stat => { 343 | if (stat) { 344 | if (!pkg.scripts) { 345 | pkg.scripts = {} 346 | } 347 | pkg.scripts.install = 'node-gyp rebuild' 348 | } 349 | }) 350 | .then(() => pkg) 351 | } 352 | 353 | // A cute little mark-and-sweep collector! 354 | garbageCollect (tree) { 355 | if (!this.failedDeps.size) { return } 356 | return sweep( 357 | tree, 358 | this.prefix, 359 | mark(tree, this.failedDeps) 360 | ) 361 | .then(purged => { 362 | this.purgedDeps = purged 363 | this.pkgCount -= purged.size 364 | }) 365 | } 366 | 367 | runScript (stage, pkg, pkgPath) { 368 | const start = Date.now() 369 | if (!this.opts['ignore-scripts']) { 370 | // TODO(mikesherov): remove pkg._id when npm-lifecycle no longer relies on it 371 | pkg._id = pkg.name + '@' + pkg.version 372 | return BB.resolve(lifecycle( 373 | pkg, stage, pkgPath, LifecycleOpts(this.opts).concat({ 374 | // TODO: can be removed once npm-lifecycle is updated to modern 375 | // config practices. 376 | config: Object.assign({}, this.opts, { 377 | log: null, 378 | dirPacker: null 379 | }), 380 | dir: this.prefix 381 | })) 382 | ).tap(() => { this.timings.scripts += Date.now() - start }) 383 | } 384 | return BB.resolve() 385 | } 386 | } 387 | module.exports = Installer 388 | 389 | function mark (tree, failed) { 390 | const liveDeps = new Set() 391 | tree.forEach((dep, next) => { 392 | if (!failed.has(dep)) { 393 | liveDeps.add(dep) 394 | next() 395 | } 396 | }) 397 | return liveDeps 398 | } 399 | 400 | function sweep (tree, prefix, liveDeps) { 401 | const purged = new Set() 402 | return tree.forEachAsync((dep, next) => { 403 | return next().then(() => { 404 | if ( 405 | !dep.isRoot && // never purge root! 🙈 406 | !liveDeps.has(dep) && 407 | !purged.has(dep) 408 | ) { 409 | purged.add(dep) 410 | return rimraf(dep.path(prefix)) 411 | } 412 | }) 413 | }, {concurrency: 50, Promise: BB}).then(() => purged) 414 | } 415 | 416 | function stripBOM (str) { 417 | return str.replace(/^\uFEFF/, '') 418 | } 419 | 420 | module.exports._readJson = readJson 421 | function readJson (jsonPath, name, ignoreMissing) { 422 | return readFileAsync(path.join(jsonPath, name), 'utf8') 423 | .then(str => JSON.parse(stripBOM(str))) 424 | .catch({code: 'ENOENT'}, err => { 425 | if (!ignoreMissing) { 426 | throw err 427 | } 428 | }) 429 | } 430 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Change Log 2 | 3 | All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. 4 | 5 | 6 | ## [4.0.8](https://github.com/npm/libcipm/compare/v4.0.7...v4.0.8) (2020-03-25) 7 | 8 | 9 | ### Bug Fixes 10 | 11 | * add repo to bin pkg, bump to 2.0.1 ([ed2d735](https://github.com/npm/libcipm/commit/ed2d735)) 12 | 13 | 14 | 15 | 16 | ## [4.0.7](https://github.com/npm/libcipm/compare/v4.0.4...v4.0.7) (2019-10-09) 17 | 18 | 19 | ### Bug Fixes 20 | 21 | * delete node_modules contents but keep the dir itself ([f668181](https://github.com/npm/libcipm/commit/f668181)), closes [#3](https://github.com/npm/libcipm/issues/3) 22 | 23 | 24 | ## [4.0.4](https://github.com/npm/libcipm/compare/v4.0.3...v4.0.4) (2019-09-24) 25 | 26 | 27 | ### Bug Fixes 28 | 29 | * pack git directories properly ([576ab36](https://github.com/npm/libcipm/commit/576ab36)), closes [#4](https://github.com/npm/libcipm/issues/4) 30 | 31 | 32 | 33 | 34 | ## [4.0.3](https://github.com/npm/libcipm/compare/v4.0.2...v4.0.3) (2019-08-12) 35 | 36 | 37 | ### Bug Fixes 38 | 39 | * do not pass opts.log to lifecycle ([46b2101](https://github.com/npm/libcipm/commit/46b2101)) 40 | 41 | 42 | 43 | 44 | ## [4.0.2](https://github.com/npm/libcipm/compare/v4.0.1...v4.0.2) (2019-08-12) 45 | 46 | 47 | 48 | 49 | ## [4.0.1](https://github.com/npm/libcipm/compare/v4.0.0...v4.0.1) (2019-08-12) 50 | 51 | 52 | ### Bug Fixes 53 | 54 | * respect and retain all configs passed in ([20b7372](https://github.com/npm/libcipm/commit/20b7372)) 55 | 56 | 57 | 58 | 59 | # [4.0.0](https://github.com/npm/libcipm/compare/v3.0.3...v4.0.0) (2019-07-10) 60 | 61 | 62 | * npm-lifecycle@3.0.0 ([84b8d7e](https://github.com/npm/libcipm/commit/84b8d7e)) 63 | 64 | 65 | ### Bug Fixes 66 | 67 | * **lifecycle:** remove warning from bluebird ([#59](https://github.com/npm/libcipm/issues/59)) ([7af39e6](https://github.com/npm/libcipm/commit/7af39e6)), closes [#58](https://github.com/npm/libcipm/issues/58) 68 | 69 | 70 | ### BREAKING CHANGES 71 | 72 | * requires updating node-gyp in npm/cli 73 | 74 | 75 | 76 | 77 | ## [3.0.3](https://github.com/npm/libcipm/compare/v3.0.2...v3.0.3) (2019-01-22) 78 | 79 | 80 | ### Bug Fixes 81 | 82 | * **scripts:** pass in opts.dir directly ([018df27](https://github.com/npm/libcipm/commit/018df27)) 83 | 84 | 85 | 86 | 87 | ## [3.0.2](https://github.com/npm/libcipm/compare/v3.0.1...v3.0.2) (2018-08-31) 88 | 89 | 90 | ### Bug Fixes 91 | 92 | * **worker:** missed a spot ([4371558](https://github.com/npm/libcipm/commit/4371558)) 93 | 94 | 95 | 96 | 97 | ## [3.0.1](https://github.com/npm/libcipm/compare/v3.0.0...v3.0.1) (2018-08-31) 98 | 99 | 100 | ### Bug Fixes 101 | 102 | * **workers:** disable workers for now ([64db490](https://github.com/npm/libcipm/commit/64db490)) 103 | 104 | 105 | 106 | 107 | # [3.0.0](https://github.com/npm/libcipm/compare/v2.0.2...v3.0.0) (2018-08-31) 108 | 109 | 110 | ### Features 111 | 112 | * **config:** switch to modern, figgy-pudding configuration ([#57](https://github.com/npm/libcipm/issues/57)) ([161f6b2](https://github.com/npm/libcipm/commit/161f6b2)) 113 | 114 | 115 | ### BREAKING CHANGES 116 | 117 | * **config:** this updates cipm to use pacote@9, which consumes npm-style config objects, not pacoteOpts()-style objects. 118 | 119 | 120 | 121 | 122 | ## [2.0.2](https://github.com/npm/libcipm/compare/v2.0.1...v2.0.2) (2018-08-10) 123 | 124 | 125 | ### Bug Fixes 126 | 127 | * **child:** only override dirPacker if opts.dirPacker is defined ([#55](https://github.com/npm/libcipm/issues/55)) ([13ab2f0](https://github.com/npm/libcipm/commit/13ab2f0)) 128 | 129 | 130 | 131 | 132 | ## [2.0.1](https://github.com/npm/libcipm/compare/v2.0.0...v2.0.1) (2018-07-27) 133 | 134 | 135 | ### Bug Fixes 136 | 137 | * **deps:** move mkdirp to prod deps ([6878f39](https://github.com/npm/libcipm/commit/6878f39)) 138 | 139 | 140 | 141 | 142 | # [2.0.0](https://github.com/npm/libcipm/compare/v1.6.3...v2.0.0) (2018-05-24) 143 | 144 | 145 | ### meta 146 | 147 | * update node version support ([694b4d3](https://github.com/npm/libcipm/commit/694b4d3)) 148 | 149 | 150 | ### BREAKING CHANGES 151 | 152 | * node@4 is no longer supported 153 | 154 | 155 | 156 | 157 | ## [1.6.3](https://github.com/npm/libcipm/compare/v1.6.2...v1.6.3) (2018-05-24) 158 | 159 | 160 | 161 | 162 | ## [1.6.2](https://github.com/npm/libcipm/compare/v1.6.1...v1.6.2) (2018-04-08) 163 | 164 | 165 | ### Bug Fixes 166 | 167 | * **lifecycle:** detect binding.gyp for default install lifecycle ([#46](https://github.com/npm/libcipm/issues/46)) ([9149631](https://github.com/npm/libcipm/commit/9149631)), closes [#45](https://github.com/npm/libcipm/issues/45) 168 | 169 | 170 | 171 | 172 | ## [1.6.1](https://github.com/npm/libcipm/compare/v1.6.0...v1.6.1) (2018-03-13) 173 | 174 | 175 | ### Bug Fixes 176 | 177 | * **bin:** Set non-zero exit code on error ([#41](https://github.com/npm/libcipm/issues/41)) ([54d0106](https://github.com/npm/libcipm/commit/54d0106)) 178 | * **lifecycle:** defer to lifecycle’s internal logic as to whether or not to execute a run-script ([#42](https://github.com/npm/libcipm/issues/42)) ([7f27a52](https://github.com/npm/libcipm/commit/7f27a52)), closes [npm/npm#19258](https://github.com/npm/npm/issues/19258) 179 | * **prefix:** don't reference prefix before computing it ([#40](https://github.com/npm/libcipm/issues/40)) ([08ed1cc](https://github.com/npm/libcipm/commit/08ed1cc)) 180 | * **prefix:** Resolve to promise when passing --prefix to npm ci ([#43](https://github.com/npm/libcipm/issues/43)) ([401d466](https://github.com/npm/libcipm/commit/401d466)) 181 | 182 | 183 | 184 | 185 | # [1.6.0](https://github.com/npm/libcipm/compare/v1.5.1...v1.6.0) (2018-03-01) 186 | 187 | 188 | ### Bug Fixes 189 | 190 | * **bin:** cli.js was being excluded ([d62668e](https://github.com/npm/libcipm/commit/d62668e)) 191 | 192 | 193 | ### Features 194 | 195 | * **libcipm:** working standalone cipm release! ([a3383fd](https://github.com/npm/libcipm/commit/a3383fd)) 196 | 197 | 198 | 199 | 200 | ## [1.5.1](https://github.com/npm/libcipm/compare/v1.5.0...v1.5.1) (2018-03-01) 201 | 202 | 203 | ### Bug Fixes 204 | 205 | * **_from:** do not add _from to directory deps ([7405360](https://github.com/npm/libcipm/commit/7405360)) 206 | 207 | 208 | 209 | 210 | # [1.5.0](https://github.com/npm/libcipm/compare/v1.4.1...v1.5.0) (2018-03-01) 211 | 212 | 213 | ### Bug Fixes 214 | 215 | * **errors:** handle aggregate errors better ([6239499](https://github.com/npm/libcipm/commit/6239499)) 216 | 217 | 218 | ### Features 219 | 220 | * **logger:** rudimentary progress bar update ([c5d9dc7](https://github.com/npm/libcipm/commit/c5d9dc7)) 221 | 222 | 223 | 224 | 225 | ## [1.4.1](https://github.com/npm/libcipm/compare/v1.4.0...v1.4.1) (2018-02-27) 226 | 227 | 228 | ### Bug Fixes 229 | 230 | * **buildTree:** linking in parallel causes hoist-clobbering ([5ffbc0e](https://github.com/npm/libcipm/commit/5ffbc0e)), closes [#39](https://github.com/npm/libcipm/issues/39) 231 | * **buildTree:** use checkDepEnv here too ([41a4634](https://github.com/npm/libcipm/commit/41a4634)) 232 | * **perf:** split up updateJson and buildTree ([df5aba0](https://github.com/npm/libcipm/commit/df5aba0)) 233 | * **perf:** stop using the readPackageJson version to update packages ([8da3d5a](https://github.com/npm/libcipm/commit/8da3d5a)) 234 | 235 | 236 | 237 | 238 | # [1.4.0](https://github.com/npm/libcipm/compare/v1.3.3...v1.4.0) (2018-02-21) 239 | 240 | 241 | ### Features 242 | 243 | * **extract:** add support for --only and --also ([ad143ae](https://github.com/npm/libcipm/commit/ad143ae)) 244 | 245 | 246 | 247 | 248 | ## [1.3.3](https://github.com/npm/libcipm/compare/v1.3.2...v1.3.3) (2018-02-21) 249 | 250 | 251 | ### Bug Fixes 252 | 253 | * **extract:** stop extracting deps before parent :\ ([c6847dc](https://github.com/npm/libcipm/commit/c6847dc)) 254 | 255 | 256 | 257 | 258 | ## [1.3.2](https://github.com/npm/libcipm/compare/v1.3.1...v1.3.2) (2018-02-15) 259 | 260 | 261 | 262 | 263 | ## [1.3.1](https://github.com/npm/libcipm/compare/v1.3.0...v1.3.1) (2018-02-15) 264 | 265 | 266 | 267 | 268 | # [1.3.0](https://github.com/npm/libcipm/compare/v1.2.0...v1.3.0) (2018-02-13) 269 | 270 | 271 | ### Features 272 | 273 | * **extract:** link directory deps and install missing bundle deps ([8334e9e](https://github.com/npm/libcipm/commit/8334e9e)) 274 | 275 | 276 | 277 | 278 | # [1.2.0](https://github.com/npm/libcipm/compare/v1.1.2...v1.2.0) (2018-02-07) 279 | 280 | 281 | ### Features 282 | 283 | * **metadata:** add _resolved, _integrity, and _from on install ([36642dc](https://github.com/npm/libcipm/commit/36642dc)) 284 | 285 | 286 | 287 | 288 | ## [1.1.2](https://github.com/npm/libcipm/compare/v1.1.1...v1.1.2) (2018-01-19) 289 | 290 | 291 | 292 | 293 | ## [1.1.1](https://github.com/npm/libcipm/compare/v1.1.0...v1.1.1) (2018-01-19) 294 | 295 | 296 | 297 | 298 | # [1.1.0](https://github.com/npm/libcipm/compare/v1.0.1...v1.1.0) (2018-01-07) 299 | 300 | 301 | ### Features 302 | 303 | * **log:** add some helpful log output ([f443f03](https://github.com/npm/libcipm/commit/f443f03)) 304 | 305 | 306 | 307 | 308 | ## [1.0.1](https://github.com/npm/libcipm/compare/v1.0.0...v1.0.1) (2018-01-07) 309 | 310 | 311 | ### Bug Fixes 312 | 313 | * **deps:** added protoduck to pkgjson ([ecbe719](https://github.com/npm/libcipm/commit/ecbe719)) 314 | 315 | 316 | 317 | 318 | # [1.0.0](https://github.com/npm/libcipm/compare/v0.9.1...v1.0.0) (2018-01-07) 319 | 320 | 321 | ### Features 322 | 323 | * **cli:** splitting off CLI into a separate tool ([cff65c1](https://github.com/npm/libcipm/commit/cff65c1)) 324 | 325 | 326 | ### BREAKING CHANGES 327 | 328 | * **cli:** libcipm is its own library now, 329 | 330 | 331 | 332 | 333 | ## [0.9.1](https://github.com/npm/libcipm/compare/v0.9.0...v0.9.1) (2018-01-07) 334 | 335 | 336 | ### Bug Fixes 337 | 338 | * **prefix:** oops @ prefix ([cc5adac](https://github.com/npm/libcipm/commit/cc5adac)) 339 | 340 | 341 | 342 | 343 | # [0.9.0](https://github.com/npm/libcipm/compare/v0.8.0...v0.9.0) (2018-01-07) 344 | 345 | 346 | ### Bug Fixes 347 | 348 | * **package:** add pacote to bundleDependencies ([#36](https://github.com/npm/libcipm/issues/36)) ([a69742e](https://github.com/npm/libcipm/commit/a69742e)) 349 | 350 | 351 | ### Features 352 | 353 | * **config:** allow injection of npm configs ([#35](https://github.com/npm/libcipm/issues/35)) ([1f5694b](https://github.com/npm/libcipm/commit/1f5694b)) 354 | 355 | 356 | 357 | 358 | # [0.8.0](https://github.com/npm/libcipm/compare/v0.7.2...v0.8.0) (2017-11-28) 359 | 360 | 361 | ### Features 362 | 363 | * **gyp:** new npm-lifecycle[@2](https://github.com/2) with included node-gyp ([a4ed938](https://github.com/npm/libcipm/commit/a4ed938)) 364 | 365 | 366 | 367 | 368 | ## [0.7.2](https://github.com/npm/libcipm/compare/v0.7.1...v0.7.2) (2017-10-13) 369 | 370 | 371 | ### Bug Fixes 372 | 373 | * **extract:** idk why this was breaking. Seriously. ([433a2be](https://github.com/npm/libcipm/commit/433a2be)) 374 | * **tree:** pass through a custom Promise to logiTree ([2d29efb](https://github.com/npm/libcipm/commit/2d29efb)) 375 | 376 | 377 | ### Performance Improvements 378 | 379 | * zoomzoom. Even more concurrency! ([db9c2e0](https://github.com/npm/libcipm/commit/db9c2e0)) 380 | 381 | 382 | 383 | 384 | ## [0.7.1](https://github.com/npm/libcipm/compare/v0.7.0...v0.7.1) (2017-10-13) 385 | 386 | 387 | ### Bug Fixes 388 | 389 | * **scripts:** separate extract and build and fix ordering ([eb072a5](https://github.com/npm/libcipm/commit/eb072a5)) 390 | 391 | 392 | 393 | 394 | # [0.7.0](https://github.com/npm/libcipm/compare/v0.6.0...v0.7.0) (2017-10-12) 395 | 396 | 397 | ### Bug Fixes 398 | 399 | * **lockfile:** npm-shrinkwrap takes precedence over package-lock (#28) ([3b98fb3](https://github.com/npm/libcipm/commit/3b98fb3)) 400 | 401 | 402 | ### Features 403 | 404 | * **optional:** ignore failed optional deps (#27) ([a654629](https://github.com/npm/libcipm/commit/a654629)) 405 | 406 | 407 | 408 | 409 | # [0.6.0](https://github.com/npm/libcipm/compare/v0.5.1...v0.6.0) (2017-10-09) 410 | 411 | 412 | ### Features 413 | 414 | * **scripts:** run prepare and prepublish scripts in the root (#26) ([e0e35a3](https://github.com/npm/libcipm/commit/e0e35a3)) 415 | 416 | 417 | 418 | 419 | ## [0.5.1](https://github.com/npm/libcipm/compare/v0.5.0...v0.5.1) (2017-10-09) 420 | 421 | 422 | 423 | 424 | # [0.5.0](https://github.com/npm/libcipm/compare/v0.4.0...v0.5.0) (2017-10-09) 425 | 426 | 427 | ### Bug Fixes 428 | 429 | * **output:** npm does not punctuate this ([e7ba976](https://github.com/npm/libcipm/commit/e7ba976)) 430 | * **shutdown:** make sure workers close ([7ab57d0](https://github.com/npm/libcipm/commit/7ab57d0)) 431 | 432 | 433 | ### Features 434 | 435 | * **bin:** link bins and run scripts (#25) ([fab74bf](https://github.com/npm/libcipm/commit/fab74bf)) 436 | * **lifecycle:** run scripts in dep order (#23) ([68ecfac](https://github.com/npm/libcipm/commit/68ecfac)) 437 | 438 | 439 | 440 | 441 | # [0.4.0](https://github.com/npm/libcipm/compare/v0.3.2...v0.4.0) (2017-10-04) 442 | 443 | 444 | ### Features 445 | 446 | * **opts:** support full range of relevant CLI opts (#19) ([6f2bd51](https://github.com/npm/libcipm/commit/6f2bd51)) 447 | 448 | 449 | 450 | 451 | ## [0.3.2](https://github.com/npm/libcipm/compare/v0.3.1...v0.3.2) (2017-09-06) 452 | 453 | 454 | ### Bug Fixes 455 | 456 | * **bin:** make cli executable by default (#13) ([14a9a5f](https://github.com/npm/libcipm/commit/14a9a5f)) 457 | * **config:** use npm.cmd on win32 and fix tests (#12) ([d912d16](https://github.com/npm/libcipm/commit/d912d16)), closes [#12](https://github.com/npm/libcipm/issues/12) 458 | * **json:** strip BOM when reading JSON files (#8) ([2529149](https://github.com/npm/libcipm/commit/2529149)) 459 | 460 | 461 | 462 | 463 | ## [0.3.1](https://github.com/npm/libcipm/compare/v0.3.0...v0.3.1) (2017-09-05) 464 | 465 | 466 | 467 | 468 | # [0.3.0](https://github.com/npm/libcipm/compare/v0.2.0...v0.3.0) (2017-09-05) 469 | 470 | 471 | ### Features 472 | 473 | * **lockfile:** verify that lockfile matches package.json (#5) ([f631203](https://github.com/npm/libcipm/commit/f631203)) 474 | * **scripts:** support --ignore-scripts option (#9) ([213ca02](https://github.com/npm/libcipm/commit/213ca02)) 475 | 476 | 477 | 478 | 479 | # [0.2.0](https://github.com/npm/libcipm/compare/v0.1.1...v0.2.0) (2017-09-01) 480 | 481 | 482 | ### Bug Fixes 483 | 484 | * **main:** default --prefix ([ff06a31](https://github.com/npm/libcipm/commit/ff06a31)) 485 | 486 | 487 | ### Features 488 | 489 | * **lifecycle:** actually run lifecycle scripts correctly ([7f8933e](https://github.com/npm/libcipm/commit/7f8933e)) 490 | 491 | 492 | 493 | 494 | ## [0.1.1](https://github.com/npm/libcipm/compare/v0.1.0...v0.1.1) (2017-08-30) 495 | 496 | 497 | ### Bug Fixes 498 | 499 | * **files:** oops. forgot to include new files in tarball ([1ee85c9](https://github.com/npm/libcipm/commit/1ee85c9)) 500 | 501 | 502 | 503 | 504 | # 0.1.0 (2017-08-30) 505 | 506 | 507 | ### Bug Fixes 508 | 509 | * **config:** pipe stdout ([08e6af8](https://github.com/npm/libcipm/commit/08e6af8)) 510 | * **extract:** make sure to extract properly ([9643583](https://github.com/npm/libcipm/commit/9643583)) 511 | * **license:** switch to MIT ([0d10d0d](https://github.com/npm/libcipm/commit/0d10d0d)) 512 | 513 | 514 | ### Features 515 | 516 | * **impl:** rough prototype ([2970e43](https://github.com/npm/libcipm/commit/2970e43)) 517 | * **lifecycle:** Run lifecycle events, implement prefix option, add unit tests (#1) ([d6629be](https://github.com/npm/libcipm/commit/d6629be)), closes [#1](https://github.com/npm/libcipm/issues/1) 518 | * **opts:** add usage string and --help ([efcc48d](https://github.com/npm/libcipm/commit/efcc48d)) 519 | -------------------------------------------------------------------------------- /test/specs/index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | const BB = require('bluebird') 4 | 5 | const npmlog = require('npmlog') 6 | const fixtureHelper = require('../lib/fixtureHelper.js') 7 | const fs = BB.promisifyAll(require('fs')) 8 | const path = require('path') 9 | const requireInject = require('require-inject') 10 | const Tacks = require('tacks') 11 | const test = require('tap').test 12 | 13 | const Dir = Tacks.Dir 14 | const File = Tacks.File 15 | 16 | let extract = () => {} 17 | const pkgName = 'hark-a-package' 18 | const pkgVersion = '1.0.0' 19 | const writeEnvScript = process.platform === 'win32' 20 | ? 'echo %npm_lifecycle_event% > %npm_lifecycle_event%' 21 | : 'echo $npm_lifecycle_event > $npm_lifecycle_event' 22 | const binarySuffix = process.platform === 'win32' 23 | ? '.exe' 24 | : '' 25 | 26 | const prefix = require('../lib/test-dir')(__filename) 27 | 28 | const Installer = requireInject('../../index.js', { 29 | '../../lib/extract': { 30 | startWorkers () {}, 31 | stopWorkers () {}, 32 | child () { 33 | return extract.apply(null, arguments) 34 | } 35 | } 36 | }) 37 | 38 | function run (moreOpts) { 39 | return new Installer(Object.assign({ 40 | log: npmlog, 41 | global: true, 42 | prefix, 43 | 'unsafe-perm': true, // this is the default when running non-root 44 | loglevel: process.env.LOGLEVEL || 'error' 45 | }, moreOpts || {})).run() 46 | } 47 | 48 | test('throws error when no package.json is found', t => { 49 | const fixture = new Tacks(Dir({ 50 | 'index.js': File('var a = 1') 51 | })) 52 | fixture.create(prefix) 53 | 54 | return run().catch(err => { 55 | t.equal(err.code, 'ENOENT') 56 | }) 57 | }) 58 | 59 | test('throws error when no package-lock nor shrinkwrap is found', t => { 60 | const fixture = new Tacks(Dir({ 61 | 'package.json': File({ 62 | name: pkgName, 63 | version: pkgVersion 64 | }) 65 | })) 66 | fixture.create(prefix) 67 | 68 | return run().catch(err => { 69 | t.equal(err.message, 'cipm can only install packages with an existing package-lock.json or npm-shrinkwrap.json with lockfileVersion >= 1. Run an install with npm@5 or later to generate it, then try again.') 70 | }) 71 | }) 72 | 73 | test('throws error when package.json and package-lock.json do not match', t => { 74 | const fixture = new Tacks(Dir({ 75 | 'package.json': File({ 76 | name: pkgName, 77 | version: pkgVersion, 78 | dependencies: { a: '1' }, // should generate error 79 | optionalDependencies: { b: '2' } // should generate warning 80 | }), 81 | 'package-lock.json': File({ 82 | version: pkgVersion + '-0', 83 | dependencies: {}, 84 | lockfileVersion: 1 85 | }) 86 | })) 87 | fixture.create(prefix) 88 | 89 | return run().catch(err => { 90 | t.match(err.message, 'cipm can only install packages when your package.json and package-lock.json or npm-shrinkwrap.json are in sync') 91 | }) 92 | }) 93 | 94 | test('throws error when old shrinkwrap is found', t => { 95 | const fixture = new Tacks(Dir({ 96 | 'package.json': File({ 97 | name: pkgName, 98 | version: pkgVersion 99 | }), 100 | 'npm-shrinkwrap.json': File({}) 101 | })) 102 | fixture.create(prefix) 103 | 104 | return run().catch(err => { 105 | t.equal(err.message, 'cipm can only install packages with an existing package-lock.json or npm-shrinkwrap.json with lockfileVersion >= 1. Run an install with npm@5 or later to generate it, then try again.') 106 | }) 107 | }) 108 | 109 | test('handles empty dependency list', t => { 110 | const fixture = new Tacks(Dir({ 111 | 'package.json': File({ 112 | name: pkgName, 113 | version: pkgVersion 114 | }), 115 | 'package-lock.json': File({ 116 | dependencies: {}, 117 | lockfileVersion: 1 118 | }) 119 | })) 120 | fixture.create(prefix) 121 | 122 | return run().then(details => { 123 | t.equal(details.pkgCount, 0) 124 | }) 125 | }) 126 | 127 | test('handles dependency list with only shallow subdeps', t => { 128 | const fixture = new Tacks(Dir({ 129 | 'package.json': File({ 130 | name: pkgName, 131 | version: pkgVersion, 132 | dependencies: { 133 | 'a': '^1' 134 | } 135 | }), 136 | 'package-lock.json': File({ 137 | name: pkgName, 138 | verson: pkgVersion, 139 | dependencies: { 140 | a: { 141 | version: '1.1.1' 142 | } 143 | }, 144 | lockfileVersion: 1 145 | }) 146 | })) 147 | fixture.create(prefix) 148 | 149 | const aContents = 'var a = 1;' 150 | 151 | extract = (name, child, childPath, opts) => { 152 | const files = new Tacks(Dir({ 153 | 'package.json': File({ 154 | name: pkgName, 155 | version: pkgVersion 156 | }), 157 | 'index.js': File(aContents) 158 | })) 159 | files.create(childPath) 160 | } 161 | 162 | return run().then(details => { 163 | t.equal(details.pkgCount, 1) 164 | const modPath = path.join(prefix, 'node_modules', 'a') 165 | return fs.readFileAsync(path.join(modPath, 'index.js'), 'utf8') 166 | }).then(extractedContents => { 167 | t.equal(extractedContents, aContents, 'extracted data matches') 168 | }) 169 | }) 170 | 171 | test('deletes node_modules/ contents, without deleting node_modules/ itself', t => { 172 | const fixture = new Tacks(Dir({ 173 | 'node_modules': Dir({ 174 | 'stale-dependency': Dir({ 175 | 'package.json': File({ 176 | name: 'stale-dependency', 177 | version: '1.0.0' 178 | }) 179 | }) 180 | }), 181 | 'package.json': File({ 182 | name: pkgName, 183 | version: pkgVersion 184 | }), 185 | 'package-lock.json': File({ 186 | dependencies: {}, 187 | lockfileVersion: 1 188 | }) 189 | })) 190 | fixture.create(prefix) 191 | 192 | let notNodeModulesDeleted = true 193 | const nodeModulesDir = path.join(prefix, 'node_modules') 194 | const watcher = fs.watch(nodeModulesDir, () => { 195 | if (!fs.existsSync(nodeModulesDir)) { 196 | notNodeModulesDeleted = false 197 | } 198 | }) 199 | 200 | return run().then(() => { 201 | t.ok( 202 | !fs.existsSync(path.join(nodeModulesDir, 'stale-dependency')), 203 | 'node_modules/ contents were deleted' 204 | ) 205 | watcher.close() 206 | t.ok(notNodeModulesDeleted, 'node_modules/ itself was not deleted') 207 | }) 208 | }) 209 | 210 | test('handles dependency list with only deep subdeps', t => { 211 | const fixture = new Tacks(Dir({ 212 | 'package.json': File({ 213 | name: pkgName, 214 | version: pkgVersion, 215 | dependencies: { 216 | a: '^1' 217 | } 218 | }), 219 | 'package-lock.json': File({ 220 | dependencies: { 221 | a: { 222 | version: '1.1.1', 223 | requires: { 224 | b: '2.2.2' 225 | }, 226 | dependencies: { 227 | b: { 228 | version: '2.2.2' 229 | } 230 | } 231 | } 232 | }, 233 | lockfileVersion: 1 234 | }) 235 | })) 236 | fixture.create(prefix) 237 | 238 | const aContents = 'var a = 1;' 239 | const bContents = 'var b = 2;' 240 | 241 | extract = (name, child, childPath, opts) => { 242 | const files = new Tacks(Dir({ 243 | 'package.json': File({ 244 | name: name, 245 | version: child.version 246 | }), 247 | 'index.js': File(name === 'a' ? aContents : bContents) 248 | })) 249 | files.create(childPath) 250 | } 251 | 252 | return run().then(details => { 253 | t.equal(details.pkgCount, 2) 254 | return BB.join( 255 | fs.readFileAsync( 256 | path.join(prefix, 'node_modules', 'a', 'index.js'), 257 | 'utf8' 258 | ), 259 | fs.readFileAsync( 260 | path.join(prefix, 'node_modules', 'a', 'node_modules', 'b', 'index.js'), 261 | 'utf8' 262 | ), 263 | (a, b) => { 264 | t.equal(a, aContents, 'first-level dep extracted correctly') 265 | t.equal(b, bContents, 'nested dep extracted correctly') 266 | } 267 | ) 268 | }) 269 | }) 270 | 271 | test('installs `directory` dependencies as symlinks', t => { 272 | const fixture = new Tacks(Dir({ 273 | 'package.json': File({ 274 | name: pkgName, 275 | version: pkgVersion, 276 | dependencies: { 277 | 'a': 'file:a' 278 | } 279 | }), 280 | 'package-lock.json': File({ 281 | name: pkgName, 282 | verson: pkgVersion, 283 | dependencies: { 284 | a: { 285 | version: 'file:a' 286 | } 287 | }, 288 | lockfileVersion: 1 289 | }), 290 | 'a': Dir({ 291 | 'package.json': File({ 292 | name: 'a', 293 | version: '1.2.3' 294 | }), 295 | 'index.js': File('"hello"') 296 | }) 297 | })) 298 | fixture.create(prefix) 299 | 300 | const modPath = path.join(prefix, 'node_modules', 'a') 301 | return run().then(details => { 302 | t.equal(details.pkgCount, 1) 303 | return fs.lstatAsync(modPath) 304 | }) 305 | .then(stat => t.ok(stat.isSymbolicLink(), '`a` is a symlink')) 306 | 307 | .then(() => fs.realpathAsync(modPath)) 308 | .then(realpath => t.equal(realpath, path.join(prefix, 'a'), 'realpath ok')) 309 | 310 | .then(() => fs.readFileAsync(path.join(modPath, 'index.js'), 'utf8')) 311 | .then(data => t.equal(data, '"hello"', 'extracted data matches')) 312 | }) 313 | 314 | test('prioritizes npm-shrinkwrap over package-lock if both present', t => { 315 | const fixture = new Tacks(Dir({ 316 | 'package.json': File({ 317 | name: pkgName, 318 | version: pkgVersion, 319 | dependencies: { 320 | 'a': '^1' 321 | } 322 | }), 323 | 'npm-shrinkwrap.json': File({ 324 | dependencies: { 325 | a: { 326 | version: '1.1.1' 327 | } 328 | }, 329 | lockfileVersion: 1 330 | }), 331 | 'package-lock.json': File({ 332 | dependencies: { 333 | a: { 334 | version: '1.2.3' 335 | } 336 | }, 337 | lockfileVersion: 1 338 | }) 339 | })) 340 | fixture.create(prefix) 341 | 342 | extract = (name, child, childPath, opts) => { 343 | const files = new Tacks(Dir({ 344 | 'package.json': File({ 345 | name: child.name, 346 | version: child.version 347 | }) 348 | })) 349 | files.create(childPath) 350 | } 351 | 352 | return run().then(details => { 353 | t.equal(details.pkgCount, 1) 354 | return fs.readFileAsync(path.join(prefix, 'node_modules', 'a', 'package.json'), 'utf8') 355 | }).then(pkgJson => { 356 | t.deepEqual(JSON.parse(pkgJson), { 357 | name: 'a', 358 | version: '1.1.1' 359 | }, 'uses version from npm-shrinkwrap') 360 | }) 361 | }) 362 | 363 | test('links binaries for dependencies', t => { 364 | const fixture = new Tacks(Dir({ 365 | 'package.json': File({ 366 | name: pkgName, 367 | version: pkgVersion, 368 | dependencies: { 369 | a: '^1' 370 | } 371 | }), 372 | 'package-lock.json': File({ 373 | lockfileVersion: 1, 374 | dependencies: { 375 | a: { 376 | version: '1.0.0', 377 | requires: { 378 | b: '2.0.0', 379 | c: '1.0.0' 380 | } 381 | }, 382 | b: { 383 | version: '2.0.0' 384 | }, 385 | c: { 386 | version: '1.0.0' 387 | } 388 | } 389 | }) 390 | })) 391 | fixture.create(prefix) 392 | 393 | extract = (name, child, childPath, opts) => { 394 | let files 395 | if (child.name === 'a') { 396 | files = new Tacks(Dir({ 397 | 'package.json': File({ 398 | name: 'a', 399 | version: '1.0.0', 400 | bin: 'a', 401 | dependencies: { 402 | b: '^2', 403 | c: '^1' 404 | } 405 | }), 406 | 'a': File('hello') 407 | })) 408 | } else if (child.name === 'b') { 409 | files = new Tacks(Dir({ 410 | 'package.json': File({ 411 | name: 'b', 412 | version: '2.0.0', 413 | bin: 'b' 414 | }), 415 | 'b': File('world') 416 | })) 417 | } else if (child.name === 'c') { 418 | files = new Tacks(Dir({ 419 | 'package.json': File({ 420 | name: 'c', 421 | version: '1.0.0', 422 | bin: { 423 | 'a': './c' 424 | } 425 | }), 426 | 'c': File('this is the bin for c') 427 | })) 428 | } 429 | files.create(childPath) 430 | } 431 | 432 | const isWindows = process.platform === 'win32' 433 | return run().then(details => { 434 | const modP = path.join(prefix, 'node_modules') 435 | if (isWindows) { 436 | t.match( 437 | fs.readFileSync(path.join(modP, '.bin', 'a'), 'utf8'), 438 | /\$basedir/g, 439 | 'stub for a was installed' 440 | ) 441 | } else { 442 | t.equal( 443 | fs.readFileSync(path.join(modP, '.bin', 'a'), 'utf8'), 444 | 'hello', 445 | 'binary for `a` installed at the top level .bin dir' 446 | ) 447 | } 448 | // This feels wrong, but is what npm itself does, and thus what things 449 | // are expecting to be the case. 450 | if (isWindows) { 451 | t.match( 452 | fs.readFileSync(path.join(modP, '.bin', 'b'), 'utf8'), 453 | /\$basedir/g, 454 | 'stub for b was installed' 455 | ) 456 | } else { 457 | t.equal( 458 | fs.readFileSync( 459 | path.join(modP, '.bin', 'b'), 'utf8' 460 | ), 461 | isWindows ? /\$basedir/g : 'world', 462 | 'binary for transitive dep `b` installed at the toplevel' 463 | ) 464 | } 465 | }) 466 | }) 467 | 468 | test('removes failed optional dependencies', t => { 469 | const fixture = new Tacks(Dir({ 470 | 'package.json': File({ 471 | name: pkgName, 472 | version: pkgVersion, 473 | dependencies: { 474 | a: '^1' 475 | }, 476 | optionalDependencies: { 477 | b: '^2' 478 | } 479 | }), 480 | 'package-lock.json': File({ 481 | lockfileVersion: 1, 482 | requires: true, 483 | dependencies: { 484 | a: { 485 | version: '1.0.0', 486 | requires: { 487 | b: '2.0.0', 488 | d: '4.0.0' 489 | } 490 | }, 491 | b: { 492 | version: '2.0.0', 493 | optional: true, 494 | requires: { 495 | c: '3.0.0', 496 | d: '4.0.0' 497 | } 498 | }, 499 | c: { 500 | version: '3.0.0', 501 | optional: true 502 | }, 503 | d: { 504 | version: '4.0.0' 505 | } 506 | } 507 | }) 508 | })) 509 | fixture.create(prefix) 510 | 511 | extract = (name, child, childPath, opts) => { 512 | let files 513 | if (child.name === 'a') { 514 | files = new Tacks(Dir({ 515 | 'package.json': File({ 516 | name: 'a', 517 | version: '1.0.0', 518 | dependencies: { 519 | b: '^2', 520 | d: '^4' 521 | } 522 | }) 523 | })) 524 | } else if (child.name === 'b') { 525 | files = new Tacks(Dir({ 526 | 'package.json': File({ 527 | name: 'b', 528 | version: '2.0.0', 529 | dependencies: { 530 | c: '^3', 531 | d: '^4' 532 | }, 533 | scripts: { 534 | install: 'exit 1' 535 | } 536 | }) 537 | })) 538 | } else if (child.name === 'c') { 539 | files = new Tacks(Dir({ 540 | 'package.json': File({ 541 | name: 'c', 542 | version: '3.0.0' 543 | }) 544 | })) 545 | } else if (child.name === 'd') { 546 | files = new Tacks(Dir({ 547 | 'package.json': File({ 548 | name: 'd', 549 | version: '4.0.0' 550 | }) 551 | })) 552 | } 553 | files.create(childPath) 554 | } 555 | 556 | const originalConsoleLog = console.log 557 | console.log = () => {} 558 | return run().then(details => { 559 | console.log = originalConsoleLog 560 | t.ok(true, 'installer succeeded even with optDep failure') 561 | t.equal(details.pkgCount, 2, 'only successful deps counted') 562 | const modP = path.join(prefix, 'node_modules') 563 | t.ok(fs.statSync(path.join(modP, 'a')), 'dep a is there') 564 | t.ok(fs.statSync(path.join(modP, 'd')), 'transitive dep d is there') 565 | t.throws(() => { 566 | fs.statSync(path.join(prefix, 'node_modules', 'b')) 567 | }, 'failed optional dep b not in node_modules') 568 | t.throws(() => { 569 | fs.statSync(path.join(prefix, 'node_modules', 'c')) 570 | }, 'isolated dependency d of failed dep removed') 571 | }) 572 | }) 573 | 574 | test('don\'t install optional dependencies with no-optional argument', t => { 575 | const fixture = new Tacks(Dir({ 576 | 'package.json': File({ 577 | name: pkgName, 578 | version: pkgVersion, 579 | dependencies: { a: '^1' }, 580 | optionalDependencies: { b: '^1' } 581 | }), 582 | 'package-lock.json': File({ 583 | lockfileVersion: 1, 584 | dependencies: { 585 | a: { version: '1.0.0' }, 586 | b: { version: '1.0.0', optional: true } 587 | } 588 | }) 589 | })) 590 | fixture.create(prefix) 591 | 592 | extract = (name, child, childPath, opts) => { 593 | const files = new Tacks(Dir({ 594 | 'package.json': File({ 595 | name, 596 | version: '1.0.0' 597 | }) 598 | })) 599 | files.create(childPath) 600 | } 601 | 602 | return run({ optional: false }).then(details => { 603 | t.equal(details.pkgCount, 1, 'only prod deps counted') 604 | t.ok(fs.statSync(path.join(prefix, 'node_modules', 'a')), 'dep a is there') 605 | t.throws(() => { 606 | fs.statSync(path.join(prefix, 'node_modules', 'b')) 607 | }, 'optional dep b is not there') 608 | }) 609 | }) 610 | 611 | test('runs lifecycle hooks of packages with env variables', t => { 612 | const originalConsoleLog = console.log 613 | console.log = () => {} 614 | 615 | const fixture = new Tacks(Dir({ 616 | 'package.json': File({ 617 | name: pkgName, 618 | version: pkgVersion, 619 | scripts: { 620 | preinstall: writeEnvScript, 621 | install: writeEnvScript, 622 | postinstall: writeEnvScript, 623 | prepublish: writeEnvScript, 624 | prepare: writeEnvScript 625 | }, 626 | dependencies: { 627 | a: '^1' 628 | } 629 | }), 630 | 'package-lock.json': File({ 631 | dependencies: { 632 | a: { version: '1.0.0' } 633 | }, 634 | lockfileVersion: 1 635 | }) 636 | })) 637 | fixture.create(prefix) 638 | 639 | extract = (name, child, childPath, opts) => { 640 | const files = new Tacks(Dir({ 641 | 'package.json': File({ 642 | name: 'a', 643 | version: '1.0.0', 644 | scripts: { 645 | preinstall: writeEnvScript, 646 | install: writeEnvScript, 647 | postinstall: writeEnvScript, 648 | prepublish: writeEnvScript, 649 | prepare: writeEnvScript 650 | } 651 | }) 652 | })) 653 | files.create(childPath) 654 | } 655 | 656 | return run().then(details => { 657 | t.equal(details.pkgCount, 1) 658 | t.match(fixtureHelper.read(prefix, 'preinstall'), 'preinstall') 659 | t.match(fixtureHelper.read(prefix, 'install'), 'install') 660 | t.match(fixtureHelper.read(prefix, 'postinstall'), 'postinstall') 661 | t.match(fixtureHelper.read(prefix, 'prepublish'), 'prepublish') 662 | t.match(fixtureHelper.read(prefix, 'prepare'), 'prepare') 663 | t.match(fixtureHelper.read(path.join(prefix, 'node_modules', 'a'), 'preinstall'), 'preinstall') 664 | t.match(fixtureHelper.read(path.join(prefix, 'node_modules', 'a'), 'install'), 'install') 665 | t.match(fixtureHelper.read(path.join(prefix, 'node_modules', 'a'), 'postinstall'), 'postinstall') 666 | t.ok(fixtureHelper.missing(path.join(prefix, 'node_modules', 'a'), 'prepublish'), 'prepublish not run on deps') 667 | t.ok(fixtureHelper.missing(path.join(prefix, 'node_modules', 'a'), 'prepare'), 'prepare not run on deps') 668 | 669 | fixtureHelper.teardown() 670 | console.log = originalConsoleLog 671 | }) 672 | }) 673 | 674 | test('skips lifecycle scripts with ignoreScripts is set', t => { 675 | const originalConsoleLog = console.log 676 | console.log = () => {} 677 | 678 | const prefix = fixtureHelper.write(pkgName, { 679 | 'package.json': { 680 | name: pkgName, 681 | version: pkgVersion, 682 | dependencies: { a: '^1' }, 683 | scripts: { 684 | preinstall: writeEnvScript, 685 | install: writeEnvScript, 686 | postinstall: writeEnvScript, 687 | prepublish: writeEnvScript, 688 | prepare: writeEnvScript 689 | } 690 | }, 691 | 'package-lock.json': { 692 | dependencies: { 693 | a: { version: '1.0.0' } 694 | }, 695 | lockfileVersion: 1 696 | } 697 | }) 698 | 699 | extract = fixtureHelper.getWriter(pkgName, { 700 | '/node_modules/a': { 701 | 'package.json': { 702 | name: 'a', 703 | version: '1.0.0', 704 | scripts: { 705 | preinstall: writeEnvScript, 706 | install: writeEnvScript, 707 | postinstall: writeEnvScript, 708 | prepublish: writeEnvScript, 709 | prepare: writeEnvScript 710 | } 711 | } 712 | } 713 | }) 714 | 715 | return run({prefix, 'ignore-scripts': true}).then(details => { 716 | t.equal(details.pkgCount, 1) 717 | t.ok(fixtureHelper.missing(prefix, 'preinstall')) 718 | t.ok(fixtureHelper.missing(prefix, 'install')) 719 | t.ok(fixtureHelper.missing(prefix, 'postinstall')) 720 | t.ok(fixtureHelper.missing(prefix, 'prepublish')) 721 | t.ok(fixtureHelper.missing(prefix, 'prepare')) 722 | t.ok(fixtureHelper.missing(path.join(prefix, 'node_modules', 'a'), 'preinstall')) 723 | t.ok(fixtureHelper.missing(path.join(prefix, 'node_modules', 'a'), 'install')) 724 | t.ok(fixtureHelper.missing(path.join(prefix, 'node_modules', 'a'), 'postinstall')) 725 | t.ok(fixtureHelper.missing(path.join(prefix, 'node_modules', 'a'), 'prepublish')) 726 | t.ok(fixtureHelper.missing(path.join(prefix, 'node_modules', 'a'), 'prepare')) 727 | 728 | fixtureHelper.teardown() 729 | console.log = originalConsoleLog 730 | }) 731 | }) 732 | 733 | test('adds install script when binding.gyp is present', t => { 734 | const originalConsoleLog = console.log 735 | console.log = () => {} 736 | 737 | const fixture = new Tacks(Dir({ 738 | 'package.json': File({ 739 | name: pkgName, 740 | version: pkgVersion, 741 | dependencies: { 742 | a: '^1', 743 | b: '^1' 744 | } 745 | }), 746 | 'package-lock.json': File({ 747 | dependencies: { 748 | a: { version: '1.0.0' }, 749 | b: { version: '1.0.0' } 750 | }, 751 | lockfileVersion: 1 752 | }) 753 | })) 754 | fixture.create(prefix) 755 | 756 | extract = (name, child, childPath, opts) => { 757 | const pkg = (child.name === 'a') 758 | ? { 759 | name: 'a', 760 | version: '1.0.0' 761 | } 762 | : { 763 | name: 'b', 764 | version: '1.0.0', 765 | scripts: { 766 | install: 'exit 0' 767 | } 768 | } 769 | const files = new Tacks(Dir({ 770 | 'package.json': File(pkg), 771 | 'binding.gyp': File({ 772 | 'targets': [ 773 | { 774 | 'target_name': 'hello', 775 | 'type': 'executable', 776 | 'sources': [ 777 | 'hello.cc' 778 | ] 779 | } 780 | ] 781 | }), 782 | 'hello.cc': File( 783 | '#include \n' + 784 | 'int main() {\n' + 785 | 'std::cout << "hello";\n' + 786 | 'return 0;\n' + 787 | '}\n' 788 | ) 789 | })) 790 | files.create(childPath) 791 | } 792 | 793 | return run().then(details => { 794 | t.equal(details.pkgCount, 2) 795 | t.ok(fs.statSync(path.join(prefix, 'node_modules', 'a', 'build', 'Release', 'hello' + binarySuffix)), 'dep a binary is built') 796 | t.throws(() => { 797 | fs.statSync(path.join(prefix, 'node_modules', 'b', 'build', 'Release', 'hello' + binarySuffix)) 798 | }, 'dep b binary is not built') 799 | 800 | fixtureHelper.teardown() 801 | console.log = originalConsoleLog 802 | }) 803 | }) 804 | 805 | test('handles JSON docs that contain a BOM', t => { 806 | t.plan(2) 807 | const Installer = requireInject('../../index.js', {/* just don't want to cache */}) 808 | const bomJSON = 'package-json-with-bom.json' 809 | const bomJSONDir = path.resolve(__dirname, '../lib') 810 | const actualJSON = { 811 | name: 'strong-spawn-npm', 812 | version: '1.0.0', 813 | description: 'Reliably spawn npm™ on any platform', 814 | homepage: 'https://github.com/strongloop/strong-spawn-npm' 815 | } 816 | // ensure that the file does indeed fail to be parsed by JSON.parse 817 | t.throws(() => JSON.parse(fs.readFileSync(path.join(bomJSONDir, bomJSON), 'utf8')), 818 | {message: 'Unexpected token \uFEFF'}) 819 | return Installer._readJson(bomJSONDir, bomJSON).then(obj => t.match(obj, actualJSON)) 820 | }) 821 | -------------------------------------------------------------------------------- /bin/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "cipm", 3 | "version": "1.0.2", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "abbrev": { 8 | "version": "1.1.1", 9 | "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", 10 | "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" 11 | }, 12 | "agent-base": { 13 | "version": "4.2.0", 14 | "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.0.tgz", 15 | "integrity": "sha512-c+R/U5X+2zz2+UCrCFv6odQzJdoqI+YecuhnAJLa1zYaMc13zPfwMwZrr91Pd1DYNo/yPRbiM4WVf9whgwFsIg==", 16 | "requires": { 17 | "es6-promisify": "^5.0.0" 18 | } 19 | }, 20 | "agentkeepalive": { 21 | "version": "3.4.1", 22 | "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.4.1.tgz", 23 | "integrity": "sha512-MPIwsZU9PP9kOrZpyu2042kYA8Fdt/AedQYkYXucHgF9QoD9dXVp0ypuGnHXSR0hTstBxdt85Xkh4JolYfK5wg==", 24 | "requires": { 25 | "humanize-ms": "^1.2.1" 26 | } 27 | }, 28 | "ajv": { 29 | "version": "5.5.2", 30 | "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", 31 | "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", 32 | "requires": { 33 | "co": "^4.6.0", 34 | "fast-deep-equal": "^1.0.0", 35 | "fast-json-stable-stringify": "^2.0.0", 36 | "json-schema-traverse": "^0.3.0" 37 | } 38 | }, 39 | "ansi-regex": { 40 | "version": "2.1.1", 41 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 42 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" 43 | }, 44 | "aproba": { 45 | "version": "1.2.0", 46 | "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", 47 | "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" 48 | }, 49 | "are-we-there-yet": { 50 | "version": "1.1.4", 51 | "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", 52 | "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", 53 | "requires": { 54 | "delegates": "^1.0.0", 55 | "readable-stream": "^2.0.6" 56 | } 57 | }, 58 | "asn1": { 59 | "version": "0.2.3", 60 | "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", 61 | "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" 62 | }, 63 | "assert-plus": { 64 | "version": "1.0.0", 65 | "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", 66 | "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" 67 | }, 68 | "asynckit": { 69 | "version": "0.4.0", 70 | "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", 71 | "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" 72 | }, 73 | "aws-sign2": { 74 | "version": "0.7.0", 75 | "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", 76 | "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" 77 | }, 78 | "aws4": { 79 | "version": "1.7.0", 80 | "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz", 81 | "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==" 82 | }, 83 | "balanced-match": { 84 | "version": "1.0.0", 85 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 86 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" 87 | }, 88 | "bcrypt-pbkdf": { 89 | "version": "1.0.1", 90 | "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", 91 | "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", 92 | "optional": true, 93 | "requires": { 94 | "tweetnacl": "^0.14.3" 95 | } 96 | }, 97 | "bin-links": { 98 | "version": "1.1.2", 99 | "resolved": "https://registry.npmjs.org/bin-links/-/bin-links-1.1.2.tgz", 100 | "integrity": "sha512-8eEHVgYP03nILphilltWjeIjMbKyJo3wvp9K816pHbhP301ismzw15mxAAEVQ/USUwcP++1uNrbERbp8lOA6Fg==", 101 | "requires": { 102 | "bluebird": "^3.5.0", 103 | "cmd-shim": "^2.0.2", 104 | "gentle-fs": "^2.0.0", 105 | "graceful-fs": "^4.1.11", 106 | "write-file-atomic": "^2.3.0" 107 | } 108 | }, 109 | "block-stream": { 110 | "version": "0.0.9", 111 | "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", 112 | "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", 113 | "requires": { 114 | "inherits": "~2.0.0" 115 | } 116 | }, 117 | "bluebird": { 118 | "version": "3.5.1", 119 | "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", 120 | "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==" 121 | }, 122 | "brace-expansion": { 123 | "version": "1.1.11", 124 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 125 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 126 | "requires": { 127 | "balanced-match": "^1.0.0", 128 | "concat-map": "0.0.1" 129 | } 130 | }, 131 | "buffer-from": { 132 | "version": "1.0.0", 133 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz", 134 | "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==" 135 | }, 136 | "builtin-modules": { 137 | "version": "1.1.1", 138 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 139 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=" 140 | }, 141 | "builtins": { 142 | "version": "1.0.3", 143 | "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", 144 | "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=" 145 | }, 146 | "byline": { 147 | "version": "5.0.0", 148 | "resolved": "https://registry.npmjs.org/byline/-/byline-5.0.0.tgz", 149 | "integrity": "sha1-dBxSFkaOrcRXsDQQEYrXfejB3bE=" 150 | }, 151 | "cacache": { 152 | "version": "11.0.2", 153 | "resolved": "https://registry.npmjs.org/cacache/-/cacache-11.0.2.tgz", 154 | "integrity": "sha512-hMiz7LN4w8sdfmKsvNs80ao/vf2JCGWWdpu95JyY90AJZRbZJmgE71dCefRiNf8OCqiZQDcUBfYiLlUNu4/j5A==", 155 | "requires": { 156 | "bluebird": "^3.5.1", 157 | "chownr": "^1.0.1", 158 | "figgy-pudding": "^3.1.0", 159 | "glob": "^7.1.2", 160 | "graceful-fs": "^4.1.11", 161 | "lru-cache": "^4.1.2", 162 | "mississippi": "^3.0.0", 163 | "mkdirp": "^0.5.1", 164 | "move-concurrently": "^1.0.1", 165 | "promise-inflight": "^1.0.1", 166 | "rimraf": "^2.6.2", 167 | "ssri": "^6.0.0", 168 | "unique-filename": "^1.1.0", 169 | "y18n": "^4.0.0" 170 | } 171 | }, 172 | "camelcase": { 173 | "version": "4.1.0", 174 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", 175 | "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" 176 | }, 177 | "caseless": { 178 | "version": "0.12.0", 179 | "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", 180 | "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" 181 | }, 182 | "chownr": { 183 | "version": "1.0.1", 184 | "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.0.1.tgz", 185 | "integrity": "sha1-4qdQQqlVGQi+vSW4Uj1fl2nXkYE=" 186 | }, 187 | "cliui": { 188 | "version": "4.1.0", 189 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", 190 | "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", 191 | "requires": { 192 | "string-width": "^2.1.1", 193 | "strip-ansi": "^4.0.0", 194 | "wrap-ansi": "^2.0.0" 195 | }, 196 | "dependencies": { 197 | "ansi-regex": { 198 | "version": "3.0.0", 199 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 200 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" 201 | }, 202 | "is-fullwidth-code-point": { 203 | "version": "2.0.0", 204 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 205 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 206 | }, 207 | "string-width": { 208 | "version": "2.1.1", 209 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 210 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 211 | "requires": { 212 | "is-fullwidth-code-point": "^2.0.0", 213 | "strip-ansi": "^4.0.0" 214 | } 215 | }, 216 | "strip-ansi": { 217 | "version": "4.0.0", 218 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 219 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 220 | "requires": { 221 | "ansi-regex": "^3.0.0" 222 | } 223 | } 224 | } 225 | }, 226 | "cmd-shim": { 227 | "version": "2.0.2", 228 | "resolved": "https://registry.npmjs.org/cmd-shim/-/cmd-shim-2.0.2.tgz", 229 | "integrity": "sha1-b8vamUg6j9FdfTChlspp1oii79s=", 230 | "requires": { 231 | "graceful-fs": "^4.1.2", 232 | "mkdirp": "~0.5.0" 233 | } 234 | }, 235 | "co": { 236 | "version": "4.6.0", 237 | "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", 238 | "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=" 239 | }, 240 | "code-point-at": { 241 | "version": "1.1.0", 242 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", 243 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" 244 | }, 245 | "combined-stream": { 246 | "version": "1.0.6", 247 | "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", 248 | "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", 249 | "requires": { 250 | "delayed-stream": "~1.0.0" 251 | } 252 | }, 253 | "concat-map": { 254 | "version": "0.0.1", 255 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 256 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 257 | }, 258 | "concat-stream": { 259 | "version": "1.6.2", 260 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", 261 | "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", 262 | "requires": { 263 | "buffer-from": "^1.0.0", 264 | "inherits": "^2.0.3", 265 | "readable-stream": "^2.2.2", 266 | "typedarray": "^0.0.6" 267 | } 268 | }, 269 | "console-control-strings": { 270 | "version": "1.1.0", 271 | "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", 272 | "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=" 273 | }, 274 | "copy-concurrently": { 275 | "version": "1.0.5", 276 | "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", 277 | "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", 278 | "requires": { 279 | "aproba": "^1.1.1", 280 | "fs-write-stream-atomic": "^1.0.8", 281 | "iferr": "^0.1.5", 282 | "mkdirp": "^0.5.1", 283 | "rimraf": "^2.5.4", 284 | "run-queue": "^1.0.0" 285 | } 286 | }, 287 | "core-util-is": { 288 | "version": "1.0.2", 289 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 290 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 291 | }, 292 | "cross-spawn": { 293 | "version": "5.1.0", 294 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", 295 | "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", 296 | "requires": { 297 | "lru-cache": "^4.0.1", 298 | "shebang-command": "^1.2.0", 299 | "which": "^1.2.9" 300 | } 301 | }, 302 | "cyclist": { 303 | "version": "0.2.2", 304 | "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz", 305 | "integrity": "sha1-GzN5LhHpFKL9bW7WRHRkRE5fpkA=" 306 | }, 307 | "dashdash": { 308 | "version": "1.14.1", 309 | "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", 310 | "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", 311 | "requires": { 312 | "assert-plus": "^1.0.0" 313 | } 314 | }, 315 | "debug": { 316 | "version": "3.1.0", 317 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 318 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 319 | "requires": { 320 | "ms": "2.0.0" 321 | }, 322 | "dependencies": { 323 | "ms": { 324 | "version": "2.0.0", 325 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 326 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 327 | } 328 | } 329 | }, 330 | "decamelize": { 331 | "version": "1.2.0", 332 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 333 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 334 | }, 335 | "delayed-stream": { 336 | "version": "1.0.0", 337 | "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", 338 | "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" 339 | }, 340 | "delegates": { 341 | "version": "1.0.0", 342 | "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", 343 | "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" 344 | }, 345 | "duplexify": { 346 | "version": "3.6.0", 347 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.6.0.tgz", 348 | "integrity": "sha512-fO3Di4tBKJpYTFHAxTU00BcfWMY9w24r/x21a6rZRbsD/ToUgGxsMbiGRmB7uVAXeGKXD9MwiLZa5E97EVgIRQ==", 349 | "requires": { 350 | "end-of-stream": "^1.0.0", 351 | "inherits": "^2.0.1", 352 | "readable-stream": "^2.0.0", 353 | "stream-shift": "^1.0.0" 354 | } 355 | }, 356 | "ecc-jsbn": { 357 | "version": "0.1.1", 358 | "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", 359 | "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", 360 | "optional": true, 361 | "requires": { 362 | "jsbn": "~0.1.0" 363 | } 364 | }, 365 | "encoding": { 366 | "version": "0.1.12", 367 | "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", 368 | "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", 369 | "requires": { 370 | "iconv-lite": "~0.4.13" 371 | } 372 | }, 373 | "end-of-stream": { 374 | "version": "1.4.1", 375 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", 376 | "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", 377 | "requires": { 378 | "once": "^1.4.0" 379 | } 380 | }, 381 | "err-code": { 382 | "version": "1.1.2", 383 | "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", 384 | "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=" 385 | }, 386 | "errno": { 387 | "version": "0.1.7", 388 | "resolved": "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz", 389 | "integrity": "sha512-MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==", 390 | "requires": { 391 | "prr": "~1.0.1" 392 | } 393 | }, 394 | "es6-promise": { 395 | "version": "4.2.4", 396 | "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz", 397 | "integrity": "sha512-/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==" 398 | }, 399 | "es6-promisify": { 400 | "version": "5.0.0", 401 | "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", 402 | "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", 403 | "requires": { 404 | "es6-promise": "^4.0.3" 405 | } 406 | }, 407 | "execa": { 408 | "version": "0.7.0", 409 | "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", 410 | "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", 411 | "requires": { 412 | "cross-spawn": "^5.0.1", 413 | "get-stream": "^3.0.0", 414 | "is-stream": "^1.1.0", 415 | "npm-run-path": "^2.0.0", 416 | "p-finally": "^1.0.0", 417 | "signal-exit": "^3.0.0", 418 | "strip-eof": "^1.0.0" 419 | } 420 | }, 421 | "extend": { 422 | "version": "3.0.1", 423 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", 424 | "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" 425 | }, 426 | "extsprintf": { 427 | "version": "1.3.0", 428 | "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", 429 | "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" 430 | }, 431 | "fast-deep-equal": { 432 | "version": "1.1.0", 433 | "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz", 434 | "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=" 435 | }, 436 | "fast-json-stable-stringify": { 437 | "version": "2.0.0", 438 | "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", 439 | "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" 440 | }, 441 | "figgy-pudding": { 442 | "version": "3.1.0", 443 | "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.1.0.tgz", 444 | "integrity": "sha512-Gi2vIue0ec6P/7LNpueGhLuvfF2ztuterl8YFBQn1yKgIS46noGxCbi+vviPdObNYtgUSh5FpHy5q0Cw9XhxKQ==" 445 | }, 446 | "find-npm-prefix": { 447 | "version": "1.0.2", 448 | "resolved": "https://registry.npmjs.org/find-npm-prefix/-/find-npm-prefix-1.0.2.tgz", 449 | "integrity": "sha512-KEftzJ+H90x6pcKtdXZEPsQse8/y/UnvzRKrOSQFprnrGaFuJ62fVkP34Iu2IYuMvyauCyoLTNkJZgrrGA2wkA==" 450 | }, 451 | "find-up": { 452 | "version": "2.1.0", 453 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", 454 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", 455 | "requires": { 456 | "locate-path": "^2.0.0" 457 | } 458 | }, 459 | "flush-write-stream": { 460 | "version": "1.0.3", 461 | "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz", 462 | "integrity": "sha512-calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==", 463 | "requires": { 464 | "inherits": "^2.0.1", 465 | "readable-stream": "^2.0.4" 466 | } 467 | }, 468 | "forever-agent": { 469 | "version": "0.6.1", 470 | "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", 471 | "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" 472 | }, 473 | "form-data": { 474 | "version": "2.3.2", 475 | "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", 476 | "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", 477 | "requires": { 478 | "asynckit": "^0.4.0", 479 | "combined-stream": "1.0.6", 480 | "mime-types": "^2.1.12" 481 | } 482 | }, 483 | "from2": { 484 | "version": "2.3.0", 485 | "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", 486 | "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", 487 | "requires": { 488 | "inherits": "^2.0.1", 489 | "readable-stream": "^2.0.0" 490 | } 491 | }, 492 | "fs-minipass": { 493 | "version": "1.2.5", 494 | "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", 495 | "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", 496 | "requires": { 497 | "minipass": "^2.2.1" 498 | } 499 | }, 500 | "fs-vacuum": { 501 | "version": "1.2.10", 502 | "resolved": "https://registry.npmjs.org/fs-vacuum/-/fs-vacuum-1.2.10.tgz", 503 | "integrity": "sha1-t2Kb7AekAxolSP35n17PHMizHjY=", 504 | "requires": { 505 | "graceful-fs": "^4.1.2", 506 | "path-is-inside": "^1.0.1", 507 | "rimraf": "^2.5.2" 508 | } 509 | }, 510 | "fs-write-stream-atomic": { 511 | "version": "1.0.10", 512 | "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", 513 | "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", 514 | "requires": { 515 | "graceful-fs": "^4.1.2", 516 | "iferr": "^0.1.5", 517 | "imurmurhash": "^0.1.4", 518 | "readable-stream": "1 || 2" 519 | } 520 | }, 521 | "fs.realpath": { 522 | "version": "1.0.0", 523 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 524 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 525 | }, 526 | "fstream": { 527 | "version": "1.0.11", 528 | "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", 529 | "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", 530 | "requires": { 531 | "graceful-fs": "^4.1.2", 532 | "inherits": "~2.0.0", 533 | "mkdirp": ">=0.5 0", 534 | "rimraf": "2" 535 | } 536 | }, 537 | "gauge": { 538 | "version": "2.7.4", 539 | "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", 540 | "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", 541 | "requires": { 542 | "aproba": "^1.0.3", 543 | "console-control-strings": "^1.0.0", 544 | "has-unicode": "^2.0.0", 545 | "object-assign": "^4.1.0", 546 | "signal-exit": "^3.0.0", 547 | "string-width": "^1.0.1", 548 | "strip-ansi": "^3.0.1", 549 | "wide-align": "^1.1.0" 550 | } 551 | }, 552 | "genfun": { 553 | "version": "4.0.1", 554 | "resolved": "https://registry.npmjs.org/genfun/-/genfun-4.0.1.tgz", 555 | "integrity": "sha1-7RAEHy5KfxsKOEZtF6XD4n3x38E=" 556 | }, 557 | "gentle-fs": { 558 | "version": "2.0.1", 559 | "resolved": "https://registry.npmjs.org/gentle-fs/-/gentle-fs-2.0.1.tgz", 560 | "integrity": "sha512-cEng5+3fuARewXktTEGbwsktcldA+YsnUEaXZwcK/3pjSE1X9ObnTs+/8rYf8s+RnIcQm2D5x3rwpN7Zom8Bew==", 561 | "requires": { 562 | "aproba": "^1.1.2", 563 | "fs-vacuum": "^1.2.10", 564 | "graceful-fs": "^4.1.11", 565 | "iferr": "^0.1.5", 566 | "mkdirp": "^0.5.1", 567 | "path-is-inside": "^1.0.2", 568 | "read-cmd-shim": "^1.0.1", 569 | "slide": "^1.1.6" 570 | } 571 | }, 572 | "get-caller-file": { 573 | "version": "1.0.2", 574 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", 575 | "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=" 576 | }, 577 | "get-stream": { 578 | "version": "3.0.0", 579 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", 580 | "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=" 581 | }, 582 | "getpass": { 583 | "version": "0.1.7", 584 | "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", 585 | "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", 586 | "requires": { 587 | "assert-plus": "^1.0.0" 588 | } 589 | }, 590 | "glob": { 591 | "version": "7.1.2", 592 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 593 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 594 | "requires": { 595 | "fs.realpath": "^1.0.0", 596 | "inflight": "^1.0.4", 597 | "inherits": "2", 598 | "minimatch": "^3.0.4", 599 | "once": "^1.3.0", 600 | "path-is-absolute": "^1.0.0" 601 | } 602 | }, 603 | "graceful-fs": { 604 | "version": "4.1.11", 605 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", 606 | "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" 607 | }, 608 | "har-schema": { 609 | "version": "2.0.0", 610 | "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", 611 | "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" 612 | }, 613 | "har-validator": { 614 | "version": "5.0.3", 615 | "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", 616 | "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", 617 | "requires": { 618 | "ajv": "^5.1.0", 619 | "har-schema": "^2.0.0" 620 | } 621 | }, 622 | "has-unicode": { 623 | "version": "2.0.1", 624 | "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", 625 | "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" 626 | }, 627 | "hosted-git-info": { 628 | "version": "2.6.0", 629 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.6.0.tgz", 630 | "integrity": "sha512-lIbgIIQA3lz5XaB6vxakj6sDHADJiZadYEJB+FgA+C4nubM1NwcuvUr9EJPmnH1skZqpqUzWborWo8EIUi0Sdw==" 631 | }, 632 | "http-cache-semantics": { 633 | "version": "3.8.1", 634 | "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", 635 | "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==" 636 | }, 637 | "http-proxy-agent": { 638 | "version": "2.1.0", 639 | "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", 640 | "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", 641 | "requires": { 642 | "agent-base": "4", 643 | "debug": "3.1.0" 644 | } 645 | }, 646 | "http-signature": { 647 | "version": "1.2.0", 648 | "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", 649 | "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", 650 | "requires": { 651 | "assert-plus": "^1.0.0", 652 | "jsprim": "^1.2.2", 653 | "sshpk": "^1.7.0" 654 | } 655 | }, 656 | "https-proxy-agent": { 657 | "version": "2.2.1", 658 | "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.1.tgz", 659 | "integrity": "sha512-HPCTS1LW51bcyMYbxUIOO4HEOlQ1/1qRaFWcyxvwaqUS9TY88aoEuHUY33kuAh1YhVVaDQhLZsnPd+XNARWZlQ==", 660 | "requires": { 661 | "agent-base": "^4.1.0", 662 | "debug": "^3.1.0" 663 | } 664 | }, 665 | "humanize-ms": { 666 | "version": "1.2.1", 667 | "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", 668 | "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", 669 | "requires": { 670 | "ms": "^2.0.0" 671 | } 672 | }, 673 | "iconv-lite": { 674 | "version": "0.4.23", 675 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz", 676 | "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==", 677 | "requires": { 678 | "safer-buffer": ">= 2.1.2 < 3" 679 | } 680 | }, 681 | "iferr": { 682 | "version": "0.1.5", 683 | "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", 684 | "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" 685 | }, 686 | "ignore-walk": { 687 | "version": "3.0.1", 688 | "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", 689 | "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", 690 | "requires": { 691 | "minimatch": "^3.0.4" 692 | } 693 | }, 694 | "imurmurhash": { 695 | "version": "0.1.4", 696 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", 697 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" 698 | }, 699 | "inflight": { 700 | "version": "1.0.6", 701 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 702 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 703 | "requires": { 704 | "once": "^1.3.0", 705 | "wrappy": "1" 706 | } 707 | }, 708 | "inherits": { 709 | "version": "2.0.3", 710 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 711 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 712 | }, 713 | "invert-kv": { 714 | "version": "1.0.0", 715 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", 716 | "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" 717 | }, 718 | "ip": { 719 | "version": "1.1.5", 720 | "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", 721 | "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" 722 | }, 723 | "is-builtin-module": { 724 | "version": "1.0.0", 725 | "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", 726 | "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", 727 | "requires": { 728 | "builtin-modules": "^1.0.0" 729 | } 730 | }, 731 | "is-fullwidth-code-point": { 732 | "version": "1.0.0", 733 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", 734 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", 735 | "requires": { 736 | "number-is-nan": "^1.0.0" 737 | } 738 | }, 739 | "is-stream": { 740 | "version": "1.1.0", 741 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 742 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" 743 | }, 744 | "is-typedarray": { 745 | "version": "1.0.0", 746 | "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", 747 | "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" 748 | }, 749 | "isarray": { 750 | "version": "1.0.0", 751 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 752 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 753 | }, 754 | "isexe": { 755 | "version": "2.0.0", 756 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 757 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 758 | }, 759 | "isstream": { 760 | "version": "0.1.2", 761 | "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", 762 | "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" 763 | }, 764 | "jsbn": { 765 | "version": "0.1.1", 766 | "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", 767 | "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", 768 | "optional": true 769 | }, 770 | "json-parse-better-errors": { 771 | "version": "1.0.2", 772 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", 773 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" 774 | }, 775 | "json-schema": { 776 | "version": "0.2.3", 777 | "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", 778 | "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" 779 | }, 780 | "json-schema-traverse": { 781 | "version": "0.3.1", 782 | "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", 783 | "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=" 784 | }, 785 | "json-stringify-safe": { 786 | "version": "5.0.1", 787 | "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", 788 | "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" 789 | }, 790 | "jsprim": { 791 | "version": "1.4.1", 792 | "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", 793 | "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", 794 | "requires": { 795 | "assert-plus": "1.0.0", 796 | "extsprintf": "1.3.0", 797 | "json-schema": "0.2.3", 798 | "verror": "1.10.0" 799 | } 800 | }, 801 | "lcid": { 802 | "version": "1.0.0", 803 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", 804 | "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", 805 | "requires": { 806 | "invert-kv": "^1.0.0" 807 | } 808 | }, 809 | "libcipm": { 810 | "version": "2.0.0", 811 | "resolved": "https://registry.npmjs.org/libcipm/-/libcipm-2.0.0.tgz", 812 | "integrity": "sha512-yTWR7Ch7Mg891KZj+1yhcWhztO6tuAcBLdmCvBXv2pbCzV5/DOEDjDQdZmmYn5mFwI96kOSu+OIMRTmLsxrNZw==", 813 | "requires": { 814 | "bin-links": "^1.1.2", 815 | "bluebird": "^3.5.1", 816 | "find-npm-prefix": "^1.0.2", 817 | "graceful-fs": "^4.1.11", 818 | "lock-verify": "^2.0.2", 819 | "npm-lifecycle": "^2.0.3", 820 | "npm-logical-tree": "^1.2.1", 821 | "npm-package-arg": "^6.1.0", 822 | "pacote": "^8.1.6", 823 | "protoduck": "^5.0.0", 824 | "read-package-json": "^2.0.13", 825 | "rimraf": "^2.6.2", 826 | "worker-farm": "^1.6.0" 827 | } 828 | }, 829 | "locate-path": { 830 | "version": "2.0.0", 831 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", 832 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", 833 | "requires": { 834 | "p-locate": "^2.0.0", 835 | "path-exists": "^3.0.0" 836 | } 837 | }, 838 | "lock-verify": { 839 | "version": "2.0.2", 840 | "resolved": "https://registry.npmjs.org/lock-verify/-/lock-verify-2.0.2.tgz", 841 | "integrity": "sha512-QNVwK0EGZBS4R3YQ7F1Ox8p41Po9VGl2QG/2GsuvTbkJZYSsPeWHKMbbH6iZMCHWSMww5nrJroZYnGzI4cePuw==", 842 | "requires": { 843 | "npm-package-arg": "^5.1.2 || 6", 844 | "semver": "^5.4.1" 845 | } 846 | }, 847 | "lru-cache": { 848 | "version": "4.1.3", 849 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz", 850 | "integrity": "sha512-fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==", 851 | "requires": { 852 | "pseudomap": "^1.0.2", 853 | "yallist": "^2.1.2" 854 | } 855 | }, 856 | "make-fetch-happen": { 857 | "version": "4.0.1", 858 | "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-4.0.1.tgz", 859 | "integrity": "sha512-7R5ivfy9ilRJ1EMKIOziwrns9fGeAD4bAha8EB7BIiBBLHm2KeTUGCrICFt2rbHfzheTLynv50GnNTK1zDTrcQ==", 860 | "requires": { 861 | "agentkeepalive": "^3.4.1", 862 | "cacache": "^11.0.1", 863 | "http-cache-semantics": "^3.8.1", 864 | "http-proxy-agent": "^2.1.0", 865 | "https-proxy-agent": "^2.2.1", 866 | "lru-cache": "^4.1.2", 867 | "mississippi": "^3.0.0", 868 | "node-fetch-npm": "^2.0.2", 869 | "promise-retry": "^1.1.1", 870 | "socks-proxy-agent": "^4.0.0", 871 | "ssri": "^6.0.0" 872 | } 873 | }, 874 | "mem": { 875 | "version": "1.1.0", 876 | "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", 877 | "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", 878 | "requires": { 879 | "mimic-fn": "^1.0.0" 880 | } 881 | }, 882 | "mime-db": { 883 | "version": "1.33.0", 884 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", 885 | "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==" 886 | }, 887 | "mime-types": { 888 | "version": "2.1.18", 889 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", 890 | "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", 891 | "requires": { 892 | "mime-db": "~1.33.0" 893 | } 894 | }, 895 | "mimic-fn": { 896 | "version": "1.2.0", 897 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", 898 | "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" 899 | }, 900 | "minimatch": { 901 | "version": "3.0.4", 902 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 903 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 904 | "requires": { 905 | "brace-expansion": "^1.1.7" 906 | } 907 | }, 908 | "minimist": { 909 | "version": "0.0.8", 910 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 911 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" 912 | }, 913 | "minipass": { 914 | "version": "2.3.3", 915 | "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.3.tgz", 916 | "integrity": "sha512-/jAn9/tEX4gnpyRATxgHEOV6xbcyxgT7iUnxo9Y3+OB0zX00TgKIv/2FZCf5brBbICcwbLqVv2ImjvWWrQMSYw==", 917 | "requires": { 918 | "safe-buffer": "^5.1.2", 919 | "yallist": "^3.0.0" 920 | }, 921 | "dependencies": { 922 | "safe-buffer": { 923 | "version": "5.1.2", 924 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 925 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 926 | }, 927 | "yallist": { 928 | "version": "3.0.2", 929 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", 930 | "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=" 931 | } 932 | } 933 | }, 934 | "minizlib": { 935 | "version": "1.1.0", 936 | "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz", 937 | "integrity": "sha512-4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==", 938 | "requires": { 939 | "minipass": "^2.2.1" 940 | } 941 | }, 942 | "mississippi": { 943 | "version": "3.0.0", 944 | "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", 945 | "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", 946 | "requires": { 947 | "concat-stream": "^1.5.0", 948 | "duplexify": "^3.4.2", 949 | "end-of-stream": "^1.1.0", 950 | "flush-write-stream": "^1.0.0", 951 | "from2": "^2.1.0", 952 | "parallel-transform": "^1.1.0", 953 | "pump": "^3.0.0", 954 | "pumpify": "^1.3.3", 955 | "stream-each": "^1.1.0", 956 | "through2": "^2.0.0" 957 | } 958 | }, 959 | "mkdirp": { 960 | "version": "0.5.1", 961 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 962 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 963 | "requires": { 964 | "minimist": "0.0.8" 965 | } 966 | }, 967 | "move-concurrently": { 968 | "version": "1.0.1", 969 | "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", 970 | "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", 971 | "requires": { 972 | "aproba": "^1.1.1", 973 | "copy-concurrently": "^1.0.0", 974 | "fs-write-stream-atomic": "^1.0.8", 975 | "mkdirp": "^0.5.1", 976 | "rimraf": "^2.5.4", 977 | "run-queue": "^1.0.3" 978 | } 979 | }, 980 | "ms": { 981 | "version": "2.1.1", 982 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 983 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 984 | }, 985 | "node-fetch-npm": { 986 | "version": "2.0.2", 987 | "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.2.tgz", 988 | "integrity": "sha512-nJIxm1QmAj4v3nfCvEeCrYSoVwXyxLnaPBK5W1W5DGEJwjlKuC2VEUycGw5oxk+4zZahRrB84PUJJgEmhFTDFw==", 989 | "requires": { 990 | "encoding": "^0.1.11", 991 | "json-parse-better-errors": "^1.0.0", 992 | "safe-buffer": "^5.1.1" 993 | } 994 | }, 995 | "node-gyp": { 996 | "version": "3.6.2", 997 | "resolved": "https://registry.npmjs.org/node-gyp/-/node-gyp-3.6.2.tgz", 998 | "integrity": "sha1-m/vlRWIoYoSDjnUOrAUpWFP6HGA=", 999 | "requires": { 1000 | "fstream": "^1.0.0", 1001 | "glob": "^7.0.3", 1002 | "graceful-fs": "^4.1.2", 1003 | "minimatch": "^3.0.2", 1004 | "mkdirp": "^0.5.0", 1005 | "nopt": "2 || 3", 1006 | "npmlog": "0 || 1 || 2 || 3 || 4", 1007 | "osenv": "0", 1008 | "request": "2", 1009 | "rimraf": "2", 1010 | "semver": "~5.3.0", 1011 | "tar": "^2.0.0", 1012 | "which": "1" 1013 | }, 1014 | "dependencies": { 1015 | "semver": { 1016 | "version": "5.3.0", 1017 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", 1018 | "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=" 1019 | } 1020 | } 1021 | }, 1022 | "nopt": { 1023 | "version": "3.0.6", 1024 | "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", 1025 | "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", 1026 | "requires": { 1027 | "abbrev": "1" 1028 | } 1029 | }, 1030 | "normalize-package-data": { 1031 | "version": "2.4.0", 1032 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", 1033 | "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", 1034 | "requires": { 1035 | "hosted-git-info": "^2.1.4", 1036 | "is-builtin-module": "^1.0.0", 1037 | "semver": "2 || 3 || 4 || 5", 1038 | "validate-npm-package-license": "^3.0.1" 1039 | } 1040 | }, 1041 | "npm-bundled": { 1042 | "version": "1.0.3", 1043 | "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.3.tgz", 1044 | "integrity": "sha512-ByQ3oJ/5ETLyglU2+8dBObvhfWXX8dtPZDMePCahptliFX2iIuhyEszyFk401PZUNQH20vvdW5MLjJxkwU80Ow==" 1045 | }, 1046 | "npm-lifecycle": { 1047 | "version": "2.0.3", 1048 | "resolved": "https://registry.npmjs.org/npm-lifecycle/-/npm-lifecycle-2.0.3.tgz", 1049 | "integrity": "sha512-0U4Iim5ix2NHUT672G7FBpldJX0N2xKBjJqRTAzioEJjb6I6KpQXq+y1sB5EDSjKaAX8VCC9qPK31Jy+p3ix5A==", 1050 | "requires": { 1051 | "byline": "^5.0.0", 1052 | "graceful-fs": "^4.1.11", 1053 | "node-gyp": "^3.6.2", 1054 | "resolve-from": "^4.0.0", 1055 | "slide": "^1.1.6", 1056 | "uid-number": "0.0.6", 1057 | "umask": "^1.1.0", 1058 | "which": "^1.3.0" 1059 | } 1060 | }, 1061 | "npm-logical-tree": { 1062 | "version": "1.2.1", 1063 | "resolved": "https://registry.npmjs.org/npm-logical-tree/-/npm-logical-tree-1.2.1.tgz", 1064 | "integrity": "sha512-AJI/qxDB2PWI4LG1CYN579AY1vCiNyWfkiquCsJWqntRu/WwimVrC8yXeILBFHDwxfOejxewlmnvW9XXjMlYIg==" 1065 | }, 1066 | "npm-package-arg": { 1067 | "version": "6.1.0", 1068 | "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.0.tgz", 1069 | "integrity": "sha512-zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==", 1070 | "requires": { 1071 | "hosted-git-info": "^2.6.0", 1072 | "osenv": "^0.1.5", 1073 | "semver": "^5.5.0", 1074 | "validate-npm-package-name": "^3.0.0" 1075 | } 1076 | }, 1077 | "npm-packlist": { 1078 | "version": "1.1.10", 1079 | "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.1.10.tgz", 1080 | "integrity": "sha512-AQC0Dyhzn4EiYEfIUjCdMl0JJ61I2ER9ukf/sLxJUcZHfo+VyEfz2rMJgLZSS1v30OxPQe1cN0LZA1xbcaVfWA==", 1081 | "requires": { 1082 | "ignore-walk": "^3.0.1", 1083 | "npm-bundled": "^1.0.1" 1084 | } 1085 | }, 1086 | "npm-pick-manifest": { 1087 | "version": "2.1.0", 1088 | "resolved": "https://registry.npmjs.org/npm-pick-manifest/-/npm-pick-manifest-2.1.0.tgz", 1089 | "integrity": "sha512-q9zLP8cTr8xKPmMZN3naxp1k/NxVFsjxN6uWuO1tiw9gxg7wZWQ/b5UTfzD0ANw2q1lQxdLKTeCCksq+bPSgbQ==", 1090 | "requires": { 1091 | "npm-package-arg": "^6.0.0", 1092 | "semver": "^5.4.1" 1093 | } 1094 | }, 1095 | "npm-run-path": { 1096 | "version": "2.0.2", 1097 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", 1098 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", 1099 | "requires": { 1100 | "path-key": "^2.0.0" 1101 | } 1102 | }, 1103 | "npmlog": { 1104 | "version": "4.1.2", 1105 | "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", 1106 | "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", 1107 | "requires": { 1108 | "are-we-there-yet": "~1.1.2", 1109 | "console-control-strings": "~1.1.0", 1110 | "gauge": "~2.7.3", 1111 | "set-blocking": "~2.0.0" 1112 | } 1113 | }, 1114 | "number-is-nan": { 1115 | "version": "1.0.1", 1116 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", 1117 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" 1118 | }, 1119 | "oauth-sign": { 1120 | "version": "0.8.2", 1121 | "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", 1122 | "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" 1123 | }, 1124 | "object-assign": { 1125 | "version": "4.1.1", 1126 | "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", 1127 | "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" 1128 | }, 1129 | "once": { 1130 | "version": "1.4.0", 1131 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1132 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1133 | "requires": { 1134 | "wrappy": "1" 1135 | } 1136 | }, 1137 | "os-homedir": { 1138 | "version": "1.0.2", 1139 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", 1140 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" 1141 | }, 1142 | "os-locale": { 1143 | "version": "2.1.0", 1144 | "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", 1145 | "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", 1146 | "requires": { 1147 | "execa": "^0.7.0", 1148 | "lcid": "^1.0.0", 1149 | "mem": "^1.1.0" 1150 | } 1151 | }, 1152 | "os-tmpdir": { 1153 | "version": "1.0.2", 1154 | "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", 1155 | "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" 1156 | }, 1157 | "osenv": { 1158 | "version": "0.1.5", 1159 | "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", 1160 | "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", 1161 | "requires": { 1162 | "os-homedir": "^1.0.0", 1163 | "os-tmpdir": "^1.0.0" 1164 | } 1165 | }, 1166 | "p-finally": { 1167 | "version": "1.0.0", 1168 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 1169 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" 1170 | }, 1171 | "p-limit": { 1172 | "version": "1.2.0", 1173 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", 1174 | "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", 1175 | "requires": { 1176 | "p-try": "^1.0.0" 1177 | } 1178 | }, 1179 | "p-locate": { 1180 | "version": "2.0.0", 1181 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", 1182 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", 1183 | "requires": { 1184 | "p-limit": "^1.1.0" 1185 | } 1186 | }, 1187 | "p-try": { 1188 | "version": "1.0.0", 1189 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", 1190 | "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" 1191 | }, 1192 | "pacote": { 1193 | "version": "8.1.6", 1194 | "resolved": "https://registry.npmjs.org/pacote/-/pacote-8.1.6.tgz", 1195 | "integrity": "sha512-wTOOfpaAQNEQNtPEx92x9Y9kRWVu45v583XT8x2oEV2xRB74+xdqMZIeGW4uFvAyZdmSBtye+wKdyyLaT8pcmw==", 1196 | "requires": { 1197 | "bluebird": "^3.5.1", 1198 | "cacache": "^11.0.2", 1199 | "get-stream": "^3.0.0", 1200 | "glob": "^7.1.2", 1201 | "lru-cache": "^4.1.3", 1202 | "make-fetch-happen": "^4.0.1", 1203 | "minimatch": "^3.0.4", 1204 | "minipass": "^2.3.3", 1205 | "mississippi": "^3.0.0", 1206 | "mkdirp": "^0.5.1", 1207 | "normalize-package-data": "^2.4.0", 1208 | "npm-package-arg": "^6.1.0", 1209 | "npm-packlist": "^1.1.10", 1210 | "npm-pick-manifest": "^2.1.0", 1211 | "osenv": "^0.1.5", 1212 | "promise-inflight": "^1.0.1", 1213 | "promise-retry": "^1.1.1", 1214 | "protoduck": "^5.0.0", 1215 | "rimraf": "^2.6.2", 1216 | "safe-buffer": "^5.1.2", 1217 | "semver": "^5.5.0", 1218 | "ssri": "^6.0.0", 1219 | "tar": "^4.4.3", 1220 | "unique-filename": "^1.1.0", 1221 | "which": "^1.3.0" 1222 | }, 1223 | "dependencies": { 1224 | "safe-buffer": { 1225 | "version": "5.1.2", 1226 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1227 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1228 | }, 1229 | "tar": { 1230 | "version": "4.4.3", 1231 | "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.3.tgz", 1232 | "integrity": "sha512-LBw+tcY+/iCCTvF4i3SjqKWIgixSs/dB+Elg3BaY0MXh03D9jWclYskg3BiOkgg414NqpFI3nRgr2Qnw5jJs7Q==", 1233 | "requires": { 1234 | "chownr": "^1.0.1", 1235 | "fs-minipass": "^1.2.5", 1236 | "minipass": "^2.3.3", 1237 | "minizlib": "^1.1.0", 1238 | "mkdirp": "^0.5.0", 1239 | "safe-buffer": "^5.1.2", 1240 | "yallist": "^3.0.2" 1241 | } 1242 | }, 1243 | "yallist": { 1244 | "version": "3.0.2", 1245 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz", 1246 | "integrity": "sha1-hFK0u36Dx8GI2AQcGoN8dz1ti7k=" 1247 | } 1248 | } 1249 | }, 1250 | "parallel-transform": { 1251 | "version": "1.1.0", 1252 | "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz", 1253 | "integrity": "sha1-1BDwZbBdojCB/NEPKIVMKb2jOwY=", 1254 | "requires": { 1255 | "cyclist": "~0.2.2", 1256 | "inherits": "^2.0.3", 1257 | "readable-stream": "^2.1.5" 1258 | } 1259 | }, 1260 | "path-exists": { 1261 | "version": "3.0.0", 1262 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 1263 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" 1264 | }, 1265 | "path-is-absolute": { 1266 | "version": "1.0.1", 1267 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1268 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 1269 | }, 1270 | "path-is-inside": { 1271 | "version": "1.0.2", 1272 | "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", 1273 | "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=" 1274 | }, 1275 | "path-key": { 1276 | "version": "2.0.1", 1277 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 1278 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" 1279 | }, 1280 | "performance-now": { 1281 | "version": "2.1.0", 1282 | "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", 1283 | "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" 1284 | }, 1285 | "process-nextick-args": { 1286 | "version": "1.0.7", 1287 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", 1288 | "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" 1289 | }, 1290 | "promise-inflight": { 1291 | "version": "1.0.1", 1292 | "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", 1293 | "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" 1294 | }, 1295 | "promise-retry": { 1296 | "version": "1.1.1", 1297 | "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", 1298 | "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", 1299 | "requires": { 1300 | "err-code": "^1.0.0", 1301 | "retry": "^0.10.0" 1302 | } 1303 | }, 1304 | "protoduck": { 1305 | "version": "5.0.0", 1306 | "resolved": "https://registry.npmjs.org/protoduck/-/protoduck-5.0.0.tgz", 1307 | "integrity": "sha512-agsGWD8/RZrS4ga6v82Fxb0RHIS2RZnbsSue6A9/MBRhB/jcqOANAMNrqM9900b8duj+Gx+T/JMy5IowDoO/hQ==", 1308 | "requires": { 1309 | "genfun": "^4.0.1" 1310 | } 1311 | }, 1312 | "prr": { 1313 | "version": "1.0.1", 1314 | "resolved": "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz", 1315 | "integrity": "sha1-0/wRS6BplaRexok/SEzrHXj19HY=" 1316 | }, 1317 | "pseudomap": { 1318 | "version": "1.0.2", 1319 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", 1320 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" 1321 | }, 1322 | "pump": { 1323 | "version": "3.0.0", 1324 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 1325 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 1326 | "requires": { 1327 | "end-of-stream": "^1.1.0", 1328 | "once": "^1.3.1" 1329 | } 1330 | }, 1331 | "pumpify": { 1332 | "version": "1.5.1", 1333 | "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", 1334 | "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", 1335 | "requires": { 1336 | "duplexify": "^3.6.0", 1337 | "inherits": "^2.0.3", 1338 | "pump": "^2.0.0" 1339 | }, 1340 | "dependencies": { 1341 | "pump": { 1342 | "version": "2.0.1", 1343 | "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", 1344 | "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", 1345 | "requires": { 1346 | "end-of-stream": "^1.1.0", 1347 | "once": "^1.3.1" 1348 | } 1349 | } 1350 | } 1351 | }, 1352 | "punycode": { 1353 | "version": "1.4.1", 1354 | "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", 1355 | "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" 1356 | }, 1357 | "qs": { 1358 | "version": "6.5.2", 1359 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", 1360 | "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" 1361 | }, 1362 | "read-cmd-shim": { 1363 | "version": "1.0.1", 1364 | "resolved": "https://registry.npmjs.org/read-cmd-shim/-/read-cmd-shim-1.0.1.tgz", 1365 | "integrity": "sha1-LV0Vd4ajfAVdIgd8MsU/gynpHHs=", 1366 | "requires": { 1367 | "graceful-fs": "^4.1.2" 1368 | } 1369 | }, 1370 | "read-package-json": { 1371 | "version": "2.0.13", 1372 | "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.0.13.tgz", 1373 | "integrity": "sha512-/1dZ7TRZvGrYqE0UAfN6qQb5GYBsNcqS1C0tNK601CFOJmtHI7NIGXwetEPU/OtoFHZL3hDxm4rolFFVE9Bnmg==", 1374 | "requires": { 1375 | "glob": "^7.1.1", 1376 | "graceful-fs": "^4.1.2", 1377 | "json-parse-better-errors": "^1.0.1", 1378 | "normalize-package-data": "^2.0.0", 1379 | "slash": "^1.0.0" 1380 | } 1381 | }, 1382 | "readable-stream": { 1383 | "version": "2.3.3", 1384 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", 1385 | "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", 1386 | "requires": { 1387 | "core-util-is": "~1.0.0", 1388 | "inherits": "~2.0.3", 1389 | "isarray": "~1.0.0", 1390 | "process-nextick-args": "~1.0.6", 1391 | "safe-buffer": "~5.1.1", 1392 | "string_decoder": "~1.0.3", 1393 | "util-deprecate": "~1.0.1" 1394 | } 1395 | }, 1396 | "request": { 1397 | "version": "2.87.0", 1398 | "resolved": "https://registry.npmjs.org/request/-/request-2.87.0.tgz", 1399 | "integrity": "sha512-fcogkm7Az5bsS6Sl0sibkbhcKsnyon/jV1kF3ajGmF0c8HrttdKTPRT9hieOaQHA5HEq6r8OyWOo/o781C1tNw==", 1400 | "requires": { 1401 | "aws-sign2": "~0.7.0", 1402 | "aws4": "^1.6.0", 1403 | "caseless": "~0.12.0", 1404 | "combined-stream": "~1.0.5", 1405 | "extend": "~3.0.1", 1406 | "forever-agent": "~0.6.1", 1407 | "form-data": "~2.3.1", 1408 | "har-validator": "~5.0.3", 1409 | "http-signature": "~1.2.0", 1410 | "is-typedarray": "~1.0.0", 1411 | "isstream": "~0.1.2", 1412 | "json-stringify-safe": "~5.0.1", 1413 | "mime-types": "~2.1.17", 1414 | "oauth-sign": "~0.8.2", 1415 | "performance-now": "^2.1.0", 1416 | "qs": "~6.5.1", 1417 | "safe-buffer": "^5.1.1", 1418 | "tough-cookie": "~2.3.3", 1419 | "tunnel-agent": "^0.6.0", 1420 | "uuid": "^3.1.0" 1421 | } 1422 | }, 1423 | "require-directory": { 1424 | "version": "2.1.1", 1425 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", 1426 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=" 1427 | }, 1428 | "require-main-filename": { 1429 | "version": "1.0.1", 1430 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", 1431 | "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=" 1432 | }, 1433 | "resolve-from": { 1434 | "version": "4.0.0", 1435 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", 1436 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" 1437 | }, 1438 | "retry": { 1439 | "version": "0.10.1", 1440 | "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", 1441 | "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=" 1442 | }, 1443 | "rimraf": { 1444 | "version": "2.6.2", 1445 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", 1446 | "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", 1447 | "requires": { 1448 | "glob": "^7.0.5" 1449 | } 1450 | }, 1451 | "run-queue": { 1452 | "version": "1.0.3", 1453 | "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", 1454 | "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", 1455 | "requires": { 1456 | "aproba": "^1.1.1" 1457 | } 1458 | }, 1459 | "safe-buffer": { 1460 | "version": "5.1.1", 1461 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", 1462 | "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" 1463 | }, 1464 | "safer-buffer": { 1465 | "version": "2.1.2", 1466 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 1467 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 1468 | }, 1469 | "semver": { 1470 | "version": "5.5.0", 1471 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", 1472 | "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==" 1473 | }, 1474 | "set-blocking": { 1475 | "version": "2.0.0", 1476 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", 1477 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" 1478 | }, 1479 | "shebang-command": { 1480 | "version": "1.2.0", 1481 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 1482 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 1483 | "requires": { 1484 | "shebang-regex": "^1.0.0" 1485 | } 1486 | }, 1487 | "shebang-regex": { 1488 | "version": "1.0.0", 1489 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 1490 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" 1491 | }, 1492 | "signal-exit": { 1493 | "version": "3.0.2", 1494 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", 1495 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" 1496 | }, 1497 | "slash": { 1498 | "version": "1.0.0", 1499 | "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", 1500 | "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=" 1501 | }, 1502 | "slide": { 1503 | "version": "1.1.6", 1504 | "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", 1505 | "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=" 1506 | }, 1507 | "smart-buffer": { 1508 | "version": "4.0.1", 1509 | "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.0.1.tgz", 1510 | "integrity": "sha512-RFqinRVJVcCAL9Uh1oVqE6FZkqsyLiVOYEZ20TqIOjuX7iFVJ+zsbs4RIghnw/pTs7mZvt8ZHhvm1ZUrR4fykg==" 1511 | }, 1512 | "socks": { 1513 | "version": "2.2.0", 1514 | "resolved": "https://registry.npmjs.org/socks/-/socks-2.2.0.tgz", 1515 | "integrity": "sha512-uRKV9uXQ9ytMbGm2+DilS1jB7N3AC0mmusmW5TVWjNuBZjxS8+lX38fasKVY9I4opv/bY/iqTbcpFFaTwpfwRg==", 1516 | "requires": { 1517 | "ip": "^1.1.5", 1518 | "smart-buffer": "^4.0.1" 1519 | } 1520 | }, 1521 | "socks-proxy-agent": { 1522 | "version": "4.0.1", 1523 | "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.1.tgz", 1524 | "integrity": "sha512-Kezx6/VBguXOsEe5oU3lXYyKMi4+gva72TwJ7pQY5JfqUx2nMk7NXA6z/mpNqIlfQjWYVfeuNvQjexiTaTn6Nw==", 1525 | "requires": { 1526 | "agent-base": "~4.2.0", 1527 | "socks": "~2.2.0" 1528 | } 1529 | }, 1530 | "spdx-correct": { 1531 | "version": "3.0.0", 1532 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz", 1533 | "integrity": "sha512-N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==", 1534 | "requires": { 1535 | "spdx-expression-parse": "^3.0.0", 1536 | "spdx-license-ids": "^3.0.0" 1537 | } 1538 | }, 1539 | "spdx-exceptions": { 1540 | "version": "2.1.0", 1541 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz", 1542 | "integrity": "sha512-4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==" 1543 | }, 1544 | "spdx-expression-parse": { 1545 | "version": "3.0.0", 1546 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", 1547 | "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", 1548 | "requires": { 1549 | "spdx-exceptions": "^2.1.0", 1550 | "spdx-license-ids": "^3.0.0" 1551 | } 1552 | }, 1553 | "spdx-license-ids": { 1554 | "version": "3.0.0", 1555 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz", 1556 | "integrity": "sha512-2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==" 1557 | }, 1558 | "sshpk": { 1559 | "version": "1.14.1", 1560 | "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz", 1561 | "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=", 1562 | "requires": { 1563 | "asn1": "~0.2.3", 1564 | "assert-plus": "^1.0.0", 1565 | "bcrypt-pbkdf": "^1.0.0", 1566 | "dashdash": "^1.12.0", 1567 | "ecc-jsbn": "~0.1.1", 1568 | "getpass": "^0.1.1", 1569 | "jsbn": "~0.1.0", 1570 | "tweetnacl": "~0.14.0" 1571 | } 1572 | }, 1573 | "ssri": { 1574 | "version": "6.0.0", 1575 | "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.0.tgz", 1576 | "integrity": "sha512-zYOGfVHPhxyzwi8MdtdNyxv3IynWCIM4jYReR48lqu0VngxgH1c+C6CmipRdJ55eVByTJV/gboFEEI7TEQI8DA==" 1577 | }, 1578 | "stream-each": { 1579 | "version": "1.2.2", 1580 | "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.2.tgz", 1581 | "integrity": "sha512-mc1dbFhGBxvTM3bIWmAAINbqiuAk9TATcfIQC8P+/+HJefgaiTlMn2dHvkX8qlI12KeYKSQ1Ua9RrIqrn1VPoA==", 1582 | "requires": { 1583 | "end-of-stream": "^1.1.0", 1584 | "stream-shift": "^1.0.0" 1585 | } 1586 | }, 1587 | "stream-shift": { 1588 | "version": "1.0.0", 1589 | "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", 1590 | "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=" 1591 | }, 1592 | "string-width": { 1593 | "version": "1.0.2", 1594 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", 1595 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", 1596 | "requires": { 1597 | "code-point-at": "^1.0.0", 1598 | "is-fullwidth-code-point": "^1.0.0", 1599 | "strip-ansi": "^3.0.0" 1600 | } 1601 | }, 1602 | "string_decoder": { 1603 | "version": "1.0.3", 1604 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", 1605 | "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", 1606 | "requires": { 1607 | "safe-buffer": "~5.1.0" 1608 | } 1609 | }, 1610 | "strip-ansi": { 1611 | "version": "3.0.1", 1612 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1613 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1614 | "requires": { 1615 | "ansi-regex": "^2.0.0" 1616 | } 1617 | }, 1618 | "strip-eof": { 1619 | "version": "1.0.0", 1620 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", 1621 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" 1622 | }, 1623 | "tar": { 1624 | "version": "2.2.1", 1625 | "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", 1626 | "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", 1627 | "requires": { 1628 | "block-stream": "*", 1629 | "fstream": "^1.0.2", 1630 | "inherits": "2" 1631 | } 1632 | }, 1633 | "through2": { 1634 | "version": "2.0.3", 1635 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", 1636 | "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", 1637 | "requires": { 1638 | "readable-stream": "^2.1.5", 1639 | "xtend": "~4.0.1" 1640 | } 1641 | }, 1642 | "tough-cookie": { 1643 | "version": "2.3.4", 1644 | "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz", 1645 | "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==", 1646 | "requires": { 1647 | "punycode": "^1.4.1" 1648 | } 1649 | }, 1650 | "tunnel-agent": { 1651 | "version": "0.6.0", 1652 | "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", 1653 | "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", 1654 | "requires": { 1655 | "safe-buffer": "^5.0.1" 1656 | } 1657 | }, 1658 | "tweetnacl": { 1659 | "version": "0.14.5", 1660 | "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", 1661 | "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", 1662 | "optional": true 1663 | }, 1664 | "typedarray": { 1665 | "version": "0.0.6", 1666 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1667 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 1668 | }, 1669 | "uid-number": { 1670 | "version": "0.0.6", 1671 | "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", 1672 | "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=" 1673 | }, 1674 | "umask": { 1675 | "version": "1.1.0", 1676 | "resolved": "https://registry.npmjs.org/umask/-/umask-1.1.0.tgz", 1677 | "integrity": "sha1-8pzr8B31F5ErtY/5xOUP3o4zMg0=" 1678 | }, 1679 | "unique-filename": { 1680 | "version": "1.1.0", 1681 | "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.0.tgz", 1682 | "integrity": "sha1-0F8v5AMlYIcfMOk8vnNe6iAVFPM=", 1683 | "requires": { 1684 | "unique-slug": "^2.0.0" 1685 | } 1686 | }, 1687 | "unique-slug": { 1688 | "version": "2.0.0", 1689 | "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.0.tgz", 1690 | "integrity": "sha1-22Z258fMBimHj/GWCXx4hVrp9Ks=", 1691 | "requires": { 1692 | "imurmurhash": "^0.1.4" 1693 | } 1694 | }, 1695 | "util-deprecate": { 1696 | "version": "1.0.2", 1697 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1698 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1699 | }, 1700 | "uuid": { 1701 | "version": "3.2.1", 1702 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", 1703 | "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==" 1704 | }, 1705 | "validate-npm-package-license": { 1706 | "version": "3.0.3", 1707 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz", 1708 | "integrity": "sha512-63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==", 1709 | "requires": { 1710 | "spdx-correct": "^3.0.0", 1711 | "spdx-expression-parse": "^3.0.0" 1712 | } 1713 | }, 1714 | "validate-npm-package-name": { 1715 | "version": "3.0.0", 1716 | "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", 1717 | "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", 1718 | "requires": { 1719 | "builtins": "^1.0.3" 1720 | } 1721 | }, 1722 | "verror": { 1723 | "version": "1.10.0", 1724 | "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", 1725 | "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", 1726 | "requires": { 1727 | "assert-plus": "^1.0.0", 1728 | "core-util-is": "1.0.2", 1729 | "extsprintf": "^1.2.0" 1730 | } 1731 | }, 1732 | "which": { 1733 | "version": "1.3.0", 1734 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", 1735 | "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", 1736 | "requires": { 1737 | "isexe": "^2.0.0" 1738 | } 1739 | }, 1740 | "which-module": { 1741 | "version": "2.0.0", 1742 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", 1743 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=" 1744 | }, 1745 | "wide-align": { 1746 | "version": "1.1.2", 1747 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", 1748 | "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", 1749 | "requires": { 1750 | "string-width": "^1.0.2" 1751 | } 1752 | }, 1753 | "worker-farm": { 1754 | "version": "1.6.0", 1755 | "resolved": "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz", 1756 | "integrity": "sha512-6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==", 1757 | "requires": { 1758 | "errno": "~0.1.7" 1759 | } 1760 | }, 1761 | "wrap-ansi": { 1762 | "version": "2.1.0", 1763 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", 1764 | "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", 1765 | "requires": { 1766 | "string-width": "^1.0.1", 1767 | "strip-ansi": "^3.0.1" 1768 | } 1769 | }, 1770 | "wrappy": { 1771 | "version": "1.0.2", 1772 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1773 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1774 | }, 1775 | "write-file-atomic": { 1776 | "version": "2.3.0", 1777 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.3.0.tgz", 1778 | "integrity": "sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==", 1779 | "requires": { 1780 | "graceful-fs": "^4.1.11", 1781 | "imurmurhash": "^0.1.4", 1782 | "signal-exit": "^3.0.2" 1783 | } 1784 | }, 1785 | "xtend": { 1786 | "version": "4.0.1", 1787 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", 1788 | "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" 1789 | }, 1790 | "y18n": { 1791 | "version": "4.0.0", 1792 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", 1793 | "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==" 1794 | }, 1795 | "yallist": { 1796 | "version": "2.1.2", 1797 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", 1798 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" 1799 | }, 1800 | "yargs": { 1801 | "version": "11.0.0", 1802 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.0.0.tgz", 1803 | "integrity": "sha512-Rjp+lMYQOWtgqojx1dEWorjCofi1YN7AoFvYV7b1gx/7dAAeuI4kN5SZiEvr0ZmsZTOpDRcCqrpI10L31tFkBw==", 1804 | "requires": { 1805 | "cliui": "^4.0.0", 1806 | "decamelize": "^1.1.1", 1807 | "find-up": "^2.1.0", 1808 | "get-caller-file": "^1.0.1", 1809 | "os-locale": "^2.0.0", 1810 | "require-directory": "^2.1.1", 1811 | "require-main-filename": "^1.0.1", 1812 | "set-blocking": "^2.0.0", 1813 | "string-width": "^2.0.0", 1814 | "which-module": "^2.0.0", 1815 | "y18n": "^3.2.1", 1816 | "yargs-parser": "^9.0.2" 1817 | }, 1818 | "dependencies": { 1819 | "ansi-regex": { 1820 | "version": "3.0.0", 1821 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", 1822 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" 1823 | }, 1824 | "is-fullwidth-code-point": { 1825 | "version": "2.0.0", 1826 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", 1827 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" 1828 | }, 1829 | "string-width": { 1830 | "version": "2.1.1", 1831 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", 1832 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", 1833 | "requires": { 1834 | "is-fullwidth-code-point": "^2.0.0", 1835 | "strip-ansi": "^4.0.0" 1836 | } 1837 | }, 1838 | "strip-ansi": { 1839 | "version": "4.0.0", 1840 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", 1841 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", 1842 | "requires": { 1843 | "ansi-regex": "^3.0.0" 1844 | } 1845 | }, 1846 | "y18n": { 1847 | "version": "3.2.1", 1848 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", 1849 | "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" 1850 | } 1851 | } 1852 | }, 1853 | "yargs-parser": { 1854 | "version": "9.0.2", 1855 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", 1856 | "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", 1857 | "requires": { 1858 | "camelcase": "^4.1.0" 1859 | } 1860 | } 1861 | } 1862 | } 1863 | --------------------------------------------------------------------------------