mirror of
https://github.com/whoisclebs/lodash.git
synced 2026-02-01 07:47:49 +00:00
The global `node_modules` directory does not exist if no modules have been installed globally, causing `realpathSync` to throw an exception. Former-commit-id: 5a59e6b53c7afe5d5c5728352e9cd722744b2247
149 lines
4.8 KiB
JavaScript
149 lines
4.8 KiB
JavaScript
#!/usr/bin/env node
|
||
;(function() {
|
||
'use strict';
|
||
|
||
/** Load Node modules */
|
||
var exec = require('child_process').exec,
|
||
fs = require('fs'),
|
||
https = require('https'),
|
||
path = require('path'),
|
||
tar = require('../vendor/tar/tar.js'),
|
||
zlib = require('zlib');
|
||
|
||
/** The path of the directory that is the base of the repository */
|
||
var basePath = fs.realpathSync(path.join(__dirname, '..'));
|
||
|
||
/** The path of the `vendor` directory */
|
||
var vendorPath = path.join(basePath, 'vendor');
|
||
|
||
/** The Git object ID of `closure-compiler.tar.gz` */
|
||
var closureId = 'a2787b470c577cee2404d186c562dd9835f779f5';
|
||
|
||
/** The Git object ID of `uglifyjs.tar.gz` */
|
||
var uglifyId = '3390b259e04829538e4d3635d12b317dd6103eca';
|
||
|
||
/** The media type for raw blob data */
|
||
var mediaType = 'application/vnd.github.v3.raw';
|
||
|
||
/** Reassign `existsSync` for older versions of Node */
|
||
fs.existsSync || (fs.existsSync = path.existsSync);
|
||
|
||
/** Used to reference parts of the blob href */
|
||
var location = (function() {
|
||
var host = 'api.github.com',
|
||
origin = 'https://api.github.com',
|
||
pathname = '/repos/bestiejs/lodash/git/blobs';
|
||
|
||
return {
|
||
'host': host,
|
||
'href': host + origin + pathname,
|
||
'origin': origin,
|
||
'pathname': pathname
|
||
};
|
||
}());
|
||
|
||
/*--------------------------------------------------------------------------*/
|
||
|
||
/**
|
||
* Fetches a required `.tar.gz` dependency with the given Git object ID from
|
||
* the Lo-Dash repo on GitHub. The object ID may be obtained by running
|
||
* `git hash-object path/to/dependency.tar.gz`.
|
||
*
|
||
* @private
|
||
* @param {Object} options The options object.
|
||
* id - The Git object ID of the `.tar.gz` file.
|
||
* onComplete - The function, invoked with one argument (exception),
|
||
* called once the extraction has finished.
|
||
* path - The path of the extraction directory.
|
||
* title - The dependency's title used in status updates logged to the console.
|
||
*/
|
||
function getDependency(options) {
|
||
options || (options = {});
|
||
|
||
var id = options.id,
|
||
onComplete = options.onComplete,
|
||
path = options.path,
|
||
title = options.title;
|
||
|
||
function callback(exception) {
|
||
if (exception) {
|
||
console.error([
|
||
'There was a problem installing ' + title + '. To manually install, run:',
|
||
'',
|
||
"curl -H 'Accept: " + mediaType + "' " + location.href + '/' + id + " | tar xvz -C '" + path + "'"
|
||
].join('\n'));
|
||
}
|
||
onComplete(exception);
|
||
}
|
||
|
||
console.log('Downloading ' + title + '...');
|
||
|
||
https.get({
|
||
'host': location.host,
|
||
'path': location.pathname + '/' + id,
|
||
'headers': {
|
||
// By default, all GitHub blob API endpoints return a JSON document
|
||
// containing Base64-encoded blob data. Overriding the `Accept` header
|
||
// with the GitHub raw media type returns the blob data directly.
|
||
// See http://developer.github.com/v3/media/.
|
||
'Accept': mediaType
|
||
}
|
||
}, function(response) {
|
||
var decompressor = zlib.createUnzip(),
|
||
parser = new tar.Extract({ 'path': path });
|
||
|
||
decompressor.on('error', callback)
|
||
parser.on('end', callback).on('error', callback);
|
||
response.pipe(decompressor).pipe(parser);
|
||
})
|
||
.on('error', callback);
|
||
}
|
||
|
||
/*--------------------------------------------------------------------------*/
|
||
|
||
exec('npm -g root', function(exception, stdout) {
|
||
if (!exception) {
|
||
try {
|
||
var root = stdout.trim(),
|
||
isGlobal = fs.existsSync(root) && path.resolve(basePath, '..') == fs.realpathSync(root);
|
||
} catch(e) {
|
||
exception = e;
|
||
}
|
||
}
|
||
if (exception) {
|
||
console.error([
|
||
'Oops! There was a problem detecting the install mode. If you’re installing the',
|
||
'Lo-Dash command-line executable (via `npm install -g lodash`), you’ll need to',
|
||
'manually install UglifyJS and the Closure Compiler by running:',
|
||
'',
|
||
"curl -H 'Accept: " + mediaType + "' " + location.href + '/' + closureId + " | tar xvz -C '" + vendorPath + "'",
|
||
"curl -H 'Accept: " + mediaType + "' " + location.href + '/' + uglifyId + " | tar xvz -C '" + vendorPath + "'",
|
||
'',
|
||
'Please submit an issue on the GitHub issue tracker: ' + process.env.npm_package_bugs_url
|
||
].join('\n'));
|
||
|
||
console.error(exception);
|
||
}
|
||
if (!isGlobal) {
|
||
return;
|
||
}
|
||
// download the Closure Compiler
|
||
getDependency({
|
||
'title': 'the Closure Compiler',
|
||
'id': closureId,
|
||
'path': vendorPath,
|
||
'onComplete': function() {
|
||
// download UglifyJS
|
||
getDependency({
|
||
'title': 'UglifyJS',
|
||
'id': uglifyId,
|
||
'path': vendorPath,
|
||
'onComplete': function() {
|
||
process.exit();
|
||
}
|
||
});
|
||
}
|
||
});
|
||
});
|
||
}());
|