'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)); }; module.exports = function (grunt) { // Project configuration. grunt.initConfig({ // Metadata. pkg: grunt.file.readJSON('package.json'), headerDev: '/*! <%= pkg.name %> - v<%= pkg.version %>-dev-<%= grunt.template.today("yyyy-mm-dd") %>\n', headerRelease: '/*! <%= pkg.name %> - v<%= pkg.version %>\n', banner: '<%= pkg.homepage ? "* " + pkg.homepage + "\\n" : "" %>' + '* Copyright (c) <%= grunt.template.today("yyyy") %> <%= pkg.author.name %>;' + ' Licensed <%= _.pluck(pkg.licenses, "type").join(", ") %> */\n', // Task configuration. concat: { dev: { options: { banner: '<%= headerDev %><%= banner %>\n(function (window, angular, undefined) {\n', footer: '})(window, window.angular);\n', stripBanners: true }, src: ['src/<%= pkg.name %>.js'], dest: 'dist/<%= pkg.name %>.js' }, release: { options: { banner: '<%= headerRelease %><%= banner %>\n(function (window, angular, undefined) {\n', footer: '})(window, window.angular);\n', stripBanners: true }, src: ['src/<%= pkg.name %>.js'], dest: 'release/<%= pkg.name %>.js' } }, uglify: { dev: { options: { banner: '<%= headerDev %><%= banner %>' }, src: '<%= concat.dev.dest %>', dest: 'dist/<%= pkg.name %>.min.js' }, release: { options: { banner: '<%= headerRelease %><%= banner %>' }, src: '<%= concat.release.dest %>', dest: 'release/<%= pkg.name %>.min.js' } }, karma: { unit: { configFile: 'karma.conf.js' } }, jshint: { options: { jshintrc: '.jshintrc' }, gruntfile: { src: 'Gruntfile.js' }, sources: { options: { jshintrc: 'src/.jshintrc' }, src: ['src/**/*.js'] }, test: { src: ['test/**/*.js'] } }, watch: { gruntfile: { files: '<%= jshint.gruntfile.src %>', tasks: ['jshint:gruntfile'] }, sources: { files: '<%= jshint.sources.src %>', tasks: ['jshint:sources', 'karma'] }, test: { files: '<%= jshint.test.src %>', tasks: ['jshint:test', 'karma'] }, sample: { options: { livereload: LIVERELOAD_PORT }, tasks: 'copy:breadcrumb', files: [ 'sample/*.{css,js,html}', 'sample/controllers/*.{css,js,html}', 'sample/views/*.{css,js,html}', 'src/*.js' ] } }, copy: { breadcrumb: { files: [ { flatten: true, expand: true, src: [ 'src/angular-breadcrumb.js' ], dest: 'sample/asset/' } ] }, asset: { files: [ { flatten: true, expand: true, src: [ 'dist/angular-breadcrumb.js', 'bower_components/angular/angular.js', 'bower_components/angular-ui-router/release/angular-ui-router.js', 'bower_components/angular-ui-bootstrap-bower/ui-bootstrap-tpls.js', 'bower_components/bootstrap.css/css/bootstrap.css', 'bower_components/underscore/underscore.js' ], dest: 'sample/asset/' } ] }, img: { files: [ { flatten: true, expand: true, src: [ 'bower_components/bootstrap.css/img/glyphicons-halflings.png' ], dest: 'sample/img/' } ] } }, connect: { options: { port: 9000, hostname: 'localhost' }, livereload: { options: { middleware: function (connect) { return [ lrSnippet, mountFolder(connect, 'sample') ]; } } } }, open: { server: { url: 'http://localhost:<%= connect.options.port %>/index.html' } }, bump: { options: { files: ['package.json', 'bower.json'], updateConfigs: ['pkg'] } }, clean: { release: ["sample/*.zip"], test: ["testDependencies/*"] }, compress: { release: { options: { archive: 'sample/<%= pkg.name %>-<%= pkg.version %>.zip' }, files: [ {expand: true, cwd: 'release/', src: ['*.js']} ] } }, replace: { release: { src: ['sample/views/home.html'], overwrite: true, replacements: [{ from: /angular-breadcrumb-[0-9]+\.[0-9]+\.[0-9]+\.zip/g, to: "angular-breadcrumb-<%= pkg.version %>.zip" }, { from: /\([0-9]+\.[0-9]+\.[0-9]+\)/g, to: "(<%= pkg.version %>)" }] } }, shell: { testMinimal: { command: 'bower install angular#=1.0.8 angular-mocks#=1.0.8 angular-sanitize#=1.0.8 --config.directory=. --config.cwd=testDependencies' }, test1dot2: { command: 'bower install angular#=1.2.18 angular-mocks#=1.2.18 angular-sanitize#=1.2.18 --config.directory=. --config.cwd=testDependencies' } } }); // These plugins provide necessary tasks. grunt.loadNpmTasks('grunt-bump'); grunt.loadNpmTasks('grunt-contrib-clean'); grunt.loadNpmTasks('grunt-contrib-compress'); grunt.loadNpmTasks('grunt-contrib-concat'); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.loadNpmTasks('grunt-contrib-jshint'); grunt.loadNpmTasks('grunt-contrib-watch'); grunt.loadNpmTasks('grunt-contrib-copy'); grunt.loadNpmTasks('grunt-contrib-connect'); grunt.loadNpmTasks('grunt-conventional-changelog'); grunt.loadNpmTasks('grunt-karma'); grunt.loadNpmTasks('grunt-open'); grunt.loadNpmTasks('grunt-shell'); grunt.loadNpmTasks('grunt-text-replace'); grunt.registerTask('test', ['jshint', 'testMin', 'test1dot2']); grunt.registerTask('testMin', ['clean:test', 'shell:testMinimal', 'karma']); grunt.registerTask('test1dot2', ['clean:test', 'shell:test1dot2', 'karma']); grunt.registerTask('default', ['test', 'concat:dev', 'uglify:dev']); grunt.registerTask('sample', ['concat:dev', 'copy:asset', 'copy:img', 'connect:livereload', 'open', 'watch']); grunt.registerTask('release-prepare', 'Update all files for a release', function(target) { if(!target) { target = 'patch'; } grunt.task.run( 'bump-only:' + target, // Version update 'test', // Tests 'concat:release', // Concat with release banner 'uglify:release', // Minify with release banner 'changelog', // Changelog update 'clean:release', // Delete old version download file 'compress:release', // New version download file 'replace:release' // Update version in download button (link & label) ); }); };