1
1
const fs = require ( 'fs-extra' )
2
2
const path = require ( 'path' )
3
3
4
+ const ini = require ( 'ini' )
4
5
const minimist = require ( 'minimist' )
5
6
const LRU = require ( 'lru-cache' )
6
7
@@ -154,6 +155,38 @@ class PackageManager {
154
155
return this . _registry
155
156
}
156
157
158
+ async getAuthToken ( ) {
159
+ // get npmrc (https://docs.npmjs.com/configuring-npm/npmrc.html#files)
160
+ const possibleRcPaths = [
161
+ path . resolve ( this . context , '.npmrc' ) ,
162
+ path . resolve ( require ( 'os' ) . homedir ( ) , '.npmrc' )
163
+ ]
164
+ if ( process . env . PREFIX ) {
165
+ possibleRcPaths . push ( path . resolve ( process . env . PREFIX , '/etc/npmrc' ) )
166
+ }
167
+ // there's also a '/path/to/npm/npmrc', skipped for simplicity of implementation
168
+
169
+ let npmConfig = { }
170
+ for ( const loc of possibleRcPaths ) {
171
+ if ( fs . existsSync ( loc ) ) {
172
+ try {
173
+ // the closer config file (the one with lower index) takes higher precedence
174
+ npmConfig = Object . assign ( { } , ini . parse ( fs . readFileSync ( loc , 'utf-8' ) ) , npmConfig )
175
+ } catch ( e ) {
176
+ // in case of file permission issues, etc.
177
+ }
178
+ }
179
+ }
180
+
181
+ const registry = await this . getRegistry ( )
182
+ const registryWithoutProtocol = registry
183
+ . replace ( / h t t p s ? : / , '' ) // remove leading protocol
184
+ . replace ( / ( [ ^ / ] ) $ / , '$1/' ) // ensure ending with slash
185
+ const authTokenKey = `${ registryWithoutProtocol } :_authToken`
186
+
187
+ return npmConfig [ authTokenKey ]
188
+ }
189
+
157
190
async setRegistryEnvs ( ) {
158
191
const registry = await this . getRegistry ( )
159
192
@@ -204,6 +237,7 @@ class PackageManager {
204
237
// https://github.com/npm/registry/blob/master/docs/responses/package-metadata.md
205
238
async getMetadata ( packageName , { full = false } = { } ) {
206
239
const registry = await this . getRegistry ( )
240
+ const authToken = await this . getAuthToken ( )
207
241
208
242
const metadataKey = `${ this . bin } -${ registry } -${ packageName } `
209
243
let metadata = metadataCache . get ( metadataKey )
@@ -217,6 +251,10 @@ class PackageManager {
217
251
headers . Accept = 'application/vnd.npm.install-v1+json'
218
252
}
219
253
254
+ if ( authToken ) {
255
+ headers . Authorization = `Bearer ${ authToken } `
256
+ }
257
+
220
258
const url = `${ registry . replace ( / \/ $ / g, '' ) } /${ packageName } `
221
259
try {
222
260
metadata = ( await request . get ( url , { headers } ) ) . body
0 commit comments