| 
									
										
										
										
											2013-07-28 12:33:41 +08:00
										 |  |  | /* jshint node: true */ | 
					
						
							| 
									
										
										
										
											2013-08-04 07:03:38 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-04 22:55:52 +08:00
										 |  |  | module.exports = function(grunt) { | 
					
						
							| 
									
										
										
										
											2013-08-04 07:03:38 +08:00
										 |  |  |   "use strict"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   // Project configuration.
 | 
					
						
							|  |  |  |   grunt.initConfig({ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Metadata.
 | 
					
						
							|  |  |  |     pkg: grunt.file.readJSON('package.json'), | 
					
						
							|  |  |  |     banner: '/**\n' + | 
					
						
							| 
									
										
										
										
											2013-08-24 13:38:51 +08:00
										 |  |  |               '* Bootstrap v<%= pkg.version %> by @fat and @mdo\n' + | 
					
						
							| 
									
										
										
										
											2013-08-04 07:03:38 +08:00
										 |  |  |               '* Copyright <%= grunt.template.today("yyyy") %> <%= pkg.author %>\n' + | 
					
						
							| 
									
										
										
										
											2013-08-24 13:38:51 +08:00
										 |  |  |               '* Licensed under <%= _.pluck(pkg.licenses, "url").join(", ") %>.\n' + | 
					
						
							|  |  |  |               '*\n' + | 
					
						
							|  |  |  |               '* Designed and built with all the love in the world by @mdo and @fat.\n' + | 
					
						
							| 
									
										
										
										
											2013-08-04 07:03:38 +08:00
										 |  |  |               '*/\n', | 
					
						
							|  |  |  |     jqueryCheck: 'if (!jQuery) { throw new Error(\"Bootstrap requires jQuery\") }\n\n', | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // Task configuration.
 | 
					
						
							|  |  |  |     clean: { | 
					
						
							|  |  |  |       dist: ['dist'] | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     jshint: { | 
					
						
							|  |  |  |       options: { | 
					
						
							|  |  |  |         jshintrc: 'js/.jshintrc' | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       gruntfile: { | 
					
						
							|  |  |  |         src: 'Gruntfile.js' | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       src: { | 
					
						
							|  |  |  |         src: ['js/*.js'] | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       test: { | 
					
						
							|  |  |  |         src: ['js/tests/unit/*.js'] | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2013-08-08 14:06:29 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-04 07:03:38 +08:00
										 |  |  |     concat: { | 
					
						
							|  |  |  |       options: { | 
					
						
							|  |  |  |         banner: '<%= banner %><%= jqueryCheck %>', | 
					
						
							|  |  |  |         stripBanners: false | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       bootstrap: { | 
					
						
							|  |  |  |         src: [ | 
					
						
							|  |  |  |           'js/transition.js', | 
					
						
							|  |  |  |           'js/alert.js', | 
					
						
							|  |  |  |           'js/button.js', | 
					
						
							|  |  |  |           'js/carousel.js', | 
					
						
							|  |  |  |           'js/collapse.js', | 
					
						
							|  |  |  |           'js/dropdown.js', | 
					
						
							|  |  |  |           'js/modal.js', | 
					
						
							|  |  |  |           'js/tooltip.js', | 
					
						
							|  |  |  |           'js/popover.js', | 
					
						
							|  |  |  |           'js/scrollspy.js', | 
					
						
							|  |  |  |           'js/tab.js', | 
					
						
							|  |  |  |           'js/affix.js' | 
					
						
							|  |  |  |         ], | 
					
						
							|  |  |  |         dest: 'dist/js/<%= pkg.name %>.js' | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2013-08-08 14:06:29 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-04 07:03:38 +08:00
										 |  |  |     uglify: { | 
					
						
							|  |  |  |       options: { | 
					
						
							|  |  |  |         banner: '<%= banner %>' | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       bootstrap: { | 
					
						
							|  |  |  |         src: ['<%= concat.bootstrap.dest %>'], | 
					
						
							|  |  |  |         dest: 'dist/js/<%= pkg.name %>.min.js' | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     recess: { | 
					
						
							|  |  |  |       options: { | 
					
						
							|  |  |  |         compile: true | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       bootstrap: { | 
					
						
							|  |  |  |         src: ['less/bootstrap.less'], | 
					
						
							|  |  |  |         dest: 'dist/css/<%= pkg.name %>.css' | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       min: { | 
					
						
							|  |  |  |         options: { | 
					
						
							|  |  |  |           compress: true | 
					
						
							| 
									
										
										
										
											2013-05-04 22:55:52 +08:00
										 |  |  |         }, | 
					
						
							| 
									
										
										
										
											2013-08-04 07:03:38 +08:00
										 |  |  |         src: ['less/bootstrap.less'], | 
					
						
							|  |  |  |         dest: 'dist/css/<%= pkg.name %>.min.css' | 
					
						
							| 
									
										
										
										
											2013-08-18 09:59:50 +08:00
										 |  |  |       }, | 
					
						
							|  |  |  |       theme: { | 
					
						
							|  |  |  |         src: ['less/theme.less'], | 
					
						
							|  |  |  |         dest: 'dist/css/<%= pkg.name %>-theme.css' | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       theme_min: { | 
					
						
							|  |  |  |         options: { | 
					
						
							|  |  |  |           compress: true | 
					
						
							|  |  |  |         }, | 
					
						
							|  |  |  |         src: ['less/theme.less'], | 
					
						
							|  |  |  |         dest: 'dist/css/<%= pkg.name %>-theme.min.css' | 
					
						
							| 
									
										
										
										
											2013-08-04 07:03:38 +08:00
										 |  |  |       } | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-18 15:36:51 +08:00
										 |  |  |     copy: { | 
					
						
							|  |  |  |       fonts: { | 
					
						
							|  |  |  |         expand: true, | 
					
						
							|  |  |  |         src: ["fonts/*"], | 
					
						
							|  |  |  |         dest: 'dist/' | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-04 07:03:38 +08:00
										 |  |  |     qunit: { | 
					
						
							|  |  |  |       options: { | 
					
						
							|  |  |  |         inject: 'js/tests/unit/phantom.js' | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       files: ['js/tests/*.html'] | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2013-08-08 14:06:29 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-04 07:03:38 +08:00
										 |  |  |     connect: { | 
					
						
							|  |  |  |       server: { | 
					
						
							|  |  |  |         options: { | 
					
						
							|  |  |  |           port: 3000, | 
					
						
							|  |  |  |           base: '.' | 
					
						
							| 
									
										
										
										
											2013-05-04 22:55:52 +08:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2013-08-04 07:03:38 +08:00
										 |  |  |       } | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-13 06:01:06 +08:00
										 |  |  |     jekyll: { | 
					
						
							|  |  |  |       docs: {} | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     validation: { | 
					
						
							|  |  |  |       options: { | 
					
						
							| 
									
										
										
										
											2013-08-19 14:54:25 +08:00
										 |  |  |         reset: true | 
					
						
							| 
									
										
										
										
											2013-08-13 06:01:06 +08:00
										 |  |  |       }, | 
					
						
							|  |  |  |       files: { | 
					
						
							|  |  |  |         src: ["_gh_pages/**/*.html"] | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-04 07:03:38 +08:00
										 |  |  |     watch: { | 
					
						
							|  |  |  |       src: { | 
					
						
							|  |  |  |         files: '<%= jshint.src.src %>', | 
					
						
							|  |  |  |         tasks: ['jshint:src', 'qunit'] | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       test: { | 
					
						
							|  |  |  |         files: '<%= jshint.test.src %>', | 
					
						
							|  |  |  |         tasks: ['jshint:test', 'qunit'] | 
					
						
							|  |  |  |       }, | 
					
						
							|  |  |  |       recess: { | 
					
						
							|  |  |  |         files: 'less/*.less', | 
					
						
							|  |  |  |         tasks: ['recess'] | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   }); | 
					
						
							| 
									
										
										
										
											2013-05-04 22:55:52 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-04 07:03:38 +08:00
										 |  |  |   // These plugins provide necessary tasks.
 | 
					
						
							|  |  |  |   grunt.loadNpmTasks('grunt-contrib-clean'); | 
					
						
							|  |  |  |   grunt.loadNpmTasks('grunt-contrib-concat'); | 
					
						
							|  |  |  |   grunt.loadNpmTasks('grunt-contrib-connect'); | 
					
						
							| 
									
										
										
										
											2013-08-18 15:36:51 +08:00
										 |  |  |   grunt.loadNpmTasks('grunt-contrib-copy'); | 
					
						
							| 
									
										
										
										
											2013-08-04 07:03:38 +08:00
										 |  |  |   grunt.loadNpmTasks('grunt-contrib-jshint'); | 
					
						
							|  |  |  |   grunt.loadNpmTasks('grunt-contrib-qunit'); | 
					
						
							|  |  |  |   grunt.loadNpmTasks('grunt-contrib-uglify'); | 
					
						
							|  |  |  |   grunt.loadNpmTasks('grunt-contrib-watch'); | 
					
						
							| 
									
										
										
										
											2013-08-13 06:01:06 +08:00
										 |  |  |   grunt.loadNpmTasks('grunt-html-validation'); | 
					
						
							|  |  |  |   grunt.loadNpmTasks('grunt-jekyll'); | 
					
						
							| 
									
										
										
										
											2013-08-04 07:03:38 +08:00
										 |  |  |   grunt.loadNpmTasks('grunt-recess'); | 
					
						
							| 
									
										
										
										
											2013-07-31 00:41:17 +08:00
										 |  |  |   grunt.loadNpmTasks('browserstack-runner'); | 
					
						
							| 
									
										
										
										
											2013-05-04 22:55:52 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-13 06:01:06 +08:00
										 |  |  |   // Docs HTML validation task
 | 
					
						
							| 
									
										
										
										
											2013-08-19 04:43:53 +08:00
										 |  |  |   grunt.registerTask('validate-html', ['jekyll', 'validation']); | 
					
						
							| 
									
										
										
										
											2013-08-13 06:01:06 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-04 07:03:38 +08:00
										 |  |  |   // Test task.
 | 
					
						
							| 
									
										
										
										
											2013-08-20 05:16:52 +08:00
										 |  |  |   var testSubtasks = ['dist-css', 'jshint', 'qunit', 'validate-html']; | 
					
						
							| 
									
										
										
										
											2013-08-07 10:54:15 +08:00
										 |  |  |   // Only run BrowserStack tests under Travis
 | 
					
						
							| 
									
										
										
										
											2013-08-06 15:39:35 +08:00
										 |  |  |   if (process.env.TRAVIS) { | 
					
						
							| 
									
										
										
										
											2013-08-08 04:27:27 +08:00
										 |  |  |     // Only run BrowserStack tests if this is a mainline commit in twbs/bootstrap, or you have your own BrowserStack key
 | 
					
						
							|  |  |  |     if ((process.env.TRAVIS_REPO_SLUG === 'twbs/bootstrap' && process.env.TRAVIS_PULL_REQUEST === 'false') || process.env.TWBS_HAVE_OWN_BROWSERSTACK_KEY) { | 
					
						
							| 
									
										
										
										
											2013-08-07 10:54:15 +08:00
										 |  |  |       testSubtasks.push('browserstack_runner'); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2013-08-06 15:39:35 +08:00
										 |  |  |   } | 
					
						
							|  |  |  |   grunt.registerTask('test', testSubtasks); | 
					
						
							| 
									
										
										
										
											2013-05-04 22:55:52 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-04 07:03:38 +08:00
										 |  |  |   // JS distribution task.
 | 
					
						
							|  |  |  |   grunt.registerTask('dist-js', ['concat', 'uglify']); | 
					
						
							| 
									
										
										
										
											2013-05-04 22:55:52 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-04 07:03:38 +08:00
										 |  |  |   // CSS distribution task.
 | 
					
						
							|  |  |  |   grunt.registerTask('dist-css', ['recess']); | 
					
						
							| 
									
										
										
										
											2013-05-04 22:55:52 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-18 15:36:51 +08:00
										 |  |  |   // Fonts distribution task.
 | 
					
						
							|  |  |  |   grunt.registerTask('dist-fonts', ['copy']); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-04 07:03:38 +08:00
										 |  |  |   // Full distribution task.
 | 
					
						
							| 
									
										
										
										
											2013-08-18 15:36:51 +08:00
										 |  |  |   grunt.registerTask('dist', ['clean', 'dist-css', 'dist-fonts', 'dist-js']); | 
					
						
							| 
									
										
										
										
											2013-05-04 22:55:52 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-08-04 07:03:38 +08:00
										 |  |  |   // Default task.
 | 
					
						
							| 
									
										
										
										
											2013-08-18 07:44:54 +08:00
										 |  |  |   grunt.registerTask('default', ['test', 'dist', 'build-customizer']); | 
					
						
							| 
									
										
										
										
											2013-08-08 14:06:29 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |   // task for building customizer
 | 
					
						
							|  |  |  |   grunt.registerTask('build-customizer', 'Add scripts/less files to customizer.', function () { | 
					
						
							|  |  |  |     var fs = require('fs') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function getFiles(type) { | 
					
						
							|  |  |  |       var files = {} | 
					
						
							|  |  |  |       fs.readdirSync(type) | 
					
						
							|  |  |  |         .filter(function (path) { | 
					
						
							| 
									
										
										
										
											2013-08-20 03:19:00 +08:00
										 |  |  |           return type == 'fonts' ? true : new RegExp('\\.' + type + '$').test(path) | 
					
						
							| 
									
										
										
										
											2013-08-08 14:06:29 +08:00
										 |  |  |         }) | 
					
						
							|  |  |  |         .forEach(function (path) { | 
					
						
							|  |  |  |           return files[path] = fs.readFileSync(type + '/' + path, 'utf8') | 
					
						
							|  |  |  |         }) | 
					
						
							|  |  |  |       return 'var __' + type + ' = ' + JSON.stringify(files) + '\n' | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     var customize = fs.readFileSync('customize.html', 'utf-8') | 
					
						
							| 
									
										
										
										
											2013-08-20 05:16:52 +08:00
										 |  |  |     var files = getFiles('js') + getFiles('less') + getFiles('fonts') | 
					
						
							|  |  |  |     fs.writeFileSync('assets/js/raw-files.js', files) | 
					
						
							| 
									
										
										
										
											2013-08-08 14:06:29 +08:00
										 |  |  |   }); | 
					
						
							| 
									
										
										
										
											2013-08-20 05:16:52 +08:00
										 |  |  | }; |