diff options
Diffstat (limited to 'deps/npm/node_modules/libcipm/lib')
-rw-r--r-- | deps/npm/node_modules/libcipm/lib/config/lifecycle-opts.js | 29 | ||||
-rw-r--r-- | deps/npm/node_modules/libcipm/lib/config/npm-config.js | 72 | ||||
-rw-r--r-- | deps/npm/node_modules/libcipm/lib/config/pacote-opts.js | 135 | ||||
-rw-r--r-- | deps/npm/node_modules/libcipm/lib/extract.js | 53 | ||||
-rw-r--r-- | deps/npm/node_modules/libcipm/lib/silentlog.js | 13 | ||||
-rw-r--r-- | deps/npm/node_modules/libcipm/lib/worker.js | 16 |
6 files changed, 318 insertions, 0 deletions
diff --git a/deps/npm/node_modules/libcipm/lib/config/lifecycle-opts.js b/deps/npm/node_modules/libcipm/lib/config/lifecycle-opts.js new file mode 100644 index 0000000000..7d57459779 --- /dev/null +++ b/deps/npm/node_modules/libcipm/lib/config/lifecycle-opts.js @@ -0,0 +1,29 @@ +'use strict' + +const log = require('npmlog') + +module.exports = lifecycleOpts +function lifecycleOpts (opts) { + const objConfig = {} + for (const key of opts.keys()) { + const val = opts.get(key) + if (val != null) { + objConfig[key] = val + } + } + return { + config: objConfig, + scriptShell: opts.get('script-shell'), + force: opts.get('force'), + user: opts.get('user'), + group: opts.get('group'), + ignoreScripts: opts.get('ignore-scripts'), + ignorePrepublish: opts.get('ignore-prepublish'), + scriptsPrependNodePath: opts.get('scripts-prepend-node-path'), + unsafePerm: opts.get('unsafe-perm'), + log, + dir: opts.get('prefix'), + failOk: false, + production: opts.get('production') + } +} diff --git a/deps/npm/node_modules/libcipm/lib/config/npm-config.js b/deps/npm/node_modules/libcipm/lib/config/npm-config.js new file mode 100644 index 0000000000..76b4054eef --- /dev/null +++ b/deps/npm/node_modules/libcipm/lib/config/npm-config.js @@ -0,0 +1,72 @@ +'use strict' + +const BB = require('bluebird') +const lifecycleOpts = require('./lifecycle-opts.js') +const pacoteOpts = require('./pacote-opts.js') +const protoduck = require('protoduck') +const spawn = require('child_process').spawn + +class NpmConfig extends Map {} + +const CipmConfig = protoduck.define({ + get: [], + set: [], + toPacote: [], + toLifecycle: [] +}, { + name: 'CipmConfig' +}) +module.exports.CipmConfig = CipmConfig + +CipmConfig.impl(NpmConfig, { + get: Map.prototype.get, + set: Map.prototype.set, + toPacote (opts) { + return pacoteOpts(this, opts) + }, + toLifecycle () { + return lifecycleOpts(this) + } +}) + +module.exports.fromObject = fromObj +function fromObj (obj) { + const map = new NpmConfig() + Object.keys(obj).forEach(k => map.set(k, obj[k])) + return map +} + +module.exports.fromNpm = getNpmConfig +function getNpmConfig (argv) { + return new BB((resolve, reject) => { + const npmBin = process.platform === 'win32' ? 'npm.cmd' : 'npm' + const child = spawn(npmBin, [ + 'config', 'ls', '--json', '-l' + // We add argv here to get npm to parse those options for us :D + ].concat(argv || []), { + env: process.env, + cwd: process.cwd(), + stdio: [0, 'pipe', 2] + }) + + let stdout = '' + if (child.stdout) { + child.stdout.on('data', (chunk) => { + stdout += chunk + }) + } + + child.on('error', reject) + child.on('close', (code) => { + if (code === 127) { + reject(new Error('`npm` command not found. Please ensure you have npm@5.4.0 or later installed.')) + } else { + try { + resolve(fromObj(JSON.parse(stdout))) + } catch (e) { + reject(new Error('`npm config ls --json` failed to output json. Please ensure you have npm@5.4.0 or later installed.')) + } + } + }) + }) +} diff --git a/deps/npm/node_modules/libcipm/lib/config/pacote-opts.js b/deps/npm/node_modules/libcipm/lib/config/pacote-opts.js new file mode 100644 index 0000000000..234ed1352a --- /dev/null +++ b/deps/npm/node_modules/libcipm/lib/config/pacote-opts.js @@ -0,0 +1,135 @@ +'use strict' + +const Buffer = require('safe-buffer').Buffer + +const crypto = require('crypto') +const path = require('path') + +let effectiveOwner + +const npmSession = crypto.randomBytes(8).toString('hex') + +module.exports = pacoteOpts +function pacoteOpts (npmOpts, moreOpts) { + const ownerStats = calculateOwner() + const opts = { + cache: path.join(npmOpts.get('cache'), '_cacache'), + ca: npmOpts.get('ca'), + cert: npmOpts.get('cert'), + git: npmOpts.get('git'), + key: npmOpts.get('key'), + localAddress: npmOpts.get('local-address'), + loglevel: npmOpts.get('loglevel'), + maxSockets: +(npmOpts.get('maxsockets') || 15), + npmSession: npmSession, + offline: npmOpts.get('offline'), + projectScope: moreOpts.rootPkg && getProjectScope(moreOpts.rootPkg.name), + proxy: npmOpts.get('https-proxy') || npmOpts.get('proxy'), + refer: 'cipm', + registry: npmOpts.get('registry'), + retry: { + retries: npmOpts.get('fetch-retries'), + factor: npmOpts.get('fetch-retry-factor'), + minTimeout: npmOpts.get('fetch-retry-mintimeout'), + maxTimeout: npmOpts.get('fetch-retry-maxtimeout') + }, + strictSSL: npmOpts.get('strict-ssl'), + userAgent: npmOpts.get('user-agent'), + + dmode: parseInt('0777', 8) & (~npmOpts.get('umask')), + fmode: parseInt('0666', 8) & (~npmOpts.get('umask')), + umask: npmOpts.get('umask') + } + + if (ownerStats.uid != null || ownerStats.gid != null) { + Object.assign(opts, ownerStats) + } + + (npmOpts.forEach ? Array.from(npmOpts.keys()) : npmOpts.keys).forEach(k => { + const authMatchGlobal = k.match( + /^(_authToken|username|_password|password|email|always-auth|_auth)$/ + ) + const authMatchScoped = k[0] === '/' && k.match( + /(.*):(_authToken|username|_password|password|email|always-auth|_auth)$/ + ) + + // if it matches scoped it will also match global + if (authMatchGlobal || authMatchScoped) { + let nerfDart = null + let key = null + let val = null + + if (!opts.auth) { opts.auth = {} } + + if (authMatchScoped) { + nerfDart = authMatchScoped[1] + key = authMatchScoped[2] + val = npmOpts.get(k) + if (!opts.auth[nerfDart]) { + opts.auth[nerfDart] = { + alwaysAuth: !!npmOpts.get('always-auth') + } + } + } else { + key = authMatchGlobal[1] + val = npmOpts.get(k) + opts.auth.alwaysAuth = !!npmOpts.get('always-auth') + } + + const auth = authMatchScoped ? opts.auth[nerfDart] : opts.auth + if (key === '_authToken') { + auth.token = val + } else if (key.match(/password$/i)) { + auth.password = + // the config file stores password auth already-encoded. pacote expects + // the actual username/password pair. + Buffer.from(val, 'base64').toString('utf8') + } else if (key === 'always-auth') { + auth.alwaysAuth = val === 'false' ? false : !!val + } else { + auth[key] = val + } + } + + if (k[0] === '@') { + if (!opts.scopeTargets) { opts.scopeTargets = {} } + opts.scopeTargets[k.replace(/:registry$/, '')] = npmOpts.get(k) + } + }) + + Object.keys(moreOpts || {}).forEach((k) => { + opts[k] = moreOpts[k] + }) + + return opts +} + +function calculateOwner () { + if (!effectiveOwner) { + effectiveOwner = { uid: 0, gid: 0 } + + // Pretty much only on windows + if (!process.getuid) { + return effectiveOwner + } + + effectiveOwner.uid = +process.getuid() + effectiveOwner.gid = +process.getgid() + + if (effectiveOwner.uid === 0) { + if (process.env.SUDO_UID) effectiveOwner.uid = +process.env.SUDO_UID + if (process.env.SUDO_GID) effectiveOwner.gid = +process.env.SUDO_GID + } + } + + return effectiveOwner +} + +function getProjectScope (pkgName) { + const sep = pkgName.indexOf('/') + if (sep === -1) { + return '' + } else { + return pkgName.slice(0, sep) + } +} diff --git a/deps/npm/node_modules/libcipm/lib/extract.js b/deps/npm/node_modules/libcipm/lib/extract.js new file mode 100644 index 0000000000..1967308112 --- /dev/null +++ b/deps/npm/node_modules/libcipm/lib/extract.js @@ -0,0 +1,53 @@ +'use strict' + +const BB = require('bluebird') + +const npa = require('npm-package-arg') +const workerFarm = require('worker-farm') + +const extractionWorker = require('./worker.js') +const WORKER_PATH = require.resolve('./worker.js') + +module.exports = { + startWorkers () { + this._workers = workerFarm({ + maxConcurrentCallsPerWorker: 20, + maxRetries: 1 + }, WORKER_PATH) + }, + + stopWorkers () { + workerFarm.end(this._workers) + }, + + child (name, child, childPath, config, opts) { + const spec = npa.resolve(name, child.version) + const childOpts = config.toPacote(Object.assign({ + integrity: child.integrity, + resolved: child.resolved + }, { + dirPacker: opts.dirPacker + })) + const args = [spec, childPath, childOpts] + return BB.fromNode((cb) => { + let launcher = extractionWorker + let msg = args + const spec = typeof args[0] === 'string' ? npa(args[0]) : args[0] + childOpts.loglevel = opts.log.level + if (spec.registry || spec.type === 'remote') { + // We can't serialize these options + childOpts.config = null + childOpts.log = null + childOpts.dirPacker = null + // workers will run things in parallel! + launcher = this._workers + try { + msg = JSON.stringify(msg) + } catch (e) { + return cb(e) + } + } + launcher(msg, cb) + }) + } +} diff --git a/deps/npm/node_modules/libcipm/lib/silentlog.js b/deps/npm/node_modules/libcipm/lib/silentlog.js new file mode 100644 index 0000000000..4c9d6c57e8 --- /dev/null +++ b/deps/npm/node_modules/libcipm/lib/silentlog.js @@ -0,0 +1,13 @@ +'use strict' + +const noop = Function.prototype +module.exports = { + error: noop, + warn: noop, + info: noop, + verbose: noop, + silly: noop, + http: noop, + pause: noop, + resume: noop +} diff --git a/deps/npm/node_modules/libcipm/lib/worker.js b/deps/npm/node_modules/libcipm/lib/worker.js new file mode 100644 index 0000000000..ac61b06236 --- /dev/null +++ b/deps/npm/node_modules/libcipm/lib/worker.js @@ -0,0 +1,16 @@ +'use strict' + +const BB = require('bluebird') + +const log = require('npmlog') +const pacote = require('pacote') + +module.exports = (args, cb) => { + const parsed = typeof args === 'string' ? JSON.parse(args) : args + const spec = parsed[0] + const extractTo = parsed[1] + const opts = parsed[2] + opts.log = log + log.level = opts.loglevel + return BB.resolve(pacote.extract(spec, extractTo, opts)).nodeify(cb) +} |