var semver = require('semver'), f = require('util').format, jsFiles = [ 'src/version.js', 'src/utils.js', 'src/event_target.js', 'src/event_bus.js', 'src/persistent_storage.js', 'src/request_cache.js', 'src/transport.js', 'src/dataset.js', 'src/input_view.js', 'src/dropdown_view.js', 'src/typeahead_view.js', 'src/typeahead.js' ]; module.exports = function(grunt) { grunt.initConfig({ version: grunt.file.readJSON('package.json').version, buildDir: 'dist', banner: [ '/*!', ' * typeahead.js <%= version %>', ' * https://github.com/twitter/typeahead', ' * Copyright 2013 Twitter, Inc. and other contributors; Licensed MIT', ' */\n\n' ].join('\n'), uglify: { options: { banner: '<%= banner %>', enclose: { 'window.jQuery': '$' } }, js: { options: { mangle: false, beautify: true, compress: false }, src: jsFiles, dest: '<%= buildDir %>/typeahead.js' }, jsmin: { options: { mangle: true, compress: true }, src: jsFiles, dest: '<%= buildDir %>/typeahead.min.js' } }, sed: { version: { pattern: '%VERSION%', replacement: '<%= version %>', path: ['<%= uglify.js.dest %>', '<%= uglify.jsmin.dest %>'] } }, jshint: { options: { jshintrc: '.jshintrc' }, src: jsFiles, tests: ['test/*.js'], gruntfile: ['Gruntfile.js'] }, watch: { js: { files: jsFiles, tasks: 'build:js' } }, jasmine: { js: { src: jsFiles, options: { specs: 'test/*_spec.js', helpers: 'test/helpers/*', vendor: 'test/vendor/*' } }, coverage: { src: jsFiles, options: { specs: 'test/*_spec.js', template: require('grunt-template-jasmine-istanbul'), templateOptions: { coverage: 'test/coverage/coverage.json', report: [ { type: 'html', options: { dir: 'test/coverage/html' } }, { type: 'text-summary' } ] } } } }, exec: { open_spec_runner: { cmd: 'open _SpecRunner.html' }, git_is_clean: { cmd: 'test -z "$(git status --porcelain)"' }, git_on_master: { cmd: 'test $(git symbolic-ref --short -q HEAD) = master' }, git_add: { cmd: 'git add .' }, git_commit: { cmd: function(m) { return f('git commit -m "%s"', m); } }, git_tag: { cmd: function(v) { return f('git tag v%s -am "%s"', v, v); } }, git_push: { cmd: 'git push && git push --tags' }, publish_assets: { cmd: [ 'cp -r <%= buildDir %> typeahead.js', 'zip -r typeahead.js/typeahead.js.zip typeahead.js', 'git checkout gh-pages', 'rm -rf releases/latest', 'cp -r typeahead.js releases/<%= version %>', 'cp -r typeahead.js releases/latest', 'git add releases/<%= version %> releases/latest', 'sed -E -i "" \'s/v[0-9]+\\.[0-9]+\\.[0-9]+/v<%= version %>/\' index.html', 'git add index.html', 'git commit -m "Add assets for <%= version %>."', 'git push', 'git checkout -', 'rm -rf typeahead.js' ].join(' && ') } }, clean: { dist: 'dist' }, connect: { server: { options: { port: 8888, keepalive: true } } }, parallel: { dev: [ { grunt: true, args: ['server'] }, { grunt: true, args: ['watch'] } ] } }); grunt.registerTask('release', 'Ship it.', function(version) { var curVersion = grunt.config.get('version'); version = semver.inc(curVersion, version) || version; if (!semver.valid(version) || semver.lte(version, curVersion)) { grunt.fatal('invalid version dummy'); } grunt.config.set('version', version); grunt.task.run([ 'exec:git_on_master', 'exec:git_is_clean', 'lint', 'test', 'manifests:' + version, 'build', 'exec:git_add', 'exec:git_commit:' + version, 'exec:git_tag:' + version, 'exec:git_push', 'exec:publish_assets' ]); }); grunt.registerTask('manifests', 'Update manifests.', function(version) { var _ = grunt.util._, pkg = grunt.file.readJSON('package.json'), component = grunt.file.readJSON('component.json'), jqueryPlugin = grunt.file.readJSON('typeahead.js.jquery.json'); component = JSON.stringify(_.extend(component, { name: pkg.name, version: version }), null, 2); jqueryPlugin = JSON.stringify(_.extend(jqueryPlugin, { name: pkg.name, title: pkg.name, version: version, author: pkg.author, description: pkg.description, keywords: pkg.keywords, homepage: pkg.homepage, bugs: pkg.bugs, maintainers: pkg.contributors }), null, 2); pkg = JSON.stringify(_.extend(pkg, { version: version }), null, 2); grunt.file.write('package.json', pkg); grunt.file.write('component.json', component); grunt.file.write('typeahead.js.jquery.json', jqueryPlugin); }); // aliases // ------- grunt.registerTask('default', 'build'); grunt.registerTask('build', ['uglify', 'sed:version']); grunt.registerTask('server', 'connect:server'); grunt.registerTask('lint', 'jshint'); grunt.registerTask('test', 'jasmine:js'); grunt.registerTask('test:browser', ['jasmine:js:build', 'exec:open_spec_runner']); grunt.registerTask('dev', 'parallel:dev'); grunt.registerTask('test:coverage', ['jasmine:coverage']); // load tasks // ---------- grunt.loadNpmTasks('grunt-sed'); grunt.loadNpmTasks('grunt-exec'); grunt.loadNpmTasks('grunt-parallel'); grunt.loadNpmTasks('grunt-contrib-watch'); grunt.loadNpmTasks('grunt-contrib-clean'); grunt.loadNpmTasks('grunt-contrib-uglify'); grunt.loadNpmTasks('grunt-contrib-jshint'); grunt.loadNpmTasks('grunt-contrib-concat'); grunt.loadNpmTasks('grunt-contrib-connect'); grunt.loadNpmTasks('grunt-contrib-jasmine'); };