add python compatibility module
[ccsdk/apps.git] / sdnr / wireless-transport / code-Carbon-SR1 / apps / dlux / dlux-web / Gruntfile.js
1 var lrSnippet = require('connect-livereload')();\r
2 var mountFolder = function (connect, dir) {\r
3     return connect.static(require('path').resolve(dir));\r
4 };\r
5 \r
6 module.exports = function ( grunt ) {\r
7 \r
8   /**\r
9    * Load required Grunt tasks. These are installed based on the versions listed\r
10    * in `package.json` when you do `npm install` in this directory.\r
11    */\r
12   grunt.loadNpmTasks('grunt-contrib-clean');\r
13   grunt.loadNpmTasks('grunt-contrib-copy');\r
14   grunt.loadNpmTasks('grunt-contrib-jshint');\r
15   grunt.loadNpmTasks('grunt-contrib-concat');\r
16   grunt.loadNpmTasks('grunt-contrib-watch');\r
17   grunt.loadNpmTasks('grunt-contrib-uglify');\r
18   grunt.loadNpmTasks('grunt-conventional-changelog');\r
19   grunt.loadNpmTasks('grunt-bump');\r
20   //grunt.loadNpmTasks('grunt-recess');\r
21   grunt.loadNpmTasks('grunt-shell');\r
22   grunt.loadNpmTasks('grunt-karma');\r
23   grunt.loadNpmTasks('grunt-ng-annotate');\r
24   grunt.loadNpmTasks('grunt-html2js');\r
25   grunt.loadNpmTasks('grunt-contrib-less');\r
26   grunt.loadNpmTasks('grunt-contrib-connect');\r
27   grunt.loadNpmTasks('grunt-open');\r
28   grunt.loadNpmTasks('grunt-replace');\r
29 \r
30   /**\r
31    * Load in our build configuration file.\r
32    */\r
33   var userConfig = require( './build.config.js' );\r
34 \r
35   var envConfig = {\r
36 \r
37       replace: {\r
38           development: {\r
39               options: {\r
40                   patterns: [\r
41                       {\r
42                           json: grunt.file.readJSON('./config/development.json')\r
43                       }\r
44                   ]\r
45               },\r
46               files: [\r
47                   {\r
48                       expand: true,\r
49                       flatten: true,\r
50                       src: ['./config/env.module.js'],\r
51                       dest: 'src/common/config/'\r
52                   }\r
53               ]\r
54           },\r
55           production: {\r
56               options: {\r
57                   patterns: [\r
58                       {\r
59                           json: grunt.file.readJSON('./config/production.json')\r
60                       }\r
61                   ]\r
62               },\r
63               files: [\r
64                   {\r
65                       expand: true,\r
66                       flatten: true,\r
67                       src: ['./config/env.module.js'],\r
68                       dest: 'src/common/config/'\r
69                   }\r
70               ]\r
71           }\r
72       }\r
73   }\r
74 \r
75   /**\r
76    * This is the configuration object Grunt uses to give each plugin its\r
77    * instructions.\r
78    */\r
79   var taskConfig = {\r
80     /**\r
81      * We read in our `package.json` file so we can access the package name and\r
82      * version. It's already there, so we don't repeat ourselves here.\r
83      */\r
84     pkg: grunt.file.readJSON("package.json"),\r
85 \r
86     /**\r
87      * The banner is the comment that is placed at the top of our compiled\r
88      * source files. It is first processed as a Grunt template, where the `<%=`\r
89      * pairs are evaluated based on this very configuration object.\r
90      */\r
91     meta: {\r
92       banner:\r
93         '/**\n' +\r
94         ' * <%= pkg.name %> - v<%= pkg.version %> - <%= grunt.template.today("yyyy-mm-dd") %>\n' +\r
95         ' * <%= pkg.homepage %>\n' +\r
96         ' *\n' +\r
97         ' * Copyright (c) <%= grunt.template.today("yyyy") %> <%= pkg.author %>\n' +\r
98         ' * Licensed <%= pkg.licenses.type %> <<%= pkg.licenses.url %>>\n' +\r
99         ' */\n'\r
100     },\r
101 \r
102     /**\r
103      * Creates a changelog on a new version.\r
104      */\r
105     changelog: {\r
106       options: {\r
107         dest: 'CHANGELOG.md',\r
108         template: 'changelog.tpl'\r
109       }\r
110     },\r
111 \r
112     /**\r
113      * Increments the version number, etc.\r
114      */\r
115     bump: {\r
116       options: {\r
117         files: [\r
118           "package.json",\r
119           "bower.json"\r
120         ],\r
121         commit: false,\r
122         commitMessage: 'chore(release): v%VERSION%',\r
123         commitFiles: [\r
124           "package.json",\r
125           "client/bower.json"\r
126         ],\r
127         createTag: false,\r
128         tagName: 'v%VERSION%',\r
129         tagMessage: 'Version %VERSION%',\r
130         push: false,\r
131         pushTo: 'origin'\r
132       }\r
133     },\r
134 \r
135     /**\r
136      * The directories to delete when `grunt clean` is executed.\r
137      */\r
138     clean: [\r
139       '<%= build_dir %>',\r
140       '<%= compile_dir %>'\r
141     ],\r
142 \r
143     /**\r
144      * The `copy` task just copies files from A to B. We use it here to copy\r
145      * our project assets (images, fonts, etc.) and javascripts into\r
146      * `build_dir`, and then to copy the assets to `compile_dir`.\r
147      */\r
148     copy: {\r
149       build_app_assets: {\r
150         files: [\r
151           {\r
152             src: [ '**' ],\r
153             dest: '<%= build_dir %>/assets/',\r
154             cwd: 'src/assets',\r
155             expand: true\r
156           }\r
157        ]\r
158       },\r
159       build_vendor_assets: {\r
160         files: [\r
161           {\r
162             src: [ '<%= vendor_files.assets %>' ],\r
163             dest: '<%= build_dir %>/assets/',\r
164             cwd: '.',\r
165             expand: true,\r
166             flatten: true\r
167           }\r
168        ]\r
169       },\r
170       build_appjs: {\r
171         files: [\r
172           {\r
173             src: [ '<%= app_files.js %>', '<%= app_files.css %>', '<%= app_files.lang %>' ],\r
174             dest: '<%= build_dir %>/',\r
175             cwd: '.',\r
176             expand: true\r
177           }\r
178         ]\r
179       },\r
180       copy_template: {\r
181         files: [\r
182           {\r
183             src: ['<%= app_files.templates %>'],\r
184             dest: '<%= build_dir %>/',\r
185             cwd: '.',\r
186             expand: true\r
187           }\r
188         ]\r
189       },\r
190       build_vendorjs: {\r
191         files: [\r
192           {\r
193             src: [ '<%= vendor_files.js %>' ],\r
194             dest: '<%= build_dir %>/',\r
195             cwd: '.',\r
196             expand: true\r
197           }\r
198         ]\r
199       },\r
200       build_appimages: {\r
201         files: [\r
202           {\r
203             src: [ '<%= app_files.images %>' ],\r
204             dest: '<%= build_dir %>/',\r
205             cwd: '.',\r
206             expand: true\r
207           }\r
208         ]\r
209       },\r
210       build_vendorimages: {\r
211         files: [\r
212           {\r
213             src: [ '<%= vendor_files.images %>' ],\r
214             dest: '<%= build_dir %>/',\r
215             cwd: '.',\r
216             expand: true\r
217           }\r
218         ]\r
219       },\r
220       build_vendorcss: {\r
221         files: [\r
222           {\r
223             src: [ '<%= vendor_files.css %>' ],\r
224             dest: '<%= build_dir %>',\r
225             cwd: '.',\r
226             expand: true\r
227           }\r
228         ]\r
229       },\r
230       compile_assets: {\r
231         files: [\r
232           {\r
233             src: [ '**' ],\r
234             dest: '<%= compile_dir %>/assets',\r
235             cwd: '<%= build_dir %>/assets',\r
236             expand: true\r
237           }\r
238         ]\r
239       },\r
240 \r
241       compile_font: {\r
242         files: [\r
243           {\r
244             src: [ '**' ],\r
245             dest: '<%= compile_dir %>/font',\r
246             cwd: '<%= build_dir %>/font',\r
247             expand: true\r
248           }\r
249         ]\r
250       }\r
251     },\r
252 \r
253     /**\r
254      * `grunt concat` concatenates multiple source files into a single file.\r
255      */\r
256     concat: {\r
257       /**\r
258        * The `build_css` target concatenates compiled CSS and vendor CSS\r
259        * together.\r
260        */\r
261       build_css: {\r
262         src: [\r
263           '<%= vendor_files.css %>',\r
264           '<%= build_dir %>/assets/<%= pkg.name %>-<%= pkg.version %>.css'\r
265         ],\r
266         dest: '<%= build_dir %>/assets/<%= pkg.name %>-<%= pkg.version %>.css'\r
267       },\r
268       /**\r
269        * The `compile_js` target is the concatenation of our application source\r
270        * code and all specified vendor source code into a single file.\r
271        */\r
272       compile_js: {\r
273         options: {\r
274           banner: '<%= meta.banner %>'\r
275         },\r
276         src: [\r
277           '<%= vendor_files.js %>',\r
278           'module.prefix',\r
279           '<%= build_dir %>/src/**/*.js',\r
280           '<%= html2js.common.dest %>',\r
281           '<%= html2js.app.dest %>',\r
282           'module.suffix'\r
283         ],\r
284         dest: '<%= compile_dir %>/assets/<%= pkg.name %>-<%= pkg.version %>.js'\r
285       }\r
286     },\r
287 \r
288     /**\r
289      * `ng-min` annotates the sources before minifying. That is, it allows us\r
290      * to code without the array syntax.\r
291      */\r
292     ngAnnotate: {\r
293       options: {\r
294         singleQuotes:true\r
295       },\r
296       app: {\r
297         files: [\r
298           {\r
299             src: [ '<%= app_files.js %>' ],\r
300             cwd: '<%= build_dir %>',\r
301             dest: '<%= build_dir %>',\r
302             expand: true\r
303           }\r
304         ]\r
305       }\r
306     },\r
307 \r
308     /**\r
309      * Minify the sources!\r
310      */\r
311     uglify: {\r
312       compile: {\r
313         options: {\r
314           banner: '<%= meta.banner %>'\r
315         },\r
316         files: {\r
317           '<%= concat.compile_js.dest %>': '<%= concat.compile_js.dest %>'\r
318         }\r
319       }\r
320     },\r
321 \r
322       /**\r
323        * `less` less plugin handles the LESS compilation and minification automatically\r
324        * this has been changed to the LESS plugin from recess plugin above because of\r
325        * out of memory issues with the original plugin.\r
326        */\r
327 \r
328       less: {\r
329           development: {\r
330               options: {\r
331                   paths: ["assets/css"],\r
332                   compress: false,\r
333                   syncImport: true,\r
334                   strictImports: true\r
335               },\r
336               files: {\r
337                   '<%= build_dir %>/assets/<%= pkg.name %>-<%= pkg.version %>.css': '<%= app_files.less %>'\r
338                   }\r
339           },\r
340           production: {\r
341               options: {\r
342                   paths: ["assets/css"],\r
343                   compress: true,\r
344                   cleancss: true\r
345               },\r
346               files: {\r
347                   '<%= build_dir %>/assets/<%= pkg.name %>-<%= pkg.version %>.css': '<%= app_files.less %>'\r
348               }\r
349           }\r
350       },\r
351 \r
352     /**\r
353      * `jshint` defines the rules of our linter as well as which files we\r
354      * should check. This file, all javascript sources, and all our unit tests\r
355      * are linted based on the policies listed in `options`. But we can also\r
356      * specify exclusionary patterns by prefixing them with an exclamation\r
357      * point (!); this is useful when code comes from a third party but is\r
358      * nonetheless inside `src/`.\r
359      */\r
360     jshint: {\r
361       src: [\r
362         '<%= app_files.js %>',\r
363         '<%= app_files.app_assets %>',\r
364       ],\r
365       test: [\r
366         '<%= app_files.jsunit %>'\r
367       ],\r
368       gruntfile: [\r
369         'OriginalGruntfile.js'\r
370       ],\r
371       options: {\r
372         curly: true,\r
373         immed: true,\r
374         newcap: true,\r
375         noarg: true,\r
376         sub: true,\r
377         boss: true,\r
378         eqnull: true\r
379       },\r
380       globals: {}\r
381     },\r
382 \r
383 \r
384     /**\r
385      * HTML2JS is a Grunt plugin that takes all of your template files and\r
386      * places them into JavaScript files as strings that are added to\r
387      * AngularJS's template cache. This means that the templates too become\r
388      * part of the initial payload as one JavaScript file. Neat!\r
389      */\r
390     html2js: {\r
391       /**\r
392        * These are the templates from `src/app`.\r
393        */\r
394       app: {\r
395         options: {\r
396           base: 'src/app'\r
397         },\r
398         src: [ '<%= app_files.atpl %>' ],\r
399         dest: '<%= build_dir %>/templates-app.js'\r
400       },\r
401 \r
402       /**\r
403        * These are the templates from `src/common`.\r
404        */\r
405       common: {\r
406         options: {\r
407           base: 'src/common'\r
408         },\r
409         src: [ '<%= app_files.ctpl %>' ],\r
410         dest: '<%= build_dir %>/templates-common.js'\r
411       }\r
412     },\r
413 \r
414     /**\r
415      * The Karma configurations.\r
416      */\r
417     karma: {\r
418       options: {\r
419         configFile: '<%= build_dir %>/karma-unit.js'\r
420       },\r
421       unit: {\r
422         runnerPort: 9102,\r
423         background: true,\r
424         port: 9877 // IMPORTANT!\r
425       },\r
426       continuous: {\r
427         singleRun: true,\r
428         browsers: ['PhantomJS']\r
429       }\r
430     },\r
431 \r
432     /**\r
433      * The `index` task compiles the `index.html` file as a Grunt template. CSS\r
434      * and JS files co-exist here but they get split apart later.\r
435      */\r
436     index: {\r
437 \r
438       /**\r
439        * During development, we don't want to have wait for compilation,\r
440        * concatenation, minification, etc. So to avoid these steps, we simply\r
441        * add all script files directly to the `<head>` of `index.html`. The\r
442        * `src` property contains the list of included files.\r
443        */\r
444       build: {\r
445         dir: '<%= build_dir %>',\r
446         src: [\r
447           '<%= html2js.common.dest %>',\r
448           '<%= html2js.app.dest %>',\r
449           '<%= vendor_files.css %>',\r
450           '<%= build_dir %>/assets/<%= pkg.name %>-<%= pkg.version %>.css'\r
451         ]\r
452       },\r
453 \r
454       /**\r
455        * When it is time to have a completely compiled application, we can\r
456        * alter the above to include only a single JavaScript and a single CSS\r
457        * file. Now we're back!\r
458        */\r
459       compile: {\r
460         dir: '<%= compile_dir %>',\r
461         src: [\r
462           '<%= concat.compile_js.dest %>',\r
463           '<%= concat.build_css.dest %>'\r
464           //'<%= recess.compile.dest %>'\r
465         ]\r
466       }\r
467     },\r
468 \r
469     /**\r
470      * This task compiles the karma template so that changes to its file array\r
471      * don't have to be managed manually.\r
472      */\r
473     karmaconfig: {\r
474       unit: {\r
475         dir: '<%= build_dir %>',\r
476         src: [\r
477           '<%= vendor_files.js %>',\r
478           '<%= html2js.app.dest %>',\r
479           '<%= html2js.common.dest %>',\r
480           '<%= app_files.js_common %>',\r
481           '<%= app_files.js_app %>',\r
482           '<%= app_files.jsunit %>'\r
483         ]\r
484       }\r
485     },\r
486      connect: {\r
487       livereload: {\r
488         options: {\r
489           port: 9000,\r
490           hostname: '0.0.0.0',\r
491           middleware: function (connect) {\r
492             return [\r
493               mountFolder(connect, 'build'),\r
494               lrSnippet\r
495             ];\r
496           }\r
497         }\r
498       },\r
499       dev: {\r
500         options: {\r
501           hostname: '0.0.0.0',\r
502           port: 9000,\r
503           base: 'build'\r
504         }\r
505       },\r
506       prod: {\r
507         options: {\r
508           port: 9001,\r
509           base: 'bin',\r
510           keepalive: true\r
511         }\r
512       }\r
513     },\r
514     open: {\r
515       dev: {\r
516         path: 'http://127.0.0.1:9000/'\r
517       },\r
518       prod: {\r
519         path: 'http://127.0.0.1:9001/'\r
520       }\r
521     },\r
522     /**\r
523      * And for rapid development, we have a watch set up that checks to see if\r
524      * any of the files listed below change, and then to execute the listed\r
525      * tasks when they do. This just saves us from having to type "grunt" into\r
526      * the command-line every time we want to see what we're working on; we can\r
527      * instead just leave "grunt watch" running in a background terminal. Set it\r
528      * and forget it, as Ron Popeil used to tell us.\r
529      *\r
530      * But we don't need the same thing to happen for all the files.\r
531      */\r
532     delta: {\r
533       /**\r
534        * By default, we want the Live Reload to work for all tasks; this is\r
535        * overridden in some tasks (like this file) where browser resources are\r
536        * unaffected. It runs by default on port 35729, which your browser\r
537        * plugin should auto-detect.\r
538        */\r
539       options: {\r
540         livereload: true\r
541       },\r
542 \r
543       /**\r
544        * When the Gruntfile changes, we just want to lint it. In fact, when\r
545        * your Gruntfile changes, it will automatically be reloaded!\r
546        */\r
547       gruntfile: {\r
548         files: 'OriginalGruntfile.js',\r
549         tasks: [ 'jshint:gruntfile' ],\r
550         options: {\r
551           livereload: false\r
552         }\r
553       },\r
554 \r
555       /**\r
556        * When our JavaScript source files change, we want to run lint them and\r
557        * run our unit tests.\r
558        */\r
559       jssrc: {\r
560         files: [\r
561           '<%= app_files.js %>', '<%= app_files.lang %>'\r
562         ],\r
563         tasks: [ 'jshint:src', 'karma:unit:run', 'copy:build_appjs' ]\r
564       },\r
565 \r
566       /**\r
567        * When assets are changed, copy them. Note that this will *not* copy new\r
568        * files, so this is probably not very useful.\r
569        */\r
570       assets: {\r
571         files: [\r
572           'src/assets/**/*'\r
573         ],\r
574         tasks: [ 'copy:build_app_assets' ]\r
575       },\r
576 \r
577       /**\r
578        * When index.html changes, we need to compile it.\r
579        */\r
580       html: {\r
581         files: [ '<%= app_files.html %>' ],\r
582         tasks: [ 'index:build' ]\r
583       },\r
584 \r
585       /**\r
586        * When our templates change, we only rewrite the template cache.\r
587        */\r
588       tpls: {\r
589         files: [\r
590           '<%= app_files.atpl %>',\r
591           '<%= app_files.ctpl %>'\r
592         ],\r
593         tasks: ['copy:copy_template']/*[ 'html2js' ]*/\r
594       },\r
595 \r
596       /**\r
597        * When the CSS files change, we need to compile and minify them.\r
598        */\r
599       less: {\r
600         files: [ 'src/**/*.less' ],\r
601         tasks: [ 'less:development' ]\r
602       },\r
603 \r
604       /**\r
605        * When a JavaScript unit test file changes, we only want to lint it and\r
606        * run the unit tests. We don't want to do any live reloading.\r
607        */\r
608       jsunit: {\r
609         files: [\r
610           '<%= app_files.jsunit %>'\r
611         ],\r
612         tasks: [ 'jshint:test', 'karma:unit:run' ],\r
613         options: {\r
614           livereload: false\r
615         }\r
616       }\r
617     },\r
618     shell : {\r
619       requirejs: {\r
620         command: "node node_modules/requirejs/bin/r.js -o optimize.js"\r
621       }\r
622     }\r
623   };\r
624 \r
625   grunt.initConfig( grunt.util._.extend( taskConfig, userConfig, envConfig ) );\r
626 \r
627   /**\r
628    * In order to make it safe to just compile or copy *only* what was changed,\r
629    * we need to ensure we are starting from a clean, fresh build. So we rename\r
630    * the `watch` task to `delta` (that's why the configuration var above is\r
631    * `delta`) and then add a new task called `watch` that does a clean build\r
632    * before watching for changes.\r
633    */\r
634   grunt.renameTask( 'watch', 'delta' );\r
635   grunt.registerTask( 'watch', [ 'build', 'karma:unit', 'delta' ] );\r
636 \r
637   grunt.registerTask('live', ['build', 'connect:dev', 'delta']);\r
638   /**\r
639    * The default task is to build and compile.\r
640    */\r
641   grunt.registerTask( 'default', [ 'compile' ] );\r
642 \r
643   /**\r
644    * The `build` task gets your app ready to run for development and testing.\r
645    */\r
646   grunt.registerTask( 'common', [\r
647       'clean', 'html2js', 'jshint', 'concat:build_css', 'less:development',\r
648       'copy:build_app_assets', 'copy:build_vendor_assets',\r
649       'copy:build_appjs', 'copy:copy_template', 'copy:build_vendorimages', 'copy:build_appimages', 'copy:build_vendorjs', 'copy:build_vendorcss', 'karmaconfig', 'index:build'\r
650   ]);\r
651 \r
652   grunt.registerTask( 'build', ['replace:development', 'common', 'karma:continuous']);\r
653 \r
654   /**\r
655    * The `compile` task gets your app ready for deployment by concatenating and\r
656    * minifying your code.\r
657    */\r
658   grunt.registerTask( 'compile', ['replace:production', 'common', 'karma:continuous', 'ngAnnotate', 'shell:requirejs']);\r
659 \r
660   /**\r
661    * A utility function to get all app JavaScript sources.\r
662    */\r
663   function filterForJS ( files ) {\r
664     return files.filter( function ( file ) {\r
665       return file.match( /\.js$/ );\r
666     });\r
667   }\r
668 \r
669   /**\r
670    * A utility function to get all app CSS sources.\r
671    */\r
672   function filterForCSS ( files ) {\r
673     return files.filter( function ( file ) {\r
674       return file.match( /\.css$/ );\r
675     });\r
676   }\r
677 \r
678   /**\r
679    * The index.html template includes the stylesheet and javascript sources\r
680    * based on dynamic names calculated in this Gruntfile. This task assembles\r
681    * the list into variables for the template to use and then runs the\r
682    * compilation.\r
683    */\r
684   grunt.registerMultiTask( 'index', 'Process index.html template', function () {\r
685     var dirRE = new RegExp( '^('+grunt.config('build_dir')+'|'+grunt.config('compile_dir')+')\/', 'g' );\r
686     var jsFiles = filterForJS( this.filesSrc ).map( function ( file ) {\r
687       return file.replace( dirRE, '' );\r
688     });\r
689     var cssFiles = filterForCSS( this.filesSrc ).map( function ( file ) {\r
690       return file.replace( dirRE, '' );\r
691     });\r
692 \r
693     grunt.file.copy('src/index.html', this.data.dir + '/index.html', {\r
694       process: function ( contents, path ) {\r
695         return grunt.template.process( contents, {\r
696           data: {\r
697             scripts: jsFiles,\r
698             styles: cssFiles,\r
699             version: grunt.config( 'pkg.version' )\r
700           }\r
701         });\r
702       }\r
703     });\r
704   });\r
705 \r
706   /**\r
707    * In order to avoid having to specify manually the files needed for karma to\r
708    * run, we use grunt to manage the list for us. The `karma/*` files are\r
709    * compiled as grunt templates for use by Karma. Yay!\r
710    */\r
711   grunt.registerMultiTask( 'karmaconfig', 'Process karma config templates', function () {\r
712     var jsFiles = filterForJS( this.filesSrc );\r
713 \r
714     grunt.file.copy( 'karma/karma-unit.tpl.js', grunt.config( 'build_dir' ) + '/karma-unit.js', {\r
715       process: function ( contents, path ) {\r
716         return grunt.template.process( contents, {\r
717           data: {\r
718             scripts: jsFiles\r
719           }\r
720         });\r
721       }\r
722     });\r
723   });\r
724 \r
725 };\r