text: 'use strict';
  
  module.exports = function(grunt) {
  
    // Configurable paths
    var yoConfig = {
      livereload: 35729,
      src: 'src',
      dist: 'dist'
    };
  
    // Livereload setup
    var lrSnippet = require('connect-livereload')({port: yoConfig.livereload});
    var mountFolder = function (connect, dir) {
      return connect.static(require('path').resolve(dir));
    };
  
    // Load all grunt tasks
    require('load-grunt-tasks')(grunt, {scope: 'devDependencies'});
  
    // Project configuration
    grunt.initConfig({
      pkg: grunt.file.readJSON('package.json'),
      yo: yoConfig,
      meta: {
        banner: '/**\n' +
        ' * <%= pkg.name %>\n' +
        ' * @version v<%= pkg.version %> - <%= grunt.template.today("yyyy-mm-dd") %>\n' +
        ' * @link <%= pkg.homepage %>\n' +
        ' * @author <%= pkg.author.name %> <<%= pkg.author.email %>>\n' +
        ' * @license MIT License, http://www.opensource.org/licenses/MIT\n' +
        ' */\n'
      },
      open: {
        server: {
          path: 'http://localhost:<%= connect.options.port %>'
        }
      },
      clean: {
        dist: {
          files: [{
            dot: true,
            src: [
              '.tmp',
              '<%= yo.dist %>/*',
              '!<%= yo.dist %>/.git*'
            ]
          }]
        },
        server: '.tmp'
      },
      watch: {
        gruntfile: {
          files: '<%= jshint.gruntfile.src %>',
          tasks: ['jshint:gruntfile']
        },
        app: {
          files: [
            '<%= yo.src %>/{,*/}*.html',
            '{.tmp,<%= yo.src %>}/{,*/}*.css',
            '{.tmp,<%= yo.src %>}/{,*/}*.js'
          ],
          tasks: ['concat'],
          options: {
            livereload: yoConfig.livereload
          }
        }
      },
      connect: {
        options: {
          port: 9000,
          hostname: '0.0.0.0' // Change this to '0.0.0.0' to access the server from outside.
        },
        livereload: {
          options: {
            middleware: function (connect) {
              return [
                lrSnippet,
                mountFolder(connect, '.tmp'),
                mountFolder(connect, yoConfig.src)
              ];
            }
          }
        }
      },
      less: {
        options: {
          // dumpLineNumbers: 'all',
          paths: ['<%= yo.src %>']
        },
        dist: {
          files: {
            '<%= yo.src %>/<%= yo.name %>.css': '<%= yo.src %>/<%= yo.name %>.less'
          }
        }
      },
      jshint: {
        gruntfile: {
          options: {
            jshintrc: '.jshintrc'
          },
          src: 'Gruntfile.js'
        },
        src: {
          options: {
            jshintrc: '.jshintrc'
          },
          src: ['<%= yo.src %>/{,*/}*.js']
        }
      },
      ngAnnotate: {
        options: {
          banner: '<%= meta.banner %>'
        },
        dist: {
          src: ['<%= yo.src %>/<%= pkg.name %>.js'],
          dest: '<%= yo.dist %>/<%= pkg.name %>.js'
        }
        // dist: {
        //   files: {
        //     '/.js': '/.js'
        //   }
        // }
      },
      concat: {
        options: {
          banner: '<%= meta.banner %>',
          stripBanners: true
        },
        dist: {
          src: ['<%= yo.src %>/<%= pkg.name %>.js'],
          dest: '<%= yo.dist %>/<%= pkg.name %>.js'
        }
      },
      uglify: {
        options: {
          banner: '<%= meta.banner %>'
        },
        dist: {
          src: '<%= concat.dist.dest %>',
          dest: '<%= yo.dist %>/<%= pkg.name %>.min.js'
        }
      }
    });
  
    grunt.registerTask('build', [
      'clean:dist',
      'ngAnnotate:dist',
      'uglify:dist'
    ]);
  
    grunt.registerTask('default', ['build']);
  
  };
  