/
Gruntfile.js
304 lines (276 loc) · 12.8 KB
/
Gruntfile.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
module.exports = function(grunt) {
grunt.initConfig({
jshint: {
//http://www.jshint.com/docs/options/
options:{
eqeqeq: false,
latedef: false,
noempty: false,
asi:true,
loopfunc:true,
shadow:true,
sub:true,
node:true,
esversion: 6,
'-W041': true,
'-W038': true,
'-W082': true,
'-W058': true,
'-W030': true,
'-W032': true,
'-W027': true,
'-W018': true,
'-W093': true
},
all: ['Gruntfile.js', 'api/api.js', 'api/lib/*.js', 'api/parts/**/*.js', 'api/utils/common.js', 'frontend/express/app.js', 'plugins/pluginManager.js', 'plugins/**/api/*.js', 'plugins/**/api/parts/**/*.js', 'plugins/**/frontend/*.js']
},
concat: {
options: {
separator: ';'
},
dom: {
src: [
'frontend/express/public/javascripts/dom/jquery/jquery-1.8.3.min.js',
'frontend/express/public/javascripts/dom/jquery.form.js',
'frontend/express/public/javascripts/dom/tipsy/jquery.tipsy.js',
'frontend/express/public/javascripts/dom/jquery.noisy.min.js',
'frontend/express/public/javascripts/dom/jquery.sticky.headers.js',
'frontend/express/public/javascripts/dom/jqueryui/jquery-ui-1.8.22.custom.min.js',
'frontend/express/public/javascripts/dom/jqueryui/jquery-ui-i18n.js',
'frontend/express/public/javascripts/dom/slimScroll.min.js',
'frontend/express/public/javascripts/dom/jquery.easing.1.3.js',
'frontend/express/public/javascripts/dom/dataTables/js/jquery.dataTables.js',
'frontend/express/public/javascripts/dom/dataTables/js/ZeroClipboard.js',
'frontend/express/public/javascripts/dom/dataTables/js/TableTools.js',
'frontend/express/public/javascripts/dom/pace/pace.min.js',
'frontend/express/public/javascripts/dom/drop/tether.min.js',
'frontend/express/public/javascripts/dom/drop/drop.min.js'
],
dest: 'frontend/express/public/javascripts/min/countly.dom.concat.js'
},
utils: {
src: [
'frontend/express/public/javascripts/utils/underscore-min.js',
'frontend/express/public/javascripts/utils/prefixfree.min.js',
'frontend/express/public/javascripts/utils/moment/moment-with-locales.min.js',
'frontend/express/public/javascripts/utils/handlebars.js',
'frontend/express/public/javascripts/utils/backbone-min.js',
'frontend/express/public/javascripts/utils/jquery.i18n.properties-min-1.0.9.js',
'frontend/express/public/javascripts/utils/jstz.min.js',
'frontend/express/public/javascripts/utils/store+json2.min.js',
'frontend/express/public/javascripts/utils/jquery.idle-timer.js',
'frontend/express/public/javascripts/utils/textcounter.min.js',
'frontend/express/public/javascripts/utils/initialAvatar.js',
'frontend/express/public/javascripts/utils/jquery.amaran.min.js',
'frontend/express/public/javascripts/utils/jquery.titlealert.js',
'frontend/express/public/javascripts/utils/jquery.hoverIntent.minified.js',
'frontend/express/public/javascripts/utils/tooltipster/tooltipster.bundle.min.js',
'frontend/express/public/javascripts/utils/highlight/highlight.pack.js',
'frontend/express/public/javascripts/utils/dropzone.js',
'frontend/express/public/javascripts/countly/countly.common.js'
],
dest: 'frontend/express/public/javascripts/min/countly.utils.concat.js'
},
visualization: {
src: [
'frontend/express/public/javascripts/visualization/jquery.peity.min.js',
'frontend/express/public/javascripts/visualization/flot/jquery.flot.js',
'frontend/express/public/javascripts/visualization/flot/jquery.flot.tickrotor.js',
'frontend/express/public/javascripts/visualization/flot/jquery.flot.pie.js',
'frontend/express/public/javascripts/visualization/flot/jquery.flot.resize.js',
'frontend/express/public/javascripts/visualization/flot/jquery.flot.stack.js',
'frontend/express/public/javascripts/visualization/flot/jquery.flot.spline.js',
'frontend/express/public/javascripts/visualization/flot/jquery.flot.crosshair.js',
'frontend/express/public/javascripts/visualization/flot/jquery.flot.orderBars.js',
'frontend/express/public/javascripts/visualization/gauge.min.js',
'frontend/express/public/javascripts/visualization/d3/d3.min.js',
'frontend/express/public/javascripts/visualization/rickshaw/rickshaw.min.js'
],
dest: 'frontend/express/public/javascripts/min/countly.visualization.concat.js'
},
lib: {
src: [
'frontend/express/public/javascripts/countly/countly.map.helper.js',
'frontend/express/public/javascripts/countly/countly.helpers.js',
'frontend/express/public/javascripts/countly/countly.event.js',
'frontend/express/public/javascripts/countly/countly.session.js',
'frontend/express/public/javascripts/countly/countly.city.js',
'frontend/express/public/javascripts/countly/countly.location.js',
'frontend/express/public/javascripts/countly/countly.device.list.js',
'frontend/express/public/javascripts/countly/countly.device.js',
'frontend/express/public/javascripts/countly/countly.device.detail.js',
'frontend/express/public/javascripts/countly/countly.app.version.js',
'frontend/express/public/javascripts/countly/countly.carrier.js',
'frontend/express/public/javascripts/countly/countly.total.users.js',
'frontend/express/public/javascripts/countly/countly.task.manager.js',
'frontend/express/public/javascripts/countly/countly.template.js',
'frontend/express/public/javascripts/countly/countly.views.js'
],
dest: 'frontend/express/public/javascripts/min/countly.lib.concat.js'
}
},
uglify: {
options: {
banner: '/*! Countly <%= grunt.template.today("dd-mm-yyyy") %> */\n',
mangle: {
reserved: ["$super"]
}
},
dist: {
files: {
'frontend/express/public/javascripts/min/countly.dom.js': 'frontend/express/public/javascripts/min/countly.dom.concat.js',
'frontend/express/public/javascripts/min/countly.utils.js': 'frontend/express/public/javascripts/min/countly.utils.concat.js',
'frontend/express/public/javascripts/min/countly.visualization.js': 'frontend/express/public/javascripts/min/countly.visualization.concat.js',
'frontend/express/public/javascripts/min/countly.lib.js': 'frontend/express/public/javascripts/min/countly.lib.concat.js'
}
}
},
copy: {},
cssmin: {
dist: {
files: {
'frontend/express/public/stylesheets/main.min.css': [
'frontend/express/public/stylesheets/main.css',
'frontend/express/public/stylesheets/amaranjs/amaran.min.css',
'frontend/express/public/javascripts/dom/tipsy/tipsy.css',
'frontend/express/public/javascripts/visualization/rickshaw/rickshaw.min.css',
'frontend/express/public/javascripts/dom/pace/pace-theme-flash.css',
'frontend/express/public/javascripts/dom/drop/drop-theme-countly.min.css',
'frontend/express/public/javascripts/utils/tooltipster/tooltipster.bundle.min.css'
]
}
}
},
mochaTest: {
test: {
options: {
reporter: 'spec',
timeout: 50000
},
src: ['test/**/*.js']
}
}
});
grunt.loadNpmTasks('grunt-contrib-jshint');
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-copy');
grunt.loadNpmTasks('grunt-contrib-cssmin');
grunt.loadNpmTasks('grunt-mocha-test');
grunt.registerTask('default', ['jshint', 'mochaTest']);
grunt.registerTask('dist', ['concat', 'uglify', 'cssmin']);
grunt.registerTask('plugins', 'Minify plugin JS / CSS files and copy images', function(){
var plugins = require('./plugins/plugins.json'), js = [], css = [], img = [], fs = require('fs'), path = require('path');
console.log('Preparing production files for following plugins: %j', plugins);
if (plugins.indexOf('push') !== -1) {
if (plugins.indexOf('geo') !== -1) {
plugins.splice(plugins.indexOf('geo'), 1);
plugins.push('geo');
}
if (plugins.indexOf('push_approver') !== -1) {
plugins.splice(plugins.indexOf('push_approver'), 1);
plugins.push('push_approver');
}
}
plugins.forEach(function(plugin){
var files, pluginPath = path.join(__dirname, 'plugins', plugin),
javascripts = path.join(pluginPath, 'frontend/public/javascripts'),
stylesheets = path.join(pluginPath, 'frontend/public/stylesheets'),
images = path.join(pluginPath, 'frontend/public/images', plugin);
if (fs.existsSync(javascripts) && fs.statSync(javascripts).isDirectory()) {
files = fs.readdirSync(javascripts);
if (files.length) {
// move models to the top, then all dependencies, then views
for (var i = 0; i < files.length; i++) {
if (files[i].indexOf('countly.models.js') !== -1 && i !== 0) {
files.splice(0, 0, files.splice(i, 1)[0]);
} else if (files[i].indexOf('countly.views.js') !== -1 && i !== files.length - 1) {
files.splice(files.length - 1, 0, files.splice(i, 1)[0]);
}
}
files.forEach(function(name){
var file = path.join(javascripts, name);
if (fs.statSync(file).isFile() && name.indexOf('.') !== 0) {
js.push('plugins/' + plugin + '/frontend/public/javascripts/' + name);
}
});
}
}
if (fs.existsSync(stylesheets) && fs.statSync(stylesheets).isDirectory()) {
files = fs.readdirSync(stylesheets);
files.forEach(function(name){
var file = path.join(stylesheets, name);
if (fs.statSync(file).isFile() && name !== 'pre-login.css' && name.indexOf('.') !== 0) {
css.push('plugins/' + plugin + '/frontend/public/stylesheets/' + name);
}
});
}
try {
if (fs.existsSync(images) && fs.statSync(images).isDirectory()) {
img.push({expand: true, cwd:'plugins/' + plugin + '/frontend/public/images/' + plugin + '/', filter:'isFile', src:'**', dest: 'frontend/express/public/images/' + plugin + '/'});
}
} catch(err) {
if (err.code !== 'ENOENT') { throw err; }
}
});
grunt.config('copy.plugins.files', img);
grunt.config('concat.plugins.src', js);
grunt.config('concat.plugins.dest', 'frontend/express/public/javascripts/min/countly.plugins.concat.js');
grunt.config('uglify.plugins.files.frontend/express/public/javascripts/min/countly\\.plugins\\.js', 'frontend/express/public/javascripts/min/countly.plugins.concat.js');
grunt.config('cssmin.plugins.files.frontend/express/public/stylesheets/plugins\\.min\\.css', css);
// grunt.task.loadTasks(['copy:plugins', 'concat:plugins', 'uglify:plugins']);
// grunt.task.run(['concat', 'uglify']);
grunt.task.run(['concat:plugins', 'uglify:plugins', 'copy:plugins', 'cssmin:plugins']);
console.log('Done preparing production files');
});
grunt.registerTask('locales', 'Concat all locale files into one', function(){
var plugins = require('./plugins/plugins.json'), locales = {}, fs = require('fs'), path = require('path');
console.log('Preparing locale files for core & plugins: %j', plugins);
var pushLocaleFile = function(name, path){
var lang = '';
name = name.replace('.properties', '');
if (name.indexOf('_') !== -1) {
lang = name.split('_').pop();
if (lang.length > 3) {
lang = '';
}
}
if (!locales[lang]) {
locales[lang] = [];
}
locales[lang].push(path);
};
[path.join(__dirname, 'frontend/express/public/localization/dashboard'), path.join(__dirname, 'frontend/express/public/localization/help'), path.join(__dirname, 'frontend/express/public/localization/mail')].forEach(function(dir){
if (!fs.existsSync(dir)) return;
fs.readdirSync(dir).forEach(function(name){
var file = path.join(dir, name);
if (fs.statSync(file).isFile() && name.indexOf('.') !== 0) {
pushLocaleFile(name, dir + '/' + name);
}
});
});
plugins.forEach(function(plugin){
var localization = path.join(__dirname, 'plugins', plugin, 'frontend/public/localization');
try {
if (fs.statSync(localization).isDirectory()) {
fs.readdirSync(localization).forEach(function(name){
var file = path.join(localization, name);
if (fs.statSync(file).isFile() && name.indexOf('.') !== 0) {
pushLocaleFile(name, 'plugins/' + plugin + '/frontend/public/localization/' + name);
}
});
}
} catch(err) {
if (err.code !== 'ENOENT') { throw err; }
}
});
for (var lang in locales) {
grunt.config('concat.locales_' + lang + '.options.separator', '\n\n');
grunt.config('concat.locales_' + lang + '.src', locales[lang]);
grunt.config('concat.locales_' + lang + '.dest', 'frontend/express/public/localization/min/locale' + (lang.length ? '_' + lang : '') + '.properties');
grunt.task.run('concat:locales_' + lang);
}
console.log('Done preparing locale files');
});
grunt.registerTask('dist-all', ['dist', 'plugins', 'locales']);
};