@@ -12,18 +12,119 @@ module.exports = function(grunt) {
1212 shadow :true ,
1313 sub :true ,
1414 node :true ,
15- " -W041" : true ,
16- " -W038" : true ,
17- " -W082" : true ,
18- " -W058" : true ,
19- " -W030" : true ,
20- " -W032" : true ,
21- " -W027" : true ,
22- " -W018" : true
15+ ' -W041' : true ,
16+ ' -W038' : true ,
17+ ' -W082' : true ,
18+ ' -W058' : true ,
19+ ' -W030' : true ,
20+ ' -W032' : true ,
21+ ' -W027' : true ,
22+ ' -W018' : true
2323 } ,
2424 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' ]
2525 } ,
26- // Configure a mochaTest task
26+ concat : {
27+ options : {
28+ separator : ';'
29+ } ,
30+ dom : {
31+ src : [
32+ 'frontend/express/public/javascripts/dom/jquery/jquery-1.8.3.min.js' ,
33+ 'frontend/express/public/javascripts/dom/jquery.form.js' ,
34+ 'frontend/express/public/javascripts/dom/tipsy/jquery.tipsy.js' ,
35+ 'frontend/express/public/javascripts/dom/jquery.noisy.min.js' ,
36+ 'frontend/express/public/javascripts/dom/jquery.sticky.headers.js' ,
37+ 'frontend/express/public/javascripts/dom/jqueryui/jquery-ui-1.8.22.custom.min.js' ,
38+ 'frontend/express/public/javascripts/dom/jqueryui/jquery-ui-i18n.js' ,
39+ 'frontend/express/public/javascripts/dom/slimScroll.min.js' ,
40+ 'frontend/express/public/javascripts/dom/jquery.easing.1.3.js' ,
41+ 'frontend/express/public/javascripts/dom/dataTables/js/jquery.dataTables.js' ,
42+ 'frontend/express/public/javascripts/dom/dataTables/js/ZeroClipboard.js' ,
43+ 'frontend/express/public/javascripts/dom/dataTables/js/TableTools.js' ,
44+ ] ,
45+ dest : 'frontend/express/public/javascripts/min/countly.dom.concat.js'
46+ } ,
47+ utils : {
48+ src : [
49+ 'frontend/express/public/javascripts/utils/underscore-min.js' ,
50+ 'frontend/express/public/javascripts/utils/prefixfree.min.js' ,
51+ 'frontend/express/public/javascripts/utils/moment/moment.min.js' ,
52+ 'frontend/express/public/javascripts/utils/moment/moment.isocalendar.min.js' ,
53+ 'frontend/express/public/javascripts/utils/moment/lang-all.min.js' ,
54+ 'frontend/express/public/javascripts/utils/handlebars.js' ,
55+ 'frontend/express/public/javascripts/utils/backbone-min.js' ,
56+ 'frontend/express/public/javascripts/utils/jquery.i18n.properties-min-1.0.9.js' ,
57+ 'frontend/express/public/javascripts/utils/jstz.min.js' ,
58+ 'frontend/express/public/javascripts/utils/store+json2.min.js' ,
59+ 'frontend/express/public/javascripts/utils/jquery.idle-timer.js' ,
60+ 'frontend/express/public/javascripts/utils/textcounter.min.js' ,
61+ 'frontend/express/public/javascripts/utils/initialAvatar.js' ,
62+ 'frontend/express/public/javascripts/utils/jquery.amaran.min.js' ,
63+ 'frontend/express/public/javascripts/utils/jquery.titlealert.js' ,
64+ 'frontend/express/public/javascripts/countly/countly.common.js' ,
65+ ] ,
66+ dest : 'frontend/express/public/javascripts/min/countly.utils.concat.js'
67+ } ,
68+ visualization : {
69+ src : [
70+ 'frontend/express/public/javascripts/visualization/jquery.peity.min.js' ,
71+ 'frontend/express/public/javascripts/visualization/flot/jquery.flot.js' ,
72+ 'frontend/express/public/javascripts/visualization/flot/jquery.flot.tickrotor.js' ,
73+ 'frontend/express/public/javascripts/visualization/flot/jquery.flot.pie.js' ,
74+ 'frontend/express/public/javascripts/visualization/flot/jquery.flot.resize.js' ,
75+ 'frontend/express/public/javascripts/visualization/flot/jquery.flot.stack.js' ,
76+ 'frontend/express/public/javascripts/visualization/gauge.min.js' ,
77+ 'frontend/express/public/javascripts/visualization/d3/d3.v2.min.js' ,
78+ 'frontend/express/public/javascripts/visualization/d3/d3.layout.min.js' ,
79+ 'frontend/express/public/javascripts/visualization/rickshaw/rickshaw.min.js' ,
80+ ] ,
81+ dest : 'frontend/express/public/javascripts/min/countly.visualization.concat.js'
82+ } ,
83+ lib : {
84+ src : [
85+ 'frontend/express/public/javascripts/countly/countly.map.helper.js' ,
86+ 'frontend/express/public/javascripts/countly/countly.event.js' ,
87+ 'frontend/express/public/javascripts/countly/countly.session.js' ,
88+ 'frontend/express/public/javascripts/countly/countly.city.js' ,
89+ 'frontend/express/public/javascripts/countly/countly.location.js' ,
90+ 'frontend/express/public/javascripts/countly/countly.user.js' ,
91+ 'frontend/express/public/javascripts/countly/countly.device.list.js' ,
92+ 'frontend/express/public/javascripts/countly/countly.device.js' ,
93+ 'frontend/express/public/javascripts/countly/countly.device.detail.js' ,
94+ 'frontend/express/public/javascripts/countly/countly.app.version.js' ,
95+ 'frontend/express/public/javascripts/countly/countly.carrier.js' ,
96+ 'frontend/express/public/javascripts/countly/countly.allapps.js' ,
97+ 'frontend/express/public/javascripts/countly/countly.template.js' ,
98+ ] ,
99+ dest : 'frontend/express/public/javascripts/min/countly.lib.concat.js'
100+ }
101+ } ,
102+ uglify : {
103+ options : {
104+ banner : '/*! Countly <%= grunt.template.today("dd-mm-yyyy") %> */\n'
105+ } ,
106+ dist : {
107+ files : {
108+ 'frontend/express/public/javascripts/min/countly.dom.js' : 'frontend/express/public/javascripts/min/countly.dom.concat.js' ,
109+ 'frontend/express/public/javascripts/min/countly.utils.js' : 'frontend/express/public/javascripts/min/countly.utils.concat.js' ,
110+ 'frontend/express/public/javascripts/min/countly.visualization.js' : 'frontend/express/public/javascripts/min/countly.visualization.concat.js' ,
111+ 'frontend/express/public/javascripts/min/countly.lib.js' : 'frontend/express/public/javascripts/min/countly.lib.concat.js' ,
112+ }
113+ }
114+ } ,
115+ copy : { } ,
116+ cssmin : {
117+ dist : {
118+ files : {
119+ 'frontend/express/public/stylesheets/main.min.css' : [
120+ 'frontend/express/public/stylesheets/main.css' ,
121+ 'frontend/express/public/stylesheets/amaranjs/amaran.min.css' ,
122+ 'frontend/express/public/javascripts/dom/tipsy/tipsy.css' ,
123+ 'frontend/express/public/javascripts/visualization/rickshaw/rickshaw.min.css' ,
124+ ] ,
125+ }
126+ }
127+ } ,
27128 mochaTest : {
28129 test : {
29130 options : {
@@ -36,7 +137,140 @@ module.exports = function(grunt) {
36137 } ) ;
37138
38139 grunt . loadNpmTasks ( 'grunt-contrib-jshint' ) ;
140+ grunt . loadNpmTasks ( 'grunt-contrib-concat' ) ;
141+ grunt . loadNpmTasks ( 'grunt-contrib-uglify' ) ;
142+ grunt . loadNpmTasks ( 'grunt-contrib-copy' ) ;
143+ grunt . loadNpmTasks ( 'grunt-contrib-cssmin' ) ;
39144 grunt . loadNpmTasks ( 'grunt-mocha-test' ) ;
40- grunt . registerTask ( 'default' , [ 'jshint' , "mochaTest" ] ) ;
145+
146+ grunt . registerTask ( 'default' , [ 'jshint' , 'mochaTest' ] ) ;
147+
148+ grunt . registerTask ( 'dist' , [ 'concat' , 'uglify' , 'cssmin' ] ) ;
149+
150+ grunt . registerTask ( 'plugins' , 'Minify plugin JS / CSS files and copy images' , function ( ) {
151+ var plugins = require ( './plugins/plugins.json' ) , js = [ ] , css = [ ] , img = [ ] , fs = require ( 'fs' ) , path = require ( 'path' ) ;
152+ console . log ( 'Preparing production files for following plugins: %j' , plugins ) ;
153+
154+ plugins . forEach ( function ( plugin ) {
155+ var files , pluginPath = path . join ( __dirname , 'plugins' , plugin ) ,
156+ javascripts = path . join ( pluginPath , 'frontend/public/javascripts' ) ,
157+ stylesheets = path . join ( pluginPath , 'frontend/public/stylesheets' ) ,
158+ images = path . join ( pluginPath , 'frontend/public/images' , plugin ) ;
159+
160+ if ( fs . statSync ( javascripts ) . isDirectory ( ) ) {
161+ files = fs . readdirSync ( javascripts ) ;
162+ if ( files . length ) {
163+ // move models to the top, then all dependencies, then views
164+ for ( var i = 0 ; i < files . length ; i ++ ) {
165+ if ( files [ i ] . indexOf ( 'countly.models.js' ) !== - 1 && i !== 0 ) {
166+ files . splice ( 0 , 0 , files . splice ( i , 1 ) [ 0 ] ) ;
167+ } else if ( files [ i ] . indexOf ( 'countly.views.js' ) !== - 1 && i !== files . length - 1 ) {
168+ files . splice ( files . length - 1 , 0 , files . splice ( i , 1 ) [ 0 ] ) ;
169+ }
170+ }
171+
172+ files . forEach ( function ( name ) {
173+ var file = path . join ( javascripts , name ) ;
174+ if ( fs . statSync ( file ) . isFile ( ) ) {
175+ js . push ( 'plugins/' + plugin + '/frontend/public/javascripts/' + name ) ;
176+ }
177+ } ) ;
178+ }
179+ }
180+
181+ if ( fs . statSync ( stylesheets ) . isDirectory ( ) ) {
182+ files = fs . readdirSync ( stylesheets ) ;
183+ files . forEach ( function ( name ) {
184+ var file = path . join ( stylesheets , name ) ;
185+ if ( fs . statSync ( file ) . isFile ( ) && name !== 'pre-login.css' ) {
186+ css . push ( 'plugins/' + plugin + '/frontend/public/stylesheets/' + name ) ;
187+ }
188+ } ) ;
189+ }
190+
191+ try {
192+ if ( fs . statSync ( images ) . isDirectory ( ) ) {
193+ img . push ( 'plugins/' + plugin + '/frontend/public/images/' + plugin + '/**' ) ;
194+ }
195+ } catch ( err ) {
196+ if ( err . code !== 'ENOENT' ) { throw err ; }
197+ }
198+ } ) ;
199+
200+ grunt . config ( 'copy.plugins.src' , img ) ;
201+ grunt . config ( 'copy.plugins.dest' , 'frontend/express/public/images/' ) ;
202+ grunt . config ( 'copy.plugins.expand' , true ) ;
203+ grunt . config ( 'copy.plugins.flatten' , true ) ;
204+ grunt . config ( 'copy.plugins.filter' , 'isFile' ) ;
205+
206+ grunt . config ( 'concat.plugins.src' , js ) ;
207+ grunt . config ( 'concat.plugins.dest' , 'frontend/express/public/javascripts/min/countly.plugins.concat.js' ) ;
208+
209+ grunt . config ( 'uglify.plugins.files.frontend/express/public/javascripts/min/countly\\.plugins\\.js' , 'frontend/express/public/javascripts/min/countly.plugins.concat.js' ) ;
210+
211+ grunt . config ( 'cssmin.plugins.files.frontend/express/public/stylesheets/plugins\\.min\\.css' , css ) ;
212+
213+ // grunt.task.loadTasks(['copy:plugins', 'concat:plugins', 'uglify:plugins']);
214+ // grunt.task.run(['concat', 'uglify']);
215+ grunt . task . run ( [ 'concat:plugins' , 'uglify:plugins' , 'copy:plugins' , 'cssmin:plugins' ] ) ;
216+
217+ console . log ( 'Done preparing production files' ) ;
218+ } ) ;
219+
220+ grunt . registerTask ( 'locales' , 'Concat all locale files into one' , function ( ) {
221+ var plugins = require ( './plugins/plugins.json' ) , locales = { } , fs = require ( 'fs' ) , path = require ( 'path' ) ;
222+ console . log ( 'Preparing locale files for core & plugins: %j' , plugins ) ;
223+
224+ var pushLocaleFile = function ( name , path ) {
225+ var lang = '' ;
226+ name = name . replace ( '.properties' , '' ) ;
227+ if ( name . indexOf ( '_' ) !== - 1 ) {
228+ lang = name . split ( '_' ) . pop ( ) ;
229+ }
230+
231+ if ( ! locales [ lang ] ) {
232+ locales [ lang ] = [ ] ;
233+ }
234+
235+ locales [ lang ] . push ( path ) ;
236+ } ;
237+
238+ [ path . join ( __dirname , 'frontend/express/public/localization/dashboard' ) , path . join ( __dirname , 'frontend/express/public/localization/help' ) ] . forEach ( function ( dir ) {
239+ fs . readdirSync ( dir ) . forEach ( function ( name ) {
240+ var file = path . join ( dir , name ) ;
241+ if ( fs . statSync ( file ) . isFile ( ) ) {
242+ pushLocaleFile ( name , dir + '/' + name ) ;
243+ }
244+ } ) ;
245+ } ) ;
246+
247+ plugins . forEach ( function ( plugin ) {
248+ var localization = path . join ( __dirname , 'plugins' , plugin , 'frontend/public/localization' ) ;
249+
250+ try {
251+ if ( fs . statSync ( localization ) . isDirectory ( ) ) {
252+ fs . readdirSync ( localization ) . forEach ( function ( name ) {
253+ var file = path . join ( localization , name ) ;
254+ if ( fs . statSync ( file ) . isFile ( ) ) {
255+ pushLocaleFile ( name , 'plugins/' + plugin + '/frontend/public/localization/' + name ) ;
256+ }
257+ } ) ;
258+ }
259+ } catch ( err ) {
260+ if ( err . code !== 'ENOENT' ) { throw err ; }
261+ }
262+ } ) ;
263+
264+ for ( var lang in locales ) {
265+ grunt . config ( 'concat.locales_' + lang + '.options.separator' , '\n\n' ) ;
266+ grunt . config ( 'concat.locales_' + lang + '.src' , locales [ lang ] ) ;
267+ grunt . config ( 'concat.locales_' + lang + '.dest' , 'frontend/express/public/localization/min/locale' + ( lang . length ? '_' + lang : '' ) + '.properties' ) ;
268+ grunt . task . run ( 'concat:locales_' + lang ) ;
269+ }
270+
271+ console . log ( 'Done preparing locale files' ) ;
272+ } ) ;
41273
274+ grunt . registerTask ( 'dist-all' , [ 'dist' , 'plugins' , 'locales' ] ) ;
275+
42276} ;
0 commit comments