Merge branch 'settings' of https://github.com/M2Ys4U/KiwiIRC into settings
[KiwiIRC.git] / client / assets / src / 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 + '/app.js',
43 __dirname + '/models/application.js',
44 __dirname + '/models/gateway.js',
45 __dirname + '/models/network.js',
46 __dirname + '/models/member.js',
47 __dirname + '/models/memberlist.js',
48 __dirname + '/models/newconnection.js',
49 __dirname + '/models/panel.js',
50 __dirname + '/models/panellist.js',
51 __dirname + '/models/networkpanellist.js',
52 __dirname + '/models/query.js',
53 __dirname + '/models/channel.js',
54 __dirname + '/models/server.js',
55 __dirname + '/models/applet.js',
56 __dirname + '/models/pluginmanager.js',
57 __dirname + '/models/datastore.js',
58
59 __dirname + '/applets/settings.js',
60 __dirname + '/applets/chanlist.js',
61 __dirname + '/applets/scripteditor.js',
62
63 __dirname + '/helpers/utils.js',
64
65 __dirname + '/views/panel.js',
66 __dirname + '/views/channel.js',
67 __dirname + '/views/applet.js',
68 __dirname + '/views/application.js',
69 __dirname + '/views/apptoolbar.js',
70 __dirname + '/views/controlbox.js',
71 __dirname + '/views/favicon.js',
72 __dirname + '/views/mediamessage.js',
73 __dirname + '/views/member.js',
74 __dirname + '/views/memberlist.js',
75 __dirname + '/views/menubox.js',
76 __dirname + '/views/networktabs.js',
77 __dirname + '/views/nickchangebox.js',
78 __dirname + '/views/resizehandler.js',
79 __dirname + '/views/serverselect.js',
80 __dirname + '/views/statusmessage.js',
81 __dirname + '/views/tabs.js',
82 __dirname + '/views/topicbar.js',
83 __dirname + '/views/userbox.js'
84 ];
85
86
87 /**
88 * Build the kiwi.js/kiwi.min.js files
89 */
90 concat(source_files, function (err, src) {
91 if (!err) {
92 src = '(function (global, undefined) {\n\n' + src + '\n\n})(window);';
93
94 fs.writeFile(__dirname + '/../kiwi.js', src, { encoding: FILE_ENCODING }, function (err) {
95 if (!err) {
96 console.log('Built kiwi.js');
97 } else {
98 console.error('Error building kiwi.js:', err);
99 }
100 });
101
102 // Uglify can take take an array of filenames to produce minified code
103 // but it's not wraped in an IIFE and produces a slightly larger file
104 //src = uglifyJS.minify(source_files);
105
106 var ast = uglifyJS.parse(src, {filename: 'kiwi.js'});
107 ast.figure_out_scope();
108 ast = ast.transform(uglifyJS.Compressor({warnings: false}));
109 ast.figure_out_scope();
110 ast.compute_char_frequency();
111 ast.mangle_names();
112 src = ast.print_to_string();
113
114 fs.writeFile(__dirname + '/../kiwi.min.js', src, { encoding: FILE_ENCODING }, function (err) {
115 if (!err) {
116 console.log('Built kiwi.min.js');
117 } else {
118 console.error('Error building kiwi.min.js:', err);
119 }
120 });
121 } else {
122 console.error('Error building kiwi.js and kiwi.min.js:', err);
123 }
124 });
125
126
127
128
129
130
131 /**
132 * Convert translations from .po to .json
133 */
134 if (!fs.existsSync(__dirname + '/../locales')) {
135 fs.mkdirSync(__dirname + '/../locales');
136 }
137 fs.readdir(__dirname + '/translations', function (err, translation_files) {
138 if (!err) {
139 translation_files.forEach(function (file) {
140 var locale = file.slice(0, -3);
141
142 if ((file.slice(-3) === '.po') && (locale !== 'template')) {
143 po2json.parse(__dirname + '/translations/' + file, function (err, json) {
144 if (!err) {
145 fs.writeFile(__dirname + '/../locales/' + locale + '.json', JSON.stringify(json), function (err) {
146 if (!err) {
147 console.log('Built translation file %s.json', locale);
148 } else {
149 console.error('Error building translation file %s.json:', locale, err);
150 }
151 });
152 } else {
153 console.error('Error building translation file %s.json: ', locale, err);
154 }
155 });
156 }
157 });
158 } else {
159 console.error('Error building translation files:', err);
160 }
161 });
162
163
164
165
166
167
168 /**
169 * Build the index.html file
170 */
171
172 var index_src = fs.readFileSync(__dirname + '/index.html.tmpl', FILE_ENCODING)
173 .replace(new RegExp('<%base_path%>', 'g'), config.get().http_base_path || '/kiwi');
174
175 fs.writeFile(__dirname + '/../../index.html', index_src, { encoding: FILE_ENCODING }, function (err) {
176 if (!err) {
177 console.log('Built index.html');
178 } else {
179 console.error('Error building index.html');
180 }
181 });