Simplified http handler. /deep/base/path/urls/irc.network.com URLs now working
[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 __dirname + '/src/applets/settings.js',
84 __dirname + '/src/applets/chanlist.js',
85 __dirname + '/src/applets/scripteditor.js',
86 __dirname + '/src/applets/startup.js'
87 ];
88
89
90 var helpers_path = __dirname + '/src/helpers/';
91 var helpers_sources = fs.readdirSync(helpers_path)
92 .map(function(file){
93 return helpers_path + file;
94 });
95
96 source_files = source_files.concat(helpers_sources);
97
98
99 /**
100 * Build the kiwi.js/kiwi.min.js files
101 */
102 concat(source_files, function (err, src) {
103 if (!err) {
104 src = '(function (global, undefined) {\n\n' + src + '\n\n})(window);';
105
106 fs.writeFile(__dirname + '/assets/kiwi.js', src, { encoding: FILE_ENCODING }, function (err) {
107 if (!err) {
108 console.log('Built kiwi.js');
109 } else {
110 console.error('Error building kiwi.js:', err);
111 }
112 });
113
114 // Uglify can take take an array of filenames to produce minified code
115 // but it's not wraped in an IIFE and produces a slightly larger file
116 //src = uglifyJS.minify(source_files);
117
118 var ast = uglifyJS.parse(src, {filename: 'kiwi.js'});
119 ast.figure_out_scope();
120 ast = ast.transform(uglifyJS.Compressor({warnings: false}));
121 ast.figure_out_scope();
122 ast.compute_char_frequency();
123 ast.mangle_names();
124 src = ast.print_to_string();
125
126 fs.writeFile(__dirname + '/assets/kiwi.min.js', src, { encoding: FILE_ENCODING }, function (err) {
127 if (!err) {
128 console.log('Built kiwi.min.js');
129 } else {
130 console.error('Error building kiwi.min.js:', err);
131 }
132 });
133 } else {
134 console.error('Error building kiwi.js and kiwi.min.js:', err);
135 }
136 });
137
138
139
140
141
142
143 /**
144 * Build the engineio client + tools libs
145 */
146 concat([__dirname + '/assets/libs/engine.io.js', __dirname + '/assets/libs/engine.io.tools.js'], function (err, src) {
147 if (!err) {
148 fs.writeFile(__dirname + '/assets/libs/engine.io.bundle.js', src, { encoding: FILE_ENCODING }, function (err) {
149 if (!err) {
150 console.log('Built engine.io.bundle.js');
151 } else {
152 console.error('Error building engine.io.bundle.js:', err);
153 }
154 });
155
156 var ast = uglifyJS.parse(src, {filename: 'engine.io.bundle.js'});
157 ast.figure_out_scope();
158 ast = ast.transform(uglifyJS.Compressor({warnings: false}));
159 ast.figure_out_scope();
160 ast.compute_char_frequency();
161 ast.mangle_names();
162 src = ast.print_to_string();
163
164 fs.writeFile(__dirname + '/assets/libs/engine.io.bundle.min.js', src, { encoding: FILE_ENCODING }, function (err) {
165 if (!err) {
166 console.log('Built engine.io.bundle.min.js');
167 } else {
168 console.error('Error building engine.io.bundle.min.js:', err);
169 }
170 });
171 } else {
172 console.error('Error building engine.io.bundle.js and engine.io.bundle.min.js:', err);
173 }
174 });
175
176
177
178
179
180
181 /**
182 * Convert translations from .po to .json
183 */
184 if (!fs.existsSync(__dirname + '/assets/locales')) {
185 fs.mkdirSync(__dirname + '/assets/locales');
186 }
187 fs.readdir(__dirname + '/src/translations', function (err, translation_files) {
188 if (!err) {
189 translation_files.forEach(function (file) {
190 var locale = file.slice(0, -3);
191
192 if ((file.slice(-3) === '.po') && (locale !== 'template')) {
193 po2json.parseFile(__dirname + '/src/translations/' + file, {format: 'jed', domain: locale}, function (err, json) {
194 if (!err) {
195
196 fs.writeFile(__dirname + '/assets/locales/' + locale + '.json', JSON.stringify(json), function (err) {
197 if (!err) {
198 console.log('Built translation file %s.json', locale);
199 } else {
200 console.error('Error building translation file %s.json:', locale, err);
201 }
202 });
203 } else {
204 console.error('Error building translation file %s.json: ', locale, err);
205 }
206 });
207 }
208 });
209 } else {
210 console.error('Error building translation files:', err);
211 }
212 });
213
214
215
216
217
218
219 /**
220 * Build the index.html file
221 */
222
223 var index_src = fs.readFileSync(__dirname + '/src/index.html.tmpl', FILE_ENCODING)
224 .replace(new RegExp('<%base_path%>', 'g'), config.get().http_base_path || '')
225 .replace(new RegExp('<%build_version%>', 'g'), package_json.version);
226
227 fs.writeFile(__dirname + '/index.html', index_src, { encoding: FILE_ENCODING }, function (err) {
228 if (!err) {
229 console.log('Built index.html');
230 } else {
231 console.error('Error building index.html');
232 }
233 });