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