1 |
|
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);
|