| /* |
| Licensed to the Apache Software Foundation (ASF) under one |
| or more contributor license agreements. See the NOTICE file |
| distributed with this work for additional information |
| regarding copyright ownership. The ASF licenses this file |
| to you under the Apache License, Version 2.0 (the |
| "License"); you may not use this file except in compliance |
| with the License. You may obtain a copy of the License at |
| |
| http://www.apache.org/licenses/LICENSE-2.0 |
| |
| Unless required by applicable law or agreed to in writing, |
| software distributed under the License is distributed on an |
| "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| KIND, either express or implied. See the License for the |
| specific language governing permissions and limitations |
| under the License. |
| */ |
| |
| '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)); |
| }; |
| |
| // # 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' |
| }; |
| |
| try { |
| yeomanConfig.app = require('./bower.json').appPath || yeomanConfig.app; |
| } catch (e) {} |
| |
| grunt.initConfig({ |
| yeoman: yeomanConfig, |
| watch: { |
| coffee: { |
| files: ['<%= yeoman.app %>/scripts/{,*/}*.coffee'], |
| tasks: ['coffee:dist'] |
| }, |
| coffeeTest: { |
| files: ['test/spec/{,*/}*.coffee'], |
| tasks: ['coffee:test'] |
| }, |
| compass: { |
| files: ['<%= yeoman.app %>/styles/{,*/}*.{scss,sass}'], |
| tasks: ['compass:server'] |
| }, |
| 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 [ |
| lrSnippet, |
| mountFolder(connect, '.tmp'), |
| mountFolder(connect, yeomanConfig.app) |
| ]; |
| } |
| } |
| }, |
| test: { |
| options: { |
| middleware: function (connect) { |
| return [ |
| mountFolder(connect, '.tmp'), |
| mountFolder(connect, 'test') |
| ]; |
| } |
| } |
| }, |
| dist: { |
| options: { |
| middleware: function (connect) { |
| return [ |
| mountFolder(connect, yeomanConfig.dist) |
| ]; |
| } |
| } |
| } |
| }, |
| open: { |
| server: { |
| url: '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' |
| ] |
| }, |
| coffee: { |
| dist: { |
| files: [{ |
| expand: true, |
| cwd: '<%= yeoman.app %>/scripts', |
| src: '{,*/}*.coffee', |
| dest: '.tmp/scripts', |
| ext: '.js' |
| }] |
| }, |
| test: { |
| files: [{ |
| expand: true, |
| cwd: 'test/spec', |
| src: '{,*/}*.coffee', |
| dest: '.tmp/spec', |
| ext: '.js' |
| }] |
| } |
| }, |
| compass: { |
| options: { |
| sassDir: '<%= yeoman.app %>/styles', |
| cssDir: '.tmp/styles', |
| generatedImagesDir: '.tmp/images/generated', |
| imagesDir: '<%= yeoman.app %>/images', |
| javascriptsDir: '<%= yeoman.app %>/scripts', |
| fontsDir: '<%= yeoman.app %>/styles/fonts', |
| importPath: '<%= yeoman.app %>/bower_components', |
| httpImagesPath: '/images', |
| httpGeneratedImagesPath: '/images/generated', |
| httpFontsPath: '/styles/fonts', |
| relativeAssets: false |
| }, |
| dist: {}, |
| server: { |
| options: { |
| debugInfo: true |
| } |
| } |
| }, |
| // not used since Uglify task does concat, |
| // but still available if needed |
| /*concat: { |
| dist: {} |
| },*/ |
| rev: { |
| dist: { |
| files: { |
| src: [ |
| '<%= yeoman.dist %>/scripts/{,*/}*.js', |
| '<%= yeoman.dist %>/styles/{,*/}*.css', |
| '<%= yeoman.dist %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}', |
| '<%= yeoman.dist %>/styles/fonts/*' |
| ] |
| } |
| } |
| }, |
| useminPrepare: { |
| html: '<%= yeoman.app %>/index.html', |
| options: { |
| dest: '<%= yeoman.dist %>' |
| } |
| }, |
| usemin: { |
| html: ['<%= yeoman.dist %>/{,*/}*.html'], |
| css: ['<%= yeoman.dist %>/styles/{,*/}*.css'], |
| options: { |
| dirs: ['<%= yeoman.dist %>'] |
| } |
| }, |
| imagemin: { |
| dist: { |
| files: [{ |
| expand: true, |
| cwd: '<%= yeoman.app %>/images', |
| src: '{,*/}*.{png,jpg,jpeg}', |
| dest: '<%= yeoman.dist %>/images' |
| }] |
| } |
| }, |
| cssmin: { |
| // By default, your `index.html` <!-- Usemin Block --> will take care of |
| // minification. This option is pre-configured if you do not wish to use |
| // Usemin blocks. |
| // dist: { |
| // files: { |
| // '<%= yeoman.dist %>/styles/main.css': [ |
| // '.tmp/styles/{,*/}*.css', |
| // '<%= yeoman.app %>/styles/{,*/}*.css' |
| // ] |
| // } |
| // } |
| }, |
| 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', 'views/*.html'], |
| dest: '<%= yeoman.dist %>' |
| }] |
| } |
| }, |
| // Put files not handled in other tasks here |
| copy: { |
| dist: { |
| files: [{ |
| expand: true, |
| dot: true, |
| cwd: '<%= yeoman.app %>', |
| dest: '<%= yeoman.dist %>', |
| src: [ |
| '*.{ico,png,txt,md}', |
| '.htaccess', |
| 'bower_components/**/*', |
| 'images/{,*/}*.{gif,webp,svg}', |
| 'styles/fonts/*' |
| ] |
| }, { |
| expand: true, |
| cwd: '.tmp/images', |
| dest: '<%= yeoman.dist %>/images', |
| src: [ |
| 'generated/*' |
| ] |
| }] |
| } |
| }, |
| concurrent: { |
| server: [ |
| 'coffee:dist', |
| 'compass:server' |
| ], |
| test: [ |
| 'coffee', |
| 'compass' |
| ], |
| dist: [ |
| 'coffee', |
| 'compass:dist', |
| 'imagemin', |
| 'htmlmin' |
| ] |
| }, |
| karma: { |
| unit: { |
| configFile: 'karma.conf.js', |
| singleRun: true |
| } |
| }, |
| cdnify: { |
| dist: { |
| html: ['<%= yeoman.dist %>/*.html'] |
| } |
| }, |
| ngmin: { |
| dist: { |
| files: [{ |
| expand: true, |
| cwd: '<%= yeoman.dist %>/scripts', |
| src: '*.js', |
| dest: '<%= yeoman.dist %>/scripts' |
| }] |
| } |
| }, |
| uglify: { |
| dist: { |
| files: { |
| '<%= yeoman.dist %>/scripts/scripts.js': [ |
| '<%= yeoman.dist %>/scripts/scripts.js' |
| ] |
| } |
| } |
| } |
| }); |
| |
| 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', |
| 'karma' |
| ]); |
| |
| grunt.registerTask('build', [ |
| 'clean:dist', |
| 'useminPrepare', |
| 'concurrent:dist', |
| 'concat', |
| 'copy', |
| 'cdnify', |
| 'ngmin', |
| 'cssmin', |
| 'uglify', |
| 'rev', |
| 'usemin' |
| ]); |
| |
| grunt.registerTask('default', [ |
| 'jshint', |
| 'test', |
| 'build' |
| ]); |
| }; |