UNPKG

5.97 kBJavaScriptView Raw
1// Generated by CoffeeScript 1.10.0
2(function() {
3 var autocode, error, fs, gunzip, mkdirp, request, semver, tarfs, untar, update, userHome, version, zlib;
4
5 autocode = require('../autocode');
6
7 error = require('../error');
8
9 fs = require('fs');
10
11 gunzip = require('gunzip-maybe');
12
13 mkdirp = require('mkdirp');
14
15 request = require('sync-request');
16
17 semver = require('semver');
18
19 tarfs = require('tar-fs');
20
21 untar = require('untar.js');
22
23 userHome = require('user-home');
24
25 version = require('../version');
26
27 zlib = require('zlib');
28
29 update = function() {
30 var config, j, len, loadModules, loaded_modules, modules, path, project, submodule, submodules;
31 path = userHome + "/.autocode/module/";
32 if (!fs.existsSync(path)) {
33 mkdirp.sync(path);
34 }
35 if (this.config) {
36 config = this.config;
37 } else {
38 config = this.load();
39 }
40 if (config.modules || config.imports) {
41 modules = config.modules ? config.modules : config.imports;
42 }
43 if (!modules) {
44 return;
45 }
46 loaded_modules = {};
47 submodules = [];
48 loadModules = function(modules) {
49 var access_token_url, data, headers, j, len, module_config, module_name, module_path, module_path_name, module_version, module_version_query, release, releases, resp, response, results, tarball_url, url;
50 results = [];
51 for (module_name in modules) {
52 module_version = null;
53 module_version_query = modules[module_name];
54 module_path_name = module_name.replace(/\./, '/');
55 if (!loaded_modules[module_name]) {
56 loaded_modules[module_name] = [];
57 }
58 if (loaded_modules[module_name].indexOf(module_version_query) !== -1) {
59 continue;
60 } else {
61 loaded_modules[module_name].push(module_version_query);
62 }
63 if (module_version_query.match(/^(\.|\/)/)) {
64 module_path = module_version_query;
65 module_config = new autocode(module_path).config;
66 if (module_config.imports) {
67 loadModules(module_config.imports);
68 } else {
69 loadModules(module_config.modules);
70 }
71 continue;
72 }
73 console.log("\n" + ' UPDATE '.bgBlue.white + (" " + module_name + " " + module_version_query + " ").bgWhite.black);
74 headers = {
75 'User-Agent': 'Crystal Autocode <support@autocode.run> (https://autocode.run/autocode)'
76 };
77 access_token_url = '';
78 if (process.env.GITHUB_ACCESS_TOKEN) {
79 access_token_url += "?access_token=" + process.env.GITHUB_ACCESS_TOKEN;
80 }
81 if (module_version_query === 'latest') {
82 url = "https://api.github.com/repos/" + module_name + "/releases/latest" + access_token_url;
83 } else {
84 url = "https://api.github.com/repos/" + module_name + "/releases" + access_token_url;
85 }
86 resp = request('get', url, {
87 headers: headers,
88 allowRedirectHeaders: ['User-Agent']
89 });
90 if (resp.statusCode !== 200) {
91 throw new Error("Module (" + module_name + ") does not exist in the Crystal Hub.");
92 }
93 if (module_version_query === 'latest') {
94 release = JSON.parse(resp.body.toString());
95 module_version = semver.clean(release.tag_name);
96 tarball_url = release.tarball_url;
97 } else {
98 releases = JSON.parse(resp.body.toString());
99 if (!releases[0]) {
100 throw new Error("Repository not found for module: " + module_name);
101 }
102 for (j = 0, len = releases.length; j < len; j++) {
103 release = releases[j];
104 if (semver.satisfies(release.tag_name, module_version_query)) {
105 module_version = semver.clean(release.tag_name);
106 tarball_url = release.tarball_url;
107 break;
108 }
109 }
110 if (!module_version) {
111 throw new Error("No matches for Module (" + module_name + ") with version (" + module_version_query + ")");
112 }
113 }
114 console.log(' DOWNLOAD '.bgGreen.white + (" " + module_version + " ").bgWhite.black);
115 module_path = "" + path + config.host + "/" + module_path_name + "/" + module_version;
116 url = "" + tarball_url + access_token_url;
117 response = request('get', url, {
118 headers: headers,
119 allowRedirectHeaders: ['User-Agent']
120 });
121 data = zlib.gunzipSync(response.body);
122 untar.untar(data).forEach(function(file) {
123 var buffer, file_path, filename, i, link_path;
124 filename = file.filename.split('/').slice(1).join('/');
125 file_path = require('path').dirname(filename);
126 mkdirp.sync(module_path + "/" + file_path);
127 buffer = new Buffer(file.fileData.length);
128 i = 0;
129 while (i < file.fileData.length) {
130 buffer.writeUInt8(file.fileData[i], i);
131 i++;
132 }
133 fs.writeFileSync(module_path + "/" + filename, buffer);
134 if (module_version_query === 'latest') {
135 link_path = "" + path + config.host + "/" + module_path_name + "/latest";
136 if (fs.existsSync(link_path)) {
137 fs.unlinkSync(link_path);
138 }
139 return fs.symlinkSync(module_path, link_path);
140 }
141 });
142 submodules.push(module_path);
143 module_config = new autocode(module_path).config;
144 if (module_config.imports) {
145 results.push(loadModules(module_config.imports));
146 } else {
147 results.push(loadModules(module_config.modules));
148 }
149 }
150 return results;
151 };
152 loadModules(modules);
153 for (j = 0, len = submodules.length; j < len; j++) {
154 submodule = submodules[j];
155 project = new autocode(submodule);
156 project.build({
157 skipGeneration: true
158 });
159 }
160 return console.log("\n" + ' DONE! '.bgGreen.white);
161 };
162
163 module.exports = update;
164
165}).call(this);