@@ -62,6 +62,7 @@ var semver = require('semver');
62
62
var dns = require ( 'dns' ) ;
63
63
var tmp = require ( 'tmp' ) ;
64
64
var unpack = require ( 'tar-pack' ) . unpack ;
65
+ var hyperquest = require ( 'hyperquest' ) ;
65
66
66
67
var projectName ;
67
68
@@ -292,34 +293,57 @@ function getInstallPackage(version) {
292
293
return packageToInstall ;
293
294
}
294
295
296
+ function getTemporaryDirectory ( ) {
297
+ return new Promise ( function ( resolve , reject ) {
298
+ // Unsafe cleanup lets us recursively delete the directory if it contains
299
+ // contents; by default it only allows removal if it's empty
300
+ tmp . dir ( { unsafeCleanup : true } , function ( err , tmpdir , callback ) {
301
+ if ( err ) {
302
+ reject ( err ) ;
303
+ } else {
304
+ resolve ( {
305
+ tmpdir : tmpdir ,
306
+ cleanup : function ( ) {
307
+ try {
308
+ // Callback might throw and fail, since it's a temp directory the
309
+ // OS will clean it up eventually...
310
+ callback ( ) ;
311
+ } catch ( ignored ) { }
312
+ }
313
+ } ) ;
314
+ }
315
+ } ) ;
316
+ } ) ;
317
+ }
318
+
319
+ function extractStream ( stream , dest ) {
320
+ return new Promise ( function ( resolve , reject ) {
321
+ stream . pipe ( unpack ( dest , function ( err ) {
322
+ if ( err ) {
323
+ reject ( err ) ;
324
+ } else {
325
+ resolve ( dest ) ;
326
+ }
327
+ } ) ) ;
328
+ } ) ;
329
+ }
330
+
295
331
// Extract package name from tarball url or path.
296
332
function getPackageName ( installPackage ) {
297
333
if ( installPackage . indexOf ( '.tgz' ) > - 1 ) {
298
- return new Promise ( function ( resolve , reject ) {
299
- tmp . dir ( { unsafeCleanup : true } , function ( err , tmpdir , callback ) {
300
- if ( err ) {
301
- reject ( err ) ;
302
- } else {
303
- resolve ( {
304
- tmpdir : tmpdir ,
305
- callback : callback
306
- } ) ;
307
- }
334
+ return getTemporaryDirectory ( ) . then ( function ( obj ) {
335
+ if ( installPackage . test ( / ^ h t t p / ) ) {
336
+ var stream = hyperquest ( installPackage ) ;
337
+ } else {
338
+ var stream = fs . createReadStream ( installPackage ) ;
339
+ }
340
+ return extractStream ( stream ) . then ( function ( ) {
341
+ return obj ;
308
342
} ) ;
309
343
} ) . then ( function ( obj ) {
310
- return new Promise ( function ( resolve , reject ) {
311
- fs . createReadStream ( installPackage ) . pipe ( unpack ( obj . tmpdir , function ( err ) {
312
- if ( err ) {
313
- reject ( err ) ;
314
- } else {
315
- var packageName = require ( path . join ( obj . tmpdir , 'package.json' ) ) . name ;
316
- try {
317
- obj . callback ( ) ;
318
- } catch ( ignored ) { }
319
- resolve ( packageName ) ;
320
- }
321
- } ) ) ;
322
- } ) ;
344
+ var packageName = require ( path . join ( obj . tmpdir , 'package.json' ) ) . name ;
345
+ obj . cleanup ( ) ;
346
+ return packageName ;
323
347
} ) . catch ( function ( err ) {
324
348
// The package name could be with or without semver version, e.g. react-scripts-0.2.0-alpha.1.tgz
325
349
// However, this function returns package name only without semver version.
0 commit comments