+++ /dev/null
-var lrSnippet = require('connect-livereload')();\r
-var mountFolder = function (connect, dir) {\r
- return connect.static(require('path').resolve(dir));\r
-};\r
-\r
-module.exports = function ( grunt ) {\r
-\r
- /**\r
- * Load required Grunt tasks. These are installed based on the versions listed\r
- * in `package.json` when you do `npm install` in this directory.\r
- */\r
- grunt.loadNpmTasks('grunt-contrib-clean');\r
- grunt.loadNpmTasks('grunt-contrib-copy');\r
- grunt.loadNpmTasks('grunt-contrib-jshint');\r
- grunt.loadNpmTasks('grunt-contrib-concat');\r
- grunt.loadNpmTasks('grunt-contrib-watch');\r
- grunt.loadNpmTasks('grunt-contrib-uglify');\r
- grunt.loadNpmTasks('grunt-conventional-changelog');\r
- grunt.loadNpmTasks('grunt-bump');\r
- //grunt.loadNpmTasks('grunt-recess');\r
- grunt.loadNpmTasks('grunt-shell');\r
- grunt.loadNpmTasks('grunt-karma');\r
- grunt.loadNpmTasks('grunt-ng-annotate');\r
- grunt.loadNpmTasks('grunt-html2js');\r
- grunt.loadNpmTasks('grunt-contrib-less');\r
- grunt.loadNpmTasks('grunt-contrib-connect');\r
- grunt.loadNpmTasks('grunt-open');\r
- grunt.loadNpmTasks('grunt-replace');\r
-\r
- /**\r
- * Load in our build configuration file.\r
- */\r
- var userConfig = require( './build.config.js' );\r
-\r
- var envConfig = {\r
-\r
- replace: {\r
- development: {\r
- options: {\r
- patterns: [\r
- {\r
- json: grunt.file.readJSON('./config/development.json')\r
- }\r
- ]\r
- },\r
- files: [\r
- {\r
- expand: true,\r
- flatten: true,\r
- src: ['./config/env.module.js'],\r
- dest: 'src/common/config/'\r
- }\r
- ]\r
- },\r
- production: {\r
- options: {\r
- patterns: [\r
- {\r
- json: grunt.file.readJSON('./config/production.json')\r
- }\r
- ]\r
- },\r
- files: [\r
- {\r
- expand: true,\r
- flatten: true,\r
- src: ['./config/env.module.js'],\r
- dest: 'src/common/config/'\r
- }\r
- ]\r
- }\r
- }\r
- }\r
-\r
- /**\r
- * This is the configuration object Grunt uses to give each plugin its\r
- * instructions.\r
- */\r
- var taskConfig = {\r
- /**\r
- * We read in our `package.json` file so we can access the package name and\r
- * version. It's already there, so we don't repeat ourselves here.\r
- */\r
- pkg: grunt.file.readJSON("package.json"),\r
-\r
- /**\r
- * The banner is the comment that is placed at the top of our compiled\r
- * source files. It is first processed as a Grunt template, where the `<%=`\r
- * pairs are evaluated based on this very configuration object.\r
- */\r
- meta: {\r
- banner:\r
- '/**\n' +\r
- ' * <%= pkg.name %> - v<%= pkg.version %> - <%= grunt.template.today("yyyy-mm-dd") %>\n' +\r
- ' * <%= pkg.homepage %>\n' +\r
- ' *\n' +\r
- ' * Copyright (c) <%= grunt.template.today("yyyy") %> <%= pkg.author %>\n' +\r
- ' * Licensed <%= pkg.licenses.type %> <<%= pkg.licenses.url %>>\n' +\r
- ' */\n'\r
- },\r
-\r
- /**\r
- * Creates a changelog on a new version.\r
- */\r
- changelog: {\r
- options: {\r
- dest: 'CHANGELOG.md',\r
- template: 'changelog.tpl'\r
- }\r
- },\r
-\r
- /**\r
- * Increments the version number, etc.\r
- */\r
- bump: {\r
- options: {\r
- files: [\r
- "package.json",\r
- "bower.json"\r
- ],\r
- commit: false,\r
- commitMessage: 'chore(release): v%VERSION%',\r
- commitFiles: [\r
- "package.json",\r
- "client/bower.json"\r
- ],\r
- createTag: false,\r
- tagName: 'v%VERSION%',\r
- tagMessage: 'Version %VERSION%',\r
- push: false,\r
- pushTo: 'origin'\r
- }\r
- },\r
-\r
- /**\r
- * The directories to delete when `grunt clean` is executed.\r
- */\r
- clean: [\r
- '<%= build_dir %>',\r
- '<%= compile_dir %>'\r
- ],\r
-\r
- /**\r
- * The `copy` task just copies files from A to B. We use it here to copy\r
- * our project assets (images, fonts, etc.) and javascripts into\r
- * `build_dir`, and then to copy the assets to `compile_dir`.\r
- */\r
- copy: {\r
- build_app_assets: {\r
- files: [\r
- {\r
- src: [ '**' ],\r
- dest: '<%= build_dir %>/assets/',\r
- cwd: 'src/assets',\r
- expand: true\r
- }\r
- ]\r
- },\r
- build_vendor_assets: {\r
- files: [\r
- {\r
- src: [ '<%= vendor_files.assets %>' ],\r
- dest: '<%= build_dir %>/assets/',\r
- cwd: '.',\r
- expand: true,\r
- flatten: true\r
- }\r
- ]\r
- },\r
- build_appjs: {\r
- files: [\r
- {\r
- src: [ '<%= app_files.js %>', '<%= app_files.css %>', '<%= app_files.lang %>' ],\r
- dest: '<%= build_dir %>/',\r
- cwd: '.',\r
- expand: true\r
- }\r
- ]\r
- },\r
- copy_template: {\r
- files: [\r
- {\r
- src: ['<%= app_files.templates %>'],\r
- dest: '<%= build_dir %>/',\r
- cwd: '.',\r
- expand: true\r
- }\r
- ]\r
- },\r
- build_vendorjs: {\r
- files: [\r
- {\r
- src: [ '<%= vendor_files.js %>' ],\r
- dest: '<%= build_dir %>/',\r
- cwd: '.',\r
- expand: true\r
- }\r
- ]\r
- },\r
- build_appimages: {\r
- files: [\r
- {\r
- src: [ '<%= app_files.images %>' ],\r
- dest: '<%= build_dir %>/',\r
- cwd: '.',\r
- expand: true\r
- }\r
- ]\r
- },\r
- build_vendorimages: {\r
- files: [\r
- {\r
- src: [ '<%= vendor_files.images %>' ],\r
- dest: '<%= build_dir %>/',\r
- cwd: '.',\r
- expand: true\r
- }\r
- ]\r
- },\r
- build_vendorcss: {\r
- files: [\r
- {\r
- src: [ '<%= vendor_files.css %>' ],\r
- dest: '<%= build_dir %>',\r
- cwd: '.',\r
- expand: true\r
- }\r
- ]\r
- },\r
- compile_assets: {\r
- files: [\r
- {\r
- src: [ '**' ],\r
- dest: '<%= compile_dir %>/assets',\r
- cwd: '<%= build_dir %>/assets',\r
- expand: true\r
- }\r
- ]\r
- },\r
-\r
- compile_font: {\r
- files: [\r
- {\r
- src: [ '**' ],\r
- dest: '<%= compile_dir %>/font',\r
- cwd: '<%= build_dir %>/font',\r
- expand: true\r
- }\r
- ]\r
- }\r
- },\r
-\r
- /**\r
- * `grunt concat` concatenates multiple source files into a single file.\r
- */\r
- concat: {\r
- /**\r
- * The `build_css` target concatenates compiled CSS and vendor CSS\r
- * together.\r
- */\r
- build_css: {\r
- src: [\r
- '<%= vendor_files.css %>',\r
- '<%= build_dir %>/assets/<%= pkg.name %>-<%= pkg.version %>.css'\r
- ],\r
- dest: '<%= build_dir %>/assets/<%= pkg.name %>-<%= pkg.version %>.css'\r
- },\r
- /**\r
- * The `compile_js` target is the concatenation of our application source\r
- * code and all specified vendor source code into a single file.\r
- */\r
- compile_js: {\r
- options: {\r
- banner: '<%= meta.banner %>'\r
- },\r
- src: [\r
- '<%= vendor_files.js %>',\r
- 'module.prefix',\r
- '<%= build_dir %>/src/**/*.js',\r
- '<%= html2js.common.dest %>',\r
- '<%= html2js.app.dest %>',\r
- 'module.suffix'\r
- ],\r
- dest: '<%= compile_dir %>/assets/<%= pkg.name %>-<%= pkg.version %>.js'\r
- }\r
- },\r
-\r
- /**\r
- * `ng-min` annotates the sources before minifying. That is, it allows us\r
- * to code without the array syntax.\r
- */\r
- ngAnnotate: {\r
- options: {\r
- singleQuotes:true\r
- },\r
- app: {\r
- files: [\r
- {\r
- src: [ '<%= app_files.js %>' ],\r
- cwd: '<%= build_dir %>',\r
- dest: '<%= build_dir %>',\r
- expand: true\r
- }\r
- ]\r
- }\r
- },\r
-\r
- /**\r
- * Minify the sources!\r
- */\r
- uglify: {\r
- compile: {\r
- options: {\r
- banner: '<%= meta.banner %>'\r
- },\r
- files: {\r
- '<%= concat.compile_js.dest %>': '<%= concat.compile_js.dest %>'\r
- }\r
- }\r
- },\r
-\r
- /**\r
- * `less` less plugin handles the LESS compilation and minification automatically\r
- * this has been changed to the LESS plugin from recess plugin above because of\r
- * out of memory issues with the original plugin.\r
- */\r
-\r
- less: {\r
- development: {\r
- options: {\r
- paths: ["assets/css"],\r
- compress: false,\r
- syncImport: true,\r
- strictImports: true\r
- },\r
- files: {\r
- '<%= build_dir %>/assets/<%= pkg.name %>-<%= pkg.version %>.css': '<%= app_files.less %>'\r
- }\r
- },\r
- production: {\r
- options: {\r
- paths: ["assets/css"],\r
- compress: true,\r
- cleancss: true\r
- },\r
- files: {\r
- '<%= build_dir %>/assets/<%= pkg.name %>-<%= pkg.version %>.css': '<%= app_files.less %>'\r
- }\r
- }\r
- },\r
-\r
- /**\r
- * `jshint` defines the rules of our linter as well as which files we\r
- * should check. This file, all javascript sources, and all our unit tests\r
- * are linted based on the policies listed in `options`. But we can also\r
- * specify exclusionary patterns by prefixing them with an exclamation\r
- * point (!); this is useful when code comes from a third party but is\r
- * nonetheless inside `src/`.\r
- */\r
- jshint: {\r
- src: [\r
- '<%= app_files.js %>',\r
- '<%= app_files.app_assets %>',\r
- ],\r
- test: [\r
- '<%= app_files.jsunit %>'\r
- ],\r
- gruntfile: [\r
- 'OriginalGruntfile.js'\r
- ],\r
- options: {\r
- curly: true,\r
- immed: true,\r
- newcap: true,\r
- noarg: true,\r
- sub: true,\r
- boss: true,\r
- eqnull: true\r
- },\r
- globals: {}\r
- },\r
-\r
-\r
- /**\r
- * HTML2JS is a Grunt plugin that takes all of your template files and\r
- * places them into JavaScript files as strings that are added to\r
- * AngularJS's template cache. This means that the templates too become\r
- * part of the initial payload as one JavaScript file. Neat!\r
- */\r
- html2js: {\r
- /**\r
- * These are the templates from `src/app`.\r
- */\r
- app: {\r
- options: {\r
- base: 'src/app'\r
- },\r
- src: [ '<%= app_files.atpl %>' ],\r
- dest: '<%= build_dir %>/templates-app.js'\r
- },\r
-\r
- /**\r
- * These are the templates from `src/common`.\r
- */\r
- common: {\r
- options: {\r
- base: 'src/common'\r
- },\r
- src: [ '<%= app_files.ctpl %>' ],\r
- dest: '<%= build_dir %>/templates-common.js'\r
- }\r
- },\r
-\r
- /**\r
- * The Karma configurations.\r
- */\r
- karma: {\r
- options: {\r
- configFile: '<%= build_dir %>/karma-unit.js'\r
- },\r
- unit: {\r
- runnerPort: 9102,\r
- background: true,\r
- port: 9877 // IMPORTANT!\r
- },\r
- continuous: {\r
- singleRun: true,\r
- browsers: ['PhantomJS']\r
- }\r
- },\r
-\r
- /**\r
- * The `index` task compiles the `index.html` file as a Grunt template. CSS\r
- * and JS files co-exist here but they get split apart later.\r
- */\r
- index: {\r
-\r
- /**\r
- * During development, we don't want to have wait for compilation,\r
- * concatenation, minification, etc. So to avoid these steps, we simply\r
- * add all script files directly to the `<head>` of `index.html`. The\r
- * `src` property contains the list of included files.\r
- */\r
- build: {\r
- dir: '<%= build_dir %>',\r
- src: [\r
- '<%= html2js.common.dest %>',\r
- '<%= html2js.app.dest %>',\r
- '<%= vendor_files.css %>',\r
- '<%= build_dir %>/assets/<%= pkg.name %>-<%= pkg.version %>.css'\r
- ]\r
- },\r
-\r
- /**\r
- * When it is time to have a completely compiled application, we can\r
- * alter the above to include only a single JavaScript and a single CSS\r
- * file. Now we're back!\r
- */\r
- compile: {\r
- dir: '<%= compile_dir %>',\r
- src: [\r
- '<%= concat.compile_js.dest %>',\r
- '<%= concat.build_css.dest %>'\r
- //'<%= recess.compile.dest %>'\r
- ]\r
- }\r
- },\r
-\r
- /**\r
- * This task compiles the karma template so that changes to its file array\r
- * don't have to be managed manually.\r
- */\r
- karmaconfig: {\r
- unit: {\r
- dir: '<%= build_dir %>',\r
- src: [\r
- '<%= vendor_files.js %>',\r
- '<%= html2js.app.dest %>',\r
- '<%= html2js.common.dest %>',\r
- '<%= app_files.js_common %>',\r
- '<%= app_files.js_app %>',\r
- '<%= app_files.jsunit %>'\r
- ]\r
- }\r
- },\r
- connect: {\r
- livereload: {\r
- options: {\r
- port: 9000,\r
- hostname: '0.0.0.0',\r
- middleware: function (connect) {\r
- return [\r
- mountFolder(connect, 'build'),\r
- lrSnippet\r
- ];\r
- }\r
- }\r
- },\r
- dev: {\r
- options: {\r
- hostname: '0.0.0.0',\r
- port: 9000,\r
- base: 'build'\r
- }\r
- },\r
- prod: {\r
- options: {\r
- port: 9001,\r
- base: 'bin',\r
- keepalive: true\r
- }\r
- }\r
- },\r
- open: {\r
- dev: {\r
- path: 'http://127.0.0.1:9000/'\r
- },\r
- prod: {\r
- path: 'http://127.0.0.1:9001/'\r
- }\r
- },\r
- /**\r
- * And for rapid development, we have a watch set up that checks to see if\r
- * any of the files listed below change, and then to execute the listed\r
- * tasks when they do. This just saves us from having to type "grunt" into\r
- * the command-line every time we want to see what we're working on; we can\r
- * instead just leave "grunt watch" running in a background terminal. Set it\r
- * and forget it, as Ron Popeil used to tell us.\r
- *\r
- * But we don't need the same thing to happen for all the files.\r
- */\r
- delta: {\r
- /**\r
- * By default, we want the Live Reload to work for all tasks; this is\r
- * overridden in some tasks (like this file) where browser resources are\r
- * unaffected. It runs by default on port 35729, which your browser\r
- * plugin should auto-detect.\r
- */\r
- options: {\r
- livereload: true\r
- },\r
-\r
- /**\r
- * When the Gruntfile changes, we just want to lint it. In fact, when\r
- * your Gruntfile changes, it will automatically be reloaded!\r
- */\r
- gruntfile: {\r
- files: 'OriginalGruntfile.js',\r
- tasks: [ 'jshint:gruntfile' ],\r
- options: {\r
- livereload: false\r
- }\r
- },\r
-\r
- /**\r
- * When our JavaScript source files change, we want to run lint them and\r
- * run our unit tests.\r
- */\r
- jssrc: {\r
- files: [\r
- '<%= app_files.js %>', '<%= app_files.lang %>'\r
- ],\r
- tasks: [ 'jshint:src', 'karma:unit:run', 'copy:build_appjs' ]\r
- },\r
-\r
- /**\r
- * When assets are changed, copy them. Note that this will *not* copy new\r
- * files, so this is probably not very useful.\r
- */\r
- assets: {\r
- files: [\r
- 'src/assets/**/*'\r
- ],\r
- tasks: [ 'copy:build_app_assets' ]\r
- },\r
-\r
- /**\r
- * When index.html changes, we need to compile it.\r
- */\r
- html: {\r
- files: [ '<%= app_files.html %>' ],\r
- tasks: [ 'index:build' ]\r
- },\r
-\r
- /**\r
- * When our templates change, we only rewrite the template cache.\r
- */\r
- tpls: {\r
- files: [\r
- '<%= app_files.atpl %>',\r
- '<%= app_files.ctpl %>'\r
- ],\r
- tasks: ['copy:copy_template']/*[ 'html2js' ]*/\r
- },\r
-\r
- /**\r
- * When the CSS files change, we need to compile and minify them.\r
- */\r
- less: {\r
- files: [ 'src/**/*.less' ],\r
- tasks: [ 'less:development' ]\r
- },\r
-\r
- /**\r
- * When a JavaScript unit test file changes, we only want to lint it and\r
- * run the unit tests. We don't want to do any live reloading.\r
- */\r
- jsunit: {\r
- files: [\r
- '<%= app_files.jsunit %>'\r
- ],\r
- tasks: [ 'jshint:test', 'karma:unit:run' ],\r
- options: {\r
- livereload: false\r
- }\r
- }\r
- },\r
- shell : {\r
- requirejs: {\r
- command: "node node_modules/requirejs/bin/r.js -o optimize.js"\r
- }\r
- }\r
- };\r
-\r
- grunt.initConfig( grunt.util._.extend( taskConfig, userConfig, envConfig ) );\r
-\r
- /**\r
- * In order to make it safe to just compile or copy *only* what was changed,\r
- * we need to ensure we are starting from a clean, fresh build. So we rename\r
- * the `watch` task to `delta` (that's why the configuration var above is\r
- * `delta`) and then add a new task called `watch` that does a clean build\r
- * before watching for changes.\r
- */\r
- grunt.renameTask( 'watch', 'delta' );\r
- grunt.registerTask( 'watch', [ 'build', 'karma:unit', 'delta' ] );\r
-\r
- grunt.registerTask('live', ['build', 'connect:dev', 'delta']);\r
- /**\r
- * The default task is to build and compile.\r
- */\r
- grunt.registerTask( 'default', [ 'compile' ] );\r
-\r
- /**\r
- * The `build` task gets your app ready to run for development and testing.\r
- */\r
- grunt.registerTask( 'common', [\r
- 'clean', 'html2js', 'jshint', 'concat:build_css', 'less:development',\r
- 'copy:build_app_assets', 'copy:build_vendor_assets',\r
- 'copy:build_appjs', 'copy:copy_template', 'copy:build_vendorimages', 'copy:build_appimages', 'copy:build_vendorjs', 'copy:build_vendorcss', 'karmaconfig', 'index:build'\r
- ]);\r
-\r
- grunt.registerTask( 'build', ['replace:development', 'common', 'karma:continuous']);\r
-\r
- /**\r
- * The `compile` task gets your app ready for deployment by concatenating and\r
- * minifying your code.\r
- */\r
- grunt.registerTask( 'compile', ['replace:production', 'common', 'karma:continuous', 'ngAnnotate', 'shell:requirejs']);\r
-\r
- /**\r
- * A utility function to get all app JavaScript sources.\r
- */\r
- function filterForJS ( files ) {\r
- return files.filter( function ( file ) {\r
- return file.match( /\.js$/ );\r
- });\r
- }\r
-\r
- /**\r
- * A utility function to get all app CSS sources.\r
- */\r
- function filterForCSS ( files ) {\r
- return files.filter( function ( file ) {\r
- return file.match( /\.css$/ );\r
- });\r
- }\r
-\r
- /**\r
- * The index.html template includes the stylesheet and javascript sources\r
- * based on dynamic names calculated in this Gruntfile. This task assembles\r
- * the list into variables for the template to use and then runs the\r
- * compilation.\r
- */\r
- grunt.registerMultiTask( 'index', 'Process index.html template', function () {\r
- var dirRE = new RegExp( '^('+grunt.config('build_dir')+'|'+grunt.config('compile_dir')+')\/', 'g' );\r
- var jsFiles = filterForJS( this.filesSrc ).map( function ( file ) {\r
- return file.replace( dirRE, '' );\r
- });\r
- var cssFiles = filterForCSS( this.filesSrc ).map( function ( file ) {\r
- return file.replace( dirRE, '' );\r
- });\r
-\r
- grunt.file.copy('src/index.html', this.data.dir + '/index.html', {\r
- process: function ( contents, path ) {\r
- return grunt.template.process( contents, {\r
- data: {\r
- scripts: jsFiles,\r
- styles: cssFiles,\r
- version: grunt.config( 'pkg.version' )\r
- }\r
- });\r
- }\r
- });\r
- });\r
-\r
- /**\r
- * In order to avoid having to specify manually the files needed for karma to\r
- * run, we use grunt to manage the list for us. The `karma/*` files are\r
- * compiled as grunt templates for use by Karma. Yay!\r
- */\r
- grunt.registerMultiTask( 'karmaconfig', 'Process karma config templates', function () {\r
- var jsFiles = filterForJS( this.filesSrc );\r
-\r
- grunt.file.copy( 'karma/karma-unit.tpl.js', grunt.config( 'build_dir' ) + '/karma-unit.js', {\r
- process: function ( contents, path ) {\r
- return grunt.template.process( contents, {\r
- data: {\r
- scripts: jsFiles\r
- }\r
- });\r
- }\r
- });\r
- });\r
-\r
-};\r