Skip to content

Commit 290174a

Browse files
Timergaearon
authored andcommitted
Download package if need be ...
1 parent 37f975a commit 290174a

File tree

2 files changed

+48
-23
lines changed

2 files changed

+48
-23
lines changed

packages/create-react-app/index.js

+47-23
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ var semver = require('semver');
6262
var dns = require('dns');
6363
var tmp = require('tmp');
6464
var unpack = require('tar-pack').unpack;
65+
var hyperquest = require('hyperquest');
6566

6667
var projectName;
6768

@@ -292,34 +293,57 @@ function getInstallPackage(version) {
292293
return packageToInstall;
293294
}
294295

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+
295331
// Extract package name from tarball url or path.
296332
function getPackageName(installPackage) {
297333
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(/^http/)) {
336+
var stream = hyperquest(installPackage);
337+
} else {
338+
var stream = fs.createReadStream(installPackage);
339+
}
340+
return extractStream(stream).then(function() {
341+
return obj;
308342
});
309343
}).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;
323347
}).catch(function(err) {
324348
// The package name could be with or without semver version, e.g. react-scripts-0.2.0-alpha.1.tgz
325349
// However, this function returns package name only without semver version.

packages/create-react-app/package.json

+1
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
"commander": "^2.9.0",
2525
"cross-spawn": "^4.0.0",
2626
"fs-extra": "^1.0.0",
27+
"hyperquest": "^2.1.2",
2728
"semver": "^5.0.3",
2829
"tar-pack": "^3.4.0",
2930
"tmp": "0.0.31",

0 commit comments

Comments
 (0)