/
npm.js
117 lines (109 loc) · 2.49 KB
/
npm.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
'use strict'
const registry = require('../registry.js')
const Promise = require('bluebird')
const PassThrough = require('stream').PassThrough
const error = require('./error.js')
const log = require('npmlog')
const rp = require('request-promise')
const request = require('request')
const debug = require('debug')('apmjs:npm')
const path = require('path')
const npm = require('npm')
const _ = require('lodash')
let metaCache = {}
function downloadPackage (url) {
log.http('tarball', url)
return new Promise((resolve, reject) => {
// response stream is fake (cannot pipe after emitted)
let fileStream = new PassThrough()
request({ url, followRedirect: true })
.on('response', res => {
res.statusCode >= 400
? reject(new error.HTTP(res.statusCode))
: resolve(fileStream)
})
.pipe(fileStream)
})
}
/**
* get meta for package `name`
*
* @param {Package} parent parent for error promotion
*/
function getPackageMeta (name, parent) {
if (metaCache[name]) {
return metaCache[name]
}
let metaUrl = registry.packageUrl(name)
log.http('meta', metaUrl)
metaCache[name] = rp({
url: metaUrl,
json: true
})
.promise()
.catch(e => {
if (e.statusCode === 404) {
throw new error.PackageNotFound(name, parent)
} else {
throw e
}
})
.tap(desc => {
if (!_.has(desc, 'versions')) {
throw new error.InvalidPackageMeta(name, parent)
}
let versionList = Object.keys(desc.versions).join(',')
debug('package meta retrieved:', `${desc.name}@${versionList}`)
})
return metaCache[name]
}
function load (conf) {
let config = {}
_.assign(config, conf)
return Promise
.fromCallback(cb => npm.load(config, cb))
.tap(() => (log.level = 'silly'))
}
let config = {
set: function (key, val) {
return npm.config.set(key, val)
},
get: function (key) {
return npm.config.get(key)
}
}
let npmDelegate = {downloadPackage, getPackageMeta, load, config}
Object.defineProperties(npmDelegate, {
'dir': {
get: () => {
return path.resolve(npm.dir, '../amd_modules')
}
},
'prefix': {
get: () => {
return npm.prefix
}
},
'tmp': {
get: () => {
return npm.tmp
}
},
'localPrefix': {
get: () => {
return npm.localPrefix
}
},
'globalPrefix': {
get: () => {
return npm.globalPrefix
}
},
'globalDir': {
get: () => {
return path.resolve(npm.globalDir, '../amd_modules')
},
configurable: true
}
})
module.exports = npmDelegate