autocode-cli
Version:
code automation for every language, framework and platform
148 lines (135 loc) • 5.57 kB
JavaScript
// Generated by CoffeeScript 1.10.0
(function() {
var autocode, fs, install, mkdirp, path, request, semver, untar, userHome, zlib;
autocode = require('../autocode');
fs = require('fs');
mkdirp = require('mkdirp');
path = require('path');
request = require('sync-request');
semver = require('semver');
untar = require('untar.js');
userHome = require('user-home');
zlib = require('zlib');
install = function(opts) {
var access_token_url, config_resp, config_url, headers, host, j, len, module_is_lastest, module_name, module_parse, module_path, module_version, project, release, release_i, release_resp, release_url, release_version, releases, tag_name, tarball, tarball_response, tarball_url;
host = 'github.com';
if (typeof opts === 'object' && opts.name) {
module_name = opts.name;
}
if (typeof opts === 'object' && opts.version) {
module_version = opts.version;
} else if (module_name.match('@')) {
module_parse = module_name.split('@');
module_name = module_parse[0];
module_version = module_parse[1];
} else {
module_version = 'latest';
}
if (!module_name) {
throw new Error("Module Name is required for `autocode install`.");
}
console.log(("Loading module (" + module_name + ")...").blue);
headers = {
'User-Agent': 'Crystal Autocode <support@crystal.sh> (https://crystal.sh/autocode)'
};
access_token_url = '';
if (process.env.GITHUB_ACCESS_TOKEN) {
access_token_url += "?access_token=" + process.env.GITHUB_ACCESS_TOKEN;
}
if (module_version === 'latest') {
module_is_lastest = true;
release_url = "https://api.github.com/repos/" + module_name + "/releases/latest" + access_token_url;
release_resp = request('get', release_url, {
headers: headers
});
if (release_resp.statusCode !== 200) {
throw new Error("Module (" + module_name + ") does not exist in the Crystal Hub.");
}
release = JSON.parse(release_resp.body);
if (!release) {
throw new Error("Unable to locate generator (" + name + ").");
}
module_version = semver.clean(release.tag_name);
tag_name = release.tag_name;
console.log(("Latest version is " + release.tag_name + ".").green);
} else {
module_is_lastest = false;
release_url = "https://api.github.com/repos/" + module_name + "/releases" + access_token_url;
release_resp = request('get', release_url, {
headers: headers
});
if (release_resp.statusCode !== 200) {
throw new Error("Module (" + module_name + ") does not exist in the Crystal Hub.");
}
releases = JSON.parse(release_resp.body);
if (!releases) {
throw new Error("Unable to locate generator (" + name + ").");
}
release_i = 0;
for (j = 0, len = releases.length; j < len; j++) {
release = releases[j];
release_version = semver.clean(release.tag_name);
if (semver.satisfies(release_version, module_version)) {
if (release_i === 0) {
module_is_lastest = true;
}
module_version = semver.clean(release.tag_name);
tag_name = release.tag_name;
break;
}
release_i++;
}
if (!tag_name) {
throw new Error("Unable to find version (" + module_version + ") for module (" + module_name + ").");
}
console.log(("Found version (" + module_version + ") with tag (" + tag_name + ").").green);
}
if (opts.force !== true) {
config_url = "https://api.github.com/repos/" + module_name + "/contents/.autocode/config.yml?ref=" + tag_name;
config_resp = request('get', config_url, {
headers: headers
});
if (config_resp.statusCode !== 200) {
throw new Error("Module (" + module_name + ") has not implemented Autocode. Use -f to install anyways.");
}
}
tarball_url = "" + release.tarball_url + access_token_url;
console.log(("Downloading from: " + tarball_url).bold);
tarball_response = request('get', tarball_url, {
headers: headers
});
if (tarball_response.statusCode !== 200) {
throw new Error("Unable to download module (" + module_name + ").");
}
tarball = zlib.gunzipSync(tarball_response.body);
if (!tarball) {
throw new Error("Unable to unzip module (" + module_name + ").");
}
module_path = path.normalize(userHome + "/.autocode/module/" + host + "/" + module_name + "/" + module_version);
untar.untar(tarball).forEach(function(file) {
var buffer, file_path, filename, i, link_path;
filename = file.filename.split('/').slice(1).join('/');
file_path = path.dirname(filename);
mkdirp.sync(module_path + "/" + file_path);
buffer = new Buffer(file.fileData.length);
i = 0;
while (i < file.fileData.length) {
buffer.writeUInt8(file.fileData[i], i);
i++;
}
fs.writeFileSync(module_path + "/" + filename, buffer);
if (module_is_lastest) {
link_path = path.normalize(userHome + "/.autocode/module/" + host + "/" + module_name + "/latest");
if (fs.existsSync(link_path)) {
fs.unlinkSync(link_path);
}
return fs.symlinkSync(module_path, link_path);
}
});
project = new autocode(module_path);
project.update();
project.build();
return console.log(("Successfully installed " + module_name + " at: " + module_path).green);
};
module.exports = install;
}).call(this);