// Generated on 2013-06-06 using generator-webapp 0.2.2 'use strict'; var LIVERELOAD_PORT = 35729; var lrSnippet = require('connect-livereload')({port: LIVERELOAD_PORT}); var mountFolder = function(connect, dir) { return connect.static(require('path').resolve(dir)); }; var fs = require('fs'); var path = require('path'); // # Globbing // for performance reasons we're only matching one level down: // 'test/spec/{,*/}*.js' // use this if you want to recursively match all subfolders: // 'test/spec/**/*.js' module.exports = function(grunt) { // load all grunt tasks require('matchdep').filterDev('grunt-*').forEach(grunt.loadNpmTasks); // configurable paths var yeomanConfig = { app: 'app', dist: 'dist', banner: '/* Copyright(c) 2008-2013 pyLoad Team */\n' }; grunt.initConfig({ yeoman: yeomanConfig, watch: { options: { nospawn: true }, less: { files: ['<%= yeoman.app %>/styles/**/*.less'], tasks: ['less'] }, livereload: { options: { livereload: LIVERELOAD_PORT }, files: [ '<%= yeoman.app %>/**/*.html', '{.tmp,<%= yeoman.app %>}/styles/**/*.css', '{.tmp,<%= yeoman.app %>}/scripts/**/*.js', '<%= yeoman.app %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}' ] } }, connect: { options: { port: 9000, // change this to '0.0.0.0' to access the server from outside hostname: 'localhost' }, livereload: { options: { middleware: function(connect) { return [ mountFolder(connect, '.tmp'), mountFolder(connect, yeomanConfig.app), lrSnippet ]; } } }, test: { options: { middleware: function(connect) { return [ mountFolder(connect, '.tmp'), mountFolder(connect, 'test') ]; } } }, dist: { options: { middleware: function(connect) { return [ mountFolder(connect, yeomanConfig.dist) ]; } } } }, // open: { // Opens the webbrowser // server: { // path: 'http://localhost:<%= connect.options.port %>' // } // }, clean: { dist: { files: [ { dot: true, src: [ '.tmp', '<%= yeoman.dist %>/*', '!<%= yeoman.dist %>/.git*' ] } ] }, server: '.tmp' }, jshint: { options: { jshintrc: '.jshintrc' }, all: [ 'Gruntfile.js', '<%= yeoman.app %>/scripts/**/*.js', '!<%= yeoman.app %>/scripts/vendor/*', 'test/spec/{,*/}*.js' ] }, mocha: { all: { options: { run: true, urls: ['http://localhost:<%= connect.options.port %>/index.html'] } } }, less: { options: { paths: [yeomanConfig.app + '/components', yeomanConfig.app + '/styles', yeomanConfig.app + '/styles/default'] //dumpLineNumbers: true }, dist: { files: [ { expand: true, // Enable dynamic expansion. cwd: '<%= yeoman.app %>/styles/', // Src matches are relative to this path. src: ['**/main.less'], // Actual pattern(s) to match. dest: '.tmp/styles/', // Destination path prefix. ext: '.css' // Dest filepaths will have this extension. } ] } }, // not used since Uglify task does concat, // but still available if needed /*concat: { dist: {} },*/ requirejs: { dist: { // Options: https://github.com/jrburke/r.js/blob/master/build/example.build.js options: { // `name` and `out` is set by grunt-usemin baseUrl: yeomanConfig.app + '/scripts', optimize: 'none', // TODO: Figure out how to make sourcemaps work with grunt-usemin // https://github.com/yeoman/grunt-usemin/issues/30 //generateSourceMaps: true, // required to support SourceMaps // http://requirejs.org/docs/errors.html#sourcemapcomments preserveLicenseComments: false, useStrict: true, wrap: true, // Delete already included files from dist done: function(done, output) { var root = path.join(path.resolve('.'), yeomanConfig.app); var parse = require('rjs-build-analysis').parse(output); parse.bundles.forEach(function(bundle) { var parent = path.relative(path.resolve('.'), bundle.parent); bundle.children.forEach(function(f) { // Skip templates if (f.indexOf('hbs!') > -1) return; var rel = path.relative(root, f); var target = path.join(yeomanConfig.dist, rel); if (target === parent) return; if (fs.existsSync(target)) { console.log('Removing', target); fs.unlinkSync(target); // Remove the empty directories var files = fs.readdirSync(path.dirname(target)); if (files.length === 0) { fs.rmdirSync(path.dirname(target)); console.log('Removing dir', path.dirname(target)); } } }); }); done(); } //uglify2: {} // https://github.com/mishoo/UglifyJS2 } } }, rev: { dist: { files: { src: [ // TODO only main script needs a rev '<%= yeoman.dist %>/scripts/default.js', '<%= yeoman.dist %>/styles/{,*/}*.css' ] } } }, useminPrepare: { options: { dest: '<%= yeoman.dist %>' }, html: '<%= yeoman.app %>/index.html' }, usemin: { options: { dirs: ['<%= yeoman.dist %>'] }, html: ['<%= yeoman.dist %>/**/*.html'], css: ['<%= yeoman.dist %>/styles/**/*.css'] }, imagemin: { dist: { files: [ { expand: true, cwd: '<%= yeoman.app %>/images', src: '**/*.{png,jpg,jpeg}', dest: '<%= yeoman.dist %>/images' } ] } }, svgmin: { dist: { files: [ { expand: true, cwd: '<%= yeoman.app %>/images', src: '**/*.svg', dest: '<%= yeoman.dist %>/images' } ] } }, cssmin: { options: { banner: yeomanConfig.banner }, dist: { expand: true, cwd: '<%= yeoman.app %>/styles', src: ['**/*.css', '!*.min.css'], dest: '<%= yeoman.dist %>/styles', ext: '.css' } }, uglify: { // JS min options: { mangle: true, report: 'min', preserveComments: false, banner: yeomanConfig.banner }, dist: { expand: true, cwd: '<%= yeoman.dist %>/scripts', dest: '<%= yeoman.dist %>/scripts', src: ['**/*.js'] } }, htmlmin: { dist: { options: { /*removeCommentsFromCDATA: true, // https://github.com/yeoman/grunt-usemin/issues/44 //collapseWhitespace: true, collapseBooleanAttributes: true, removeAttributeQuotes: true, removeRedundantAttributes: true, useShortDoctype: true, removeEmptyAttributes: true, removeOptionalTags: true*/ }, files: [ { expand: true, cwd: '<%= yeoman.app %>', src: ['*.html'], dest: '<%= yeoman.dist %>' } ] } }, // Put files not handled in other tasks here copy: { // Copy files from third party libraries libs: { files: [ { expand: true, flatten: true, cwd: '<% yeoman.app %>', dest: '.tmp/fonts', src: [ '**/font-awesome/font/*' ] }, { expand: true, flatten: true, cwd: '<% yeoman.app %>', dest: '.tmp/vendor', src: [ '**/select2/select2.{js,png,css}', '**/select2/select2-spinner.gif', '**/select2/select2x2.png' ] } ] }, dist: { files: [ { expand: true, dot: true, cwd: '<%= yeoman.app %>', dest: '<%= yeoman.dist %>', src: [ '*.{ico,txt}', 'images/{,*/}*.{webp,gif}', 'templates/**/*.html', 'scripts/**/*.js', 'fonts/*' ] }, { expand: true, cwd: '.tmp/', dest: '<%= yeoman.dist %>/', src: [ 'fonts/*', '**/*.{css,gif,png,js,html}' ] } ] }, tmp: { files: [ { expand: true, cwd: '.tmp/', dest: '<%= yeoman.dist %>/', src: [ 'fonts/*', '**/*.{css,gif,png,js,html}' ] } ] } }, concurrent: { server: [ 'copy:libs', 'less:dist' ], test: [ 'less' ], dist: [ 'less', 'imagemin', 'svgmin', 'htmlmin' // 'cssmin', // 'uglify' ] } }); grunt.registerTask('server', function(target) { if (target === 'dist') { return grunt.task.run(['build', 'open', 'connect:dist:keepalive']); } grunt.task.run([ 'clean:server', 'concurrent:server', 'connect:livereload', 'open', 'watch' ]); }); grunt.registerTask('test', [ 'clean:server', 'concurrent:test', 'connect:test', 'mocha' ]); grunt.registerTask('build', [ 'clean:dist', 'copy:libs', 'useminPrepare', 'concurrent:dist', 'requirejs', 'cssmin', 'concat', 'uglify', 'copy:dist', 'rev', 'usemin' ]); grunt.registerTask('default', [ 'jshint', 'test', 'build' ]); };