| // Generated on 2015-09-27 using generator-angular-fullstack 2.1.1 |
| 'use strict'; |
| |
| module.exports = function (grunt) { |
| var localConfig; |
| try { |
| localConfig = require('./server/config/local.env'); |
| } catch (e) { |
| localConfig = {}; |
| } |
| |
| // Load grunt tasks automatically, when needed |
| require('jit-grunt')(grunt, { |
| express: 'grunt-express-server', |
| useminPrepare: 'grunt-usemin', |
| ngtemplates: 'grunt-angular-templates', |
| cdnify: 'grunt-google-cdn', |
| protractor: 'grunt-protractor-runner', |
| buildcontrol: 'grunt-build-control', |
| ngconstant: 'grunt-ng-constant' |
| }); |
| |
| // Time how long tasks take. Can help when optimizing build times |
| require('time-grunt')(grunt); |
| |
| grunt.loadNpmTasks('grunt-exec'); |
| |
| // Define the configuration for all the tasks |
| grunt.initConfig({ |
| |
| // Project settings |
| pkg: grunt.file.readJSON('package.json'), |
| yeoman: { |
| // configurable paths |
| client: require('./bower.json').appPath || 'client', |
| dist: 'dist' |
| }, |
| express: { |
| options: { |
| port: process.env.PORT || 9000 |
| }, |
| dev: { |
| options: { |
| script: 'server/app.js', |
| args:[ |
| grunt.option('min') ? '' : '--unmin', |
| grunt.option('server-conf') ? '--server-conf=' + grunt.option('server-conf') : '--server-conf=development' |
| ] |
| } |
| }, |
| dev_debug: { |
| options: { |
| script: 'server/app.js', |
| debug: true, |
| args:[ |
| grunt.option('min') ? '' : '--unmin', |
| grunt.option('server-conf') ? '--server-conf=' + grunt.option('server-conf') : '--server-conf=development' |
| ] |
| } |
| }, |
| mock: { |
| options: { |
| script: 'mock/server.js' |
| } |
| }, |
| prod: { |
| options: { |
| script: 'dist/server/app.js' |
| } |
| } |
| }, |
| open: { |
| server: { |
| url: 'http://localhost:<%= express.options.port %>/ecompportal/applicationsHome' |
| } |
| }, |
| watch: { |
| injectJS: { |
| files: [ |
| '<%= yeoman.client %>/{app,components}/**/*.js', |
| '!<%= yeoman.client %>/{app,components}/**/*.spec.js', |
| '!<%= yeoman.client %>/{app,components}/**/*.mock.js', |
| '!<%= yeoman.client %>/app/app.js'], |
| tasks: ['injector:scripts'] |
| }, |
| injectCss: { |
| files: [ |
| '<%= yeoman.client %>/{app,components}/**/*.css' |
| ], |
| tasks: ['injector:css'] |
| }, |
| mochaTest: { |
| files: ['server/**/*.spec.js'], |
| tasks: ['env:test', 'mochaTest'] |
| }, |
| jsTest: { |
| files: [ |
| '<%= yeoman.client %>/{app,components}/**/*.spec.js', |
| '<%= yeoman.client %>/{app,components}/**/*.mock.js' |
| ], |
| tasks: ['newer:jshint:all', 'karma'] |
| }, |
| injectLess: { |
| files: [ |
| '<%= yeoman.client %>/{app,components}/**/*.less'], |
| tasks: ['injector:less'] |
| }, |
| less: { |
| files: [ |
| '<%= yeoman.client %>/{app,components}/**/*.less'], |
| tasks: ['less', 'autoprefixer'] |
| }, |
| babel: { |
| files: [ |
| '<%= yeoman.client %>/{app,components}/**/*.js', |
| '!<%= yeoman.client %>/{app,components}/**/*.spec.js' |
| ], |
| tasks: ['babel'] |
| }, |
| gruntfile: { |
| files: ['Gruntfile.js'] |
| }, |
| livereload: { |
| files: [ |
| '{.tmp,<%= yeoman.client %>}/{app,components}/**/*.css', |
| '{.tmp,<%= yeoman.client %>}/{app,components}/**/*.html', |
| |
| '.tmp/{app,components}/**/*.js', |
| |
| '!{.tmp,<%= yeoman.client %>}{app,components}/**/*.spec.js', |
| '!{.tmp,<%= yeoman.client %>}/{app,components}/**/*.mock.js', |
| '<%= yeoman.client %>/assets/images/{,*//*}*.{png,jpg,jpeg,gif,webp,svg}' |
| ], |
| options: { |
| livereload: true |
| } |
| }, |
| express: { |
| files: [ |
| 'server/**/*.{js,json}' |
| ], |
| tasks: ['express:dev', 'wait'], |
| options: { |
| livereload: true, |
| spawn: false //Without this option specified express won't be reloaded |
| } |
| }, |
| mock:{ |
| files:[ |
| 'mock/**/*' |
| ], |
| tasks:['express:mock'], |
| options:{ |
| spawn: false |
| } |
| }, |
| clientConf: { |
| files: [ |
| 'client/configurations/*.json' |
| ], |
| tasks: ['ngconstant'] |
| } |
| }, |
| |
| // Make sure code styles are up to par and there are no obvious mistakes |
| jshint: { |
| options: { |
| jshintrc: '<%= yeoman.client %>/.jshintrc', |
| reporter: require('jshint-stylish') |
| }, |
| server: { |
| options: { |
| jshintrc: 'server/.jshintrc' |
| }, |
| src: [ |
| 'server/**/*.js', |
| '!server/**/*.spec.js' |
| ] |
| }, |
| serverTest: { |
| options: { |
| jshintrc: 'server/.jshintrc-spec' |
| }, |
| src: ['server/**/*.spec.js'] |
| }, |
| all: [ |
| '<%= yeoman.client %>/{app,components}/**/*.js', |
| '!<%= yeoman.client %>/{app,components}/**/*.spec.js', |
| '!<%= yeoman.client %>/{app,components}/**/*.mock.js' |
| ], |
| test: { |
| src: [ |
| '<%= yeoman.client %>/{app,components}/**/*.spec.js', |
| '<%= yeoman.client %>/{app,components}/**/*.mock.js' |
| ] |
| } |
| }, |
| |
| // Empties folders to start fresh |
| clean: { |
| dist: { |
| files: [{ |
| dot: true, |
| src: [ |
| '.tmp', |
| '<%= yeoman.dist %>/*', |
| '!<%= yeoman.dist %>/.git*', |
| '!<%= yeoman.dist %>/.openshift', |
| '!<%= yeoman.dist %>/Procfile' |
| ] |
| }] |
| }, |
| server: '.tmp' |
| }, |
| |
| // Add vendor prefixed styles |
| autoprefixer: { |
| options: { |
| browsers: ['last 1 version'] |
| }, |
| dist: { |
| files: [{ |
| expand: true, |
| cwd: '.tmp/', |
| src: '{,*/}*.css', |
| dest: '.tmp/' |
| }] |
| } |
| }, |
| |
| // // Debugging with node inspector |
| // 'node-inspector': { |
| // custom: { |
| // options: { |
| // 'web-host': 'localhost' |
| // } |
| // } |
| // }, |
| |
| // Use nodemon to run server in debug mode with an initial breakpoint |
| nodemon: { |
| debug: { |
| script: 'server/app.js', |
| options: { |
| nodeArgs: ['--debug-brk'], |
| env: { |
| PORT: process.env.PORT || 9000 |
| }, |
| callback: function (nodemon) { |
| nodemon.on('log', function (event) { |
| console.log(event.colour); |
| }); |
| |
| // opens browser on initial server start |
| nodemon.on('config:update', function () { |
| setTimeout(function () { |
| require('open')('http://localhost:8080/debug?port=5858'); |
| }, 500); |
| }); |
| } |
| } |
| } |
| }, |
| |
| // Automatically inject Bower components into the app |
| wiredep: { |
| target: { |
| src: '<%= yeoman.client %>/index.html', |
| ignorePath: '<%= yeoman.client %>/', |
| exclude: [/bootstrap-sass-official/, /bootstrap.js/, '/json3/', '/es5-shim/', /bootstrap.css/, /font-awesome.css/] |
| } |
| }, |
| |
| // Renames files for browser caching purposes |
| rev: { |
| dist: { |
| files: { |
| src: [ |
| '<%= yeoman.dist %>/public/{,*/}*.js', |
| '<%= yeoman.dist %>/public/{,*/}*.css', |
| '<%= yeoman.dist %>/public/assets/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}', |
| '<%= yeoman.dist %>/public/assets/fonts/*', |
| '<%= yeoman.dist %>/public/assets/i18n/{,*/}*.{json}', |
| '!<%= yeoman.dist %>/public/assets/images/tmp/*' |
| ] |
| } |
| } |
| }, |
| |
| // Reads HTML for usemin blocks to enable smart builds that automatically |
| // concat, minify and revision files. Creates configurations in memory so |
| // additional tasks can operate on them |
| useminPrepare: { |
| html: ['<%= yeoman.client %>/index.html'], |
| options: { |
| dest: '<%= yeoman.dist %>/public' |
| } |
| }, |
| |
| // Performs rewrites based on rev and the useminPrepare configuration |
| usemin: { |
| html: ['<%= yeoman.dist %>/public/{,*/}*.html'], |
| css: ['<%= yeoman.dist %>/public/{,*/}*.css'], |
| js: ['<%= yeoman.dist %>/public/{,*/}*.js'], |
| options: { |
| assetsDirs: [ |
| '<%= yeoman.dist %>/public', |
| '<%= yeoman.dist %>/public/assets' |
| ], |
| // This is so we update image references in our ng-templates |
| patterns: { |
| js: [ |
| [/(assets\/images\/.*?\.(?:gif|jpeg|jpg|png|webp|svg))/gm, 'Update the JS to reference our revved images'] |
| ] |
| } |
| } |
| }, |
| |
| // The following *-min tasks produce minified files in the dist folder |
| imagemin: { |
| dist: { |
| files: [{ |
| expand: true, |
| cwd: '<%= yeoman.client %>/assets/images', |
| src: '{,*/}*.{png,jpg,jpeg,gif}', |
| dest: '<%= yeoman.dist %>/public/assets/images' |
| }] |
| } |
| }, |
| jsonmin: { |
| dist: { |
| files: [{ |
| expand: true, |
| cwd: '<%= yeoman.client %>/assets/i18n', |
| src: '{,*/}*.{json}', |
| dest: '<%= yeoman.dist %>/public/assets/i18n' |
| }] |
| } |
| }, |
| |
| svgmin: { |
| dist: { |
| files: [{ |
| expand: true, |
| cwd: '<%= yeoman.client %>/assets/images', |
| src: '{,*/}*.svg', |
| dest: '<%= yeoman.dist %>/public/assets/images' |
| }] |
| } |
| }, |
| |
| // Allow the use of non-minsafe AngularJS files. Automatically makes it |
| // minsafe compatible so Uglify does not destroy the ng references |
| ngAnnotate: { |
| dist: { |
| files: [{ |
| expand: true, |
| cwd: '.tmp/concat', |
| src: '**/*.js', |
| dest: '.tmp/concat' |
| }] |
| } |
| }, |
| |
| // Package all the html partials into a single javascript payload |
| ngtemplates: { |
| app: { |
| options: { |
| prefix: '' |
| } |
| }, |
| options: { |
| // This should be the name of your apps angular module |
| module: 'ecompApp', |
| htmlmin: { |
| collapseBooleanAttributes: true, |
| collapseWhitespace: true, |
| removeAttributeQuotes: true, |
| removeEmptyAttributes: true, |
| removeRedundantAttributes: true, |
| removeScriptTypeAttributes: true, |
| removeStyleLinkTypeAttributes: true |
| }, |
| usemin: 'app/app.js' |
| }, |
| main: { |
| cwd: '<%= yeoman.client %>', |
| src: ['{app,components}/**/*.html'], |
| dest: '.tmp/templates.js' |
| }, |
| tmp: { |
| cwd: '.tmp', |
| src: ['{app,components}/**/*.html'], |
| dest: '.tmp/tmp-templates.js' |
| } |
| }, |
| |
| // Replace Google CDN references |
| cdnify: { |
| dist: { |
| html: ['<%= yeoman.dist %>/public/*.html'] |
| } |
| }, |
| |
| // Copies remaining files to places other tasks can use |
| copy: { |
| dist: { |
| files: [{ |
| expand: true, |
| dot: true, |
| cwd: '<%= yeoman.client %>', |
| dest: '<%= yeoman.dist %>/public', |
| src: [ |
| '*.{ico,png,txt}', |
| '.htaccess', |
| 'bower_components/**/*', |
| 'bower_components_external/**/*', |
| 'assets/images/**/*', |
| 'assets/i18n/**/*', |
| 'assets/fonts/**/*', |
| 'index.html' |
| ] |
| }, { |
| expand: true, |
| cwd: '.tmp/images', |
| dest: '<%= yeoman.dist %>/public/assets/images', |
| src: ['generated/*'] |
| }, { |
| expand: true, |
| cwd: '.tmp/i18n', |
| dest: '<%= yeoman.dist %>/public/assets/i18n', |
| src: [ |
| 'CN.json', |
| 'EN.json' |
| ] |
| }, { |
| expand: true, |
| dest: '<%= yeoman.dist %>', |
| src: [ |
| 'package.json', |
| 'server/**/*' |
| ] |
| }] |
| }, |
| styles: { |
| expand: true, |
| cwd: '<%= yeoman.client %>', |
| dest: '.tmp/', |
| src: ['{app,components}/**/*.css'] |
| } |
| }, |
| |
| buildcontrol: { |
| options: { |
| dir: 'dist', |
| commit: true, |
| push: true, |
| connectCommits: false, |
| message: 'Built %sourceName% from commit %sourceCommit% on branch %sourceBranch%' |
| }, |
| heroku: { |
| options: { |
| remote: 'heroku', |
| branch: 'master' |
| } |
| }, |
| openshift: { |
| options: { |
| remote: 'openshift', |
| branch: 'master' |
| } |
| } |
| }, |
| |
| // Run some tasks in parallel to speed up the build process |
| concurrent: { |
| server: [ |
| 'babel', |
| 'less', |
| ], |
| test: [ |
| 'babel', |
| 'less', |
| ], |
| debug: { |
| tasks: [ |
| 'nodemon' |
| //'node-inspector' |
| ], |
| options: { |
| logConcurrentOutput: true |
| } |
| }, |
| dist: [ |
| 'babel', |
| 'less', |
| //'imagemin', |
| 'svgmin' |
| ] |
| }, |
| |
| // Test settings |
| karma: { |
| unit: { |
| configFile: 'karma.conf.js', |
| singleRun: true |
| } |
| }, |
| |
| mochaTest: { |
| options: { |
| reporter: 'spec' |
| }, |
| src: ['server/**/*.spec.js'] |
| }, |
| |
| protractor: { |
| options: { |
| configFile: 'protractor.conf.js' |
| }, |
| chrome: { |
| options: { |
| args: { |
| browser: 'chrome' |
| } |
| } |
| } |
| }, |
| |
| env: { |
| test: { |
| NODE_ENV: 'test' |
| }, |
| prod: { |
| NODE_ENV: 'production' |
| }, |
| all: localConfig |
| }, |
| |
| // Compiles ES6 to JavaScript using Babel |
| babel: { |
| options: { |
| sourceMap: true |
| }, |
| server: { |
| files: [{ |
| expand: true, |
| cwd: 'client', |
| src: [ |
| '{app,components}/**/*.js', |
| '!{app,components}/**/*.spec.js' |
| ], |
| dest: '.tmp' |
| }] |
| } |
| }, |
| |
| // Compiles Less to CSS |
| less: { |
| options: { |
| paths: [ |
| '<%= yeoman.client %>/bower_components', |
| '<%= yeoman.client %>/app', |
| '<%= yeoman.client %>/components' |
| ] |
| }, |
| server: { |
| files: { |
| '.tmp/app/app.css': '<%= yeoman.client %>/app/app.less' |
| } |
| }, |
| }, |
| |
| injector: { |
| options: {}, |
| // Inject application script files into index.html (doesn't include bower) |
| scripts: { |
| options: { |
| transform: function (filePath) { |
| filePath = filePath.replace('/client/', ''); |
| filePath = filePath.replace('/.tmp/', ''); |
| return '<script src="' + filePath + '"></script>'; |
| }, |
| starttag: '<!-- injector:js -->', |
| endtag: '<!-- endinjector -->' |
| }, |
| files: { |
| '<%= yeoman.client %>/index.html': [ |
| [ |
| |
| '.tmp/{app,components}/**/*.js', |
| |
| '!{.tmp,<%= yeoman.client %>}/app/app.js', |
| '!{.tmp,<%= yeoman.client %>}/{app,components}/**/*.spec.js', |
| '!{.tmp,<%= yeoman.client %>}/{app,components}/**/*.mock.js' |
| ] |
| ] |
| } |
| }, |
| |
| // Inject component less into app.less |
| less: { |
| options: { |
| transform: function (filePath) { |
| filePath = filePath.replace('/client/app/', ''); |
| filePath = filePath.replace('/client/components/', ''); |
| return '@import \'' + filePath + '\';'; |
| }, |
| starttag: '// injector', |
| endtag: '// endinjector' |
| }, |
| files: { |
| '<%= yeoman.client %>/app/app.less': [ |
| '<%= yeoman.client %>/{app,components}/**/*.less', |
| '!<%= yeoman.client %>/app/app.less' |
| ] |
| } |
| }, |
| |
| // Inject component css into index.html |
| css: { |
| options: { |
| transform: function (filePath) { |
| filePath = filePath.replace('/client/', ''); |
| filePath = filePath.replace('/.tmp/', ''); |
| return '<link rel="stylesheet" href="' + filePath + '">'; |
| }, |
| starttag: '<!-- injector:css -->', |
| endtag: '<!-- endinjector -->' |
| }, |
| files: { |
| '<%= yeoman.client %>/index.html': [ |
| '<%= yeoman.client %>/{app,components}/**/*.css' |
| ] |
| } |
| } |
| }, |
| |
| //Project configuration task |
| ngconstant: { |
| main: { |
| options: { |
| dest: 'client/app/configurations.js', |
| name: 'ecomp.conf' |
| }, |
| constants: function () { |
| if (!grunt.option('env')) { |
| grunt.fail.warn('env parameter missing, please use --env=<environment configuration>, ex: grunt serve --env=mock'); |
| } |
| |
| return { |
| conf: grunt.file.readJSON('client/configurations/' + grunt.option('env') + '.json') |
| } |
| } |
| } |
| }, |
| exec: { |
| delete: 'sshpass -p Aa123456 ssh root@remotehost rm -rf /var/lib/tomcat/webapps/ecompportal/public/', |
| copy: 'sshpass -p Aa123456 scp -r dist/public/ root@remotehost:/var/lib/tomcat/webapps/ecompportal/' |
| } |
| }); |
| |
| //Express server task |
| |
| // Used for delaying livereload until after server has restarted |
| grunt.registerTask('wait', function () { |
| grunt.log.ok('Waiting for server reload...'); |
| |
| var done = this.async(); |
| |
| setTimeout(function () { |
| grunt.log.writeln('Done waiting!'); |
| done(); |
| }, 1500); |
| }); |
| |
| grunt.registerTask('express-keepalive', 'Keep grunt running', function () { |
| this.async(); |
| }); |
| |
| grunt.registerTask('serve', function (target) { |
| |
| if (target === 'dist') { |
| return grunt.task.run(['build', 'env:all', 'env:prod', 'express:prod', 'express:mock', 'wait', 'open', 'express-keepalive']); |
| } |
| |
| if (target === 'debug') { |
| return grunt.task.run([ |
| 'clean:server', |
| 'env:all', |
| 'injector:less', |
| 'concurrent:server', |
| 'express:mock', |
| 'injector', |
| 'wiredep', |
| 'autoprefixer', |
| 'concurrent:debug' |
| ]); |
| } |
| |
| var isDebug = grunt.option('dev_debug'); |
| |
| grunt.task.run([ |
| 'clean:server', |
| 'env:all', |
| 'ngconstant', |
| 'injector:less', |
| 'concurrent:server', |
| 'injector', |
| 'wiredep', |
| 'autoprefixer', |
| isDebug ? 'express:dev_debug' : 'express:dev', |
| 'express:mock', |
| 'wait', |
| 'open', |
| 'watch' |
| ]); |
| }); |
| |
| grunt.registerTask('server', function () { |
| grunt.log.warn('The `server` task has been deprecated. Use `grunt serve` to start a server.'); |
| grunt.task.run(['serve']); |
| }); |
| |
| grunt.registerTask('test', function (target) { |
| if (target === 'server') { |
| return grunt.task.run([ |
| 'env:all', |
| 'env:test', |
| 'mochaTest' |
| ]); |
| } |
| |
| else if (target === 'client') { |
| return grunt.task.run([ |
| 'clean:server', |
| 'env:all', |
| 'injector:less', |
| 'concurrent:test', |
| 'injector', |
| 'ngtemplates:main', |
| 'autoprefixer', |
| 'karma' |
| ]); |
| } |
| |
| else if (target === 'e2e') { |
| return grunt.task.run([ |
| 'clean:server', |
| 'env:all', |
| 'env:test', |
| 'injector:less', |
| 'concurrent:test', |
| 'injector', |
| 'wiredep', |
| 'autoprefixer', |
| 'express:dev', |
| 'protractor' |
| ]); |
| } |
| |
| else grunt.task.run([ |
| 'test:server', |
| 'test:client' |
| ]); |
| }); |
| |
| grunt.registerTask('build', [ |
| 'clean:dist', |
| 'injector:less', |
| 'ngconstant', |
| 'concurrent:dist', |
| 'injector', |
| 'wiredep', |
| 'useminPrepare', |
| 'autoprefixer', |
| 'ngtemplates', |
| 'concat', |
| 'ngAnnotate', |
| 'copy:dist', |
| //'cdnify', |
| 'cssmin', |
| 'uglify', |
| 'rev', |
| 'usemin' |
| ]); |
| |
| grunt.registerTask('default', [ |
| 'newer:jshint', |
| 'test', |
| 'build' |
| ]); |
| |
| grunt.registerTask('deploy', [ |
| 'build', |
| 'exec' |
| ]); |
| }; |