Upgrade po2json v0.0.6 -> v0.2.3
[KiwiIRC.git] / client / build.js
1 var fs = require('fs'),
2 uglifyJS = require('uglify-js'),
3 _ = require('lodash'),
4 po2json = require('po2json'),
5 config = require('../server/configuration.js');
6
7 var FILE_ENCODING = 'utf-8',
8 EOL = '\n';
9
10
11 function concat(file_list, callback) {
12 var num_files = file_list.length,
13 files = [],
14 loaded = 0,
15 error = false;
16
17 file_list.forEach(function (file_path, idx) {
18 if (error) {
19 return;
20 }
21 fs.readFile(file_path, { encoding: FILE_ENCODING }, function (err, data) {
22 if (error) {
23 return;
24 } else if (err) {
25 error = true;
26 return callback(err);
27 }
28 files[idx] = data + '\n\n';
29 if (++loaded === num_files) {
30 callback(null, files.join(EOL));
31 }
32 });
33 });
34 }
35
36
37
38 config.loadConfig();
39
40
41 var source_files = [
42 __dirname + '/src/app.js',
43 __dirname + '/src/models/application.js',
44 __dirname + '/src/models/gateway.js',
45 __dirname + '/src/models/network.js',
46 __dirname + '/src/models/member.js',
47 __dirname + '/src/models/memberlist.js',
48 __dirname + '/src/models/newconnection.js',
49 __dirname + '/src/models/panel.js',
50 __dirname + '/src/models/panellist.js',
51 __dirname + '/src/models/networkpanellist.js',
52 __dirname + '/src/models/channel.js',
53 __dirname + '/src/models/query.js',
54 __dirname + '/src/models/server.js',
55 __dirname + '/src/models/applet.js',
56 __dirname + '/src/models/pluginmanager.js',
57 __dirname + '/src/models/datastore.js',
58 __dirname + '/src/models/channelinfo.js',
59
60 __dirname + '/src/applets/settings.js',
61 __dirname + '/src/applets/chanlist.js',
62 __dirname + '/src/applets/scripteditor.js',
63
64 __dirname + '/src/helpers/utils.js',
65
66 __dirname + '/src/views/panel.js',
67 __dirname + '/src/views/channel.js',
68 __dirname + '/src/views/applet.js',
69 __dirname + '/src/views/application.js',
70 __dirname + '/src/views/apptoolbar.js',
71 __dirname + '/src/views/controlbox.js',
72 __dirname + '/src/views/favicon.js',
73 __dirname + '/src/views/mediamessage.js',
74 __dirname + '/src/views/member.js',
75 __dirname + '/src/views/memberlist.js',
76 __dirname + '/src/views/menubox.js',
77 __dirname + '/src/views/networktabs.js',
78 __dirname + '/src/views/nickchangebox.js',
79 __dirname + '/src/views/resizehandler.js',
80 __dirname + '/src/views/serverselect.js',
81 __dirname + '/src/views/statusmessage.js',
82 __dirname + '/src/views/tabs.js',
83 __dirname + '/src/views/topicbar.js',
84 __dirname + '/src/views/userbox.js',
85 __dirname + '/src/views/channeltools.js',
86 __dirname + '/src/views/channelinfo.js'
87 ];
88
89
90 /**
91 * Build the kiwi.js/kiwi.min.js files
92 */
93 concat(source_files, function (err, src) {
94 if (!err) {
95 src = '(function (global, undefined) {\n\n' + src + '\n\n})(window);';
96
97 fs.writeFile(__dirname + '/assets/kiwi.js', src, { encoding: FILE_ENCODING }, function (err) {
98 if (!err) {
99 console.log('Built kiwi.js');
100 } else {
101 console.error('Error building kiwi.js:', err);
102 }
103 });
104
105 // Uglify can take take an array of filenames to produce minified code
106 // but it's not wraped in an IIFE and produces a slightly larger file
107 //src = uglifyJS.minify(source_files);
108
109 var ast = uglifyJS.parse(src, {filename: 'kiwi.js'});
110 ast.figure_out_scope();
111 ast = ast.transform(uglifyJS.Compressor({warnings: false}));
112 ast.figure_out_scope();
113 ast.compute_char_frequency();
114 ast.mangle_names();
115 src = ast.print_to_string();
116
117 fs.writeFile(__dirname + '/assets/kiwi.min.js', src, { encoding: FILE_ENCODING }, function (err) {
118 if (!err) {
119 console.log('Built kiwi.min.js');
120 } else {
121 console.error('Error building kiwi.min.js:', err);
122 }
123 });
124 } else {
125 console.error('Error building kiwi.js and kiwi.min.js:', err);
126 }
127 });
128
129
130
131
132
133
134 /**
135 * Build the engineio client + tools libs
136 */
137 concat([__dirname + '/assets/libs/engine.io.js', __dirname + '/assets/libs/engine.io.tools.js'], function (err, src) {
138 if (!err) {
139 fs.writeFile(__dirname + '/assets/libs/engine.io.bundle.js', src, { encoding: FILE_ENCODING }, function (err) {
140 if (!err) {
141 console.log('Built engine.io.bundle.js');
142 } else {
143 console.error('Error building engine.io.bundle.js:', err);
144 }
145 });
146
147 var ast = uglifyJS.parse(src, {filename: 'engine.io.bundle.js'});
148 ast.figure_out_scope();
149 ast = ast.transform(uglifyJS.Compressor({warnings: false}));
150 ast.figure_out_scope();
151 ast.compute_char_frequency();
152 ast.mangle_names();
153 src = ast.print_to_string();
154
155 fs.writeFile(__dirname + '/assets/libs/engine.io.bundle.min.js', src, { encoding: FILE_ENCODING }, function (err) {
156 if (!err) {
157 console.log('Built engine.io.bundle.min.js');
158 } else {
159 console.error('Error building engine.io.bundle.min.js:', err);
160 }
161 });
162 } else {
163 console.error('Error building engine.io.bundle.js and engine.io.bundle.min.js:', err);
164 }
165 });
166
167
168
169
170
171
172 /**
173 * Convert translations from .po to .json
174 */
175 if (!fs.existsSync(__dirname + '/assets/locales')) {
176 fs.mkdirSync(__dirname + '/assets/locales');
177 }
178 fs.readdir(__dirname + '/src/translations', function (err, translation_files) {
179 if (!err) {
180 translation_files.forEach(function (file) {
181 var locale = file.slice(0, -3);
182
183 if ((file.slice(-3) === '.po') && (locale !== 'template')) {
184 po2json.parseFile(__dirname + '/src/translations/' + file, {format: 'jed', domain: locale}, function (err, json) {
185 if (!err) {
186
187 fs.writeFile(__dirname + '/assets/locales/' + locale + '.json', JSON.stringify(json), function (err) {
188 if (!err) {
189 console.log('Built translation file %s.json', locale);
190 } else {
191 console.error('Error building translation file %s.json:', locale, err);
192 }
193 });
194 } else {
195 console.error('Error building translation file %s.json: ', locale, err);
196 }
197 });
198 }
199 });
200 } else {
201 console.error('Error building translation files:', err);
202 }
203 });
204
205
206
207
208
209
210 /**
211 * Build the index.html file
212 */
213
214 var index_src = fs.readFileSync(__dirname + '/src/index.html.tmpl', FILE_ENCODING)
215 .replace(new RegExp('<%base_path%>', 'g'), config.get().http_base_path || '/kiwi');
216
217 fs.writeFile(__dirname + '/index.html', index_src, { encoding: FILE_ENCODING }, function (err) {
218 if (!err) {
219 console.log('Built index.html');
220 } else {
221 console.error('Error building index.html');
222 }
223 });