UNPKG

3.27 kBJavaScriptView Raw
1// Generated by CoffeeScript 1.10.0
2(function() {
3 var fs, fstream, load, mkdirp, prompt, publish, request, tar, userHome, zlib;
4
5 fs = require('fs');
6
7 fstream = require('./publish/fstream');
8
9 load = require('./load');
10
11 mkdirp = require('mkdirp');
12
13 prompt = require('prompt');
14
15 request = require('request');
16
17 tar = require('tar-fs');
18
19 userHome = require('user-home');
20
21 zlib = require('zlib');
22
23 publish = function(opts) {
24 var config, crystal, dest, dest_dir, dest_file, packer;
25 crystal = this;
26 console.log('Publishing...');
27 this.path = opts._ && opts._[1] ? opts._[1] : '.';
28 dest_dir = userHome + "/.autocode/tmp";
29 mkdirp.sync(dest_dir);
30 config = load(this.path);
31 dest_file = dest_dir + "/" + config.name + "-" + config.version;
32 dest = fs.createWriteStream(dest_file + ".tar");
33 packer = tar.Pack().on('error', function(err) {
34 return console.error("An error occurred: " + err);
35 }).on('end', function() {
36 fs.createReadStream(dest_file + ".tar").pipe(zlib.createGzip()).pipe(fs.createWriteStream(dest_file + ".tgz"));
37 fs.unlinkSync(dest_file + ".tar");
38 prompt.message = '';
39 prompt.delimiter = '';
40 prompt.start();
41 return prompt.get({
42 properties: {
43 username: {
44 "default": crystal.cache('username'),
45 description: 'Enter your username',
46 required: true,
47 type: 'string'
48 },
49 password: {
50 description: 'Enter your password',
51 hidden: true,
52 required: true,
53 type: 'string'
54 }
55 }
56 }, publish);
57 });
58 publish = function(err, result) {
59 var formData;
60 if (!result) {
61 throw new Error('Username/Password is required.');
62 }
63 if (!result.username) {
64 throw new Error('Username is required.');
65 }
66 if (!result.password) {
67 throw new Error('Password is required.');
68 }
69 if (!crystal.cache('username')) {
70 crystal.cache('username', result.username);
71 }
72 formData = {
73 file: fs.createReadStream(dest_file + ".tgz"),
74 name: config.name,
75 version: config.version.split('.')
76 };
77 return request.post({
78 auth: {
79 username: result.username,
80 password: result.password
81 },
82 formData: formData,
83 url: crystal.url('api', 'publish')
84 }, function(err, resp, body) {
85 var name, version;
86 fs.unlinkSync(dest_file + ".tgz");
87 if (err || resp.statusCode !== 200) {
88 if (body === 'Version already exists.') {
89 name = formData.name;
90 version = formData.version.join('.');
91 throw new Error("Version already exists (" + version + ") for generator (" + name + ").");
92 }
93 throw new Error('Unable to publish project.');
94 }
95 crystal.cache('username', result.username);
96 return console.log('Done.');
97 });
98 };
99 return fstream({
100 folder: config.version,
101 path: this.path,
102 type: 'Directory'
103 }).on('error', function(err) {
104 return console.error("An error occurred: " + err);
105 }).pipe(packer).pipe(dest);
106 };
107
108 module.exports = publish;
109
110}).call(this);